diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..52e77d9 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,22 @@ +# How to Contribute + +We are not currently accepting external code contributions to this project. +We plan to open for contributions before December 2020, stay tuned. + +## Contributor License Agreement + +Contributions to this project must be accompanied by a Contributor License +Agreement. You (or your employer) retain the copyright to your contribution, +this simply gives us permission to use and redistribute your contributions as +part of the project. Head over to to see +your current agreements on file or to sign a new one. + +You generally only need to submit a CLA once, so if you've already submitted +one (even if it was for a different project), you probably don't need to do it +again. + +## Community Guidelines + +This project follows +[Google's Open Source Community Guidelines](https://opensource.google.com/conduct/). + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..de5582e --- /dev/null +++ b/README.md @@ -0,0 +1,101 @@ + + +# Logica: language of Big Data + +Logica is an open source logic programming +language for data manipulation. Logica is a successor to +[Yedalog](https://research.google/pubs/pub43462/), +a language created at Google earlier. + +### Why? + +Logica is for engineers, data scientists and other specialists who want to use +logic programming syntax when writing queries and pipelines to run on +[BigQuery](https://cloud.google.com/bigquery). + +Logica compiles to StandardSQL and gives you access to the power of BigQuery +engine with the convenience of logic programming syntax. This is useful because +BigQuery is magnitudes more powerful than state of the art native +logic programming engines. + +We encourage you to try Logica, especially if + +* you already use logic programming and need more computational power, **or** +* you use SQL, but feel unsatisfied about its readability, **or** +* you want to learn logic programming and apply it to processing of Big Data. + +In the future we plan to support more SQL dialects and engines. + +### I have not heard of logic programming. What is it? + +Logic programming is a declarative programming paradigm where the program is +written as a set of logical statements. + +Logic programming was developed in academia from the late 60s. Prolog and +Datalog are the most prominent examples of logic programming languages. Logica +is a language of the Datalog family. + +Datalog and relational databases start from the same idea: think of data +as relations and think of data manipulation as a sequence of operations over +these relations. But Datalog and SQL differ in how these operations are +described. Datalog is inspired by the mathematical syntax of the first order +propositional logic and SQL follows the syntax of natural language. + +SQL was based on the natural language to give access to databases to the people +without formal training in computer programming or mathematics. This convenience +may become costly when the logic that you want to express is non trivial. +There are many examples of hard-to-read SQL queries that correspond to simple +logic programs. + +### How does Logica work? + +Logica compiles the logic program into a SQL expression, so it can be executed +on BigQuery, the state of the art SQL engine. + +Among database theoreticians Datalog and SQL are known to be _equivalent_. And +indeed the conversion from Datalog to SQL and back is often straightforward. +However there are a few nuances, for example how to treat disjunction and +negation. In Logica we tried to make choices that make understanding of the +resulting SQL structure as easy as possible, thus empowering user to write +programs that are executed efficiently. + +### How to learn? + +Learn basics of Logica by reading through tutorial located at `tutorial` folder. +See examples of using Logica in `examples` folder. Tutrial and examples show how +to access Logica from CoLab. + +### Why is it called _Logica_? + +_Logica_ stands for _**Logic** with **a**ggregation_. + +### Installation + +_To be written._ + +### Contact + +_To be written._ + +--- + +Unless otherwise noted, the Logica source files are distributed +under the Apache 2.0 license found in the LICENSE file. + +This is not an officially supported Google product. + + diff --git a/colab_logica.py b/colab_logica.py new file mode 100755 index 0000000..8e8d029 --- /dev/null +++ b/colab_logica.py @@ -0,0 +1,115 @@ +#!/usr/bin/python +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Library for using Logica in CoLab.""" + +from common import color + +from compiler import rule_translate +from compiler import universe + +import IPython + +from IPython.core.magic import register_cell_magic +from IPython.display import display + +from parser_py import parse + +from google.cloud import bigquery +from google.colab import widgets + + +PROJECT = None + + +def SetProject(project): + global PROJECT + PROJECT = project + + +@register_cell_magic +def logica(line, cell): + Logica(line, cell, run_query=True) + + +def ParseList(line): + line = line.strip() + if not line: + predicates = [] + else: + predicates = [p.strip() for p in line.split(',')] + return predicates + + +def RunSQL(sql, engine): + if engine != 'bigquery': + raise Exception('Logica colab only supports BigQuery for now.') + client = bigquery.Client(project=PROJECT) + return client.query(sql).to_dataframe() + + +def Logica(line, cell, run_query): + """Running Logica predicates and storing results.""" + predicates = ParseList(line) + try: + parsed_rules = parse.ParseFile(cell)['rule'] + except parse.ParsingException as e: + e.ShowMessage() + return + program = universe.LogicaProgram(parsed_rules) + engine = program.annotations.Engine() + + bar = widgets.TabBar(predicates + ['(Log)']) + logs_idx = len(predicates) + + ip = IPython.get_ipython() + for idx, predicate in enumerate(predicates): + with bar.output_to(logs_idx): + print('Running %s' % predicate) + try: + sql = program.FormattedPredicateSql(predicate) + ip.push({predicate + '_sql': sql}) + except rule_translate.RuleCompileException as e: + e.ShowMessage() + return + + # Publish output to Colab cell. + with bar.output_to(idx): + sub_bar = widgets.TabBar(['SQL', 'Result']) + with sub_bar.output_to(0): + print( + color.Format( + 'The following query is stored at {warning}%s{end} ' + 'variable.' % ( + predicate + '_sql'))) + print(sql) + + with bar.output_to(logs_idx): + if run_query: + t = RunSQL(sql, engine) + ip.push({predicate: t}) + + with bar.output_to(idx): + with sub_bar.output_to(1): + if run_query: + print( + color.Format( + 'The following table is stored at {warning}%s{end} ' + 'variable.' % + predicate)) + display(t) + else: + print('The query was not run.') diff --git a/common/color.py b/common/color.py new file mode 100755 index 0000000..c4a93f9 --- /dev/null +++ b/common/color.py @@ -0,0 +1,51 @@ +#!/usr/bin/python +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Terminal text color string constants.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +CHR_ERROR = '\033[91m' +CHR_WARNING = '\033[1m' +# TODO: Make dark terminal users be able to configure to use the +# bright yellow. +# CHR_WARNING = '\033[93m' +CHR_UNDERLINE = '\033[4m' +CHR_END = '\033[0m' +CHR_OK = '\033[92m' + + +def Warn(message): + return CHR_WARNING + message + CHR_END + + +def Color(color): + return ColorsMap()[color] + + +def ColorsMap(): + return {'error': CHR_ERROR, + 'warning': CHR_WARNING, + 'underline': CHR_UNDERLINE, + 'ok': CHR_OK, + 'end': CHR_END} + + +def Format(pattern, args_dict=None): + args_dict = args_dict or {} + return pattern.format(**dict(args_dict, **ColorsMap())) diff --git a/common/data/processed_functions.py b/common/data/processed_functions.py new file mode 100755 index 0000000..b487643 --- /dev/null +++ b/common/data/processed_functions.py @@ -0,0 +1,334 @@ +#!/usr/bin/python +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Built-in StandardSQL functions.""" + +import csv +import io + +def GetCsv(): + return csv.reader(io.StringIO(CSV_DATA)) + +CSV_DATA = u"""function,sql_function,aggregates,has_repeated_args,min_args,max_args +$add,+,false,0,2,2 +$and,AND,false,1,1,1 +$array_at_offset,ARRAY[OFFSET()],false,0,2,2 +$array_at_ordinal,ARRAY[ORDINAL()],false,0,2,2 +$between,BETWEEN,false,0,3,3 +$bitwise_and,&,false,0,2,2 +$bitwise_left_shift,<<,false,0,2,2 +$bitwise_not,~,false,0,1,1 +$bitwise_or,|,false,0,2,2 +$bitwise_right_shift,>>,false,0,2,2 +$bitwise_xor,^,false,0,2,2 +$case_no_value,CASE,false,2,1,1 +$case_with_value,CASE,false,2,2,2 +$count_star,COUNT(*),true,0,0,0 +$divide,/,false,0,2,2 +$equal,=,false,0,2,2 +$extract,EXTRACT,false,0,2,3 +$extract_date,EXTRACT,false,0,1,2 +$extract_datetime,EXTRACT,false,0,1,2 +$extract_time,EXTRACT,false,0,1,2 +$greater,>,false,0,2,2 +$greater_or_equal,>=,false,0,2,2 +$in,IN,false,1,1,1 +$in_array,IN UNNEST,false,0,2,2 +$is_false,IS FALSE,false,0,1,1 +$is_null,IS NULL,false,0,1,1 +$is_true,IS TRUE,false,0,1,1 +$less,<,false,0,2,2 +$less_or_equal,<=,false,0,2,2 +$like,LIKE,false,0,2,2 +$make_array,ARRAY[...],false,1,0,0 +$multiply,*,false,0,2,2 +$not,NOT,false,0,1,1 +$not_equal,!=,false,0,2,2 +$or,OR,false,1,1,1 +$safe_array_at_offset,ARRAY[SAFE_OFFSET()],false,0,2,2 +$safe_array_at_ordinal,ARRAY[SAFE_ORDINAL()],false,0,2,2 +$subtract,-,false,0,2,2 +$unary_minus,-,false,0,1,1 +abs,ABS,false,0,1,1 +acos,ACOS,false,0,1,1 +acosh,ACOSH,false,0,1,1 +aead.decrypt_bytes,AEAD.DECRYPT_BYTES,false,0,3,3 +aead.decrypt_string,AEAD.DECRYPT_STRING,false,0,3,3 +aead.encrypt,AEAD.ENCRYPT,false,0,3,3 +any_value,ANY_VALUE,true,0,1,1 +approx_count_distinct,APPROX_COUNT_DISTINCT,true,0,1,1 +approx_quantiles,APPROX_QUANTILES,true,0,2,2 +approx_top_count,APPROX_TOP_COUNT,true,0,2,2 +approx_top_sum,APPROX_TOP_SUM,true,0,3,3 +array_agg,ARRAY_AGG,true,0,1,1 +array_concat,ARRAY_CONCAT,false,1,1,1 +array_concat_agg,ARRAY_CONCAT_AGG,true,0,1,1 +array_length,ARRAY_LENGTH,false,0,1,1 +array_reverse,ARRAY_REVERSE,false,0,1,1 +array_to_string,ARRAY_TO_STRING,false,0,2,3 +asin,ASIN,false,0,1,1 +asinh,ASINH,false,0,1,1 +atan,ATAN,false,0,1,1 +atan2,ATAN2,false,0,2,2 +atanh,ATANH,false,0,1,1 +avg,AVG,true,0,1,1 +bit_and,BIT_AND,true,0,1,1 +bit_cast_to_int32,BIT_CAST_TO_INT32,false,0,1,1 +bit_cast_to_int64,BIT_CAST_TO_INT64,false,0,1,1 +bit_cast_to_uint32,BIT_CAST_TO_UINT32,false,0,1,1 +bit_cast_to_uint64,BIT_CAST_TO_UINT64,false,0,1,1 +bit_count,BIT_COUNT,false,0,1,1 +bit_or,BIT_OR,true,0,1,1 +bit_xor,BIT_XOR,true,0,1,1 +byte_length,BYTE_LENGTH,false,0,1,1 +ceil,CEIL,false,0,1,1 +char_length,CHAR_LENGTH,false,0,1,1 +coalesce,COALESCE,false,1,0,0 +code_points_to_bytes,CODE_POINTS_TO_BYTES,false,0,1,1 +code_points_to_string,CODE_POINTS_TO_STRING,false,0,1,1 +concat,CONCAT,false,1,1,1 +corr,CORR,true,0,2,2 +cos,COS,false,0,1,1 +cosh,COSH,false,0,1,1 +count,COUNT,true,0,1,1 +countif,COUNTIF,true,0,1,1 +covar_pop,COVAR_POP,true,0,2,2 +covar_samp,COVAR_SAMP,true,0,2,2 +cume_dist,CUME_DIST,false,0,0,0 +current_date,CURRENT_DATE,false,0,0,1 +current_datetime,CURRENT_DATETIME,false,0,0,1 +current_time,CURRENT_TIME,false,0,0,1 +current_timestamp,CURRENT_TIMESTAMP,false,0,0,0 +date,DATE,false,0,1,3 +date_add,DATE_ADD,false,0,3,3 +date_diff,DATE_DIFF,false,0,3,3 +date_from_unix_date,DATE_FROM_UNIX_DATE,false,0,1,1 +date_sub,DATE_SUB,false,0,3,3 +date_trunc,DATE_TRUNC,false,0,2,2 +datetime,DATETIME,false,0,1,6 +datetime_add,DATETIME_ADD,false,0,3,3 +datetime_diff,DATETIME_DIFF,false,0,3,3 +datetime_sub,DATETIME_SUB,false,0,3,3 +datetime_trunc,DATETIME_TRUNC,false,0,2,2 +dense_rank,DENSE_RANK,false,0,0,0 +div,DIV,false,0,2,2 +ends_with,ENDS_WITH,false,0,2,2 +error,ERROR,false,0,1,1 +exp,EXP,false,0,1,1 +farm_fingerprint,FARM_FINGERPRINT,false,0,1,1 +first_value,FIRST_VALUE,false,0,1,1 +floor,FLOOR,false,0,1,1 +format,FORMAT,false,1,1,1 +format_date,FORMAT_DATE,false,0,2,2 +format_datetime,FORMAT_DATETIME,false,0,2,2 +format_time,FORMAT_TIME,false,0,2,2 +format_timestamp,FORMAT_TIMESTAMP,false,0,2,3 +from_base32,FROM_BASE32,false,0,1,1 +from_base64,FROM_BASE64,false,0,1,1 +from_hex,FROM_HEX,false,0,1,1 +from_proto,FROM_PROTO,false,0,1,1 +generate_array,GENERATE_ARRAY,false,0,2,3 +generate_date_array,GENERATE_DATE_ARRAY,false,0,2,4 +generate_timestamp_array,GENERATE_TIMESTAMP_ARRAY,false,0,4,4 +generate_uuid,GENERATE_UUID,false,0,0,0 +greatest,GREATEST,false,1,0,0 +hll_count.extract,HLL_COUNT.EXTRACT,false,0,1,1 +hll_count.init,HLL_COUNT.INIT,true,0,1,2 +hll_count.merge,HLL_COUNT.MERGE,true,0,1,1 +hll_count.merge_partial,HLL_COUNT.MERGE_PARTIAL,true,0,1,1 +ieee_divide,IEEE_DIVIDE,false,0,2,2 +if,IF,false,0,3,3 +ifnull,IFNULL,false,0,2,2 +is_inf,IS_INF,false,0,1,1 +is_nan,IS_NAN,false,0,1,1 +json_extract,JSON_EXTRACT,false,0,2,2 +json_extract_scalar,JSON_EXTRACT_SCALAR,false,0,2,2 +json_query,JSON_QUERY,false,0,2,2 +json_value,JSON_VALUE,false,0,2,2 +keys.add_key_from_raw_bytes,KEYS.ADD_KEY_FROM_RAW_BYTES,false,0,3,3 +keys.keyset_from_json,KEYS.KEYSET_FROM_JSON,false,0,1,1 +keys.keyset_length,KEYS.KEYSET_LENGTH,false,0,1,1 +keys.keyset_to_json,KEYS.KEYSET_TO_JSON,false,0,1,1 +keys.new_keyset,KEYS.NEW_KEYSET,false,0,1,1 +keys.rotate_keyset,KEYS.ROTATE_KEYSET,false,0,2,2 +lag,LAG,false,0,1,3 +last_value,LAST_VALUE,false,0,1,1 +lead,LEAD,false,0,1,3 +least,LEAST,false,1,0,0 +length,LENGTH,false,0,1,1 +ln,LN,false,0,1,1 +log,LOG,false,0,1,2 +log10,LOG10,false,0,1,1 +logical_and,LOGICAL_AND,true,0,1,1 +logical_or,LOGICAL_OR,true,0,1,1 +lower,LOWER,false,0,1,1 +lpad,LPAD,false,0,2,3 +ltrim,LTRIM,false,0,1,2 +max,MAX,true,0,1,1 +md5,MD5,false,0,1,1 +min,MIN,true,0,1,1 +mod,MOD,false,0,2,2 +net.format_ip,NET.FORMAT_IP,false,0,1,1 +net.format_packed_ip,NET.FORMAT_PACKED_IP,false,0,1,1 +net.host,NET.HOST,false,0,1,1 +net.ip_from_string,NET.IP_FROM_STRING,false,0,1,1 +net.ip_in_net,NET.IP_IN_NET,false,0,2,2 +net.ip_net_mask,NET.IP_NET_MASK,false,0,2,2 +net.ip_to_string,NET.IP_TO_STRING,false,0,1,1 +net.ip_trunc,NET.IP_TRUNC,false,0,2,2 +net.ipv4_from_int64,NET.IPV4_FROM_INT64,false,0,1,1 +net.ipv4_to_int64,NET.IPV4_TO_INT64,false,0,1,1 +net.make_net,NET.MAKE_NET,false,0,2,2 +net.parse_ip,NET.PARSE_IP,false,0,1,1 +net.parse_packed_ip,NET.PARSE_PACKED_IP,false,0,1,1 +net.public_suffix,NET.PUBLIC_SUFFIX,false,0,1,1 +net.reg_domain,NET.REG_DOMAIN,false,0,1,1 +net.safe_ip_from_string,NET.SAFE_IP_FROM_STRING,false,0,1,1 +normalize,NORMALIZE,false,0,1,2 +normalize_and_casefold,NORMALIZE_AND_CASEFOLD,false,0,1,2 +nth_value,NTH_VALUE,false,0,2,2 +ntile,NTILE,false,0,1,1 +nullif,NULLIF,false,0,2,2 +parse_date,PARSE_DATE,false,0,2,2 +parse_datetime,PARSE_DATETIME,false,0,2,2 +parse_time,PARSE_TIME,false,0,2,2 +parse_timestamp,PARSE_TIMESTAMP,false,0,2,3 +percent_rank,PERCENT_RANK,false,0,0,0 +percentile_cont,PERCENTILE_CONT,false,0,2,2 +percentile_disc,PERCENTILE_DISC,false,0,2,2 +pow,POW,false,0,2,2 +proto_default_if_null,PROTO_DEFAULT_IF_NULL,false,0,1,1 +rand,RAND,false,0,0,0 +range_bucket,RANGE_BUCKET,false,0,2,2 +rank,RANK,false,0,0,0 +regexp_contains,REGEXP_CONTAINS,false,0,2,2 +regexp_extract,REGEXP_EXTRACT,false,0,2,2 +regexp_extract_all,REGEXP_EXTRACT_ALL,false,0,2,2 +regexp_match,REGEXP_MATCH,false,0,2,2 +regexp_replace,REGEXP_REPLACE,false,0,3,3 +repeat,REPEAT,false,0,2,2 +replace,REPLACE,false,0,3,3 +reverse,REVERSE,false,0,1,1 +round,ROUND,false,0,1,2 +row_number,ROW_NUMBER,false,0,0,0 +rpad,RPAD,false,0,2,3 +rtrim,RTRIM,false,0,1,2 +safe_add,SAFE_ADD,false,0,2,2 +safe_convert_bytes_to_string,SAFE_CONVERT_BYTES_TO_STRING,false,0,1,1 +safe_divide,SAFE_DIVIDE,false,0,2,2 +safe_multiply,SAFE_MULTIPLY,false,0,2,2 +safe_negate,SAFE_NEGATE,false,0,1,1 +safe_subtract,SAFE_SUBTRACT,false,0,2,2 +session_user,SESSION_USER,false,0,0,0 +sha1,SHA1,false,0,1,1 +sha256,SHA256,false,0,1,1 +sha512,SHA512,false,0,1,1 +sign,SIGN,false,0,1,1 +sin,SIN,false,0,1,1 +sinh,SINH,false,0,1,1 +split,SPLIT,false,0,1,2 +sqrt,SQRT,false,0,1,1 +st_accum,ST_ACCUM,true,0,1,1 +st_area,ST_AREA,false,0,1,2 +st_asbinary,ST_ASBINARY,false,0,1,1 +st_asgeojson,ST_ASGEOJSON,false,0,1,2 +st_askml,ST_ASKML,false,0,1,1 +st_astext,ST_ASTEXT,false,0,1,1 +st_boundary,ST_BOUNDARY,false,0,1,1 +st_buffer,ST_BUFFER,false,0,2,4 +st_bufferwithtolerance,ST_BUFFERWITHTOLERANCE,false,0,3,4 +st_centroid,ST_CENTROID,false,0,1,1 +st_centroid_agg,ST_CENTROID_AGG,true,0,1,1 +st_closestpoint,ST_CLOSESTPOINT,false,0,2,3 +st_contains,ST_CONTAINS,false,0,2,2 +st_coveredby,ST_COVEREDBY,false,0,2,2 +st_covers,ST_COVERS,false,0,2,2 +st_difference,ST_DIFFERENCE,false,0,2,2 +st_dimension,ST_DIMENSION,false,0,1,1 +st_disjoint,ST_DISJOINT,false,0,2,2 +st_distance,ST_DISTANCE,false,0,2,3 +st_dwithin,ST_DWITHIN,false,0,3,4 +st_equals,ST_EQUALS,false,0,2,2 +st_geogfromgeojson,ST_GEOGFROMGEOJSON,false,0,1,1 +st_geogfromkml,ST_GEOGFROMKML,false,0,1,1 +st_geogfromtext,ST_GEOGFROMTEXT,false,0,1,2 +st_geogfromwkb,ST_GEOGFROMWKB,false,0,1,1 +st_geogpoint,ST_GEOGPOINT,false,0,2,2 +st_geogpointfromgeohash,ST_GEOGPOINTFROMGEOHASH,false,0,1,1 +st_geohash,ST_GEOHASH,false,0,1,2 +st_intersection,ST_INTERSECTION,false,0,2,2 +st_intersects,ST_INTERSECTS,false,0,2,2 +st_intersectsbox,ST_INTERSECTSBOX,false,0,5,5 +st_iscollection,ST_ISCOLLECTION,false,0,1,1 +st_isempty,ST_ISEMPTY,false,0,1,1 +st_length,ST_LENGTH,false,0,1,2 +st_makeline,ST_MAKELINE,false,0,1,2 +st_makepolygon,ST_MAKEPOLYGON,false,0,1,2 +st_makepolygonoriented,ST_MAKEPOLYGONORIENTED,false,0,1,1 +st_maxdistance,ST_MAXDISTANCE,false,0,2,3 +st_numpoints,ST_NUMPOINTS,false,0,1,1 +st_perimeter,ST_PERIMETER,false,0,1,2 +st_simplify,ST_SIMPLIFY,false,0,2,2 +st_snaptogrid,ST_SNAPTOGRID,false,0,2,2 +st_touches,ST_TOUCHES,false,0,2,2 +st_unaryunion,ST_UNARYUNION,false,0,1,1 +st_union,ST_UNION,false,0,1,2 +st_union_agg,ST_UNION_AGG,true,0,1,1 +st_within,ST_WITHIN,false,0,2,2 +st_x,ST_X,false,0,1,1 +st_y,ST_Y,false,0,1,1 +starts_with,STARTS_WITH,false,0,2,2 +stddev_pop,STDDEV_POP,true,0,1,1 +stddev_samp,STDDEV_SAMP,true,0,1,1 +string,STRING,false,0,1,2 +string_agg,STRING_AGG,true,0,1,2 +strpos,STRPOS,false,0,2,2 +substr,SUBSTR,false,0,2,3 +sum,SUM,true,0,1,1 +tan,TAN,false,0,1,1 +tanh,TANH,false,0,1,1 +time,TIME,false,0,1,3 +time_add,TIME_ADD,false,0,3,3 +time_diff,TIME_DIFF,false,0,3,3 +time_sub,TIME_SUB,false,0,3,3 +time_trunc,TIME_TRUNC,false,0,2,2 +timestamp,TIMESTAMP,false,0,1,2 +timestamp_add,TIMESTAMP_ADD,false,0,3,3 +timestamp_diff,TIMESTAMP_DIFF,false,0,3,3 +timestamp_from_unix_micros,TIMESTAMP_FROM_UNIX_MICROS,false,0,1,1 +timestamp_from_unix_millis,TIMESTAMP_FROM_UNIX_MILLIS,false,0,1,1 +timestamp_from_unix_seconds,TIMESTAMP_FROM_UNIX_SECONDS,false,0,1,1 +timestamp_micros,TIMESTAMP_MICROS,false,0,1,1 +timestamp_millis,TIMESTAMP_MILLIS,false,0,1,1 +timestamp_seconds,TIMESTAMP_SECONDS,false,0,1,1 +timestamp_sub,TIMESTAMP_SUB,false,0,3,3 +timestamp_trunc,TIMESTAMP_TRUNC,false,0,2,3 +to_base32,TO_BASE32,false,0,1,1 +to_base64,TO_BASE64,false,0,1,1 +to_code_points,TO_CODE_POINTS,false,0,1,1 +to_hex,TO_HEX,false,0,1,1 +to_json_string,TO_JSON_STRING,false,0,1,2 +to_proto,TO_PROTO,false,0,1,1 +trim,TRIM,false,0,1,2 +trunc,TRUNC,false,0,1,2 +unix_date,UNIX_DATE,false,0,1,1 +unix_micros,UNIX_MICROS,false,0,1,1 +unix_millis,UNIX_MILLIS,false,0,1,1 +unix_seconds,UNIX_SECONDS,false,0,1,1 +upper,UPPER,false,0,1,1 +var_pop,VAR_POP,true,0,1,1 +var_samp,VAR_SAMP,true,0,1,1 +"""; diff --git a/common/logica_lib.py b/common/logica_lib.py new file mode 100644 index 0000000..ee48a74 --- /dev/null +++ b/common/logica_lib.py @@ -0,0 +1,81 @@ +#!/usr/bin/python +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Lint as: python3 +"""Common utilities for Logica predicate compilation and execution.""" + +import subprocess +import sys + +from compiler import functors +from compiler import rule_translate +from compiler import universe +from parser_py import parse + + +def ParseOrExit(filename): + """Parse a Logica program.""" + with open(filename) as f: + program_text = f.read() + + try: + parsed_rules = parse.ParseFile(program_text)['rule'] + except parse.ParsingException as parsing_exception: + parsing_exception.ShowMessage() + sys.exit(1) + + return parsed_rules + + +def GetProgramOrExit(filename, user_flags=None): + """Get program object from a file.""" + parsed_rules = ParseOrExit(filename) + try: + p = universe.LogicaProgram(parsed_rules, user_flags=user_flags) + except rule_translate.RuleCompileException as rule_compilation_exception: + rule_compilation_exception.ShowMessage() + sys.exit(1) + except functors.FunctorError as functor_exception: + functor_exception.ShowMessage() + sys.exit(1) + return p + + +def RunQuery(sql, output_format='pretty', engine='bigquery'): + """Run a SQL query on BigQuery.""" + if engine == 'bigquery': + p = subprocess.Popen(['bq', 'query', + '--use_legacy_sql=false', + '--format=%s' % output_format], + stdin=subprocess.PIPE, stdout=subprocess.PIPE) + elif engine == 'sqlite': + p = subprocess.Popen(['sqlite3'], + stdin=subprocess.PIPE, stdout=subprocess.PIPE) + elif engine == 'psql': + p = subprocess.Popen(['psql', '--quiet'], + stdin=subprocess.PIPE, stdout=subprocess.PIPE) + else: + assert False, 'Unknown engine: %s' % engine + o, _ = p.communicate(sql.encode()) + return o.decode() + + +def RunPredicate(filename, predicate, + output_format='pretty', user_flags=None): + """Run a predicate on BigQuery.""" + p = GetProgramOrExit(filename, user_flags=user_flags) + sql = p.FormattedPredicateSql(predicate) + return RunQuery(sql, output_format, engine=p.annotations.Engine()) diff --git a/common/logica_test.py b/common/logica_test.py new file mode 100644 index 0000000..66dbe85 --- /dev/null +++ b/common/logica_test.py @@ -0,0 +1,84 @@ +#!/usr/bin/python +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Lint as: python3 +"""Utilities for YotaQL tests.""" + +import subprocess + +from common import color +from common import logica_lib + + +class TestManager(object): + """Global test managing class.""" + GOLDEN_RUN = False + ANNOUNCE_TESTS = False + RUN_ONLY = [] + + @classmethod + def SetGoldenRun(cls, value): + cls.GOLDEN_RUN = value + + @classmethod + def SetAnnounceTests(cls, value): + cls.ANNOUNCE_TESTS = value + + @classmethod + def SetRunOnlyTests(cls, value): + cls.RUN_ONLY = value + + @classmethod + def RunTest(cls, name, src, predicate, golden, user_flags): + if cls.RUN_ONLY and name not in cls.RUN_ONLY: + return + RunTest(name, src, predicate, golden, user_flags, + cls.GOLDEN_RUN, cls.ANNOUNCE_TESTS) + + +def RunTest(name, src, predicate, golden, + user_flags=None, + overwrite=False, announce=False): + """Run one test.""" + if announce: + print('Running test:', name) + test_result = '{warning}RUNNING{end}' + print(color.Format('% 50s %s' % (name, test_result))) + + result = logica_lib.RunPredicate(src, predicate, + user_flags=user_flags) + if overwrite: + with open(golden, 'w') as w: + w.write(result) + golden_result = open(golden).read() + + if result == golden_result: + test_result = '{ok}PASSED{end}' + else: + p = subprocess.Popen(['diff', '-', golden], stdin=subprocess.PIPE) + p.communicate(result.encode()) + test_result = '{error}FAILED{end}' + + print('\033[F\033[K' + color.Format('% 50s %s' % (name, test_result))) + + +def PrintHeader(): + """Print header for all tests.""" + print(color.Format( + '% 64s %s' % ('{warning}TEST{end}', '{warning}RESULT{end}'))) + print(color.Format( + '% 64s %s' % ('{warning}----{end}', '{warning}------{end}'))) + diff --git a/compiler/dialects.py b/compiler/dialects.py new file mode 100755 index 0000000..7752f90 --- /dev/null +++ b/compiler/dialects.py @@ -0,0 +1,88 @@ +#!/usr/bin/python +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""SQL dialects.""" + + +def Get(engine): + return DIALECTS[engine]() + + +class Dialect(object): + pass + + +class BigQueryDialect(Dialect): + """BigQuery SQL dialect.""" + + def Name(self): + return 'BigQuery' + + def BuiltInFunctions(self): + return {} + + def InfixOperators(self): + return { + '++': 'CONCAT(%s, %s)', + '->': 'STRUCT(%s AS arg, %s as value)', + } + + +class SqLiteDialect(Dialect): + """SqLite SQL dialect.""" + + def Name(self): + return 'SqLite' + + def BuiltInFunctions(self): + return { + 'Set': None + } + + def InfixOperators(self): + return { + '++': '(%s) || (%s)', + } + +class PostgreSQL(Dialect): + """PostgreSQL SQL dialect.""" + + def Name(self): + return 'PostgreSQL' + + def BuiltInFunctions(self): + return { + 'ArgMax': '(ARRAY_AGG({0}.arg order by {0}.value desc))[1]', + 'ArgMaxK': + 'ARRAY_AGG({0} order by {0}.value desc)', + 'ArgMin': '(ARRAY_AGG({0}.arg order by {0}.value))[1]', + 'ArgMinK': + 'ARRAY_AGG({0} order by {0}.value)', + 'ToString': 'CAST(%s AS TEXT)' + } + + def InfixOperators(self): + return { + '++': 'CONCAT(%s, %s)', + '->': '(%s, %s)::logica_arrow' + } + +DIALECTS = { + 'bigquery': BigQueryDialect, + 'sqlite': SqLiteDialect, + 'psql': PostgreSQL +} + diff --git a/compiler/expr_translate.py b/compiler/expr_translate.py new file mode 100755 index 0000000..1a0fc0e --- /dev/null +++ b/compiler/expr_translate.py @@ -0,0 +1,508 @@ +#!/usr/bin/python +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Compiler of a Logica expression to SQL.""" + +import copy + +import json + +from common import color +from common.data import processed_functions + +from compiler import dialects + + +class QL(object): + """Class translating Logica expressions into SQL.""" + BUILT_IN_FUNCTIONS = { # Please keep sorted alphabetically. + # Casting. + 'ToFloat64': 'CAST(%s AS FLOAT64)', + 'ToInt64': 'CAST(%s AS INT64)', + 'ToUInt64': 'CAST(%s AS UINT64)', + 'ToString': 'CAST(%s AS STRING)', + # Aggregation. + 'Aggregate': '%s', # Placeholder to use formulas for aggregation. + 'Agg+': 'SUM(%s)', + 'Agg++': 'ARRAY_CONCAT_AGG(%s)', + # ArgMax and ArgMin return arg which achieves the max/min value. + 'ArgMax': 'ARRAY_AGG({0}.arg order by {0}.value desc limit 1)[OFFSET(0)]', + # ArgMaxK and ArgMinK return arg **and** value for K elements that achieve + # Max/Min value. It's not ideal that ArgMax and ArgMaxK return different + # types, but having values could be useful sometimes and so we'd have to + # introduce SortedLimitedList, which would be hard to remember. + 'ArgMaxK': + 'ARRAY_AGG({0} order by {0}.value desc limit {1})', + 'ArgMin': 'ARRAY_AGG({0}.arg order by {0}.value limit 1)[OFFSET(0)]', + 'ArgMinK': + 'ARRAY_AGG({0} order by {0}.value limit {1})', + 'Array': 'ARRAY_AGG({0}.value order by {0}.arg)', + 'Container': '%s', + 'Count': 'APPROX_COUNT_DISTINCT(%s)', + 'ExactCount': 'COUNT(DISTINCT %s)', + 'List': 'ARRAY_AGG(%s)', + 'Median': 'APPROX_QUANTILES(%s, 2)[OFFSET(1)]', + 'SomeValue': 'ARRAY_AGG(%s IGNORE NULLS LIMIT 1)[OFFSET(0)]', + # Other functions. + '!': 'NOT %s', + '-': '- %s', + 'Concat': 'ARRAY_CONCAT({0}, {1})', + 'Constraint': '%s', + 'DateAddDay': 'DATE_ADD({0}, INTERVAL {1} DAY)', + 'DateDiffDay': 'DATE_DIFF({0}, {1}, DAY)', + 'Element': '{0}[OFFSET({1})]', + 'Enumerate': ('ARRAY(SELECT STRUCT(' + 'ROW_NUMBER() OVER () AS n, x AS element) ' + 'FROM UNNEST(%s) as x)'), + 'IsNull': '(%s IS NULL)', + 'Join': 'ARRAY_TO_STRING(%s)', + 'Like': '({0} LIKE {1})', + 'Range': 'GENERATE_ARRAY(0, %s - 1)', + 'RangeOf': 'GENERATE_ARRAY(0, ARRAY_LENGTH(%s) - 1)', + 'Set': 'ARRAY_AGG(DISTINCT %s)', + 'Size': 'ARRAY_LENGTH(%s)', + 'Sort': 'ARRAY(SELECT x FROM UNNEST(%s) as x ORDER BY x)', + 'TimestampAddDays': 'TIMESTAMP_ADD({0}, INTERVAL {1} DAY)', + 'Unique': 'ARRAY(SELECT DISTINCT x FROM UNNEST(%s) as x ORDER BY x)', + # These functions are treated specially. + 'FlagValue': 'UNUSED', + 'Cast': 'UNUSED', + 'SqlExpr': 'UNUSED' + } + BUILT_IN_INFIX_OPERATORS = { + '==': '%s = %s', + '<=': '%s <= %s', + '<': '%s < %s', + '>=': '%s >= %s', + '>': '%s > %s', + '->': 'STRUCT(%s AS arg, %s as value)', + '/': '(%s) / (%s)', + '+': '(%s) + (%s)', + '-': '(%s) - (%s)', + '*': '(%s) * (%s)', + '^': 'POW(%s, %s)', + '!=': '%s != %s', + '++': 'CONCAT(%s, %s)', + 'In': '%s IN UNNEST(%s)', + '||': '%s OR %s', + '&&': '%s AND %s', + '%': 'MOD(%s, %s)' + } + BULK_FUNCTIONS = {} + BULK_FUNCTIONS_ARITY_RANGE = {} + + # When adding any analytic functions please check that ConvertAnalytic + # function handles them correctly. + ANALYTIC_FUNCTIONS = { + 'CumulativeSum': + 'SUM({0}) OVER (PARTITION BY {1} ORDER BY {2} ' + 'ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)', + 'CumulativeMax': + 'MAX({0}) OVER (PARTITION BY {1} ORDER BY {2} ' + 'ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)', + 'CumulativeMin': + 'MIN({0}) OVER (PARTITION BY {1} ORDER BY {2} ' + 'ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)', + 'WindowSum': + 'SUM({0}) OVER (PARTITION BY {1} ORDER BY {2} ' + 'ROWS BETWEEN {3} PRECEDING AND CURRENT ROW)', + 'WindowMax': + 'MAX({0}) OVER (PARTITION BY {1} ORDER BY {2} ' + 'ROWS BETWEEN {3} PRECEDING AND CURRENT ROW)', + 'WindowMin': + 'MIN({0}) OVER (PARTITION BY {1} ORDER BY {2} ' + 'ROWS BETWEEN {3} PRECEDING AND CURRENT ROW)', + } + + def __init__(self, vars_vocabulary, subquery_translator, exception_maker, + flag_values, custom_udfs=None, dialect=None): + """Initializes the instance. + + Args: + vars_vocabulary: Dictionary mapping Logica variable to an SQL expression. + subquery_translator: SubqueryTranslator to translate 'combine' + expressions. + exception_maker: Exception to raise if expression comilation error occurs. + flag_values: Values of program flags. + custom_udfs: A map from udf name to udf application string template. + dialect: SQL dialect object. + """ + self.dialect = dialect or dialects.BigQueryDialect() + self.vocabulary = vars_vocabulary + self.subquery_translator = subquery_translator + # Using instance variables for test purposes. + self.InstallBulkFunctionsOfStandardSQL() + self.bulk_functions = self.BULK_FUNCTIONS + self.bulk_function_arity_range = self.BULK_FUNCTIONS_ARITY_RANGE + self.built_in_functions = copy.deepcopy(self.bulk_functions) + self.built_in_functions.update(self.BUILT_IN_FUNCTIONS) + self.built_in_functions.update(self.dialect.BuiltInFunctions()) + self.built_in_infix_operators = copy.deepcopy( + self.BUILT_IN_INFIX_OPERATORS) + self.built_in_infix_operators.update(self.dialect.InfixOperators()) + self.exception_maker = exception_maker + self.debug_undefined_variables = False + # We set convert_to_json to convert arguments of annotations to Python + # objects. This is hack-y. In the long run we plan to run them in + # StandardSQL reference implementation and record the output. + self.convert_to_json = False + self.flag_values = flag_values + self.custom_udfs = custom_udfs or {} + + @classmethod + def BasisFunctions(cls): + cls.InstallBulkFunctionsOfStandardSQL() + return ( + set(cls.BUILT_IN_FUNCTIONS) | + set(cls.BUILT_IN_INFIX_OPERATORS) | + set(cls.BULK_FUNCTIONS) | + set(cls.ANALYTIC_FUNCTIONS)) + + @classmethod + def InstallBulkFunctionsOfStandardSQL(cls): + """Populates fields from processed_functions.csv.""" + if cls.BULK_FUNCTIONS: + return + def CamelCase(s): + s = s.replace('.', '_') + return ''.join(p[0].upper() + p[1:] for p in s.split('_')) + reader = processed_functions.GetCsv() + header = next(reader) + + for row in reader: + row = dict(list(zip(header, row))) + if row['function'][0] == '$': + # TODO: Process operators. + continue + function_name = CamelCase(row['function']) + cls.BULK_FUNCTIONS[function_name] = ( + '%s(%s)' % (row['sql_function'], '%s')) + cls.BULK_FUNCTIONS_ARITY_RANGE[function_name] = ( + int(row['min_args']), + float('inf') + if row['has_repeated_args'] == '1' else int(row['max_args'])) + + def BuiltInFunctionArityRange(self, f): + """Returns arity of the built-in function.""" + assert f in self.built_in_functions + if f in self.BUILT_IN_FUNCTIONS: + if f == 'If': + return (3, 3) + arity_2_functions = ['RegexpExtract', 'Like', + 'ParseTimestamp', 'FormatTimestamp', + 'TimestampAddDays', 'Split', 'Element', + 'Concat', 'DateAddDay', 'DateDiffDay', + 'ArgMaxK', 'ArgMinK', 'Join'] + if f in arity_2_functions: + return (2, 2) + return (1, 1) + else: + assert f in self.bulk_functions + return self.bulk_function_arity_range[f] + + def If(self, args): + assert len(args) == 3 + return 'IF(%s, %s, %s)' % tuple(args) + + def Function(self, f, args): + args_list = [None] * len(args) + for k, v in args.items(): + args_list[k] = str(v) + if '%s' in f: + return f % ', '.join(args_list) + else: + return f.format(*args_list) + + def Infix(self, op, args): + return op % (args['left'], args['right']) + + def Subscript(self, record, subscript): + if isinstance(subscript, int): + subscript = 'col%d' % subscript + return '%s.%s' % (record, subscript) + + def IntLiteral(self, literal): + return str(literal['number']) + + def StrLiteral(self, literal): + if self.dialect.Name() == "PostgreSQL": + # TODO: Do this safely. + return '\'%s\'' % literal['the_string'] + return json.dumps(literal['the_string'], ensure_ascii=False) + + def ListLiteralInternals(self, literal): + return ', '.join([self.ConvertToSql(e) + for e in literal['element']]) + + def ListLiteral(self, literal): + return 'ARRAY[%s]' % self.ListLiteralInternals(literal) + + def BoolLiteral(self, literal): + return literal['the_bool'] + + def NullLiteral(self, literal): + return literal['the_null'] + + # Might be used for automatic program analysis. + def PredicateLiteral(self, literal): + if self.convert_to_json: + return '{"predicate_name": "%s"}' % (literal['predicate_name']) + return 'STRUCT("%s" AS predicate_name)' % literal['predicate_name'] + + def Variable(self, variable): + if variable['var_name'] in self.vocabulary: + return self.vocabulary[variable['var_name']] + else: + if self.debug_undefined_variables: + return 'UNDEFINED_%s' % variable['var_name'] + assert False, 'Found no interpretation for %s in %s' % ( + variable['var_name'], self.vocabulary) + + def ConvertRecord(self, args): + result = {} + for f_v in args['field_value']: + assert 'expression' in f_v['value'], ( + 'Bad record: %s' % args) + result[f_v['field']] = self.ConvertToSql(f_v['value']['expression']) + return result + + def RecordAsJson(self, record): + json_field_values = [] + for f_v in record['field_value']: + json_field_values.append('"{field}": {value}'.format( + field=f_v['field'], + value=self.ConvertToSql(f_v['value']['expression']))) + return '{%s}' % ', '.join(json_field_values) + + def Record(self, record): + if self.convert_to_json: + return self.RecordAsJson(record) + arguments_str = ', '.join( + '%s AS %s' % (self.ConvertToSql(f_v['value']['expression']), + f_v['field']) + for f_v in record['field_value']) + return 'STRUCT(%s)' % arguments_str + + def GenericSqlExpression(self, record): + """Converting SqlExpr to SQL.""" + top_record = self.ConvertRecord(record) + if set(top_record) != set([0, 1]): + raise self.exception_maker( + 'SqlExpr must have 2 positional arguments, got: %s' % top_record) + if ('literal' not in record['field_value'][0] + ['value']['expression'] or + 'the_string' not in + record['field_value'][0]['value']['expression']['literal']): + raise self.exception_maker( + 'SqlExpr must have first argument be string, got: %s' % + top_record[0]) + + template = ( + record['field_value'][0]['value']['expression']['literal'] + ['the_string']['the_string']) + if 'record' not in record['field_value'][1]['value']['expression']: + raise self.exception_maker( + 'Sectond argument of SqlExpr must be record literal. Got: %s' % + top_record[1]) + args = self.ConvertRecord( + record['field_value'][1]['value']['expression']['record']) + return template.format(**args) + + def Implication(self, implication): + when_then_clauses = [] + for cond_cons in implication['if_then']: + when_then_clauses.append( + 'WHEN {cond} THEN {cons}'.format( + cond=self.ConvertToSql(cond_cons['condition']), + cons=self.ConvertToSql(cond_cons['consequence']))) + when_then_clauses_str = ' '.join(when_then_clauses) + otherwise = self.ConvertToSql(implication['otherwise']) + return 'CASE %s ELSE %s END' % (when_then_clauses_str, otherwise) + + def ConvertAnalyticListArgument(self, expression): + if ('literal' not in expression or + 'the_list' not in expression['literal']): + raise self.exception_maker( + 'Analytic list argument must resolve to list literal, got: %s' % + self.ConvertToSql(expression)) + return self.ListLiteralInternals(expression['literal']['the_list']) + + def ConvertAnalytic(self, call): + """Converting analytic function call to SQL.""" + is_window = call['predicate_name'].startswith('Window') + if len(call['record']['field_value']) != 3 + is_window: + raise self.exception_maker( + 'Function %s must have %d arguments.' % (call['predicate_name'], + 3 + is_window)) + aggregant = self.ConvertToSql( + call['record']['field_value'][0]['value']['expression']) + group_by = self.ConvertAnalyticListArgument( + call['record']['field_value'][1]['value']['expression']) + order_by = self.ConvertAnalyticListArgument( + call['record']['field_value'][2]['value']['expression']) + + if is_window: + window_size = self.ConvertToSql( + call['record']['field_value'][3]['value']['expression']) + + if not is_window: + return self.ANALYTIC_FUNCTIONS[call['predicate_name']].format( + aggregant, group_by, order_by) + else: + return self.ANALYTIC_FUNCTIONS[call['predicate_name']].format( + aggregant, group_by, order_by, window_size) + + def ConvertToSql(self, expression): + """Converting Logica expression into SQL.""" + # print('EXPR:', expression) + # Variables. + if 'variable' in expression: + return self.Variable(expression['variable']) + + # Literals. + if 'literal' in expression: + literal = expression['literal'] + if 'the_number' in literal: + return self.IntLiteral(literal['the_number']) + if 'the_string' in literal: + return self.StrLiteral(literal['the_string']) + if 'the_list' in literal: + return self.ListLiteral(literal['the_list']) + if 'the_bool' in literal: + return self.BoolLiteral(literal['the_bool']) + if 'the_null' in literal: + return self.NullLiteral(literal['the_null']) + if 'the_predicate' in literal: + return self.PredicateLiteral(literal['the_predicate']) + assert False, 'Logica bug: unsupported literal parsed: %s' % literal + + if 'call' in expression: + call = expression['call'] + arguments = self.ConvertRecord(call['record']) + if call['predicate_name'] in self.ANALYTIC_FUNCTIONS: + return self.ConvertAnalytic(call) + if call['predicate_name'] == 'SqlExpr': + return self.GenericSqlExpression(call['record']) + if call['predicate_name'] == 'Cast': + if (len(arguments) != 2 or + 'literal' not in + call['record']['field_value'][1]['value']['expression'] or + 'the_string' not in + call['record']['field_value'][1]['value']['expression']['literal']): + raise self.exception_maker( + 'Cast must have 2 arguments and the second argument must be a ' + 'string literal.') + cast_to = ( + call['record']['field_value'][1]['value']['expression']['literal'] + ['the_string']['the_string']) + return 'CAST(%s AS %s)' % ( + self.ConvertToSql( + call['record']['field_value'][0]['value']['expression']), + cast_to) + + if call['predicate_name'] == 'FlagValue': + if (len(arguments) != 1 or + 'literal' not in + call['record']['field_value'][0]['value']['expression'] or + 'the_string' not in + call['record']['field_value'][0]['value']['expression']['literal']): + raise self.exception_maker( + 'FlagValue argument must be a string literal.') + flag = ( + call['record']['field_value'][0]['value']['expression']['literal'] + ['the_string']['the_string']) + if flag not in self.flag_values: + raise self.exception_maker( + 'Unspecified flag: %s' % flag) + return self.StrLiteral( + {'the_string': self.flag_values[flag]}) + for ydg_f, sql_f in self.built_in_functions.items(): + if call['predicate_name'] == ydg_f: + if not sql_f: + raise self.exception_maker( + 'Function %s is not supported by %s dialect.' % ( + color.Warn(ydg_f), color.Warn(self.dialect.Name()))) + if len(arguments) == 2 and ydg_f == '-': + continue # '-' is the only operator with variable arity. + arity_range = self.BuiltInFunctionArityRange(ydg_f) + if not arity_range[0] <= len(arguments) <= arity_range[1]: + raise self.exception_maker( + color.Format( + 'Built-in function {warning}{ydg_f}{end} takes {a} ' + 'arguments, but {b} arguments were given.', + dict(ydg_f=ydg_f, a=arity_range, + b=len(arguments)))) + return self.Function(sql_f, arguments) + + for udf, udf_sql in self.custom_udfs.items(): + if call['predicate_name'] == udf: + # TODO: Treatment of positional arguments should be + # simplified everywhere. + arguments = dict( + (k, v) if isinstance(k, str) else ('col%d' % k, v) + for k, v in arguments.items()) + try: + result = udf_sql.format(**arguments) + except KeyError: + raise self.exception_maker( + 'Function %s call is inconsistent with its signature %s.' % + (color.Warn(udf), udf_sql)) + return result + + for ydg_op, sql_op in self.built_in_infix_operators.items(): + if call['predicate_name'] == ydg_op: + result = self.Infix(sql_op, arguments) + # TODO: Don't add parenthesis unless they are needed. + if ydg_op not in ('++', '++?', 'In', '=='): + result = '(' + result + ')' + return result + + if 'subscript' in expression: + sub = expression['subscript'] + subscript = sub['subscript']['literal']['the_symbol']['symbol'] + # TODO: Record literal and record of subscript should have + # different keys. + # Try to opimize and return the field from a record. + if 'record' in sub['record']: + for f_v in sub['record']['record']['field_value']: + if f_v['field'] == subscript: + # Optimizing and returning the field directly. + return self.ConvertToSql(f_v['value']['expression']) + # Couldn't optimize, just return the '.' expression. + record = self.ConvertToSql(sub['record']) + return self.Subscript(record, subscript) + + if 'record' in expression: + record = expression['record'] + return self.Record(record) + + if 'combine' in expression: + return '(%s)' % ( + self.subquery_translator.TranslateRule(expression['combine'], + self.vocabulary)) + + if 'implication' in expression: + implication = expression['implication'] + return self.Implication(implication) + + if 'call' in expression and 'predicate_name' in expression['call']: + raise self.exception_maker(color.Format( + 'Unsupported supposedly built-in function: ' + '{warning}{predicate}{end}.', dict( + predicate=expression['call']['predicate_name']))) + assert False, ( + 'Logica bug: expression %s failed to compile for unknown reason.' % + str(expression)) diff --git a/compiler/functors.py b/compiler/functors.py new file mode 100755 index 0000000..d9e0cff --- /dev/null +++ b/compiler/functors.py @@ -0,0 +1,283 @@ +#!/usr/bin/python +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Functors library. + +This is for running @Make instructions. + +In the context of @Make we are thinking of each predicate as also a function +from the set of predicates to itself. The predicates that it uses in the +definition are arguments of this function. + +Such functions that map predicates to predicates we call 'functors'. + +At the moment any functor is a predicate, but in the future we may want to +introduce more abstact functors. E.g.: Apply(F, G) := F(G); +This could potentially be useful for limited recursion. +""" + +import collections +import copy +import sys + +from common import color +from parser_py import parse + + +class FunctorError(Exception): + """Exception thrown when Make is bad.""" + + def __init__(self, message, functor_name): + super(FunctorError, self).__init__(message) + self.functor_name = functor_name + + def ShowMessage(self): + print(color.Format('{underline}Making{end}:'), file=sys.stderr) + print(self.functor_name, file=sys.stderr) + print(color.Format('\n[ {error}Error{end} ] ') + self.message, + file=sys.stderr) + + +def Walk(x, act, should_enter): + """Walking over a dictionary of lists, modifying and/or collecting info.""" + r = [] + r.extend(act(x)) + if isinstance(x, list): + for v in x: + r.extend(Walk(v, act, should_enter)) + if isinstance(x, dict): + for k in x: + if should_enter(k): + r.extend(Walk(x[k], act, should_enter)) + return set(r) + + +class Functors(object): + """A class for creating new functors.""" + + def __init__(self, rules): + self.rules = rules + self.extended_rules = copy.deepcopy(rules) + self.rules_of = parse.DefinedPredicatesRules(rules) + self.predicates = set(self.rules_of) + self.direct_args_of = self.BuildDirectArgsOf() + self.args_of = {} + self.creation_count = 0 + self.cached_calls = {} + for p in self.predicates: + self.ArgsOf(p) + + def UpdateStructure(self): + """Updates rules_of and args_of maps after extebded_rules update.""" + self.rules_of = parse.DefinedPredicatesRules(self.extended_rules) + self.predicates = set(self.rules_of) + self.direct_args_of = self.BuildDirectArgsOf() + # Resetting args_of, to process the new predicates that were added. + self.args_of = {} + for p in self.predicates: + self.ArgsOf(p) + + def ParseMakeInstruction(self, predicate, instruction): + """Parses Make instruction from syntax tree.""" + error_message = 'Bad Make instruction: %s' % instruction + if '1' not in instruction or '2' not in instruction: + raise FunctorError(error_message, predicate) + if 'predicate_name' not in instruction['1']: + raise FunctorError(error_message, predicate) + applicant = instruction['1']['predicate_name'] + args_map = {} + for arg_name, arg_value_dict in instruction['2'].items(): + if 'predicate_name' not in arg_value_dict: + raise FunctorError(error_message, predicate) + args_map[arg_name] = arg_value_dict['predicate_name'] + return predicate, applicant, args_map + + def Describe(self): + return 'DirectArgs: %s,\nArgs: %s' % (self.direct_args_of, self.args_of) + + def BuildDirectArgsOf(self): + """Builds a map of direct arguments of a functor.""" + def ExtractPredicateName(x): + if isinstance(x, dict) and 'predicate_name' in x: + return [x['predicate_name']] + return [] + direct_args_of = {} + for functor, rules in self.rules_of.items(): + args = set() + for rule in rules: + args |= Walk(rule, ExtractPredicateName, lambda _: True) + args -= set([functor]) + direct_args_of[functor] = args + return direct_args_of + + def ArgsOf(self, functor): + """Arguments of functor. Retrieving from cache, or computing.""" + if functor not in self.args_of: + self.args_of[functor] = self.BuildArgs(functor) + return self.args_of[functor] + + def BuildArgs(self, functor): + """Returning all arguments of a functor.""" + result = set() + if functor not in self.direct_args_of: + # Assuming this is built-in or table. + return result + queue = collections.deque(self.direct_args_of[functor]) + while queue: + e = queue.popleft() + result.add(e) + for a in self.ArgsOf(e): + if a not in result: + queue.append(a) + return result + + def AllRulesOf(self, functor): + """Returning all rules relevant to a predicate.""" + result = [] + if functor not in self.rules_of: + return result + result.extend(self.rules_of[functor]) + for f in self.args_of[functor]: + if f in self.rules_of: + result.extend(self.rules_of[f]) + return copy.deepcopy(result) + + def Make(self, predicate, instruction): + """Make a new predicate according to instruction.""" + self.CallFunctor(*self.ParseMakeInstruction(predicate, instruction)) + + def MakeAll(self, predicate_to_instruction): + """Making all required predicates.""" + # We needs to build them in the order of dependency. + needs_building = set( + self.ParseMakeInstruction(p, i)[0] for p, i in predicate_to_instruction) + while needs_building: + something_built = False + for (new_predicate, instruction) in sorted(predicate_to_instruction): + name, applicant, args_map = self.ParseMakeInstruction(new_predicate, + instruction) + if (new_predicate not in needs_building or + applicant in needs_building or + (set(args_map.values()) & needs_building)): + continue + self.Make(new_predicate, instruction) + something_built = True + needs_building.remove(name) + if needs_building and not something_built: + raise FunctorError('Could not resolve Make order.', + str(needs_building)) + if False: + with open('/tmp/functors.dot', 'w') as w: + w.write('digraph Functors {\n') + for f, args in self.direct_args_of.items(): + # For cleaner graph: + if f.startswith('@') or f == '++?': + continue + for arg in args: + if arg in ['||', '&&', '==', '<=', '>=', '<', '>', '!=', '++?', + '++', '+', '-', '*', '/', '%', '^', ' In ', '!', + 'Agg+', 'Greatest']: + continue # For cleaner graph. + w.write('"%s" -> "%s";\n' % (f, arg)) + w.write('}\n') + + def CollectAnnotations(self, predicates): + """Collecting annotations of predictes.""" + predicates = set(predicates) + result = [] + for annotation, rules in self.rules_of.items(): + if annotation not in ['@Limit', '@OrderBy', '@Ground', + '@NoInject']: + continue + for rule in rules: + if rule['head']['record']['field_value'][0]['value']['expression'][ + 'literal']['the_predicate']['predicate_name'] in predicates: + result.append(rule) + return copy.deepcopy(result) + + def CallKey(self, functor, args_map): + """A string representing a call of a functor with arguments.""" + relevant_args = {k: v + for k, v in args_map.items() + if k in self.ArgsOf(functor)} + args = ','.join('%s: %s' % (k, v) for k, v in sorted(relevant_args.items())) + result = '%s(%s)' % (functor, args) + return result + + def CallFunctor(self, name, applicant, args_map): + """Calling a functor applicant(args_map), storing result to 'name'.""" + bad_args = set(args_map.keys()) - set(self.args_of[applicant]) + if bad_args: + raise FunctorError( + 'Functor %s is applied to arguments %s, which it does not ' + 'have.' % (applicant, color.Warn(','.join(bad_args))), + name) + self.creation_count += 1 + rules = self.AllRulesOf(applicant) + args = set(args_map) + rules = [r for r in rules + if ((args & self.args_of[r['head']['predicate_name']]) or + r['head']['predicate_name'] == applicant)] + if not rules: + raise FunctorError( + 'Rules for %s when making %s are not found' % (applicant, name), + name) + # This eventually maps all args to substiturions, as well as all predictes + # which use one of the args into a newly created predicate names. + extended_args_map = copy.deepcopy(args_map) + rules_to_update = [] + cache_update = {} + predicates_to_annotate = set() + for r in sorted(rules, key=str): + rule_predicate_name = r['head']['predicate_name'] + if rule_predicate_name == applicant: + extended_args_map[rule_predicate_name] = name + rules_to_update.append(r) + predicates_to_annotate.add(rule_predicate_name) + else: + call_key = self.CallKey(rule_predicate_name, args_map) + if call_key in self.cached_calls: + new_predicate_name = self.cached_calls[call_key] + extended_args_map[rule_predicate_name] = new_predicate_name + else: + new_predicate_name = ( + rule_predicate_name + '_f%d' % self.creation_count) + extended_args_map[rule_predicate_name] = new_predicate_name + cache_update[call_key] = new_predicate_name + rules_to_update.append(r) + predicates_to_annotate.add(rule_predicate_name) + + rules = rules_to_update + self.cached_calls.update(cache_update) + # Collect annotations of all involved predicates. + # Newly created predicates inherit annotations of predicates from which + # they were created. + # Arguments values of the functor do not inherit annotations of the + # arguments, as that would collide with their performance in other + # contexts. + # In particular it means that functors should not use @Limit and @OrderBy + # of the arguments to express the logic. Instead they should create simple + # predicates reading from the agument and annotate those. + annotations = self.CollectAnnotations(list(predicates_to_annotate)) + rules.extend(annotations) + def ReplacePredicate(x): + if isinstance(x, dict) and 'predicate_name' in x: + if x['predicate_name'] in extended_args_map: + x['predicate_name'] = extended_args_map[x['predicate_name']] + return [] + Walk(rules, ReplacePredicate, lambda _: True) + self.extended_rules.extend(rules) + self.UpdateStructure() diff --git a/compiler/rule_translate.py b/compiler/rule_translate.py new file mode 100755 index 0000000..b85019a --- /dev/null +++ b/compiler/rule_translate.py @@ -0,0 +1,725 @@ +#!/usr/bin/python +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Compiler of a single Logica rule to SQL.""" + +import collections +import copy +import string +import sys + +from common import color +from compiler import expr_translate + +xrange = range + +def Indent2(s): + return '\n'.join(' ' + l for l in s.split('\n')) + + +class RuleCompileException(Exception): + """Exception thrown when user-error is detected at rule-compile time.""" + + def __init__(self, message, rule_str): + super(RuleCompileException, self).__init__(message) + self.rule_str = rule_str + + def ShowMessage(self, stream=sys.stderr): + print(color.Format('{underline}Compiling{end}:'), file=stream) + print(self.rule_str, file=stream) + print(color.Format('\n[ {error}Error{end} ] ') + str(self), file=stream) + + +def LogicaFieldToSqlField(logica_field): + if isinstance(logica_field, int): + # TODO: Ensure that no collision occurs. + return 'col%d' % logica_field + return logica_field + + +def HeadToSelect(head): + """Converting a rule head to a SELECT representation.""" + select = collections.OrderedDict() + aggregated_vars = [] + for field_value in head['record']['field_value']: + k = field_value['field'] + v = field_value['value'] + if 'aggregation' in v: + select[k] = copy.deepcopy(v['aggregation']['expression']) + aggregated_vars.append(k) + else: + assert 'expression' in v, 'Bad select value: %s' % str(v) + select[k] = v['expression'] # <=> v as k + + return (select, aggregated_vars) + + +def AllMentionedVariables(x, dive_in_combines=False): + """Extracting all variables mentioned in an expression.""" + r = [] + if isinstance(x, dict) and 'variable' in x: + r.append(x['variable']['var_name']) + if isinstance(x, list): + for v in x: + r.extend(AllMentionedVariables(v, dive_in_combines)) + if isinstance(x, dict): + for k in x: + # Variables mentioned in 'combine' expression may be resolved via tables + # of the 'combine' expression. So they are not to be included in the + # parent query. + if k != 'combine' or dive_in_combines: + r.extend(AllMentionedVariables(x[k], dive_in_combines)) + return set(r) + + +def ReplaceVariable(old_var, new_expr, s): + """Replacing a variable in expressoin s.""" + if isinstance(s, dict): + member_index = sorted(s.keys(), key=str) + elif isinstance(s, list): + member_index = range(len(s)) + else: + assert False, 'Replace should be called on list or dict. Got: %s' % str(s) + + for k in member_index: + if (isinstance(s[k], dict) and + 'variable' in s[k] and + s[k]['variable']['var_name'] == old_var): + s[k] = new_expr + if isinstance(s, dict): + for k in s: + if isinstance(s[k], dict) or isinstance(s[k], list): + ReplaceVariable(old_var, new_expr, s[k]) + if isinstance(s, list): + for k in s: + if isinstance(k, dict) or isinstance(k, list): + ReplaceVariable(old_var, new_expr, k) + + +class NamesAllocator(object): + """Allocator of unique names for tables and variables. + + Also holds existing built-in function names. + """ + + def __init__(self, custom_udfs=None): + self.aux_var_num = 0 + self.table_num = 0 + self.allocated_tables = set() + self.custom_udfs = custom_udfs or {} + + def AllocateVar(self, hint=None): + v = 'x_%d' % self.aux_var_num + self.aux_var_num += 1 + return v + + def AllocateTable(self, hint_for_user=None): + """Allocating a table name.""" + allowed_chars = set(string.ascii_letters + string.digits + '_./') + if hint_for_user and len(hint_for_user) < 100: + suffix = ''.join( + ('_' if c in ['.', '/'] else c) + for c in hint_for_user if c in allowed_chars) + else: + suffix = '' + if suffix and suffix not in self.allocated_tables: + t = suffix + else: + if suffix: + suffix = '_' + suffix + t = 't_%d%s' % (self.table_num, suffix) + self.table_num += 1 + self.allocated_tables.add(t) + return t + + def FunctionExists(self, function_name): + return (function_name in expr_translate.QL.BasisFunctions() or + function_name in self.custom_udfs) + + +class ExceptExpression(object): + """Namespace for constructing and recognizing 'Except' expressions.""" + + @classmethod + def Build(cls, table_name, except_fields): + return '(SELECT AS STRUCT %s.* EXCEPT (%s))' % (table_name, + ','.join(except_fields)) + + @classmethod + def Recognize(cls, field_name): + # Only 'Except' variables start with "(SELECT AS STRUCT". + return field_name.startswith('(SELECT AS STRUCT') + + +class RuleStructure(object): + """Representing a single Logica rule structure. + + Can convert itself into an SQL SELECT statement. + """ + + def __init__(self, names_allocator=None, external_vocabulary=None, + custom_udfs=None): + # Name of this predicate. + self.this_predicate_name = '' + # Table name to table predicate. + self.tables = collections.OrderedDict() + # Table variable to clause variable map. + self.vars_map = {} + # Clause variable to one table variable. + self.inv_vars_map = {} + self.vars_unification = [] + self.constraints = [] + self.select = collections.OrderedDict() + self.unnestings = [] + self.distinct_vars = [] + names_allocator = names_allocator or NamesAllocator(custom_udfs=custom_udfs) + self.allocator = names_allocator + self.external_vocabulary = external_vocabulary + self.synonym_log = {} + self.full_rull_text = None + self.distinct_denoted = None + + def OwnVarsVocabulary(self): + """Returns a map: logica variable -> SQL expression with the value.""" + def TableAndFieldToSql(table, field): + if ExceptExpression.Recognize(field): + return field + elif table and field != '*': + return '%s.%s' % (table, field) + elif not table: + return field + else: # field == '*' + return table + return {k: TableAndFieldToSql(v[0], LogicaFieldToSqlField(v[1])) + for k, v in self.inv_vars_map.items()} + + def VarsVocabulary(self): + r = {} + r.update(self.OwnVarsVocabulary()) + if self.external_vocabulary: + r.update(self.external_vocabulary) + return r + + def ExtractedVariables(self): + return set(self.VarsVocabulary().keys()) + + def InternalVariables(self): + return self.AllVariables() - self.ExtractedVariables() + + def AllVariables(self): + r = set() + r |= AllMentionedVariables(self.select) + r |= AllMentionedVariables(self.vars_unification) + r |= AllMentionedVariables(self.constraints) + r |= AllMentionedVariables(self.unnestings) + return r + + def SortUnnestings(self): + """Sorts unnestings in dependency order.""" + unnesting_of = {u[0]['variable']['var_name']: u + for u in self.unnestings} + unnesting_variables = set(unnesting_of) + depends_on = {u[0]['variable']['var_name']: + set(AllMentionedVariables(u[1], dive_in_combines=True)) & + unnesting_variables for u in self.unnestings} + + unnested = set() + ordered_unnestings = [] + while unnesting_of: + for v, u in sorted(unnesting_of.items()): + if depends_on[v] <= unnested: + ordered_unnestings.append(unnesting_of[v]) + del unnesting_of[v] + unnested.add(v) + break + else: + raise RuleCompileException( + color.Format( + 'There seem to be a circular dependency of {warning}In{end} ' + 'calls. ' + 'This error might also come from injected sub-rules.'), + self.full_rule_text) + self.unnestings = ordered_unnestings + + def ElliminateInternalVariables(self, assert_full_ellimination=False): + """Elliminates internal variables via substitution.""" + variables = self.InternalVariables() + while True: + done = True + for u in self.vars_unification: + for k, r in [['left', 'right'], ['right', 'left']]: + if u[k] == u[r]: + continue + ur_variables = AllMentionedVariables(u[r]) + ur_variables_incl_combines = AllMentionedVariables( + u[r], dive_in_combines=True) + if (isinstance(u[k], dict) and + 'variable' in u[k] and + u[k]['variable']['var_name'] in variables and + u[k]['variable']['var_name'] not in ur_variables_incl_combines and + ( + ur_variables <= self.ExtractedVariables() or + not str(u[k]['variable']['var_name']).startswith('x_'))): + u_left = u[k]['variable']['var_name'] + u_right = u[r] + if 'variable' in u_right: + l = self.synonym_log.get(u_right['variable']['var_name'], []) + l.append(u_left) + l.extend(self.synonym_log.get(u_left, [])) + self.synonym_log[u_right['variable']['var_name']] = l + ReplaceVariable(u_left, u_right, self.unnestings) + ReplaceVariable(u_left, u_right, self.select) + ReplaceVariable(u_left, u_right, self.vars_unification) + ReplaceVariable(u_left, u_right, self.constraints) + done = False + if done: + variables = self.InternalVariables() + if assert_full_ellimination: + if True: + if variables: + violators = [] + for v in variables: + violators.extend(self.synonym_log.get(v, [])) + violators.append(v) + violators = {v for v in violators if not v.startswith('x_')} + assert violators, ( + 'Logica needs better error messages: purely internal ' + 'variable was not eliminated. It looks like you have ' + 'not passed a required argument to some called predicate. ' + 'Use --add_debug_info_to_var_names flag to make this message ' + 'a little more informatvie. ' + 'Variables: %s, synonym_log: %s' % (str(variables), + str(self.synonym_log))) + # Remove disambiguation suffixes from variables not to confuse + # the user. + violators = {v.split(' # disambiguated')[0] for v in violators} + raise RuleCompileException( + color.Format( + 'Found no way to assign variables: ' + '{warning}{violators}{end}. ' + 'This error might also come from injected sub-rules.', + dict(violators=', '.join(sorted(violators)))), + self.full_rule_text) + else: + assert not variables, ( + 'Not all internal variables were eliminated. Violators:\n' + + ',\n'.join( + '%s (aka %s)' % (v, self.synonym_log[v]) + for v in variables) + + '\nRule: %s' % self) + else: + unassigned_variables = [] + for v in variables: + if not v.startswith('x_'): + unassigned_variables.append(v) + # Remove disambiguation suffixes from variables not to confuse + # the user. + unassigned_variables = {v.split(' # disambiguated')[0] + for v in unassigned_variables} + if unassigned_variables: + raise RuleCompileException( + color.Format( + 'Found no way to assign variables: ' + '{warning}{violators}{end}. ' + 'This error might also come from injected sub-rules.', + dict(violators=', '.join(sorted(unassigned_variables)))), + self.full_rule_text) + break + + def __str__(self): + return ('%s ==> \n' + 'tables = %s,\n ' + 'vars_map = %s,\n ' + 'vars_unification = %s,\n ' + 'external_vocabulary = %s,\n ' + 'constraints = %s,\n ' + 'select = %s,\n ' + 'unnest = %s' % ( + self.this_predicate_name, + self.tables, self.vars_map, self.vars_unification, + self.external_vocabulary, + self.constraints, self.select, self.unnestings)) + + def UnificationsToConstraints(self): + for u in self.vars_unification: + if u['left'] == u['right']: + continue + self.constraints.append({ + 'call': { + 'predicate_name': '==', + 'record': { + 'field_value': [{ + 'field': 'left', + 'value': { + 'expression': u['left'] + } + }, { + 'field': 'right', + 'value': { + 'expression': u['right'] + } + }] + } + } + }) + + def AsSql(self, subquery_encoder=None, flag_values=None): + """Outputing SQL representing this structure.""" + # pylint: disable=g-long-lambda + ql = expr_translate.QL(self.VarsVocabulary(), subquery_encoder, + lambda message: + RuleCompileException(message, self.full_rule_text), + flag_values, + custom_udfs=subquery_encoder.execution.custom_udfs, + dialect=subquery_encoder.execution.dialect) + r = 'SELECT\n' + fields = [] + if not self.select: + raise RuleCompileException( + color.Format( + 'Tables with {warning}no columns{end} are not allowed in ' + 'StandardSQL, so they are not allowed in Logica.'), + self.full_rule_text) + + for k, v in self.select.items(): + if k == '*': + fields.append('%s.*' % ql.ConvertToSql(v)) + else: + fields.append('%s AS %s' % (ql.ConvertToSql(v), LogicaFieldToSqlField(k))) + r += ',\n'.join(' ' + f for f in fields) + if (self.tables or self.unnestings or + self.constraints or self.distinct_denoted): + r += '\nFROM\n' + tables = [] + for k, v in self.tables.items(): + if subquery_encoder: + # Note that we are passing external_vocabulary, not VarsVocabulary + # here. I.e. if this is a sub-query then variables of outer tables + # can be used. + sql = subquery_encoder.TranslateTable(v, self.external_vocabulary) + if not sql: + raise RuleCompileException( + color.Format( + 'Rule uses table {warning}{table}{end}, which is not ' + 'defined. External tables can not be used in ' + '{warning}\'testrun\'{end} mode. This error may come ' + 'from injected sub-rules.', + dict(table=v)), self.full_rule_text) + if sql != k: + tables.append(sql + ' AS ' + k) + else: + tables.append(sql) + self.SortUnnestings() + for element, the_list in self.unnestings: + tables.append( + 'UNNEST(%s) as %s' % (ql.ConvertToSql(the_list), + ql.ConvertToSql(element))) + if not tables: + tables.append('UNNEST(ARRAY[\'UNUSED\']) as unused_unnest') + from_str = ', '.join(tables) + # Indent the from_str. + from_str = '\n'.join(' ' + l for l in from_str.split('\n')) + r += from_str + if self.constraints: + r += '\nWHERE\n' + constraints = [] + for c in self.constraints: + constraints.append(ql.ConvertToSql(c)) + r += ' AND\n'.join(map(Indent2, constraints)) + if self.distinct_vars: + ordered_distinct_vars = [ + v for v in self.select.keys() if v in self.distinct_vars] + r += '\nGROUP BY ' + r += ', '.join(map(LogicaFieldToSqlField, ordered_distinct_vars)) + return r + + +def ExtractPredicateStructure(c, s): + """Updating RuleStructure s with a predicate call.""" + predicate = c['predicate_name'] + + if predicate in ( + '<=', '<', '>', '>=', '!=', '&&', '||', '!', 'IsNull', 'Like', + 'Constraint'): + s.constraints.append({'call': c}) + return + + table_name = s.allocator.AllocateTable(predicate) + s.tables[table_name] = predicate + for field_value in c['record']['field_value']: + assert 'field' in field_value, ('Corrupt record: %s' % c['record']) + if 'except' in field_value: + table_var = ExceptExpression.Build(table_name, field_value['except']) + else: + table_var = field_value['field'] + expr = field_value['value']['expression'] + var_name = s.allocator.AllocateVar('%s_%s' % (table_name, table_var)) + s.vars_map[table_name, table_var] = var_name + s.inv_vars_map[var_name] = (table_name, table_var) + s.vars_unification.append( + { + 'left': {'variable': {'var_name': var_name}}, + 'right': expr + }) + + +def ExtractInclusionStructure(inclusion, s): + """Updating RuleStructure s with an inclusion.""" + # Handling inclusion as a WHERE constraint. + if 'call' in inclusion['list']: + if inclusion['list']['call']['predicate_name'] == 'Container': + s.constraints.append({ + 'call': { + 'predicate_name': 'In', + 'record': { + 'field_value': [ + { + 'field': 'left', + 'value': {'expression': inclusion['element']} + }, + { + 'field': 'right', + 'value': {'expression': inclusion['list']} + } + ] + } + } + }) + return + # Handling inclusion as an UNNEST. + var_name = s.allocator.AllocateVar('unnest_`%s`' % inclusion['element']) + s.vars_map[None, var_name] = var_name + s.inv_vars_map[var_name] = (None, var_name) + s.unnestings.append([{'variable': {'var_name': var_name}}, inclusion['list']]) + s.vars_unification.append({ + 'left': inclusion['element'], + 'right': { + 'variable': { + 'var_name': var_name + } + } + }) + + +def ExtractConjunctiveStructure(conjuncts, s): + """Updates RuleStructure with the conjuncts.""" + for c in conjuncts: + if 'predicate' in c: + ExtractPredicateStructure(c['predicate'], s) + elif 'unification' in c: + if ('variable' in c['unification']['right_hand_side'] or + 'variable' in c['unification']['left_hand_side']): + s.vars_unification.append({ + 'left': c['unification']['left_hand_side'], + 'right': c['unification']['right_hand_side']}) + else: + if (c['unification']['left_hand_side'] != + c['unification']['right_hand_side']): + s.constraints.append({ + 'call': { + 'predicate_name': '==', + 'record': { + 'field_value': [ + { + 'field': 'left', + 'value': { + 'expression': + c['unification']['left_hand_side'] + } + }, + { + 'field': 'right', + 'value': { + 'expression': + c['unification']['right_hand_side'] + } + } + ] + } + } + }) + elif 'inclusion' in c: + ExtractInclusionStructure(c['inclusion'], s) + else: + assert False, 'Unsupported conjunct: %s' % c + + +def HasCombine(r): + """Whether structure involves Combine predicate.""" + if isinstance(r, dict): + member_index = sorted(r.keys()) + elif isinstance(r, list): + member_index = range(len(r)) + else: + assert False, ( + 'HasCombine should be called on list or dict. Got: %s' % str(r)) + + if isinstance(r, dict): + if 'predicate_name' in r and r['predicate_name'] == 'Combine': + return True + + for k in member_index: + if isinstance(r[k], dict) or isinstance(r[k], list): + if HasCombine(r[k]): + return True + + return False + + +def AllRecordFields(record): + result = [] + for field_value in record['field_value']: + result.append(field_value['field']) + return result + + +def InlinePredicateValuesRecursively(r, names_allocator, conjuncts): + """Replaces expression predicate calls with logica_value column.""" + if isinstance(r, dict): + member_index = sorted(r.keys()) + elif isinstance(r, list): + member_index = range(len(r)) + else: + assert False, ( + 'InlinePredicateValuesRecursively should be called on list or dict. ' + 'Got: %s' % str(r)) + + for k in member_index: + if k != 'combine': + if isinstance(r[k], dict) or isinstance(r[k], list): + InlinePredicateValuesRecursively(r[k], names_allocator, conjuncts) + + if isinstance(r, dict): + if 'call' in r: + if not names_allocator.FunctionExists(r['call']['predicate_name']): + aux_var = names_allocator.AllocateVar('inline') + r_predicate = {} + r_predicate['predicate'] = copy.deepcopy(r['call']) + r_predicate['predicate']['record']['field_value'].append({ + 'field': 'logica_value', + 'value': {'expression': {'variable': {'var_name': aux_var}}} + }) + del r['call'] + r['variable'] = {'var_name': aux_var} + conjuncts.append(r_predicate) + + +def InlinePredicateValues(rule, names_allocator): + extra_conjuncts = [] + InlinePredicateValuesRecursively(rule, names_allocator, extra_conjuncts) + if extra_conjuncts: + conjuncts = rule.get('body', {}).get('conjunction', {}).get('conjunct', []) + conjuncts.extend(extra_conjuncts) + rule['body'] = {'conjunction': {'conjunct': conjuncts}} + + +def GetTreeOfCombines(rule, tree=None): + """Get the tree structure of combines in the rule syntax subtree.""" + if not tree: + tree = {'rule': rule, 'variables': set(), 'subtrees': []} + + if isinstance(rule, list): + for v in rule: + tree = GetTreeOfCombines(v, tree) + if isinstance(rule, dict): + if 'variable' in rule: + variables = tree['variables'] + variables.add(rule['variable']['var_name']) + for k in rule: + # Variables mentioned in 'combine' expression may be resolved via tables + # of the 'combine' expression. So they are not to be included in the + # parent query. + if k != 'combine': + tree = GetTreeOfCombines(rule[k], tree) + else: + subtree = GetTreeOfCombines(rule[k]) + subtrees = tree['subtrees'] + subtrees.append(subtree) + return tree + + +def DisambiguateCombineVariables(rule, names_allocator): + """Disambiguate variables in combine expressions. + + Variables of the same name in different combine statements are actually + different. The same name becomes a problem if one combine statement is + substituted into another when unifications are processed. + + This function appends a disambiguation suffix to all variables first + mentioned in combine statements. + + Args: + rule: A rule to process. + names_allocator: An execution level allocator of variable names. + """ + def Replace(tree, outer_variables): + """Replace all variables with their disambiguated counterparts.""" + variables = tree['variables'] + introduced_variables = variables - outer_variables + all_variables = variables | outer_variables + for v in introduced_variables: + if '# disambiguated with' in v: + # This variable was already disambiguated. + # We get here, when ExtractRuleStructure is called on the combine + # expression itself. + continue + new_name = '%s # disambiguated with %s' % ( + v, names_allocator.AllocateVar('combine_dis')) + ReplaceVariable(v, {'variable': {'var_name': new_name}}, tree['rule']) + for s in tree['subtrees']: + Replace(s, all_variables) + + tree = GetTreeOfCombines(rule) + top_variables = tree['variables'] + for t in tree['subtrees']: + Replace(t, top_variables) + + +def ExtractRuleStructure(rule, names_allocator=None, external_vocabulary=None): + """Extracts RuleStructure from rule.""" + rule = copy.deepcopy(rule) + # Not disambiguating if this rule is extracting structure of the combine + # itself, as variables of this combine were already disambiguated from + # parent rule. + if rule['head']['predicate_name'] != 'Combine': + DisambiguateCombineVariables(rule, names_allocator) + s = RuleStructure(names_allocator, external_vocabulary) + InlinePredicateValues(rule, names_allocator) + s.full_rule_text = rule['full_text'] + s.this_predicate_name = rule['head']['predicate_name'] + (s.select, aggregated_vars) = HeadToSelect(rule['head']) + # Adding internal variable unification with select arguments to avoid + # confusion of user variables between injected predicates. + for k, expr in s.select.items(): + if 'variable' in expr: + s.vars_unification.append({ + 'left': expr, + 'right': {'variable': {'var_name': names_allocator.AllocateVar( + 'extract_%s_%s' % (s.this_predicate_name, k))}}}) + if 'body' in rule: + ExtractConjunctiveStructure(rule['body']['conjunction']['conjunct'], s) + + distinct_denoted = 'distinct_denoted' in rule + s.distinct_denoted = distinct_denoted + if aggregated_vars and not distinct_denoted: + raise RuleCompileException( + color.Format( + 'Aggregating predicate must be {warning}distinct{end} denoted.'), + s.full_rule_text) + if distinct_denoted: + s.distinct_vars = sorted( + list(set(s.select.keys()) - set(aggregated_vars)), key=str) + return s diff --git a/compiler/universe.py b/compiler/universe.py new file mode 100755 index 0000000..d5ce886 --- /dev/null +++ b/compiler/universe.py @@ -0,0 +1,1047 @@ +#!/usr/bin/python +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# coding=utf-8 +"""Compiler of predicates from Logica program to SQL.""" + +import collections +import copy +import re +import sys +import traceback +# Uncomment to debug. +# import pprint + +import json + +from common import color +from compiler import dialects +from compiler import expr_translate +from compiler import functors +from compiler import rule_translate +from parser_py import parse + +PredicateInfo = collections.namedtuple('PredicateInfo', + ['embeddable']) +Ground = collections.namedtuple('Ground', + ['table_name', 'overwrite']) + +xrange = range + +def FormatSql(s): return s + ';' + + +class Logica(object): + """Predicate execution accumulated data. + + * Data about DEFINE TABLE and EXPORT DATA accumulated over compilation. + * Annotations of the universe. + """ + + def __init__(self): + # TODO: Add a comment for each member. + self.defines = [] + self.export_statements = [] + self.defines_and_exports = [] + self.table_to_defined_table_map = {} + # Maps a @With'ed table to SQL implementing it. + self.table_to_with_sql_map = {} + # Maps a table T to a list of @With'ed tables for T's query. + self.table_to_with_dependencies = collections.defaultdict(list) + # Maps a grounded table T to a list of With'ed tables which were compiled + # for T. With tables need to be re-compiled for each grounded tables so + # that Ground dependencies of the With'ed tables are added. + self.with_compilation_done_for_parent = collections.defaultdict(set) + self.dependency_edges = [] + self.table_to_export_map = {} + self.main_predicate_sql = None + self.preamble = '' + # Auxiliary structure for building dependency graph. At each moment of + # execution this is an inverse path from the final predicate to the exported + # predicate that is being built at the moment. + self.workflow_predicates_stack = [] + self.flags_comment = '' + self.compiling_udf = False + self.annotations = None + self.custom_udfs = None + self.custom_udf_definitions = None + self.main_predicate = None + self.used_predicates = [] + self.dependencies_of = None + + def AddDefine(self, define): + self.defines.append(define) + + def PredicateSpecificPreamble(self, predicate_name): + needed_udfs = list(sorted([ + self.custom_udf_definitions[f] + for f in self.dependencies_of[predicate_name] + if f in self.custom_udf_definitions])) + return '\n'.join(needed_udfs) + + def NeededUdfDefinitions(self): + return list(sorted([self.custom_udf_definitions[f] + for f in self.used_predicates if f in self.custom_udf_definitions])) + + def FullPreamble(self): + return '\n'.join([self.flags_comment] + [self.preamble] + self.defines) + + def With(self, predicate_name): + if self.compiling_udf: + return False + return self.annotations.With(predicate_name) + + +def Indent2(s): + return '\n'.join(' ' + l for l in s.split('\n')) + + +def AnnotationError(message, annotation_value): + raise rule_translate.RuleCompileException( + message, annotation_value['__rule_text']) + + +class Annotations(object): + """Utility to parse and retrieve predicate annotations.""" + ANNOTATING_PREDICATES = [ + '@Limit', '@OrderBy', '@Ground', '@Flag', '@DefineFlag', + '@NoInject', '@Make', '@CompileAsTvf', '@With', '@NoWith', + '@CompileAsUdf', '@ResetFlagValue', '@Dataset', '@AttachDatabase', + '@Engine' + ] + + def __init__(self, rules, user_flags): + # Extracting DefineFlags first, so that we can use flags in @Ground + # annotations. + self.annotations = self.ExtractAnnotations( + rules, restrict_to=['@DefineFlag', '@ResetFlagValue']) + self.user_flags = user_flags + self.flag_values = self.BuildFlagValues() + # [AnnotationName][PredicateName] -> List containing the annotation. + self.annotations.update( + **self.ExtractAnnotations(rules, flag_values=self.flag_values)) + self.CheckAnnotatedObjects(rules) + + def Preamble(self): + """Query preamble based on annotations and flags.""" + preamble = '' + attach_database_statements = self.AttachDatabaseStatements() + if attach_database_statements: + preamble += attach_database_statements + '\n\n' + if self.Engine() == 'psql': + preamble += ( + '-- Initializing PostgreSQL environment.\n' + 'set client_min_messages to warning;\n' + 'drop type if exists logica_arrow;\n' + 'create type logica_arrow as (arg decimal, value decimal);\n' + 'create schema if not exists logica_test;\n\n') + return preamble + + def BuildFlagValues(self): + """Building values by overriding defaults with user flags.""" + default_values = {} + for flag, a in self.annotations['@DefineFlag'].items(): + default_values[flag] = a.get('1', '${%s}' % flag) + programmatic_flag_values = {} + for flag, a in self.annotations['@ResetFlagValue'].items(): + programmatic_flag_values[flag] = a.get('1', '${%s}' % flag) + + if not set(self.user_flags) <= set(default_values): + raise rule_translate.RuleCompileException( + 'Undefined flags used: %s' % list( + set(self.user_flags) - set(default_values)), + str(set(self.user_flags) - set(default_values))) + flag_values = default_values + flag_values.update(**programmatic_flag_values) + flag_values.update(**self.user_flags) + return flag_values + + def NoInject(self, predicate_name): + return predicate_name in self.annotations['@NoInject'] + + def OkInjection(self, predicate_name): + # Current annotations make predicate non-injectible. This doesn't have + # to be the case for an arbitrary annotation. + if (self.OrderBy(predicate_name) or self.LimitOf(predicate_name) or + self.Ground(predicate_name) or self.NoInject(predicate_name) or + self.ForceWith(predicate_name)): + return False + return True + + def AttachedDatabases(self): + result = {} + for k, v in self.annotations['@AttachDatabase'].items(): + if '1' not in v: + print('>>', v) + AnnotationError('@AttachDatabase must have a single argument.', + v) + result[k] = v['1'] + return result + + def AttachDatabaseStatements(self): + return '\n'.join( + 'ATTACH DATABASE \'%s\' AS %s;' % (v, k) + for k, v in self.AttachedDatabases().items()) + + def CompileAsUdf(self, predicate_name): + result = predicate_name in self.annotations['@CompileAsUdf'] + if result and self.TvfSignature(predicate_name): + raise rule_translate.RuleCompileException( + 'A predicate can not be UDF and TVF at the ' + 'same time %s.' % predicate_name, + 'Predicate: ' + predicate_name) + return result + + def TvfSignature(self, predicate_name): + """Table valued function signature of a predicate.""" + if predicate_name not in self.annotations['@CompileAsTvf']: + return None + annotation = self.annotations['@CompileAsTvf'][predicate_name]['1'] + arguments = [x['predicate_name'] for x in annotation] + signature = ', '.join('%s ANY TABLE' % a for a in arguments) + return 'CREATE TEMP TABLE FUNCTION %s(%s) AS ' % (predicate_name, + signature) + + def LimitOf(self, predicate_name): + """Limit of the query corresponding to the predicate as per annotation.""" + if predicate_name not in self.annotations['@Limit']: + return None + annotation = FieldValuesAsList(self.annotations['@Limit'][predicate_name]) + if (len(annotation) != 1 or + not isinstance(annotation[0], int)): + raise rule_translate.RuleCompileException( + 'Bad limit specification for predicate %s.' % predicate_name, + 'Predicate: ' + predicate_name) + return annotation[0] + + def OrderBy(self, predicate_name): + if predicate_name not in self.annotations['@OrderBy']: + return None + return FieldValuesAsList(self.annotations['@OrderBy'][predicate_name]) + + def Dataset(self): + return self.ExtractSingleton('@Dataset', 'logica_test') + + def Engine(self): + engine = self.ExtractSingleton('@Engine', 'bigquery') + if engine not in dialects.DIALECTS: + AnnotationError('Unrecognized engine: %s' % engine, + self.annotations['@Engine'][engine]) + return engine + + def ExtractSingleton(self, annotation_name, default_value): + if not self.annotations[annotation_name]: + return default_value + results = list(self.annotations[annotation_name].keys()) + if len(results) > 1: + raise rule_translate.RuleCompileException( + 'Single %s must be provided. Provided: %s' % ( + annotation_name, results), + self.annotations[annotation_name][results[0]]['__rule_text']) + return results[0] + + def Ground(self, predicate_name): + """Returns Ground (physical file) associated with the predicate.""" + if predicate_name not in self.annotations['@Ground']: + return None + annotation = self.annotations['@Ground'][predicate_name] + table_name = annotation.get('1', self.Dataset() + '.' + predicate_name) + overwrite = annotation.get('overwrite', True) + return Ground(table_name=table_name, overwrite=overwrite) + + def ForceWith(self, predicate_name): + """Return true if the predicate has been explicitly marked @With.""" + return predicate_name in self.annotations['@With'] + + def ForceNoWith(self, predicate_name): + """Return true if the predicate has been explicitly marked @NoWith.""" + return predicate_name in self.annotations['@NoWith'] + + def With(self, predicate_name): + """Return whether this predicate should be compiled to a WITH-table. + + This only applies if the predicate is not inlined earlier in the flow. + """ + is_with = self.ForceWith(predicate_name) + is_nowith = self.ForceNoWith(predicate_name) + if is_with and is_nowith: + raise rule_translate.RuleCompileException( + color.Format('Predicate is annotated both with @With and @NoWith.'), + 'Predicate: %s' % predicate_name) + if is_with: + return True + if is_nowith or self.Ground(predicate_name): + return False + # TODO: return false for predicates that will be injected. + return True + + def LimitClause(self, predicate_name): + limit = self.LimitOf(predicate_name) + if limit: + return ' LIMIT %d' % limit + else: + return '' + + def OrderByClause(self, predicate_name): + """Returns ORDER BY clause.""" + order_by = self.OrderBy(predicate_name) + result = [] + if order_by: + for i in range(len(order_by) - 1): + if order_by[i+1] != 'DESC': + result.append(order_by[i] + ',') + else: + result.append(order_by[i]) + result.append(order_by[-1]) + return ' ORDER BY ' + ' '.join(result) + else: + return '' + + def CheckAnnotatedObjects(self, rules): + """Verify that annotations are applied to existing predicates.""" + all_predicates = {rule['head']['predicate_name'] for rule in rules} | set( + self.annotations['@Ground']) | set(self.annotations['@Make']) + for annotation_name in self.annotations: + if annotation_name in {'@Limit', '@OrderBy', + '@NoInject', '@CompileAsTvf', '@With', '@NoWith', + '@CompileAsUdf'}: + for annotated_predicate in self.annotations[annotation_name]: + if annotated_predicate not in all_predicates: + rule_text = self.annotations[annotation_name][annotated_predicate][ + '__rule_text'] + RaiseCompilerError( + 'Annotation %s must be applied to an existing predicate, but ' + 'it was applied to a non-existing predicate %s.' % + (color.Warn(annotation_name), color.Warn(annotated_predicate)), + rule_text) + + @classmethod + def ExtractAnnotations(cls, rules, restrict_to=None, flag_values=None): + """Extracting annotations from the rules.""" + result = {p: collections.OrderedDict() for p in cls.ANNOTATING_PREDICATES} + for rule in rules: + rule_predicate = rule['head']['predicate_name'] + if restrict_to and rule_predicate not in restrict_to: + continue + if (rule_predicate[0] == '@' and + rule_predicate not in cls.ANNOTATING_PREDICATES): + raise rule_translate.RuleCompileException( + 'Only {0} and {1} special predicates are allowed.'.format( + ', '.join(cls.ANNOTATING_PREDICATES[:-1]), + cls.ANNOTATING_PREDICATES[-1]), + rule['full_text']) + if rule_predicate in cls.ANNOTATING_PREDICATES: + rule_text = rule['full_text'] + # pylint: disable=cell-var-from-loop + def ThrowException(*args, **xargs): + _ = args + _ = xargs + if rule_predicate == '@Make': + # pylint: disable=raising-format-tuple + raise rule_translate.RuleCompileException( + 'Incorrect syntax for functor call. ' + 'Functor call to be made as\n' + ' R := F(A: V, ...)\n' + 'or\n' + ' @Make(R, F, {A: V, ...})\n' + 'Where R, F, A\'s and V\'s are all ' + 'predicate names.', + rule_text) + else: + raise rule_translate.RuleCompileException( + 'Can not understand annotation.', + rule_text) + + class Thrower(object): + + def __contains__(self, key): + if rule_predicate == '@Make': + ThrowException() + return + raise rule_translate.RuleCompileException( + 'Annotation may not use variables, but this one uses ' + 'variable %s.' % ( + color.Warn(key)), + rule_text) + flag_values = flag_values or Thrower() + ql = expr_translate.QL(Thrower(), ThrowException, ThrowException, + flag_values) + ql.convert_to_json = True + + annotation = rule['head']['predicate_name'] + field_values_json_str = ql.ConvertToSql( + {'record': rule['head']['record']}) + try: + field_values = json.loads(field_values_json_str) + except: + raise rule_translate.RuleCompileException( + 'Could not understand arguments of annotation.', + rule['full_text']) + if ('0' in field_values and + isinstance(field_values['0'], dict) and + 'predicate_name' in field_values['0']): + subject = field_values['0']['predicate_name'] + else: + subject = field_values['0'] + del field_values['0'] + if rule_predicate in ['@OrderBy', '@Limit', '@NoInject']: + field_values_list = FieldValuesAsList(field_values) + if field_values_list is None: + raise rule_translate.RuleCompileException( + '@OrderBy and @Limit may only have positional ' + 'arguments.', rule['full_text']) + if rule_predicate == '@Limit' and len(field_values_list) != 1: + raise rule_translate.RuleCompileException( + 'Annotation @Limit must have exactly two arguments: ' + 'predicate and limit.', rule['full_text']) + updated_annotation = result.get(annotation, {}) + field_values['__rule_text'] = rule['full_text'] + if subject in updated_annotation: + raise rule_translate.RuleCompileException( + color.Format( + '{annotation} annotates {warning}{subject}{end} more ' + 'than once: {before}, {after}', + dict(annotation=annotation, + subject=subject, + before=updated_annotation[subject]['__rule_text'], + after=field_values['__rule_text'])), rule['full_text']) + updated_annotation[subject] = field_values + result[annotation] = updated_annotation + return result + + +class LogicaProgram(object): + """Representing a Logica program. + + Can produce SQL for predicates. + """ + + def __init__(self, rules, table_aliases=None, user_flags=None): + """Initializes the program. + + Args: + rules: A list of dictionary representations of parsed Logica rules. + table_aliases: A map from an undefined Logica predicate name to a + BigQuery table name. This table will be used in place of predicate. + user_flags: Dictionary of user specified flags. + """ + # TODO: Should allocator be a member of Logica? + self.preparsed_rules = rules + self.rules = [] + self.defined_predicates = set() + self.dollar_params = list(self.ExtractDollarParams(rules)) + self.table_aliases = table_aliases or {} + self.execution = None + self.user_flags = user_flags or {} + self.annotations = Annotations(rules, self.user_flags) + self.flag_values = self.annotations.flag_values + # Dictionary custom_udfs maps function name to a format string to use + # in queries. + self.custom_udfs = collections.OrderedDict() + # Dictionary custom_udf_definitions maps function name to SQL defining the + # function. + self.custom_udf_definitions = collections.OrderedDict() + if not set(self.dollar_params) <= set(self.flag_values): + raise rule_translate.RuleCompileException( + 'Parameters %s are undefined.' % ( + list(set(self.dollar_params) - set(self.flag_values))), + str(list(set(self.dollar_params) - set(self.flag_values)))) + self.functors = None + extended_rules = self.RunMakes(rules) # Populates self.functors. + for rule in extended_rules: + predicate_name = rule['head']['predicate_name'] + self.defined_predicates.add(predicate_name) + self.rules.append((predicate_name, rule)) + # We need to recompute annotations, because 'Make' created more rules and + # annotations. + self.annotations = Annotations(extended_rules, self.user_flags) + # Build udfs, populating custom_udfs and custom_udf_definitions. + self.BuildUdfs() + # Function compilation may have added irrelevant defines: + self.execution = None + + if False: + self.RunTypechecker() + + def BuildUdfs(self): + """Build UDF definitions.""" + self.InitializeExecution('@FunctionsCheck') + self.execution.compiling_udf = True + remove_udfs = False + for f in self.annotations.annotations['@CompileAsUdf']: + if not remove_udfs: + self.custom_udfs[f] = 'DUMMY()' # For dummy function definitions. + # First time we create proper function definitions, when we use them. + # TODO: If we extract signature building then we don't have to + # compile twice. + for _ in range(2): + for f in self.annotations.annotations['@CompileAsUdf']: + application, sql = self.FunctionSql(f, internal_mode=True) + if not remove_udfs: + self.custom_udfs[f] = application + self.custom_udf_definitions[f] = sql + + def NewNamesAllocator(self): + return rule_translate.NamesAllocator(custom_udfs=self.custom_udfs) + + def RunTypechecker(self): + """Checks the program for type-correctness. + + Raises: + TypeInferenceError if there are any type errors. + """ + inference.CheckTypes(self.rules) + + def RunMakes(self, rules): + """Runs @Make instructions.""" + if '@Make' not in self.annotations.annotations: + return rules + self.functors = functors.Functors(rules) + self.functors.MakeAll(list(self.annotations.annotations['@Make'].items())) + return self.functors.extended_rules + + @classmethod + def ExtractDollarParamsFromString(cls, s): + params = re.findall(r'[$][{](.*?)[}]', s) + return set(p for p in params # Built-in, we shouldn't override them. + if not (p.startswith('YYYY') or p == 'MM' or p == 'DD')) + + def ExtractDollarParams(self, r): + """Returns a set of dollar params, like ${date}.""" + # TODO: Refactor the tree scanning into a helper class. + if isinstance(r, dict): + member_index = sorted(r.keys()) + elif isinstance(r, list): + member_index = range(len(r)) + else: + if isinstance(r, str): + return self.ExtractDollarParamsFromString(r) + return set() + + result = set() + for k in member_index: + result |= self.ExtractDollarParams(r[k]) + return result + + def __str__(self): + return str(self.preparsed_rules) + + def GetPredicateRules(self, predicate_name): + for (n, r) in self.rules: + if n == predicate_name: + yield r + + def PredicateSql(self, name, allocator=None, external_vocabulary=None): + """Producing SQL for a predicate.""" + # Load proto if necessary. + rules = list(self.GetPredicateRules(name)) + if len(rules) == 1: + [rule] = rules + return ( + self.SingleRuleSql(rule, allocator, external_vocabulary) + + self.annotations.OrderByClause(name) + + self.annotations.LimitClause(name)) + elif len(rules) > 1: + rules_sql = [] + for rule in rules: + if 'distinct_denoted' in rule: + raise rule_translate.RuleCompileException( + color.Format( + 'For distinct denoted predicates multiple rules are not ' + 'currently supported. Consider taking ' + '{warning}union of bodies manually{end}, if that was what ' + 'you intended.'), rule['full_text']) + rules_sql.append('\n%s\n' % + Indent2( + self.SingleRuleSql( + rule, allocator, external_vocabulary))) + rules_sql = ['\n'.join(' ' + l for l in r.split('\n')) + for r in rules_sql] + return 'SELECT * FROM (\n%s\n) AS UNUSED_TABLE_NAME %s %s' % ( + ' UNION ALL\n'.join(rules_sql), + self.annotations.OrderByClause(name), + self.annotations.LimitClause(name)) + else: + raise rule_translate.RuleCompileException( + color.Format( + 'No rules are defining {warning}{name}{end}, but compilation ' + 'was requested.', dict(name=name)), + r' ¯\_(ツ)_/¯') + + @classmethod + def TurnPositionalIntoNamed(self, select): + """Auxiliary method transforming RuleStructure select dict. + + Args: + select: RuleStructure select dictionary, i.e. a map from variable name + to Logica expression of a value dictionary. + + Returns: + newly generated select dict, where positional arguments where replaced + with the names of variables that were standing there. + """ + new_select = collections.OrderedDict() + # Make UDF use positional arguments as well. + for v in select: + if isinstance(v, int): + # Check for error. + new_select[select[v]['variable']['var_name']] = select[v] + else: + new_select[v] = select[v] + return new_select + + def FunctionSql(self, name, allocator=None, internal_mode=False): + """Print formatted SQL function creation statement.""" + # TODO: Refactor this into FunctionSqlInternal and FunctionSql. + if not allocator: + allocator = self.NewNamesAllocator() + + rules = list(self.GetPredicateRules(name)) + + # Check that the predicate is defined via a single rule. + if not rules: + raise rule_translate.RuleCompileException( + color.Format( + 'No rules are defining {warning}{name}{end}, but compilation ' + 'was requested.', dict(name=name)), + r' ¯\_(ツ)_/¯') + elif len(rules) > 1: + raise rule_translate.RuleCompileException( + color.Format( + 'Predicate {warning}{name}{end} is defined by more than 1 rule ' + 'and can not be compiled into a function.', dict(name=name)), + '\n\n'.join(r['full_text'] for r in rules)) + [rule] = rules + + # Extract structure and assert that it is isomorphic to a function. + s = rule_translate.ExtractRuleStructure(rule, + external_vocabulary=None, + names_allocator=allocator) + + udf_variables = [v if isinstance(v, str) else 'col%d' % v + for v in s.select if v != 'logica_value'] + s.select = self.TurnPositionalIntoNamed(s.select) + + variables = [v for v in s.select if v != 'logica_value'] + if 0 in variables: + raise rule_translate.RuleCompileException( + color.Format( + 'Predicate {warning}{name}{end} must have all aruments named for ' + 'compilation as a function.', + dict(name=name) + ), rule['full_text']) + for v in variables: + if ('variable' not in s.select[v] or + s.select[v]['variable']['var_name'] != v): + raise rule_translate.RuleCompileException( + color.Format( + 'Predicate {warning}{name}{end} must not rename arguments ' + 'for compilation as a function.', + dict(name=name) + ), rule['full_text']) + + vocabulary = {v: v for v in variables} + s.external_vocabulary = vocabulary + self.RunInjections(s, allocator) + s.ElliminateInternalVariables(assert_full_ellimination=True) + s.UnificationsToConstraints() + sql = s.AsSql(subquery_encoder=self.MakeSubqueryTranslator(allocator)) + if s.constraints or s.unnestings or s.tables: + raise rule_translate.RuleCompileException( + color.Format( + 'Predicate {warning}{name}{end} is not a simple function, but ' + 'compilation as function was requested. Full SQL:\n{sql}', + dict(name=name, sql=sql) + ), rule['full_text']) + if 'logica_value' not in s.select: + raise rule_translate.RuleCompileException( + color.Format( + 'Predicate {warning}{name}{end} does not have a value, but ' + 'compilation as function was requested. Full SQL:\n%s' % + sql + ), rule['full_text']) + + # pylint: disable=g-long-lambda + # Compile the function! + ql = expr_translate.QL(vocabulary, + self.MakeSubqueryTranslator(allocator), + lambda message: + rule_translate.RuleCompileException( + message, rule['full_text']), + self.flag_values, + custom_udfs=self.custom_udfs, + dialect=self.execution.dialect) + value_sql = ql.ConvertToSql(s.select['logica_value']) + + sql = 'CREATE TEMP FUNCTION {name}({signature}) AS ({value})'.format( + name=name, + signature=', '.join('%s ANY TYPE' % v for v in variables), + value=value_sql) + + sql = FormatSql(sql) + + if internal_mode: + return ('%s(%s)' % (name, ', '.join('{%s}' % v for v in udf_variables)), + sql) + + return sql + + def InitializeExecution(self, main_predicate): + """Initialize self.execution.""" + self.execution = Logica() + self.execution.workflow_predicates_stack.append(main_predicate) + self.execution.preamble = self.annotations.Preamble() + self.execution.annotations = self.annotations + self.execution.custom_udfs = self.custom_udfs + self.execution.custom_udf_definitions = self.custom_udf_definitions + self.execution.main_predicate = main_predicate + self.execution.used_predicates = self.functors.args_of.get(main_predicate, + []) + self.execution.dependencies_of = self.functors.args_of + self.execution.dialect = dialects.Get(self.annotations.Engine()) + + def FormattedPredicateSql(self, name, allocator=None): + """Printing top-level formatted SQL statement with defines and exports.""" + self.InitializeExecution(name) + if self.flag_values and False: # TODO: Control flag printing. + flags_str_lines = ['# Logica flags:'] + for flag, value in sorted(self.flag_values.items()): + flags_str_lines.append('# %s = %s' % (flag, value.encode('utf-8'))) + self.execution.flags_comment = '\n'.join(flags_str_lines) + '\n\n' + + if self.annotations.CompileAsUdf(name): + self.execution.compiling_udf = True + sql = self.FunctionSql(name, allocator) + else: + sql = self.PredicateSql(name, allocator) + + assert self.execution.workflow_predicates_stack == [name], ( + 'Logica internal error: unexpected workflow stack: %s' % + self.execution.workflow_predicates_stack) + self.execution.main_predicate_sql = sql + + # Wrap query in with + with_signature = self.GenerateWithClauses(name) + if with_signature: + sql = '{}\n{}'.format(with_signature, sql) + self.execution.table_to_export_map[name] = sql + defines_and_exports = self.execution.preamble + udf_definitions = self.execution.NeededUdfDefinitions() + if udf_definitions: + defines_and_exports += '\n\n'.join(udf_definitions) + defines_and_exports += '\n\n' + + if self.execution.defines_and_exports: + defines_and_exports += '\n\n'.join(self.execution.defines_and_exports) + defines_and_exports += '\n\n' + + sql = self.UseFlagsAsParameters(sql) # To avoid formatting errors. + + # Append TVF signature. + tvf_signature = self.annotations.TvfSignature(name) + if tvf_signature: + sql = tvf_signature + '\n' + sql + + formatted_sql = ( + self.execution.flags_comment + + defines_and_exports + + FormatSql(sql)) + if True: + for k, v in self.execution.table_to_export_map.items(): + self.execution.table_to_export_map[k] = self.UseFlagsAsParameters(v) + for i, d in enumerate(self.execution.defines): + self.execution.defines[i] = self.UseFlagsAsParameters(d) + self.execution.flags_comment = self.UseFlagsAsParameters( + self.execution.flags_comment) + return self.UseFlagsAsParameters(formatted_sql) + else: + return formatted_sql + + def UseFlagsAsParameters(self, sql): + """Running flag substitution in a loop to the fixed point.""" + # We do it in a loop to deal with flags that refer to other flags. + prev_sql = '' + num_subs = 0 + while sql != prev_sql: + num_subs += 1 + prev_sql = sql + if num_subs > 100: + raise rule_translate.RuleCompileException( + 'You seem to have recursive flags. It is disallowed.', + 'Flags:\n' + + '\n'.join('--{0}={1}'.format(*i) + for i in self.flag_values.items())) + # Do the substitution! + for flag, value in self.flag_values.items(): + sql = sql.replace('${%s}' % flag, value) + return sql + + def RunInjections(self, s, allocator): + iterations = 0 + while True: + iterations += 1 + if iterations > sys.getrecursionlimit(): + raise rule_translate.RuleCompileException( + RecursionError(), + s.full_rule_text) + + new_tables = collections.OrderedDict() + for table_name_rsql, table_predicate_rsql in s.tables.items(): + rules = list(self.GetPredicateRules(table_predicate_rsql)) + if (len(rules) == 1 and + ('distinct_denoted' not in rules[0]) and + self.annotations.OkInjection(table_predicate_rsql)): + [r] = rules + rs = rule_translate.ExtractRuleStructure( + r, allocator, None) + rs.ElliminateInternalVariables(assert_full_ellimination=False) + new_tables.update(rs.tables) + InjectStructure(s, rs) + + new_vars_map = {} + new_inv_vars_map = {} + for (table_name, table_var), clause_var in s.vars_map.items(): + if table_name != table_name_rsql: + new_vars_map[table_name, table_var] = clause_var + new_inv_vars_map[clause_var] = (table_name, table_var) + else: + if table_var not in rs.select: + if '*' in rs.select: + subscript = {'literal': {'the_symbol': {'symbol': table_var}}} + s.vars_unification.append({ + 'left': { + 'variable': { + 'var_name': clause_var + } + }, + 'right': { + 'subscript': { + 'subscript': subscript, + 'record': rs.select['*'] + } + } + }) + else: + extra_hint = '' if table_var != '*' else ( + ' Are you using .. for injectible predicate? ' + 'Please list the fields that you extract explicitly. ' + 'Tracking bug: b/131759583.') + raise rule_translate.RuleCompileException( + color.Format( + 'Predicate {warning}{table_predicate_rsql}{end} ' + 'does not have an argument ' + '{warning}{table_var}{end}, but ' + 'this rule tries to access it. {extra_hint}', + dict(table_predicate_rsql=table_predicate_rsql, + table_var=table_var, + extra_hint=extra_hint)), + s.full_rule_text) + else: + s.vars_unification.append({ + 'left': {'variable': {'var_name': clause_var}}, + 'right': rs.select[table_var] + }) + s.vars_map = new_vars_map + s.inv_vars_map = new_inv_vars_map + else: + new_tables[table_name_rsql] = table_predicate_rsql + if s.tables == new_tables: + break + s.tables = new_tables + + def SingleRuleSql(self, rule, + allocator=None, external_vocabulary=None): + """Producing SQL for a given rule in the program.""" + allocator = allocator or self.NewNamesAllocator() + r = rule + s = rule_translate.ExtractRuleStructure( + r, allocator, external_vocabulary) + + s.ElliminateInternalVariables(assert_full_ellimination=False) + + self.RunInjections(s, allocator) + s.ElliminateInternalVariables(assert_full_ellimination=True) + s.UnificationsToConstraints() + try: + sql = s.AsSql(self.MakeSubqueryTranslator(allocator), self.flag_values) + except RuntimeError as runtime_error: + if (str(runtime_error).startswith('maximum recursion')): + raise rule_translate.RuleCompileException( + RecursionError(), + s.full_rule_text) + else: + raise runtime_error + + return sql + + def GenerateWithClauses(self, predicate_name): + """Generate the WITH ... prefix for queries that use it.""" + dependencies = self.execution.table_to_with_dependencies[predicate_name] + + if not dependencies: + return None + + with_bodies = [] + for dependency in dependencies: + table_name = self.execution.table_to_defined_table_map[dependency] + sql = self.execution.table_to_with_sql_map[table_name] + with_bodies.append('{} AS ({})'.format(table_name, sql)) + + return 'WITH {}'.format(',\n'.join(with_bodies)) + + def MakeSubqueryTranslator(self, allocator): + return SubqueryTranslator(self, allocator, self.execution) + + +class SubqueryTranslator(object): + """Converter of tables and rules in a context of a universe.""" + + def __init__(self, program, allocator, execution): + self.program = program + self.allocator = allocator + self.execution = execution + + def TranslateTableAttachedToFile(self, table, ground, external_vocabulary): + """Translates file-attached table. Appends exports and defines.""" + self.execution.dependency_edges.append(( + table, + self.execution.workflow_predicates_stack[-1])) + if table in self.execution.table_to_defined_table_map: + return self.execution.table_to_defined_table_map[table] + table_name = ground.table_name + #self.allocator.AllocateTable(hint_for_user=table) + self.execution.table_to_defined_table_map[table] = table_name + define_statement = '-- Interacting with table %s' % table_name + self.execution.AddDefine(define_statement) + export_statement = None + if table in self.program.defined_predicates: + self.execution.workflow_predicates_stack.append(table) + dependency_sql = self.program.PredicateSql( + table, self.allocator, external_vocabulary) + + # Wrap query in with + with_signature = self.program.GenerateWithClauses(table) + if with_signature: + dependency_sql = '{}\n{}'.format(with_signature, dependency_sql) + + dependency_sql = self.program.UseFlagsAsParameters(dependency_sql) + self.execution.workflow_predicates_stack.pop() + maybe_drop_table = ( + 'DROP TABLE IF EXISTS %s;\n' % ground.table_name + if ground.overwrite else '') + export_statement = ( + maybe_drop_table + + 'CREATE TABLE {name} AS {dependency_sql}'.format( + name=ground.table_name, + dependency_sql=FormatSql(dependency_sql))) + + export_statement = self.program.UseFlagsAsParameters(export_statement) + # It's cheap to store a string multiple times in Python, as it's stored + # via a pointer. + self.execution.table_to_export_map[table] = export_statement + self.execution.export_statements.append(export_statement) + if export_statement: + self.execution.defines_and_exports.append(export_statement) + self.execution.defines_and_exports.append(define_statement) + return table_name + + def TranslateWithedTable(self, table): + """Translates table that should be defined in a WITH clause.""" + parent_table = self.execution.workflow_predicates_stack[-1] + if table not in self.execution.table_to_defined_table_map: + table_name = self.allocator.AllocateTable(hint_for_user=table) + self.execution.table_to_defined_table_map[table] = table_name + # We don't pass external vocabulary; named predicates should not have + # free terms. + implementation = self.program.PredicateSql(table, self.allocator) + self.execution.table_to_with_sql_map[table_name] = implementation + else: + # Calling predicate SQL to add the required ground dependencies. + if table not in self.execution.with_compilation_done_for_parent[ + parent_table]: + _ = self.program.PredicateSql(table, self.allocator) + self.execution.with_compilation_done_for_parent[ + parent_table].add(table) + + # Adding dependencies at the end means we add the deepest dependencies + # first, which ensures our WITH clause is ordered correctly. + # Note that even if table is already defined, we need to add a dependency + # from parent_table; table may have been defined from a different parent + # previously. + if table not in self.execution.table_to_with_dependencies[parent_table]: + self.execution.table_to_with_dependencies[parent_table].append(table) + return self.execution.table_to_defined_table_map[table] + + @classmethod + def UnquoteParenthesised(cls, table): + """Enable direct usage of SQL strings as table names.""" + if len(table) > 4 and table[:2] == '`(' and table[-2:] == ')`': + return table[2:-2] + return table + + def TranslateTable(self, table, external_vocabulary): + """Translating table to an SQL string in the FROM cause.""" + if table in self.program.table_aliases: + return self.program.table_aliases[table] + ground = self.program.annotations.Ground(table) + if ground: + return self.TranslateTableAttachedToFile( + table, ground, external_vocabulary) + if table in self.program.defined_predicates: + if self.program.execution.With(table): + return self.TranslateWithedTable(table) + return '(%s)' % self.program.PredicateSql( + table, self.allocator, external_vocabulary) + predicate_sql = Indent2(predicate_sql) + return '(\n%s\n)' % predicate_sql + return self.UnquoteParenthesised(table) + + def TranslateRule(self, rule, external_vocabulary): + return self.program.SingleRuleSql(rule, self.allocator, external_vocabulary) + + +def InjectStructure(target, source): + """Injecting source RuleStructure into target.""" + target.vars_map.update(source.vars_map) + target.inv_vars_map.update(source.inv_vars_map) + target.vars_unification.extend(source.vars_unification) + target.unnestings.extend(source.unnestings) + target.constraints.extend(source.constraints) + + +def RecursionError(): + return color.Format( + 'The rule appears to use recursion. ' + '{warning}Recursion{end} is neither supported by ' + 'Logica nor by StandardSQL.') + + +def RaiseCompilerError(message, context): + raise rule_translate.RuleCompileException(message, context) + + +def FieldValuesAsList(field_values): + field_values = copy.deepcopy(field_values) + if '__rule_text' in field_values: + del field_values['__rule_text'] + field_values_list = [] + for i in range(len(field_values)): + i = str(i + 1) + if i not in field_values: + return None # Error! + field_values_list.append(field_values[i]) + return field_values_list + diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 0000000..b26fc61 --- /dev/null +++ b/examples/README.md @@ -0,0 +1,17 @@ + + +_Stay tuned. Examples will be checked-in shortly._ diff --git a/integration_tests/analytic_test.l b/integration_tests/analytic_test.l new file mode 100755 index 0000000..8d8b14a --- /dev/null +++ b/integration_tests/analytic_test.l @@ -0,0 +1,49 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Testing analytic functions. + +Ten() = x :- x in Range(10); + +Data("one_five", x, y) :- + x == Ten(), + y == ToInt64(x == 1 || x == 5); + +Data("three_four_nine", x, y) :- + x == Ten(), + y == ToInt64(x == 3 || x == 4 || x == 9); + +@OrderBy(DataSum, "col0", "col1"); +DataSum(n, x, y) Aggregate= CumulativeSum(y, [n], [n, x]) :- + Data(n, x, y); + +@OrderBy(DataWindowedSum, "col0", "col1"); +DataWindowedSum(n, x, y) Aggregate= WindowSum(y, [n], [n, x], 3) :- + Data(n, x, y); + +@OrderBy(NonzeroMax, "col0", "col1"); +NonzeroMax(n, x, y) Aggregate= WindowMax(x * y, [n], [x], 3) :- Data(n, x, y); + +Test(DataSum, n, x, y) = DataSum(n, x, y); +Test(DataWindowedSum, n, x, y) = DataWindowedSum(n, x, y); +Test(NonzeroMax, n, x, y) = NonzeroMax(n, x, y); + +@OrderBy(ReadableTest, "test_name", "customer", "x"); +ReadableTest(test_name: p.predicate_name, + customer:, + x:, + y:, + aggregate:) :- Test(p, customer, x, y) == aggregate; + diff --git a/integration_tests/analytic_test.txt b/integration_tests/analytic_test.txt new file mode 100755 index 0000000..c0184ce --- /dev/null +++ b/integration_tests/analytic_test.txt @@ -0,0 +1,64 @@ ++-----------------+-----------------+---+---+-----------+ +| test_name | customer | x | y | aggregate | ++-----------------+-----------------+---+---+-----------+ +| DataSum | one_five | 0 | 0 | 0 | +| DataSum | one_five | 1 | 1 | 1 | +| DataSum | one_five | 2 | 0 | 1 | +| DataSum | one_five | 3 | 0 | 1 | +| DataSum | one_five | 4 | 0 | 1 | +| DataSum | one_five | 5 | 1 | 2 | +| DataSum | one_five | 6 | 0 | 2 | +| DataSum | one_five | 7 | 0 | 2 | +| DataSum | one_five | 8 | 0 | 2 | +| DataSum | one_five | 9 | 0 | 2 | +| DataSum | three_four_nine | 0 | 0 | 0 | +| DataSum | three_four_nine | 1 | 0 | 0 | +| DataSum | three_four_nine | 2 | 0 | 0 | +| DataSum | three_four_nine | 3 | 1 | 1 | +| DataSum | three_four_nine | 4 | 1 | 2 | +| DataSum | three_four_nine | 5 | 0 | 2 | +| DataSum | three_four_nine | 6 | 0 | 2 | +| DataSum | three_four_nine | 7 | 0 | 2 | +| DataSum | three_four_nine | 8 | 0 | 2 | +| DataSum | three_four_nine | 9 | 1 | 3 | +| DataWindowedSum | one_five | 0 | 0 | 0 | +| DataWindowedSum | one_five | 1 | 1 | 1 | +| DataWindowedSum | one_five | 2 | 0 | 1 | +| DataWindowedSum | one_five | 3 | 0 | 1 | +| DataWindowedSum | one_five | 4 | 0 | 1 | +| DataWindowedSum | one_five | 5 | 1 | 1 | +| DataWindowedSum | one_five | 6 | 0 | 1 | +| DataWindowedSum | one_five | 7 | 0 | 1 | +| DataWindowedSum | one_five | 8 | 0 | 1 | +| DataWindowedSum | one_five | 9 | 0 | 0 | +| DataWindowedSum | three_four_nine | 0 | 0 | 0 | +| DataWindowedSum | three_four_nine | 1 | 0 | 0 | +| DataWindowedSum | three_four_nine | 2 | 0 | 0 | +| DataWindowedSum | three_four_nine | 3 | 1 | 1 | +| DataWindowedSum | three_four_nine | 4 | 1 | 2 | +| DataWindowedSum | three_four_nine | 5 | 0 | 2 | +| DataWindowedSum | three_four_nine | 6 | 0 | 2 | +| DataWindowedSum | three_four_nine | 7 | 0 | 1 | +| DataWindowedSum | three_four_nine | 8 | 0 | 0 | +| DataWindowedSum | three_four_nine | 9 | 1 | 1 | +| NonzeroMax | one_five | 0 | 0 | 0 | +| NonzeroMax | one_five | 1 | 1 | 1 | +| NonzeroMax | one_five | 2 | 0 | 1 | +| NonzeroMax | one_five | 3 | 0 | 1 | +| NonzeroMax | one_five | 4 | 0 | 1 | +| NonzeroMax | one_five | 5 | 1 | 5 | +| NonzeroMax | one_five | 6 | 0 | 5 | +| NonzeroMax | one_five | 7 | 0 | 5 | +| NonzeroMax | one_five | 8 | 0 | 5 | +| NonzeroMax | one_five | 9 | 0 | 0 | +| NonzeroMax | three_four_nine | 0 | 0 | 0 | +| NonzeroMax | three_four_nine | 1 | 0 | 0 | +| NonzeroMax | three_four_nine | 2 | 0 | 0 | +| NonzeroMax | three_four_nine | 3 | 1 | 3 | +| NonzeroMax | three_four_nine | 4 | 1 | 4 | +| NonzeroMax | three_four_nine | 5 | 0 | 4 | +| NonzeroMax | three_four_nine | 6 | 0 | 4 | +| NonzeroMax | three_four_nine | 7 | 0 | 4 | +| NonzeroMax | three_four_nine | 8 | 0 | 0 | +| NonzeroMax | three_four_nine | 9 | 1 | 9 | ++-----------------+-----------------+---+---+-----------+ diff --git a/integration_tests/arg_min_max_test.l b/integration_tests/arg_min_max_test.l new file mode 100755 index 0000000..5d5029d --- /dev/null +++ b/integration_tests/arg_min_max_test.l @@ -0,0 +1,36 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Testing ArgMax, ArgMin, ArgMaxK and ArgMinK builtins. + +Data(v: 10, payload: "a"); +Data(v: 5, payload: "b"); +Data(v: 20, payload: "c"); +Data(v: 100, payload: "d"); +Data(v: 30, payload: "e"); +Data(v: 15, payload: "f"); + +TestArgMax() ArgMax= {arg: payload, value: v} :- Data(v:, payload:); +TestArgMin() ArgMin= {arg: payload, value: v} :- Data(v:, payload:); + +ArgMax3(x) = ArgMaxK(x, 3); +ArgMin2(x) = ArgMinK(x, 2); + +TestArgMaxK() ArgMax3= {arg: payload, value: v} :- Data(v:, payload:); +TestArgMinK() ArgMin2= {arg: payload, value: v} :- Data(v:, payload:); + +@OrderBy(Test, "arg_opt"); +Test(opt: "Max", arg_opt: TestArgMax(), arg_opt_k: TestArgMaxK()); +Test(opt: "Max", arg_opt: TestArgMin(), arg_opt_k: TestArgMinK()); diff --git a/integration_tests/arg_min_max_test.txt b/integration_tests/arg_min_max_test.txt new file mode 100755 index 0000000..0e456c5 --- /dev/null +++ b/integration_tests/arg_min_max_test.txt @@ -0,0 +1,6 @@ ++-----+---------+-------------------------------------------------------------------------------+ +| opt | arg_opt | arg_opt_k | ++-----+---------+-------------------------------------------------------------------------------+ +| Max | b | [{"arg":"b","value":"5"},{"arg":"a","value":"10"}] | +| Max | d | [{"arg":"d","value":"100"},{"arg":"e","value":"30"},{"arg":"c","value":"20"}] | ++-----+---------+-------------------------------------------------------------------------------+ diff --git a/integration_tests/array_test.l b/integration_tests/array_test.l new file mode 100755 index 0000000..7666166 --- /dev/null +++ b/integration_tests/array_test.l @@ -0,0 +1,23 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Testing array creation. + +FibonacciArray() = f :- + f Array= (n -> ToInt64(Round((1 + 5 ^ 0.5) ^ n / (2 ^ n * 5 ^ 0.5))) :- + n in Range(10)); + +Test() = v :- + v StringAgg= (s :- x in FibonacciArray(), s == ToString(x)); diff --git a/integration_tests/array_test.txt b/integration_tests/array_test.txt new file mode 100755 index 0000000..181c288 --- /dev/null +++ b/integration_tests/array_test.txt @@ -0,0 +1,5 @@ ++------------------------+ +| logica_value | ++------------------------+ +| 0,1,1,2,3,5,8,13,21,34 | ++------------------------+ diff --git a/integration_tests/bulk_functions.l b/integration_tests/bulk_functions.l new file mode 100755 index 0000000..a97ead1 --- /dev/null +++ b/integration_tests/bulk_functions.l @@ -0,0 +1,20 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +@OrderBy(Test, "col0"); +Test("Tan") = Round(Tan(3.14159265 / 4.0), 3); +Test("Least") = Round(Least(Sin(0.5), Sin(0.7), Sin(0.001)), 5); +Test("Exp") = Round(Pow((1 + 2.0 / 1000000.0), 1000000) - Exp(2.0), 3) + diff --git a/integration_tests/bulk_functions_test.txt b/integration_tests/bulk_functions_test.txt new file mode 100755 index 0000000..447fec9 --- /dev/null +++ b/integration_tests/bulk_functions_test.txt @@ -0,0 +1,7 @@ ++-------+--------------+ +| col0 | logica_value | ++-------+--------------+ +| Exp | -0.0 | +| Least | 0.001 | +| Tan | 1.0 | ++-------+--------------+ diff --git a/integration_tests/cast_test.l b/integration_tests/cast_test.l new file mode 100755 index 0000000..b596f08 --- /dev/null +++ b/integration_tests/cast_test.l @@ -0,0 +1,19 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Testing Cast function. + +T(true); +T(Cast(1, "BOOL")); diff --git a/integration_tests/cast_test.txt b/integration_tests/cast_test.txt new file mode 100755 index 0000000..e64e67e --- /dev/null +++ b/integration_tests/cast_test.txt @@ -0,0 +1,6 @@ ++------+ +| col0 | ++------+ +| true | +| true | ++------+ diff --git a/integration_tests/chain.l b/integration_tests/chain.l new file mode 100755 index 0000000..cc4f3c3 --- /dev/null +++ b/integration_tests/chain.l @@ -0,0 +1,31 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# An example of a chain broken due to lack of files. +# See chain_test on how to test it. + +A("data"); + +B(x) :- A(x); + +@Ground(C); +C(x) :- B(x); + +SaveC() += 1 :- C(); + +@Ground(D, C); +E(x) :- D(x); + +F(x) :- E(x); diff --git a/integration_tests/chain_test.l b/integration_tests/chain_test.l new file mode 100755 index 0000000..897de15 --- /dev/null +++ b/integration_tests/chain_test.l @@ -0,0 +1,33 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Example of a test for a chain with ground-only predicates. +import integration_tests.chain.A; # To mock. +import integration_tests.chain.C; # To connect. +import integration_tests.chain.D; # To connect. +import integration_tests.chain.F; # To test. + +# Mocking data. +MockA("mock_data"); + +# Fixing chain broken due to lack of files. +# Note that since D is not defined (only grounded) in chain.ydg we can not +# import it. But it lives as-is in global namespace, so we can directly mock it. +# TODO: This is probably not ideal and we need to limit ground-only +# predicates to their file. +MockD(x) :- C(x); + +# Testing. +TestF := F(A: MockA, D: MockD); diff --git a/integration_tests/chain_test.txt b/integration_tests/chain_test.txt new file mode 100755 index 0000000..9373e88 --- /dev/null +++ b/integration_tests/chain_test.txt @@ -0,0 +1,2 @@ +=========== Row: 0 =========== +col0: mock_data diff --git a/integration_tests/composite_functor.test b/integration_tests/composite_functor.test new file mode 100755 index 0000000..e69de29 diff --git a/integration_tests/composite_functor_test.l b/integration_tests/composite_functor_test.l new file mode 100755 index 0000000..26f7f28 --- /dev/null +++ b/integration_tests/composite_functor_test.l @@ -0,0 +1,41 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Test for composite functor. + +Traffic(campaign: 1, cookie: 100, country: "US"); +Traffic(campaign: 2, cookie: 200, country: "US"); +Traffic(campaign: 3, cookie: 300, country: "US"); +Traffic(campaign: 4, cookie: 400, country: "CA"); +Traffic(campaign: 5, cookie: 500, country: "CA"); +Traffic(campaign: 6, cookie: 600, country: "US"); + +# Functor of [Table] argument. +Anonymize(..r) :- Table(cookie:, ..r); + +# Functor of [Table, Country] arguments. +FilterToCountry(..r) :- Table(..r), r.country == Country(); + +US() = "US"; + +# Filter to US. +@Make(TrafficUS, FilterToCountry, {Table: Traffic, Country: US}); +@NoInject(TrafficUS); # We want to use ..r. + +# Anonymize. +@Make(AnonymizedTrafficUS, Anonymize, {Table: TrafficUS}); + +# Just anonymize traffic. (for test debugging) +@Make(AnonymizedTraffic, Anonymize, {Table: Traffic}); diff --git a/integration_tests/composite_functor_test.txt b/integration_tests/composite_functor_test.txt new file mode 100755 index 0000000..a840287 --- /dev/null +++ b/integration_tests/composite_functor_test.txt @@ -0,0 +1,8 @@ ++----------+---------+ +| campaign | country | ++----------+---------+ +| 1 | US | +| 2 | US | +| 3 | US | +| 6 | US | ++----------+---------+ diff --git a/integration_tests/define_aggregation.l b/integration_tests/define_aggregation.l new file mode 100755 index 0000000..236f441 --- /dev/null +++ b/integration_tests/define_aggregation.l @@ -0,0 +1,28 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Testing custom aggregation functions. + +SampledVisit(campaign:"1", person:123); +SampledVisit(campaign:"1", person:125); +SampledVisit(campaign:"2", person:155); +SampledVisit(campaign:"2", person:163); + +CountSampled(x) = Count(ToInt64(Floor(x / 10))) * 10; + +@OrderBy(SampledPeople, "campaign"); +SampledPeople(campaign:, + people? CountSampled= person) distinct :- + SampledVisit(campaign:, person:); diff --git a/integration_tests/define_aggregation_test.txt b/integration_tests/define_aggregation_test.txt new file mode 100755 index 0000000..d7e6d0e --- /dev/null +++ b/integration_tests/define_aggregation_test.txt @@ -0,0 +1,6 @@ ++----------+--------+ +| campaign | people | ++----------+--------+ +| 1 | 10 | +| 2 | 20 | ++----------+--------+ diff --git a/integration_tests/disjunction_test.l b/integration_tests/disjunction_test.l new file mode 100755 index 0000000..128ba06 --- /dev/null +++ b/integration_tests/disjunction_test.l @@ -0,0 +1,48 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Testing that disjunction works via solving a puzzle. +# Traveler asked four aborigines and got these answers: +# A: Yesterday was Wednesday. +# B: Tomorrow will be Sunday. +# C: Today is Friday. +# D: The day before yesterday was Thursday. +# Because everything you need to know is how many people lied, I will not tell. +# What day of the week was it? +# Source: http://brainden.com/logic-problems.htm + +# Note that we can not factor out the logic of (x == "T" | ....) into a helper +# function because disjunction is supported only for all-out predicates. +@OrderBy(Options, "col0"); +Options(day, a, b, c, d) :- + day in [0, 1, 2, 3, 4, 5, 6], + ((a == "T", Mod(day + 6, 7) == 3) | (a == "F", Mod(day + 6, 7) != 3)), + ((b == "T", Mod(day + 1, 7) == 0) | (b == "F", Mod(day + 1, 7) != 0)), + ((c == "T", day == 5) | (c == "F" , day != 5)), + ((d == "T", Mod(day + 5, 7) == 4) | (d == "F", Mod(day + 5, 7) != 4)); + +Liar(x) = ToInt64(x == "F"); + +NumLiarsByDay(day) = Liar(a) + Liar(b) + Liar(c) + Liar(d) :- + Options(day, a, b, c, d); + +NumDaysByLiarNumber(NumLiarsByDay(day)) Count= day; + +NumLiarsIdentifyingDay() = x :- NumDaysByLiarNumber(x) == 1; + +Answer(anwser: day_name) :- + NumLiarsByDay(day) == NumLiarsIdentifyingDay(), + day_name == Element(["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", + "Friday", "Saturday"], day); diff --git a/integration_tests/disjunction_test.txt b/integration_tests/disjunction_test.txt new file mode 100755 index 0000000..035fcf2 --- /dev/null +++ b/integration_tests/disjunction_test.txt @@ -0,0 +1,5 @@ ++----------+ +| anwser | ++----------+ +| Saturday | ++----------+ diff --git a/integration_tests/factorial_test.l b/integration_tests/factorial_test.l new file mode 100755 index 0000000..ffda4d9 --- /dev/null +++ b/integration_tests/factorial_test.l @@ -0,0 +1,26 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +Prod(x) = Exp(Sum(Log(x))); + +Factorial(x) = Round(f) :- + f Prod= (n + 1 :- n in GenerateArray(0, x - 1)); + +@OrderBy(Test, "col0"); +Test(Factorial(2)); +Test(Factorial(3)); +Test(Factorial(4)); +Test(Factorial(5)); diff --git a/integration_tests/factorial_test.txt b/integration_tests/factorial_test.txt new file mode 100755 index 0000000..1c0c3be --- /dev/null +++ b/integration_tests/factorial_test.txt @@ -0,0 +1,8 @@ ++-------+ +| col0 | ++-------+ +| 2.0 | +| 6.0 | +| 24.0 | +| 120.0 | ++-------+ diff --git a/integration_tests/flags_test.l b/integration_tests/flags_test.l new file mode 100755 index 0000000..9f2c799 --- /dev/null +++ b/integration_tests/flags_test.l @@ -0,0 +1,31 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Example of running: +# yodaql --f=a=my_value flags_test_manual.ydg testrun FlagValues + +@DefineFlag("a", "default_value_for_a"); +@DefineFlag("b", "default_value_for_b"); +@DefineFlag("c", "default_value_for_c"); +@DefineFlag("d", "default_value_for_d"); +@DefineFlag("e", "default_value_for_e"); +@DefineFlag("table_1", "default_value_for_table_1"); +@DefineFlag("table_2", "default_value_for_table_2"); + +TestFlagValues( + a: FlagValue("a"), b: FlagValue("b"), c: FlagValue("c"), + d: "${d}", e: "${e}"); + +TestFlagTable(a:, b:) :- `${table_1}`(a:), `${table_2}`(b:); diff --git a/integration_tests/functor_annotations_test.l b/integration_tests/functor_annotations_test.l new file mode 100755 index 0000000..72abe12 --- /dev/null +++ b/integration_tests/functor_annotations_test.l @@ -0,0 +1,40 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Testing that annotations are preserved. +# Predicates are meaningless. Simply creating a deep call stack and calling the +# functor. + +@Ground(L0); +L0() = 0; +L1() = L0() + 1; + +@NoInject(L2); +@OrderBy(L2, "yodaql_value"); +L2() = L1() + 2; + +Three() = 3; + +@Ground(L3); +L3 := L2(L0: Three); + +L4() = L3() + L2(); + +@Limit(L5, 1); +L5() = L4() + 5; + +H1() = 101; + +I1 := L5(L0: H1); diff --git a/integration_tests/functor_test.l b/integration_tests/functor_test.l new file mode 100755 index 0000000..05346ac --- /dev/null +++ b/integration_tests/functor_test.l @@ -0,0 +1,15 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + diff --git a/integration_tests/functor_test.txt b/integration_tests/functor_test.txt new file mode 100755 index 0000000..286534c --- /dev/null +++ b/integration_tests/functor_test.txt @@ -0,0 +1,2 @@ +d +s diff --git a/integration_tests/ground_psql_test.l b/integration_tests/ground_psql_test.l new file mode 100755 index 0000000..ca6e32e --- /dev/null +++ b/integration_tests/ground_psql_test.l @@ -0,0 +1,37 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Testing default ground and grounding a predicate to another in psql. + +@Engine("psql"); + +@Ground(A); +A("a"); + +@Ground(B); +B("b"); + +@Ground(AB); +AB(x) :- A(x) | B(x); + +@Ground(C); +C("c"); + +@Ground(ABC); +ABC(x) :- AB(x) | C(x); + +Save() += 1 :- ABC(); + +Test() = Save(); diff --git a/integration_tests/ground_psql_test.txt b/integration_tests/ground_psql_test.txt new file mode 100644 index 0000000..9be3966 --- /dev/null +++ b/integration_tests/ground_psql_test.txt @@ -0,0 +1,5 @@ + logica_value +-------------- + 3 +(1 row) + diff --git a/integration_tests/ground_test.l b/integration_tests/ground_test.l new file mode 100755 index 0000000..5385f30 --- /dev/null +++ b/integration_tests/ground_test.l @@ -0,0 +1,35 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Testing default ground and grounding a predicate to another. + +@Ground(A); +A("a"); + +@Ground(B); +B("b"); + +@Ground(AB); +AB(x) :- A(x) | B(x); + +@Ground(C); +C("c"); + +@Ground(ABC); +ABC(x) :- AB(x) | C(x); + +Save() += 1 :- ABC(); + +Test() = Save(); diff --git a/integration_tests/ground_test.txt b/integration_tests/ground_test.txt new file mode 100755 index 0000000..5931603 --- /dev/null +++ b/integration_tests/ground_test.txt @@ -0,0 +1,57 @@ +CREATE OR REPLACE TABLE logica_test.A AS SELECT + r"a" AS col0; -- at [1:1] +Replaced active-grp.logica_test.A + +CREATE OR REPLACE TABLE logica_test.B AS SELECT + r"b" AS col0; -- at [6:1] +Replaced active-grp.logica_test.B + +CREATE OR REPLACE TABLE logica_test.AB AS SELECT * FROM ( + ( + SELECT + A.col0 AS col0 + FROM + logica_test.A AS A + ) UNION ALL + ( + SELECT + B.col0 AS col0 + FROM + logica_test.B AS B + ) +); -- at [11:1] +Replaced active-grp.logica_test.AB + +CREATE OR REPLACE TABLE logica_test.C AS SELECT + r"c" AS col0; -- at [28:1] +Replaced active-grp.logica_test.C + +CREATE OR REPLACE TABLE logica_test.ABC AS SELECT * FROM ( + ( + SELECT + AB.col0 AS col0 + FROM + logica_test.AB AS AB + ) UNION ALL + ( + SELECT + C.col0 AS col0 + FROM + logica_test.C AS C + ) +); -- at [33:1] +Replaced active-grp.logica_test.ABC + +WITH t_0_Save AS (SELECT + SUM(1) AS yotaql_value +FROM + logica_test.ABC AS ABC) +(SELECT + Save.yotaql_value AS yotaql_value +FROM + t_0_Save AS Save); -- at [50:1] ++--------------+ +| yotaql_value | ++--------------+ +| 3 | ++--------------+ diff --git a/integration_tests/if_then.l b/integration_tests/if_then.l new file mode 100755 index 0000000..79c20c9 --- /dev/null +++ b/integration_tests/if_then.l @@ -0,0 +1,33 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Testing implication and OrderBy annotation. + +N(n1 + n2 * 5 + n3 * 25) :- l == [0,1,2,3,4], n1 in l, n2 in l, n3 in l; + +Qualify(n) = ( + if n > 50 then + "large" + else if n > 10 then + "medium" + else + "small"); + +@OrderBy(Qualified, "n"); # in case user wants to print it. +Qualified(n:, quality: Qualify(n)) :- N(n); + +@OrderBy(QualifiedSummary, "quality"); +QualifiedSummary(quality:, range_begin? Min= n, range_end? Max= n) distinct :- + Qualified(n:, quality:); diff --git a/integration_tests/if_then_QualifiedSummary.txt b/integration_tests/if_then_QualifiedSummary.txt new file mode 100755 index 0000000..721619d --- /dev/null +++ b/integration_tests/if_then_QualifiedSummary.txt @@ -0,0 +1,7 @@ ++---------+-------------+-----------+ +| quality | range_begin | range_end | ++---------+-------------+-----------+ +| large | 51 | 124 | +| medium | 11 | 50 | +| small | 0 | 10 | ++---------+-------------+-----------+ diff --git a/integration_tests/import_tests/canada.l b/integration_tests/import_tests/canada.l new file mode 100755 index 0000000..5cd6574 --- /dev/null +++ b/integration_tests/import_tests/canada.l @@ -0,0 +1,30 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import integration_tests.import_tests.usa.ProductUSA; +import integration_tests.import_tests.usa.SoftwareEngineer; + +ProductCanada("milk", price: 10); +ProductCanada("oil", price: 150); +ProductCanada("doctors", price: 500); + +@OrderBy(Consume, "col0"); +Consume(x) :- ProductCanada(x); +Consume(x) :- ProductUSA(x); + +ImportCost() += cost :- ProductUSA(price: cost); +DomesticCost() += cost :- ProductCanada(price: cost); + +ImportedEngineer(name:) :- SoftwareEngineer(name:); diff --git a/integration_tests/import_tests/canada_Consume.txt b/integration_tests/import_tests/canada_Consume.txt new file mode 100755 index 0000000..f5e8a60 --- /dev/null +++ b/integration_tests/import_tests/canada_Consume.txt @@ -0,0 +1,10 @@ ++----------+ +| col0 | ++----------+ +| doctors | +| grain | +| milk | +| movies | +| oil | +| software | ++----------+ diff --git a/integration_tests/import_tests/canada_ImportFraction.txt b/integration_tests/import_tests/canada_ImportFraction.txt new file mode 100755 index 0000000..2ef5544 --- /dev/null +++ b/integration_tests/import_tests/canada_ImportFraction.txt @@ -0,0 +1,5 @@ ++--------------+ +| logica_value | ++--------------+ +| 0.187 | ++--------------+ diff --git a/integration_tests/import_tests/canada_ImportedEngineer.txt b/integration_tests/import_tests/canada_ImportedEngineer.txt new file mode 100755 index 0000000..040c234 --- /dev/null +++ b/integration_tests/import_tests/canada_ImportedEngineer.txt @@ -0,0 +1,6 @@ ++---------+ +| name | ++---------+ +| Cozette | +| Jean | ++---------+ diff --git a/integration_tests/import_tests/canada_psql_Consume.txt b/integration_tests/import_tests/canada_psql_Consume.txt new file mode 100644 index 0000000..e158775 --- /dev/null +++ b/integration_tests/import_tests/canada_psql_Consume.txt @@ -0,0 +1,10 @@ + col0 +---------- + doctors + grain + milk + movies + oil + software +(6 rows) + diff --git a/integration_tests/import_tests/canada_psql_test.l b/integration_tests/import_tests/canada_psql_test.l new file mode 100755 index 0000000..f0bf557 --- /dev/null +++ b/integration_tests/import_tests/canada_psql_test.l @@ -0,0 +1,31 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Tests for running canada.ydg on PostgreSQL. +import integration_tests.import_tests.canada.ImportedEngineer; +import integration_tests.import_tests.canada.Consume; +import integration_tests.import_tests.canada.ImportCost; +import integration_tests.import_tests.canada.DomesticCost; + +@Engine("psql"); + +TestImportFraction() = + Format("%.3f", import_cost / (import_cost + domestic_cost)) :- + import_cost == ImportCost(), domestic_cost == DomesticCost(); + +@OrderBy(TestConsume, "col0"); +TestConsume(..r) :- Consume(..r); + +TestImportedEngineer(name:) :- ImportedEngineer(name:); diff --git a/integration_tests/import_tests/canada_test.l b/integration_tests/import_tests/canada_test.l new file mode 100755 index 0000000..fb24b69 --- /dev/null +++ b/integration_tests/import_tests/canada_test.l @@ -0,0 +1,29 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Tests for canada.ydg. +import integration_tests.import_tests.canada.ImportedEngineer; +import integration_tests.import_tests.canada.Consume; +import integration_tests.import_tests.canada.ImportCost; +import integration_tests.import_tests.canada.DomesticCost; + +TestImportFraction() = + Format("%.3f", import_cost / (import_cost + domestic_cost)) :- + import_cost == ImportCost(), domestic_cost == DomesticCost(); + +@OrderBy(TestConsume, "col0"); +TestConsume(..r) :- Consume(..r); + +TestImportedEngineer(name:) :- ImportedEngineer(name:); diff --git a/integration_tests/import_tests/functor_test.l b/integration_tests/import_tests/functor_test.l new file mode 100755 index 0000000..342c6a8 --- /dev/null +++ b/integration_tests/import_tests/functor_test.l @@ -0,0 +1,19 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import integration_tests.import_tests.new_canada.NewCanadaConsume; + +@OrderBy(Test, "col0"); +Test(..r) :- NewCanadaConsume(..r); diff --git a/integration_tests/import_tests/functor_test.txt b/integration_tests/import_tests/functor_test.txt new file mode 100755 index 0000000..a36139c --- /dev/null +++ b/integration_tests/import_tests/functor_test.txt @@ -0,0 +1,8 @@ ++---------+ +| col0 | ++---------+ +| doctors | +| freedom | +| milk | +| oil | ++---------+ diff --git a/integration_tests/import_tests/modification_inside.l b/integration_tests/import_tests/modification_inside.l new file mode 100755 index 0000000..ed2e2ff --- /dev/null +++ b/integration_tests/import_tests/modification_inside.l @@ -0,0 +1,121 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Example of modifying a value inside a repeader field within a repeated field. +# Input: Country. (defined below). +# Main predicate: BetterCountry, which is equal to Country, except for anyone +# who wanter have got a new washer and doesn't want a new washer any more. + +BetterCountry(better_country) :- + Country(country), + better_country == MakeCountryBetter(country); + +MakeCitiesBetter(cities) = better_cities :- + better_cities == ( + combine List= better_city :- + better_city == MakeCityBetter(city), + city in cities + ); + +MakeCountryBetter(country) = better_country :- + better_country == { + name: country.country_name, + cities: MakeCitiesBetter(country.cities) + }; + + +MakeCityBetter(city) = better_city :- + better_city == { + name: city.name, + population: MakePopulationBetter(city.population) + }; + +MakePopulationBetter(population) = better_population :- + better_population == ( + combine List= happier_person :- + happier_person == MakePersonHappier(person), + person in population + ); + +TestHappierPerson(h) :- + h == MakePersonHappier({ + name: "John", + dishwasher: "Bosh", + washer: "Samsung", + wants_new_washer: false + }); + +MakePersonHappier(person) = happier_person :- + happier_person == { + name: person.name, + dishwasher: person.dishwasher, + washer: ( + if person.wants_new_washer then + "new " ++ person.washer + else + person.washer + ), + wants_new_washer: false + }; + + +# Some fake data. +Country( + {country_name: "USA", + cities: [{ + name: "Seattle", + population: [ + { + name: "John", + dishwasher: "Bosh", + washer: "Samsung", + wants_new_washer: false + }, + { + name: "James", + dishwasher: "Samsung", + washer: "Indesit", + wants_new_washer: true + } + ]}, { + name: "Chicago", + population: [ + { + name: "Maria", + dishwasher: "Bosh", + washer: "Samsung", + wants_new_washer: true + }, + { + name: "Cleopatra", + dishwasher: "Samsung", + washer: "Indesit", + wants_new_washer: false + } + ]} + ]}); +Country( + {country_name: "Canada", + cities: [{ + name: "Vancouver", + population: [ + { + name: "Jean", + dishwasher: "Bosh", + washer: "Samsung", + wants_new_washer: true + } + ] + }]}); diff --git a/integration_tests/import_tests/new_canada.l b/integration_tests/import_tests/new_canada.l new file mode 100755 index 0000000..3ae7cd6 --- /dev/null +++ b/integration_tests/import_tests/new_canada.l @@ -0,0 +1,21 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import integration_tests.import_tests.usa.ProductUSA; +import integration_tests.import_tests.canada.Consume; + +NewProductUSA("freedom", price: 1000000000000); + +NewCanadaConsume := Consume(ProductUSA: NewProductUSA); diff --git a/integration_tests/import_tests/run_tests.py b/integration_tests/import_tests/run_tests.py new file mode 100755 index 0000000..b8425b4 --- /dev/null +++ b/integration_tests/import_tests/run_tests.py @@ -0,0 +1,68 @@ +#!/usr/bin/python +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""A suite of tests for import functionality.""" + +from common import logica_test + + +def RunTest(name, src, golden, predicate, user_flags=None): + """Run one test from this folder with TestManager.""" + logica_test.TestManager.RunTest( + name, + src="integration_tests/import_tests/" + src, + golden="integration_tests/import_tests/" + golden, + predicate=predicate, + user_flags=user_flags) + + +def RunAll(): + """Run all the tests.""" + RunTest( + name="canada_psql_test", + src="canada_psql_test.l", + golden="canada_psql_Consume.txt", + predicate="TestConsume", + ) + + RunTest( + name="functor_test", + src="functor_test.l", + golden="functor_test.txt", + predicate="Test", + ) + + RunTest( + name="canada_import_fraction_test", + src="canada_test.l", + golden="canada_ImportFraction.txt", + predicate="TestImportFraction", + ) + + RunTest( + name="canada_consume_test", + src="canada_test.l", + golden="canada_Consume.txt", + predicate="TestConsume", + ) + + RunTest( + name="canada_imported_engineer_test", + src="canada_test.l", + golden="canada_ImportedEngineer.txt", + predicate="TestImportedEngineer", + ) + diff --git a/integration_tests/import_tests/usa.l b/integration_tests/import_tests/usa.l new file mode 100755 index 0000000..5b42114 --- /dev/null +++ b/integration_tests/import_tests/usa.l @@ -0,0 +1,24 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +ProductUSA("software", price: 50); +ProductUSA("movies", price: 100); +ProductUSA("grain", price: 2); + +@Limit(SoftwareEngineer, 2); +@OrderBy(SoftwareEngineer, "name"); +SoftwareEngineer(name: "Maurice"); +SoftwareEngineer(name: "Jean"); +SoftwareEngineer(name: "Cozette"); diff --git a/integration_tests/long_functor_test.l b/integration_tests/long_functor_test.l new file mode 100755 index 0000000..e2b3830 --- /dev/null +++ b/integration_tests/long_functor_test.l @@ -0,0 +1,28 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Testing a long sequence of Make statements. + +S("success"); + +R(x) :- T(x); + +@Make(F1, R, {T: T1}); +@Make(F2, F1, {T1: T2}); +@Make(F3, F2, {T2: T3}); +@Make(F4, F3, {T3: T4}); +@Make(F5, F4, {T4: T5}); +@Make(F6, F5, {T5: T6}); +@Make(F7, F6, {T6: S}); diff --git a/integration_tests/long_functor_test.txt b/integration_tests/long_functor_test.txt new file mode 100755 index 0000000..774dd33 --- /dev/null +++ b/integration_tests/long_functor_test.txt @@ -0,0 +1,5 @@ ++---------+ +| col0 | ++---------+ +| success | ++---------+ diff --git a/integration_tests/modification_inside.l b/integration_tests/modification_inside.l new file mode 100755 index 0000000..c590b16 --- /dev/null +++ b/integration_tests/modification_inside.l @@ -0,0 +1,110 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Example of modifying a value inside a repeated field within a repeated field. +# Input: Country. (defined below). +# Main predicate: BetterCountry, which is equal to Country, except for anyone +# who wanted have got a new washer and doesn't want a new washer any more. + +@OrderBy(BetterCountry, "col0.name"); +BetterCountry(better_country) :- + Country(country), + better_country == MakeCountryBetter(country); + +MakeCountryBetter(country) = { + name: country.country_name, + cities: MakeCitiesBetter(country.cities) +}; + +MakeCitiesBetter(cities) = ( + combine Array= better_city.key -> better_city :- + better_city == MakeCityBetter(city), + city in cities +); + +MakeCityBetter(city) = { + name: city.name, + key: city.name, # For list sorting. + population: MakePopulationBetter(city.population) +}; + +MakePopulationBetter(population) = ( + combine Array= happier_person.key -> happier_person :- + happier_person == MakePersonHappier(person), + person in population +); + +MakePersonHappier(person) = { + name: person.name, + key: person.name, # For list sorting. + dishwasher: person.dishwasher, + washer: ( + if person.wants_new_washer then + "new " ++ person.washer + else + person.washer + ), + wants_new_washer: false +}; + + +# Some fake data. +Country( + {country_name: "USA", + cities: [{ + name: "Seattle", + population: [ + { + name: "John", + dishwasher: "Bosh", + washer: "Samsung", + wants_new_washer: false + }, + { + name: "James", + dishwasher: "Samsung", + washer: "Indesit", + wants_new_washer: true + } + ]}, { + name: "Chicago", + population: [ + { + name: "Maria", + dishwasher: "Bosh", + washer: "Samsung", + wants_new_washer: true + }, + { + name: "Cleopatra", + dishwasher: "Samsung", + washer: "Indesit", + wants_new_washer: false + } + ]} + ]}); +Country( + {country_name: "Canada", + cities: [{ + name: "Vancouver", + population: [ + { + name: "Jean", + dishwasher: "Bosh", + washer: "Samsung", + wants_new_washer: true + } + ] + }]}); diff --git a/integration_tests/modification_inside.txt b/integration_tests/modification_inside.txt new file mode 100755 index 0000000..b905cca --- /dev/null +++ b/integration_tests/modification_inside.txt @@ -0,0 +1,6 @@ ++-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| col0 | ++-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| {"name":"Canada","cities":[{"name":"Vancouver","key":"Vancouver","population":[{"name":"Jean","key":"Jean","dishwasher":"Bosh","washer":"new Samsung","wants_new_washer":"false"}]}]} | +| {"name":"USA","cities":[{"name":"Chicago","key":"Chicago","population":[{"name":"Cleopatra","key":"Cleopatra","dishwasher":"Samsung","washer":"Indesit","wants_new_washer":"false"},{"name":"Maria","key":"Maria","dishwasher":"Bosh","washer":"new Samsung","wants_new_washer":"false"}]},{"name":"Seattle","key":"Seattle","population":[{"name":"James","key":"James","dishwasher":"Samsung","washer":"new Indesit","wants_new_washer":"false"},{"name":"John","key":"John","dishwasher":"Bosh","washer":"Samsung","wants_new_washer":"false"}]}]} | ++-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ diff --git a/integration_tests/multi_body_aggregation.l b/integration_tests/multi_body_aggregation.l new file mode 100755 index 0000000..840575c --- /dev/null +++ b/integration_tests/multi_body_aggregation.l @@ -0,0 +1,35 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Tests for multi-body-aggregation. + +A() += 1; +A() += 2; + +Engineer(x) :- x in ["e1", "e2", "ed1"]; +Doctor(x) :- x in ["d1", "ed1"]; + +PeopleCount() Count= p :- Engineer(p); +PeopleCount() Count= p :- Doctor(p); + +S("1", n? += x) distinct :- x in [1,2,3]; +S("1", n? += x) distinct :- x in [10, 20]; +S("2", n? += x) distinct :- x in [4,5]; + +@OrderBy(TestOutput, "col0"); +TestOutput("A", A()); +TestOutput("PeopleCount", PeopleCount()); +TestOutput("S1", n) :- S("1", n:); +TestOutput("S2", n) :- S("2", n:); diff --git a/integration_tests/multi_body_aggregation_test.txt b/integration_tests/multi_body_aggregation_test.txt new file mode 100755 index 0000000..c3e092e --- /dev/null +++ b/integration_tests/multi_body_aggregation_test.txt @@ -0,0 +1,8 @@ ++-------------+------+ +| col0 | col1 | ++-------------+------+ +| A | 3 | +| PeopleCount | 4 | +| S1 | 36 | +| S2 | 9 | ++-------------+------+ diff --git a/integration_tests/nested_combines_test.l b/integration_tests/nested_combines_test.l new file mode 100755 index 0000000..1390abb --- /dev/null +++ b/integration_tests/nested_combines_test.l @@ -0,0 +1,47 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Tests that unified combines don't confuse variables. + +A(x, y) :- x == (combine List= t * 2 :- t in y), B(y); +B(z) :- z == (combine List= t + 1 :- t in [1,2,3]); + + +C(x, y) :- + x == (combine List= z * 3 :- z in [1,2,3]), + y == (combine List= z * 2 :- z in x); + +D(x, y) :- + x == ( + combine List= z + r :- + z in w, + w == (combine List= 1000 + t :- t in y), + r in [1, 2, 3] + ), + y == (combine List= t :- t in [10, 20, 30]); + +# An inner combine using top-level variable. +T(1); +T(2); +E(x, y) :- + T(a), a == 1, + x == [a], + y == (combine List= z :- z == (combine += a :- T(a))); + +@OrderBy(Test, "col0"); +Test("A", Sort(x), Sort(y)) :- A(x, y); +Test("C", Sort(x), Sort(y)) :- C(x, y); +Test("D", Sort(x), Sort(y)) :- D(x, y); +Test("E", Sort(x), Sort(y)) :- E(x, y); diff --git a/integration_tests/nested_combines_test.txt b/integration_tests/nested_combines_test.txt new file mode 100755 index 0000000..b08a520 --- /dev/null +++ b/integration_tests/nested_combines_test.txt @@ -0,0 +1,8 @@ ++------+------------------------------------------------------------------+------------------+ +| col0 | col1 | col2 | ++------+------------------------------------------------------------------+------------------+ +| A | ["4","6","8"] | ["2","3","4"] | +| C | ["3","6","9"] | ["6","12","18"] | +| D | ["1011","1012","1013","1021","1022","1023","1031","1032","1033"] | ["10","20","30"] | +| E | ["1"] | ["1"] | ++------+------------------------------------------------------------------+------------------+ diff --git a/integration_tests/no_from_test.l b/integration_tests/no_from_test.l new file mode 100755 index 0000000..e2dd320 --- /dev/null +++ b/integration_tests/no_from_test.l @@ -0,0 +1,23 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Testing that predicates with no 'FROM' clause, but with constraints are +# compiled correctly. + +A() += 1; + +Test(x) :- x == "a", x == "b"; +Test(x) :- x == "c"; +Test(ToString(A())); diff --git a/integration_tests/no_from_test.txt b/integration_tests/no_from_test.txt new file mode 100755 index 0000000..4120934 --- /dev/null +++ b/integration_tests/no_from_test.txt @@ -0,0 +1,6 @@ ++------+ +| col0 | ++------+ +| c | +| 1 | ++------+ diff --git a/integration_tests/noinject_test.l b/integration_tests/noinject_test.l new file mode 100755 index 0000000..3f9f1da --- /dev/null +++ b/integration_tests/noinject_test.l @@ -0,0 +1,21 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# @NoInject annotation test. + +@NoInject(A); +A(x + x * x) :- x in [1,2,3]; + +B(y + y) :- A(y); diff --git a/integration_tests/nontrivial_restof_test.l b/integration_tests/nontrivial_restof_test.l new file mode 100755 index 0000000..2763faf --- /dev/null +++ b/integration_tests/nontrivial_restof_test.l @@ -0,0 +1,24 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Testing non-trivial rest-of field. + +T(a: 1, b: 2, c: 3, d: "a"); +T(a: 4, b: 5, c: 6, d: "b"); +T(a: 7, b: 8, c: 9, d: "c"); + +# Take T, recalculate column a and remove column b. +@OrderBy(Test, "d"); +Test(a: 2 * a, ..r) :- T(a:, b:, ..r); diff --git a/integration_tests/nontrivial_restof_test.txt b/integration_tests/nontrivial_restof_test.txt new file mode 100755 index 0000000..f89c03b --- /dev/null +++ b/integration_tests/nontrivial_restof_test.txt @@ -0,0 +1,7 @@ ++----+---+---+ +| a | c | d | ++----+---+---+ +| 2 | 3 | a | +| 8 | 6 | b | +| 14 | 9 | c | ++----+---+---+ diff --git a/integration_tests/operation_order_test.l b/integration_tests/operation_order_test.l new file mode 100755 index 0000000..f03ad4d --- /dev/null +++ b/integration_tests/operation_order_test.l @@ -0,0 +1,16 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +Test() = 4 / 4 / 4; diff --git a/integration_tests/operation_order_test.txt b/integration_tests/operation_order_test.txt new file mode 100755 index 0000000..856faa6 --- /dev/null +++ b/integration_tests/operation_order_test.txt @@ -0,0 +1,5 @@ ++--------------+ +| logica_value | ++--------------+ +| 0.25 | ++--------------+ diff --git a/integration_tests/outer_join.l b/integration_tests/outer_join.l new file mode 100755 index 0000000..e14a758 --- /dev/null +++ b/integration_tests/outer_join.l @@ -0,0 +1,29 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Outer join via mult-body-aggregation rules. + +Phones(person: "Peter", phone: "4251112222"); +Phones(person: "John", phone: "4251113333"); +Emails(person: "John", email: "john@salem.org"); +Emails(person: "James", email: "james@salem.org"); + +@OrderBy(PersonPhonesAndEmails, "person", "DESC"); +PersonPhonesAndEmails( + person:, phones? ++= [phone], emails? ++= []) distinct :- + Phones(person:, phone:); +PersonPhonesAndEmails( + person:, phones? ++= [], emails? ++= [email]) distinct :- + Emails(person:, email:); diff --git a/integration_tests/outer_join_combine.l b/integration_tests/outer_join_combine.l new file mode 100755 index 0000000..9c72497 --- /dev/null +++ b/integration_tests/outer_join_combine.l @@ -0,0 +1,29 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Outer join via combine. + +Phones(person: "Peter", phone: "4251112222"); +Phones(person: "John", phone: "4251113333"); +Emails(person: "John", email: "john@salem.org"); +Emails(person: "James", email: "james@salem.org"); + +People(person:) distinct :- Phones(person:) | Emails(person:); + +@OrderBy(PersonPhoneAndEmail, "person", "DESC"); +PersonPhoneAndEmail(person:, phone:, email:) :- + People(person:), + phone == (combine AnyValue= p :- Phones(person:, phone: p)), + email == (combine AnyValue= e :- Emails(person:, email: e)); diff --git a/integration_tests/outer_join_disjunction.l b/integration_tests/outer_join_disjunction.l new file mode 100755 index 0000000..08b2fc5 --- /dev/null +++ b/integration_tests/outer_join_disjunction.l @@ -0,0 +1,27 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Outer join via disjunction. + +Phones(person: "Peter", phone: "4251112222"); +Phones(person: "John", phone: "4251113333"); +Emails(person: "John", email: "john@salem.org"); +Emails(person: "James", email: "james@salem.org"); + +@OrderBy(PersonPhoneAndEmail, "person", "DESC"); +PersonPhoneAndEmail( + person:, phone? SomeValue= phone, email? SomeValue= email) distinct :- + (Phones(person:, phone:), email == null) | + (Emails(person:, email:), phone == null); diff --git a/integration_tests/outer_join_some_value.l b/integration_tests/outer_join_some_value.l new file mode 100755 index 0000000..88bda52 --- /dev/null +++ b/integration_tests/outer_join_some_value.l @@ -0,0 +1,29 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Outer join via mult-body-aggregation rules. + +Phones(person: "Peter", phone: "4251112222"); +Phones(person: "John", phone: "4251113333"); +Emails(person: "John", email: "john@salem.org"); +Emails(person: "James", email: "james@salem.org"); + +@OrderBy(PersonPhoneAndEmail, "person", "DESC"); +PersonPhoneAndEmail( + person:, phone? SomeValue= phone, email? SomeValue= null) distinct :- + Phones(person:, phone:); +PersonPhoneAndEmail( + person:, phone? SomeValue= null, email? SomeValue= email) distinct :- + Emails(person:, email:); diff --git a/integration_tests/outer_join_test.txt b/integration_tests/outer_join_test.txt new file mode 100755 index 0000000..488cbbc --- /dev/null +++ b/integration_tests/outer_join_test.txt @@ -0,0 +1,7 @@ ++--------+----------------+---------------------+ +| person | phones | emails | ++--------+----------------+---------------------+ +| Peter | ["4251112222"] | [] | +| John | ["4251113333"] | ["john@salem.org"] | +| James | [] | ["james@salem.org"] | ++--------+----------------+---------------------+ diff --git a/integration_tests/outer_join_verbose.l b/integration_tests/outer_join_verbose.l new file mode 100755 index 0000000..037f87f --- /dev/null +++ b/integration_tests/outer_join_verbose.l @@ -0,0 +1,38 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Outer join without mult-body-aggregation. + +Phones(person: "Peter", phone: "4251112222"); +Phones(person: "John", phone: "4251113333"); +Emails(person: "John", email: "john@salem.org"); +Emails(person: "James", email: "james@salem.org"); + +PersonPhonesAndEmailsNonAggregated(person:, + phones: [phone], + emails: []) :- Phones(person:, phone:); +PersonPhonesAndEmailsNonAggregated(person:, + phones: [], + emails: [email]) :- Emails(person:, email:); +PersonPhonesAndEmails(person:, + phones? ++= phones, + emails? ++= emails) distinct :- + PersonPhonesAndEmailsNonAggregated(person:, phones:, emails:); + +@OrderBy(PersonPhoneAndEmail, "person", "DESC"); +PersonPhoneAndEmail(person:, phone:, email:) :- + PersonPhonesAndEmails(person:, phones:, emails:), + phone == If(Size(phones) == 1, Element(phones, 0), null), + email == If(Size(emails) == 1, Element(emails, 0), null); diff --git a/integration_tests/outer_join_verbose_test.txt b/integration_tests/outer_join_verbose_test.txt new file mode 100755 index 0000000..e71dd05 --- /dev/null +++ b/integration_tests/outer_join_verbose_test.txt @@ -0,0 +1,7 @@ ++--------+------------+-----------------+ +| person | phone | email | ++--------+------------+-----------------+ +| Peter | 4251112222 | NULL | +| John | 4251113333 | john@salem.org | +| James | NULL | james@salem.org | ++--------+------------+-----------------+ diff --git a/integration_tests/population.csv b/integration_tests/population.csv new file mode 100755 index 0000000..5fc3302 --- /dev/null +++ b/integration_tests/population.csv @@ -0,0 +1,4 @@ +city,state,int64_population,float64_internet_penetration +Seattle,WA,1000000,0.9 +TwinPeaks,WA,2000,0.1 +Portland,OR,500000,0.8 diff --git a/integration_tests/ppq_test.l b/integration_tests/ppq_test.l new file mode 100755 index 0000000..f61a7c4 --- /dev/null +++ b/integration_tests/ppq_test.l @@ -0,0 +1,25 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Test for ++? operator. + +Character(full_name: "Toby the dog"); +Character(full_name: "Pete the cat"); +Character(full_name: "Sharik the dog"); + +@OrderBy(Dog, "name"); +Dog(name:) :- Character(full_name: name ++? " the dog"); +Dog(name: short_name ++? " the musketeer") :- short_name in [ + "Atos", "Portos", "Aramis"]; diff --git a/integration_tests/ppq_test.txt b/integration_tests/ppq_test.txt new file mode 100755 index 0000000..afbdcd2 --- /dev/null +++ b/integration_tests/ppq_test.txt @@ -0,0 +1,5 @@ +Error in query string: Error processing job 'active- +grp:bqjob_r2e8a5f02ea22db23_000001722034c3e2_1': Syntax error: Unexpected "+" at +[21:23] +Failure details: +- query: Syntax error: Unexpected "+" at [21:23] diff --git a/integration_tests/psql_test.l b/integration_tests/psql_test.l new file mode 100644 index 0000000..0e78199 --- /dev/null +++ b/integration_tests/psql_test.l @@ -0,0 +1,43 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Testing PostgreSQL engine. + + +@Engine("psql"); + +Parent("A", "B"); +Parent("B", "C"); +Parent("C", "D"); +Parent("B", "E"); +Parent("A", "F"); +Parent("A", "G"); +Parent("G", "H"); + +ChildrenOf(parent) List= child :- + Parent(parent, child); + +NumChildren(parent) += 1 :- + Parent(parent); + +Grandparent(a, b) :- + Parent(a, x), Parent(x, b); + +@OrderBy(Test, "col0", "col1", "col2"); +Test("Parent", parent, child) :- Parent(parent, child); +Test("Grandparent", a, b) :- Grandparent(a, b); +Test("NumChildren", parent, ToString(NumChildren(parent))); +Test("ChildrenOf", parent, ArrayToString(ChildrenOf(parent), ",")); + diff --git a/integration_tests/psql_test.txt b/integration_tests/psql_test.txt new file mode 100644 index 0000000..cb7948b --- /dev/null +++ b/integration_tests/psql_test.txt @@ -0,0 +1,23 @@ + col0 | col1 | col2 +-------------+------+------- + ChildrenOf | A | B,F,G + ChildrenOf | B | C,E + ChildrenOf | C | D + ChildrenOf | G | H + Grandparent | A | C + Grandparent | A | E + Grandparent | A | H + Grandparent | B | D + NumChildren | A | 3 + NumChildren | B | 2 + NumChildren | C | 1 + NumChildren | G | 1 + Parent | A | B + Parent | A | F + Parent | A | G + Parent | B | C + Parent | B | E + Parent | C | D + Parent | G | H +(19 rows) + diff --git a/integration_tests/quote_escape_test.l b/integration_tests/quote_escape_test.l new file mode 100755 index 0000000..be76c3f --- /dev/null +++ b/integration_tests/quote_escape_test.l @@ -0,0 +1,20 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This is to test escaping of quotes in command line flags. + +@DefineFlag("name", ""); + +Q(FlagValue("name")); diff --git a/integration_tests/quote_escape_test.txt b/integration_tests/quote_escape_test.txt new file mode 100755 index 0000000..075d65e --- /dev/null +++ b/integration_tests/quote_escape_test.txt @@ -0,0 +1,5 @@ ++-----------------------+ +| col0 | ++-----------------------+ +| Dwayne "Rock" Johnson | ++-----------------------+ diff --git a/integration_tests/run_tests.py b/integration_tests/run_tests.py new file mode 100755 index 0000000..dff5b1a --- /dev/null +++ b/integration_tests/run_tests.py @@ -0,0 +1,238 @@ +#!/usr/bin/python +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""A suite of tests for import functionality.""" + +from common import logica_test + + +def RunTest(name, src=None, golden=None, predicate=None, + user_flags=None): + """Run one test from this folder with TestManager.""" + src = src or (name + ".l") + golden = golden or (name + ".txt") + predicate = predicate or "Test" + logica_test.TestManager.RunTest( + name, + src="integration_tests/" + src, + golden="integration_tests/" + golden, + predicate=predicate, + user_flags=user_flags) + + +def RunAll(): + """Running all tests.""" + # Uncomment to test writing tables. + # RunTest("ground_test") + # RunTest("ground_psql_test") + RunTest("psql_test") + RunTest("sqlite_subquery_test") + + RunTest("sqlite_test") + + RunTest( + name="quote_escape_test", + src="quote_escape_test.l", + golden="quote_escape_test.txt", + predicate="Q", + user_flags={'name': 'Dwayne "Rock" Johnson'} + ) + + RunTest("array_test") + RunTest("udf_test") + RunTest("with_test") + + RunTest( + name="factorial_test", + src="factorial_test.l", + golden="factorial_test.txt", + predicate="Test" + ) + + RunTest( + name="sql_expr_test", + src="sql_expr_test.l", + golden="sql_expr_test.txt", + predicate="Test", + ) + + RunTest( + name="unnest_order_test", + src="unnest_order_test.l", + golden="unnest_order_test.txt", + predicate="Test", + ) + + RunTest( + name="nested_combines_test", + src="nested_combines_test.l", + golden="nested_combines_test.txt", + predicate="Test", + ) + + RunTest( + name="analytic_test", + src="analytic_test.l", + golden="analytic_test.txt", + predicate="ReadableTest", + ) + + RunTest( + name="simple_functors_test", + src="simple_functors_test.l", + golden="simple_functors_test.txt", + predicate="Test", + ) + + RunTest( + name="composite_functor_test", + src="composite_functor_test.l", + golden="composite_functor_test.txt", + predicate="AnonymizedTrafficUS", + ) + + RunTest( + name="long_functor_test", + src="long_functor_test.l", + golden="long_functor_test.txt", + predicate="F7", + ) + + RunTest( + name="nontrivial_restof_test", + src="nontrivial_restof_test.l", + golden="nontrivial_restof_test.txt", + predicate="Test", + ) + + RunTest( + name="cast_test", + src="cast_test.l", + golden="cast_test.txt", + predicate="T", + ) + + RunTest( + name="disjunction_test", + src="disjunction_test.l", + golden="disjunction_test.txt", + predicate="Answer", + ) + + RunTest( + name="arg_min_max_test", + src="arg_min_max_test.l", + golden="arg_min_max_test.txt", + predicate="Test", + ) + + RunTest( + name="operation_order_test", + src="operation_order_test.l", + golden="operation_order_test.txt", + predicate="Test", + ) + + RunTest( + name="no_from_test", + src="no_from_test.l", + golden="no_from_test.txt", + predicate="Test", + ) + + RunTest( + name="if_then_test", + src="if_then.l", + golden="if_then_QualifiedSummary.txt", + predicate="QualifiedSummary", + ) + + RunTest( + name="modification_inside_test", + src="modification_inside.l", + golden="modification_inside.txt", + predicate="BetterCountry", + ) + + RunTest( + name="outer_join_test", + src="outer_join.l", + golden="outer_join_test.txt", + predicate="PersonPhonesAndEmails", + ) + + RunTest( + name="outer_join_some_value_test", + src="outer_join_some_value.l", + golden="outer_join_verbose_test.txt", + predicate="PersonPhoneAndEmail", + ) + + RunTest( + name="outer_join_disjunction_test", + src="outer_join_disjunction.l", + golden="outer_join_verbose_test.txt", + predicate="PersonPhoneAndEmail", + ) + + RunTest( + name="outer_join_combine_test", + src="outer_join_combine.l", + golden="outer_join_verbose_test.txt", + predicate="PersonPhoneAndEmail", + ) + + RunTest( + name="outer_join_verbose_test", + src="outer_join_verbose.l", + golden="outer_join_verbose_test.txt", + predicate="PersonPhoneAndEmail", + ) + + RunTest( + name="multi_body_aggregation_test", + src="multi_body_aggregation.l", + golden="multi_body_aggregation_test.txt", + predicate="TestOutput", + ) + + RunTest( + name="bulk_functions_test", + src="bulk_functions.l", + golden="bulk_functions_test.txt", + predicate="Test", + ) + + RunTest( + name="define_aggregation_test", + src="define_aggregation.l", + golden="define_aggregation_test.txt", + predicate="SampledPeople", + ) + + RunTest( + name="unary_test", + src="unary_test.l", + golden="unary_test.txt", + predicate="Test", + ) + + RunTest( + name="sql_string_table_test", + src="sql_string_table_test.l", + golden="sql_string_table_test.txt", + predicate="Test", + ) diff --git a/integration_tests/simple_functors_test.l b/integration_tests/simple_functors_test.l new file mode 100755 index 0000000..0fd6af1 --- /dev/null +++ b/integration_tests/simple_functors_test.l @@ -0,0 +1,35 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Simple functor test. + +Events1(campaign: 1) :- x in [0, 0, 0]; # 3 events. +Events1(campaign: 2) :- x in [0, 0]; # 2 events. +Events1(campaign: 3) :- x in [0, 0, 0, 0, 0]; # etc. + +Events2(campaign: 2) :- x in [0]; +Events2(campaign: 3) :- x in [0, 0, 0, 0]; +Events2(campaign: 4) :- x in [0, 0, 0, 0, 0, 0]; + +# Functor of [Events] argument. +Traffic(campaign:, impression_count? += 1) distinct :- Events(campaign:); + +@Make(Traffic1, Traffic, {Events: Events1}); +@Make(Traffic2, Traffic, {Events: Events2}); + +@OrderBy(Test, "col0", "campaign"); +Test("traffic1", ..r) :- Traffic1(..r); +Test("traffic2", ..r) :- Traffic2(..r); + diff --git a/integration_tests/simple_functors_test.txt b/integration_tests/simple_functors_test.txt new file mode 100755 index 0000000..e76c443 --- /dev/null +++ b/integration_tests/simple_functors_test.txt @@ -0,0 +1,10 @@ ++----------+----------+------------------+ +| col0 | campaign | impression_count | ++----------+----------+------------------+ +| traffic1 | 1 | 3 | +| traffic1 | 2 | 2 | +| traffic1 | 3 | 5 | +| traffic2 | 2 | 1 | +| traffic2 | 3 | 4 | +| traffic2 | 4 | 6 | ++----------+----------+------------------+ diff --git a/integration_tests/sql_expr_test.l b/integration_tests/sql_expr_test.l new file mode 100755 index 0000000..bed4bbc --- /dev/null +++ b/integration_tests/sql_expr_test.l @@ -0,0 +1,21 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Testing SqlExpr built-in function. + +ExtractHour(datetime) = + SqlExpr("EXTRACT(HOUR FROM {datetime})", {datetime:}); + +Test(ExtractHour(Datetime(2008, 12, 25, 15, 30, 0))); diff --git a/integration_tests/sql_expr_test.txt b/integration_tests/sql_expr_test.txt new file mode 100755 index 0000000..5b37da8 --- /dev/null +++ b/integration_tests/sql_expr_test.txt @@ -0,0 +1,5 @@ ++------+ +| col0 | ++------+ +| 15 | ++------+ diff --git a/integration_tests/sql_string_table_test.l b/integration_tests/sql_string_table_test.l new file mode 100755 index 0000000..22faf8d --- /dev/null +++ b/integration_tests/sql_string_table_test.l @@ -0,0 +1,20 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Testing that SQL string can be used as a table. +# Please never use it this way. +# This feature is provided for Spanner indexes specification. + +Test(result) :- `((select "success" as result))`(result:); diff --git a/integration_tests/sql_string_table_test.txt b/integration_tests/sql_string_table_test.txt new file mode 100755 index 0000000..774dd33 --- /dev/null +++ b/integration_tests/sql_string_table_test.txt @@ -0,0 +1,5 @@ ++---------+ +| col0 | ++---------+ +| success | ++---------+ diff --git a/integration_tests/sqlite_subquery_test.l b/integration_tests/sqlite_subquery_test.l new file mode 100755 index 0000000..cdff0f4 --- /dev/null +++ b/integration_tests/sqlite_subquery_test.l @@ -0,0 +1,34 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +@Engine("sqlite"); + +Office(city: "Kirkland", state: "Washington"); +Office(city: "Seattle", state: "Washington"); +Office(city: "Los Angeles", state: "California"); + +Employee(name: "A", city: "Kirkland"); +Employee(name: "B", city: "Seattle"); +Employee(name: "C", city: "Kirkland"); +Employee(name: "D", city: "Los Angeles"); + +State(state) distinct :- Office(state:); + +@With(EmployeesInState); +EmployeesInState(state:, employee_count:) :- + State(state), + employee_count += (1 :- Employee(city:), Office(city:, state:)); + +Test(..r) :- EmployeesInState(..r); diff --git a/integration_tests/sqlite_subquery_test.txt b/integration_tests/sqlite_subquery_test.txt new file mode 100755 index 0000000..655ad6e --- /dev/null +++ b/integration_tests/sqlite_subquery_test.txt @@ -0,0 +1,4 @@ +state employee_count +---------- -------------- +California 1 +Washington 3 diff --git a/integration_tests/sqlite_test.l b/integration_tests/sqlite_test.l new file mode 100755 index 0000000..6219cf0 --- /dev/null +++ b/integration_tests/sqlite_test.l @@ -0,0 +1,32 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +@Engine("sqlite"); + +Animal("cat"); +Animal("dog"); + +Color("white"); +Color("black"); +Color("brown"); + +Action("runs"); +Action("jumps"); +Action("sleeps"); + +Story(color ++ " " ++ animal ++ " " ++ action ++ ".") :- + Animal(animal), Color(color), Action(action); + +Test(s) :- Story(s); diff --git a/integration_tests/sqlite_test.txt b/integration_tests/sqlite_test.txt new file mode 100755 index 0000000..901dfac --- /dev/null +++ b/integration_tests/sqlite_test.txt @@ -0,0 +1,20 @@ +col0 +----------------- +white cat runs. +white cat jumps. +white cat sleeps. +black cat runs. +black cat jumps. +black cat sleeps. +brown cat runs. +brown cat jumps. +brown cat sleeps. +white dog runs. +white dog jumps. +white dog sleeps. +black dog runs. +black dog jumps. +black dog sleeps. +brown dog runs. +brown dog jumps. +brown dog sleeps. diff --git a/integration_tests/testrun_csv_test.l b/integration_tests/testrun_csv_test.l new file mode 100755 index 0000000..1eaf27d --- /dev/null +++ b/integration_tests/testrun_csv_test.l @@ -0,0 +1,25 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Testing querying of CSVs in testrun mode. +@OrderBy(Population, "state"); +Population( + state:, + population? += int64_population, + internet_users? += ( + int64_population * + float64_internet_penetration)) distinct :- + population_table(state:, int64_population:, float64_internet_penetration:); + diff --git a/integration_tests/testrun_csv_test.txt b/integration_tests/testrun_csv_test.txt new file mode 100755 index 0000000..4cbcf11 --- /dev/null +++ b/integration_tests/testrun_csv_test.txt @@ -0,0 +1,8 @@ +=========== Row: 0 =========== +state: OR +population: 500000 +internet_users: 400000 +=========== Row: 1 =========== +state: WA +population: 1002000 +internet_users: 900200 diff --git a/integration_tests/udf_test.l b/integration_tests/udf_test.l new file mode 100755 index 0000000..3d85c60 --- /dev/null +++ b/integration_tests/udf_test.l @@ -0,0 +1,30 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Testing simple function compilation. + +# Functors of argument F. +GridF(t) = F(t) :- t == s / 100.0 - 5, s in Range(1000); +FunctionMinimum() = x :- + x ArgMin= t -> GridF(t); + +F1(x) --> (x - 3) ^ 2 + 4; +F2(x) --> (x + 2) ^ 2 * 5 - 8; + +Min1 := FunctionMinimum(F: F1); +Min2 := FunctionMinimum(F: F2); + +Test("f1") = Min1(); +Test("f2") = Min2(); diff --git a/integration_tests/udf_test.txt b/integration_tests/udf_test.txt new file mode 100755 index 0000000..55aa4fa --- /dev/null +++ b/integration_tests/udf_test.txt @@ -0,0 +1,6 @@ ++------+--------------+ +| col0 | logica_value | ++------+--------------+ +| f1 | 3.0 | +| f2 | -2.0 | ++------+--------------+ diff --git a/integration_tests/unary_test.l b/integration_tests/unary_test.l new file mode 100755 index 0000000..2075c7d --- /dev/null +++ b/integration_tests/unary_test.l @@ -0,0 +1,24 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Testing unary operators ! and -. + +Test("not") = ToString(is_small) :- + is_small == !is_big, + is_big == (x > 5), + x == 3; + +Test("minus") = ToString(a) :- + a == Sin(-1 * 3.1415); diff --git a/integration_tests/unary_test.txt b/integration_tests/unary_test.txt new file mode 100755 index 0000000..cc8f702 --- /dev/null +++ b/integration_tests/unary_test.txt @@ -0,0 +1,6 @@ ++-------+-------------------------+ +| col0 | logica_value | ++-------+-------------------------+ +| not | true | +| minus | -9.2653589660490258e-05 | ++-------+-------------------------+ diff --git a/integration_tests/unnest_order_test.l b/integration_tests/unnest_order_test.l new file mode 100755 index 0000000..07e8c6f --- /dev/null +++ b/integration_tests/unnest_order_test.l @@ -0,0 +1,20 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Testing that unnestings are ordered by dependency. + +@OrderBy(Test, "col0"); +Test(x) :- x in y.a, y in [{a:[1,2,3]}]; +Test(x) :- y in [{a:[1,2,3]}], x in y.a; diff --git a/integration_tests/unnest_order_test.txt b/integration_tests/unnest_order_test.txt new file mode 100755 index 0000000..af12e82 --- /dev/null +++ b/integration_tests/unnest_order_test.txt @@ -0,0 +1,10 @@ ++------+ +| col0 | ++------+ +| 1 | +| 1 | +| 2 | +| 2 | +| 3 | +| 3 | ++------+ diff --git a/integration_tests/with_test.l b/integration_tests/with_test.l new file mode 100755 index 0000000..4aa0ce6 --- /dev/null +++ b/integration_tests/with_test.l @@ -0,0 +1,32 @@ +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Testing 'With' annotation. + +@With(Parent); +Parent("A", "B"); +Parent("B", "C"); +Parent("B", "D"); +Parent("C", "E"); + +@With(AxiomGrandparent); +AxiomGrandparent("L", "M"); + +Grandparent(a, b) :- Parent(a, x), Parent(x, b); +Grandparent(a, b) :- AxiomGrandparent(a, b); + +@OrderBy(Test, "col0", "col1"); +Test(a, b) :- Grandparent(a, b); + diff --git a/integration_tests/with_test.txt b/integration_tests/with_test.txt new file mode 100755 index 0000000..2a94911 --- /dev/null +++ b/integration_tests/with_test.txt @@ -0,0 +1,8 @@ ++------+------+ +| col0 | col1 | ++------+------+ +| A | C | +| A | D | +| B | E | +| L | M | ++------+------+ diff --git a/logica b/logica new file mode 100755 index 0000000..88463ae --- /dev/null +++ b/logica @@ -0,0 +1,18 @@ +#!/bin/bash -eu +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +python3 "$(dirname $0)/logica.py" "$@" + diff --git a/logica.py b/logica.py new file mode 100755 index 0000000..e4118cd --- /dev/null +++ b/logica.py @@ -0,0 +1,174 @@ +#!/usr/bin/python +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Logica command-line tool. + +Example usage: + +python3 logica.py - run Grandparent <<<' +Parent(parent: "Shmi Skywalker", child: "Anakin Skywalker"); +Parent(parent: "Anakin Skywalker", child: "Luke Skywalker"); +Grandparent(grandparent:, grandchild:) :- + Parent(parent: grandparent, child: x), + Parent(parent: x, child: grandchild); +' + +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import getopt +import json +import os +import subprocess +import sys + + +from common import color +from compiler import functors +from compiler import rule_translate +from compiler import universe +from parser_py import parse + + +def ReadUserFlags(rules, argv): + """Reading logic program flags provided by the user.""" + def Error(msg): + print(color.Format('[ {error}Error{end} ] {msg}', {'msg': msg})) + sys.exit(1) + + annotations = universe.Annotations.ExtractAnnotations( + rules, restrict_to=['@DefineFlag']) + defined_flags = annotations['@DefineFlag'].keys() + try: + p = getopt.getopt(argv, '', ['%s=' % f for f in defined_flags]) + except getopt.GetoptError as e: + Error(str(e)) + + if p[1]: + Error('Undefined command arguments: %s' % p[1]) + + sys.exit(1) + user_flags = {k[2:]: v for k, v in p[0]} + return user_flags + + +def main(argv): + if len(argv) <= 1 or argv[1] == 'help': + print('Usage:') + print(' logica [flags]') + print(' Commands are:') + print(' print: prints the StandardSQL query for the predicate.') + print(' run: runs the StandardSQL query on BigQuery with pretty output.') + print(' run_to_csv: runs the query on BigQuery with csv output.') + + print('') + print('') + print('Example:') + print(' python3 logica.py - run GoodIdea <<<\' ' + 'GoodIdea(snack: "carrots")\'') + return 1 + + if len(argv) == 3 and argv[2] == 'parse': + pass # compile needs just 2 actual arguments. + else: + if len(argv) < 4: + print('Not enought arguments. Run \'logica help\' for help.', + file=sys.stderr) + return 1 + + if argv[1] == '-': + filename = '/dev/stdin' + else: + filename = argv[1] + + command = argv[2] + + commands = ['parse', 'print', 'run', 'run_to_csv'] + + if command not in commands: + print(color.Format('Unknown command {warning}{command}{end}. ' + 'Available commands: {commands}.', + dict(command=command, commands=', '.join(commands)))) + return 1 + if not os.path.exists(filename): + print('File not found: %s' % filename, file=sys.stderr) + return 1 + program_text = open(filename).read() + + try: + parsed_rules = parse.ParseFile(program_text)['rule'] + except parse.ParsingException as parsing_exception: + parsing_exception.ShowMessage() + sys.exit(1) + + if command == 'parse': + # No indentation to avoid file size inflation. + print(json.dumps(parsed_rules, sort_keys=True, indent='')) + return 0 + + predicates = argv[3] + + user_flags = ReadUserFlags(parsed_rules, argv[4:]) + + predicates_list = predicates.split(',') + for predicate in predicates_list: + try: + p = universe.LogicaProgram(parsed_rules, user_flags=user_flags) + formatted_sql = p.FormattedPredicateSql(predicate) + except rule_translate.RuleCompileException as rule_compilation_exception: + rule_compilation_exception.ShowMessage() + sys.exit(1) + except functors.FunctorError as functor_exception: + functor_exception.ShowMessage() + sys.exit(1) + + if command == 'print': + print(formatted_sql) + + engine = p.annotations.Engine() + + if command == 'run' or command == 'run_to_csv': + if engine == 'bigquery': + output_format = 'csv' if command == 'run_to_csv' else 'pretty' + p = subprocess.Popen(['bq', 'query', + '--use_legacy_sql=false', + '--format=%s' % output_format], + stdin=subprocess.PIPE, stdout=subprocess.PIPE) + o, _ = p.communicate(formatted_sql.encode()) + elif engine == 'sqlite': + p = subprocess.Popen(['sqlite3'], + stdin=subprocess.PIPE, stdout=subprocess.PIPE) + commands = [] + if command == 'run_to_csv': + commands.append('.mode csv') + o, _ = p.communicate( + '\n'.join(commands + [formatted_sql]).encode()) + elif engine == 'psql': + p = subprocess.Popen(['psql', '--quiet'] + + (['--csv'] if command == 'run_to_csv' else []), + stdin=subprocess.PIPE, stdout=subprocess.PIPE) + commands = [] + o, _ = p.communicate( + '\n'.join(commands + [formatted_sql]).encode()) + else: + assert False, 'Unknown engine: %s' % engine + print(o.decode()) + +if __name__ == '__main__': + main(sys.argv) diff --git a/parser_py/parse.py b/parser_py/parse.py new file mode 100755 index 0000000..c7d928a --- /dev/null +++ b/parser_py/parse.py @@ -0,0 +1,1521 @@ +#!/usr/bin/python +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Parser of Logica.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import copy +import os +import re +import string +import sys +from typing import Dict, Iterator, List, Optional, Tuple +import six + +from common import color + +CLOSE_TO_OPEN = { + ')': '(', + '}': '{', + ']': '[' +} +CLOSING_PARENTHESIS = list(CLOSE_TO_OPEN.keys()) +OPENING_PARENTHESIS = list(CLOSE_TO_OPEN.values()) + +VARIABLE_CHARS_SET = set(string.ascii_lowercase) | set('_') | set(string.digits) + + +class HeritageAwareString(str): + """A string that remembers who's substring it is.""" + + def __new__(cls, content) -> 'HeritageAwareString': + if isinstance(content, str): + return str.__new__(cls, content) + assert isinstance(content, bytes), 'Unexpected content: %s' % repr(content) + return str.__new__(cls, content.decode('utf-8')) + + def __init__(self, unused_content): + self.start = 0 + self.stop = len(self) + self.heritage = str(self) + + def __getitem__(self, slice_or_index) -> 'HeritageAwareString': + if isinstance(slice_or_index, int): + return HeritageAwareString(str.__getitem__(self, slice_or_index)) + else: + assert isinstance(slice_or_index, slice) + start = slice_or_index.start or 0 + stop = ( + slice_or_index.stop if slice_or_index.stop is not None else len(self)) + return self.GetSlice(start, stop) + + def GetSlice(self, start, stop) -> 'HeritageAwareString': + substring = HeritageAwareString(str(self)[start:stop]) + if stop > len(self): + stop = len(self) + if stop < 0: + stop = len(self) - stop + substring.start = self.start + start + substring.stop = self.start + stop + substring.heritage = self.heritage + return substring + + def Pieces(self): + return (self.heritage[:self.start], + self.heritage[self.start:self.stop], + self.heritage[self.stop:]) + + +class ParsingException(Exception): + """Exception thrown by parsing.""" + + def __init__(self, message, location): + # TODO: Unify coloring approach between parsing and compiling. + message = message.replace( + '>>', color.Color('warning')).replace('<<', color.Color('end')) + super(ParsingException, self).__init__(message) + self.location = location + + def ShowMessage(self, stream=sys.stderr): + """Printing error message.""" + print(color.Format('{underline}Parsing{end}:'), file=stream) + before, error, after = self.location.Pieces() + if len(before) > 300: + before = before[-300:] + if len(after) > 300: + after = after[:300] + if not error: + error = '' + + print(color.Format('{before}{warning}{error_text}{end}{after}', + dict(before=before, + error_text=error, + after=after)), file=stream) + print( + color.Format('\n[ {error}Error{end} ] ') + str(self), file=stream) + + +def FunctorSyntaxErrorMessage(): + return ( + 'Incorrect syntax for functor call. ' + 'Functor call to be made as\n' + ' R := F(A: V, ...)\n' + 'or\n' + ' @Make(R, F, {A: V, ...})\n' + 'Where R, F, A\'s and V\'s are all ' + 'predicate names.') + + +def Traverse(s): + """Traversing the string, yielding indices with the state of parentheses. + + Args: + s: Logica. + + Yields: + (index in the string, + state of how many parenthesis do we have open, + status 'OK' or 'Unmatched ') + If 'Unmatched' status is yielded the program has a syntax error and compiler + should inform the user. Yielding 'Unmatched' terminates the iterator. + """ + state = '' + def State(): + if not state: + return '' + return state[-1] + + idx = -1 + while idx + 1 < len(s): + idx += 1 + c = s[idx] + c2 = s[idx:(idx + 2)] # For /*, */. + c3 = s[idx:(idx + 3)] # For """. + + # Deal with strings (without escape). + # TODO: Deal with string escaping. + track_parenthesis = True + + # First see if we are in a comment or a string. + if State() == '#': + track_parenthesis = False + if c == '\n': + state = state[:-1] + else: + # Comments are invisible to compiler. + continue + elif State() == '"': + track_parenthesis = False + if c == '\n': + yield (idx, None, 'EOL in string') + if c == '"': + state = state[:-1] + elif State() == '`': + track_parenthesis = False + if c == '`': + state = state[:-1] + elif State() == '3': + track_parenthesis = False + if c3 == '"""': + state = state[:-1] + yield (idx, state, 'OK') + idx += 1 + yield (idx, state, 'OK') + idx += 1 + elif State() == '/': + track_parenthesis = False + if c2 == '*/': + state = state[:-1] + idx += 1 + # Comments are invisible to compiler. + continue + else: + # We are neither in comment nor in string. + if c == '#': + state += '#' + # Comments are invisible to compiler. + continue + elif c3 == '"""': + state += '3' + yield (idx, state, 'OK') + idx += 1 + yield (idx, state, 'OK') + idx += 1 + elif c == '"': + state += '"' + elif c == '`': + state += '`' + elif c2 == '/*': + state += '/' + idx += 1 + # Comments are invisible to compiler. + continue + + if track_parenthesis: + if c in OPENING_PARENTHESIS: + state += c + elif c in CLOSING_PARENTHESIS: + if state and state[-1] == CLOSE_TO_OPEN[c]: + state = state[:-1] + else: + yield (idx, None, 'Unmatched') + break + yield (idx, state, 'OK') + + +def RemoveComments(s): + chars = [] + for idx, unused_state, status in Traverse(s): + if status == 'Unmatched': + raise ParsingException('Parenthesis matches nothing.', s[idx:idx+1]) + elif status == 'EOL in string': + raise ParsingException('End of line in string.', s[idx:idx]) + assert status == 'OK' + chars.append(s[idx]) + return ''.join(chars) + + +def IsWhole(s): + """String is 'whole' if all parenthesis match.""" + status = 'OK' + for (_, _, status) in Traverse(s): + pass + return status == 'OK' + + +def ShowTraverse(s): + """Showing states of traverse. + + A debugging tool. + Args: + s: string with Logica. + """ + for idx, state, status in Traverse(s): + print('-----') + print(s) + print(' ' * idx + '^ ~%s~/%s' % (state, status)) + + +def Strip(s): + """Removing outer parenthesis and spaces.""" + while True: + s = StripSpaces(s) + if (len(s) >= 2 and s[0] == '(' and s[-1] == ')' and + IsWhole(s[1:-1])): + s = s[1:-1] + else: + return s + + +def StripSpaces(s): + left_idx = 0 + right_idx = len(s) - 1 + while left_idx < len(s) and s[left_idx] in [' ', '\n']: + left_idx += 1 + while right_idx > left_idx and s[right_idx] in [' ', '\n']: + right_idx -= 1 + return s[left_idx:right_idx + 1] + + +def SplitRaw(s, separator): + """Splits the string on separator, respecting parenthesis. + + This is cornerstone of parsing. + Example: Split("[a,b],[c,d]", ",") == ["[a,b]", "[c,d]"]. + + Args: + s: String with Logica. + separator: Separator to split on. + Returns: + A list of parts of the string. + Raises: + ParsingException: When parenthesis don't match. + """ + parts = [] + l = len(separator) + traverse = Traverse(s) + part_start = 0 + for idx, state, status in traverse: + # TODO: This should be thrown by Traverse. + if status != 'OK': + raise ParsingException('Parenthesis matches nothing.', s[idx:idx+1]) + # TODO: This a terrible hack to avoid parsing || as two |. Maybe + # we should tokenize at some point. + if not state and s[idx:(idx + l)] == separator and ( + len(s) == idx + l or s[idx + l] != '|') and ( + idx == 0 or s[idx - 1] != '|'): + # TODO: Treat tuples properly. + parts.append(s[part_start:idx]) + for _ in range(l - 1): + idx, state, status = next(traverse) + part_start = idx + 1 + parts.append(s[part_start:]) + return parts + + +def Split(s, separator): + parts = SplitRaw(s, separator) + return [Strip(p) for p in parts] + + +def SplitInTwo(s, separator): + """Splits the string in two or dies. Makes python typing happy.""" + parts = Split(s, separator) + if len(parts) != 2: + raise ParsingException( + 'I expected string to be split by >>%s<< in two.' % separator, s) + + return (parts[0], parts[1]) + + +def SplitInOneOrTwo(s, separator): + """Splits the string in one or two. Makes python typing happy.""" + parts = Split(s, separator) + if len(parts) == 1: + return ((parts[0],), None) + elif len(parts) == 2: + return (None, (parts[0], parts[1])) + else: + raise ParsingException( + 'String should have been split by >>%s<< in 1 or 2 pieces.' % ( + separator), s) + + +def SplitMany(ss: List[HeritageAwareString], + separator: str) -> List[HeritageAwareString]: + """Splits the list of strings by the separator, flattening the result.""" + result = [] + for s in ss: + result.extend(Split(s, separator)) + return result + + +def SplitOnWhitespace(s: HeritageAwareString) -> List[HeritageAwareString]: + """Split the string by whitespace. + + Like Split, does not split inside quoted strings and parentheses. Only return + non-empty parts. + """ + ss = [s] + for separator in ' \n\t': + ss = SplitMany(ss, separator) + return [chunk for chunk in ss if chunk] + +############################################ +# +# Parsing functions. +# + +def ParseRecord(s): + s = Strip(s) + if (len(s) >= 2 and + s[0] == '{' and + s[-1] == '}' and + IsWhole(s[1:-1])): + return ParseRecordInternals(s[1:-1], is_record_literal=True) + + +def ParseRecordInternals(s, + is_record_literal = False): + """Parsing internals of a record.""" + s = Strip(s) + if len(Split(s, ':-')) > 1: + raise ParsingException( + 'Unexpected >>:-<< in record internals. ' + 'If you apply a function to a >>combine<< statement, place it in ' + 'auxiliary variable first.', location=s) + if not s: + return {'field_value': []} + result = [] + if IsWhole(s): + field_values = Split(s, ',') + had_restof = False + positional_ok = True + observed_fields = [] + for idx, field_value in enumerate(field_values): + if had_restof: + raise ParsingException('Field >>..<< must go last.', + field_value) + if field_value.startswith('..'): + if is_record_literal: + raise ParsingException('Field >>.. in record literals<< ' + 'is not currently suppported .', field_value) + item = { + 'field': '*', + 'value': {'expression': ParseExpression(field_value[2:])} + } + if observed_fields: + item['except'] = observed_fields + result.append(item) + had_restof = True + positional_ok = False + continue + (_, colon_split) = SplitInOneOrTwo(field_value, ':') + if colon_split: + positional_ok = False + field, value = colon_split + + observed_field = field + if not value: + value = field + if field and field[0] in string.ascii_uppercase: + raise ParsingException('Record fields may not start with capital ' + 'letter, as it is reserved for predicate ' + 'literals.\nBacktick the field name if ' + 'you need it capitalized. ' + 'E.g. "Q(`A`: 1)".', + field) + + if field and field[0] == '`': + raise ParsingException('Backticks in variable names are ' + 'disallowed. Please give an explicit ' + 'variable for the value of the column.', + field) + + result.append({ + 'field': field, + 'value': { + 'expression': ParseExpression(value) + } + }) + else: + (_, question_split) = SplitInOneOrTwo(field_value, '?') + if question_split: + positional_ok = False + field, value = question_split + observed_field = field + if not field: + raise ParsingException('Aggregated fields have to be named.', + field_value) + operator, expression = SplitInTwo(value, '=') + operator = Strip(operator) + result.append( + { + 'field': field, + 'value': { + 'aggregation': { + 'operator': operator, + 'argument': ParseExpression(expression) + } + } + }) + else: + if positional_ok: + result.append( + { + 'field': idx, + 'value': { + 'expression': ParseExpression(field_value) + } + }) + # It's not ideal that we hardcode 'col%d' logic here. + observed_field = 'col%d' % idx + else: + raise ParsingException( + 'Positional argument can not go after non-positional ' + 'arguments.', field_value) + observed_fields.append(observed_field) + + return {'field_value': result} + + +def ParseVariable(s: HeritageAwareString): + if (s and s[0] in set(string.ascii_lowercase) | set('_') and + set(s) <= VARIABLE_CHARS_SET): + return {'var_name': s} + + +def ParseNumber(s: HeritageAwareString): + if s[-1:] == 'u': + s = s[:-1] + try: + float(s) + except ValueError: + return None + return {'number': s} + + +# TODO: Do this right, i.e. account for escaping and quotes in between. +def ParseString(s): + if (len(s) >= 2 and + s[0] == '"' and + s[-1] == '"' and + '"' not in s[1:-1]): + return {'the_string': s[1:-1]} + if (len(s) >= 6 and + s[:3] == '"""' and + s[-3:] == '"""' and + '"""' not in s[3:-3]): + return {'the_string': s[3:-3]} + + +def ParseBoolean(s): + if s in ['true', 'false']: + return {'the_bool': s} + + +def ParseNull(s): + if s == 'null': + return {'the_null': s} + + +def ParseList(s): + """Parsing List literal.""" + if len(s) >= 2 and s[0] == '[' and s[-1] == ']' and IsWhole(s[1:-1]): + inside = Strip(s[1:-1]) + if not inside: + elements = [] + else: + elements_str = Split(inside, ',') + elements = [ParseExpression(e) for e in elements_str] + return {'element': elements} + else: + return None + + +def ParsePredicateLiteral(s): + if (s == '++?' or + s and + set(s) <= + set(string.ascii_letters) | set(string.digits) | set(['_']) and + s[0] in string.ascii_uppercase): + return {'predicate_name': s} + + +def ParseLiteral(s): + """Parses a literal.""" + v = ParseNumber(s) + if v: + return {'the_number': v} + v = ParseString(s) + if v: + return {'the_string': v} + v = ParseList(s) + if v: + return {'the_list': v} + v = ParseBoolean(s) + if v: + return {'the_bool': v} + v = ParseNull(s) + if v: + return {'the_null': v} + v = ParsePredicateLiteral(s) + if v: + return {'the_predicate': v} + + +def ParseInfix(s): + """Parses an infix operator expression.""" + unary_operators = ['-', '!'] + for op in ['||', '&&', '->', '==', '<=', '>=', '<', '>', '!=', + '++?', '++', '+', '-', '*', '/', '%', '^', ' in ', '!']: + parts = SplitRaw(s, op) + if len(parts) > 1: + # Right is the rightmost operand and left are all the other operands. + # This way we parse as follows: + # a / b / c -> (a / b) / c + left, right = ( + s[:parts[-2].stop - s.start], s[parts[-1].start - s.start:]) + left = Strip(left) + right = Strip(right) + if op in unary_operators and not left: + return { + 'predicate_name': op, + 'record': ParseRecordInternals(right) + } + + left_expr = ParseExpression(left) + right_expr = ParseExpression(right) + return { + 'predicate_name': op.strip(), + 'record': { + 'field_value': [ + { + 'field': 'left', + 'value': {'expression': left_expr} + }, + { + 'field': 'right', + 'value': {'expression': right_expr} + } + ] + } + } + + +def BuildTreeForCombine(parsed_expression, operator, parsed_body, full_text): + """Construct a tree for a combine expression from the parsed components.""" + aggregated_field_value = { + 'field': 'logica_value', + 'value': { + 'aggregation': { + 'operator': operator, + 'argument': parsed_expression + } + } + } + result = { + 'head': { + 'predicate_name': 'Combine', + 'record': { + 'field_value': [aggregated_field_value] + } + }, + 'distinct_denoted': True, + 'full_text': full_text + } + if parsed_body: + result['body'] = {'conjunction': parsed_body} + return result + + +def ParseCombine(s: HeritageAwareString): + """Parsing 'combine' expression.""" + if s.startswith('combine '): + s = s[len('combine '):] + _, value_body = SplitInOneOrTwo(s, ':-') + if value_body: + value, body = value_body + else: + value = s + body = None + operator, expression = SplitInTwo(value, '=') + operator = Strip(operator) + parsed_expression = ParseExpression(expression) + parsed_body = ParseConjunction(body, allow_singleton=True) if body else None + return BuildTreeForCombine(parsed_expression, operator, parsed_body, s) + + +def ParseConciseCombine(s: HeritageAwareString): + """Parses a concise 'combine' expression. + + A concise combine expression consists is of the form 'x Op= expr' or 'x Op= + expr :- body', where x must be a variable. It is equivalent to 'x == (combine + Op= expr)' or 'x == (combine Op= expr :- body)' respectively. + """ + parts = Split(s, '=') + if len(parts) == 2: + lhs_and_op, combine = parts + left_parts = SplitOnWhitespace(lhs_and_op) + if len(left_parts) > 1: + lhs = s[:left_parts[-2].stop - s.start] + operator = left_parts[-1] + # These operators actually arise from comparison expressions; if we get + # them here, we should bail out. + prohibited_operators = ['!', '<', '>'] + if operator in prohibited_operators: + return None + left_expr = ParseExpression(lhs) + _, expression_body = SplitInOneOrTwo(combine, ':-') + if expression_body: + expression, body = expression_body + else: + expression = combine + body = None + parsed_expression = ParseExpression(expression) + parsed_body = ParseConjunction( + body, allow_singleton=True) if body else None + right_expr = BuildTreeForCombine(parsed_expression, operator, parsed_body, + s) + return { + 'left_hand_side': left_expr, + 'right_hand_side': { + 'combine': right_expr + } + } + + + +def ParseImplication(s): + """Parses implication expression.""" + if s.startswith('if ') or s.startswith('if\n'): + inner = s[3:] + if_thens = Split(inner, 'else if') + (last_if_then, last_else) = SplitInTwo(if_thens[-1], 'else') + if_thens[-1] = last_if_then + result_if_thens = [] + for condition_concequence in if_thens: + condition, consequence = SplitInTwo(condition_concequence, 'then') + result_if_thens.append({ + 'condition': ParseExpression(condition), + 'consequence': ParseExpression(consequence) + }) + last_else_parsed = ParseExpression(last_else) + return {'if_then': result_if_thens, 'otherwise': last_else_parsed} + + +def ParseExpression(s): + """Parsing logica.Expression.""" + v = ParseCombine(s) + if v: + return {'combine': v} + v = ParseImplication(s) + if v: + return {'implication': v} + v = ParseLiteral(s) + if v: + return {'literal': v} + v = ParseVariable(s) + if v: + return {'variable': v} + v = ParseRecord(s) + if v: + return {'record': v} + v = ParseCall(s) + if v: + return {'call': v} + v = ParseInfix(s) + if v: + return {'call': v} + v = ParseSubscript(s) + if v: + return {'subscript': v} + v = ParseNegationExpression(s) + if v: + return v # ParseNegationExpression returns an expression. + + raise ParsingException('Could not parse expression of a value.', s) + + +def ParseInclusion(s): + element_list_str = Split(s, ' in ') + if len(element_list_str) == 2: + return {'list': ParseExpression(element_list_str[1]), + 'element': ParseExpression(element_list_str[0])} + + +def ParseCall(s): + """Parsing logica.PredicateCall.""" + s = Strip(s) + predicate = '' + idx = 0 + if not s: + return None + for (idx, state, status) in Traverse(s): + assert status == 'OK' + if state == '(': + good_chars = ( + set(string.ascii_letters) | + set(['@', '_', '.', '$', '{', '}', '+', '-', '`']) | + set(string.digits)) + if ((idx > 0 and set(s[:idx]) <= good_chars) or + s[:idx] == '!' or + s[:idx] == '++?' or + idx >= 2 and s[0] == '`' and s[idx - 1] == '`'): + predicate = s[:idx] + break + else: + return None + if state and state != '{' and state[0] != '`': + return None + else: + return None + if (s[idx] == '(' and + s[-1] == ')' and + IsWhole(s[idx + 1:-1])): + return {'predicate_name': predicate, + 'record': ParseRecordInternals(s[idx + 1: -1])} + + +def ParseUnification(s): + parts = Split(s, '==') + if len(parts) == 2: + left, right = (parts[0], parts[1]) + left_expr = ParseExpression(left) + right_expr = ParseExpression(right) + return {'left_hand_side': left_expr, + 'right_hand_side': right_expr} + + +def ParseProposition(s): + """Parsing logica.ExistentialFormula.""" + c = ParseDisjunction(s) + if c: + return {'disjunction': c} + str_conjuncts = Split(s, ',') + c = ParseConjunction(s, allow_singleton=False) + if len(str_conjuncts) > 1: + return {'conjunction': c} + + c = ParseImplication(s) + if c: + raise ParsingException('If-then-else clause is only supported as an ' + 'expression, not as a proposition.', s) + c = ParseCall(s) + if c: + return {'predicate': c} + c = ParseUnification(s) + if c: + return {'unification': c} + c = ParseInclusion(s) + if c: + return {'inclusion': c} + c = ParseConciseCombine(s) + if c: + return {'unification': c} # x f= (...) parses to x == (combine f= ...) + c = ParseInfix(s) + if c: + return {'predicate': c} + c = ParseNegation(s) + if c: + return c # ParseNegation returns a proposition. + raise ParsingException('Could not parse proposition.', s) + + +def ParseConjunction(s, allow_singleton=False): + str_conjuncts = Split(s, ',') + if len(str_conjuncts) == 1 and not allow_singleton: + return None + conjuncts = [] + for c in str_conjuncts: + c = ParseProposition(c) + conjuncts.append(c) + return {'conjunct': conjuncts} + + +def ParseDisjunction(s): + str_disjuncts = Split(s, '|') + if len(str_disjuncts) == 1: + return None + disjuncts = [] + for d in str_disjuncts: + d = ParseProposition(d) + disjuncts.append(d) + return {'disjunct': disjuncts} + + +def ParseNegationExpression(s: HeritageAwareString): + proposition = ParseNegation(s) + if not proposition: + return None + expression = {'call': proposition['predicate']} + return expression + + +def ParseNegation(s: HeritageAwareString): + """Parsing negation as IsNull(combine...) expression.""" + space_and_negated = Split(s, '~') + if len(space_and_negated) == 1: + return None + if len(space_and_negated) != 2 or space_and_negated[0]: + raise ParsingException('Negation "~" is a unary operator.', s) + _, negated = space_and_negated + negated = Strip(negated) + # TODO: It so happened that body of the predicate has to be a + # conjunction. This should probably be simplified, any proposition + # should be allowed to be a body. + negated_proposition = { + 'conjunction': ParseConjunction(negated, allow_singleton=True) + } + + number_one = { + 'literal': { + 'the_number': { + 'number': '1' + } + } + } + # Returning syntax tree of IsNull(combine Min= 1 :- ) + return { + 'predicate': { + 'predicate_name': 'IsNull', + 'record': { + 'field_value': [{ + 'field': 0, + 'value': { + 'expression': { + 'combine': { + 'body': negated_proposition, + 'distinct_denoted': True, + 'full_text': s, + 'head': { + 'predicate_name': 'Combine', + 'record': { + 'field_value': [{ + 'field': 'logica_value', + 'value': { + 'aggregation': { + 'operator': 'Min', + 'argument': number_one + } + } + }] + } + } + } + } + } + }] + } + } + } + + +def ParseSubscript(s: HeritageAwareString): + """Parsing subscript expression.""" + str_path = Split(s, '.') + if len(str_path) >= 2: + record_str = s[:(str_path[-2].stop - s.start)] + record_str_doublecheck = '.'.join(str_path[:-1]) + assert record_str == record_str_doublecheck, 'This should not happen.' + record = ParseExpression(record_str) + if not set(str_path[-1]) <= (set(string.ascii_lowercase) | set('_') + | set(string.digits)): + raise ParsingException('Subscript must be lowercase.', s) + subscript = {'literal': {'the_symbol': {'symbol': str_path[-1]}}} + return {'record': record, 'subscript': subscript} + + +def ParseHeadCall(s): + """Parsing rule head, excluding 'distinct'.""" + saw_open = False + idx = -1 + for idx, state, status in Traverse(s): + if status != 'OK': + raise ParsingException('Parenthesis matches nothing.', s[idx:idx+1]) + if state == '(': + saw_open = True + if saw_open and not state: + break + else: + raise ParsingException('Found no call in rule head.', s) + assert idx > 0 + call_str = s[:(idx + 1)] + post_call_str = s[idx + 1:] + call = ParseCall(call_str) + if not call: + raise ParsingException('Could not parse predicate call.', call_str) + operator_expression = Split(post_call_str, '=') + if len(operator_expression) == 1: + if operator_expression[0]: + raise ParsingException('Unexpected text in the head of a rule.', + operator_expression[0]) + return (call, False) + # We have a value! + if len(operator_expression) > 2: + raise ParsingException('Too many \'=\' in predicate value.', post_call_str) + + assert len(operator_expression) == 2 + operator_str, expression_str = (operator_expression[0], + operator_expression[1]) + + if not operator_str: + call['record']['field_value'].append({ + 'field': 'logica_value', + 'value': {'expression': ParseExpression(expression_str)} + }) + return (call, False) + + aggregated_field_value = { + 'field': 'logica_value', + 'value': { + 'aggregation': { + 'operator': operator_str, + 'argument': ParseExpression(expression_str) + } + } + } + call['record']['field_value'].append(aggregated_field_value) + + return (call, True) + + +def ParseFunctorRule(s): + """Parsing functor rule, converting to '@Make' form.""" + parts = Split(s, ':=') + if len(parts) != 2: + return None + new_predicate = ParseExpression(parts[0]) + definition_expr = ParseExpression(parts[1]) + if 'call' not in definition_expr: + raise ParsingException(FunctorSyntaxErrorMessage(), parts[1]) + definition = definition_expr['call'] + if ('literal' not in new_predicate or + 'the_predicate' not in new_predicate['literal']): + raise ParsingException(FunctorSyntaxErrorMessage(), parts[0]) + + applicant = { + 'expression': { + 'literal': { + 'the_predicate': { + 'predicate_name': definition['predicate_name'] + } + } + } + } + arguments = {'expression': {'record': definition['record']}} + rule = { + 'full_text': s, + 'head': { + 'predicate_name': '@Make', + 'record': { + 'field_value': [ + {'field': 0, 'value': {'expression': new_predicate}}, + {'field': 1, 'value': applicant}, + {'field': 2, 'value': arguments} + ] + } + } + } + return rule + + +def ParseFunctionRule(s: HeritageAwareString) -> Optional[List[Dict]]: + """Parsing functor rule, converting to '@Make' form.""" + parts = SplitRaw(s, '-->') + if len(parts) != 2: + return None + this_predicate_call = ParseCall(parts[0]) + if not this_predicate_call: + raise ParsingException('Left hand side of function definition must be ' + 'a predicate call.', parts[0]) + annotation = ( + ParseRule(HeritageAwareString( + '@CompileAsUdf(%s)' % this_predicate_call['predicate_name']))) + rule = ParseRule(HeritageAwareString(parts[0] + ' = ' + parts[1])) + return [annotation, rule] + + +def ParseRule(s: HeritageAwareString) -> Dict: + """Parsing logica.Logica.""" + parts = Split(s, ':-') + if len(parts) > 2: + raise ParsingException('Too many :- in a rule. ' + 'Did you forget >>semicolon<>distinct<< is used.', head) + parsed_head_call, is_distinct = ParseHeadCall(head_distinct[0]) + result = {'head': parsed_head_call, + 'distinct_denoted': True} + if len(parts) == 2: + body = parts[1] + result['body'] = {'conjunction': ParseConjunction(body, + allow_singleton=True)} + result['full_text'] = s # For error messages. + return result + + +################################## +# Parsing the file and imports. +# + + +def SplitImport(import_str): + """Splitting import statement into (path, predicate, synonym).""" + # TODO: It's not ideal to rely on percise spaces. + import_path_synonym = Split(import_str, ' as ') + if len(import_path_synonym) > 2: + raise ParsingException('Too many "as":' % import_str, + HeritageAwareString(import_str)) + import_path = import_path_synonym[0] + if len(import_path_synonym) == 2: + synonym = import_path_synonym[1] + else: + synonym = None + import_parts = import_path.split('.') + assert import_parts[-1][0].upper() == import_parts[-1][0], ( + 'One import per predicate please. Violator: %s', import_str) + return ('.'.join(import_parts[:-1]), import_parts[-1], synonym) + + +def ParseImport(file_import_str, parsed_imports): + """Parses an import, returns extracted rules.""" + file_import_parts = file_import_str.split('.') + file_path = '/'.join(file_import_parts) + '.l' + if file_import_str in parsed_imports: + return None + parsed_imports[file_import_str] = None + if not os.path.exists(file_path): + raise ParsingException('Imported file not found: %s.' % file_path, + HeritageAwareString(file_import_str)) + file_content = open(file_path).read() + parsed_file = ParseFile(file_content, file_import_str, parsed_imports) + parsed_imports[file_import_str] = parsed_file + return parsed_file + + +def DefinedPredicatesRules(rules): + result = {} + for r in rules: + name = r['head']['predicate_name'] + defining_rules = result.get(name, []) + defining_rules.append(r) + result[name] = defining_rules + return result + + +def MadePredicatesRules(rules): + result = {} + for r in rules: + if '@Make' == r['head']['predicate_name']: + name = r['head']['record']['field_value'][0]['value'][ + 'expression']['literal']['the_predicate']['predicate_name'] + result[name] = r + return result + + +def DefinedPredicates(rules): + return set(DefinedPredicatesRules(rules)) + + +def MadePredicates(rules): + return set(MadePredicatesRules(rules)) + + +def RenamePredicate(e, old_name, new_name): + """Renames predicate in a syntax tree.""" + renames_count = 0 + if isinstance(e, dict): + if 'predicate_name' in e and e['predicate_name'] == old_name: + e['predicate_name'] = new_name + renames_count += 1 + # Field names are treated as predicate names for functors. + if 'field' in e and e['field'] == old_name: + e['field'] = new_name + renames_count += 1 + if isinstance(e, dict): + for k in e: + if isinstance(e[k], dict) or isinstance(e[k], list): + renames_count += RenamePredicate(e[k], old_name, new_name) + if isinstance(e, list): + for idx in range(len(e)): + if isinstance(e[idx], dict) or isinstance(e[idx], list): + renames_count += RenamePredicate(e[idx], old_name, new_name) + return renames_count + + +class MultiBodyAggregation(object): + """This is a namespace for multi-body-aggregation processing functions.""" + + SUFFIX = '_MultBodyAggAux' + + @classmethod + def Rewrite(cls, rules): + """Enabling multi-body-aggregation via auxiliary predicates.""" + rules = copy.deepcopy(rules) + new_rules = [] + defined_predicates_rules = DefinedPredicatesRules(rules) + multi_body_aggregating_predicates = [ + n for n, rs in defined_predicates_rules.items() + if len(rs) > 1 and 'distinct_denoted' in rs[0]] + aggregation_field_values_per_predicate = {} + for rule in rules: + name = rule['head']['predicate_name'] + if name in multi_body_aggregating_predicates: + aggregation, new_rule = cls.SplitAggregation(rule) + if name in aggregation_field_values_per_predicate: + expected_aggregation = aggregation_field_values_per_predicate[name] + if expected_aggregation != aggregation: + raise ParsingException( + 'Signature differs for bodies of >>%s<<. ' + 'Signatures observed: >>%s<<' % (name, + str((expected_aggregation, + aggregation))), + HeritageAwareString(rule['full_text'])) + else: + aggregation_field_values_per_predicate[name] = aggregation + new_rules.append(new_rule) + else: + new_rules.append(rule) + for name in multi_body_aggregating_predicates: + pass_field_values = [ + { + 'field': f_v['field'], + 'value': { + 'expression': { + 'variable': { + 'var_name': f_v['field'] + } + } + } + } + for f_v in aggregation_field_values_per_predicate[name]] + aggregating_rule = { + 'head': { + 'predicate_name': name, + 'record': { + 'field_value': aggregation_field_values_per_predicate[name] + } + }, + 'body': { + 'conjunction': { + 'conjunct': [{ + 'predicate': { + 'predicate_name': name + cls.SUFFIX, + 'record': { + 'field_value': pass_field_values + } + } + }] + } + }, + 'full_text': 'automatically built', + 'distinct_denoted': True + } + new_rules.append(aggregating_rule) + return new_rules + + @classmethod + def SplitAggregation(cls, rule): + """Replacing aggregations with their arguments.""" + rule = copy.deepcopy(rule) + if 'distinct_denoted' not in rule: + raise ParsingException('Inconsistency in >>distinct<< denoting for ' + 'predicate >>%s<<.' % + rule['head']['predicate_name'], + rule['full_text']) + del rule['distinct_denoted'] + rule['head']['predicate_name'] = ( + rule['head']['predicate_name'] + cls.SUFFIX) + transformation_field_values = [] + aggregation_field_values = [] + for field_value in rule['head']['record']['field_value']: + if 'aggregation' in field_value['value']: + aggregation_field_value = { + 'field': field_value['field'], + 'value': { + 'aggregation': { + 'operator': field_value['value']['aggregation']['operator'], + 'argument': { + 'variable': { + 'var_name': field_value['field'] + } + } + } + } + } + new_field_value = {} + new_field_value['field'] = field_value['field'] + new_field_value['value'] = { + 'expression': field_value['value']['aggregation']['argument'] + } + transformation_field_values.append(new_field_value) + aggregation_field_values.append(aggregation_field_value) + else: + aggregation_field_value = { + 'field': field_value['field'], + 'value': { + 'expression': { + 'variable': { + 'var_name': field_value['field'] + } + } + } + } + aggregation_field_values.append(aggregation_field_value) + transformation_field_values.append(field_value) + rule['head']['record']['field_value'] = transformation_field_values + return (aggregation_field_values, rule) + + +class DisjunctiveNormalForm(object): + """This is namespace for transforming rules to DNF.""" + + @classmethod + def ConjunctionOfDnfs(cls, dnfs): + """Returning DNF which is a conjunction of given DNFs.""" + if len(dnfs) == 1: + return dnfs[0] + + result = [] + first_dnf = dnfs[0] + other_dnfs = dnfs[1:] + + for a in first_dnf: + for b in cls.ConjunctionOfDnfs(other_dnfs): + result.append(a + b) + return result + + @classmethod + def ConjunctsToDNF(cls, conjuncts: List[Dict]) -> List[List[Dict]]: + dnfs = list(map(cls.PropositionToDNF, conjuncts)) + result = cls.ConjunctionOfDnfs(dnfs) + + return result + + @classmethod + def DisjunctsToDNF(cls, disjuncts: List[Dict]) -> List[List[Dict]]: + dnfs = list(map(cls.PropositionToDNF, disjuncts)) + result = [] + for d in dnfs: + result += d + return result + + @classmethod + def PropositionToDNF(cls, proposition): + if 'conjunction' in proposition: + return cls.ConjunctsToDNF(proposition['conjunction']['conjunct']) + if 'disjunction' in proposition: + return cls.DisjunctsToDNF(proposition['disjunction']['disjunct']) + return [[proposition]] + + @classmethod + def RuleToRules(cls, rule): + """Eliminating disjunction in the rule via DNF rewrite.""" + if 'body' not in rule: + return [rule] + proposition = rule['body'] + dnf = cls.PropositionToDNF(proposition) + result = [] + for conjuncts in dnf: + new_rule = copy.deepcopy(rule) + new_rule['body']['conjunction']['conjunct'] = copy.deepcopy(conjuncts) + result.append(new_rule) + return result + + @classmethod + def Rewrite(cls, rules): + result = [] + for rule in rules: + result.extend(cls.RuleToRules(rule)) + return result + + +class AggergationsAsExpressions(object): + """Namespace for rewriting aggregation internals as expressions.""" + + @classmethod + def AggregationOperator(cls, raw_operator): + if raw_operator == '+': + return 'Agg+' + if raw_operator == '++': + return 'Agg++' + return raw_operator + + @classmethod + def Convert(cls, a): + return { + 'call': { + 'predicate_name': cls.AggregationOperator(a['operator']), + 'record': { + 'field_value': [ + { + 'field': 0, + 'value': { + 'expression': a['argument'] + } + } + ] + } + } + } + + @classmethod + def RewriteInternal(cls, s): + """Replacing aggregation operator and argument with an expression.""" + if isinstance(s, dict): + member_index = sorted(s.keys()) + elif isinstance(s, list): + member_index = list(range(len(s))) + else: + assert False, 'Rewrite should be called on list or dict. Got: %s' % str(s) + + for k in member_index: + if (isinstance(s[k], dict) and + 'aggregation' in s[k]): + a = s[k]['aggregation'] + a['expression'] = cls.Convert(a) + del a['operator'] + del a['argument'] + + if isinstance(s, dict) or isinstance(s, list): + for k in member_index: + if isinstance(s[k], dict) or isinstance(s[k], list): + cls.RewriteInternal(s[k]) + + @classmethod + def Rewrite(cls, rules): + rules = copy.deepcopy(rules) + cls.RewriteInternal(rules) + return rules + + +def ParseFile(s, this_file_name=None, parsed_imports=None): + """Parsing logica.Logica.""" + s = HeritageAwareString(RemoveComments(HeritageAwareString(s))) + parsed_imports = parsed_imports or {} + this_file_name = this_file_name or 'main' + str_statements = Split(s, ';') + rules = [] + imported_predicates = [] + predicates_created_by_import = {} + for str_statement in str_statements: + if not str_statement: + continue + if str_statement.startswith('import'): + import_str = str_statement[len('import '):] + file_import_str, import_predicate, synonym = SplitImport(import_str) + ParseImport(file_import_str, parsed_imports) + imported_predicates.append({ + 'file': file_import_str, 'predicate_name': import_predicate, + 'synonym': synonym}) + if file_import_str not in predicates_created_by_import: + predicates_created_by_import[file_import_str] = ( + DefinedPredicates(parsed_imports[file_import_str]['rule']) | + MadePredicates(parsed_imports[file_import_str]['rule'])) + continue + + rule = None + annotation_and_rule = ParseFunctionRule(HeritageAwareString(str_statement)) + if annotation_and_rule: + annotation, rule = annotation_and_rule + rules.append(annotation) + if not rule: + rule = ParseFunctorRule(HeritageAwareString(str_statement)) + if not rule: + rule = ParseRule(HeritageAwareString(str_statement)) + + if rule: + rules.append(rule) + # Eliminate explicit disjunctions via DNF reduction. + rules = DisjunctiveNormalForm.Rewrite(rules) + # Multibody aggregation uses concise aggregation structure. + rules = MultiBodyAggregation.Rewrite(rules) + # Concise structure is no longer needed, rewriting into expressions. + rules = AggergationsAsExpressions.Rewrite(rules) + + # Building a unique among already parsed imports prefix. + if this_file_name == 'main': + this_file_prefix = '' + else: + existing_prefixes = set() + + for some_parsed_import in parsed_imports.values(): + if some_parsed_import: + assert some_parsed_import[ + 'predicates_prefix'] not in existing_prefixes + existing_prefixes.add(some_parsed_import['predicates_prefix']) + parts = this_file_name.split('.') + idx = -1 + this_file_prefix = parts[idx] + '_' + while this_file_prefix in existing_prefixes: + idx -= 1 + assert idx > 0, ( + 'It looks like some of import paths are equal modulo ' + 'symbols _ and /. This confuses me: %s' % this_file_prefix) + this_file_prefix = parts[idx] + this_file_prefix + + # Renaming predicates, adding file prefix to them. + if this_file_name != 'main': + for p in DefinedPredicates(rules) | MadePredicates(rules): + if p[0] != '@' and p != '++?': + RenamePredicate(rules, p, this_file_prefix + p) + for s in imported_predicates: + imported_predicate_file = s['file'] + import_prefix = parsed_imports[ + imported_predicate_file]['predicates_prefix'] + assert import_prefix, ( + 'Empty import prefix: %s -> %s' % ( + imported_predicate_file, + parsed_imports[imported_predicate_file])) + imported_predicate_name = s['predicate_name'] + predicate_imported_as = s['synonym'] or imported_predicate_name + rename_count = RenamePredicate(rules, + predicate_imported_as, + import_prefix + imported_predicate_name) + if (import_prefix + + imported_predicate_name) not in predicates_created_by_import[ + imported_predicate_file]: + raise ParsingException( + 'Predicate %s from file %s is imported by %s, but is not defined.' % ( + imported_predicate_name, imported_predicate_file, + this_file_name), + HeritageAwareString( + imported_predicate_file + ' -> ' + imported_predicate_name)) + + if not rename_count: + raise ParsingException( + 'Predicate %s from file %s is imported by %s, but not used.' % ( + imported_predicate_name, imported_predicate_file, + this_file_name), + HeritageAwareString( + imported_predicate_file + ' -> ' + predicate_imported_as)) + + # If this is main file, then it's time to assemble all the rules together. + if this_file_name == 'main': + defined_predicates = DefinedPredicates(rules) + main_defined_predicates = copy.deepcopy(defined_predicates) + for i in parsed_imports.values(): + new_predicates = DefinedPredicates(i['rule']) + if any(p[0] != '@' for p in defined_predicates & new_predicates): + raise ParsingException( + 'Predicate from file {0} is overridden by some importer.'.format( + i['file_name']), HeritageAwareString( + str(defined_predicates & new_predicates))) + defined_predicates |= new_predicates + rules.extend(i['rule']) + + # Uncomment to debug: + # pprint.pprint(rules, stream=sys.stderr) + return {'rule': rules, + 'imported_predicates': imported_predicates, + 'predicates_prefix': this_file_prefix, + 'file_name': this_file_name} diff --git a/run_all_tests.py b/run_all_tests.py new file mode 100755 index 0000000..d51462f --- /dev/null +++ b/run_all_tests.py @@ -0,0 +1,39 @@ +#!/usr/bin/python +# +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Lint as: python3 +"""Running all integration tests.""" + +import sys +from common import logica_test +from integration_tests import run_tests as integration_tests +from integration_tests.import_tests import run_tests as import_tests + + +if 'golden_run' in sys.argv: + logica_test.TestManager.SetGoldenRun(True) + +if 'announce_tests' in sys.argv: + logica_test.TestManager.SetAnnounceTests(True) + +for a in sys.argv: + if a.startswith('test_only='): + logica_test.TestManager.SetRunOnlyTests(a.split('=')[1].split(',')) + +logica_test.PrintHeader() + +integration_tests.RunAll() +import_tests.RunAll() diff --git a/tutorial/Logica_tutorial.ipynb b/tutorial/Logica_tutorial.ipynb new file mode 100644 index 0000000..6b21d3e --- /dev/null +++ b/tutorial/Logica_tutorial.ipynb @@ -0,0 +1,36505 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "M8o3uXNEiYRw" + }, + "source": [ + "# Logica Tutorial \n", + "\n", + "\n", + "Logica is a language of Datalog family that can be compiled to StandardSQL. In most of its syntax Logica follows Yedalog, a language developed at Google earlier. Logica is created to enjoy concise clarity of logic programming and full power of SQL-based systems like BigQuery at the same time.\n", + "\n", + "Logica is semantically equivalent to StandardSQL. It is easy to write and most importantly read medium and large queries written in Logica. These querries can be compiled to StandardSQL and run on BigQuery.\n", + "\n", + "**Why learn Logica?**\n", + "\n", + "Learning new language is an investment.\n", + "Logica brings **readability and good engineering practices** common for languages like Python, C++, Java etc. to your queries.\n", + "Once you learn Logica you will be able to do the following **easily**:\n", + "\n", + "1. **Read** your queries, not just write them! Even if you wrote it a long time ago you will be able to read and recall logic very fast.\n", + "\n", + "2. **Re-use** sub-queries. Define and re-use functions.\n", + "\n", + "3. **Test** your queries.\n", + "\n", + "4. **CoLab** integration allows you to run a single, or multiple (potentially interdependent ) queries and populates Python variables with the results. This approach lets you express your data accumulation logic concisely in Logica and focus your Python code on what Python does best (visualization, timeseries analysis, machine learning etc)\n", + "\n", + "5. **Enjoy** writing queries. For the reasons above Logica is much more fun than SQL!\n", + "\n", + "In C, Python, C++, Java etc. a basic building block of your program is _function_.\n", + "\n", + "In SQL a common building block in a _query_.\n", + "\n", + "In Logica a basic building block is _predicate_.\n", + "\n", + "**Definition**: Predicate is a statement that contains variables.\n", + "\n", + "Predicate is a very general notion. Functions and queries (as well as tables) can be thought of as special kinds of predicates. \n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "zfzQ5KXCcHUC" + }, + "source": [ + "![predicates_diagram.png](data:image/png;base64,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+8W8efOW2kMMfefee+99Kd3c99lnn47m5uYXugPejmJcWYwTizHOxxMAAPRTQFxMypeMGTNm8dSpU+++5pprfu0MYtg+WUy64447njrzzDMXvu9973ugqanp+VLXHt75pa6S5sNLzuQFAIABN64YxxfjysbGxsd23nnnR//oj/7o/u9+97srOjo6nEMMWw54N912222LTzzxxPnvfOc7721oaHix+B3Kebzp0pwtCGla1ezjBQAABkdA/IMiIF6aTNY73vGOpYcddtg9F1100YMLFy5cr3SaepLjiK6++uqOL3/5y3d84AMfuHv48OFLi9+PV0pd5/B+rxhfLClnBgCAISGNeZLNStn0xcWYWwTGT44cOXL5Rz/60Tu++tWv/uJnP/vZA88///yzQiUGs3Xr1nXecsstz06fPn3JIYcccv/o0aNXFO/1l0pdpcwLu4PdvyrGxJIOzQAAUFeyn/GgUle5Z7rYLmxtbb1nt912m/fnf/7nP73iiitufeqppxYVccUmoRW15IUXXuhcsGBB5yWXXLJ+6tSpK8aPH7+yeO8+V+pqUpXuzLd1L/YkszuhpJQZAADYinHFOLQYZxXjRwkmRo4ceefee+998/HHH3/z5Zdf/t/333//smyjFIrRlzZt2tR53333vVq85x7/0pe+tHyfffZZPmLEiHXdgW7G6mLcVIzzSl1Nqsb59QUAAHZUMmjJpH2uO9i4sbGx8YFhw4Yt33333e868sgjF3znO9+5L110daJmezz00EMb/vVf//WRv/iLv7j3gx/84AOjRo16rKGh4dVS117dxXnPlbq6MWd/e0r6nbkLAAD0q+yjnNgdlFxYjJuKoOXplpaW9ePGjVty6KGH3n/GGWc8cPnll3ckOF6zZo2scZ3KwkgR5K6bPXv20vPPP/9Xxx133PwPfehDd44YMWJJ8Z55uXjvJLO7oBg/KMYZpa6M7l5+xQAAgFqX7NzkUlfDoQTG/1aMucVY3tjY+MywYcNWjRkz5r799tvvF1OnTv2vGTNm/PzHP/7xnY888siDRay0Wrg4uMqUV61a1Tl37tzOyy67bO3Xv/71FUcfffTi/fff/8HddtvtkeK1XtMd4FZKlnOubkrrk809pft94nxdAABgSAfIye4dWOrKHme/cTr0XtcdIM0vAqc7x44de/PHPvax64866qjr/+Zv/ubGq6+++uZ58+bdtbSQpr/Cz76VwDbNpq699toN3/72t58+7bTTHp0yZcrKvffee/Vb3/rWta2trS+V/nc/bkqVl5e6GlBdWYxzu1/bvMbjShpRAQAAvK4xxdi3GJ/uDqYSVKVENo2PFjY0NNxfBGGPjh49elH2Ik+aNGnB1KlT559zzjl3ff/733/45ptvfuLhhx9+KYEc/1uKnHNxf/WrXz1ZBLYPzZw5874TTzxx0Sc+8Yl799prr4d23XXXdFR+ZrPAdlWp6xihSnCb7G3KlI8ude3HHeOtCgAA0D/GdQdi2TeastrzugO1BGyLuwO4nAXb2dTUtKG5uXl1JXDO2G233f5rjz32uG3ixIk/P+SQQ27MmDZtWjnr/M1vfvM/Lr300iuTfc6YPXv2nAcffPBnS5YsWVAZyUgvX758dcb//M//PLqtwejq1avLWdaMjo6OchlxZdxwww2/Lb7vusqYPn36hrPOOmtj8ZjWJRN7+OGHr0k2tnisOc955e67774qI2XHb37zm5/aaaedfpPy4/b29rU9gtmeAW2el5Slpzz9e92LCyd2P4cHdj+nGk0BAAAMkaC5MiZ0B32VkW7Xx/cY5/YY53cH15VxU3cgWRnLuwPMjDWbBZ+vNzb1+HdbGvM3+z4/6v7+3+/x2E7sfryf6/GzjBPMAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9e7/A8f6z2EpBK7BAAAAAElFTkSuQmCC)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "OwMOonQIbxK8" + }, + "source": [ + "\n", + "Thus Logica can easily express logic of SQL queries. Logica can also express computational instructions by defining functions and auxiliary variables similar to languages like C++ and Python.\n", + "\n", + "\n", + "\n", + "Logica syntax is similar to set-theory and logical notation used in mathematics. Consider the definition of a set of even numbers:\n", + "\n", + "$$EvenNumbers = \\{x | x \\in \\mathbb{Z} \\wedge x / 2 \\in \\mathbb{Z} \\}$$\n", + "\n", + "Formal logic assertion which number is even:\n", + "\n", + "$$x \\in \\mathbb{Z} \\wedge x / 2 \\in \\mathbb{Z} \\vdash Even(x) $$\n", + "\n", + "If $Z$ is a predicate corresponding to the set $\\mathbb{Z}$ then we could write\n", + "\n", + "$$Z(x) \\wedge Z(x /2) \\vdash Even(x) $$\n", + "\n", + "Logica rule defining Even predicate from a predicate Z looks as follows.\n", + "\n", + "```\n", + "\n", + "Even(x) :- Z(x), Z(x / 2);\n", + "\n", + "```\n", + "\n", + "Unlike mathematics in Logica we do have to worry about computability, so we can't easily define a predicate as a subset of all integer numbers. But we can easily define Even predicate defined for a subset of positive integer numbers from 0 to 20.\n", + "\n", + "First we need to install and import Logica into this CoLab." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "both", + "id": "L8t0orNYD2Kl" + }, + "outputs": [], + "source": [ + "#@title Install Logica.\n", + "# TODO: Add installation." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "both", + "id": "QkRBUpB-nHKy" + }, + "outputs": [], + "source": [ + "#@title Import Logica.\n", + "import sys\n", + "sys.path.append('logica')\n", + "from google.colab import auth\n", + "import colab_logica\n", + "auth.authenticate_user()\n", + "colab_logica.SetProject('YOUR_PROJECT')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ptokgaE8FDKO" + }, + "source": [ + "Now we can define the Even predicate." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 456, + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH0=", + "headers": [ + [ + "content-type", + "text/css" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgaCxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9ZnVuY3Rpb24oYSl7dmFyIGI9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmYVtTeW1ib2wuaXRlcmF0b3JdO3JldHVybiBiP2IuY2FsbChhKTp7bmV4dDphYShhKX19LGw9dGhpc3x8c2VsZixjYT1mdW5jdGlvbigpe30sZGE9ZnVuY3Rpb24oYSl7YS5CYT12b2lkIDA7YS5SPWZ1bmN0aW9uKCl7cmV0dXJuIGEuQmE/YS5CYTphLkJhPW5ldyBhfX0sZWE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7aWYoIm9iamVjdCI9PWIpaWYoYSl7aWYoYSBpbnN0YW5jZW9mIEFycmF5KXJldHVybiJhcnJheSI7aWYoYSBpbnN0YW5jZW9mIE9iamVjdClyZXR1cm4gYjt2YXIgYz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk7aWYoIltvYmplY3QgV2luZG93XSI9PWMpcmV0dXJuIm9iamVjdCI7CmlmKCJbb2JqZWN0IEFycmF5XSI9PWN8fCJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGgmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5zcGxpY2UmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoInNwbGljZSIpKXJldHVybiJhcnJheSI7aWYoIltvYmplY3QgRnVuY3Rpb25dIj09Y3x8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmNhbGwmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoImNhbGwiKSlyZXR1cm4iZnVuY3Rpb24ifWVsc2UgcmV0dXJuIm51bGwiO2Vsc2UgaWYoImZ1bmN0aW9uIj09YiYmInVuZGVmaW5lZCI9PXR5cGVvZiBhLmNhbGwpcmV0dXJuIm9iamVjdCI7cmV0dXJuIGJ9LGZhPWZ1bmN0aW9uKGEpe3JldHVybiJhcnJheSI9PWVhKGEpfSxoYT1mdW5jdGlvbihhKXt2YXIgYj1lYShhKTtyZXR1cm4iYXJyYXkiPT1ifHwib2JqZWN0Ij09CmImJiJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGh9LGlhPWZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PWVhKGEpfSxtPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBhO3JldHVybiJvYmplY3QiPT1iJiZudWxsIT1hfHwiZnVuY3Rpb24iPT1ifSxqYT0iY2xvc3VyZV91aWRfIisoMUU5Kk1hdGgucmFuZG9tKCk+Pj4wKSxrYT0wLGxhPWZ1bmN0aW9uKGEsYil7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe3ZhciBkPWMuc2xpY2UoKTtkLnB1c2guYXBwbHkoZCxhcmd1bWVudHMpO3JldHVybiBhLmFwcGx5KHRoaXMsZCl9fSxuPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe31jLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLmk9Yi5wcm90b3R5cGU7YS5wcm90b3R5cGU9bmV3IGM7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YX07dmFyIG1hLG5hPXtlYjoiYWN0aXZlZGVzY2VuZGFudCIsamI6ImF0b21pYyIsa2I6ImF1dG9jb21wbGV0ZSIsbWI6ImJ1c3kiLHBiOiJjaGVja2VkIixxYjoiY29saW5kZXgiLHZiOiJjb250cm9scyIseGI6ImRlc2NyaWJlZGJ5IixBYjoiZGlzYWJsZWQiLENiOiJkcm9wZWZmZWN0IixEYjoiZXhwYW5kZWQiLEViOiJmbG93dG8iLEdiOiJncmFiYmVkIixLYjoiaGFzcG9wdXAiLE1iOiJoaWRkZW4iLE9iOiJpbnZhbGlkIixQYjoibGFiZWwiLFFiOiJsYWJlbGxlZGJ5IixSYjoibGV2ZWwiLFdiOiJsaXZlIixrYzoibXVsdGlsaW5lIixsYzoibXVsdGlzZWxlY3RhYmxlIixwYzoib3JpZW50YXRpb24iLHFjOiJvd25zIixyYzoicG9zaW5zZXQiLHRjOiJwcmVzc2VkIix4YzoicmVhZG9ubHkiLHpjOiJyZWxldmFudCIsQWM6InJlcXVpcmVkIixFYzoicm93aW5kZXgiLEhjOiJzZWxlY3RlZCIsSmM6InNldHNpemUiLExjOiJzb3J0IixaYzoidmFsdWVtYXgiLCRjOiJ2YWx1ZW1pbiIsYWQ6InZhbHVlbm93IiwKYmQ6InZhbHVldGV4dCJ9O3ZhciBvYT1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkIGluIGEpYi5jYWxsKGMsYVtkXSxkLGEpfSxwYT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyBpbiBhKWlmKGFbY109PWIpcmV0dXJuITA7cmV0dXJuITF9LHFhPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsIT09YSYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfSxzYT1mdW5jdGlvbihhKXt2YXIgYj17fSxjO2ZvcihjIGluIGEpYlthW2NdXT1jO3JldHVybiBifSx0YT0iY29uc3RydWN0b3IgaGFzT3duUHJvcGVydHkgaXNQcm90b3R5cGVPZiBwcm9wZXJ0eUlzRW51bWVyYWJsZSB0b0xvY2FsZVN0cmluZyB0b1N0cmluZyB2YWx1ZU9mIi5zcGxpdCgiICIpLHVhPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8dGEubGVuZ3RoO2YrKyljPQp0YVtmXSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZCxjKSYmKGFbY109ZFtjXSl9fTt2YXIgdmE9e2ZiOiJhbGVydCIsZ2I6ImFsZXJ0ZGlhbG9nIixoYjoiYXBwbGljYXRpb24iLGliOiJhcnRpY2xlIixsYjoiYmFubmVyIixuYjoiYnV0dG9uIixvYjoiY2hlY2tib3giLHJiOiJjb2x1bW5oZWFkZXIiLHNiOiJjb21ib2JveCIsdGI6ImNvbXBsZW1lbnRhcnkiLHViOiJjb250ZW50aW5mbyIsd2I6ImRlZmluaXRpb24iLHliOiJkaWFsb2ciLHpiOiJkaXJlY3RvcnkiLEJiOiJkb2N1bWVudCIsRmI6ImZvcm0iLEhiOiJncmlkIixJYjoiZ3JpZGNlbGwiLEpiOiJncm91cCIsTGI6ImhlYWRpbmciLE5iOiJpbWciLFNiOiJsaW5rIixUYjoibGlzdCIsVWI6Imxpc3Rib3giLFZiOiJsaXN0aXRlbSIsWGI6ImxvZyIsWWI6Im1haW4iLFpiOiJtYXJxdWVlIiwkYjoibWF0aCIsYWM6Im1lbnUiLGJjOiJtZW51YmFyIixjYzoibWVudWl0ZW0iLGRjOiJtZW51aXRlbWNoZWNrYm94IixlYzoibWVudWl0ZW1yYWRpbyIsbWM6Im5hdmlnYXRpb24iLG5jOiJub3RlIixvYzoib3B0aW9uIiwKc2M6InByZXNlbnRhdGlvbiIsdWM6InByb2dyZXNzYmFyIix2YzoicmFkaW8iLHdjOiJyYWRpb2dyb3VwIix5YzoicmVnaW9uIixCYzoicm93IixDYzoicm93Z3JvdXAiLERjOiJyb3doZWFkZXIiLEZjOiJzY3JvbGxiYXIiLEdjOiJzZWFyY2giLEljOiJzZXBhcmF0b3IiLEtjOiJzbGlkZXIiLE1jOiJzcGluYnV0dG9uIixOYzoic3RhdHVzIixPYzoidGFiIixQYzoidGFibGlzdCIsUWM6InRhYnBhbmVsIixSYzoidGV4dGJveCIsU2M6InRleHRpbmZvIixUYzoidGltZXIiLFVjOiJ0b29sYmFyIixWYzoidG9vbHRpcCIsV2M6InRyZWUiLFhjOiJ0cmVlZ3JpZCIsWWM6InRyZWVpdGVtIn07dmFyIHdhPWZ1bmN0aW9uKGEpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsd2EpO2Vsc2V7dmFyIGI9RXJyb3IoKS5zdGFjaztiJiYodGhpcy5zdGFjaz1iKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSl9O24od2EsRXJyb3IpO3dhLnByb3RvdHlwZS5uYW1lPSJDdXN0b21FcnJvciI7dmFyIHhhO3ZhciB5YT1mdW5jdGlvbihhLGIpe2E9YS5zcGxpdCgiJXMiKTtmb3IodmFyIGM9IiIsZD1hLmxlbmd0aC0xLGU9MDtlPGQ7ZSsrKWMrPWFbZV0rKGU8Yi5sZW5ndGg/YltlXToiJXMiKTt3YS5jYWxsKHRoaXMsYythW2RdKX07bih5YSx3YSk7eWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjsKdmFyIHphPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSJBc3NlcnRpb24gZmFpbGVkIjtpZihjKXtlKz0iOiAiK2M7dmFyIGY9ZH1lbHNlIGEmJihlKz0iOiAiK2EsZj1iKTt0aHJvdyBuZXcgeWEoIiIrZSxmfHxbXSk7fSxxPWZ1bmN0aW9uKGEsYixjKXthfHx6YSgiIixudWxsLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX0sQWE9ZnVuY3Rpb24oYSxiLGMpe20oYSkmJjE9PWEubm9kZVR5cGV8fHphKCJFeHBlY3RlZCBFbGVtZW50IGJ1dCBnb3QgJXM6ICVzLiIsW2VhKGEpLGFdLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKX0sQ2E9ZnVuY3Rpb24oYSxiLGMsZCl7YSBpbnN0YW5jZW9mIGJ8fHphKCJFeHBlY3RlZCBpbnN0YW5jZW9mICVzIGJ1dCBnb3QgJXMuIixbQmEoYiksQmEoYSldLGMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpKX0sQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZgpGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTpudWxsPT09YT8ibnVsbCI6dHlwZW9mIGF9O3ZhciBEYT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3EobnVsbCE9YS5sZW5ndGgpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKCJzdHJpbmciPT09dHlwZW9mIGEpcmV0dXJuInN0cmluZyIhPT10eXBlb2YgYnx8MSE9Yi5sZW5ndGg/LTE6YS5pbmRleE9mKGIsMCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspaWYoYyBpbiBhJiZhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX0scj1BcnJheS5wcm90b3R5cGUuZm9yRWFjaD9mdW5jdGlvbihhLGIsYyl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsYyl9OmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9YS5sZW5ndGgsZT0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZj0wO2Y8ZDtmKyspZiBpbiBlJiZiLmNhbGwoYyxlW2ZdLGYsYSl9LEVhPUFycmF5LnByb3RvdHlwZS5maWx0ZXI/CmZ1bmN0aW9uKGEsYil7cShudWxsIT1hLmxlbmd0aCk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD1bXSxlPTAsZj0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZz0wO2c8YztnKyspaWYoZyBpbiBmKXt2YXIgaz1mW2ddO2IuY2FsbCh2b2lkIDAsayxnLGEpJiYoZFtlKytdPWspfXJldHVybiBkfSxGYT1BcnJheS5wcm90b3R5cGUuZXZlcnk/ZnVuY3Rpb24oYSxiKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmV2ZXJ5LmNhbGwoYSxiLHZvaWQgMCl9OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWEubGVuZ3RoLGQ9InN0cmluZyI9PT10eXBlb2YgYT9hLnNwbGl0KCIiKTphLGU9MDtlPGM7ZSsrKWlmKGUgaW4gZCYmIWIuY2FsbCh2b2lkIDAsZFtlXSxlLGEpKXJldHVybiExO3JldHVybiEwfSxHYT1mdW5jdGlvbihhLGIpe3JldHVybiAwPD0KRGEoYSxiKX0sSGE9ZnVuY3Rpb24oYSxiKXtiPURhKGEsYik7dmFyIGM7aWYoYz0wPD1iKXEobnVsbCE9YS5sZW5ndGgpLEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhLGIsMSk7cmV0dXJuIGN9LElhPWZ1bmN0aW9uKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGFyZ3VtZW50cyl9LEphPWZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDA8Yil7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX0sTGE9ZnVuY3Rpb24oYSxiLGMsZCl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShhLEthKGFyZ3VtZW50cywxKSl9LEthPWZ1bmN0aW9uKGEsYixjKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gMj49YXJndW1lbnRzLmxlbmd0aD9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsYixjKX07dmFyIE1hPVN0cmluZy5wcm90b3R5cGUudHJpbT9mdW5jdGlvbihhKXtyZXR1cm4gYS50cmltKCl9OmZ1bmN0aW9uKGEpe3JldHVybi9eW1xzXHhhMF0qKFtcc1xTXSo/KVtcc1x4YTBdKiQvLmV4ZWMoYSlbMV19LE5hPS8mL2csT2E9LzwvZyxQYT0vPi9nLFFhPS8iL2csUmE9LycvZyxTYT0vXHgwMC9nLFRhPS9bXHgwMCY8PiInXS8sdD1mdW5jdGlvbihhLGIpe3JldHVybi0xIT1hLmluZGV4T2YoYil9LFVhPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE8Yj8tMTphPmI/MTowfTt2YXIgdTthOnt2YXIgVmE9bC5uYXZpZ2F0b3I7aWYoVmEpe3ZhciBXYT1WYS51c2VyQWdlbnQ7aWYoV2Epe3U9V2E7YnJlYWsgYX19dT0iIn07LyoKCiBDb3B5cmlnaHQgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzLgogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKKi8KdmFyIFhhPWZ1bmN0aW9uKGEpe1RhLnRlc3QoYSkmJigtMSE9YS5pbmRleE9mKCImIikmJihhPWEucmVwbGFjZShOYSwiJmFtcDsiKSksLTEhPWEuaW5kZXhPZigiPCIpJiYoYT1hLnJlcGxhY2UoT2EsIiZsdDsiKSksLTEhPWEuaW5kZXhPZigiPiIpJiYoYT1hLnJlcGxhY2UoUGEsIiZndDsiKSksLTEhPWEuaW5kZXhPZignIicpJiYoYT1hLnJlcGxhY2UoUWEsIiZxdW90OyIpKSwtMSE9YS5pbmRleE9mKCInIikmJihhPWEucmVwbGFjZShSYSwiJiMzOTsiKSksLTEhPWEuaW5kZXhPZigiXHgwMCIpJiYoYT1hLnJlcGxhY2UoU2EsIiYjMDsiKSkpO3JldHVybiBhfTt2YXIgWWE9ZnVuY3Rpb24oYSl7WWFbIiAiXShhKTtyZXR1cm4gYX07WWFbIiAiXT1jYTt2YXIgJGE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1aYTtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsYSk/Y1thXTpjW2FdPWIoYSl9O3ZhciBhYj10KHUsIk9wZXJhIiksdj10KHUsIlRyaWRlbnQiKXx8dCh1LCJNU0lFIiksYmI9dCh1LCJFZGdlIikseD10KHUsIkdlY2tvIikmJiEodCh1LnRvTG93ZXJDYXNlKCksIndlYmtpdCIpJiYhdCh1LCJFZGdlIikpJiYhKHQodSwiVHJpZGVudCIpfHx0KHUsIk1TSUUiKSkmJiF0KHUsIkVkZ2UiKSx5PXQodS50b0xvd2VyQ2FzZSgpLCJ3ZWJraXQiKSYmIXQodSwiRWRnZSIpLHo9dCh1LCJNYWNpbnRvc2giKSxjYj1mdW5jdGlvbigpe3ZhciBhPWwuZG9jdW1lbnQ7cmV0dXJuIGE/YS5kb2N1bWVudE1vZGU6dm9pZCAwfSxkYjsKYTp7dmFyIGViPSIiLGZiPWZ1bmN0aW9uKCl7dmFyIGE9dTtpZih4KXJldHVybi9ydjooW15cKTtdKykoXCl8OykvLmV4ZWMoYSk7aWYoYmIpcmV0dXJuL0VkZ2VcLyhbXGRcLl0rKS8uZXhlYyhhKTtpZih2KXJldHVybi9cYig/Ok1TSUV8cnYpWzogXShbXlwpO10rKShcKXw7KS8uZXhlYyhhKTtpZih5KXJldHVybi9XZWJLaXRcLyhcUyspLy5leGVjKGEpO2lmKGFiKXJldHVybi8oPzpWZXJzaW9uKVsgXC9dPyhcUyspLy5leGVjKGEpfSgpO2ZiJiYoZWI9ZmI/ZmJbMV06IiIpO2lmKHYpe3ZhciBnYj1jYigpO2lmKG51bGwhPWdiJiZnYj5wYXJzZUZsb2F0KGViKSl7ZGI9U3RyaW5nKGdiKTticmVhayBhfX1kYj1lYn0KdmFyIGhiPWRiLFphPXt9LEE9ZnVuY3Rpb24oYSl7cmV0dXJuICRhKGEsZnVuY3Rpb24oKXtmb3IodmFyIGI9MCxjPU1hKFN0cmluZyhoYikpLnNwbGl0KCIuIiksZD1NYShTdHJpbmcoYSkpLnNwbGl0KCIuIiksZT1NYXRoLm1heChjLmxlbmd0aCxkLmxlbmd0aCksZj0wOzA9PWImJmY8ZTtmKyspe3ZhciBnPWNbZl18fCIiLGs9ZFtmXXx8IiI7ZG97Zz0vKFxkKikoXEQqKSguKikvLmV4ZWMoZyl8fFsiIiwiIiwiIiwiIl07az0vKFxkKikoXEQqKSguKikvLmV4ZWMoayl8fFsiIiwiIiwiIiwiIl07aWYoMD09Z1swXS5sZW5ndGgmJjA9PWtbMF0ubGVuZ3RoKWJyZWFrO2I9VWEoMD09Z1sxXS5sZW5ndGg/MDpwYXJzZUludChnWzFdLDEwKSwwPT1rWzFdLmxlbmd0aD8wOnBhcnNlSW50KGtbMV0sMTApKXx8VWEoMD09Z1syXS5sZW5ndGgsMD09a1syXS5sZW5ndGgpfHxVYShnWzJdLGtbMl0pO2c9Z1szXTtrPWtbM119d2hpbGUoMD09Yil9cmV0dXJuIDA8PWJ9KX0saWI7CmliPWwuZG9jdW1lbnQmJnY/Y2IoKTp2b2lkIDA7dmFyIGpiPSF2fHw5PD1OdW1iZXIoaWIpO3ZhciBsYj1mdW5jdGlvbihhLGIpe29hKGIsZnVuY3Rpb24oYyxkKXtjJiYib2JqZWN0Ij09dHlwZW9mIGMmJmMuZGQmJihjPWMuY2QoKSk7InN0eWxlIj09ZD9hLnN0eWxlLmNzc1RleHQ9YzoiY2xhc3MiPT1kP2EuY2xhc3NOYW1lPWM6ImZvciI9PWQ/YS5odG1sRm9yPWM6a2IuaGFzT3duUHJvcGVydHkoZCk/YS5zZXRBdHRyaWJ1dGUoa2JbZF0sYyk6MD09ZC5sYXN0SW5kZXhPZigiYXJpYS0iLDApfHwwPT1kLmxhc3RJbmRleE9mKCJkYXRhLSIsMCk/YS5zZXRBdHRyaWJ1dGUoZCxjKTphW2RdPWN9KX0sa2I9e2NlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjb2xzcGFuOiJjb2xTcGFuIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGhlaWdodDoiaGVpZ2h0IixtYXhsZW5ndGg6Im1heExlbmd0aCIsbm9uY2U6Im5vbmNlIixyb2xlOiJyb2xlIixyb3dzcGFuOiJyb3dTcGFuIix0eXBlOiJ0eXBlIix1c2VtYXA6InVzZU1hcCIsdmFsaWduOiJ2QWxpZ24iLAp3aWR0aDoid2lkdGgifSxtYj1mdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChrKXtrJiZiLmFwcGVuZENoaWxkKCJzdHJpbmciPT09dHlwZW9mIGs/YS5jcmVhdGVUZXh0Tm9kZShrKTprKX1mb3IodmFyIGU9MjtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXTtpZighaGEoZil8fG0oZikmJjA8Zi5ub2RlVHlwZSlkKGYpO2Vsc2V7YTp7aWYoZiYmIm51bWJlciI9PXR5cGVvZiBmLmxlbmd0aCl7aWYobShmKSl7dmFyIGc9ImZ1bmN0aW9uIj09dHlwZW9mIGYuaXRlbXx8InN0cmluZyI9PXR5cGVvZiBmLml0ZW07YnJlYWsgYX1pZihpYShmKSl7Zz0iZnVuY3Rpb24iPT10eXBlb2YgZi5pdGVtO2JyZWFrIGF9fWc9ITF9cihnP0phKGYpOmYsZCl9fX0sbmI9ZnVuY3Rpb24oYSxiKXtiPVN0cmluZyhiKTsiYXBwbGljYXRpb24veGh0bWwreG1sIj09PWEuY29udGVudFR5cGUmJihiPWIudG9Mb3dlckNhc2UoKSk7cmV0dXJuIGEuY3JlYXRlRWxlbWVudChiKX0sb2I9ZnVuY3Rpb24oYSl7YSYmCmEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpfSxwYj1mdW5jdGlvbihhLGIpe2lmKCFhfHwhYilyZXR1cm4hMTtpZihhLmNvbnRhaW5zJiYxPT1iLm5vZGVUeXBlKXJldHVybiBhPT1ifHxhLmNvbnRhaW5zKGIpO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbilyZXR1cm4gYT09Ynx8ISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNik7Zm9yKDtiJiZhIT1iOyliPWIucGFyZW50Tm9kZTtyZXR1cm4gYj09YX0scWI9ZnVuY3Rpb24oYSl7cShhLCJOb2RlIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4iKTtyZXR1cm4gOT09YS5ub2RlVHlwZT9hOmEub3duZXJEb2N1bWVudHx8YS5kb2N1bWVudH0scmI9ZnVuY3Rpb24oYSxiKXtiP2EudGFiSW5kZXg9MDooYS50YWJJbmRleD0tMSxhLnJlbW92ZUF0dHJpYnV0ZSgidGFiSW5kZXgiKSl9LHNiPWZ1bmN0aW9uKGEpe3JldHVybiB2JiYhQSgiOSIpPyhhPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKSwKbnVsbCE9YSYmYS5zcGVjaWZpZWQpOmEuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpfSx0Yj1mdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgYSYmMDw9YSYmMzI3Njg+YX0sdWI9ZnVuY3Rpb24oYSl7dGhpcy5hPWF8fGwuZG9jdW1lbnR8fGRvY3VtZW50fTt1Yi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBhP3RoaXMuYS5nZXRFbGVtZW50QnlJZChhKTphfTsKdWIucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuYSxlPWFyZ3VtZW50cyxmPVN0cmluZyhlWzBdKSxnPWVbMV07aWYoIWpiJiZnJiYoZy5uYW1lfHxnLnR5cGUpKXtmPVsiPCIsZl07Zy5uYW1lJiZmLnB1c2goJyBuYW1lPSInLFhhKGcubmFtZSksJyInKTtpZihnLnR5cGUpe2YucHVzaCgnIHR5cGU9IicsWGEoZy50eXBlKSwnIicpO3ZhciBrPXt9O3VhKGssZyk7ZGVsZXRlIGsudHlwZTtnPWt9Zi5wdXNoKCI+Iik7Zj1mLmpvaW4oIiIpfWY9bmIoZCxmKTtnJiYoInN0cmluZyI9PT10eXBlb2YgZz9mLmNsYXNzTmFtZT1nOmZhKGcpP2YuY2xhc3NOYW1lPWcuam9pbigiICIpOmxiKGYsZykpOzI8ZS5sZW5ndGgmJm1iKGQsZixlKTtyZXR1cm4gZn07dmFyIHZiPWZ1bmN0aW9uKGEsYil7Yj8ocShwYSh2YSxiKSwiTm8gc3VjaCBBUklBIHJvbGUgIitiKSxhLnNldEF0dHJpYnV0ZSgicm9sZSIsYikpOmEucmVtb3ZlQXR0cmlidXRlKCJyb2xlIil9LHhiPWZ1bmN0aW9uKGEsYixjKXtmYShjKSYmKGM9Yy5qb2luKCIgIikpO3ZhciBkPXdiKGIpOyIiPT09Y3x8dm9pZCAwPT1jPyhtYXx8KG1hPXthdG9taWM6ITEsYXV0b2NvbXBsZXRlOiJub25lIixkcm9wZWZmZWN0OiJub25lIixoYXNwb3B1cDohMSxsaXZlOiJvZmYiLG11bHRpbGluZTohMSxtdWx0aXNlbGVjdGFibGU6ITEsb3JpZW50YXRpb246InZlcnRpY2FsIixyZWFkb25seTohMSxyZWxldmFudDoiYWRkaXRpb25zIHRleHQiLHJlcXVpcmVkOiExLHNvcnQ6Im5vbmUiLGJ1c3k6ITEsZGlzYWJsZWQ6ITEsaGlkZGVuOiExLGludmFsaWQ6ImZhbHNlIn0pLGM9bWEsYiBpbiBjP2Euc2V0QXR0cmlidXRlKGQsY1tiXSk6YS5yZW1vdmVBdHRyaWJ1dGUoZCkpOmEuc2V0QXR0cmlidXRlKGQsCmMpfSx3Yj1mdW5jdGlvbihhKXtxKGEsIkFSSUEgYXR0cmlidXRlIGNhbm5vdCBiZSBlbXB0eS4iKTtxKHBhKG5hLGEpLCJObyBzdWNoIEFSSUEgYXR0cmlidXRlICIrYSk7cmV0dXJuImFyaWEtIithfTt2YXIgeWI9T2JqZWN0LmZyZWV6ZXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O3ZhciBDPWZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVTt0aGlzLko9dGhpcy5KfTtDLnByb3RvdHlwZS5VPSExO0MucHJvdG90eXBlLk49ZnVuY3Rpb24oKXt0aGlzLlV8fCh0aGlzLlU9ITAsdGhpcy51KCkpfTt2YXIgemI9ZnVuY3Rpb24oYSxiKXthLlU/YigpOihhLkp8fChhLko9W10pLGEuSi5wdXNoKGIpKX07Qy5wcm90b3R5cGUudT1mdW5jdGlvbigpe2lmKHRoaXMuSilmb3IoO3RoaXMuSi5sZW5ndGg7KXRoaXMuSi5zaGlmdCgpKCl9O3ZhciBBYj1mdW5jdGlvbihhKXthJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5OJiZhLk4oKX07dmFyIEJiPWZ1bmN0aW9uKGEpe3JldHVybiJzdHJpbmciPT10eXBlb2YgYS5jbGFzc05hbWU/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sRD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6QmIoYSkubWF0Y2goL1xTKy9nKXx8W119LENiPWZ1bmN0aW9uKGEsYil7InN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZT9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxEYj1mdW5jdGlvbihhLGIpe3JldHVybiBhLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5jb250YWlucyhiKTpHYShEKGEpLGIpfSxFYj1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFEYihhLGIpKXt2YXIgYz1CYihhKTtDYihhLGMrKDA8Yy5sZW5ndGg/IiAiK2I6YikpfX0sRmI9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClyKGIsCmZ1bmN0aW9uKGUpe0ViKGEsZSl9KTtlbHNle3ZhciBjPXt9O3IoRChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7cihiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPTA8Yi5sZW5ndGg/IiAiK2Q6ZDtDYihhLGIpfX0sR2I9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6RGIoYSxiKSYmQ2IoYSxFYShEKGEpLGZ1bmN0aW9uKGMpe3JldHVybiBjIT1ifSkuam9pbigiICIpKX0sSGI9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9yKGIsZnVuY3Rpb24oYyl7R2IoYSxjKX0pOkNiKGEsRWEoRChhKSxmdW5jdGlvbihjKXtyZXR1cm4hR2EoYixjKX0pLmpvaW4oIiAiKSl9O3ZhciBJYj0hdnx8OTw9TnVtYmVyKGliKSxKYj0hdnx8OTw9TnVtYmVyKGliKSxLYj12JiYhQSgiOSIpLExiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e2wuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsY2EsYiksbC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjYSxiKX1jYXRjaChjKXt9cmV0dXJuIGF9KCk7dmFyIEU9ZnVuY3Rpb24oYSxiKXt0aGlzLnR5cGU9YTt0aGlzLmE9dGhpcy50YXJnZXQ9Yjt0aGlzLmg9ITE7dGhpcy5LYT0hMH07RS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuaD0hMH07RS5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3RoaXMuS2E9ITF9O3ZhciBGPXtMOiJtb3VzZWRvd24iLE06Im1vdXNldXAiLGFhOiJtb3VzZWNhbmNlbCIsaGM6Im1vdXNlbW92ZSIsamM6Im1vdXNlb3ZlciIsaWM6Im1vdXNlb3V0IixmYzoibW91c2VlbnRlciIsZ2M6Im1vdXNlbGVhdmUifTt2YXIgRz1mdW5jdGlvbihhLGIpe0UuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy5hPXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5jPTA7dGhpcy5BPXRoaXMubWV0YUtleT10aGlzLnNoaWZ0S2V5PXRoaXMuYWx0S2V5PXRoaXMuY3RybEtleT0hMTt0aGlzLnBvaW50ZXJJZD0wO3RoaXMucG9pbnRlclR5cGU9IiI7dGhpcy5iPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMuYT1iO2lmKGI9YS5yZWxhdGVkVGFyZ2V0KXtpZih4KXthOnt0cnl7WWEoYi5ub2RlTmFtZSk7dmFyIGU9ITA7YnJlYWsgYX1jYXRjaChmKXt9ZT0KITF9ZXx8KGI9bnVsbCl9fWVsc2UibW91c2VvdmVyIj09Yz9iPWEuZnJvbUVsZW1lbnQ6Im1vdXNlb3V0Ij09YyYmKGI9YS50b0VsZW1lbnQpO3RoaXMucmVsYXRlZFRhcmdldD1iO2Q/KHRoaXMuY2xpZW50WD12b2lkIDAhPT1kLmNsaWVudFg/ZC5jbGllbnRYOmQucGFnZVgsdGhpcy5jbGllbnRZPXZvaWQgMCE9PWQuY2xpZW50WT9kLmNsaWVudFk6ZC5wYWdlWSx0aGlzLnNjcmVlblg9ZC5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1kLnNjcmVlbll8fDApOih0aGlzLmNsaWVudFg9dm9pZCAwIT09YS5jbGllbnRYP2EuY2xpZW50WDphLnBhZ2VYLHRoaXMuY2xpZW50WT12b2lkIDAhPT1hLmNsaWVudFk/YS5jbGllbnRZOmEucGFnZVksdGhpcy5zY3JlZW5YPWEuc2NyZWVuWHx8MCx0aGlzLnNjcmVlblk9YS5zY3JlZW5ZfHwwKTt0aGlzLmJ1dHRvbj1hLmJ1dHRvbjt0aGlzLmM9YS5rZXlDb2RlfHwwO3RoaXMua2V5PWEua2V5fHwiIjt0aGlzLmN0cmxLZXk9YS5jdHJsS2V5O3RoaXMuYWx0S2V5PQphLmFsdEtleTt0aGlzLnNoaWZ0S2V5PWEuc2hpZnRLZXk7dGhpcy5tZXRhS2V5PWEubWV0YUtleTt0aGlzLkE9ej9hLm1ldGFLZXk6YS5jdHJsS2V5O3RoaXMucG9pbnRlcklkPWEucG9pbnRlcklkfHwwO3RoaXMucG9pbnRlclR5cGU9InN0cmluZyI9PT10eXBlb2YgYS5wb2ludGVyVHlwZT9hLnBvaW50ZXJUeXBlOk1iW2EucG9pbnRlclR5cGVdfHwiIjt0aGlzLmI9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnRoaXMuZygpfX07bihHLEUpO3ZhciBOYj15YihbMSw0LDJdKSxNYj15Yih7MjoidG91Y2giLDM6InBlbiIsNDoibW91c2UifSksT2I9ZnVuY3Rpb24oYSl7cmV0dXJuIEliPzA9PWEuYi5idXR0b246ImNsaWNrIj09YS50eXBlPyEwOiEhKGEuYi5idXR0b24mTmJbMF0pfTtHLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7Ry5pLmouY2FsbCh0aGlzKTt0aGlzLmIuc3RvcFByb3BhZ2F0aW9uP3RoaXMuYi5zdG9wUHJvcGFnYXRpb24oKTp0aGlzLmIuY2FuY2VsQnViYmxlPSEwfTsKRy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe0cuaS5nLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5iO2lmKGEucHJldmVudERlZmF1bHQpYS5wcmV2ZW50RGVmYXVsdCgpO2Vsc2UgaWYoYS5yZXR1cm5WYWx1ZT0hMSxLYil0cnl7aWYoYS5jdHJsS2V5fHwxMTI8PWEua2V5Q29kZSYmMTIzPj1hLmtleUNvZGUpYS5rZXlDb2RlPS0xfWNhdGNoKGIpe319O3ZhciBQYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKDFFNipNYXRoLnJhbmRvbSgpfDApLFFiPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW1BiXSl9LFJiPTA7dmFyIFNiPWZ1bmN0aW9uKGEsYixjLGQsZSl7dGhpcy5saXN0ZW5lcj1hO3RoaXMuYT1udWxsO3RoaXMuc3JjPWI7dGhpcy50eXBlPWM7dGhpcy5jYXB0dXJlPSEhZDt0aGlzLm1hPWU7dGhpcy5rZXk9KytSYjt0aGlzLlg9dGhpcy5oYT0hMX0sVGI9ZnVuY3Rpb24oYSl7YS5YPSEwO2EubGlzdGVuZXI9bnVsbDthLmE9bnVsbDthLnNyYz1udWxsO2EubWE9bnVsbH07dmFyIFViPWZ1bmN0aW9uKGEpe3RoaXMuc3JjPWE7dGhpcy5hPXt9O3RoaXMuYj0wfTtVYi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS50b1N0cmluZygpO2E9dGhpcy5hW2ZdO2F8fChhPXRoaXMuYVtmXT1bXSx0aGlzLmIrKyk7dmFyIGc9VmIoYSxiLGQsZSk7LTE8Zz8oYj1hW2ddLGN8fChiLmhhPSExKSk6KGI9bmV3IFNiKGIsdGhpcy5zcmMsZiwhIWQsZSksYi5oYT1jLGEucHVzaChiKSk7cmV0dXJuIGJ9Owp2YXIgV2I9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLnR5cGU7YyBpbiBhLmEmJkhhKGEuYVtjXSxiKSYmKFRiKGIpLDA9PWEuYVtjXS5sZW5ndGgmJihkZWxldGUgYS5hW2NdLGEuYi0tKSl9LFhiPWZ1bmN0aW9uKGEsYixjLGQsZSl7YT1hLmFbYi50b1N0cmluZygpXTtiPS0xO2EmJihiPVZiKGEsYyxkLGUpKTtyZXR1cm4tMTxiP2FbYl06bnVsbH0sVmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuWCYmZi5saXN0ZW5lcj09YiYmZi5jYXB0dXJlPT0hIWMmJmYubWE9PWQpcmV0dXJuIGV9cmV0dXJuLTF9O3ZhciBZYj0iY2xvc3VyZV9sbV8iKygxRTYqTWF0aC5yYW5kb20oKXwwKSxaYj17fSwkYj0wLGJjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZCYmZC5vbmNlKXJldHVybiBhYyhhLGIsYyxkLGUpO2lmKGZhKGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyliYyhhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9Y2MoYyk7cmV0dXJuIFFiKGEpP2RjKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOmVjKGEsYixjLCExLGQsZSl9LGVjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGc9bShlKT8hIWUuY2FwdHVyZTohIWUsaz1mYyhhKTtrfHwoYVtZYl09az1uZXcgVWIoYSkpO2M9ay5hZGQoYixjLGQsZyxmKTtpZihjLmEpcmV0dXJuIGM7ZD1nYygpO2MuYT1kO2Quc3JjPWE7ZC5saXN0ZW5lcj1jO2lmKGEuYWRkRXZlbnRMaXN0ZW5lcilMYnx8KGU9Zyksdm9pZCAwPT09ZSYmKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksCmQsZSk7ZWxzZSBpZihhLmF0dGFjaEV2ZW50KWEuYXR0YWNoRXZlbnQoaGMoYi50b1N0cmluZygpKSxkKTtlbHNlIGlmKGEuYWRkTGlzdGVuZXImJmEucmVtb3ZlTGlzdGVuZXIpcSgiY2hhbmdlIj09PWIsIk1lZGlhUXVlcnlMaXN0IG9ubHkgaGFzIGEgY2hhbmdlIGV2ZW50IiksYS5hZGRMaXN0ZW5lcihkKTtlbHNlIHRocm93IEVycm9yKCJhZGRFdmVudExpc3RlbmVyIGFuZCBhdHRhY2hFdmVudCBhcmUgdW5hdmFpbGFibGUuIik7JGIrKztyZXR1cm4gY30sZ2M9ZnVuY3Rpb24oKXt2YXIgYT1pYyxiPUpiP2Z1bmN0aW9uKGMpe3JldHVybiBhLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKX06ZnVuY3Rpb24oYyl7Yz1hLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKTtpZighYylyZXR1cm4gY307cmV0dXJuIGJ9LGFjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZmEoYikpe2Zvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWFjKGEsYltmXSxjLGQsZSk7cmV0dXJuIG51bGx9Yz1jYyhjKTtyZXR1cm4gUWIoYSk/CmEuaC5hZGQoU3RyaW5nKGIpLGMsITAsbShkKT8hIWQuY2FwdHVyZTohIWQsZSk6ZWMoYSxiLGMsITAsZCxlKX0samM9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihmYShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylqYyhhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPWNjKGMpLFFiKGEpPyhhPWEuaCxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5hJiYoZj1hLmFbYl0sYz1WYihmLGMsZCxlKSwtMTxjJiYoVGIoZltjXSkscShudWxsIT1mLmxlbmd0aCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSwwPT1mLmxlbmd0aCYmKGRlbGV0ZSBhLmFbYl0sYS5iLS0pKSkpOmEmJihhPWZjKGEpKSYmKGM9WGIoYSxiLGMsZCxlKSkmJmtjKGMpfSxrYz1mdW5jdGlvbihhKXtpZigibnVtYmVyIiE9PXR5cGVvZiBhJiZhJiYhYS5YKXt2YXIgYj1hLnNyYztpZihRYihiKSlXYihiLmgsYSk7ZWxzZXt2YXIgYz1hLnR5cGUsZD1hLmE7Yi5yZW1vdmVFdmVudExpc3RlbmVyPwpiLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KGhjKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7JGItLTsoYz1mYyhiKSk/KFdiKGMsYSksMD09Yy5iJiYoYy5zcmM9bnVsbCxiW1liXT1udWxsKSk6VGIoYSl9fX0saGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gWmI/WmJbYV06WmJbYV09Im9uIithfSxtYz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMDtpZihhPWZjKGEpKWlmKGI9YS5hW2IudG9TdHJpbmcoKV0pZm9yKGI9Yi5jb25jYXQoKSxhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBmPWJbYV07ZiYmZi5jYXB0dXJlPT1jJiYhZi5YJiYoZj1sYyhmLGQpLGU9ZSYmITEhPT1mKX1yZXR1cm4gZX0sbGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5tYXx8YS5zcmM7YS5oYSYma2MoYSk7cmV0dXJuIGMuY2FsbChkLGIpfSxpYz1mdW5jdGlvbihhLApiKXtpZihhLlgpcmV0dXJuITA7aWYoIUpiKXtpZighYilhOntiPVsid2luZG93IiwiZXZlbnQiXTtmb3IodmFyIGM9bCxkPTA7ZDxiLmxlbmd0aDtkKyspaWYoYz1jW2JbZF1dLG51bGw9PWMpe2I9bnVsbDticmVhayBhfWI9Y31kPWI7Yj1uZXcgRyhkLHRoaXMpO2M9ITA7aWYoISgwPmQua2V5Q29kZXx8dm9pZCAwIT1kLnJldHVyblZhbHVlKSl7YTp7dmFyIGU9ITE7aWYoMD09ZC5rZXlDb2RlKXRyeXtkLmtleUNvZGU9LTE7YnJlYWsgYX1jYXRjaChnKXtlPSEwfWlmKGV8fHZvaWQgMD09ZC5yZXR1cm5WYWx1ZSlkLnJldHVyblZhbHVlPSEwfWQ9W107Zm9yKGU9Yi5hO2U7ZT1lLnBhcmVudE5vZGUpZC5wdXNoKGUpO2E9YS50eXBlO2ZvcihlPWQubGVuZ3RoLTE7IWIuaCYmMDw9ZTtlLS0pe2IuYT1kW2VdO3ZhciBmPW1jKGRbZV0sYSwhMCxiKTtjPWMmJmZ9Zm9yKGU9MDshYi5oJiZlPGQubGVuZ3RoO2UrKyliLmE9ZFtlXSxmPW1jKGRbZV0sYSwhMSxiKSxjPWMmJmZ9cmV0dXJuIGN9cmV0dXJuIGxjKGEsCm5ldyBHKGIsdGhpcykpfSxmYz1mdW5jdGlvbihhKXthPWFbWWJdO3JldHVybiBhIGluc3RhbmNlb2YgVWI/YTpudWxsfSxuYz0iX19jbG9zdXJlX2V2ZW50c19mbl8iKygxRTkqTWF0aC5yYW5kb20oKT4+PjApLGNjPWZ1bmN0aW9uKGEpe3EoYSwiTGlzdGVuZXIgY2FuIG5vdCBiZSBudWxsLiIpO2lmKGlhKGEpKXJldHVybiBhO3EoYS5oYW5kbGVFdmVudCwiQW4gb2JqZWN0IGxpc3RlbmVyIG11c3QgaGF2ZSBoYW5kbGVFdmVudCBtZXRob2QuIik7YVtuY118fChhW25jXT1mdW5jdGlvbihiKXtyZXR1cm4gYS5oYW5kbGVFdmVudChiKX0pO3JldHVybiBhW25jXX07dmFyIG9jPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9e319O24ob2MsQyk7CnZhciBwYz1bXSxIPWZ1bmN0aW9uKGEsYixjLGQpe2ZhKGMpfHwoYyYmKHBjWzBdPWMudG9TdHJpbmcoKSksYz1wYyk7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWJjKGIsY1tlXSxkfHxhLmhhbmRsZUV2ZW50LCExLGEuYnx8YSk7aWYoIWYpYnJlYWs7YS5hW2Yua2V5XT1mfXJldHVybiBhfSxxYz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoZmEoYykpZm9yKHZhciBnPTA7ZzxjLmxlbmd0aDtnKyspcWMoYSxiLGNbZ10sZCxlLGYpO2Vsc2UgZD1kfHxhLmhhbmRsZUV2ZW50LGU9bShlKT8hIWUuY2FwdHVyZTohIWUsZj1mfHxhLmJ8fGEsZD1jYyhkKSxlPSEhZSxjPVFiKGIpP1hiKGIuaCxTdHJpbmcoYyksZCxlLGYpOmI/KGI9ZmMoYikpP1hiKGIsYyxkLGUsZik6bnVsbDpudWxsLGMmJihrYyhjKSxkZWxldGUgYS5hW2Mua2V5XSk7cmV0dXJuIGF9LHJjPWZ1bmN0aW9uKGEpe29hKGEuYSxmdW5jdGlvbihiLGMpe3RoaXMuYS5oYXNPd25Qcm9wZXJ0eShjKSYma2MoYil9LAphKTthLmE9e319O29jLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7b2MuaS51LmNhbGwodGhpcyk7cmModGhpcyl9O29jLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJFdmVudEhhbmRsZXIuaGFuZGxlRXZlbnQgbm90IGltcGxlbWVudGVkIik7fTt2YXIgST1mdW5jdGlvbigpe0MuY2FsbCh0aGlzKTt0aGlzLmg9bmV3IFViKHRoaXMpO3RoaXMuTWE9dGhpczt0aGlzLnBhPW51bGx9O24oSSxDKTtJLnByb3RvdHlwZVtQYl09ITA7SS5wcm90b3R5cGUucmE9ZnVuY3Rpb24oYSl7dGhpcy5wYT1hfTtJLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjLGQpe2pjKHRoaXMsYSxiLGMsZCl9Owp2YXIgdWM9ZnVuY3Rpb24oYSxiKXtzYyhhKTt2YXIgYz1hLnBhO2lmKGMpe3ZhciBkPVtdO2Zvcih2YXIgZT0xO2M7Yz1jLnBhKWQucHVzaChjKSxxKDFFMz4rK2UsImluZmluaXRlIGxvb3AiKX1hPWEuTWE7Yz1iLnR5cGV8fGI7InN0cmluZyI9PT10eXBlb2YgYj9iPW5ldyBFKGIsYSk6YiBpbnN0YW5jZW9mIEU/Yi50YXJnZXQ9Yi50YXJnZXR8fGE6KGU9YixiPW5ldyBFKGMsYSksdWEoYixlKSk7ZT0hMDtpZihkKWZvcih2YXIgZj1kLmxlbmd0aC0xOyFiLmgmJjA8PWY7Zi0tKXt2YXIgZz1iLmE9ZFtmXTtlPXRjKGcsYywhMCxiKSYmZX1iLmh8fChnPWIuYT1hLGU9dGMoZyxjLCEwLGIpJiZlLGIuaHx8KGU9dGMoZyxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLmgmJmY8ZC5sZW5ndGg7ZisrKWc9Yi5hPWRbZl0sZT10YyhnLGMsITEsYikmJmU7cmV0dXJuIGV9OwpJLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7SS5pLnUuY2FsbCh0aGlzKTtpZih0aGlzLmgpe3ZhciBhPXRoaXMuaCxiPTAsYztmb3IoYyBpbiBhLmEpe2Zvcih2YXIgZD1hLmFbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixUYihkW2VdKTtkZWxldGUgYS5hW2NdO2EuYi0tfX10aGlzLnBhPW51bGx9O3ZhciBkYz1mdW5jdGlvbihhLGIsYyxkLGUpe3NjKGEpO3JldHVybiBhLmguYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LHRjPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5oLmFbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGc9YltmXTtpZihnJiYhZy5YJiZnLmNhcHR1cmU9PWMpe3ZhciBrPWcubGlzdGVuZXIscD1nLm1hfHxnLnNyYztnLmhhJiZXYihhLmgsZyk7ZT0hMSE9PWsuY2FsbChwLGQpJiZlfX1yZXR1cm4gZSYmMCE9ZC5LYX0sc2M9ZnVuY3Rpb24oYSl7cShhLmgsIkV2ZW50IHRhcmdldCBpcyBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgY2FsbCB0aGUgc3VwZXJjbGFzcyAoZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpIGNvbnN0cnVjdG9yPyIpfTt2YXIgeGM9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKHkmJiFBKCI1MjUiKSlyZXR1cm4hMDtpZih6JiZlKXJldHVybiB2YyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZigheCl7Im51bWJlciI9PT10eXBlb2YgYiYmKGI9d2MoYikpO3ZhciBnPTE3PT1ifHwxOD09Ynx8eiYmOTE9PWI7aWYoKCFjfHx6KSYmZ3x8eiYmMTY9PWImJihkfHxmKSlyZXR1cm4hMX1pZigoeXx8YmIpJiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1pZih2JiZkJiZiPT1hKXJldHVybiExO3N3aXRjaChhKXtjYXNlIDEzOnJldHVybiB4P2Z8fGU/ITE6IShjJiZkKTohMDtjYXNlIDI3OnJldHVybiEoeXx8YmJ8fHgpfXJldHVybiB4JiYoZHx8ZXx8Zik/ITE6dmMoYSl9LHZjPWZ1bmN0aW9uKGEpe2lmKDQ4PD1hJiY1Nz49YXx8Cjk2PD1hJiYxMDY+PWF8fDY1PD1hJiY5MD49YXx8KHl8fGJiKSYmMD09YSlyZXR1cm4hMDtzd2l0Y2goYSl7Y2FzZSAzMjpjYXNlIDQzOmNhc2UgNjM6Y2FzZSA2NDpjYXNlIDEwNzpjYXNlIDEwOTpjYXNlIDExMDpjYXNlIDExMTpjYXNlIDE4NjpjYXNlIDU5OmNhc2UgMTg5OmNhc2UgMTg3OmNhc2UgNjE6Y2FzZSAxODg6Y2FzZSAxOTA6Y2FzZSAxOTE6Y2FzZSAxOTI6Y2FzZSAyMjI6Y2FzZSAyMTk6Y2FzZSAyMjA6Y2FzZSAyMjE6Y2FzZSAxNjM6Y2FzZSA1ODpyZXR1cm4hMDtjYXNlIDE3MzpyZXR1cm4geDtkZWZhdWx0OnJldHVybiExfX0sd2M9ZnVuY3Rpb24oYSl7aWYoeClhPXljKGEpO2Vsc2UgaWYoeiYmeSlzd2l0Y2goYSl7Y2FzZSA5MzphPTkxfXJldHVybiBhfSx5Yz1mdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSA2MTpyZXR1cm4gMTg3O2Nhc2UgNTk6cmV0dXJuIDE4NjtjYXNlIDE3MzpyZXR1cm4gMTg5O2Nhc2UgMjI0OnJldHVybiA5MTtjYXNlIDA6cmV0dXJuIDIyNDsKZGVmYXVsdDpyZXR1cm4gYX19O3ZhciBKPWZ1bmN0aW9uKGEsYil7SS5jYWxsKHRoaXMpO2EmJnpjKHRoaXMsYSxiKX07bihKLEkpO2g9Si5wcm90b3R5cGU7aC5TPW51bGw7aC5uYT1udWxsO2guQ2E9bnVsbDtoLm9hPW51bGw7aC53PS0xO2guRj0tMTtoLnVhPSExOwp2YXIgQWM9ezM6MTMsMTI6MTQ0LDYzMjMyOjM4LDYzMjMzOjQwLDYzMjM0OjM3LDYzMjM1OjM5LDYzMjM2OjExMiw2MzIzNzoxMTMsNjMyMzg6MTE0LDYzMjM5OjExNSw2MzI0MDoxMTYsNjMyNDE6MTE3LDYzMjQyOjExOCw2MzI0MzoxMTksNjMyNDQ6MTIwLDYzMjQ1OjEyMSw2MzI0NjoxMjIsNjMyNDc6MTIzLDYzMjQ4OjQ0LDYzMjcyOjQ2LDYzMjczOjM2LDYzMjc1OjM1LDYzMjc2OjMzLDYzMjc3OjM0LDYzMjg5OjE0NCw2MzMwMjo0NX0sQmM9e1VwOjM4LERvd246NDAsTGVmdDozNyxSaWdodDozOSxFbnRlcjoxMyxGMToxMTIsRjI6MTEzLEYzOjExNCxGNDoxMTUsRjU6MTE2LEY2OjExNyxGNzoxMTgsRjg6MTE5LEY5OjEyMCxGMTA6MTIxLEYxMToxMjIsRjEyOjEyMywiVSswMDdGIjo0NixIb21lOjM2LEVuZDozNSxQYWdlVXA6MzMsUGFnZURvd246MzQsSW5zZXJ0OjQ1fSxDYz0heXx8QSgiNTI1IiksRGM9eiYmeDsKSi5wcm90b3R5cGUuYT1mdW5jdGlvbihhKXtpZih5fHxiYilpZigxNz09dGhpcy53JiYhYS5jdHJsS2V5fHwxOD09dGhpcy53JiYhYS5hbHRLZXl8fHomJjkxPT10aGlzLncmJiFhLm1ldGFLZXkpdGhpcy5GPXRoaXMudz0tMTstMT09dGhpcy53JiYoYS5jdHJsS2V5JiYxNyE9YS5jP3RoaXMudz0xNzphLmFsdEtleSYmMTghPWEuYz90aGlzLnc9MTg6YS5tZXRhS2V5JiY5MSE9YS5jJiYodGhpcy53PTkxKSk7Q2MmJiF4YyhhLmMsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGEuYWx0S2V5LGEubWV0YUtleSk/dGhpcy5oYW5kbGVFdmVudChhKToodGhpcy5GPXdjKGEuYyksRGMmJih0aGlzLnVhPWEuYWx0S2V5KSl9O0oucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dGhpcy5GPXRoaXMudz0tMTt0aGlzLnVhPWEuYWx0S2V5fTsKSi5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5iLGM9Yi5hbHRLZXk7aWYodiYmImtleXByZXNzIj09YS50eXBlKXt2YXIgZD10aGlzLkY7dmFyIGU9MTMhPWQmJjI3IT1kP2Iua2V5Q29kZTowfWVsc2UoeXx8YmIpJiYia2V5cHJlc3MiPT1hLnR5cGU/KGQ9dGhpcy5GLGU9MDw9Yi5jaGFyQ29kZSYmNjMyMzI+Yi5jaGFyQ29kZSYmdmMoZCk/Yi5jaGFyQ29kZTowKTphYiYmIXk/KGQ9dGhpcy5GLGU9dmMoZCk/Yi5rZXlDb2RlOjApOigia2V5cHJlc3MiPT1hLnR5cGU/KERjJiYoYz10aGlzLnVhKSxiLmtleUNvZGU9PWIuY2hhckNvZGU/MzI+Yi5rZXlDb2RlPyhkPWIua2V5Q29kZSxlPTApOihkPXRoaXMuRixlPWIuY2hhckNvZGUpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkseiYmNjM9PWUmJjIyND09ZCYmKGQ9MTkxKSk7dmFyIGY9ZD13YyhkKTtkPzYzMjMyPD0KZCYmZCBpbiBBYz9mPUFjW2RdOjI1PT1kJiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBCYyYmKGY9QmNbYi5rZXlJZGVudGlmaWVyXSk7eCYmQ2MmJiJrZXlwcmVzcyI9PWEudHlwZSYmIXhjKGYsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KXx8KGE9Zj09dGhpcy53LHRoaXMudz1mLGI9bmV3IEVjKGYsZSxhLGIpLGIuYWx0S2V5PWMsdWModGhpcyxiKSl9O0oucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTsKdmFyIHpjPWZ1bmN0aW9uKGEsYixjKXthLm9hJiZGYyhhKTthLlM9YjthLm5hPWJjKGEuUywia2V5cHJlc3MiLGEsYyk7YS5DYT1iYyhhLlMsImtleWRvd24iLGEuYSxjLGEpO2Eub2E9YmMoYS5TLCJrZXl1cCIsYS5iLGMsYSl9LEZjPWZ1bmN0aW9uKGEpe2EubmEmJihrYyhhLm5hKSxrYyhhLkNhKSxrYyhhLm9hKSxhLm5hPW51bGwsYS5DYT1udWxsLGEub2E9bnVsbCk7YS5TPW51bGw7YS53PS0xO2EuRj0tMX07Si5wcm90b3R5cGUudT1mdW5jdGlvbigpe0ouaS51LmNhbGwodGhpcyk7RmModGhpcyl9O3ZhciBFYz1mdW5jdGlvbihhLGIsYyxkKXtHLmNhbGwodGhpcyxkKTt0aGlzLnR5cGU9ImtleSI7dGhpcy5jPWE7dGhpcy5yZXBlYXQ9Y307bihFYyxHKTt2YXIgR2M9eD8iTW96VXNlclNlbGVjdCI6eXx8YmI/IldlYmtpdFVzZXJTZWxlY3QiOm51bGwsSGM9ZnVuY3Rpb24oYSxiKXtiPWI/bnVsbDphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7aWYoR2Mpe3ZhciBjPSJub25lIjthLnN0eWxlJiYoYS5zdHlsZVtHY109Yyk7aWYoYil7YT0wO2Zvcih2YXIgZDtkPWJbYV07YSsrKWQuc3R5bGUmJihkLnN0eWxlW0djXT1jKX19ZWxzZSBpZih2fHxhYilpZihjPSJvbiIsYS5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyksYilmb3IoYT0wO2Q9YlthXTthKyspZC5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyl9O3ZhciBJYz1mdW5jdGlvbigpe307ZGEoSWMpO0ljLnByb3RvdHlwZS5hPTA7dmFyIEs9ZnVuY3Rpb24oYSl7SS5jYWxsKHRoaXMpO3RoaXMuaj1hfHx4YXx8KHhhPW5ldyB1Yik7dGhpcy5xYT1KYzt0aGlzLlk9bnVsbDt0aGlzLm09ITE7dGhpcy5hPW51bGw7dGhpcy5BPXZvaWQgMDt0aGlzLmc9dGhpcy5jPXRoaXMuYj1udWxsO3RoaXMuR2E9ITF9O24oSyxJKTtLLnByb3RvdHlwZS5PYT1JYy5SKCk7CnZhciBKYz1udWxsLEtjPWZ1bmN0aW9uKGEsYil7c3dpdGNoKGEpe2Nhc2UgMTpyZXR1cm4gYj8iZGlzYWJsZSI6ImVuYWJsZSI7Y2FzZSAyOnJldHVybiBiPyJoaWdobGlnaHQiOiJ1bmhpZ2hsaWdodCI7Y2FzZSA0OnJldHVybiBiPyJhY3RpdmF0ZSI6ImRlYWN0aXZhdGUiO2Nhc2UgODpyZXR1cm4gYj8ic2VsZWN0IjoidW5zZWxlY3QiO2Nhc2UgMTY6cmV0dXJuIGI/ImNoZWNrIjoidW5jaGVjayI7Y2FzZSAzMjpyZXR1cm4gYj8iZm9jdXMiOiJibHVyIjtjYXNlIDY0OnJldHVybiBiPyJvcGVuIjoiY2xvc2UifXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBzdGF0ZSIpO30sTGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuWXx8KGEuWT0iOiIrKGEuT2EuYSsrKS50b1N0cmluZygzNikpfSxNYz1mdW5jdGlvbihhLGIpe2lmKGEuYiYmYS5iLmcpe3ZhciBjPWEuYi5nLGQ9YS5ZO2QgaW4gYyYmZGVsZXRlIGNbZF07cWEoYS5iLmcsYixhKX1hLlk9Yn07Sy5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9Owp2YXIgTmM9ZnVuY3Rpb24oYSl7YT1hLmE7cShhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cmV0dXJuIGF9LE9jPWZ1bmN0aW9uKGEpe2EuQXx8KGEuQT1uZXcgb2MoYSkpO3JldHVybiBxKGEuQSl9O0sucHJvdG90eXBlLnJhPWZ1bmN0aW9uKGEpe2lmKHRoaXMuYiYmdGhpcy5iIT1hKXRocm93IEVycm9yKCJNZXRob2Qgbm90IHN1cHBvcnRlZCIpO0suaS5yYS5jYWxsKHRoaXMsYSl9O0sucHJvdG90eXBlLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPW5iKHRoaXMuai5hLCJESVYiKX07CnZhciBQYz1mdW5jdGlvbihhLGIpe2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiJiZhLnhhKGIpKXthLkdhPSEwO3ZhciBjPXFiKGIpO2EuaiYmYS5qLmE9PWN8fChhLmo9Yj9uZXcgdWIocWIoYikpOnhhfHwoeGE9bmV3IHViKSk7YS52YShiKTthLkQoKX1lbHNlIHRocm93IEVycm9yKCJJbnZhbGlkIGVsZW1lbnQgdG8gZGVjb3JhdGUiKTt9O2g9Sy5wcm90b3R5cGU7aC54YT1mdW5jdGlvbigpe3JldHVybiEwfTtoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hfTtoLkQ9ZnVuY3Rpb24oKXt0aGlzLm09ITA7UWModGhpcyxmdW5jdGlvbihhKXshYS5tJiZhLmYoKSYmYS5EKCl9KX07aC5QPWZ1bmN0aW9uKCl7UWModGhpcyxmdW5jdGlvbihhKXthLm0mJmEuUCgpfSk7dGhpcy5BJiZyYyh0aGlzLkEpO3RoaXMubT0hMX07CmgudT1mdW5jdGlvbigpe3RoaXMubSYmdGhpcy5QKCk7dGhpcy5BJiYodGhpcy5BLk4oKSxkZWxldGUgdGhpcy5BKTtRYyh0aGlzLGZ1bmN0aW9uKGEpe2EuTigpfSk7IXRoaXMuR2EmJnRoaXMuYSYmb2IodGhpcy5hKTt0aGlzLmI9dGhpcy5hPXRoaXMuZz10aGlzLmM9bnVsbDtLLmkudS5jYWxsKHRoaXMpfTtoLnNhPWZ1bmN0aW9uKGEsYil7dGhpcy50YShhLFJjKHRoaXMpLGIpfTsKaC50YT1mdW5jdGlvbihhLGIsYyl7cSghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLm0mJihjfHwhdGhpcy5tKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZigwPmJ8fGI+UmModGhpcykpdGhyb3cgRXJyb3IoIkNoaWxkIGNvbXBvbmVudCBpbmRleCBvdXQgb2YgYm91bmRzIik7dGhpcy5nJiZ0aGlzLmN8fCh0aGlzLmc9e30sdGhpcy5jPVtdKTtpZihhLmI9PXRoaXMpe3ZhciBkPUxjKGEpO3RoaXMuZ1tkXT1hO0hhKHRoaXMuYyxhKX1lbHNlIHFhKHRoaXMuZyxMYyhhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuYiYmYS5ZKXt2YXIgZT1hLmI7ZD1hLlk7ZS5nJiZkPyhlPWUuZyxkPShudWxsIT09ZSYmZCBpbiBlP2VbZF06dm9pZCAwKXx8bnVsbCk6ZD1udWxsfWlmKGQmJmEuYiE9dGhpcyl0aHJvdyBFcnJvcigiVW5hYmxlIHRvIHNldCBwYXJlbnQgY29tcG9uZW50Iik7CmEuYj10aGlzO0suaS5yYS5jYWxsKGEsdGhpcyk7TGEodGhpcy5jLGIsMCxhKTtpZihhLm0mJnRoaXMubSYmYS5iPT10aGlzKWM9dGhpcy5qYSgpLGI9Yy5jaGlsZE5vZGVzW2JdfHxudWxsLGIhPWEuZigpJiZjLmluc2VydEJlZm9yZShhLmYoKSxiKTtlbHNlIGlmKGMpe3RoaXMuYXx8dGhpcy5pYSgpO2M9TCh0aGlzLGIrMSk7Yj10aGlzLmphKCk7Yz1jP2MuYTpudWxsO2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTthLmF8fGEuaWEoKTtiP2IuaW5zZXJ0QmVmb3JlKGEuYSxjfHxudWxsKTphLmouYS5ib2R5LmFwcGVuZENoaWxkKGEuYSk7YS5iJiYhYS5iLm18fGEuRCgpfWVsc2UgdGhpcy5tJiYhYS5tJiZhLmEmJmEuYS5wYXJlbnROb2RlJiYxPT1hLmEucGFyZW50Tm9kZS5ub2RlVHlwZSYmYS5EKCl9O2guamE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hfTsKdmFyIFNjPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEucWEpe3ZhciBiPWEubT9hLmE6YS5qLmEuYm9keTthOnt2YXIgYz1xYihiKTtpZihjLmRlZmF1bHRWaWV3JiZjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihjPWMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpKSl7Yz1jLmRpcmVjdGlvbnx8Yy5nZXRQcm9wZXJ0eVZhbHVlKCJkaXJlY3Rpb24iKXx8IiI7YnJlYWsgYX1jPSIifWEucWE9InJ0bCI9PShjfHwoYi5jdXJyZW50U3R5bGU/Yi5jdXJyZW50U3R5bGUuZGlyZWN0aW9uOm51bGwpfHxiLnN0eWxlJiZiLnN0eWxlLmRpcmVjdGlvbil9cmV0dXJuIGEucWF9LFJjPWZ1bmN0aW9uKGEpe3JldHVybiBhLmM/YS5jLmxlbmd0aDowfSxMPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuYz9hLmNbYl18fG51bGw6bnVsbH0sUWM9ZnVuY3Rpb24oYSxiLGMpe2EuYyYmcihhLmMsYixjKX0sVGM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jJiZiP0RhKGEuYyxiKTotMX07dmFyIFZjPWZ1bmN0aW9uKGEsYil7aWYoIWEpdGhyb3cgRXJyb3IoIkludmFsaWQgY2xhc3MgbmFtZSAiK2EpO2lmKCFpYShiKSl0aHJvdyBFcnJvcigiSW52YWxpZCBkZWNvcmF0b3IgZnVuY3Rpb24gIitiKTtVY1thXT1ifSxXYz17fSxVYz17fTt2YXIgWGM9ZnVuY3Rpb24oYSl7dGhpcy5oPWF9O2RhKFhjKTt2YXIgWWM9ZnVuY3Rpb24oYSxiKXthJiYoYS50YWJJbmRleD1iPzA6LTEpfSwkYz1mdW5jdGlvbihhLGIsYyl7Yy5pZCYmTWMoYixjLmlkKTt2YXIgZD1hLmIoKSxlPSExLGY9RChjKTtmJiZyKGYsZnVuY3Rpb24oZyl7Zz09ZD9lPSEwOmcmJnRoaXMuZyhiLGcsZCl9LGEpO2V8fEViKGMsZCk7WmMoYixjKTtyZXR1cm4gY307WGMucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiLGMpe2I9PWMrIi1kaXNhYmxlZCI/YS5aKCExKTpiPT1jKyItaG9yaXpvbnRhbCI/YWQoYSwiaG9yaXpvbnRhbCIpOmI9PWMrIi12ZXJ0aWNhbCImJmFkKGEsInZlcnRpY2FsIil9Owp2YXIgWmM9ZnVuY3Rpb24oYSxiKXtpZihiKWZvcih2YXIgYz1iLmZpcnN0Q2hpbGQsZDtjJiZjLnBhcmVudE5vZGU9PWI7KXtkPWMubmV4dFNpYmxpbmc7aWYoMT09Yy5ub2RlVHlwZSl7YTp7dmFyIGU9YztxKGUpO2U9RChlKTtmb3IodmFyIGY9MCxnPWUubGVuZ3RoO2Y8ZztmKyspe3ZhciBrPWVbZl07aWYoaz1rIGluIFVjP1VjW2tdKCk6bnVsbCl7ZT1rO2JyZWFrIGF9fWU9bnVsbH1lJiYoZS5hPWMsYS5pc0VuYWJsZWQoKXx8ZS5aKCExKSxhLnNhKGUpLFBjKGUsYykpfWVsc2UgYy5ub2RlVmFsdWUmJiIiIT1NYShjLm5vZGVWYWx1ZSl8fGIucmVtb3ZlQ2hpbGQoYyk7Yz1kfX0sYmQ9ZnVuY3Rpb24oYSxiKXtiPWIuZigpO3EoYiwiVGhlIGNvbnRhaW5lciBET00gZWxlbWVudCBjYW5ub3QgYmUgbnVsbC4iKTtIYyhiLHgpO3YmJihiLmhpZGVGb2N1cz0hMCk7KGE9YS5oKSYmdmIoYixhKX07WGMucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKWGMucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5iKCksYz1bYiwiaG9yaXpvbnRhbCI9PWEuSD9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgTT1mdW5jdGlvbigpe30sY2Q7ZGEoTSk7dmFyIGRkPXtidXR0b246InByZXNzZWQiLGNoZWNrYm94OiJjaGVja2VkIixtZW51aXRlbToic2VsZWN0ZWQiLG1lbnVpdGVtY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtcmFkaW86ImNoZWNrZWQiLHJhZGlvOiJjaGVja2VkIix0YWI6InNlbGVjdGVkIix0cmVlaXRlbToic2VsZWN0ZWQifTtNLnByb3RvdHlwZS5oPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLmouYigiRElWIixlZCh0aGlzLGEpLmpvaW4oIiAiKSxhLmJhKX07dmFyIGdkPWZ1bmN0aW9uKGEsYixjKXtpZihhPWEuZj9hLmYoKTphKXt2YXIgZD1bYl07diYmIUEoIjciKSYmKGQ9ZmQoRChhKSxiKSxkLnB1c2goYikpOyhjP0ZiOkhiKShhLGQpfX07Ck0ucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiKXtiLmlkJiZNYyhhLGIuaWQpO2ImJmIuZmlyc3RDaGlsZD9oZChhLGIuZmlyc3RDaGlsZC5uZXh0U2libGluZz9KYShiLmNoaWxkTm9kZXMpOmIuZmlyc3RDaGlsZCk6YS5iYT1udWxsO3ZhciBjPTAsZD10aGlzLmEoKSxlPXRoaXMuYSgpLGY9ITEsZz0hMSxrPSExLHA9SmEoRChiKSk7cihwLGZ1bmN0aW9uKEIpe2Z8fEIhPWQ/Z3x8QiE9ZT9jfD1pZCh0aGlzLEIpOmc9ITA6KGY9ITAsZT09ZCYmKGc9ITApKTsxPT1pZCh0aGlzLEIpJiYoQWEoYiksc2IoYikmJnRiKGIpJiZyYihiLCExKSl9LHRoaXMpO2Eubz1jO2Z8fChwLnB1c2goZCksZT09ZCYmKGc9ITApKTtnfHxwLnB1c2goZSk7KGE9YS53YSkmJnAucHVzaC5hcHBseShwLGEpO2lmKHYmJiFBKCI3Iikpe3ZhciB3PWZkKHApOzA8dy5sZW5ndGgmJihwLnB1c2guYXBwbHkocCx3KSxrPSEwKX1mJiZnJiYhYSYmIWt8fENiKGIscC5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIGpkPWZ1bmN0aW9uKGEsYil7aWYoYT1hLmgoKSl7cShiLCJUaGUgZWxlbWVudCBwYXNzZWQgYXMgYSBmaXJzdCBwYXJhbWV0ZXIgY2Fubm90IGJlIG51bGwuIik7dmFyIGM9Yi5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDthIT1jJiZ2YihiLGEpfX0sa2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYztpZihhLnYmMzImJihjPWEuZigpKSl7aWYoIWImJmEubyYzMil7dHJ5e2MuYmx1cigpfWNhdGNoKGQpe31hLm8mMzImJmEuRmEobnVsbCl9KHNiKGMpJiZ0YihjKSkhPWImJnJiKGMsYil9fSxsZD1mdW5jdGlvbihhLGIsYyl7Y2R8fChjZD17MToiZGlzYWJsZWQiLDg6InNlbGVjdGVkIiwxNjoiY2hlY2tlZCIsNjQ6ImV4cGFuZGVkIn0pO3EoYSwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO2I9Y2RbYl07dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDtkJiYoZD1kZFtkXXx8YixiPSJjaGVja2VkIj09Ynx8InNlbGVjdGVkIj09CmI/ZDpiKTtiJiZ4YihhLGIsYyl9O00ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250cm9sIn07CnZhciBlZD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuYSgpLGQ9W2NdLGU9YS5hKCk7ZSE9YyYmZC5wdXNoKGUpO2M9Yi5vO2ZvcihlPVtdO2M7KXt2YXIgZj1jJi1jO2UucHVzaChtZChhLGYpKTtjJj1+Zn1kLnB1c2guYXBwbHkoZCxlKTsoYT1iLndhKSYmZC5wdXNoLmFwcGx5KGQsYSk7diYmIUEoIjciKSYmZC5wdXNoLmFwcGx5KGQsZmQoZCkpO3JldHVybiBkfSxmZD1mdW5jdGlvbihhLGIpe3ZhciBjPVtdO2ImJihhPUlhKGEsW2JdKSk7cihbXSxmdW5jdGlvbihkKXshRmEoZCxsYShHYSxhKSl8fGImJiFHYShkLGIpfHxjLnB1c2goZC5qb2luKCJfIikpfSk7cmV0dXJuIGN9LG1kPWZ1bmN0aW9uKGEsYil7YS5ifHxuZChhKTtyZXR1cm4gYS5iW2JdfSxpZD1mdW5jdGlvbihhLGIpe2Euanx8KGEuYnx8bmQoYSksYS5qPXNhKGEuYikpO2E9cGFyc2VJbnQoYS5qW2JdLDEwKTtyZXR1cm4gaXNOYU4oYSk/MDphfSxuZD1mdW5jdGlvbihhKXt2YXIgYj1hLmEoKSxjPSF0KGIucmVwbGFjZSgvXHhhMHxccy9nLAoiICIpLCIgIik7cShjLCJDb250cm9sUmVuZGVyZXIgaGFzIGFuIGludmFsaWQgY3NzIGNsYXNzOiAnIitiKyInIik7YS5iPXsxOmIrIi1kaXNhYmxlZCIsMjpiKyItaG92ZXIiLDQ6YisiLWFjdGl2ZSIsODpiKyItc2VsZWN0ZWQiLDE2OmIrIi1jaGVja2VkIiwzMjpiKyItZm9jdXNlZCIsNjQ6YisiLW9wZW4ifX07dmFyIE49ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO2lmKCFiKXtiPXRoaXMuY29uc3RydWN0b3I7Zm9yKHZhciBkO2I7KXtkPWJbamFdfHwoYltqYV09KytrYSk7aWYoZD1XY1tkXSlicmVhaztiPWIuaT9iLmkuY29uc3RydWN0b3I6bnVsbH1iPWQ/aWEoZC5SKT9kLlIoKTpuZXcgZDpudWxsfXRoaXMuQj1iO3RoaXMuYmE9dm9pZCAwIT09YT9hOm51bGx9O24oTixLKTtoPU4ucHJvdG90eXBlO2guYmE9bnVsbDtoLm89MDtoLnY9Mzk7aC5LPTA7aC5JYT0hMDtoLndhPW51bGw7aC55YT0hMDtoLmlhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CLmModGhpcyk7dGhpcy5hPWE7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmeGIoYSwiaGlkZGVuIiwhMCkpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hPXRoaXMuQi5nKHRoaXMsYSk7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5JYT0ibm9uZSIhPWEuc3R5bGUuZGlzcGxheX07CmguRD1mdW5jdGlvbigpe04uaS5ELmNhbGwodGhpcyk7dmFyIGE9TmModGhpcyk7cSh0aGlzKTtxKGEpO3RoaXMuaXNWaXNpYmxlKCl8fHhiKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fGxkKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy52JjgmJmxkKGEsOCwhISh0aGlzLm8mOCkpO3RoaXMudiYxNiYmbGQoYSwxNiwhISh0aGlzLm8mMTYpKTt0aGlzLnYmNjQmJmxkKGEsNjQsISEodGhpcy5vJjY0KSk7YT10aGlzLkI7U2ModGhpcykmJmdkKHRoaXMuZigpLGEuYSgpKyItcnRsIiwhMCk7dGhpcy5pc0VuYWJsZWQoKSYma2QodGhpcyx0aGlzLmlzVmlzaWJsZSgpKTtpZih0aGlzLnYmLTImJih0aGlzLnlhJiZvZCh0aGlzLCEwKSx0aGlzLnYmMzImJihhPXRoaXMuZigpKSkpe3ZhciBiPXRoaXMuV3x8KHRoaXMuVz1uZXcgSik7emMoYixhKTtIKEgoSChPYyh0aGlzKSxiLCJrZXkiLHRoaXMuZmEpLGEsImZvY3VzIix0aGlzLk5hKSxhLCJibHVyIiwKdGhpcy5GYSl9fTt2YXIgb2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYz1PYyhhKSxkPWEuZigpO2I/KEgoSChIKEgoYyxkLEYuTCxhLmthKSxkLFtGLk0sRi5hYV0sYS5sYSksZCwibW91c2VvdmVyIixhLkFhKSxkLCJtb3VzZW91dCIsYS56YSksYS5lYSE9Y2EmJkgoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fEgoYyxkLCJkYmxjbGljayIsYS5KYSksYS5nYXx8KGEuZ2E9bmV3IHBkKGEpLHpiKGEsbGEoQWIsYS5nYSkpKSkpOihxYyhxYyhxYyhxYyhjLGQsRi5MLGEua2EpLGQsW0YuTSxGLmFhXSxhLmxhKSxkLCJtb3VzZW92ZXIiLGEuQWEpLGQsIm1vdXNlb3V0IixhLnphKSxhLmVhIT1jYSYmcWMoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fHFjKGMsZCwiZGJsY2xpY2siLGEuSmEpLEFiKGEuZ2EpLGEuZ2E9bnVsbCkpfTsKTi5wcm90b3R5cGUuUD1mdW5jdGlvbigpe04uaS5QLmNhbGwodGhpcyk7dGhpcy5XJiZGYyh0aGlzLlcpO3RoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJmtkKHRoaXMsITEpfTtOLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7Ti5pLnUuY2FsbCh0aGlzKTt0aGlzLlcmJih0aGlzLlcuTigpLGRlbGV0ZSB0aGlzLlcpO2RlbGV0ZSB0aGlzLkI7dGhpcy5nYT10aGlzLndhPXRoaXMuYmE9bnVsbH07dmFyIGhkPWZ1bmN0aW9uKGEsYil7YS5iYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm8mMSl9OwpOLnByb3RvdHlwZS5aPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYjtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0VuYWJsZWQmJiFiLmlzRW5hYmxlZCgpfHwhTyh0aGlzLDEsIWEpfHwoYXx8KHFkKHRoaXMsITEpLFAodGhpcywhMSkpLHRoaXMuaXNWaXNpYmxlKCkmJmtkKHRoaXMsYSksUSh0aGlzLDEsIWEsITApKX07CnZhciBQPWZ1bmN0aW9uKGEsYil7TyhhLDIsYikmJlEoYSwyLGIpfSxxZD1mdW5jdGlvbihhLGIpe08oYSw0LGIpJiZRKGEsNCxiKX0scmQ9ZnVuY3Rpb24oYSxiKXtPKGEsOCxiKSYmUShhLDgsYil9LHNkPWZ1bmN0aW9uKGEsYil7TyhhLDY0LGIpJiZRKGEsNjQsYil9LFE9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIWQmJjE9PWIpYS5aKCFjKTtlbHNlIGlmKGEudiZiJiZjIT0hIShhLm8mYikpe3ZhciBlPWEuQjtpZihkPWEuZigpKShlPW1kKGUsYikpJiZnZChhLGUsYyksbGQoZCxiLGMpO2Eubz1jP2Eub3xiOmEubyZ+Yn19LHRkPWZ1bmN0aW9uKGEsYixjKXtpZihhLm0mJmEubyZiJiYhYyl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTshYyYmYS5vJmImJlEoYSxiLCExKTthLnY9Yz9hLnZ8YjphLnYmfmJ9LFI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hISgyNTUmYikmJiEhKGEudiZiKX0sTz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuISEoYS52JmIpJiYhIShhLm8mCmIpIT1jJiYoIShhLksmYil8fHVjKGEsS2MoYixjKSkpJiYhYS5VfTtoPU4ucHJvdG90eXBlO2guQWE9ZnVuY3Rpb24oYSl7KCFhLnJlbGF0ZWRUYXJnZXR8fCFwYih0aGlzLmYoKSxhLnJlbGF0ZWRUYXJnZXQpKSYmdWModGhpcywiZW50ZXIiKSYmdGhpcy5pc0VuYWJsZWQoKSYmUih0aGlzLDIpJiZQKHRoaXMsITApfTtoLnphPWZ1bmN0aW9uKGEpe2EucmVsYXRlZFRhcmdldCYmcGIodGhpcy5mKCksYS5yZWxhdGVkVGFyZ2V0KXx8IXVjKHRoaXMsImxlYXZlIil8fChSKHRoaXMsNCkmJnFkKHRoaXMsITEpLFIodGhpcywyKSYmUCh0aGlzLCExKSl9O2guZWE9Y2E7Cmgua2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSxPYihhKSYmISh5JiZ6JiZhLmN0cmxLZXkpKSl7Uih0aGlzLDQpJiZxZCh0aGlzLCEwKTt2YXIgYjtpZihiPXRoaXMuQil7dmFyIGM7Yj10aGlzLnYmMzImJihjPXRoaXMuZigpKT9zYihjKSYmdGIoYyk6ITF9YiYmdGhpcy5mKCkuZm9jdXMoKX0hT2IoYSl8fHkmJnomJmEuY3RybEtleXx8YS5nKCl9O2gubGE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSx0aGlzLm8mNCYmdWQodGhpcyxhKSYmUih0aGlzLDQpJiZxZCh0aGlzLCExKSl9O2guSmE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmdWQodGhpcyxhKX07CnZhciB1ZD1mdW5jdGlvbihhLGIpe2lmKFIoYSwxNikpe3ZhciBjPSEoYS5vJjE2KTtPKGEsMTYsYykmJlEoYSwxNixjKX1SKGEsOCkmJnJkKGEsITApO1IoYSw2NCkmJnNkKGEsIShhLm8mNjQpKTtjPW5ldyBFKCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuQT1iLkEpO3JldHVybiB1YyhhLGMpfTtOLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe1IodGhpcywzMikmJk8odGhpcywzMiwhMCkmJlEodGhpcywzMiwhMCl9O04ucHJvdG90eXBlLkZhPWZ1bmN0aW9uKCl7Uih0aGlzLDQpJiZxZCh0aGlzLCExKTtSKHRoaXMsMzIpJiZPKHRoaXMsMzIsITEpJiZRKHRoaXMsMzIsITEpfTsKTi5wcm90b3R5cGUuZmE9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJjEzPT1hLmMmJnVkKHRoaXMsYSk/KGEuZygpLGEuaigpLCEwKTohMX07aWYoIWlhKE4pKXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBjbGFzcyAiK04pO2lmKCFpYShNKSl0aHJvdyBFcnJvcigiSW52YWxpZCByZW5kZXJlciBjbGFzcyAiK00pO3ZhciB2ZD1OW2phXXx8KE5bamFdPSsra2EpO1djW3ZkXT1NO1ZjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIHBkPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9ITE7dGhpcy5jPW5ldyBvYyh0aGlzKTt6Yih0aGlzLGxhKEFiLHRoaXMuYykpO2E9TmModGhpcy5iKTtIKEgoSCh0aGlzLmMsYSxGLkwsdGhpcy5oKSxhLEYuTSx0aGlzLmopLGEsImNsaWNrIix0aGlzLmcpfTtuKHBkLEMpO3ZhciB3ZD0hdnx8OTw9TnVtYmVyKGliKTsKcGQucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXt0aGlzLmE9ITF9O3BkLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7dGhpcy5hPSEwfTt2YXIgeGQ9ZnVuY3Rpb24oYSxiKXtpZighd2QpcmV0dXJuIGEuYnV0dG9uPTAsYS50eXBlPWIsYTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudHMiKTtjLmluaXRNb3VzZUV2ZW50KGIsYS5idWJibGVzLGEuY2FuY2VsYWJsZSxhLnZpZXd8fG51bGwsYS5kZXRhaWwsYS5zY3JlZW5YLGEuc2NyZWVuWSxhLmNsaWVudFgsYS5jbGllbnRZLGEuY3RybEtleSxhLmFsdEtleSxhLnNoaWZ0S2V5LGEubWV0YUtleSwwLGEucmVsYXRlZFRhcmdldHx8bnVsbCk7cmV0dXJuIGN9OwpwZC5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXtpZih0aGlzLmEpdGhpcy5hPSExO2Vsc2V7dmFyIGI9YS5iLGM9Yi5idXR0b24sZD1iLnR5cGUsZT14ZChiLCJtb3VzZWRvd24iKTt0aGlzLmIua2EobmV3IEcoZSxhLmEpKTtlPXhkKGIsIm1vdXNldXAiKTt0aGlzLmIubGEobmV3IEcoZSxhLmEpKTt3ZHx8KGIuYnV0dG9uPWMsYi50eXBlPWQpfX07cGQucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt0aGlzLmI9bnVsbDtwZC5pLnUuY2FsbCh0aGlzKX07dmFyIFM9ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO3RoaXMuZGE9Ynx8WGMuUigpO3RoaXMuSD1hfHwidmVydGljYWwifTtuKFMsSyk7aD1TLnByb3RvdHlwZTtoLkRhPW51bGw7aC5jYT1udWxsO2guZGE9bnVsbDtoLkg9bnVsbDtoLlQ9ITA7aC5PPSEwO2gubD0tMTtoLnM9bnVsbDtoLlY9ITE7aC5JPW51bGw7dmFyIHlkPWZ1bmN0aW9uKGEpe3JldHVybiBhLkRhfHxhLmYoKX07aD1TLnByb3RvdHlwZTtoLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPXRoaXMuai5iKCJESVYiLHRoaXMuZGEuYyh0aGlzKS5qb2luKCIgIikpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKGEpe3JldHVybiJESVYiPT1hLnRhZ05hbWV9O2gudmE9ZnVuY3Rpb24oYSl7dGhpcy5hPSRjKHRoaXMuZGEsdGhpcyxhKTsibm9uZSI9PWEuc3R5bGUuZGlzcGxheSYmKHRoaXMuVD0hMSl9OwpoLkQ9ZnVuY3Rpb24oKXtTLmkuRC5jYWxsKHRoaXMpO1FjKHRoaXMsZnVuY3Rpb24oYil7Yi5tJiZ6ZCh0aGlzLGIpfSx0aGlzKTt2YXIgYT10aGlzLmYoKTtiZCh0aGlzLmRhLHRoaXMpO0FkKHRoaXMsdGhpcy5UKTtIKEgoSChIKEgoSChIKEgoT2ModGhpcyksdGhpcywiZW50ZXIiLHRoaXMuV2EpLHRoaXMsImhpZ2hsaWdodCIsdGhpcy5YYSksdGhpcywidW5oaWdobGlnaHQiLHRoaXMuY2IpLHRoaXMsIm9wZW4iLHRoaXMuWWEpLHRoaXMsImNsb3NlIix0aGlzLlVhKSxhLEYuTCx0aGlzLlNhKSxxYihhKSxbRi5NLEYuYWFdLHRoaXMuVmEpLGEsW0YuTCxGLk0sRi5hYSwibW91c2VvdmVyIiwibW91c2VvdXQiLCJjb250ZXh0bWVudSJdLHRoaXMuVGEpO0JkKHRoaXMpfTt2YXIgQmQ9ZnVuY3Rpb24oYSl7dmFyIGI9T2MoYSksYz15ZChhKTtIKEgoSChiLGMsImZvY3VzIixhLkhhKSxjLCJibHVyIixhLlFhKSxhLmNhfHwoYS5jYT1uZXcgSih5ZChhKSkpLCJrZXkiLGEuUmEpfTtoPVMucHJvdG90eXBlOwpoLlA9ZnVuY3Rpb24oKXtDZCh0aGlzLC0xKTt0aGlzLnMmJnNkKHRoaXMucywhMSk7dGhpcy5WPSExO1MuaS5QLmNhbGwodGhpcyl9O2gudT1mdW5jdGlvbigpe1MuaS51LmNhbGwodGhpcyk7dGhpcy5jYSYmKHRoaXMuY2EuTigpLHRoaXMuY2E9bnVsbCk7dGhpcy5kYT10aGlzLnM9dGhpcy5JPXRoaXMuRGE9bnVsbH07aC5XYT1mdW5jdGlvbigpe3JldHVybiEwfTsKaC5YYT1mdW5jdGlvbihhKXt2YXIgYj1UYyh0aGlzLGEudGFyZ2V0KTtpZigtMTxiJiZiIT10aGlzLmwpe3ZhciBjPUwodGhpcyx0aGlzLmwpO2MmJlAoYywhMSk7dGhpcy5sPWI7Yz1MKHRoaXMsdGhpcy5sKTt0aGlzLlYmJnFkKGMsITApO3RoaXMucyYmYyE9dGhpcy5zJiYoYy52JjY0P3NkKGMsITApOnNkKHRoaXMucywhMSkpfWI9dGhpcy5mKCk7cShiLCJUaGUgRE9NIGVsZW1lbnQgZm9yIHRoZSBjb250YWluZXIgY2Fubm90IGJlIG51bGwuIik7bnVsbCE9YS50YXJnZXQuZigpJiZ4YihiLCJhY3RpdmVkZXNjZW5kYW50IixhLnRhcmdldC5mKCkuaWQpfTtoLmNiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT1MKHRoaXMsdGhpcy5sKSYmKHRoaXMubD0tMSk7YT10aGlzLmYoKTtxKGEsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnJlbW92ZUF0dHJpYnV0ZSh3YigiYWN0aXZlZGVzY2VuZGFudCIpKX07CmguWWE9ZnVuY3Rpb24oYSl7KGE9YS50YXJnZXQpJiZhIT10aGlzLnMmJmEuYj09dGhpcyYmKHRoaXMucyYmc2QodGhpcy5zLCExKSx0aGlzLnM9YSl9O2guVWE9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMucyYmKHRoaXMucz1udWxsKTt2YXIgYj10aGlzLmYoKSxjPWEudGFyZ2V0LmYoKTtiJiZhLnRhcmdldC5vJjImJmMmJihhPSIiLGMmJihhPWMuaWQscShhLCJUaGUgYWN0aXZlIGVsZW1lbnQgc2hvdWxkIGhhdmUgYW4gaWQuIikpLHhiKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEpKX07aC5TYT1mdW5jdGlvbihhKXt0aGlzLk8mJih0aGlzLlY9ITApO3ZhciBiPXlkKHRoaXMpO2ImJnNiKGIpJiZ0YihiKT9iLmZvY3VzKCk6YS5nKCl9O2guVmE9ZnVuY3Rpb24oKXt0aGlzLlY9ITF9OwpoLlRhPWZ1bmN0aW9uKGEpe2E6e3ZhciBiPWEudGFyZ2V0O2lmKHRoaXMuSSlmb3IodmFyIGM9dGhpcy5mKCk7YiYmYiE9PWM7KXt2YXIgZD1iLmlkO2lmKGQgaW4gdGhpcy5JKXtiPXRoaXMuSVtkXTticmVhayBhfWI9Yi5wYXJlbnROb2RlfWI9bnVsbH1pZihiKXN3aXRjaChhLnR5cGUpe2Nhc2UgRi5MOmIua2EoYSk7YnJlYWs7Y2FzZSBGLk06Y2FzZSBGLmFhOmIubGEoYSk7YnJlYWs7Y2FzZSAibW91c2VvdmVyIjpiLkFhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3V0IjpiLnphKGEpO2JyZWFrO2Nhc2UgImNvbnRleHRtZW51IjpiLmVhKGEpfX07aC5IYT1mdW5jdGlvbigpe307aC5RYT1mdW5jdGlvbigpe0NkKHRoaXMsLTEpO3RoaXMuVj0hMTt0aGlzLnMmJnNkKHRoaXMucywhMSl9OwpoLlJhPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmlzRW5hYmxlZCgpJiZ0aGlzLmlzVmlzaWJsZSgpJiYoMCE9UmModGhpcyl8fHRoaXMuRGEpJiZEZCh0aGlzLGEpPyhhLmcoKSxhLmooKSwhMCk6ITF9Owp2YXIgRGQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1MKGEsYS5sKTtpZihjJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5mYSYmYy5mYShiKXx8YS5zJiZhLnMhPWMmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLnMuZmEmJmEucy5mYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuYyl7Y2FzZSAyNzp5ZChhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpFZChhKTticmVhaztjYXNlIDM1OkZkKGEpO2JyZWFrO2Nhc2UgMzg6aWYoInZlcnRpY2FsIj09YS5IKUdkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9IZChhKTpHZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoInZlcnRpY2FsIj09YS5IKUhkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9HZChhKTpIZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSx6ZD1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZigpO2M9Yy5pZHx8KGMuaWQ9TGMoYikpO2EuSXx8KGEuST17fSk7YS5JW2NdPWJ9O1MucHJvdG90eXBlLnNhPWZ1bmN0aW9uKGEsYil7Q2EoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtTLmkuc2EuY2FsbCh0aGlzLGEsYil9O1MucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEsYixjKXtDYShhLE4pO2EuS3w9MjthLkt8PTY0O3RkKGEsMzIsITEpO2EubSYmMCE9YS55YSYmb2QoYSwhMSk7YS55YT0hMTt2YXIgZD1hLmI9PXRoaXM/VGModGhpcyxhKTotMTtTLmkudGEuY2FsbCh0aGlzLGEsYixjKTthLm0mJnRoaXMubSYmemQodGhpcyxhKTthPWQ7LTE9PWEmJihhPVJjKHRoaXMpKTthPT10aGlzLmw/dGhpcy5sPU1hdGgubWluKFJjKHRoaXMpLTEsYik6YT50aGlzLmwmJmI8PXRoaXMubD90aGlzLmwrKzphPHRoaXMubCYmYj50aGlzLmwmJnRoaXMubC0tfTsKdmFyIGFkPWZ1bmN0aW9uKGEsYil7aWYoYS5mKCkpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5IPWJ9O1MucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O3ZhciBBZD1mdW5jdGlvbihhLGIpe2EuVD1iO3ZhciBjPWEuZigpO2MmJihjLnN0eWxlLmRpc3BsYXk9Yj8iIjoibm9uZSIsWWMoeWQoYSksYS5PJiZhLlQpKX07Uy5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT307Uy5wcm90b3R5cGUuWj1mdW5jdGlvbihhKXt0aGlzLk8hPWEmJnVjKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5PPSEwLFFjKHRoaXMsZnVuY3Rpb24oYil7Yi5MYT9kZWxldGUgYi5MYTpiLlooITApfSkpOihRYyh0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5aKCExKTpiLkxhPSEwfSksdGhpcy5WPXRoaXMuTz0hMSksWWMoeWQodGhpcyksYSYmdGhpcy5UKSl9Owp2YXIgQ2Q9ZnVuY3Rpb24oYSxiKXsoYj1MKGEsYikpP1AoYiwhMCk6LTE8YS5sJiZQKEwoYSxhLmwpLCExKX0sRWQ9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LFJjKGEpLTEpfSxGZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiAwPmI/Yy0xOmJ9LDApfSxIZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7cmV0dXJuKGIrMSklY30sYS5sKX0sR2Q9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe2ItLTtyZXR1cm4gMD5iP2MtMTpifSxhLmwpfSxJZD1mdW5jdGlvbihhLGIsYyl7Yz0wPmM/VGMoYSxhLnMpOmM7dmFyIGQ9UmMoYSk7Yz1iLmNhbGwoYSxjLGQpO2Zvcih2YXIgZT0wO2U8PWQ7KXt2YXIgZj1MKGEsYyksZztpZihnPWYpZz1mLmlzVmlzaWJsZSgpJiZmLmlzRW5hYmxlZCgpJiYhIShmLnYmMik7aWYoZyl7YS5FYShjKTticmVha31lKys7Yz1iLmNhbGwoYSxjLGQpfX07ClMucHJvdG90eXBlLkVhPWZ1bmN0aW9uKGEpe0NkKHRoaXMsYSl9O3ZhciBUPWZ1bmN0aW9uKCl7fTtuKFQsTSk7ZGEoVCk7VC5wcm90b3R5cGUuYT1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYiJ9O1QucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXtyZXR1cm4idGFiIn07VC5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYj1ULmkuYy5jYWxsKHRoaXMsYSk7KGE9YS5QYSkmJmImJihiLnRpdGxlPWF8fCIiKTtyZXR1cm4gYn07VC5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIpe2I9VC5pLmcuY2FsbCh0aGlzLGEsYik7dmFyIGM9Yi50aXRsZXx8IiI7YyYmKGEuUGE9Yyk7YS5vJjgmJihjPWEuYikmJmlhKGMuRykmJihRKGEsOCwhMSksYy5HKGEpKTtyZXR1cm4gYn07dmFyIEpkPWZ1bmN0aW9uKGEsYixjKXtOLmNhbGwodGhpcyxhLGJ8fFQuUigpLGMpO3RkKHRoaXMsOCwhMCk7dGhpcy5LfD05fTtuKEpkLE4pO1ZjKCJnb29nLXRhYiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEpkKG51bGwpfSk7dmFyIFU9ZnVuY3Rpb24oKXt0aGlzLmg9InRhYmxpc3QifTtuKFUsWGMpO2RhKFUpO1UucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWItYmFyIn07VS5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIsYyl7dGhpcy5qfHwodGhpcy5hfHxLZCh0aGlzKSx0aGlzLmo9c2EodGhpcy5hKSk7dmFyIGQ9dGhpcy5qW2JdO2Q/KGFkKGEsTGQoZCkpLGEuQj1kKTpVLmkuZy5jYWxsKHRoaXMsYSxiLGMpfTtVLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPVUuaS5jLmNhbGwodGhpcyxhKTt0aGlzLmF8fEtkKHRoaXMpO2IucHVzaCh0aGlzLmFbYS5CXSk7cmV0dXJuIGJ9O3ZhciBLZD1mdW5jdGlvbihhKXt2YXIgYj1hLmIoKTthLmE9e3RvcDpiKyItdG9wIixib3R0b206YisiLWJvdHRvbSIsc3RhcnQ6YisiLXN0YXJ0IixlbmQ6YisiLWVuZCJ9fTt2YXIgVj1mdW5jdGlvbihhLGIsYyl7YT1hfHwidG9wIjthZCh0aGlzLExkKGEpKTt0aGlzLkI9YTtTLmNhbGwodGhpcyx0aGlzLkgsYnx8VS5SKCksYyk7TWQodGhpcyl9O24oVixTKTtoPVYucHJvdG90eXBlO2guQz1udWxsO2guRD1mdW5jdGlvbigpe1YuaS5ELmNhbGwodGhpcyk7TWQodGhpcyl9O2gudT1mdW5jdGlvbigpe1YuaS51LmNhbGwodGhpcyk7dGhpcy5DPW51bGx9O2guRWE9ZnVuY3Rpb24oYSl7Vi5pLkVhLmNhbGwodGhpcyxhKTt0aGlzLkcoTCh0aGlzLGEpKX07aC5HPWZ1bmN0aW9uKGEpe2E/cmQoYSwhMCk6dGhpcy5DJiZyZCh0aGlzLkMsITEpfTsKdmFyIE5kPWZ1bmN0aW9uKGEsYil7aWYoYiYmYj09YS5DKXtmb3IodmFyIGM9VGMoYSxiKSxkPWMtMTtiPUwoYSxkKTtkLS0pe3ZhciBlPWI7aWYoZS5pc1Zpc2libGUoKSYmZS5pc0VuYWJsZWQoKSl7YS5HKGIpO3JldHVybn19Zm9yKGMrPTE7Yj1MKGEsYyk7YysrKWlmKGQ9YixkLmlzVmlzaWJsZSgpJiZkLmlzRW5hYmxlZCgpKXthLkcoYik7cmV0dXJufWEuRyhudWxsKX19O2g9Vi5wcm90b3R5cGU7aC5hYj1mdW5jdGlvbihhKXt0aGlzLkMmJnRoaXMuQyE9YS50YXJnZXQmJnJkKHRoaXMuQywhMSk7dGhpcy5DPWEudGFyZ2V0fTtoLmJiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT10aGlzLkMmJih0aGlzLkM9bnVsbCl9O2guWmE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guJGE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guSGE9ZnVuY3Rpb24oKXtMKHRoaXMsdGhpcy5sKXx8Q2QodGhpcyxUYyh0aGlzLHRoaXMuQ3x8TCh0aGlzLDApKSl9Owp2YXIgTWQ9ZnVuY3Rpb24oYSl7SChIKEgoSChPYyhhKSxhLCJzZWxlY3QiLGEuYWIpLGEsInVuc2VsZWN0IixhLmJiKSxhLCJkaXNhYmxlIixhLlphKSxhLCJoaWRlIixhLiRhKX0sTGQ9ZnVuY3Rpb24oYSl7cmV0dXJuInN0YXJ0Ij09YXx8ImVuZCI9PWE/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O1ZjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBWfSk7ZnVuY3Rpb24gT2QoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIFBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgZz1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIrZyk7Zm9yKHZhciBrPVtdLHA9YmEoYyksdz1wLm5leHQoKTshdy5kb25lO3c9cC5uZXh0KCkpe3c9dy52YWx1ZTt2YXIgQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKQi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO0IudGV4dENvbnRlbnQ9dztmLmFwcGVuZENoaWxkKEIpO2sucHVzaChCKX0iYm90dG9tIiE9ZyYmZS5hcHBlbmRDaGlsZChmKTtwPW51bGw7aWYoInRvcCI9PWd8fCJib3R0b20iPT1nKXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTsidG9wIj09ZyYmcCYmZS5hcHBlbmRDaGlsZChwKTtCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0IuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciByYT1bXTtjPWJhKGMpO2Zvcih3PWMubmV4dCgpOyF3LmRvbmU7dz1jLm5leHQoKSl3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHcuaWQ9ZS5pZCsiX2NvbnRlbnRfIityYS5sZW5ndGgsdy5zdHlsZS5kaXNwbGF5PSJub25lIixCLmFwcGVuZENoaWxkKHcpLHJhLnB1c2godyk7ZS5hcHBlbmRDaGlsZChCKTsiYm90dG9tIj09ZyYmKHAmJgplLmFwcGVuZENoaWxkKHApLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBYPW5ldyBWKGcpO1BjKFgsZik7dmFyIFk9LTE7ZGMoWCwic2VsZWN0IixmdW5jdGlvbihaKXtaPWsuaW5kZXhPZihaLnRhcmdldC5mKCkpO1ohPVkmJigwPD1ZJiZZPHJhLmxlbmd0aCYmKHJhW1ldLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFk9LTEpLDA8PVomJlo8cmEubGVuZ3RoJiYoWT1aLHJhW1ldLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksWC5HKEwoWCxZKSkpfSk7WC5HKEwoWCxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFope1guRyhMKFgsWikpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChPZChhKSl9LFFkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sVz1sOwpRZFswXWluIFd8fCJ1bmRlZmluZWQiPT10eXBlb2YgVy5leGVjU2NyaXB0fHxXLmV4ZWNTY3JpcHQoInZhciAiK1FkWzBdKTtmb3IodmFyIFJkO1FkLmxlbmd0aCYmKFJkPVFkLnNoaWZ0KCkpOylRZC5sZW5ndGh8fHZvaWQgMD09PVBkP1dbUmRdJiZXW1JkXSE9PU9iamVjdC5wcm90b3R5cGVbUmRdP1c9V1tSZF06Vz1XW1JkXT17fTpXW1JkXT1QZDt9KS5jYWxsKHRoaXMpOwovLyBjbGFuZy1mb3JtYXQgb24K", + "headers": [ + [ + "content-type", + "application/javascript" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + } + } + }, + "executionInfo": { + "elapsed": 1987, + "status": "ok", + "timestamp": 1600709601592, + "user": { + "displayName": "Evgeny Skvortsov", + "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhiQjODaOVLfYnUuWS9rB3LRntzJDM0hqElzsUkdQ=s64", + "userId": "11510585406840398626" + }, + "user_tz": 420 + }, + "id": "HempOoVrUnLq", + "outputId": "ba094744-0c93-4a9a-d3db-8547ce57730c" + }, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id1" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id1" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id1" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8a4faf1c-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id1\", \"tabNames\": [\"Even\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_8c9518ce3a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id1" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8a4fee46-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id1\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_b02226916b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id1" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8a512414-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_190c1ab2a5" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_1", + "outputarea_id1" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8a519fc0-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id1_content_1\");\n", + "//# sourceURL=js_6cbe50b920" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_1", + "outputarea_id1" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8a5211d0-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"8a519fc0-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_66fe676fd7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_1", + "outputarea_id1" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8a526004-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id1\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_4b6378a6ac" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_1", + "outputarea_id1" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running Even\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"8a54fde6-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"8a512414-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_66afa71b5f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_1", + "outputarea_id1" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8a563634-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_343ffecf91" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_0", + "outputarea_id1" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8a568508-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id1_content_0\");\n", + "//# sourceURL=js_af625692d7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_0", + "outputarea_id1" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8a56c13a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"8a568508-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_8c46cba774" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_0", + "outputarea_id1" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8a56fef2-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id1\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_3cc29f6934" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_0", + "outputarea_id1" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_0", + "outputarea_id1", + "outputarea_id2", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_0", + "outputarea_id1", + "outputarea_id2", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_0", + "outputarea_id1", + "outputarea_id2", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8a5858ba-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id2\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_6eb49a325c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_0", + "outputarea_id1", + "outputarea_id2", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8a58a3f6-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id2\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_26ea5737c4" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_0", + "outputarea_id1", + "outputarea_id2", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8a59ae5e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_e4cd1a1e14" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_0", + "id2_content_0", + "outputarea_id1", + "outputarea_id2", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8a59f878-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id2_content_0\");\n", + "//# sourceURL=js_39184c5a8a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_0", + "id2_content_0", + "outputarea_id1", + "outputarea_id2", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8a5a4242-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"8a59f878-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_431f06a9a5" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_0", + "id2_content_0", + "outputarea_id1", + "outputarea_id2", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8a5aec2e-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id2\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_0652ea9a09" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_0", + "id2_content_0", + "outputarea_id1", + "outputarea_id2", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mEven_sql\u001b[0m variable.\n", + "SELECT\n", + " x_4 AS col0\n", + "FROM\n", + " UNNEST(GENERATE_ARRAY(0, 20 - 1)) as x_4, UNNEST(GENERATE_ARRAY(0, 20 - 1)) as x_6\n", + "WHERE\n", + " x_6 = ((x_4) / (2));\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"8a5ba678-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"8a59ae5e-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_0b4188a363" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_0", + "id2_content_0", + "outputarea_id1", + "outputarea_id2", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8a5d9fe6-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"8a563634-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_e9a1711816" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_0", + "outputarea_id1" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8a5f967a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b806f3cf26" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_1", + "outputarea_id1" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8a5ff034-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id1_content_1\");\n", + "//# sourceURL=js_8b9f7a308c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_1", + "outputarea_id1" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8a6055e2-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"8a5ff034-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_17988268e5" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_1", + "outputarea_id1" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8a60b898-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id1\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_878d2825f8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_1", + "outputarea_id1" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8b3ebc06-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"8a5f967a-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_db78823990" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_1", + "outputarea_id1" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8b427cb0-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_ed40b3b3f8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_0", + "outputarea_id1" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8b431f94-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id1_content_0\");\n", + "//# sourceURL=js_cfac2ec3e1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_0", + "outputarea_id1" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8b43b56c-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"8b431f94-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_e47c557d2c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_0", + "outputarea_id1" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8b44148a-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id1\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_a612fadbf5" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_0", + "outputarea_id1" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8b46248c-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_7e9ccd671f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_0", + "id2_content_1", + "outputarea_id1", + "outputarea_id2", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8b46a95c-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id2_content_1\");\n", + "//# sourceURL=js_9d35794e39" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_0", + "id2_content_1", + "outputarea_id1", + "outputarea_id2", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8b470398-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"8b46a95c-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_15d95afa6b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_0", + "id2_content_1", + "outputarea_id1", + "outputarea_id2", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8b477b20-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id2\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_ccac417a10" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_0", + "id2_content_1", + "outputarea_id1", + "outputarea_id2", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mEven\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0
00
12
24
36
48
510
612
714
816
918
\n", + "
" + ], + "text/plain": [ + " col0\n", + "0 0\n", + "1 2\n", + "2 4\n", + "3 6\n", + "4 8\n", + "5 10\n", + "6 12\n", + "7 14\n", + "8 16\n", + "9 18" + ] + }, + "metadata": { + "tags": [ + "id1_content_0", + "id2_content_1", + "outputarea_id1", + "outputarea_id2", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8b4c0cf8-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"8b46248c-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_9819f02da2" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_0", + "id2_content_1", + "outputarea_id1", + "outputarea_id2", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8b4d5a40-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"8b427cb0-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_5bf7283be7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id1_content_0", + "outputarea_id1" + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "%%logica Even\n", + "\n", + "Z(x) :- x in Range(20);\n", + "\n", + "Even(x) :- Z(x), Z(x / 2);" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "pmdQtLQQy4eJ" + }, + "source": [ + "In CoLab any evaluated predicate can be accessed from Python via a dataframe variable of the same name.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "executionInfo": { + "elapsed": 917, + "status": "ok", + "timestamp": 1600709608526, + "user": { + "displayName": "Evgeny Skvortsov", + "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhiQjODaOVLfYnUuWS9rB3LRntzJDM0hqElzsUkdQ=s64", + "userId": "11510585406840398626" + }, + "user_tz": 420 + }, + "id": "Po5bJhuny4vF", + "outputId": "ad1e02a3-675b-4176-dc91-0486aa558bc6" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Even numbers: 0, 2, 4, 6, 8, 10, 12, 14, 16, 18\n" + ] + } + ], + "source": [ + "print('Even numbers:', ', '.join(map(str, Even['col0'])))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Qr42t7sX18PI" + }, + "source": [ + "You can **create a copy of this tutorial** and tweak the querries. Querries run instantly via BigQuery." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "WNvuoVPJVzHg" + }, + "source": [ + "## Facts (aka Tables)\n", + "\n", + "You can specify a table row-by-row as follows." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 301, + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH0=", + "headers": [ + [ + "content-type", + "text/css" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgaCxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9ZnVuY3Rpb24oYSl7dmFyIGI9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmYVtTeW1ib2wuaXRlcmF0b3JdO3JldHVybiBiP2IuY2FsbChhKTp7bmV4dDphYShhKX19LGw9dGhpc3x8c2VsZixjYT1mdW5jdGlvbigpe30sZGE9ZnVuY3Rpb24oYSl7YS5CYT12b2lkIDA7YS5SPWZ1bmN0aW9uKCl7cmV0dXJuIGEuQmE/YS5CYTphLkJhPW5ldyBhfX0sZWE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7aWYoIm9iamVjdCI9PWIpaWYoYSl7aWYoYSBpbnN0YW5jZW9mIEFycmF5KXJldHVybiJhcnJheSI7aWYoYSBpbnN0YW5jZW9mIE9iamVjdClyZXR1cm4gYjt2YXIgYz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk7aWYoIltvYmplY3QgV2luZG93XSI9PWMpcmV0dXJuIm9iamVjdCI7CmlmKCJbb2JqZWN0IEFycmF5XSI9PWN8fCJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGgmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5zcGxpY2UmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoInNwbGljZSIpKXJldHVybiJhcnJheSI7aWYoIltvYmplY3QgRnVuY3Rpb25dIj09Y3x8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmNhbGwmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoImNhbGwiKSlyZXR1cm4iZnVuY3Rpb24ifWVsc2UgcmV0dXJuIm51bGwiO2Vsc2UgaWYoImZ1bmN0aW9uIj09YiYmInVuZGVmaW5lZCI9PXR5cGVvZiBhLmNhbGwpcmV0dXJuIm9iamVjdCI7cmV0dXJuIGJ9LGZhPWZ1bmN0aW9uKGEpe3JldHVybiJhcnJheSI9PWVhKGEpfSxoYT1mdW5jdGlvbihhKXt2YXIgYj1lYShhKTtyZXR1cm4iYXJyYXkiPT1ifHwib2JqZWN0Ij09CmImJiJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGh9LGlhPWZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PWVhKGEpfSxtPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBhO3JldHVybiJvYmplY3QiPT1iJiZudWxsIT1hfHwiZnVuY3Rpb24iPT1ifSxqYT0iY2xvc3VyZV91aWRfIisoMUU5Kk1hdGgucmFuZG9tKCk+Pj4wKSxrYT0wLGxhPWZ1bmN0aW9uKGEsYil7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe3ZhciBkPWMuc2xpY2UoKTtkLnB1c2guYXBwbHkoZCxhcmd1bWVudHMpO3JldHVybiBhLmFwcGx5KHRoaXMsZCl9fSxuPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe31jLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLmk9Yi5wcm90b3R5cGU7YS5wcm90b3R5cGU9bmV3IGM7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YX07dmFyIG1hLG5hPXtlYjoiYWN0aXZlZGVzY2VuZGFudCIsamI6ImF0b21pYyIsa2I6ImF1dG9jb21wbGV0ZSIsbWI6ImJ1c3kiLHBiOiJjaGVja2VkIixxYjoiY29saW5kZXgiLHZiOiJjb250cm9scyIseGI6ImRlc2NyaWJlZGJ5IixBYjoiZGlzYWJsZWQiLENiOiJkcm9wZWZmZWN0IixEYjoiZXhwYW5kZWQiLEViOiJmbG93dG8iLEdiOiJncmFiYmVkIixLYjoiaGFzcG9wdXAiLE1iOiJoaWRkZW4iLE9iOiJpbnZhbGlkIixQYjoibGFiZWwiLFFiOiJsYWJlbGxlZGJ5IixSYjoibGV2ZWwiLFdiOiJsaXZlIixrYzoibXVsdGlsaW5lIixsYzoibXVsdGlzZWxlY3RhYmxlIixwYzoib3JpZW50YXRpb24iLHFjOiJvd25zIixyYzoicG9zaW5zZXQiLHRjOiJwcmVzc2VkIix4YzoicmVhZG9ubHkiLHpjOiJyZWxldmFudCIsQWM6InJlcXVpcmVkIixFYzoicm93aW5kZXgiLEhjOiJzZWxlY3RlZCIsSmM6InNldHNpemUiLExjOiJzb3J0IixaYzoidmFsdWVtYXgiLCRjOiJ2YWx1ZW1pbiIsYWQ6InZhbHVlbm93IiwKYmQ6InZhbHVldGV4dCJ9O3ZhciBvYT1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkIGluIGEpYi5jYWxsKGMsYVtkXSxkLGEpfSxwYT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyBpbiBhKWlmKGFbY109PWIpcmV0dXJuITA7cmV0dXJuITF9LHFhPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsIT09YSYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfSxzYT1mdW5jdGlvbihhKXt2YXIgYj17fSxjO2ZvcihjIGluIGEpYlthW2NdXT1jO3JldHVybiBifSx0YT0iY29uc3RydWN0b3IgaGFzT3duUHJvcGVydHkgaXNQcm90b3R5cGVPZiBwcm9wZXJ0eUlzRW51bWVyYWJsZSB0b0xvY2FsZVN0cmluZyB0b1N0cmluZyB2YWx1ZU9mIi5zcGxpdCgiICIpLHVhPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8dGEubGVuZ3RoO2YrKyljPQp0YVtmXSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZCxjKSYmKGFbY109ZFtjXSl9fTt2YXIgdmE9e2ZiOiJhbGVydCIsZ2I6ImFsZXJ0ZGlhbG9nIixoYjoiYXBwbGljYXRpb24iLGliOiJhcnRpY2xlIixsYjoiYmFubmVyIixuYjoiYnV0dG9uIixvYjoiY2hlY2tib3giLHJiOiJjb2x1bW5oZWFkZXIiLHNiOiJjb21ib2JveCIsdGI6ImNvbXBsZW1lbnRhcnkiLHViOiJjb250ZW50aW5mbyIsd2I6ImRlZmluaXRpb24iLHliOiJkaWFsb2ciLHpiOiJkaXJlY3RvcnkiLEJiOiJkb2N1bWVudCIsRmI6ImZvcm0iLEhiOiJncmlkIixJYjoiZ3JpZGNlbGwiLEpiOiJncm91cCIsTGI6ImhlYWRpbmciLE5iOiJpbWciLFNiOiJsaW5rIixUYjoibGlzdCIsVWI6Imxpc3Rib3giLFZiOiJsaXN0aXRlbSIsWGI6ImxvZyIsWWI6Im1haW4iLFpiOiJtYXJxdWVlIiwkYjoibWF0aCIsYWM6Im1lbnUiLGJjOiJtZW51YmFyIixjYzoibWVudWl0ZW0iLGRjOiJtZW51aXRlbWNoZWNrYm94IixlYzoibWVudWl0ZW1yYWRpbyIsbWM6Im5hdmlnYXRpb24iLG5jOiJub3RlIixvYzoib3B0aW9uIiwKc2M6InByZXNlbnRhdGlvbiIsdWM6InByb2dyZXNzYmFyIix2YzoicmFkaW8iLHdjOiJyYWRpb2dyb3VwIix5YzoicmVnaW9uIixCYzoicm93IixDYzoicm93Z3JvdXAiLERjOiJyb3doZWFkZXIiLEZjOiJzY3JvbGxiYXIiLEdjOiJzZWFyY2giLEljOiJzZXBhcmF0b3IiLEtjOiJzbGlkZXIiLE1jOiJzcGluYnV0dG9uIixOYzoic3RhdHVzIixPYzoidGFiIixQYzoidGFibGlzdCIsUWM6InRhYnBhbmVsIixSYzoidGV4dGJveCIsU2M6InRleHRpbmZvIixUYzoidGltZXIiLFVjOiJ0b29sYmFyIixWYzoidG9vbHRpcCIsV2M6InRyZWUiLFhjOiJ0cmVlZ3JpZCIsWWM6InRyZWVpdGVtIn07dmFyIHdhPWZ1bmN0aW9uKGEpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsd2EpO2Vsc2V7dmFyIGI9RXJyb3IoKS5zdGFjaztiJiYodGhpcy5zdGFjaz1iKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSl9O24od2EsRXJyb3IpO3dhLnByb3RvdHlwZS5uYW1lPSJDdXN0b21FcnJvciI7dmFyIHhhO3ZhciB5YT1mdW5jdGlvbihhLGIpe2E9YS5zcGxpdCgiJXMiKTtmb3IodmFyIGM9IiIsZD1hLmxlbmd0aC0xLGU9MDtlPGQ7ZSsrKWMrPWFbZV0rKGU8Yi5sZW5ndGg/YltlXToiJXMiKTt3YS5jYWxsKHRoaXMsYythW2RdKX07bih5YSx3YSk7eWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjsKdmFyIHphPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSJBc3NlcnRpb24gZmFpbGVkIjtpZihjKXtlKz0iOiAiK2M7dmFyIGY9ZH1lbHNlIGEmJihlKz0iOiAiK2EsZj1iKTt0aHJvdyBuZXcgeWEoIiIrZSxmfHxbXSk7fSxxPWZ1bmN0aW9uKGEsYixjKXthfHx6YSgiIixudWxsLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX0sQWE9ZnVuY3Rpb24oYSxiLGMpe20oYSkmJjE9PWEubm9kZVR5cGV8fHphKCJFeHBlY3RlZCBFbGVtZW50IGJ1dCBnb3QgJXM6ICVzLiIsW2VhKGEpLGFdLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKX0sQ2E9ZnVuY3Rpb24oYSxiLGMsZCl7YSBpbnN0YW5jZW9mIGJ8fHphKCJFeHBlY3RlZCBpbnN0YW5jZW9mICVzIGJ1dCBnb3QgJXMuIixbQmEoYiksQmEoYSldLGMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpKX0sQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZgpGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTpudWxsPT09YT8ibnVsbCI6dHlwZW9mIGF9O3ZhciBEYT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3EobnVsbCE9YS5sZW5ndGgpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKCJzdHJpbmciPT09dHlwZW9mIGEpcmV0dXJuInN0cmluZyIhPT10eXBlb2YgYnx8MSE9Yi5sZW5ndGg/LTE6YS5pbmRleE9mKGIsMCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspaWYoYyBpbiBhJiZhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX0scj1BcnJheS5wcm90b3R5cGUuZm9yRWFjaD9mdW5jdGlvbihhLGIsYyl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsYyl9OmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9YS5sZW5ndGgsZT0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZj0wO2Y8ZDtmKyspZiBpbiBlJiZiLmNhbGwoYyxlW2ZdLGYsYSl9LEVhPUFycmF5LnByb3RvdHlwZS5maWx0ZXI/CmZ1bmN0aW9uKGEsYil7cShudWxsIT1hLmxlbmd0aCk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD1bXSxlPTAsZj0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZz0wO2c8YztnKyspaWYoZyBpbiBmKXt2YXIgaz1mW2ddO2IuY2FsbCh2b2lkIDAsayxnLGEpJiYoZFtlKytdPWspfXJldHVybiBkfSxGYT1BcnJheS5wcm90b3R5cGUuZXZlcnk/ZnVuY3Rpb24oYSxiKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmV2ZXJ5LmNhbGwoYSxiLHZvaWQgMCl9OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWEubGVuZ3RoLGQ9InN0cmluZyI9PT10eXBlb2YgYT9hLnNwbGl0KCIiKTphLGU9MDtlPGM7ZSsrKWlmKGUgaW4gZCYmIWIuY2FsbCh2b2lkIDAsZFtlXSxlLGEpKXJldHVybiExO3JldHVybiEwfSxHYT1mdW5jdGlvbihhLGIpe3JldHVybiAwPD0KRGEoYSxiKX0sSGE9ZnVuY3Rpb24oYSxiKXtiPURhKGEsYik7dmFyIGM7aWYoYz0wPD1iKXEobnVsbCE9YS5sZW5ndGgpLEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhLGIsMSk7cmV0dXJuIGN9LElhPWZ1bmN0aW9uKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGFyZ3VtZW50cyl9LEphPWZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDA8Yil7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX0sTGE9ZnVuY3Rpb24oYSxiLGMsZCl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShhLEthKGFyZ3VtZW50cywxKSl9LEthPWZ1bmN0aW9uKGEsYixjKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gMj49YXJndW1lbnRzLmxlbmd0aD9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsYixjKX07dmFyIE1hPVN0cmluZy5wcm90b3R5cGUudHJpbT9mdW5jdGlvbihhKXtyZXR1cm4gYS50cmltKCl9OmZ1bmN0aW9uKGEpe3JldHVybi9eW1xzXHhhMF0qKFtcc1xTXSo/KVtcc1x4YTBdKiQvLmV4ZWMoYSlbMV19LE5hPS8mL2csT2E9LzwvZyxQYT0vPi9nLFFhPS8iL2csUmE9LycvZyxTYT0vXHgwMC9nLFRhPS9bXHgwMCY8PiInXS8sdD1mdW5jdGlvbihhLGIpe3JldHVybi0xIT1hLmluZGV4T2YoYil9LFVhPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE8Yj8tMTphPmI/MTowfTt2YXIgdTthOnt2YXIgVmE9bC5uYXZpZ2F0b3I7aWYoVmEpe3ZhciBXYT1WYS51c2VyQWdlbnQ7aWYoV2Epe3U9V2E7YnJlYWsgYX19dT0iIn07LyoKCiBDb3B5cmlnaHQgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzLgogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKKi8KdmFyIFhhPWZ1bmN0aW9uKGEpe1RhLnRlc3QoYSkmJigtMSE9YS5pbmRleE9mKCImIikmJihhPWEucmVwbGFjZShOYSwiJmFtcDsiKSksLTEhPWEuaW5kZXhPZigiPCIpJiYoYT1hLnJlcGxhY2UoT2EsIiZsdDsiKSksLTEhPWEuaW5kZXhPZigiPiIpJiYoYT1hLnJlcGxhY2UoUGEsIiZndDsiKSksLTEhPWEuaW5kZXhPZignIicpJiYoYT1hLnJlcGxhY2UoUWEsIiZxdW90OyIpKSwtMSE9YS5pbmRleE9mKCInIikmJihhPWEucmVwbGFjZShSYSwiJiMzOTsiKSksLTEhPWEuaW5kZXhPZigiXHgwMCIpJiYoYT1hLnJlcGxhY2UoU2EsIiYjMDsiKSkpO3JldHVybiBhfTt2YXIgWWE9ZnVuY3Rpb24oYSl7WWFbIiAiXShhKTtyZXR1cm4gYX07WWFbIiAiXT1jYTt2YXIgJGE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1aYTtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsYSk/Y1thXTpjW2FdPWIoYSl9O3ZhciBhYj10KHUsIk9wZXJhIiksdj10KHUsIlRyaWRlbnQiKXx8dCh1LCJNU0lFIiksYmI9dCh1LCJFZGdlIikseD10KHUsIkdlY2tvIikmJiEodCh1LnRvTG93ZXJDYXNlKCksIndlYmtpdCIpJiYhdCh1LCJFZGdlIikpJiYhKHQodSwiVHJpZGVudCIpfHx0KHUsIk1TSUUiKSkmJiF0KHUsIkVkZ2UiKSx5PXQodS50b0xvd2VyQ2FzZSgpLCJ3ZWJraXQiKSYmIXQodSwiRWRnZSIpLHo9dCh1LCJNYWNpbnRvc2giKSxjYj1mdW5jdGlvbigpe3ZhciBhPWwuZG9jdW1lbnQ7cmV0dXJuIGE/YS5kb2N1bWVudE1vZGU6dm9pZCAwfSxkYjsKYTp7dmFyIGViPSIiLGZiPWZ1bmN0aW9uKCl7dmFyIGE9dTtpZih4KXJldHVybi9ydjooW15cKTtdKykoXCl8OykvLmV4ZWMoYSk7aWYoYmIpcmV0dXJuL0VkZ2VcLyhbXGRcLl0rKS8uZXhlYyhhKTtpZih2KXJldHVybi9cYig/Ok1TSUV8cnYpWzogXShbXlwpO10rKShcKXw7KS8uZXhlYyhhKTtpZih5KXJldHVybi9XZWJLaXRcLyhcUyspLy5leGVjKGEpO2lmKGFiKXJldHVybi8oPzpWZXJzaW9uKVsgXC9dPyhcUyspLy5leGVjKGEpfSgpO2ZiJiYoZWI9ZmI/ZmJbMV06IiIpO2lmKHYpe3ZhciBnYj1jYigpO2lmKG51bGwhPWdiJiZnYj5wYXJzZUZsb2F0KGViKSl7ZGI9U3RyaW5nKGdiKTticmVhayBhfX1kYj1lYn0KdmFyIGhiPWRiLFphPXt9LEE9ZnVuY3Rpb24oYSl7cmV0dXJuICRhKGEsZnVuY3Rpb24oKXtmb3IodmFyIGI9MCxjPU1hKFN0cmluZyhoYikpLnNwbGl0KCIuIiksZD1NYShTdHJpbmcoYSkpLnNwbGl0KCIuIiksZT1NYXRoLm1heChjLmxlbmd0aCxkLmxlbmd0aCksZj0wOzA9PWImJmY8ZTtmKyspe3ZhciBnPWNbZl18fCIiLGs9ZFtmXXx8IiI7ZG97Zz0vKFxkKikoXEQqKSguKikvLmV4ZWMoZyl8fFsiIiwiIiwiIiwiIl07az0vKFxkKikoXEQqKSguKikvLmV4ZWMoayl8fFsiIiwiIiwiIiwiIl07aWYoMD09Z1swXS5sZW5ndGgmJjA9PWtbMF0ubGVuZ3RoKWJyZWFrO2I9VWEoMD09Z1sxXS5sZW5ndGg/MDpwYXJzZUludChnWzFdLDEwKSwwPT1rWzFdLmxlbmd0aD8wOnBhcnNlSW50KGtbMV0sMTApKXx8VWEoMD09Z1syXS5sZW5ndGgsMD09a1syXS5sZW5ndGgpfHxVYShnWzJdLGtbMl0pO2c9Z1szXTtrPWtbM119d2hpbGUoMD09Yil9cmV0dXJuIDA8PWJ9KX0saWI7CmliPWwuZG9jdW1lbnQmJnY/Y2IoKTp2b2lkIDA7dmFyIGpiPSF2fHw5PD1OdW1iZXIoaWIpO3ZhciBsYj1mdW5jdGlvbihhLGIpe29hKGIsZnVuY3Rpb24oYyxkKXtjJiYib2JqZWN0Ij09dHlwZW9mIGMmJmMuZGQmJihjPWMuY2QoKSk7InN0eWxlIj09ZD9hLnN0eWxlLmNzc1RleHQ9YzoiY2xhc3MiPT1kP2EuY2xhc3NOYW1lPWM6ImZvciI9PWQ/YS5odG1sRm9yPWM6a2IuaGFzT3duUHJvcGVydHkoZCk/YS5zZXRBdHRyaWJ1dGUoa2JbZF0sYyk6MD09ZC5sYXN0SW5kZXhPZigiYXJpYS0iLDApfHwwPT1kLmxhc3RJbmRleE9mKCJkYXRhLSIsMCk/YS5zZXRBdHRyaWJ1dGUoZCxjKTphW2RdPWN9KX0sa2I9e2NlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjb2xzcGFuOiJjb2xTcGFuIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGhlaWdodDoiaGVpZ2h0IixtYXhsZW5ndGg6Im1heExlbmd0aCIsbm9uY2U6Im5vbmNlIixyb2xlOiJyb2xlIixyb3dzcGFuOiJyb3dTcGFuIix0eXBlOiJ0eXBlIix1c2VtYXA6InVzZU1hcCIsdmFsaWduOiJ2QWxpZ24iLAp3aWR0aDoid2lkdGgifSxtYj1mdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChrKXtrJiZiLmFwcGVuZENoaWxkKCJzdHJpbmciPT09dHlwZW9mIGs/YS5jcmVhdGVUZXh0Tm9kZShrKTprKX1mb3IodmFyIGU9MjtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXTtpZighaGEoZil8fG0oZikmJjA8Zi5ub2RlVHlwZSlkKGYpO2Vsc2V7YTp7aWYoZiYmIm51bWJlciI9PXR5cGVvZiBmLmxlbmd0aCl7aWYobShmKSl7dmFyIGc9ImZ1bmN0aW9uIj09dHlwZW9mIGYuaXRlbXx8InN0cmluZyI9PXR5cGVvZiBmLml0ZW07YnJlYWsgYX1pZihpYShmKSl7Zz0iZnVuY3Rpb24iPT10eXBlb2YgZi5pdGVtO2JyZWFrIGF9fWc9ITF9cihnP0phKGYpOmYsZCl9fX0sbmI9ZnVuY3Rpb24oYSxiKXtiPVN0cmluZyhiKTsiYXBwbGljYXRpb24veGh0bWwreG1sIj09PWEuY29udGVudFR5cGUmJihiPWIudG9Mb3dlckNhc2UoKSk7cmV0dXJuIGEuY3JlYXRlRWxlbWVudChiKX0sb2I9ZnVuY3Rpb24oYSl7YSYmCmEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpfSxwYj1mdW5jdGlvbihhLGIpe2lmKCFhfHwhYilyZXR1cm4hMTtpZihhLmNvbnRhaW5zJiYxPT1iLm5vZGVUeXBlKXJldHVybiBhPT1ifHxhLmNvbnRhaW5zKGIpO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbilyZXR1cm4gYT09Ynx8ISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNik7Zm9yKDtiJiZhIT1iOyliPWIucGFyZW50Tm9kZTtyZXR1cm4gYj09YX0scWI9ZnVuY3Rpb24oYSl7cShhLCJOb2RlIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4iKTtyZXR1cm4gOT09YS5ub2RlVHlwZT9hOmEub3duZXJEb2N1bWVudHx8YS5kb2N1bWVudH0scmI9ZnVuY3Rpb24oYSxiKXtiP2EudGFiSW5kZXg9MDooYS50YWJJbmRleD0tMSxhLnJlbW92ZUF0dHJpYnV0ZSgidGFiSW5kZXgiKSl9LHNiPWZ1bmN0aW9uKGEpe3JldHVybiB2JiYhQSgiOSIpPyhhPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKSwKbnVsbCE9YSYmYS5zcGVjaWZpZWQpOmEuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpfSx0Yj1mdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgYSYmMDw9YSYmMzI3Njg+YX0sdWI9ZnVuY3Rpb24oYSl7dGhpcy5hPWF8fGwuZG9jdW1lbnR8fGRvY3VtZW50fTt1Yi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBhP3RoaXMuYS5nZXRFbGVtZW50QnlJZChhKTphfTsKdWIucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuYSxlPWFyZ3VtZW50cyxmPVN0cmluZyhlWzBdKSxnPWVbMV07aWYoIWpiJiZnJiYoZy5uYW1lfHxnLnR5cGUpKXtmPVsiPCIsZl07Zy5uYW1lJiZmLnB1c2goJyBuYW1lPSInLFhhKGcubmFtZSksJyInKTtpZihnLnR5cGUpe2YucHVzaCgnIHR5cGU9IicsWGEoZy50eXBlKSwnIicpO3ZhciBrPXt9O3VhKGssZyk7ZGVsZXRlIGsudHlwZTtnPWt9Zi5wdXNoKCI+Iik7Zj1mLmpvaW4oIiIpfWY9bmIoZCxmKTtnJiYoInN0cmluZyI9PT10eXBlb2YgZz9mLmNsYXNzTmFtZT1nOmZhKGcpP2YuY2xhc3NOYW1lPWcuam9pbigiICIpOmxiKGYsZykpOzI8ZS5sZW5ndGgmJm1iKGQsZixlKTtyZXR1cm4gZn07dmFyIHZiPWZ1bmN0aW9uKGEsYil7Yj8ocShwYSh2YSxiKSwiTm8gc3VjaCBBUklBIHJvbGUgIitiKSxhLnNldEF0dHJpYnV0ZSgicm9sZSIsYikpOmEucmVtb3ZlQXR0cmlidXRlKCJyb2xlIil9LHhiPWZ1bmN0aW9uKGEsYixjKXtmYShjKSYmKGM9Yy5qb2luKCIgIikpO3ZhciBkPXdiKGIpOyIiPT09Y3x8dm9pZCAwPT1jPyhtYXx8KG1hPXthdG9taWM6ITEsYXV0b2NvbXBsZXRlOiJub25lIixkcm9wZWZmZWN0OiJub25lIixoYXNwb3B1cDohMSxsaXZlOiJvZmYiLG11bHRpbGluZTohMSxtdWx0aXNlbGVjdGFibGU6ITEsb3JpZW50YXRpb246InZlcnRpY2FsIixyZWFkb25seTohMSxyZWxldmFudDoiYWRkaXRpb25zIHRleHQiLHJlcXVpcmVkOiExLHNvcnQ6Im5vbmUiLGJ1c3k6ITEsZGlzYWJsZWQ6ITEsaGlkZGVuOiExLGludmFsaWQ6ImZhbHNlIn0pLGM9bWEsYiBpbiBjP2Euc2V0QXR0cmlidXRlKGQsY1tiXSk6YS5yZW1vdmVBdHRyaWJ1dGUoZCkpOmEuc2V0QXR0cmlidXRlKGQsCmMpfSx3Yj1mdW5jdGlvbihhKXtxKGEsIkFSSUEgYXR0cmlidXRlIGNhbm5vdCBiZSBlbXB0eS4iKTtxKHBhKG5hLGEpLCJObyBzdWNoIEFSSUEgYXR0cmlidXRlICIrYSk7cmV0dXJuImFyaWEtIithfTt2YXIgeWI9T2JqZWN0LmZyZWV6ZXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O3ZhciBDPWZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVTt0aGlzLko9dGhpcy5KfTtDLnByb3RvdHlwZS5VPSExO0MucHJvdG90eXBlLk49ZnVuY3Rpb24oKXt0aGlzLlV8fCh0aGlzLlU9ITAsdGhpcy51KCkpfTt2YXIgemI9ZnVuY3Rpb24oYSxiKXthLlU/YigpOihhLkp8fChhLko9W10pLGEuSi5wdXNoKGIpKX07Qy5wcm90b3R5cGUudT1mdW5jdGlvbigpe2lmKHRoaXMuSilmb3IoO3RoaXMuSi5sZW5ndGg7KXRoaXMuSi5zaGlmdCgpKCl9O3ZhciBBYj1mdW5jdGlvbihhKXthJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5OJiZhLk4oKX07dmFyIEJiPWZ1bmN0aW9uKGEpe3JldHVybiJzdHJpbmciPT10eXBlb2YgYS5jbGFzc05hbWU/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sRD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6QmIoYSkubWF0Y2goL1xTKy9nKXx8W119LENiPWZ1bmN0aW9uKGEsYil7InN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZT9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxEYj1mdW5jdGlvbihhLGIpe3JldHVybiBhLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5jb250YWlucyhiKTpHYShEKGEpLGIpfSxFYj1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFEYihhLGIpKXt2YXIgYz1CYihhKTtDYihhLGMrKDA8Yy5sZW5ndGg/IiAiK2I6YikpfX0sRmI9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClyKGIsCmZ1bmN0aW9uKGUpe0ViKGEsZSl9KTtlbHNle3ZhciBjPXt9O3IoRChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7cihiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPTA8Yi5sZW5ndGg/IiAiK2Q6ZDtDYihhLGIpfX0sR2I9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6RGIoYSxiKSYmQ2IoYSxFYShEKGEpLGZ1bmN0aW9uKGMpe3JldHVybiBjIT1ifSkuam9pbigiICIpKX0sSGI9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9yKGIsZnVuY3Rpb24oYyl7R2IoYSxjKX0pOkNiKGEsRWEoRChhKSxmdW5jdGlvbihjKXtyZXR1cm4hR2EoYixjKX0pLmpvaW4oIiAiKSl9O3ZhciBJYj0hdnx8OTw9TnVtYmVyKGliKSxKYj0hdnx8OTw9TnVtYmVyKGliKSxLYj12JiYhQSgiOSIpLExiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e2wuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsY2EsYiksbC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjYSxiKX1jYXRjaChjKXt9cmV0dXJuIGF9KCk7dmFyIEU9ZnVuY3Rpb24oYSxiKXt0aGlzLnR5cGU9YTt0aGlzLmE9dGhpcy50YXJnZXQ9Yjt0aGlzLmg9ITE7dGhpcy5LYT0hMH07RS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuaD0hMH07RS5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3RoaXMuS2E9ITF9O3ZhciBGPXtMOiJtb3VzZWRvd24iLE06Im1vdXNldXAiLGFhOiJtb3VzZWNhbmNlbCIsaGM6Im1vdXNlbW92ZSIsamM6Im1vdXNlb3ZlciIsaWM6Im1vdXNlb3V0IixmYzoibW91c2VlbnRlciIsZ2M6Im1vdXNlbGVhdmUifTt2YXIgRz1mdW5jdGlvbihhLGIpe0UuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy5hPXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5jPTA7dGhpcy5BPXRoaXMubWV0YUtleT10aGlzLnNoaWZ0S2V5PXRoaXMuYWx0S2V5PXRoaXMuY3RybEtleT0hMTt0aGlzLnBvaW50ZXJJZD0wO3RoaXMucG9pbnRlclR5cGU9IiI7dGhpcy5iPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMuYT1iO2lmKGI9YS5yZWxhdGVkVGFyZ2V0KXtpZih4KXthOnt0cnl7WWEoYi5ub2RlTmFtZSk7dmFyIGU9ITA7YnJlYWsgYX1jYXRjaChmKXt9ZT0KITF9ZXx8KGI9bnVsbCl9fWVsc2UibW91c2VvdmVyIj09Yz9iPWEuZnJvbUVsZW1lbnQ6Im1vdXNlb3V0Ij09YyYmKGI9YS50b0VsZW1lbnQpO3RoaXMucmVsYXRlZFRhcmdldD1iO2Q/KHRoaXMuY2xpZW50WD12b2lkIDAhPT1kLmNsaWVudFg/ZC5jbGllbnRYOmQucGFnZVgsdGhpcy5jbGllbnRZPXZvaWQgMCE9PWQuY2xpZW50WT9kLmNsaWVudFk6ZC5wYWdlWSx0aGlzLnNjcmVlblg9ZC5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1kLnNjcmVlbll8fDApOih0aGlzLmNsaWVudFg9dm9pZCAwIT09YS5jbGllbnRYP2EuY2xpZW50WDphLnBhZ2VYLHRoaXMuY2xpZW50WT12b2lkIDAhPT1hLmNsaWVudFk/YS5jbGllbnRZOmEucGFnZVksdGhpcy5zY3JlZW5YPWEuc2NyZWVuWHx8MCx0aGlzLnNjcmVlblk9YS5zY3JlZW5ZfHwwKTt0aGlzLmJ1dHRvbj1hLmJ1dHRvbjt0aGlzLmM9YS5rZXlDb2RlfHwwO3RoaXMua2V5PWEua2V5fHwiIjt0aGlzLmN0cmxLZXk9YS5jdHJsS2V5O3RoaXMuYWx0S2V5PQphLmFsdEtleTt0aGlzLnNoaWZ0S2V5PWEuc2hpZnRLZXk7dGhpcy5tZXRhS2V5PWEubWV0YUtleTt0aGlzLkE9ej9hLm1ldGFLZXk6YS5jdHJsS2V5O3RoaXMucG9pbnRlcklkPWEucG9pbnRlcklkfHwwO3RoaXMucG9pbnRlclR5cGU9InN0cmluZyI9PT10eXBlb2YgYS5wb2ludGVyVHlwZT9hLnBvaW50ZXJUeXBlOk1iW2EucG9pbnRlclR5cGVdfHwiIjt0aGlzLmI9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnRoaXMuZygpfX07bihHLEUpO3ZhciBOYj15YihbMSw0LDJdKSxNYj15Yih7MjoidG91Y2giLDM6InBlbiIsNDoibW91c2UifSksT2I9ZnVuY3Rpb24oYSl7cmV0dXJuIEliPzA9PWEuYi5idXR0b246ImNsaWNrIj09YS50eXBlPyEwOiEhKGEuYi5idXR0b24mTmJbMF0pfTtHLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7Ry5pLmouY2FsbCh0aGlzKTt0aGlzLmIuc3RvcFByb3BhZ2F0aW9uP3RoaXMuYi5zdG9wUHJvcGFnYXRpb24oKTp0aGlzLmIuY2FuY2VsQnViYmxlPSEwfTsKRy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe0cuaS5nLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5iO2lmKGEucHJldmVudERlZmF1bHQpYS5wcmV2ZW50RGVmYXVsdCgpO2Vsc2UgaWYoYS5yZXR1cm5WYWx1ZT0hMSxLYil0cnl7aWYoYS5jdHJsS2V5fHwxMTI8PWEua2V5Q29kZSYmMTIzPj1hLmtleUNvZGUpYS5rZXlDb2RlPS0xfWNhdGNoKGIpe319O3ZhciBQYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKDFFNipNYXRoLnJhbmRvbSgpfDApLFFiPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW1BiXSl9LFJiPTA7dmFyIFNiPWZ1bmN0aW9uKGEsYixjLGQsZSl7dGhpcy5saXN0ZW5lcj1hO3RoaXMuYT1udWxsO3RoaXMuc3JjPWI7dGhpcy50eXBlPWM7dGhpcy5jYXB0dXJlPSEhZDt0aGlzLm1hPWU7dGhpcy5rZXk9KytSYjt0aGlzLlg9dGhpcy5oYT0hMX0sVGI9ZnVuY3Rpb24oYSl7YS5YPSEwO2EubGlzdGVuZXI9bnVsbDthLmE9bnVsbDthLnNyYz1udWxsO2EubWE9bnVsbH07dmFyIFViPWZ1bmN0aW9uKGEpe3RoaXMuc3JjPWE7dGhpcy5hPXt9O3RoaXMuYj0wfTtVYi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS50b1N0cmluZygpO2E9dGhpcy5hW2ZdO2F8fChhPXRoaXMuYVtmXT1bXSx0aGlzLmIrKyk7dmFyIGc9VmIoYSxiLGQsZSk7LTE8Zz8oYj1hW2ddLGN8fChiLmhhPSExKSk6KGI9bmV3IFNiKGIsdGhpcy5zcmMsZiwhIWQsZSksYi5oYT1jLGEucHVzaChiKSk7cmV0dXJuIGJ9Owp2YXIgV2I9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLnR5cGU7YyBpbiBhLmEmJkhhKGEuYVtjXSxiKSYmKFRiKGIpLDA9PWEuYVtjXS5sZW5ndGgmJihkZWxldGUgYS5hW2NdLGEuYi0tKSl9LFhiPWZ1bmN0aW9uKGEsYixjLGQsZSl7YT1hLmFbYi50b1N0cmluZygpXTtiPS0xO2EmJihiPVZiKGEsYyxkLGUpKTtyZXR1cm4tMTxiP2FbYl06bnVsbH0sVmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuWCYmZi5saXN0ZW5lcj09YiYmZi5jYXB0dXJlPT0hIWMmJmYubWE9PWQpcmV0dXJuIGV9cmV0dXJuLTF9O3ZhciBZYj0iY2xvc3VyZV9sbV8iKygxRTYqTWF0aC5yYW5kb20oKXwwKSxaYj17fSwkYj0wLGJjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZCYmZC5vbmNlKXJldHVybiBhYyhhLGIsYyxkLGUpO2lmKGZhKGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyliYyhhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9Y2MoYyk7cmV0dXJuIFFiKGEpP2RjKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOmVjKGEsYixjLCExLGQsZSl9LGVjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGc9bShlKT8hIWUuY2FwdHVyZTohIWUsaz1mYyhhKTtrfHwoYVtZYl09az1uZXcgVWIoYSkpO2M9ay5hZGQoYixjLGQsZyxmKTtpZihjLmEpcmV0dXJuIGM7ZD1nYygpO2MuYT1kO2Quc3JjPWE7ZC5saXN0ZW5lcj1jO2lmKGEuYWRkRXZlbnRMaXN0ZW5lcilMYnx8KGU9Zyksdm9pZCAwPT09ZSYmKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksCmQsZSk7ZWxzZSBpZihhLmF0dGFjaEV2ZW50KWEuYXR0YWNoRXZlbnQoaGMoYi50b1N0cmluZygpKSxkKTtlbHNlIGlmKGEuYWRkTGlzdGVuZXImJmEucmVtb3ZlTGlzdGVuZXIpcSgiY2hhbmdlIj09PWIsIk1lZGlhUXVlcnlMaXN0IG9ubHkgaGFzIGEgY2hhbmdlIGV2ZW50IiksYS5hZGRMaXN0ZW5lcihkKTtlbHNlIHRocm93IEVycm9yKCJhZGRFdmVudExpc3RlbmVyIGFuZCBhdHRhY2hFdmVudCBhcmUgdW5hdmFpbGFibGUuIik7JGIrKztyZXR1cm4gY30sZ2M9ZnVuY3Rpb24oKXt2YXIgYT1pYyxiPUpiP2Z1bmN0aW9uKGMpe3JldHVybiBhLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKX06ZnVuY3Rpb24oYyl7Yz1hLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKTtpZighYylyZXR1cm4gY307cmV0dXJuIGJ9LGFjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZmEoYikpe2Zvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWFjKGEsYltmXSxjLGQsZSk7cmV0dXJuIG51bGx9Yz1jYyhjKTtyZXR1cm4gUWIoYSk/CmEuaC5hZGQoU3RyaW5nKGIpLGMsITAsbShkKT8hIWQuY2FwdHVyZTohIWQsZSk6ZWMoYSxiLGMsITAsZCxlKX0samM9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihmYShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylqYyhhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPWNjKGMpLFFiKGEpPyhhPWEuaCxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5hJiYoZj1hLmFbYl0sYz1WYihmLGMsZCxlKSwtMTxjJiYoVGIoZltjXSkscShudWxsIT1mLmxlbmd0aCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSwwPT1mLmxlbmd0aCYmKGRlbGV0ZSBhLmFbYl0sYS5iLS0pKSkpOmEmJihhPWZjKGEpKSYmKGM9WGIoYSxiLGMsZCxlKSkmJmtjKGMpfSxrYz1mdW5jdGlvbihhKXtpZigibnVtYmVyIiE9PXR5cGVvZiBhJiZhJiYhYS5YKXt2YXIgYj1hLnNyYztpZihRYihiKSlXYihiLmgsYSk7ZWxzZXt2YXIgYz1hLnR5cGUsZD1hLmE7Yi5yZW1vdmVFdmVudExpc3RlbmVyPwpiLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KGhjKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7JGItLTsoYz1mYyhiKSk/KFdiKGMsYSksMD09Yy5iJiYoYy5zcmM9bnVsbCxiW1liXT1udWxsKSk6VGIoYSl9fX0saGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gWmI/WmJbYV06WmJbYV09Im9uIithfSxtYz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMDtpZihhPWZjKGEpKWlmKGI9YS5hW2IudG9TdHJpbmcoKV0pZm9yKGI9Yi5jb25jYXQoKSxhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBmPWJbYV07ZiYmZi5jYXB0dXJlPT1jJiYhZi5YJiYoZj1sYyhmLGQpLGU9ZSYmITEhPT1mKX1yZXR1cm4gZX0sbGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5tYXx8YS5zcmM7YS5oYSYma2MoYSk7cmV0dXJuIGMuY2FsbChkLGIpfSxpYz1mdW5jdGlvbihhLApiKXtpZihhLlgpcmV0dXJuITA7aWYoIUpiKXtpZighYilhOntiPVsid2luZG93IiwiZXZlbnQiXTtmb3IodmFyIGM9bCxkPTA7ZDxiLmxlbmd0aDtkKyspaWYoYz1jW2JbZF1dLG51bGw9PWMpe2I9bnVsbDticmVhayBhfWI9Y31kPWI7Yj1uZXcgRyhkLHRoaXMpO2M9ITA7aWYoISgwPmQua2V5Q29kZXx8dm9pZCAwIT1kLnJldHVyblZhbHVlKSl7YTp7dmFyIGU9ITE7aWYoMD09ZC5rZXlDb2RlKXRyeXtkLmtleUNvZGU9LTE7YnJlYWsgYX1jYXRjaChnKXtlPSEwfWlmKGV8fHZvaWQgMD09ZC5yZXR1cm5WYWx1ZSlkLnJldHVyblZhbHVlPSEwfWQ9W107Zm9yKGU9Yi5hO2U7ZT1lLnBhcmVudE5vZGUpZC5wdXNoKGUpO2E9YS50eXBlO2ZvcihlPWQubGVuZ3RoLTE7IWIuaCYmMDw9ZTtlLS0pe2IuYT1kW2VdO3ZhciBmPW1jKGRbZV0sYSwhMCxiKTtjPWMmJmZ9Zm9yKGU9MDshYi5oJiZlPGQubGVuZ3RoO2UrKyliLmE9ZFtlXSxmPW1jKGRbZV0sYSwhMSxiKSxjPWMmJmZ9cmV0dXJuIGN9cmV0dXJuIGxjKGEsCm5ldyBHKGIsdGhpcykpfSxmYz1mdW5jdGlvbihhKXthPWFbWWJdO3JldHVybiBhIGluc3RhbmNlb2YgVWI/YTpudWxsfSxuYz0iX19jbG9zdXJlX2V2ZW50c19mbl8iKygxRTkqTWF0aC5yYW5kb20oKT4+PjApLGNjPWZ1bmN0aW9uKGEpe3EoYSwiTGlzdGVuZXIgY2FuIG5vdCBiZSBudWxsLiIpO2lmKGlhKGEpKXJldHVybiBhO3EoYS5oYW5kbGVFdmVudCwiQW4gb2JqZWN0IGxpc3RlbmVyIG11c3QgaGF2ZSBoYW5kbGVFdmVudCBtZXRob2QuIik7YVtuY118fChhW25jXT1mdW5jdGlvbihiKXtyZXR1cm4gYS5oYW5kbGVFdmVudChiKX0pO3JldHVybiBhW25jXX07dmFyIG9jPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9e319O24ob2MsQyk7CnZhciBwYz1bXSxIPWZ1bmN0aW9uKGEsYixjLGQpe2ZhKGMpfHwoYyYmKHBjWzBdPWMudG9TdHJpbmcoKSksYz1wYyk7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWJjKGIsY1tlXSxkfHxhLmhhbmRsZUV2ZW50LCExLGEuYnx8YSk7aWYoIWYpYnJlYWs7YS5hW2Yua2V5XT1mfXJldHVybiBhfSxxYz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoZmEoYykpZm9yKHZhciBnPTA7ZzxjLmxlbmd0aDtnKyspcWMoYSxiLGNbZ10sZCxlLGYpO2Vsc2UgZD1kfHxhLmhhbmRsZUV2ZW50LGU9bShlKT8hIWUuY2FwdHVyZTohIWUsZj1mfHxhLmJ8fGEsZD1jYyhkKSxlPSEhZSxjPVFiKGIpP1hiKGIuaCxTdHJpbmcoYyksZCxlLGYpOmI/KGI9ZmMoYikpP1hiKGIsYyxkLGUsZik6bnVsbDpudWxsLGMmJihrYyhjKSxkZWxldGUgYS5hW2Mua2V5XSk7cmV0dXJuIGF9LHJjPWZ1bmN0aW9uKGEpe29hKGEuYSxmdW5jdGlvbihiLGMpe3RoaXMuYS5oYXNPd25Qcm9wZXJ0eShjKSYma2MoYil9LAphKTthLmE9e319O29jLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7b2MuaS51LmNhbGwodGhpcyk7cmModGhpcyl9O29jLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJFdmVudEhhbmRsZXIuaGFuZGxlRXZlbnQgbm90IGltcGxlbWVudGVkIik7fTt2YXIgST1mdW5jdGlvbigpe0MuY2FsbCh0aGlzKTt0aGlzLmg9bmV3IFViKHRoaXMpO3RoaXMuTWE9dGhpczt0aGlzLnBhPW51bGx9O24oSSxDKTtJLnByb3RvdHlwZVtQYl09ITA7SS5wcm90b3R5cGUucmE9ZnVuY3Rpb24oYSl7dGhpcy5wYT1hfTtJLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjLGQpe2pjKHRoaXMsYSxiLGMsZCl9Owp2YXIgdWM9ZnVuY3Rpb24oYSxiKXtzYyhhKTt2YXIgYz1hLnBhO2lmKGMpe3ZhciBkPVtdO2Zvcih2YXIgZT0xO2M7Yz1jLnBhKWQucHVzaChjKSxxKDFFMz4rK2UsImluZmluaXRlIGxvb3AiKX1hPWEuTWE7Yz1iLnR5cGV8fGI7InN0cmluZyI9PT10eXBlb2YgYj9iPW5ldyBFKGIsYSk6YiBpbnN0YW5jZW9mIEU/Yi50YXJnZXQ9Yi50YXJnZXR8fGE6KGU9YixiPW5ldyBFKGMsYSksdWEoYixlKSk7ZT0hMDtpZihkKWZvcih2YXIgZj1kLmxlbmd0aC0xOyFiLmgmJjA8PWY7Zi0tKXt2YXIgZz1iLmE9ZFtmXTtlPXRjKGcsYywhMCxiKSYmZX1iLmh8fChnPWIuYT1hLGU9dGMoZyxjLCEwLGIpJiZlLGIuaHx8KGU9dGMoZyxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLmgmJmY8ZC5sZW5ndGg7ZisrKWc9Yi5hPWRbZl0sZT10YyhnLGMsITEsYikmJmU7cmV0dXJuIGV9OwpJLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7SS5pLnUuY2FsbCh0aGlzKTtpZih0aGlzLmgpe3ZhciBhPXRoaXMuaCxiPTAsYztmb3IoYyBpbiBhLmEpe2Zvcih2YXIgZD1hLmFbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixUYihkW2VdKTtkZWxldGUgYS5hW2NdO2EuYi0tfX10aGlzLnBhPW51bGx9O3ZhciBkYz1mdW5jdGlvbihhLGIsYyxkLGUpe3NjKGEpO3JldHVybiBhLmguYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LHRjPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5oLmFbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGc9YltmXTtpZihnJiYhZy5YJiZnLmNhcHR1cmU9PWMpe3ZhciBrPWcubGlzdGVuZXIscD1nLm1hfHxnLnNyYztnLmhhJiZXYihhLmgsZyk7ZT0hMSE9PWsuY2FsbChwLGQpJiZlfX1yZXR1cm4gZSYmMCE9ZC5LYX0sc2M9ZnVuY3Rpb24oYSl7cShhLmgsIkV2ZW50IHRhcmdldCBpcyBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgY2FsbCB0aGUgc3VwZXJjbGFzcyAoZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpIGNvbnN0cnVjdG9yPyIpfTt2YXIgeGM9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKHkmJiFBKCI1MjUiKSlyZXR1cm4hMDtpZih6JiZlKXJldHVybiB2YyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZigheCl7Im51bWJlciI9PT10eXBlb2YgYiYmKGI9d2MoYikpO3ZhciBnPTE3PT1ifHwxOD09Ynx8eiYmOTE9PWI7aWYoKCFjfHx6KSYmZ3x8eiYmMTY9PWImJihkfHxmKSlyZXR1cm4hMX1pZigoeXx8YmIpJiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1pZih2JiZkJiZiPT1hKXJldHVybiExO3N3aXRjaChhKXtjYXNlIDEzOnJldHVybiB4P2Z8fGU/ITE6IShjJiZkKTohMDtjYXNlIDI3OnJldHVybiEoeXx8YmJ8fHgpfXJldHVybiB4JiYoZHx8ZXx8Zik/ITE6dmMoYSl9LHZjPWZ1bmN0aW9uKGEpe2lmKDQ4PD1hJiY1Nz49YXx8Cjk2PD1hJiYxMDY+PWF8fDY1PD1hJiY5MD49YXx8KHl8fGJiKSYmMD09YSlyZXR1cm4hMDtzd2l0Y2goYSl7Y2FzZSAzMjpjYXNlIDQzOmNhc2UgNjM6Y2FzZSA2NDpjYXNlIDEwNzpjYXNlIDEwOTpjYXNlIDExMDpjYXNlIDExMTpjYXNlIDE4NjpjYXNlIDU5OmNhc2UgMTg5OmNhc2UgMTg3OmNhc2UgNjE6Y2FzZSAxODg6Y2FzZSAxOTA6Y2FzZSAxOTE6Y2FzZSAxOTI6Y2FzZSAyMjI6Y2FzZSAyMTk6Y2FzZSAyMjA6Y2FzZSAyMjE6Y2FzZSAxNjM6Y2FzZSA1ODpyZXR1cm4hMDtjYXNlIDE3MzpyZXR1cm4geDtkZWZhdWx0OnJldHVybiExfX0sd2M9ZnVuY3Rpb24oYSl7aWYoeClhPXljKGEpO2Vsc2UgaWYoeiYmeSlzd2l0Y2goYSl7Y2FzZSA5MzphPTkxfXJldHVybiBhfSx5Yz1mdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSA2MTpyZXR1cm4gMTg3O2Nhc2UgNTk6cmV0dXJuIDE4NjtjYXNlIDE3MzpyZXR1cm4gMTg5O2Nhc2UgMjI0OnJldHVybiA5MTtjYXNlIDA6cmV0dXJuIDIyNDsKZGVmYXVsdDpyZXR1cm4gYX19O3ZhciBKPWZ1bmN0aW9uKGEsYil7SS5jYWxsKHRoaXMpO2EmJnpjKHRoaXMsYSxiKX07bihKLEkpO2g9Si5wcm90b3R5cGU7aC5TPW51bGw7aC5uYT1udWxsO2guQ2E9bnVsbDtoLm9hPW51bGw7aC53PS0xO2guRj0tMTtoLnVhPSExOwp2YXIgQWM9ezM6MTMsMTI6MTQ0LDYzMjMyOjM4LDYzMjMzOjQwLDYzMjM0OjM3LDYzMjM1OjM5LDYzMjM2OjExMiw2MzIzNzoxMTMsNjMyMzg6MTE0LDYzMjM5OjExNSw2MzI0MDoxMTYsNjMyNDE6MTE3LDYzMjQyOjExOCw2MzI0MzoxMTksNjMyNDQ6MTIwLDYzMjQ1OjEyMSw2MzI0NjoxMjIsNjMyNDc6MTIzLDYzMjQ4OjQ0LDYzMjcyOjQ2LDYzMjczOjM2LDYzMjc1OjM1LDYzMjc2OjMzLDYzMjc3OjM0LDYzMjg5OjE0NCw2MzMwMjo0NX0sQmM9e1VwOjM4LERvd246NDAsTGVmdDozNyxSaWdodDozOSxFbnRlcjoxMyxGMToxMTIsRjI6MTEzLEYzOjExNCxGNDoxMTUsRjU6MTE2LEY2OjExNyxGNzoxMTgsRjg6MTE5LEY5OjEyMCxGMTA6MTIxLEYxMToxMjIsRjEyOjEyMywiVSswMDdGIjo0NixIb21lOjM2LEVuZDozNSxQYWdlVXA6MzMsUGFnZURvd246MzQsSW5zZXJ0OjQ1fSxDYz0heXx8QSgiNTI1IiksRGM9eiYmeDsKSi5wcm90b3R5cGUuYT1mdW5jdGlvbihhKXtpZih5fHxiYilpZigxNz09dGhpcy53JiYhYS5jdHJsS2V5fHwxOD09dGhpcy53JiYhYS5hbHRLZXl8fHomJjkxPT10aGlzLncmJiFhLm1ldGFLZXkpdGhpcy5GPXRoaXMudz0tMTstMT09dGhpcy53JiYoYS5jdHJsS2V5JiYxNyE9YS5jP3RoaXMudz0xNzphLmFsdEtleSYmMTghPWEuYz90aGlzLnc9MTg6YS5tZXRhS2V5JiY5MSE9YS5jJiYodGhpcy53PTkxKSk7Q2MmJiF4YyhhLmMsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGEuYWx0S2V5LGEubWV0YUtleSk/dGhpcy5oYW5kbGVFdmVudChhKToodGhpcy5GPXdjKGEuYyksRGMmJih0aGlzLnVhPWEuYWx0S2V5KSl9O0oucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dGhpcy5GPXRoaXMudz0tMTt0aGlzLnVhPWEuYWx0S2V5fTsKSi5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5iLGM9Yi5hbHRLZXk7aWYodiYmImtleXByZXNzIj09YS50eXBlKXt2YXIgZD10aGlzLkY7dmFyIGU9MTMhPWQmJjI3IT1kP2Iua2V5Q29kZTowfWVsc2UoeXx8YmIpJiYia2V5cHJlc3MiPT1hLnR5cGU/KGQ9dGhpcy5GLGU9MDw9Yi5jaGFyQ29kZSYmNjMyMzI+Yi5jaGFyQ29kZSYmdmMoZCk/Yi5jaGFyQ29kZTowKTphYiYmIXk/KGQ9dGhpcy5GLGU9dmMoZCk/Yi5rZXlDb2RlOjApOigia2V5cHJlc3MiPT1hLnR5cGU/KERjJiYoYz10aGlzLnVhKSxiLmtleUNvZGU9PWIuY2hhckNvZGU/MzI+Yi5rZXlDb2RlPyhkPWIua2V5Q29kZSxlPTApOihkPXRoaXMuRixlPWIuY2hhckNvZGUpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkseiYmNjM9PWUmJjIyND09ZCYmKGQ9MTkxKSk7dmFyIGY9ZD13YyhkKTtkPzYzMjMyPD0KZCYmZCBpbiBBYz9mPUFjW2RdOjI1PT1kJiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBCYyYmKGY9QmNbYi5rZXlJZGVudGlmaWVyXSk7eCYmQ2MmJiJrZXlwcmVzcyI9PWEudHlwZSYmIXhjKGYsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KXx8KGE9Zj09dGhpcy53LHRoaXMudz1mLGI9bmV3IEVjKGYsZSxhLGIpLGIuYWx0S2V5PWMsdWModGhpcyxiKSl9O0oucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTsKdmFyIHpjPWZ1bmN0aW9uKGEsYixjKXthLm9hJiZGYyhhKTthLlM9YjthLm5hPWJjKGEuUywia2V5cHJlc3MiLGEsYyk7YS5DYT1iYyhhLlMsImtleWRvd24iLGEuYSxjLGEpO2Eub2E9YmMoYS5TLCJrZXl1cCIsYS5iLGMsYSl9LEZjPWZ1bmN0aW9uKGEpe2EubmEmJihrYyhhLm5hKSxrYyhhLkNhKSxrYyhhLm9hKSxhLm5hPW51bGwsYS5DYT1udWxsLGEub2E9bnVsbCk7YS5TPW51bGw7YS53PS0xO2EuRj0tMX07Si5wcm90b3R5cGUudT1mdW5jdGlvbigpe0ouaS51LmNhbGwodGhpcyk7RmModGhpcyl9O3ZhciBFYz1mdW5jdGlvbihhLGIsYyxkKXtHLmNhbGwodGhpcyxkKTt0aGlzLnR5cGU9ImtleSI7dGhpcy5jPWE7dGhpcy5yZXBlYXQ9Y307bihFYyxHKTt2YXIgR2M9eD8iTW96VXNlclNlbGVjdCI6eXx8YmI/IldlYmtpdFVzZXJTZWxlY3QiOm51bGwsSGM9ZnVuY3Rpb24oYSxiKXtiPWI/bnVsbDphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7aWYoR2Mpe3ZhciBjPSJub25lIjthLnN0eWxlJiYoYS5zdHlsZVtHY109Yyk7aWYoYil7YT0wO2Zvcih2YXIgZDtkPWJbYV07YSsrKWQuc3R5bGUmJihkLnN0eWxlW0djXT1jKX19ZWxzZSBpZih2fHxhYilpZihjPSJvbiIsYS5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyksYilmb3IoYT0wO2Q9YlthXTthKyspZC5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyl9O3ZhciBJYz1mdW5jdGlvbigpe307ZGEoSWMpO0ljLnByb3RvdHlwZS5hPTA7dmFyIEs9ZnVuY3Rpb24oYSl7SS5jYWxsKHRoaXMpO3RoaXMuaj1hfHx4YXx8KHhhPW5ldyB1Yik7dGhpcy5xYT1KYzt0aGlzLlk9bnVsbDt0aGlzLm09ITE7dGhpcy5hPW51bGw7dGhpcy5BPXZvaWQgMDt0aGlzLmc9dGhpcy5jPXRoaXMuYj1udWxsO3RoaXMuR2E9ITF9O24oSyxJKTtLLnByb3RvdHlwZS5PYT1JYy5SKCk7CnZhciBKYz1udWxsLEtjPWZ1bmN0aW9uKGEsYil7c3dpdGNoKGEpe2Nhc2UgMTpyZXR1cm4gYj8iZGlzYWJsZSI6ImVuYWJsZSI7Y2FzZSAyOnJldHVybiBiPyJoaWdobGlnaHQiOiJ1bmhpZ2hsaWdodCI7Y2FzZSA0OnJldHVybiBiPyJhY3RpdmF0ZSI6ImRlYWN0aXZhdGUiO2Nhc2UgODpyZXR1cm4gYj8ic2VsZWN0IjoidW5zZWxlY3QiO2Nhc2UgMTY6cmV0dXJuIGI/ImNoZWNrIjoidW5jaGVjayI7Y2FzZSAzMjpyZXR1cm4gYj8iZm9jdXMiOiJibHVyIjtjYXNlIDY0OnJldHVybiBiPyJvcGVuIjoiY2xvc2UifXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBzdGF0ZSIpO30sTGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuWXx8KGEuWT0iOiIrKGEuT2EuYSsrKS50b1N0cmluZygzNikpfSxNYz1mdW5jdGlvbihhLGIpe2lmKGEuYiYmYS5iLmcpe3ZhciBjPWEuYi5nLGQ9YS5ZO2QgaW4gYyYmZGVsZXRlIGNbZF07cWEoYS5iLmcsYixhKX1hLlk9Yn07Sy5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9Owp2YXIgTmM9ZnVuY3Rpb24oYSl7YT1hLmE7cShhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cmV0dXJuIGF9LE9jPWZ1bmN0aW9uKGEpe2EuQXx8KGEuQT1uZXcgb2MoYSkpO3JldHVybiBxKGEuQSl9O0sucHJvdG90eXBlLnJhPWZ1bmN0aW9uKGEpe2lmKHRoaXMuYiYmdGhpcy5iIT1hKXRocm93IEVycm9yKCJNZXRob2Qgbm90IHN1cHBvcnRlZCIpO0suaS5yYS5jYWxsKHRoaXMsYSl9O0sucHJvdG90eXBlLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPW5iKHRoaXMuai5hLCJESVYiKX07CnZhciBQYz1mdW5jdGlvbihhLGIpe2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiJiZhLnhhKGIpKXthLkdhPSEwO3ZhciBjPXFiKGIpO2EuaiYmYS5qLmE9PWN8fChhLmo9Yj9uZXcgdWIocWIoYikpOnhhfHwoeGE9bmV3IHViKSk7YS52YShiKTthLkQoKX1lbHNlIHRocm93IEVycm9yKCJJbnZhbGlkIGVsZW1lbnQgdG8gZGVjb3JhdGUiKTt9O2g9Sy5wcm90b3R5cGU7aC54YT1mdW5jdGlvbigpe3JldHVybiEwfTtoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hfTtoLkQ9ZnVuY3Rpb24oKXt0aGlzLm09ITA7UWModGhpcyxmdW5jdGlvbihhKXshYS5tJiZhLmYoKSYmYS5EKCl9KX07aC5QPWZ1bmN0aW9uKCl7UWModGhpcyxmdW5jdGlvbihhKXthLm0mJmEuUCgpfSk7dGhpcy5BJiZyYyh0aGlzLkEpO3RoaXMubT0hMX07CmgudT1mdW5jdGlvbigpe3RoaXMubSYmdGhpcy5QKCk7dGhpcy5BJiYodGhpcy5BLk4oKSxkZWxldGUgdGhpcy5BKTtRYyh0aGlzLGZ1bmN0aW9uKGEpe2EuTigpfSk7IXRoaXMuR2EmJnRoaXMuYSYmb2IodGhpcy5hKTt0aGlzLmI9dGhpcy5hPXRoaXMuZz10aGlzLmM9bnVsbDtLLmkudS5jYWxsKHRoaXMpfTtoLnNhPWZ1bmN0aW9uKGEsYil7dGhpcy50YShhLFJjKHRoaXMpLGIpfTsKaC50YT1mdW5jdGlvbihhLGIsYyl7cSghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLm0mJihjfHwhdGhpcy5tKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZigwPmJ8fGI+UmModGhpcykpdGhyb3cgRXJyb3IoIkNoaWxkIGNvbXBvbmVudCBpbmRleCBvdXQgb2YgYm91bmRzIik7dGhpcy5nJiZ0aGlzLmN8fCh0aGlzLmc9e30sdGhpcy5jPVtdKTtpZihhLmI9PXRoaXMpe3ZhciBkPUxjKGEpO3RoaXMuZ1tkXT1hO0hhKHRoaXMuYyxhKX1lbHNlIHFhKHRoaXMuZyxMYyhhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuYiYmYS5ZKXt2YXIgZT1hLmI7ZD1hLlk7ZS5nJiZkPyhlPWUuZyxkPShudWxsIT09ZSYmZCBpbiBlP2VbZF06dm9pZCAwKXx8bnVsbCk6ZD1udWxsfWlmKGQmJmEuYiE9dGhpcyl0aHJvdyBFcnJvcigiVW5hYmxlIHRvIHNldCBwYXJlbnQgY29tcG9uZW50Iik7CmEuYj10aGlzO0suaS5yYS5jYWxsKGEsdGhpcyk7TGEodGhpcy5jLGIsMCxhKTtpZihhLm0mJnRoaXMubSYmYS5iPT10aGlzKWM9dGhpcy5qYSgpLGI9Yy5jaGlsZE5vZGVzW2JdfHxudWxsLGIhPWEuZigpJiZjLmluc2VydEJlZm9yZShhLmYoKSxiKTtlbHNlIGlmKGMpe3RoaXMuYXx8dGhpcy5pYSgpO2M9TCh0aGlzLGIrMSk7Yj10aGlzLmphKCk7Yz1jP2MuYTpudWxsO2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTthLmF8fGEuaWEoKTtiP2IuaW5zZXJ0QmVmb3JlKGEuYSxjfHxudWxsKTphLmouYS5ib2R5LmFwcGVuZENoaWxkKGEuYSk7YS5iJiYhYS5iLm18fGEuRCgpfWVsc2UgdGhpcy5tJiYhYS5tJiZhLmEmJmEuYS5wYXJlbnROb2RlJiYxPT1hLmEucGFyZW50Tm9kZS5ub2RlVHlwZSYmYS5EKCl9O2guamE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hfTsKdmFyIFNjPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEucWEpe3ZhciBiPWEubT9hLmE6YS5qLmEuYm9keTthOnt2YXIgYz1xYihiKTtpZihjLmRlZmF1bHRWaWV3JiZjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihjPWMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpKSl7Yz1jLmRpcmVjdGlvbnx8Yy5nZXRQcm9wZXJ0eVZhbHVlKCJkaXJlY3Rpb24iKXx8IiI7YnJlYWsgYX1jPSIifWEucWE9InJ0bCI9PShjfHwoYi5jdXJyZW50U3R5bGU/Yi5jdXJyZW50U3R5bGUuZGlyZWN0aW9uOm51bGwpfHxiLnN0eWxlJiZiLnN0eWxlLmRpcmVjdGlvbil9cmV0dXJuIGEucWF9LFJjPWZ1bmN0aW9uKGEpe3JldHVybiBhLmM/YS5jLmxlbmd0aDowfSxMPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuYz9hLmNbYl18fG51bGw6bnVsbH0sUWM9ZnVuY3Rpb24oYSxiLGMpe2EuYyYmcihhLmMsYixjKX0sVGM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jJiZiP0RhKGEuYyxiKTotMX07dmFyIFZjPWZ1bmN0aW9uKGEsYil7aWYoIWEpdGhyb3cgRXJyb3IoIkludmFsaWQgY2xhc3MgbmFtZSAiK2EpO2lmKCFpYShiKSl0aHJvdyBFcnJvcigiSW52YWxpZCBkZWNvcmF0b3IgZnVuY3Rpb24gIitiKTtVY1thXT1ifSxXYz17fSxVYz17fTt2YXIgWGM9ZnVuY3Rpb24oYSl7dGhpcy5oPWF9O2RhKFhjKTt2YXIgWWM9ZnVuY3Rpb24oYSxiKXthJiYoYS50YWJJbmRleD1iPzA6LTEpfSwkYz1mdW5jdGlvbihhLGIsYyl7Yy5pZCYmTWMoYixjLmlkKTt2YXIgZD1hLmIoKSxlPSExLGY9RChjKTtmJiZyKGYsZnVuY3Rpb24oZyl7Zz09ZD9lPSEwOmcmJnRoaXMuZyhiLGcsZCl9LGEpO2V8fEViKGMsZCk7WmMoYixjKTtyZXR1cm4gY307WGMucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiLGMpe2I9PWMrIi1kaXNhYmxlZCI/YS5aKCExKTpiPT1jKyItaG9yaXpvbnRhbCI/YWQoYSwiaG9yaXpvbnRhbCIpOmI9PWMrIi12ZXJ0aWNhbCImJmFkKGEsInZlcnRpY2FsIil9Owp2YXIgWmM9ZnVuY3Rpb24oYSxiKXtpZihiKWZvcih2YXIgYz1iLmZpcnN0Q2hpbGQsZDtjJiZjLnBhcmVudE5vZGU9PWI7KXtkPWMubmV4dFNpYmxpbmc7aWYoMT09Yy5ub2RlVHlwZSl7YTp7dmFyIGU9YztxKGUpO2U9RChlKTtmb3IodmFyIGY9MCxnPWUubGVuZ3RoO2Y8ZztmKyspe3ZhciBrPWVbZl07aWYoaz1rIGluIFVjP1VjW2tdKCk6bnVsbCl7ZT1rO2JyZWFrIGF9fWU9bnVsbH1lJiYoZS5hPWMsYS5pc0VuYWJsZWQoKXx8ZS5aKCExKSxhLnNhKGUpLFBjKGUsYykpfWVsc2UgYy5ub2RlVmFsdWUmJiIiIT1NYShjLm5vZGVWYWx1ZSl8fGIucmVtb3ZlQ2hpbGQoYyk7Yz1kfX0sYmQ9ZnVuY3Rpb24oYSxiKXtiPWIuZigpO3EoYiwiVGhlIGNvbnRhaW5lciBET00gZWxlbWVudCBjYW5ub3QgYmUgbnVsbC4iKTtIYyhiLHgpO3YmJihiLmhpZGVGb2N1cz0hMCk7KGE9YS5oKSYmdmIoYixhKX07WGMucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKWGMucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5iKCksYz1bYiwiaG9yaXpvbnRhbCI9PWEuSD9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgTT1mdW5jdGlvbigpe30sY2Q7ZGEoTSk7dmFyIGRkPXtidXR0b246InByZXNzZWQiLGNoZWNrYm94OiJjaGVja2VkIixtZW51aXRlbToic2VsZWN0ZWQiLG1lbnVpdGVtY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtcmFkaW86ImNoZWNrZWQiLHJhZGlvOiJjaGVja2VkIix0YWI6InNlbGVjdGVkIix0cmVlaXRlbToic2VsZWN0ZWQifTtNLnByb3RvdHlwZS5oPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLmouYigiRElWIixlZCh0aGlzLGEpLmpvaW4oIiAiKSxhLmJhKX07dmFyIGdkPWZ1bmN0aW9uKGEsYixjKXtpZihhPWEuZj9hLmYoKTphKXt2YXIgZD1bYl07diYmIUEoIjciKSYmKGQ9ZmQoRChhKSxiKSxkLnB1c2goYikpOyhjP0ZiOkhiKShhLGQpfX07Ck0ucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiKXtiLmlkJiZNYyhhLGIuaWQpO2ImJmIuZmlyc3RDaGlsZD9oZChhLGIuZmlyc3RDaGlsZC5uZXh0U2libGluZz9KYShiLmNoaWxkTm9kZXMpOmIuZmlyc3RDaGlsZCk6YS5iYT1udWxsO3ZhciBjPTAsZD10aGlzLmEoKSxlPXRoaXMuYSgpLGY9ITEsZz0hMSxrPSExLHA9SmEoRChiKSk7cihwLGZ1bmN0aW9uKEIpe2Z8fEIhPWQ/Z3x8QiE9ZT9jfD1pZCh0aGlzLEIpOmc9ITA6KGY9ITAsZT09ZCYmKGc9ITApKTsxPT1pZCh0aGlzLEIpJiYoQWEoYiksc2IoYikmJnRiKGIpJiZyYihiLCExKSl9LHRoaXMpO2Eubz1jO2Z8fChwLnB1c2goZCksZT09ZCYmKGc9ITApKTtnfHxwLnB1c2goZSk7KGE9YS53YSkmJnAucHVzaC5hcHBseShwLGEpO2lmKHYmJiFBKCI3Iikpe3ZhciB3PWZkKHApOzA8dy5sZW5ndGgmJihwLnB1c2guYXBwbHkocCx3KSxrPSEwKX1mJiZnJiYhYSYmIWt8fENiKGIscC5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIGpkPWZ1bmN0aW9uKGEsYil7aWYoYT1hLmgoKSl7cShiLCJUaGUgZWxlbWVudCBwYXNzZWQgYXMgYSBmaXJzdCBwYXJhbWV0ZXIgY2Fubm90IGJlIG51bGwuIik7dmFyIGM9Yi5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDthIT1jJiZ2YihiLGEpfX0sa2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYztpZihhLnYmMzImJihjPWEuZigpKSl7aWYoIWImJmEubyYzMil7dHJ5e2MuYmx1cigpfWNhdGNoKGQpe31hLm8mMzImJmEuRmEobnVsbCl9KHNiKGMpJiZ0YihjKSkhPWImJnJiKGMsYil9fSxsZD1mdW5jdGlvbihhLGIsYyl7Y2R8fChjZD17MToiZGlzYWJsZWQiLDg6InNlbGVjdGVkIiwxNjoiY2hlY2tlZCIsNjQ6ImV4cGFuZGVkIn0pO3EoYSwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO2I9Y2RbYl07dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDtkJiYoZD1kZFtkXXx8YixiPSJjaGVja2VkIj09Ynx8InNlbGVjdGVkIj09CmI/ZDpiKTtiJiZ4YihhLGIsYyl9O00ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250cm9sIn07CnZhciBlZD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuYSgpLGQ9W2NdLGU9YS5hKCk7ZSE9YyYmZC5wdXNoKGUpO2M9Yi5vO2ZvcihlPVtdO2M7KXt2YXIgZj1jJi1jO2UucHVzaChtZChhLGYpKTtjJj1+Zn1kLnB1c2guYXBwbHkoZCxlKTsoYT1iLndhKSYmZC5wdXNoLmFwcGx5KGQsYSk7diYmIUEoIjciKSYmZC5wdXNoLmFwcGx5KGQsZmQoZCkpO3JldHVybiBkfSxmZD1mdW5jdGlvbihhLGIpe3ZhciBjPVtdO2ImJihhPUlhKGEsW2JdKSk7cihbXSxmdW5jdGlvbihkKXshRmEoZCxsYShHYSxhKSl8fGImJiFHYShkLGIpfHxjLnB1c2goZC5qb2luKCJfIikpfSk7cmV0dXJuIGN9LG1kPWZ1bmN0aW9uKGEsYil7YS5ifHxuZChhKTtyZXR1cm4gYS5iW2JdfSxpZD1mdW5jdGlvbihhLGIpe2Euanx8KGEuYnx8bmQoYSksYS5qPXNhKGEuYikpO2E9cGFyc2VJbnQoYS5qW2JdLDEwKTtyZXR1cm4gaXNOYU4oYSk/MDphfSxuZD1mdW5jdGlvbihhKXt2YXIgYj1hLmEoKSxjPSF0KGIucmVwbGFjZSgvXHhhMHxccy9nLAoiICIpLCIgIik7cShjLCJDb250cm9sUmVuZGVyZXIgaGFzIGFuIGludmFsaWQgY3NzIGNsYXNzOiAnIitiKyInIik7YS5iPXsxOmIrIi1kaXNhYmxlZCIsMjpiKyItaG92ZXIiLDQ6YisiLWFjdGl2ZSIsODpiKyItc2VsZWN0ZWQiLDE2OmIrIi1jaGVja2VkIiwzMjpiKyItZm9jdXNlZCIsNjQ6YisiLW9wZW4ifX07dmFyIE49ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO2lmKCFiKXtiPXRoaXMuY29uc3RydWN0b3I7Zm9yKHZhciBkO2I7KXtkPWJbamFdfHwoYltqYV09KytrYSk7aWYoZD1XY1tkXSlicmVhaztiPWIuaT9iLmkuY29uc3RydWN0b3I6bnVsbH1iPWQ/aWEoZC5SKT9kLlIoKTpuZXcgZDpudWxsfXRoaXMuQj1iO3RoaXMuYmE9dm9pZCAwIT09YT9hOm51bGx9O24oTixLKTtoPU4ucHJvdG90eXBlO2guYmE9bnVsbDtoLm89MDtoLnY9Mzk7aC5LPTA7aC5JYT0hMDtoLndhPW51bGw7aC55YT0hMDtoLmlhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CLmModGhpcyk7dGhpcy5hPWE7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmeGIoYSwiaGlkZGVuIiwhMCkpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hPXRoaXMuQi5nKHRoaXMsYSk7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5JYT0ibm9uZSIhPWEuc3R5bGUuZGlzcGxheX07CmguRD1mdW5jdGlvbigpe04uaS5ELmNhbGwodGhpcyk7dmFyIGE9TmModGhpcyk7cSh0aGlzKTtxKGEpO3RoaXMuaXNWaXNpYmxlKCl8fHhiKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fGxkKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy52JjgmJmxkKGEsOCwhISh0aGlzLm8mOCkpO3RoaXMudiYxNiYmbGQoYSwxNiwhISh0aGlzLm8mMTYpKTt0aGlzLnYmNjQmJmxkKGEsNjQsISEodGhpcy5vJjY0KSk7YT10aGlzLkI7U2ModGhpcykmJmdkKHRoaXMuZigpLGEuYSgpKyItcnRsIiwhMCk7dGhpcy5pc0VuYWJsZWQoKSYma2QodGhpcyx0aGlzLmlzVmlzaWJsZSgpKTtpZih0aGlzLnYmLTImJih0aGlzLnlhJiZvZCh0aGlzLCEwKSx0aGlzLnYmMzImJihhPXRoaXMuZigpKSkpe3ZhciBiPXRoaXMuV3x8KHRoaXMuVz1uZXcgSik7emMoYixhKTtIKEgoSChPYyh0aGlzKSxiLCJrZXkiLHRoaXMuZmEpLGEsImZvY3VzIix0aGlzLk5hKSxhLCJibHVyIiwKdGhpcy5GYSl9fTt2YXIgb2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYz1PYyhhKSxkPWEuZigpO2I/KEgoSChIKEgoYyxkLEYuTCxhLmthKSxkLFtGLk0sRi5hYV0sYS5sYSksZCwibW91c2VvdmVyIixhLkFhKSxkLCJtb3VzZW91dCIsYS56YSksYS5lYSE9Y2EmJkgoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fEgoYyxkLCJkYmxjbGljayIsYS5KYSksYS5nYXx8KGEuZ2E9bmV3IHBkKGEpLHpiKGEsbGEoQWIsYS5nYSkpKSkpOihxYyhxYyhxYyhxYyhjLGQsRi5MLGEua2EpLGQsW0YuTSxGLmFhXSxhLmxhKSxkLCJtb3VzZW92ZXIiLGEuQWEpLGQsIm1vdXNlb3V0IixhLnphKSxhLmVhIT1jYSYmcWMoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fHFjKGMsZCwiZGJsY2xpY2siLGEuSmEpLEFiKGEuZ2EpLGEuZ2E9bnVsbCkpfTsKTi5wcm90b3R5cGUuUD1mdW5jdGlvbigpe04uaS5QLmNhbGwodGhpcyk7dGhpcy5XJiZGYyh0aGlzLlcpO3RoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJmtkKHRoaXMsITEpfTtOLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7Ti5pLnUuY2FsbCh0aGlzKTt0aGlzLlcmJih0aGlzLlcuTigpLGRlbGV0ZSB0aGlzLlcpO2RlbGV0ZSB0aGlzLkI7dGhpcy5nYT10aGlzLndhPXRoaXMuYmE9bnVsbH07dmFyIGhkPWZ1bmN0aW9uKGEsYil7YS5iYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm8mMSl9OwpOLnByb3RvdHlwZS5aPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYjtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0VuYWJsZWQmJiFiLmlzRW5hYmxlZCgpfHwhTyh0aGlzLDEsIWEpfHwoYXx8KHFkKHRoaXMsITEpLFAodGhpcywhMSkpLHRoaXMuaXNWaXNpYmxlKCkmJmtkKHRoaXMsYSksUSh0aGlzLDEsIWEsITApKX07CnZhciBQPWZ1bmN0aW9uKGEsYil7TyhhLDIsYikmJlEoYSwyLGIpfSxxZD1mdW5jdGlvbihhLGIpe08oYSw0LGIpJiZRKGEsNCxiKX0scmQ9ZnVuY3Rpb24oYSxiKXtPKGEsOCxiKSYmUShhLDgsYil9LHNkPWZ1bmN0aW9uKGEsYil7TyhhLDY0LGIpJiZRKGEsNjQsYil9LFE9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIWQmJjE9PWIpYS5aKCFjKTtlbHNlIGlmKGEudiZiJiZjIT0hIShhLm8mYikpe3ZhciBlPWEuQjtpZihkPWEuZigpKShlPW1kKGUsYikpJiZnZChhLGUsYyksbGQoZCxiLGMpO2Eubz1jP2Eub3xiOmEubyZ+Yn19LHRkPWZ1bmN0aW9uKGEsYixjKXtpZihhLm0mJmEubyZiJiYhYyl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTshYyYmYS5vJmImJlEoYSxiLCExKTthLnY9Yz9hLnZ8YjphLnYmfmJ9LFI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hISgyNTUmYikmJiEhKGEudiZiKX0sTz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuISEoYS52JmIpJiYhIShhLm8mCmIpIT1jJiYoIShhLksmYil8fHVjKGEsS2MoYixjKSkpJiYhYS5VfTtoPU4ucHJvdG90eXBlO2guQWE9ZnVuY3Rpb24oYSl7KCFhLnJlbGF0ZWRUYXJnZXR8fCFwYih0aGlzLmYoKSxhLnJlbGF0ZWRUYXJnZXQpKSYmdWModGhpcywiZW50ZXIiKSYmdGhpcy5pc0VuYWJsZWQoKSYmUih0aGlzLDIpJiZQKHRoaXMsITApfTtoLnphPWZ1bmN0aW9uKGEpe2EucmVsYXRlZFRhcmdldCYmcGIodGhpcy5mKCksYS5yZWxhdGVkVGFyZ2V0KXx8IXVjKHRoaXMsImxlYXZlIil8fChSKHRoaXMsNCkmJnFkKHRoaXMsITEpLFIodGhpcywyKSYmUCh0aGlzLCExKSl9O2guZWE9Y2E7Cmgua2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSxPYihhKSYmISh5JiZ6JiZhLmN0cmxLZXkpKSl7Uih0aGlzLDQpJiZxZCh0aGlzLCEwKTt2YXIgYjtpZihiPXRoaXMuQil7dmFyIGM7Yj10aGlzLnYmMzImJihjPXRoaXMuZigpKT9zYihjKSYmdGIoYyk6ITF9YiYmdGhpcy5mKCkuZm9jdXMoKX0hT2IoYSl8fHkmJnomJmEuY3RybEtleXx8YS5nKCl9O2gubGE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSx0aGlzLm8mNCYmdWQodGhpcyxhKSYmUih0aGlzLDQpJiZxZCh0aGlzLCExKSl9O2guSmE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmdWQodGhpcyxhKX07CnZhciB1ZD1mdW5jdGlvbihhLGIpe2lmKFIoYSwxNikpe3ZhciBjPSEoYS5vJjE2KTtPKGEsMTYsYykmJlEoYSwxNixjKX1SKGEsOCkmJnJkKGEsITApO1IoYSw2NCkmJnNkKGEsIShhLm8mNjQpKTtjPW5ldyBFKCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuQT1iLkEpO3JldHVybiB1YyhhLGMpfTtOLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe1IodGhpcywzMikmJk8odGhpcywzMiwhMCkmJlEodGhpcywzMiwhMCl9O04ucHJvdG90eXBlLkZhPWZ1bmN0aW9uKCl7Uih0aGlzLDQpJiZxZCh0aGlzLCExKTtSKHRoaXMsMzIpJiZPKHRoaXMsMzIsITEpJiZRKHRoaXMsMzIsITEpfTsKTi5wcm90b3R5cGUuZmE9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJjEzPT1hLmMmJnVkKHRoaXMsYSk/KGEuZygpLGEuaigpLCEwKTohMX07aWYoIWlhKE4pKXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBjbGFzcyAiK04pO2lmKCFpYShNKSl0aHJvdyBFcnJvcigiSW52YWxpZCByZW5kZXJlciBjbGFzcyAiK00pO3ZhciB2ZD1OW2phXXx8KE5bamFdPSsra2EpO1djW3ZkXT1NO1ZjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIHBkPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9ITE7dGhpcy5jPW5ldyBvYyh0aGlzKTt6Yih0aGlzLGxhKEFiLHRoaXMuYykpO2E9TmModGhpcy5iKTtIKEgoSCh0aGlzLmMsYSxGLkwsdGhpcy5oKSxhLEYuTSx0aGlzLmopLGEsImNsaWNrIix0aGlzLmcpfTtuKHBkLEMpO3ZhciB3ZD0hdnx8OTw9TnVtYmVyKGliKTsKcGQucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXt0aGlzLmE9ITF9O3BkLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7dGhpcy5hPSEwfTt2YXIgeGQ9ZnVuY3Rpb24oYSxiKXtpZighd2QpcmV0dXJuIGEuYnV0dG9uPTAsYS50eXBlPWIsYTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudHMiKTtjLmluaXRNb3VzZUV2ZW50KGIsYS5idWJibGVzLGEuY2FuY2VsYWJsZSxhLnZpZXd8fG51bGwsYS5kZXRhaWwsYS5zY3JlZW5YLGEuc2NyZWVuWSxhLmNsaWVudFgsYS5jbGllbnRZLGEuY3RybEtleSxhLmFsdEtleSxhLnNoaWZ0S2V5LGEubWV0YUtleSwwLGEucmVsYXRlZFRhcmdldHx8bnVsbCk7cmV0dXJuIGN9OwpwZC5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXtpZih0aGlzLmEpdGhpcy5hPSExO2Vsc2V7dmFyIGI9YS5iLGM9Yi5idXR0b24sZD1iLnR5cGUsZT14ZChiLCJtb3VzZWRvd24iKTt0aGlzLmIua2EobmV3IEcoZSxhLmEpKTtlPXhkKGIsIm1vdXNldXAiKTt0aGlzLmIubGEobmV3IEcoZSxhLmEpKTt3ZHx8KGIuYnV0dG9uPWMsYi50eXBlPWQpfX07cGQucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt0aGlzLmI9bnVsbDtwZC5pLnUuY2FsbCh0aGlzKX07dmFyIFM9ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO3RoaXMuZGE9Ynx8WGMuUigpO3RoaXMuSD1hfHwidmVydGljYWwifTtuKFMsSyk7aD1TLnByb3RvdHlwZTtoLkRhPW51bGw7aC5jYT1udWxsO2guZGE9bnVsbDtoLkg9bnVsbDtoLlQ9ITA7aC5PPSEwO2gubD0tMTtoLnM9bnVsbDtoLlY9ITE7aC5JPW51bGw7dmFyIHlkPWZ1bmN0aW9uKGEpe3JldHVybiBhLkRhfHxhLmYoKX07aD1TLnByb3RvdHlwZTtoLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPXRoaXMuai5iKCJESVYiLHRoaXMuZGEuYyh0aGlzKS5qb2luKCIgIikpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKGEpe3JldHVybiJESVYiPT1hLnRhZ05hbWV9O2gudmE9ZnVuY3Rpb24oYSl7dGhpcy5hPSRjKHRoaXMuZGEsdGhpcyxhKTsibm9uZSI9PWEuc3R5bGUuZGlzcGxheSYmKHRoaXMuVD0hMSl9OwpoLkQ9ZnVuY3Rpb24oKXtTLmkuRC5jYWxsKHRoaXMpO1FjKHRoaXMsZnVuY3Rpb24oYil7Yi5tJiZ6ZCh0aGlzLGIpfSx0aGlzKTt2YXIgYT10aGlzLmYoKTtiZCh0aGlzLmRhLHRoaXMpO0FkKHRoaXMsdGhpcy5UKTtIKEgoSChIKEgoSChIKEgoT2ModGhpcyksdGhpcywiZW50ZXIiLHRoaXMuV2EpLHRoaXMsImhpZ2hsaWdodCIsdGhpcy5YYSksdGhpcywidW5oaWdobGlnaHQiLHRoaXMuY2IpLHRoaXMsIm9wZW4iLHRoaXMuWWEpLHRoaXMsImNsb3NlIix0aGlzLlVhKSxhLEYuTCx0aGlzLlNhKSxxYihhKSxbRi5NLEYuYWFdLHRoaXMuVmEpLGEsW0YuTCxGLk0sRi5hYSwibW91c2VvdmVyIiwibW91c2VvdXQiLCJjb250ZXh0bWVudSJdLHRoaXMuVGEpO0JkKHRoaXMpfTt2YXIgQmQ9ZnVuY3Rpb24oYSl7dmFyIGI9T2MoYSksYz15ZChhKTtIKEgoSChiLGMsImZvY3VzIixhLkhhKSxjLCJibHVyIixhLlFhKSxhLmNhfHwoYS5jYT1uZXcgSih5ZChhKSkpLCJrZXkiLGEuUmEpfTtoPVMucHJvdG90eXBlOwpoLlA9ZnVuY3Rpb24oKXtDZCh0aGlzLC0xKTt0aGlzLnMmJnNkKHRoaXMucywhMSk7dGhpcy5WPSExO1MuaS5QLmNhbGwodGhpcyl9O2gudT1mdW5jdGlvbigpe1MuaS51LmNhbGwodGhpcyk7dGhpcy5jYSYmKHRoaXMuY2EuTigpLHRoaXMuY2E9bnVsbCk7dGhpcy5kYT10aGlzLnM9dGhpcy5JPXRoaXMuRGE9bnVsbH07aC5XYT1mdW5jdGlvbigpe3JldHVybiEwfTsKaC5YYT1mdW5jdGlvbihhKXt2YXIgYj1UYyh0aGlzLGEudGFyZ2V0KTtpZigtMTxiJiZiIT10aGlzLmwpe3ZhciBjPUwodGhpcyx0aGlzLmwpO2MmJlAoYywhMSk7dGhpcy5sPWI7Yz1MKHRoaXMsdGhpcy5sKTt0aGlzLlYmJnFkKGMsITApO3RoaXMucyYmYyE9dGhpcy5zJiYoYy52JjY0P3NkKGMsITApOnNkKHRoaXMucywhMSkpfWI9dGhpcy5mKCk7cShiLCJUaGUgRE9NIGVsZW1lbnQgZm9yIHRoZSBjb250YWluZXIgY2Fubm90IGJlIG51bGwuIik7bnVsbCE9YS50YXJnZXQuZigpJiZ4YihiLCJhY3RpdmVkZXNjZW5kYW50IixhLnRhcmdldC5mKCkuaWQpfTtoLmNiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT1MKHRoaXMsdGhpcy5sKSYmKHRoaXMubD0tMSk7YT10aGlzLmYoKTtxKGEsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnJlbW92ZUF0dHJpYnV0ZSh3YigiYWN0aXZlZGVzY2VuZGFudCIpKX07CmguWWE9ZnVuY3Rpb24oYSl7KGE9YS50YXJnZXQpJiZhIT10aGlzLnMmJmEuYj09dGhpcyYmKHRoaXMucyYmc2QodGhpcy5zLCExKSx0aGlzLnM9YSl9O2guVWE9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMucyYmKHRoaXMucz1udWxsKTt2YXIgYj10aGlzLmYoKSxjPWEudGFyZ2V0LmYoKTtiJiZhLnRhcmdldC5vJjImJmMmJihhPSIiLGMmJihhPWMuaWQscShhLCJUaGUgYWN0aXZlIGVsZW1lbnQgc2hvdWxkIGhhdmUgYW4gaWQuIikpLHhiKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEpKX07aC5TYT1mdW5jdGlvbihhKXt0aGlzLk8mJih0aGlzLlY9ITApO3ZhciBiPXlkKHRoaXMpO2ImJnNiKGIpJiZ0YihiKT9iLmZvY3VzKCk6YS5nKCl9O2guVmE9ZnVuY3Rpb24oKXt0aGlzLlY9ITF9OwpoLlRhPWZ1bmN0aW9uKGEpe2E6e3ZhciBiPWEudGFyZ2V0O2lmKHRoaXMuSSlmb3IodmFyIGM9dGhpcy5mKCk7YiYmYiE9PWM7KXt2YXIgZD1iLmlkO2lmKGQgaW4gdGhpcy5JKXtiPXRoaXMuSVtkXTticmVhayBhfWI9Yi5wYXJlbnROb2RlfWI9bnVsbH1pZihiKXN3aXRjaChhLnR5cGUpe2Nhc2UgRi5MOmIua2EoYSk7YnJlYWs7Y2FzZSBGLk06Y2FzZSBGLmFhOmIubGEoYSk7YnJlYWs7Y2FzZSAibW91c2VvdmVyIjpiLkFhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3V0IjpiLnphKGEpO2JyZWFrO2Nhc2UgImNvbnRleHRtZW51IjpiLmVhKGEpfX07aC5IYT1mdW5jdGlvbigpe307aC5RYT1mdW5jdGlvbigpe0NkKHRoaXMsLTEpO3RoaXMuVj0hMTt0aGlzLnMmJnNkKHRoaXMucywhMSl9OwpoLlJhPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmlzRW5hYmxlZCgpJiZ0aGlzLmlzVmlzaWJsZSgpJiYoMCE9UmModGhpcyl8fHRoaXMuRGEpJiZEZCh0aGlzLGEpPyhhLmcoKSxhLmooKSwhMCk6ITF9Owp2YXIgRGQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1MKGEsYS5sKTtpZihjJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5mYSYmYy5mYShiKXx8YS5zJiZhLnMhPWMmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLnMuZmEmJmEucy5mYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuYyl7Y2FzZSAyNzp5ZChhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpFZChhKTticmVhaztjYXNlIDM1OkZkKGEpO2JyZWFrO2Nhc2UgMzg6aWYoInZlcnRpY2FsIj09YS5IKUdkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9IZChhKTpHZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoInZlcnRpY2FsIj09YS5IKUhkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9HZChhKTpIZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSx6ZD1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZigpO2M9Yy5pZHx8KGMuaWQ9TGMoYikpO2EuSXx8KGEuST17fSk7YS5JW2NdPWJ9O1MucHJvdG90eXBlLnNhPWZ1bmN0aW9uKGEsYil7Q2EoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtTLmkuc2EuY2FsbCh0aGlzLGEsYil9O1MucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEsYixjKXtDYShhLE4pO2EuS3w9MjthLkt8PTY0O3RkKGEsMzIsITEpO2EubSYmMCE9YS55YSYmb2QoYSwhMSk7YS55YT0hMTt2YXIgZD1hLmI9PXRoaXM/VGModGhpcyxhKTotMTtTLmkudGEuY2FsbCh0aGlzLGEsYixjKTthLm0mJnRoaXMubSYmemQodGhpcyxhKTthPWQ7LTE9PWEmJihhPVJjKHRoaXMpKTthPT10aGlzLmw/dGhpcy5sPU1hdGgubWluKFJjKHRoaXMpLTEsYik6YT50aGlzLmwmJmI8PXRoaXMubD90aGlzLmwrKzphPHRoaXMubCYmYj50aGlzLmwmJnRoaXMubC0tfTsKdmFyIGFkPWZ1bmN0aW9uKGEsYil7aWYoYS5mKCkpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5IPWJ9O1MucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O3ZhciBBZD1mdW5jdGlvbihhLGIpe2EuVD1iO3ZhciBjPWEuZigpO2MmJihjLnN0eWxlLmRpc3BsYXk9Yj8iIjoibm9uZSIsWWMoeWQoYSksYS5PJiZhLlQpKX07Uy5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT307Uy5wcm90b3R5cGUuWj1mdW5jdGlvbihhKXt0aGlzLk8hPWEmJnVjKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5PPSEwLFFjKHRoaXMsZnVuY3Rpb24oYil7Yi5MYT9kZWxldGUgYi5MYTpiLlooITApfSkpOihRYyh0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5aKCExKTpiLkxhPSEwfSksdGhpcy5WPXRoaXMuTz0hMSksWWMoeWQodGhpcyksYSYmdGhpcy5UKSl9Owp2YXIgQ2Q9ZnVuY3Rpb24oYSxiKXsoYj1MKGEsYikpP1AoYiwhMCk6LTE8YS5sJiZQKEwoYSxhLmwpLCExKX0sRWQ9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LFJjKGEpLTEpfSxGZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiAwPmI/Yy0xOmJ9LDApfSxIZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7cmV0dXJuKGIrMSklY30sYS5sKX0sR2Q9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe2ItLTtyZXR1cm4gMD5iP2MtMTpifSxhLmwpfSxJZD1mdW5jdGlvbihhLGIsYyl7Yz0wPmM/VGMoYSxhLnMpOmM7dmFyIGQ9UmMoYSk7Yz1iLmNhbGwoYSxjLGQpO2Zvcih2YXIgZT0wO2U8PWQ7KXt2YXIgZj1MKGEsYyksZztpZihnPWYpZz1mLmlzVmlzaWJsZSgpJiZmLmlzRW5hYmxlZCgpJiYhIShmLnYmMik7aWYoZyl7YS5FYShjKTticmVha31lKys7Yz1iLmNhbGwoYSxjLGQpfX07ClMucHJvdG90eXBlLkVhPWZ1bmN0aW9uKGEpe0NkKHRoaXMsYSl9O3ZhciBUPWZ1bmN0aW9uKCl7fTtuKFQsTSk7ZGEoVCk7VC5wcm90b3R5cGUuYT1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYiJ9O1QucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXtyZXR1cm4idGFiIn07VC5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYj1ULmkuYy5jYWxsKHRoaXMsYSk7KGE9YS5QYSkmJmImJihiLnRpdGxlPWF8fCIiKTtyZXR1cm4gYn07VC5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIpe2I9VC5pLmcuY2FsbCh0aGlzLGEsYik7dmFyIGM9Yi50aXRsZXx8IiI7YyYmKGEuUGE9Yyk7YS5vJjgmJihjPWEuYikmJmlhKGMuRykmJihRKGEsOCwhMSksYy5HKGEpKTtyZXR1cm4gYn07dmFyIEpkPWZ1bmN0aW9uKGEsYixjKXtOLmNhbGwodGhpcyxhLGJ8fFQuUigpLGMpO3RkKHRoaXMsOCwhMCk7dGhpcy5LfD05fTtuKEpkLE4pO1ZjKCJnb29nLXRhYiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEpkKG51bGwpfSk7dmFyIFU9ZnVuY3Rpb24oKXt0aGlzLmg9InRhYmxpc3QifTtuKFUsWGMpO2RhKFUpO1UucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWItYmFyIn07VS5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIsYyl7dGhpcy5qfHwodGhpcy5hfHxLZCh0aGlzKSx0aGlzLmo9c2EodGhpcy5hKSk7dmFyIGQ9dGhpcy5qW2JdO2Q/KGFkKGEsTGQoZCkpLGEuQj1kKTpVLmkuZy5jYWxsKHRoaXMsYSxiLGMpfTtVLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPVUuaS5jLmNhbGwodGhpcyxhKTt0aGlzLmF8fEtkKHRoaXMpO2IucHVzaCh0aGlzLmFbYS5CXSk7cmV0dXJuIGJ9O3ZhciBLZD1mdW5jdGlvbihhKXt2YXIgYj1hLmIoKTthLmE9e3RvcDpiKyItdG9wIixib3R0b206YisiLWJvdHRvbSIsc3RhcnQ6YisiLXN0YXJ0IixlbmQ6YisiLWVuZCJ9fTt2YXIgVj1mdW5jdGlvbihhLGIsYyl7YT1hfHwidG9wIjthZCh0aGlzLExkKGEpKTt0aGlzLkI9YTtTLmNhbGwodGhpcyx0aGlzLkgsYnx8VS5SKCksYyk7TWQodGhpcyl9O24oVixTKTtoPVYucHJvdG90eXBlO2guQz1udWxsO2guRD1mdW5jdGlvbigpe1YuaS5ELmNhbGwodGhpcyk7TWQodGhpcyl9O2gudT1mdW5jdGlvbigpe1YuaS51LmNhbGwodGhpcyk7dGhpcy5DPW51bGx9O2guRWE9ZnVuY3Rpb24oYSl7Vi5pLkVhLmNhbGwodGhpcyxhKTt0aGlzLkcoTCh0aGlzLGEpKX07aC5HPWZ1bmN0aW9uKGEpe2E/cmQoYSwhMCk6dGhpcy5DJiZyZCh0aGlzLkMsITEpfTsKdmFyIE5kPWZ1bmN0aW9uKGEsYil7aWYoYiYmYj09YS5DKXtmb3IodmFyIGM9VGMoYSxiKSxkPWMtMTtiPUwoYSxkKTtkLS0pe3ZhciBlPWI7aWYoZS5pc1Zpc2libGUoKSYmZS5pc0VuYWJsZWQoKSl7YS5HKGIpO3JldHVybn19Zm9yKGMrPTE7Yj1MKGEsYyk7YysrKWlmKGQ9YixkLmlzVmlzaWJsZSgpJiZkLmlzRW5hYmxlZCgpKXthLkcoYik7cmV0dXJufWEuRyhudWxsKX19O2g9Vi5wcm90b3R5cGU7aC5hYj1mdW5jdGlvbihhKXt0aGlzLkMmJnRoaXMuQyE9YS50YXJnZXQmJnJkKHRoaXMuQywhMSk7dGhpcy5DPWEudGFyZ2V0fTtoLmJiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT10aGlzLkMmJih0aGlzLkM9bnVsbCl9O2guWmE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guJGE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guSGE9ZnVuY3Rpb24oKXtMKHRoaXMsdGhpcy5sKXx8Q2QodGhpcyxUYyh0aGlzLHRoaXMuQ3x8TCh0aGlzLDApKSl9Owp2YXIgTWQ9ZnVuY3Rpb24oYSl7SChIKEgoSChPYyhhKSxhLCJzZWxlY3QiLGEuYWIpLGEsInVuc2VsZWN0IixhLmJiKSxhLCJkaXNhYmxlIixhLlphKSxhLCJoaWRlIixhLiRhKX0sTGQ9ZnVuY3Rpb24oYSl7cmV0dXJuInN0YXJ0Ij09YXx8ImVuZCI9PWE/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O1ZjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBWfSk7ZnVuY3Rpb24gT2QoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIFBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgZz1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIrZyk7Zm9yKHZhciBrPVtdLHA9YmEoYyksdz1wLm5leHQoKTshdy5kb25lO3c9cC5uZXh0KCkpe3c9dy52YWx1ZTt2YXIgQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKQi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO0IudGV4dENvbnRlbnQ9dztmLmFwcGVuZENoaWxkKEIpO2sucHVzaChCKX0iYm90dG9tIiE9ZyYmZS5hcHBlbmRDaGlsZChmKTtwPW51bGw7aWYoInRvcCI9PWd8fCJib3R0b20iPT1nKXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTsidG9wIj09ZyYmcCYmZS5hcHBlbmRDaGlsZChwKTtCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0IuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciByYT1bXTtjPWJhKGMpO2Zvcih3PWMubmV4dCgpOyF3LmRvbmU7dz1jLm5leHQoKSl3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHcuaWQ9ZS5pZCsiX2NvbnRlbnRfIityYS5sZW5ndGgsdy5zdHlsZS5kaXNwbGF5PSJub25lIixCLmFwcGVuZENoaWxkKHcpLHJhLnB1c2godyk7ZS5hcHBlbmRDaGlsZChCKTsiYm90dG9tIj09ZyYmKHAmJgplLmFwcGVuZENoaWxkKHApLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBYPW5ldyBWKGcpO1BjKFgsZik7dmFyIFk9LTE7ZGMoWCwic2VsZWN0IixmdW5jdGlvbihaKXtaPWsuaW5kZXhPZihaLnRhcmdldC5mKCkpO1ohPVkmJigwPD1ZJiZZPHJhLmxlbmd0aCYmKHJhW1ldLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFk9LTEpLDA8PVomJlo8cmEubGVuZ3RoJiYoWT1aLHJhW1ldLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksWC5HKEwoWCxZKSkpfSk7WC5HKEwoWCxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFope1guRyhMKFgsWikpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChPZChhKSl9LFFkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sVz1sOwpRZFswXWluIFd8fCJ1bmRlZmluZWQiPT10eXBlb2YgVy5leGVjU2NyaXB0fHxXLmV4ZWNTY3JpcHQoInZhciAiK1FkWzBdKTtmb3IodmFyIFJkO1FkLmxlbmd0aCYmKFJkPVFkLnNoaWZ0KCkpOylRZC5sZW5ndGh8fHZvaWQgMD09PVBkP1dbUmRdJiZXW1JkXSE9PU9iamVjdC5wcm90b3R5cGVbUmRdP1c9V1tSZF06Vz1XW1JkXT17fTpXW1JkXT1QZDt9KS5jYWxsKHRoaXMpOwovLyBjbGFuZy1mb3JtYXQgb24K", + "headers": [ + [ + "content-type", + "application/javascript" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + } + } + }, + "executionInfo": { + "elapsed": 2695, + "status": "ok", + "timestamp": 1600709610320, + "user": { + "displayName": "Evgeny Skvortsov", + "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhiQjODaOVLfYnUuWS9rB3LRntzJDM0hqElzsUkdQ=s64", + "userId": "11510585406840398626" + }, + "user_tz": 420 + }, + "id": "E5CxNQgaRoNU", + "outputId": "ec0ceb6a-6778-47e0-d989-73c40a68d593" + }, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id3" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id3" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id3" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8f8f73cc-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id3\", \"tabNames\": [\"Employee\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_493ef24dca" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id3" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8f8fd9f2-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id3\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_1076f152be" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id3" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8f92e53e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_157a5e1943" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_1", + "outputarea_id3" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8f93c49a-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id3_content_1\");\n", + "//# sourceURL=js_fae1284bd3" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_1", + "outputarea_id3" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8f94203e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"8f93c49a-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_a9a6918eed" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_1", + "outputarea_id3" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8f9476f6-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id3\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_3615c48e05" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_1", + "outputarea_id3" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running Employee\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"8f96728a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"8f92e53e-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_9b59825964" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_1", + "outputarea_id3" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8f97fea2-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_6e239ca7f7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_0", + "outputarea_id3" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8f988228-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id3_content_0\");\n", + "//# sourceURL=js_1f5a452e38" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_0", + "outputarea_id3" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8f98e204-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"8f988228-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_cc1e2361f9" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_0", + "outputarea_id3" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8f999fe6-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id3\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_8ca4c8104b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_0", + "outputarea_id3" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_0", + "outputarea_id3", + "outputarea_id4", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_0", + "outputarea_id3", + "outputarea_id4", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_0", + "outputarea_id3", + "outputarea_id4", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8f9b28c0-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id4\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_60046e8a8c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_0", + "outputarea_id3", + "outputarea_id4", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8f9b6c4a-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id4\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_f759bd1c56" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_0", + "outputarea_id3", + "outputarea_id4", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8f9c7dc4-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_78843a93a5" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_0", + "id4_content_0", + "outputarea_id3", + "outputarea_id4", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8f9cc39c-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id4_content_0\");\n", + "//# sourceURL=js_9659114172" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_0", + "id4_content_0", + "outputarea_id3", + "outputarea_id4", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8f9d0884-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"8f9cc39c-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_95c277fa36" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_0", + "id4_content_0", + "outputarea_id3", + "outputarea_id4", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8f9d4cf4-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id4\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_a5a356cd1f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_0", + "id4_content_0", + "outputarea_id3", + "outputarea_id4", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mEmployee_sql\u001b[0m variable.\n", + "SELECT * FROM (\n", + " \n", + " SELECT\n", + " \"Alice\" AS name,\n", + " \"Product Manager\" AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Bob\" AS name,\n", + " \"Engineer\" AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Caroline\" AS name,\n", + " \"Engineer\" AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"David\" AS name,\n", + " \"Data Scientist\" AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Eve\" AS name,\n", + " \"Data Scientist\" AS role\n", + " \n", + ") ;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"8f9e352e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"8f9c7dc4-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_8b538df0c5" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_0", + "id4_content_0", + "outputarea_id3", + "outputarea_id4", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8f9f4aea-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"8f97fea2-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_caa779d21a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_0", + "outputarea_id3" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8fa09288-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_644494144e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_1", + "outputarea_id3" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8fa0d82e-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id3_content_1\");\n", + "//# sourceURL=js_25f7ef66b9" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_1", + "outputarea_id3" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8fa11bea-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"8fa0d82e-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_524e2a36fb" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_1", + "outputarea_id3" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"8fa15a7e-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id3\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_b64ed289e7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_1", + "outputarea_id3" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"903d3d68-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"8fa09288-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_69e3860b62" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_1", + "outputarea_id3" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"90407dde-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_de8bbbfe2b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_0", + "outputarea_id3" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"904103ee-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id3_content_0\");\n", + "//# sourceURL=js_df3f0ad389" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_0", + "outputarea_id3" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9041838c-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"904103ee-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_0e81e2d7c4" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_0", + "outputarea_id3" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9041f998-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id3\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_ad7231e4ce" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_0", + "outputarea_id3" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"90449644-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_ec8f122c1e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_0", + "id4_content_1", + "outputarea_id3", + "outputarea_id4", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9044f076-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id4_content_1\");\n", + "//# sourceURL=js_8f3bc95977" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_0", + "id4_content_1", + "outputarea_id3", + "outputarea_id4", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"90456d76-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9044f076-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_546c1ddc5c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_0", + "id4_content_1", + "outputarea_id3", + "outputarea_id4", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9045d590-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id4\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_7c05e715b2" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_0", + "id4_content_1", + "outputarea_id3", + "outputarea_id4", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mEmployee\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
namerole
0AliceProduct Manager
1BobEngineer
2CarolineEngineer
3DavidData Scientist
4EveData Scientist
\n", + "
" + ], + "text/plain": [ + " name role\n", + "0 Alice Product Manager\n", + "1 Bob Engineer\n", + "2 Caroline Engineer\n", + "3 David Data Scientist\n", + "4 Eve Data Scientist" + ] + }, + "metadata": { + "tags": [ + "id3_content_0", + "id4_content_1", + "outputarea_id3", + "outputarea_id4", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9048c43a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"90449644-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_0ed510260a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_0", + "id4_content_1", + "outputarea_id3", + "outputarea_id4", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9049f882-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"90407dde-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_c93a64ecbf" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id3_content_0", + "outputarea_id3" + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "%%logica Employee\n", + "\n", + "Employee(name: \"Alice\", role: \"Product Manager\");\n", + "Employee(name: \"Bob\", role: \"Engineer\");\n", + "Employee(name: \"Caroline\", role: \"Engineer\");\n", + "Employee(name: \"David\", role: \"Data Scientist\");\n", + "Employee(name: \"Eve\", role: \"Data Scientist\");\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "nZJZo1ISV29Z" + }, + "source": [ + "## Rules (aka Queries)\n", + "\n", + "Rules define new predicates from existing. The building block-predicates are tables defined in Logica (see above), or existing BigQuery tables, which can be used directly (see Example below)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "rYi7f2pIZTRs" + }, + "source": [ + "### Expressions\n", + "\n", + "You can use basic operators as in most popular laguages. String concatenation is done via `++`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 208, + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH0=", + "headers": [ + [ + "content-type", + "text/css" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgaCxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9ZnVuY3Rpb24oYSl7dmFyIGI9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmYVtTeW1ib2wuaXRlcmF0b3JdO3JldHVybiBiP2IuY2FsbChhKTp7bmV4dDphYShhKX19LGw9dGhpc3x8c2VsZixjYT1mdW5jdGlvbigpe30sZGE9ZnVuY3Rpb24oYSl7YS5CYT12b2lkIDA7YS5SPWZ1bmN0aW9uKCl7cmV0dXJuIGEuQmE/YS5CYTphLkJhPW5ldyBhfX0sZWE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7aWYoIm9iamVjdCI9PWIpaWYoYSl7aWYoYSBpbnN0YW5jZW9mIEFycmF5KXJldHVybiJhcnJheSI7aWYoYSBpbnN0YW5jZW9mIE9iamVjdClyZXR1cm4gYjt2YXIgYz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk7aWYoIltvYmplY3QgV2luZG93XSI9PWMpcmV0dXJuIm9iamVjdCI7CmlmKCJbb2JqZWN0IEFycmF5XSI9PWN8fCJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGgmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5zcGxpY2UmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoInNwbGljZSIpKXJldHVybiJhcnJheSI7aWYoIltvYmplY3QgRnVuY3Rpb25dIj09Y3x8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmNhbGwmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoImNhbGwiKSlyZXR1cm4iZnVuY3Rpb24ifWVsc2UgcmV0dXJuIm51bGwiO2Vsc2UgaWYoImZ1bmN0aW9uIj09YiYmInVuZGVmaW5lZCI9PXR5cGVvZiBhLmNhbGwpcmV0dXJuIm9iamVjdCI7cmV0dXJuIGJ9LGZhPWZ1bmN0aW9uKGEpe3JldHVybiJhcnJheSI9PWVhKGEpfSxoYT1mdW5jdGlvbihhKXt2YXIgYj1lYShhKTtyZXR1cm4iYXJyYXkiPT1ifHwib2JqZWN0Ij09CmImJiJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGh9LGlhPWZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PWVhKGEpfSxtPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBhO3JldHVybiJvYmplY3QiPT1iJiZudWxsIT1hfHwiZnVuY3Rpb24iPT1ifSxqYT0iY2xvc3VyZV91aWRfIisoMUU5Kk1hdGgucmFuZG9tKCk+Pj4wKSxrYT0wLGxhPWZ1bmN0aW9uKGEsYil7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe3ZhciBkPWMuc2xpY2UoKTtkLnB1c2guYXBwbHkoZCxhcmd1bWVudHMpO3JldHVybiBhLmFwcGx5KHRoaXMsZCl9fSxuPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe31jLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLmk9Yi5wcm90b3R5cGU7YS5wcm90b3R5cGU9bmV3IGM7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YX07dmFyIG1hLG5hPXtlYjoiYWN0aXZlZGVzY2VuZGFudCIsamI6ImF0b21pYyIsa2I6ImF1dG9jb21wbGV0ZSIsbWI6ImJ1c3kiLHBiOiJjaGVja2VkIixxYjoiY29saW5kZXgiLHZiOiJjb250cm9scyIseGI6ImRlc2NyaWJlZGJ5IixBYjoiZGlzYWJsZWQiLENiOiJkcm9wZWZmZWN0IixEYjoiZXhwYW5kZWQiLEViOiJmbG93dG8iLEdiOiJncmFiYmVkIixLYjoiaGFzcG9wdXAiLE1iOiJoaWRkZW4iLE9iOiJpbnZhbGlkIixQYjoibGFiZWwiLFFiOiJsYWJlbGxlZGJ5IixSYjoibGV2ZWwiLFdiOiJsaXZlIixrYzoibXVsdGlsaW5lIixsYzoibXVsdGlzZWxlY3RhYmxlIixwYzoib3JpZW50YXRpb24iLHFjOiJvd25zIixyYzoicG9zaW5zZXQiLHRjOiJwcmVzc2VkIix4YzoicmVhZG9ubHkiLHpjOiJyZWxldmFudCIsQWM6InJlcXVpcmVkIixFYzoicm93aW5kZXgiLEhjOiJzZWxlY3RlZCIsSmM6InNldHNpemUiLExjOiJzb3J0IixaYzoidmFsdWVtYXgiLCRjOiJ2YWx1ZW1pbiIsYWQ6InZhbHVlbm93IiwKYmQ6InZhbHVldGV4dCJ9O3ZhciBvYT1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkIGluIGEpYi5jYWxsKGMsYVtkXSxkLGEpfSxwYT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyBpbiBhKWlmKGFbY109PWIpcmV0dXJuITA7cmV0dXJuITF9LHFhPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsIT09YSYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfSxzYT1mdW5jdGlvbihhKXt2YXIgYj17fSxjO2ZvcihjIGluIGEpYlthW2NdXT1jO3JldHVybiBifSx0YT0iY29uc3RydWN0b3IgaGFzT3duUHJvcGVydHkgaXNQcm90b3R5cGVPZiBwcm9wZXJ0eUlzRW51bWVyYWJsZSB0b0xvY2FsZVN0cmluZyB0b1N0cmluZyB2YWx1ZU9mIi5zcGxpdCgiICIpLHVhPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8dGEubGVuZ3RoO2YrKyljPQp0YVtmXSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZCxjKSYmKGFbY109ZFtjXSl9fTt2YXIgdmE9e2ZiOiJhbGVydCIsZ2I6ImFsZXJ0ZGlhbG9nIixoYjoiYXBwbGljYXRpb24iLGliOiJhcnRpY2xlIixsYjoiYmFubmVyIixuYjoiYnV0dG9uIixvYjoiY2hlY2tib3giLHJiOiJjb2x1bW5oZWFkZXIiLHNiOiJjb21ib2JveCIsdGI6ImNvbXBsZW1lbnRhcnkiLHViOiJjb250ZW50aW5mbyIsd2I6ImRlZmluaXRpb24iLHliOiJkaWFsb2ciLHpiOiJkaXJlY3RvcnkiLEJiOiJkb2N1bWVudCIsRmI6ImZvcm0iLEhiOiJncmlkIixJYjoiZ3JpZGNlbGwiLEpiOiJncm91cCIsTGI6ImhlYWRpbmciLE5iOiJpbWciLFNiOiJsaW5rIixUYjoibGlzdCIsVWI6Imxpc3Rib3giLFZiOiJsaXN0aXRlbSIsWGI6ImxvZyIsWWI6Im1haW4iLFpiOiJtYXJxdWVlIiwkYjoibWF0aCIsYWM6Im1lbnUiLGJjOiJtZW51YmFyIixjYzoibWVudWl0ZW0iLGRjOiJtZW51aXRlbWNoZWNrYm94IixlYzoibWVudWl0ZW1yYWRpbyIsbWM6Im5hdmlnYXRpb24iLG5jOiJub3RlIixvYzoib3B0aW9uIiwKc2M6InByZXNlbnRhdGlvbiIsdWM6InByb2dyZXNzYmFyIix2YzoicmFkaW8iLHdjOiJyYWRpb2dyb3VwIix5YzoicmVnaW9uIixCYzoicm93IixDYzoicm93Z3JvdXAiLERjOiJyb3doZWFkZXIiLEZjOiJzY3JvbGxiYXIiLEdjOiJzZWFyY2giLEljOiJzZXBhcmF0b3IiLEtjOiJzbGlkZXIiLE1jOiJzcGluYnV0dG9uIixOYzoic3RhdHVzIixPYzoidGFiIixQYzoidGFibGlzdCIsUWM6InRhYnBhbmVsIixSYzoidGV4dGJveCIsU2M6InRleHRpbmZvIixUYzoidGltZXIiLFVjOiJ0b29sYmFyIixWYzoidG9vbHRpcCIsV2M6InRyZWUiLFhjOiJ0cmVlZ3JpZCIsWWM6InRyZWVpdGVtIn07dmFyIHdhPWZ1bmN0aW9uKGEpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsd2EpO2Vsc2V7dmFyIGI9RXJyb3IoKS5zdGFjaztiJiYodGhpcy5zdGFjaz1iKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSl9O24od2EsRXJyb3IpO3dhLnByb3RvdHlwZS5uYW1lPSJDdXN0b21FcnJvciI7dmFyIHhhO3ZhciB5YT1mdW5jdGlvbihhLGIpe2E9YS5zcGxpdCgiJXMiKTtmb3IodmFyIGM9IiIsZD1hLmxlbmd0aC0xLGU9MDtlPGQ7ZSsrKWMrPWFbZV0rKGU8Yi5sZW5ndGg/YltlXToiJXMiKTt3YS5jYWxsKHRoaXMsYythW2RdKX07bih5YSx3YSk7eWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjsKdmFyIHphPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSJBc3NlcnRpb24gZmFpbGVkIjtpZihjKXtlKz0iOiAiK2M7dmFyIGY9ZH1lbHNlIGEmJihlKz0iOiAiK2EsZj1iKTt0aHJvdyBuZXcgeWEoIiIrZSxmfHxbXSk7fSxxPWZ1bmN0aW9uKGEsYixjKXthfHx6YSgiIixudWxsLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX0sQWE9ZnVuY3Rpb24oYSxiLGMpe20oYSkmJjE9PWEubm9kZVR5cGV8fHphKCJFeHBlY3RlZCBFbGVtZW50IGJ1dCBnb3QgJXM6ICVzLiIsW2VhKGEpLGFdLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKX0sQ2E9ZnVuY3Rpb24oYSxiLGMsZCl7YSBpbnN0YW5jZW9mIGJ8fHphKCJFeHBlY3RlZCBpbnN0YW5jZW9mICVzIGJ1dCBnb3QgJXMuIixbQmEoYiksQmEoYSldLGMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpKX0sQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZgpGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTpudWxsPT09YT8ibnVsbCI6dHlwZW9mIGF9O3ZhciBEYT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3EobnVsbCE9YS5sZW5ndGgpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKCJzdHJpbmciPT09dHlwZW9mIGEpcmV0dXJuInN0cmluZyIhPT10eXBlb2YgYnx8MSE9Yi5sZW5ndGg/LTE6YS5pbmRleE9mKGIsMCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspaWYoYyBpbiBhJiZhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX0scj1BcnJheS5wcm90b3R5cGUuZm9yRWFjaD9mdW5jdGlvbihhLGIsYyl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsYyl9OmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9YS5sZW5ndGgsZT0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZj0wO2Y8ZDtmKyspZiBpbiBlJiZiLmNhbGwoYyxlW2ZdLGYsYSl9LEVhPUFycmF5LnByb3RvdHlwZS5maWx0ZXI/CmZ1bmN0aW9uKGEsYil7cShudWxsIT1hLmxlbmd0aCk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD1bXSxlPTAsZj0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZz0wO2c8YztnKyspaWYoZyBpbiBmKXt2YXIgaz1mW2ddO2IuY2FsbCh2b2lkIDAsayxnLGEpJiYoZFtlKytdPWspfXJldHVybiBkfSxGYT1BcnJheS5wcm90b3R5cGUuZXZlcnk/ZnVuY3Rpb24oYSxiKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmV2ZXJ5LmNhbGwoYSxiLHZvaWQgMCl9OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWEubGVuZ3RoLGQ9InN0cmluZyI9PT10eXBlb2YgYT9hLnNwbGl0KCIiKTphLGU9MDtlPGM7ZSsrKWlmKGUgaW4gZCYmIWIuY2FsbCh2b2lkIDAsZFtlXSxlLGEpKXJldHVybiExO3JldHVybiEwfSxHYT1mdW5jdGlvbihhLGIpe3JldHVybiAwPD0KRGEoYSxiKX0sSGE9ZnVuY3Rpb24oYSxiKXtiPURhKGEsYik7dmFyIGM7aWYoYz0wPD1iKXEobnVsbCE9YS5sZW5ndGgpLEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhLGIsMSk7cmV0dXJuIGN9LElhPWZ1bmN0aW9uKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGFyZ3VtZW50cyl9LEphPWZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDA8Yil7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX0sTGE9ZnVuY3Rpb24oYSxiLGMsZCl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShhLEthKGFyZ3VtZW50cywxKSl9LEthPWZ1bmN0aW9uKGEsYixjKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gMj49YXJndW1lbnRzLmxlbmd0aD9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsYixjKX07dmFyIE1hPVN0cmluZy5wcm90b3R5cGUudHJpbT9mdW5jdGlvbihhKXtyZXR1cm4gYS50cmltKCl9OmZ1bmN0aW9uKGEpe3JldHVybi9eW1xzXHhhMF0qKFtcc1xTXSo/KVtcc1x4YTBdKiQvLmV4ZWMoYSlbMV19LE5hPS8mL2csT2E9LzwvZyxQYT0vPi9nLFFhPS8iL2csUmE9LycvZyxTYT0vXHgwMC9nLFRhPS9bXHgwMCY8PiInXS8sdD1mdW5jdGlvbihhLGIpe3JldHVybi0xIT1hLmluZGV4T2YoYil9LFVhPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE8Yj8tMTphPmI/MTowfTt2YXIgdTthOnt2YXIgVmE9bC5uYXZpZ2F0b3I7aWYoVmEpe3ZhciBXYT1WYS51c2VyQWdlbnQ7aWYoV2Epe3U9V2E7YnJlYWsgYX19dT0iIn07LyoKCiBDb3B5cmlnaHQgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzLgogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKKi8KdmFyIFhhPWZ1bmN0aW9uKGEpe1RhLnRlc3QoYSkmJigtMSE9YS5pbmRleE9mKCImIikmJihhPWEucmVwbGFjZShOYSwiJmFtcDsiKSksLTEhPWEuaW5kZXhPZigiPCIpJiYoYT1hLnJlcGxhY2UoT2EsIiZsdDsiKSksLTEhPWEuaW5kZXhPZigiPiIpJiYoYT1hLnJlcGxhY2UoUGEsIiZndDsiKSksLTEhPWEuaW5kZXhPZignIicpJiYoYT1hLnJlcGxhY2UoUWEsIiZxdW90OyIpKSwtMSE9YS5pbmRleE9mKCInIikmJihhPWEucmVwbGFjZShSYSwiJiMzOTsiKSksLTEhPWEuaW5kZXhPZigiXHgwMCIpJiYoYT1hLnJlcGxhY2UoU2EsIiYjMDsiKSkpO3JldHVybiBhfTt2YXIgWWE9ZnVuY3Rpb24oYSl7WWFbIiAiXShhKTtyZXR1cm4gYX07WWFbIiAiXT1jYTt2YXIgJGE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1aYTtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsYSk/Y1thXTpjW2FdPWIoYSl9O3ZhciBhYj10KHUsIk9wZXJhIiksdj10KHUsIlRyaWRlbnQiKXx8dCh1LCJNU0lFIiksYmI9dCh1LCJFZGdlIikseD10KHUsIkdlY2tvIikmJiEodCh1LnRvTG93ZXJDYXNlKCksIndlYmtpdCIpJiYhdCh1LCJFZGdlIikpJiYhKHQodSwiVHJpZGVudCIpfHx0KHUsIk1TSUUiKSkmJiF0KHUsIkVkZ2UiKSx5PXQodS50b0xvd2VyQ2FzZSgpLCJ3ZWJraXQiKSYmIXQodSwiRWRnZSIpLHo9dCh1LCJNYWNpbnRvc2giKSxjYj1mdW5jdGlvbigpe3ZhciBhPWwuZG9jdW1lbnQ7cmV0dXJuIGE/YS5kb2N1bWVudE1vZGU6dm9pZCAwfSxkYjsKYTp7dmFyIGViPSIiLGZiPWZ1bmN0aW9uKCl7dmFyIGE9dTtpZih4KXJldHVybi9ydjooW15cKTtdKykoXCl8OykvLmV4ZWMoYSk7aWYoYmIpcmV0dXJuL0VkZ2VcLyhbXGRcLl0rKS8uZXhlYyhhKTtpZih2KXJldHVybi9cYig/Ok1TSUV8cnYpWzogXShbXlwpO10rKShcKXw7KS8uZXhlYyhhKTtpZih5KXJldHVybi9XZWJLaXRcLyhcUyspLy5leGVjKGEpO2lmKGFiKXJldHVybi8oPzpWZXJzaW9uKVsgXC9dPyhcUyspLy5leGVjKGEpfSgpO2ZiJiYoZWI9ZmI/ZmJbMV06IiIpO2lmKHYpe3ZhciBnYj1jYigpO2lmKG51bGwhPWdiJiZnYj5wYXJzZUZsb2F0KGViKSl7ZGI9U3RyaW5nKGdiKTticmVhayBhfX1kYj1lYn0KdmFyIGhiPWRiLFphPXt9LEE9ZnVuY3Rpb24oYSl7cmV0dXJuICRhKGEsZnVuY3Rpb24oKXtmb3IodmFyIGI9MCxjPU1hKFN0cmluZyhoYikpLnNwbGl0KCIuIiksZD1NYShTdHJpbmcoYSkpLnNwbGl0KCIuIiksZT1NYXRoLm1heChjLmxlbmd0aCxkLmxlbmd0aCksZj0wOzA9PWImJmY8ZTtmKyspe3ZhciBnPWNbZl18fCIiLGs9ZFtmXXx8IiI7ZG97Zz0vKFxkKikoXEQqKSguKikvLmV4ZWMoZyl8fFsiIiwiIiwiIiwiIl07az0vKFxkKikoXEQqKSguKikvLmV4ZWMoayl8fFsiIiwiIiwiIiwiIl07aWYoMD09Z1swXS5sZW5ndGgmJjA9PWtbMF0ubGVuZ3RoKWJyZWFrO2I9VWEoMD09Z1sxXS5sZW5ndGg/MDpwYXJzZUludChnWzFdLDEwKSwwPT1rWzFdLmxlbmd0aD8wOnBhcnNlSW50KGtbMV0sMTApKXx8VWEoMD09Z1syXS5sZW5ndGgsMD09a1syXS5sZW5ndGgpfHxVYShnWzJdLGtbMl0pO2c9Z1szXTtrPWtbM119d2hpbGUoMD09Yil9cmV0dXJuIDA8PWJ9KX0saWI7CmliPWwuZG9jdW1lbnQmJnY/Y2IoKTp2b2lkIDA7dmFyIGpiPSF2fHw5PD1OdW1iZXIoaWIpO3ZhciBsYj1mdW5jdGlvbihhLGIpe29hKGIsZnVuY3Rpb24oYyxkKXtjJiYib2JqZWN0Ij09dHlwZW9mIGMmJmMuZGQmJihjPWMuY2QoKSk7InN0eWxlIj09ZD9hLnN0eWxlLmNzc1RleHQ9YzoiY2xhc3MiPT1kP2EuY2xhc3NOYW1lPWM6ImZvciI9PWQ/YS5odG1sRm9yPWM6a2IuaGFzT3duUHJvcGVydHkoZCk/YS5zZXRBdHRyaWJ1dGUoa2JbZF0sYyk6MD09ZC5sYXN0SW5kZXhPZigiYXJpYS0iLDApfHwwPT1kLmxhc3RJbmRleE9mKCJkYXRhLSIsMCk/YS5zZXRBdHRyaWJ1dGUoZCxjKTphW2RdPWN9KX0sa2I9e2NlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjb2xzcGFuOiJjb2xTcGFuIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGhlaWdodDoiaGVpZ2h0IixtYXhsZW5ndGg6Im1heExlbmd0aCIsbm9uY2U6Im5vbmNlIixyb2xlOiJyb2xlIixyb3dzcGFuOiJyb3dTcGFuIix0eXBlOiJ0eXBlIix1c2VtYXA6InVzZU1hcCIsdmFsaWduOiJ2QWxpZ24iLAp3aWR0aDoid2lkdGgifSxtYj1mdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChrKXtrJiZiLmFwcGVuZENoaWxkKCJzdHJpbmciPT09dHlwZW9mIGs/YS5jcmVhdGVUZXh0Tm9kZShrKTprKX1mb3IodmFyIGU9MjtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXTtpZighaGEoZil8fG0oZikmJjA8Zi5ub2RlVHlwZSlkKGYpO2Vsc2V7YTp7aWYoZiYmIm51bWJlciI9PXR5cGVvZiBmLmxlbmd0aCl7aWYobShmKSl7dmFyIGc9ImZ1bmN0aW9uIj09dHlwZW9mIGYuaXRlbXx8InN0cmluZyI9PXR5cGVvZiBmLml0ZW07YnJlYWsgYX1pZihpYShmKSl7Zz0iZnVuY3Rpb24iPT10eXBlb2YgZi5pdGVtO2JyZWFrIGF9fWc9ITF9cihnP0phKGYpOmYsZCl9fX0sbmI9ZnVuY3Rpb24oYSxiKXtiPVN0cmluZyhiKTsiYXBwbGljYXRpb24veGh0bWwreG1sIj09PWEuY29udGVudFR5cGUmJihiPWIudG9Mb3dlckNhc2UoKSk7cmV0dXJuIGEuY3JlYXRlRWxlbWVudChiKX0sb2I9ZnVuY3Rpb24oYSl7YSYmCmEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpfSxwYj1mdW5jdGlvbihhLGIpe2lmKCFhfHwhYilyZXR1cm4hMTtpZihhLmNvbnRhaW5zJiYxPT1iLm5vZGVUeXBlKXJldHVybiBhPT1ifHxhLmNvbnRhaW5zKGIpO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbilyZXR1cm4gYT09Ynx8ISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNik7Zm9yKDtiJiZhIT1iOyliPWIucGFyZW50Tm9kZTtyZXR1cm4gYj09YX0scWI9ZnVuY3Rpb24oYSl7cShhLCJOb2RlIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4iKTtyZXR1cm4gOT09YS5ub2RlVHlwZT9hOmEub3duZXJEb2N1bWVudHx8YS5kb2N1bWVudH0scmI9ZnVuY3Rpb24oYSxiKXtiP2EudGFiSW5kZXg9MDooYS50YWJJbmRleD0tMSxhLnJlbW92ZUF0dHJpYnV0ZSgidGFiSW5kZXgiKSl9LHNiPWZ1bmN0aW9uKGEpe3JldHVybiB2JiYhQSgiOSIpPyhhPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKSwKbnVsbCE9YSYmYS5zcGVjaWZpZWQpOmEuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpfSx0Yj1mdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgYSYmMDw9YSYmMzI3Njg+YX0sdWI9ZnVuY3Rpb24oYSl7dGhpcy5hPWF8fGwuZG9jdW1lbnR8fGRvY3VtZW50fTt1Yi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBhP3RoaXMuYS5nZXRFbGVtZW50QnlJZChhKTphfTsKdWIucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuYSxlPWFyZ3VtZW50cyxmPVN0cmluZyhlWzBdKSxnPWVbMV07aWYoIWpiJiZnJiYoZy5uYW1lfHxnLnR5cGUpKXtmPVsiPCIsZl07Zy5uYW1lJiZmLnB1c2goJyBuYW1lPSInLFhhKGcubmFtZSksJyInKTtpZihnLnR5cGUpe2YucHVzaCgnIHR5cGU9IicsWGEoZy50eXBlKSwnIicpO3ZhciBrPXt9O3VhKGssZyk7ZGVsZXRlIGsudHlwZTtnPWt9Zi5wdXNoKCI+Iik7Zj1mLmpvaW4oIiIpfWY9bmIoZCxmKTtnJiYoInN0cmluZyI9PT10eXBlb2YgZz9mLmNsYXNzTmFtZT1nOmZhKGcpP2YuY2xhc3NOYW1lPWcuam9pbigiICIpOmxiKGYsZykpOzI8ZS5sZW5ndGgmJm1iKGQsZixlKTtyZXR1cm4gZn07dmFyIHZiPWZ1bmN0aW9uKGEsYil7Yj8ocShwYSh2YSxiKSwiTm8gc3VjaCBBUklBIHJvbGUgIitiKSxhLnNldEF0dHJpYnV0ZSgicm9sZSIsYikpOmEucmVtb3ZlQXR0cmlidXRlKCJyb2xlIil9LHhiPWZ1bmN0aW9uKGEsYixjKXtmYShjKSYmKGM9Yy5qb2luKCIgIikpO3ZhciBkPXdiKGIpOyIiPT09Y3x8dm9pZCAwPT1jPyhtYXx8KG1hPXthdG9taWM6ITEsYXV0b2NvbXBsZXRlOiJub25lIixkcm9wZWZmZWN0OiJub25lIixoYXNwb3B1cDohMSxsaXZlOiJvZmYiLG11bHRpbGluZTohMSxtdWx0aXNlbGVjdGFibGU6ITEsb3JpZW50YXRpb246InZlcnRpY2FsIixyZWFkb25seTohMSxyZWxldmFudDoiYWRkaXRpb25zIHRleHQiLHJlcXVpcmVkOiExLHNvcnQ6Im5vbmUiLGJ1c3k6ITEsZGlzYWJsZWQ6ITEsaGlkZGVuOiExLGludmFsaWQ6ImZhbHNlIn0pLGM9bWEsYiBpbiBjP2Euc2V0QXR0cmlidXRlKGQsY1tiXSk6YS5yZW1vdmVBdHRyaWJ1dGUoZCkpOmEuc2V0QXR0cmlidXRlKGQsCmMpfSx3Yj1mdW5jdGlvbihhKXtxKGEsIkFSSUEgYXR0cmlidXRlIGNhbm5vdCBiZSBlbXB0eS4iKTtxKHBhKG5hLGEpLCJObyBzdWNoIEFSSUEgYXR0cmlidXRlICIrYSk7cmV0dXJuImFyaWEtIithfTt2YXIgeWI9T2JqZWN0LmZyZWV6ZXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O3ZhciBDPWZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVTt0aGlzLko9dGhpcy5KfTtDLnByb3RvdHlwZS5VPSExO0MucHJvdG90eXBlLk49ZnVuY3Rpb24oKXt0aGlzLlV8fCh0aGlzLlU9ITAsdGhpcy51KCkpfTt2YXIgemI9ZnVuY3Rpb24oYSxiKXthLlU/YigpOihhLkp8fChhLko9W10pLGEuSi5wdXNoKGIpKX07Qy5wcm90b3R5cGUudT1mdW5jdGlvbigpe2lmKHRoaXMuSilmb3IoO3RoaXMuSi5sZW5ndGg7KXRoaXMuSi5zaGlmdCgpKCl9O3ZhciBBYj1mdW5jdGlvbihhKXthJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5OJiZhLk4oKX07dmFyIEJiPWZ1bmN0aW9uKGEpe3JldHVybiJzdHJpbmciPT10eXBlb2YgYS5jbGFzc05hbWU/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sRD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6QmIoYSkubWF0Y2goL1xTKy9nKXx8W119LENiPWZ1bmN0aW9uKGEsYil7InN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZT9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxEYj1mdW5jdGlvbihhLGIpe3JldHVybiBhLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5jb250YWlucyhiKTpHYShEKGEpLGIpfSxFYj1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFEYihhLGIpKXt2YXIgYz1CYihhKTtDYihhLGMrKDA8Yy5sZW5ndGg/IiAiK2I6YikpfX0sRmI9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClyKGIsCmZ1bmN0aW9uKGUpe0ViKGEsZSl9KTtlbHNle3ZhciBjPXt9O3IoRChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7cihiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPTA8Yi5sZW5ndGg/IiAiK2Q6ZDtDYihhLGIpfX0sR2I9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6RGIoYSxiKSYmQ2IoYSxFYShEKGEpLGZ1bmN0aW9uKGMpe3JldHVybiBjIT1ifSkuam9pbigiICIpKX0sSGI9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9yKGIsZnVuY3Rpb24oYyl7R2IoYSxjKX0pOkNiKGEsRWEoRChhKSxmdW5jdGlvbihjKXtyZXR1cm4hR2EoYixjKX0pLmpvaW4oIiAiKSl9O3ZhciBJYj0hdnx8OTw9TnVtYmVyKGliKSxKYj0hdnx8OTw9TnVtYmVyKGliKSxLYj12JiYhQSgiOSIpLExiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e2wuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsY2EsYiksbC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjYSxiKX1jYXRjaChjKXt9cmV0dXJuIGF9KCk7dmFyIEU9ZnVuY3Rpb24oYSxiKXt0aGlzLnR5cGU9YTt0aGlzLmE9dGhpcy50YXJnZXQ9Yjt0aGlzLmg9ITE7dGhpcy5LYT0hMH07RS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuaD0hMH07RS5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3RoaXMuS2E9ITF9O3ZhciBGPXtMOiJtb3VzZWRvd24iLE06Im1vdXNldXAiLGFhOiJtb3VzZWNhbmNlbCIsaGM6Im1vdXNlbW92ZSIsamM6Im1vdXNlb3ZlciIsaWM6Im1vdXNlb3V0IixmYzoibW91c2VlbnRlciIsZ2M6Im1vdXNlbGVhdmUifTt2YXIgRz1mdW5jdGlvbihhLGIpe0UuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy5hPXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5jPTA7dGhpcy5BPXRoaXMubWV0YUtleT10aGlzLnNoaWZ0S2V5PXRoaXMuYWx0S2V5PXRoaXMuY3RybEtleT0hMTt0aGlzLnBvaW50ZXJJZD0wO3RoaXMucG9pbnRlclR5cGU9IiI7dGhpcy5iPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMuYT1iO2lmKGI9YS5yZWxhdGVkVGFyZ2V0KXtpZih4KXthOnt0cnl7WWEoYi5ub2RlTmFtZSk7dmFyIGU9ITA7YnJlYWsgYX1jYXRjaChmKXt9ZT0KITF9ZXx8KGI9bnVsbCl9fWVsc2UibW91c2VvdmVyIj09Yz9iPWEuZnJvbUVsZW1lbnQ6Im1vdXNlb3V0Ij09YyYmKGI9YS50b0VsZW1lbnQpO3RoaXMucmVsYXRlZFRhcmdldD1iO2Q/KHRoaXMuY2xpZW50WD12b2lkIDAhPT1kLmNsaWVudFg/ZC5jbGllbnRYOmQucGFnZVgsdGhpcy5jbGllbnRZPXZvaWQgMCE9PWQuY2xpZW50WT9kLmNsaWVudFk6ZC5wYWdlWSx0aGlzLnNjcmVlblg9ZC5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1kLnNjcmVlbll8fDApOih0aGlzLmNsaWVudFg9dm9pZCAwIT09YS5jbGllbnRYP2EuY2xpZW50WDphLnBhZ2VYLHRoaXMuY2xpZW50WT12b2lkIDAhPT1hLmNsaWVudFk/YS5jbGllbnRZOmEucGFnZVksdGhpcy5zY3JlZW5YPWEuc2NyZWVuWHx8MCx0aGlzLnNjcmVlblk9YS5zY3JlZW5ZfHwwKTt0aGlzLmJ1dHRvbj1hLmJ1dHRvbjt0aGlzLmM9YS5rZXlDb2RlfHwwO3RoaXMua2V5PWEua2V5fHwiIjt0aGlzLmN0cmxLZXk9YS5jdHJsS2V5O3RoaXMuYWx0S2V5PQphLmFsdEtleTt0aGlzLnNoaWZ0S2V5PWEuc2hpZnRLZXk7dGhpcy5tZXRhS2V5PWEubWV0YUtleTt0aGlzLkE9ej9hLm1ldGFLZXk6YS5jdHJsS2V5O3RoaXMucG9pbnRlcklkPWEucG9pbnRlcklkfHwwO3RoaXMucG9pbnRlclR5cGU9InN0cmluZyI9PT10eXBlb2YgYS5wb2ludGVyVHlwZT9hLnBvaW50ZXJUeXBlOk1iW2EucG9pbnRlclR5cGVdfHwiIjt0aGlzLmI9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnRoaXMuZygpfX07bihHLEUpO3ZhciBOYj15YihbMSw0LDJdKSxNYj15Yih7MjoidG91Y2giLDM6InBlbiIsNDoibW91c2UifSksT2I9ZnVuY3Rpb24oYSl7cmV0dXJuIEliPzA9PWEuYi5idXR0b246ImNsaWNrIj09YS50eXBlPyEwOiEhKGEuYi5idXR0b24mTmJbMF0pfTtHLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7Ry5pLmouY2FsbCh0aGlzKTt0aGlzLmIuc3RvcFByb3BhZ2F0aW9uP3RoaXMuYi5zdG9wUHJvcGFnYXRpb24oKTp0aGlzLmIuY2FuY2VsQnViYmxlPSEwfTsKRy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe0cuaS5nLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5iO2lmKGEucHJldmVudERlZmF1bHQpYS5wcmV2ZW50RGVmYXVsdCgpO2Vsc2UgaWYoYS5yZXR1cm5WYWx1ZT0hMSxLYil0cnl7aWYoYS5jdHJsS2V5fHwxMTI8PWEua2V5Q29kZSYmMTIzPj1hLmtleUNvZGUpYS5rZXlDb2RlPS0xfWNhdGNoKGIpe319O3ZhciBQYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKDFFNipNYXRoLnJhbmRvbSgpfDApLFFiPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW1BiXSl9LFJiPTA7dmFyIFNiPWZ1bmN0aW9uKGEsYixjLGQsZSl7dGhpcy5saXN0ZW5lcj1hO3RoaXMuYT1udWxsO3RoaXMuc3JjPWI7dGhpcy50eXBlPWM7dGhpcy5jYXB0dXJlPSEhZDt0aGlzLm1hPWU7dGhpcy5rZXk9KytSYjt0aGlzLlg9dGhpcy5oYT0hMX0sVGI9ZnVuY3Rpb24oYSl7YS5YPSEwO2EubGlzdGVuZXI9bnVsbDthLmE9bnVsbDthLnNyYz1udWxsO2EubWE9bnVsbH07dmFyIFViPWZ1bmN0aW9uKGEpe3RoaXMuc3JjPWE7dGhpcy5hPXt9O3RoaXMuYj0wfTtVYi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS50b1N0cmluZygpO2E9dGhpcy5hW2ZdO2F8fChhPXRoaXMuYVtmXT1bXSx0aGlzLmIrKyk7dmFyIGc9VmIoYSxiLGQsZSk7LTE8Zz8oYj1hW2ddLGN8fChiLmhhPSExKSk6KGI9bmV3IFNiKGIsdGhpcy5zcmMsZiwhIWQsZSksYi5oYT1jLGEucHVzaChiKSk7cmV0dXJuIGJ9Owp2YXIgV2I9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLnR5cGU7YyBpbiBhLmEmJkhhKGEuYVtjXSxiKSYmKFRiKGIpLDA9PWEuYVtjXS5sZW5ndGgmJihkZWxldGUgYS5hW2NdLGEuYi0tKSl9LFhiPWZ1bmN0aW9uKGEsYixjLGQsZSl7YT1hLmFbYi50b1N0cmluZygpXTtiPS0xO2EmJihiPVZiKGEsYyxkLGUpKTtyZXR1cm4tMTxiP2FbYl06bnVsbH0sVmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuWCYmZi5saXN0ZW5lcj09YiYmZi5jYXB0dXJlPT0hIWMmJmYubWE9PWQpcmV0dXJuIGV9cmV0dXJuLTF9O3ZhciBZYj0iY2xvc3VyZV9sbV8iKygxRTYqTWF0aC5yYW5kb20oKXwwKSxaYj17fSwkYj0wLGJjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZCYmZC5vbmNlKXJldHVybiBhYyhhLGIsYyxkLGUpO2lmKGZhKGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyliYyhhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9Y2MoYyk7cmV0dXJuIFFiKGEpP2RjKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOmVjKGEsYixjLCExLGQsZSl9LGVjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGc9bShlKT8hIWUuY2FwdHVyZTohIWUsaz1mYyhhKTtrfHwoYVtZYl09az1uZXcgVWIoYSkpO2M9ay5hZGQoYixjLGQsZyxmKTtpZihjLmEpcmV0dXJuIGM7ZD1nYygpO2MuYT1kO2Quc3JjPWE7ZC5saXN0ZW5lcj1jO2lmKGEuYWRkRXZlbnRMaXN0ZW5lcilMYnx8KGU9Zyksdm9pZCAwPT09ZSYmKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksCmQsZSk7ZWxzZSBpZihhLmF0dGFjaEV2ZW50KWEuYXR0YWNoRXZlbnQoaGMoYi50b1N0cmluZygpKSxkKTtlbHNlIGlmKGEuYWRkTGlzdGVuZXImJmEucmVtb3ZlTGlzdGVuZXIpcSgiY2hhbmdlIj09PWIsIk1lZGlhUXVlcnlMaXN0IG9ubHkgaGFzIGEgY2hhbmdlIGV2ZW50IiksYS5hZGRMaXN0ZW5lcihkKTtlbHNlIHRocm93IEVycm9yKCJhZGRFdmVudExpc3RlbmVyIGFuZCBhdHRhY2hFdmVudCBhcmUgdW5hdmFpbGFibGUuIik7JGIrKztyZXR1cm4gY30sZ2M9ZnVuY3Rpb24oKXt2YXIgYT1pYyxiPUpiP2Z1bmN0aW9uKGMpe3JldHVybiBhLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKX06ZnVuY3Rpb24oYyl7Yz1hLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKTtpZighYylyZXR1cm4gY307cmV0dXJuIGJ9LGFjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZmEoYikpe2Zvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWFjKGEsYltmXSxjLGQsZSk7cmV0dXJuIG51bGx9Yz1jYyhjKTtyZXR1cm4gUWIoYSk/CmEuaC5hZGQoU3RyaW5nKGIpLGMsITAsbShkKT8hIWQuY2FwdHVyZTohIWQsZSk6ZWMoYSxiLGMsITAsZCxlKX0samM9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihmYShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylqYyhhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPWNjKGMpLFFiKGEpPyhhPWEuaCxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5hJiYoZj1hLmFbYl0sYz1WYihmLGMsZCxlKSwtMTxjJiYoVGIoZltjXSkscShudWxsIT1mLmxlbmd0aCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSwwPT1mLmxlbmd0aCYmKGRlbGV0ZSBhLmFbYl0sYS5iLS0pKSkpOmEmJihhPWZjKGEpKSYmKGM9WGIoYSxiLGMsZCxlKSkmJmtjKGMpfSxrYz1mdW5jdGlvbihhKXtpZigibnVtYmVyIiE9PXR5cGVvZiBhJiZhJiYhYS5YKXt2YXIgYj1hLnNyYztpZihRYihiKSlXYihiLmgsYSk7ZWxzZXt2YXIgYz1hLnR5cGUsZD1hLmE7Yi5yZW1vdmVFdmVudExpc3RlbmVyPwpiLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KGhjKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7JGItLTsoYz1mYyhiKSk/KFdiKGMsYSksMD09Yy5iJiYoYy5zcmM9bnVsbCxiW1liXT1udWxsKSk6VGIoYSl9fX0saGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gWmI/WmJbYV06WmJbYV09Im9uIithfSxtYz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMDtpZihhPWZjKGEpKWlmKGI9YS5hW2IudG9TdHJpbmcoKV0pZm9yKGI9Yi5jb25jYXQoKSxhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBmPWJbYV07ZiYmZi5jYXB0dXJlPT1jJiYhZi5YJiYoZj1sYyhmLGQpLGU9ZSYmITEhPT1mKX1yZXR1cm4gZX0sbGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5tYXx8YS5zcmM7YS5oYSYma2MoYSk7cmV0dXJuIGMuY2FsbChkLGIpfSxpYz1mdW5jdGlvbihhLApiKXtpZihhLlgpcmV0dXJuITA7aWYoIUpiKXtpZighYilhOntiPVsid2luZG93IiwiZXZlbnQiXTtmb3IodmFyIGM9bCxkPTA7ZDxiLmxlbmd0aDtkKyspaWYoYz1jW2JbZF1dLG51bGw9PWMpe2I9bnVsbDticmVhayBhfWI9Y31kPWI7Yj1uZXcgRyhkLHRoaXMpO2M9ITA7aWYoISgwPmQua2V5Q29kZXx8dm9pZCAwIT1kLnJldHVyblZhbHVlKSl7YTp7dmFyIGU9ITE7aWYoMD09ZC5rZXlDb2RlKXRyeXtkLmtleUNvZGU9LTE7YnJlYWsgYX1jYXRjaChnKXtlPSEwfWlmKGV8fHZvaWQgMD09ZC5yZXR1cm5WYWx1ZSlkLnJldHVyblZhbHVlPSEwfWQ9W107Zm9yKGU9Yi5hO2U7ZT1lLnBhcmVudE5vZGUpZC5wdXNoKGUpO2E9YS50eXBlO2ZvcihlPWQubGVuZ3RoLTE7IWIuaCYmMDw9ZTtlLS0pe2IuYT1kW2VdO3ZhciBmPW1jKGRbZV0sYSwhMCxiKTtjPWMmJmZ9Zm9yKGU9MDshYi5oJiZlPGQubGVuZ3RoO2UrKyliLmE9ZFtlXSxmPW1jKGRbZV0sYSwhMSxiKSxjPWMmJmZ9cmV0dXJuIGN9cmV0dXJuIGxjKGEsCm5ldyBHKGIsdGhpcykpfSxmYz1mdW5jdGlvbihhKXthPWFbWWJdO3JldHVybiBhIGluc3RhbmNlb2YgVWI/YTpudWxsfSxuYz0iX19jbG9zdXJlX2V2ZW50c19mbl8iKygxRTkqTWF0aC5yYW5kb20oKT4+PjApLGNjPWZ1bmN0aW9uKGEpe3EoYSwiTGlzdGVuZXIgY2FuIG5vdCBiZSBudWxsLiIpO2lmKGlhKGEpKXJldHVybiBhO3EoYS5oYW5kbGVFdmVudCwiQW4gb2JqZWN0IGxpc3RlbmVyIG11c3QgaGF2ZSBoYW5kbGVFdmVudCBtZXRob2QuIik7YVtuY118fChhW25jXT1mdW5jdGlvbihiKXtyZXR1cm4gYS5oYW5kbGVFdmVudChiKX0pO3JldHVybiBhW25jXX07dmFyIG9jPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9e319O24ob2MsQyk7CnZhciBwYz1bXSxIPWZ1bmN0aW9uKGEsYixjLGQpe2ZhKGMpfHwoYyYmKHBjWzBdPWMudG9TdHJpbmcoKSksYz1wYyk7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWJjKGIsY1tlXSxkfHxhLmhhbmRsZUV2ZW50LCExLGEuYnx8YSk7aWYoIWYpYnJlYWs7YS5hW2Yua2V5XT1mfXJldHVybiBhfSxxYz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoZmEoYykpZm9yKHZhciBnPTA7ZzxjLmxlbmd0aDtnKyspcWMoYSxiLGNbZ10sZCxlLGYpO2Vsc2UgZD1kfHxhLmhhbmRsZUV2ZW50LGU9bShlKT8hIWUuY2FwdHVyZTohIWUsZj1mfHxhLmJ8fGEsZD1jYyhkKSxlPSEhZSxjPVFiKGIpP1hiKGIuaCxTdHJpbmcoYyksZCxlLGYpOmI/KGI9ZmMoYikpP1hiKGIsYyxkLGUsZik6bnVsbDpudWxsLGMmJihrYyhjKSxkZWxldGUgYS5hW2Mua2V5XSk7cmV0dXJuIGF9LHJjPWZ1bmN0aW9uKGEpe29hKGEuYSxmdW5jdGlvbihiLGMpe3RoaXMuYS5oYXNPd25Qcm9wZXJ0eShjKSYma2MoYil9LAphKTthLmE9e319O29jLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7b2MuaS51LmNhbGwodGhpcyk7cmModGhpcyl9O29jLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJFdmVudEhhbmRsZXIuaGFuZGxlRXZlbnQgbm90IGltcGxlbWVudGVkIik7fTt2YXIgST1mdW5jdGlvbigpe0MuY2FsbCh0aGlzKTt0aGlzLmg9bmV3IFViKHRoaXMpO3RoaXMuTWE9dGhpczt0aGlzLnBhPW51bGx9O24oSSxDKTtJLnByb3RvdHlwZVtQYl09ITA7SS5wcm90b3R5cGUucmE9ZnVuY3Rpb24oYSl7dGhpcy5wYT1hfTtJLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjLGQpe2pjKHRoaXMsYSxiLGMsZCl9Owp2YXIgdWM9ZnVuY3Rpb24oYSxiKXtzYyhhKTt2YXIgYz1hLnBhO2lmKGMpe3ZhciBkPVtdO2Zvcih2YXIgZT0xO2M7Yz1jLnBhKWQucHVzaChjKSxxKDFFMz4rK2UsImluZmluaXRlIGxvb3AiKX1hPWEuTWE7Yz1iLnR5cGV8fGI7InN0cmluZyI9PT10eXBlb2YgYj9iPW5ldyBFKGIsYSk6YiBpbnN0YW5jZW9mIEU/Yi50YXJnZXQ9Yi50YXJnZXR8fGE6KGU9YixiPW5ldyBFKGMsYSksdWEoYixlKSk7ZT0hMDtpZihkKWZvcih2YXIgZj1kLmxlbmd0aC0xOyFiLmgmJjA8PWY7Zi0tKXt2YXIgZz1iLmE9ZFtmXTtlPXRjKGcsYywhMCxiKSYmZX1iLmh8fChnPWIuYT1hLGU9dGMoZyxjLCEwLGIpJiZlLGIuaHx8KGU9dGMoZyxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLmgmJmY8ZC5sZW5ndGg7ZisrKWc9Yi5hPWRbZl0sZT10YyhnLGMsITEsYikmJmU7cmV0dXJuIGV9OwpJLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7SS5pLnUuY2FsbCh0aGlzKTtpZih0aGlzLmgpe3ZhciBhPXRoaXMuaCxiPTAsYztmb3IoYyBpbiBhLmEpe2Zvcih2YXIgZD1hLmFbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixUYihkW2VdKTtkZWxldGUgYS5hW2NdO2EuYi0tfX10aGlzLnBhPW51bGx9O3ZhciBkYz1mdW5jdGlvbihhLGIsYyxkLGUpe3NjKGEpO3JldHVybiBhLmguYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LHRjPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5oLmFbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGc9YltmXTtpZihnJiYhZy5YJiZnLmNhcHR1cmU9PWMpe3ZhciBrPWcubGlzdGVuZXIscD1nLm1hfHxnLnNyYztnLmhhJiZXYihhLmgsZyk7ZT0hMSE9PWsuY2FsbChwLGQpJiZlfX1yZXR1cm4gZSYmMCE9ZC5LYX0sc2M9ZnVuY3Rpb24oYSl7cShhLmgsIkV2ZW50IHRhcmdldCBpcyBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgY2FsbCB0aGUgc3VwZXJjbGFzcyAoZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpIGNvbnN0cnVjdG9yPyIpfTt2YXIgeGM9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKHkmJiFBKCI1MjUiKSlyZXR1cm4hMDtpZih6JiZlKXJldHVybiB2YyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZigheCl7Im51bWJlciI9PT10eXBlb2YgYiYmKGI9d2MoYikpO3ZhciBnPTE3PT1ifHwxOD09Ynx8eiYmOTE9PWI7aWYoKCFjfHx6KSYmZ3x8eiYmMTY9PWImJihkfHxmKSlyZXR1cm4hMX1pZigoeXx8YmIpJiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1pZih2JiZkJiZiPT1hKXJldHVybiExO3N3aXRjaChhKXtjYXNlIDEzOnJldHVybiB4P2Z8fGU/ITE6IShjJiZkKTohMDtjYXNlIDI3OnJldHVybiEoeXx8YmJ8fHgpfXJldHVybiB4JiYoZHx8ZXx8Zik/ITE6dmMoYSl9LHZjPWZ1bmN0aW9uKGEpe2lmKDQ4PD1hJiY1Nz49YXx8Cjk2PD1hJiYxMDY+PWF8fDY1PD1hJiY5MD49YXx8KHl8fGJiKSYmMD09YSlyZXR1cm4hMDtzd2l0Y2goYSl7Y2FzZSAzMjpjYXNlIDQzOmNhc2UgNjM6Y2FzZSA2NDpjYXNlIDEwNzpjYXNlIDEwOTpjYXNlIDExMDpjYXNlIDExMTpjYXNlIDE4NjpjYXNlIDU5OmNhc2UgMTg5OmNhc2UgMTg3OmNhc2UgNjE6Y2FzZSAxODg6Y2FzZSAxOTA6Y2FzZSAxOTE6Y2FzZSAxOTI6Y2FzZSAyMjI6Y2FzZSAyMTk6Y2FzZSAyMjA6Y2FzZSAyMjE6Y2FzZSAxNjM6Y2FzZSA1ODpyZXR1cm4hMDtjYXNlIDE3MzpyZXR1cm4geDtkZWZhdWx0OnJldHVybiExfX0sd2M9ZnVuY3Rpb24oYSl7aWYoeClhPXljKGEpO2Vsc2UgaWYoeiYmeSlzd2l0Y2goYSl7Y2FzZSA5MzphPTkxfXJldHVybiBhfSx5Yz1mdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSA2MTpyZXR1cm4gMTg3O2Nhc2UgNTk6cmV0dXJuIDE4NjtjYXNlIDE3MzpyZXR1cm4gMTg5O2Nhc2UgMjI0OnJldHVybiA5MTtjYXNlIDA6cmV0dXJuIDIyNDsKZGVmYXVsdDpyZXR1cm4gYX19O3ZhciBKPWZ1bmN0aW9uKGEsYil7SS5jYWxsKHRoaXMpO2EmJnpjKHRoaXMsYSxiKX07bihKLEkpO2g9Si5wcm90b3R5cGU7aC5TPW51bGw7aC5uYT1udWxsO2guQ2E9bnVsbDtoLm9hPW51bGw7aC53PS0xO2guRj0tMTtoLnVhPSExOwp2YXIgQWM9ezM6MTMsMTI6MTQ0LDYzMjMyOjM4LDYzMjMzOjQwLDYzMjM0OjM3LDYzMjM1OjM5LDYzMjM2OjExMiw2MzIzNzoxMTMsNjMyMzg6MTE0LDYzMjM5OjExNSw2MzI0MDoxMTYsNjMyNDE6MTE3LDYzMjQyOjExOCw2MzI0MzoxMTksNjMyNDQ6MTIwLDYzMjQ1OjEyMSw2MzI0NjoxMjIsNjMyNDc6MTIzLDYzMjQ4OjQ0LDYzMjcyOjQ2LDYzMjczOjM2LDYzMjc1OjM1LDYzMjc2OjMzLDYzMjc3OjM0LDYzMjg5OjE0NCw2MzMwMjo0NX0sQmM9e1VwOjM4LERvd246NDAsTGVmdDozNyxSaWdodDozOSxFbnRlcjoxMyxGMToxMTIsRjI6MTEzLEYzOjExNCxGNDoxMTUsRjU6MTE2LEY2OjExNyxGNzoxMTgsRjg6MTE5LEY5OjEyMCxGMTA6MTIxLEYxMToxMjIsRjEyOjEyMywiVSswMDdGIjo0NixIb21lOjM2LEVuZDozNSxQYWdlVXA6MzMsUGFnZURvd246MzQsSW5zZXJ0OjQ1fSxDYz0heXx8QSgiNTI1IiksRGM9eiYmeDsKSi5wcm90b3R5cGUuYT1mdW5jdGlvbihhKXtpZih5fHxiYilpZigxNz09dGhpcy53JiYhYS5jdHJsS2V5fHwxOD09dGhpcy53JiYhYS5hbHRLZXl8fHomJjkxPT10aGlzLncmJiFhLm1ldGFLZXkpdGhpcy5GPXRoaXMudz0tMTstMT09dGhpcy53JiYoYS5jdHJsS2V5JiYxNyE9YS5jP3RoaXMudz0xNzphLmFsdEtleSYmMTghPWEuYz90aGlzLnc9MTg6YS5tZXRhS2V5JiY5MSE9YS5jJiYodGhpcy53PTkxKSk7Q2MmJiF4YyhhLmMsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGEuYWx0S2V5LGEubWV0YUtleSk/dGhpcy5oYW5kbGVFdmVudChhKToodGhpcy5GPXdjKGEuYyksRGMmJih0aGlzLnVhPWEuYWx0S2V5KSl9O0oucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dGhpcy5GPXRoaXMudz0tMTt0aGlzLnVhPWEuYWx0S2V5fTsKSi5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5iLGM9Yi5hbHRLZXk7aWYodiYmImtleXByZXNzIj09YS50eXBlKXt2YXIgZD10aGlzLkY7dmFyIGU9MTMhPWQmJjI3IT1kP2Iua2V5Q29kZTowfWVsc2UoeXx8YmIpJiYia2V5cHJlc3MiPT1hLnR5cGU/KGQ9dGhpcy5GLGU9MDw9Yi5jaGFyQ29kZSYmNjMyMzI+Yi5jaGFyQ29kZSYmdmMoZCk/Yi5jaGFyQ29kZTowKTphYiYmIXk/KGQ9dGhpcy5GLGU9dmMoZCk/Yi5rZXlDb2RlOjApOigia2V5cHJlc3MiPT1hLnR5cGU/KERjJiYoYz10aGlzLnVhKSxiLmtleUNvZGU9PWIuY2hhckNvZGU/MzI+Yi5rZXlDb2RlPyhkPWIua2V5Q29kZSxlPTApOihkPXRoaXMuRixlPWIuY2hhckNvZGUpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkseiYmNjM9PWUmJjIyND09ZCYmKGQ9MTkxKSk7dmFyIGY9ZD13YyhkKTtkPzYzMjMyPD0KZCYmZCBpbiBBYz9mPUFjW2RdOjI1PT1kJiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBCYyYmKGY9QmNbYi5rZXlJZGVudGlmaWVyXSk7eCYmQ2MmJiJrZXlwcmVzcyI9PWEudHlwZSYmIXhjKGYsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KXx8KGE9Zj09dGhpcy53LHRoaXMudz1mLGI9bmV3IEVjKGYsZSxhLGIpLGIuYWx0S2V5PWMsdWModGhpcyxiKSl9O0oucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTsKdmFyIHpjPWZ1bmN0aW9uKGEsYixjKXthLm9hJiZGYyhhKTthLlM9YjthLm5hPWJjKGEuUywia2V5cHJlc3MiLGEsYyk7YS5DYT1iYyhhLlMsImtleWRvd24iLGEuYSxjLGEpO2Eub2E9YmMoYS5TLCJrZXl1cCIsYS5iLGMsYSl9LEZjPWZ1bmN0aW9uKGEpe2EubmEmJihrYyhhLm5hKSxrYyhhLkNhKSxrYyhhLm9hKSxhLm5hPW51bGwsYS5DYT1udWxsLGEub2E9bnVsbCk7YS5TPW51bGw7YS53PS0xO2EuRj0tMX07Si5wcm90b3R5cGUudT1mdW5jdGlvbigpe0ouaS51LmNhbGwodGhpcyk7RmModGhpcyl9O3ZhciBFYz1mdW5jdGlvbihhLGIsYyxkKXtHLmNhbGwodGhpcyxkKTt0aGlzLnR5cGU9ImtleSI7dGhpcy5jPWE7dGhpcy5yZXBlYXQ9Y307bihFYyxHKTt2YXIgR2M9eD8iTW96VXNlclNlbGVjdCI6eXx8YmI/IldlYmtpdFVzZXJTZWxlY3QiOm51bGwsSGM9ZnVuY3Rpb24oYSxiKXtiPWI/bnVsbDphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7aWYoR2Mpe3ZhciBjPSJub25lIjthLnN0eWxlJiYoYS5zdHlsZVtHY109Yyk7aWYoYil7YT0wO2Zvcih2YXIgZDtkPWJbYV07YSsrKWQuc3R5bGUmJihkLnN0eWxlW0djXT1jKX19ZWxzZSBpZih2fHxhYilpZihjPSJvbiIsYS5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyksYilmb3IoYT0wO2Q9YlthXTthKyspZC5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyl9O3ZhciBJYz1mdW5jdGlvbigpe307ZGEoSWMpO0ljLnByb3RvdHlwZS5hPTA7dmFyIEs9ZnVuY3Rpb24oYSl7SS5jYWxsKHRoaXMpO3RoaXMuaj1hfHx4YXx8KHhhPW5ldyB1Yik7dGhpcy5xYT1KYzt0aGlzLlk9bnVsbDt0aGlzLm09ITE7dGhpcy5hPW51bGw7dGhpcy5BPXZvaWQgMDt0aGlzLmc9dGhpcy5jPXRoaXMuYj1udWxsO3RoaXMuR2E9ITF9O24oSyxJKTtLLnByb3RvdHlwZS5PYT1JYy5SKCk7CnZhciBKYz1udWxsLEtjPWZ1bmN0aW9uKGEsYil7c3dpdGNoKGEpe2Nhc2UgMTpyZXR1cm4gYj8iZGlzYWJsZSI6ImVuYWJsZSI7Y2FzZSAyOnJldHVybiBiPyJoaWdobGlnaHQiOiJ1bmhpZ2hsaWdodCI7Y2FzZSA0OnJldHVybiBiPyJhY3RpdmF0ZSI6ImRlYWN0aXZhdGUiO2Nhc2UgODpyZXR1cm4gYj8ic2VsZWN0IjoidW5zZWxlY3QiO2Nhc2UgMTY6cmV0dXJuIGI/ImNoZWNrIjoidW5jaGVjayI7Y2FzZSAzMjpyZXR1cm4gYj8iZm9jdXMiOiJibHVyIjtjYXNlIDY0OnJldHVybiBiPyJvcGVuIjoiY2xvc2UifXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBzdGF0ZSIpO30sTGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuWXx8KGEuWT0iOiIrKGEuT2EuYSsrKS50b1N0cmluZygzNikpfSxNYz1mdW5jdGlvbihhLGIpe2lmKGEuYiYmYS5iLmcpe3ZhciBjPWEuYi5nLGQ9YS5ZO2QgaW4gYyYmZGVsZXRlIGNbZF07cWEoYS5iLmcsYixhKX1hLlk9Yn07Sy5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9Owp2YXIgTmM9ZnVuY3Rpb24oYSl7YT1hLmE7cShhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cmV0dXJuIGF9LE9jPWZ1bmN0aW9uKGEpe2EuQXx8KGEuQT1uZXcgb2MoYSkpO3JldHVybiBxKGEuQSl9O0sucHJvdG90eXBlLnJhPWZ1bmN0aW9uKGEpe2lmKHRoaXMuYiYmdGhpcy5iIT1hKXRocm93IEVycm9yKCJNZXRob2Qgbm90IHN1cHBvcnRlZCIpO0suaS5yYS5jYWxsKHRoaXMsYSl9O0sucHJvdG90eXBlLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPW5iKHRoaXMuai5hLCJESVYiKX07CnZhciBQYz1mdW5jdGlvbihhLGIpe2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiJiZhLnhhKGIpKXthLkdhPSEwO3ZhciBjPXFiKGIpO2EuaiYmYS5qLmE9PWN8fChhLmo9Yj9uZXcgdWIocWIoYikpOnhhfHwoeGE9bmV3IHViKSk7YS52YShiKTthLkQoKX1lbHNlIHRocm93IEVycm9yKCJJbnZhbGlkIGVsZW1lbnQgdG8gZGVjb3JhdGUiKTt9O2g9Sy5wcm90b3R5cGU7aC54YT1mdW5jdGlvbigpe3JldHVybiEwfTtoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hfTtoLkQ9ZnVuY3Rpb24oKXt0aGlzLm09ITA7UWModGhpcyxmdW5jdGlvbihhKXshYS5tJiZhLmYoKSYmYS5EKCl9KX07aC5QPWZ1bmN0aW9uKCl7UWModGhpcyxmdW5jdGlvbihhKXthLm0mJmEuUCgpfSk7dGhpcy5BJiZyYyh0aGlzLkEpO3RoaXMubT0hMX07CmgudT1mdW5jdGlvbigpe3RoaXMubSYmdGhpcy5QKCk7dGhpcy5BJiYodGhpcy5BLk4oKSxkZWxldGUgdGhpcy5BKTtRYyh0aGlzLGZ1bmN0aW9uKGEpe2EuTigpfSk7IXRoaXMuR2EmJnRoaXMuYSYmb2IodGhpcy5hKTt0aGlzLmI9dGhpcy5hPXRoaXMuZz10aGlzLmM9bnVsbDtLLmkudS5jYWxsKHRoaXMpfTtoLnNhPWZ1bmN0aW9uKGEsYil7dGhpcy50YShhLFJjKHRoaXMpLGIpfTsKaC50YT1mdW5jdGlvbihhLGIsYyl7cSghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLm0mJihjfHwhdGhpcy5tKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZigwPmJ8fGI+UmModGhpcykpdGhyb3cgRXJyb3IoIkNoaWxkIGNvbXBvbmVudCBpbmRleCBvdXQgb2YgYm91bmRzIik7dGhpcy5nJiZ0aGlzLmN8fCh0aGlzLmc9e30sdGhpcy5jPVtdKTtpZihhLmI9PXRoaXMpe3ZhciBkPUxjKGEpO3RoaXMuZ1tkXT1hO0hhKHRoaXMuYyxhKX1lbHNlIHFhKHRoaXMuZyxMYyhhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuYiYmYS5ZKXt2YXIgZT1hLmI7ZD1hLlk7ZS5nJiZkPyhlPWUuZyxkPShudWxsIT09ZSYmZCBpbiBlP2VbZF06dm9pZCAwKXx8bnVsbCk6ZD1udWxsfWlmKGQmJmEuYiE9dGhpcyl0aHJvdyBFcnJvcigiVW5hYmxlIHRvIHNldCBwYXJlbnQgY29tcG9uZW50Iik7CmEuYj10aGlzO0suaS5yYS5jYWxsKGEsdGhpcyk7TGEodGhpcy5jLGIsMCxhKTtpZihhLm0mJnRoaXMubSYmYS5iPT10aGlzKWM9dGhpcy5qYSgpLGI9Yy5jaGlsZE5vZGVzW2JdfHxudWxsLGIhPWEuZigpJiZjLmluc2VydEJlZm9yZShhLmYoKSxiKTtlbHNlIGlmKGMpe3RoaXMuYXx8dGhpcy5pYSgpO2M9TCh0aGlzLGIrMSk7Yj10aGlzLmphKCk7Yz1jP2MuYTpudWxsO2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTthLmF8fGEuaWEoKTtiP2IuaW5zZXJ0QmVmb3JlKGEuYSxjfHxudWxsKTphLmouYS5ib2R5LmFwcGVuZENoaWxkKGEuYSk7YS5iJiYhYS5iLm18fGEuRCgpfWVsc2UgdGhpcy5tJiYhYS5tJiZhLmEmJmEuYS5wYXJlbnROb2RlJiYxPT1hLmEucGFyZW50Tm9kZS5ub2RlVHlwZSYmYS5EKCl9O2guamE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hfTsKdmFyIFNjPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEucWEpe3ZhciBiPWEubT9hLmE6YS5qLmEuYm9keTthOnt2YXIgYz1xYihiKTtpZihjLmRlZmF1bHRWaWV3JiZjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihjPWMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpKSl7Yz1jLmRpcmVjdGlvbnx8Yy5nZXRQcm9wZXJ0eVZhbHVlKCJkaXJlY3Rpb24iKXx8IiI7YnJlYWsgYX1jPSIifWEucWE9InJ0bCI9PShjfHwoYi5jdXJyZW50U3R5bGU/Yi5jdXJyZW50U3R5bGUuZGlyZWN0aW9uOm51bGwpfHxiLnN0eWxlJiZiLnN0eWxlLmRpcmVjdGlvbil9cmV0dXJuIGEucWF9LFJjPWZ1bmN0aW9uKGEpe3JldHVybiBhLmM/YS5jLmxlbmd0aDowfSxMPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuYz9hLmNbYl18fG51bGw6bnVsbH0sUWM9ZnVuY3Rpb24oYSxiLGMpe2EuYyYmcihhLmMsYixjKX0sVGM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jJiZiP0RhKGEuYyxiKTotMX07dmFyIFZjPWZ1bmN0aW9uKGEsYil7aWYoIWEpdGhyb3cgRXJyb3IoIkludmFsaWQgY2xhc3MgbmFtZSAiK2EpO2lmKCFpYShiKSl0aHJvdyBFcnJvcigiSW52YWxpZCBkZWNvcmF0b3IgZnVuY3Rpb24gIitiKTtVY1thXT1ifSxXYz17fSxVYz17fTt2YXIgWGM9ZnVuY3Rpb24oYSl7dGhpcy5oPWF9O2RhKFhjKTt2YXIgWWM9ZnVuY3Rpb24oYSxiKXthJiYoYS50YWJJbmRleD1iPzA6LTEpfSwkYz1mdW5jdGlvbihhLGIsYyl7Yy5pZCYmTWMoYixjLmlkKTt2YXIgZD1hLmIoKSxlPSExLGY9RChjKTtmJiZyKGYsZnVuY3Rpb24oZyl7Zz09ZD9lPSEwOmcmJnRoaXMuZyhiLGcsZCl9LGEpO2V8fEViKGMsZCk7WmMoYixjKTtyZXR1cm4gY307WGMucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiLGMpe2I9PWMrIi1kaXNhYmxlZCI/YS5aKCExKTpiPT1jKyItaG9yaXpvbnRhbCI/YWQoYSwiaG9yaXpvbnRhbCIpOmI9PWMrIi12ZXJ0aWNhbCImJmFkKGEsInZlcnRpY2FsIil9Owp2YXIgWmM9ZnVuY3Rpb24oYSxiKXtpZihiKWZvcih2YXIgYz1iLmZpcnN0Q2hpbGQsZDtjJiZjLnBhcmVudE5vZGU9PWI7KXtkPWMubmV4dFNpYmxpbmc7aWYoMT09Yy5ub2RlVHlwZSl7YTp7dmFyIGU9YztxKGUpO2U9RChlKTtmb3IodmFyIGY9MCxnPWUubGVuZ3RoO2Y8ZztmKyspe3ZhciBrPWVbZl07aWYoaz1rIGluIFVjP1VjW2tdKCk6bnVsbCl7ZT1rO2JyZWFrIGF9fWU9bnVsbH1lJiYoZS5hPWMsYS5pc0VuYWJsZWQoKXx8ZS5aKCExKSxhLnNhKGUpLFBjKGUsYykpfWVsc2UgYy5ub2RlVmFsdWUmJiIiIT1NYShjLm5vZGVWYWx1ZSl8fGIucmVtb3ZlQ2hpbGQoYyk7Yz1kfX0sYmQ9ZnVuY3Rpb24oYSxiKXtiPWIuZigpO3EoYiwiVGhlIGNvbnRhaW5lciBET00gZWxlbWVudCBjYW5ub3QgYmUgbnVsbC4iKTtIYyhiLHgpO3YmJihiLmhpZGVGb2N1cz0hMCk7KGE9YS5oKSYmdmIoYixhKX07WGMucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKWGMucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5iKCksYz1bYiwiaG9yaXpvbnRhbCI9PWEuSD9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgTT1mdW5jdGlvbigpe30sY2Q7ZGEoTSk7dmFyIGRkPXtidXR0b246InByZXNzZWQiLGNoZWNrYm94OiJjaGVja2VkIixtZW51aXRlbToic2VsZWN0ZWQiLG1lbnVpdGVtY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtcmFkaW86ImNoZWNrZWQiLHJhZGlvOiJjaGVja2VkIix0YWI6InNlbGVjdGVkIix0cmVlaXRlbToic2VsZWN0ZWQifTtNLnByb3RvdHlwZS5oPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLmouYigiRElWIixlZCh0aGlzLGEpLmpvaW4oIiAiKSxhLmJhKX07dmFyIGdkPWZ1bmN0aW9uKGEsYixjKXtpZihhPWEuZj9hLmYoKTphKXt2YXIgZD1bYl07diYmIUEoIjciKSYmKGQ9ZmQoRChhKSxiKSxkLnB1c2goYikpOyhjP0ZiOkhiKShhLGQpfX07Ck0ucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiKXtiLmlkJiZNYyhhLGIuaWQpO2ImJmIuZmlyc3RDaGlsZD9oZChhLGIuZmlyc3RDaGlsZC5uZXh0U2libGluZz9KYShiLmNoaWxkTm9kZXMpOmIuZmlyc3RDaGlsZCk6YS5iYT1udWxsO3ZhciBjPTAsZD10aGlzLmEoKSxlPXRoaXMuYSgpLGY9ITEsZz0hMSxrPSExLHA9SmEoRChiKSk7cihwLGZ1bmN0aW9uKEIpe2Z8fEIhPWQ/Z3x8QiE9ZT9jfD1pZCh0aGlzLEIpOmc9ITA6KGY9ITAsZT09ZCYmKGc9ITApKTsxPT1pZCh0aGlzLEIpJiYoQWEoYiksc2IoYikmJnRiKGIpJiZyYihiLCExKSl9LHRoaXMpO2Eubz1jO2Z8fChwLnB1c2goZCksZT09ZCYmKGc9ITApKTtnfHxwLnB1c2goZSk7KGE9YS53YSkmJnAucHVzaC5hcHBseShwLGEpO2lmKHYmJiFBKCI3Iikpe3ZhciB3PWZkKHApOzA8dy5sZW5ndGgmJihwLnB1c2guYXBwbHkocCx3KSxrPSEwKX1mJiZnJiYhYSYmIWt8fENiKGIscC5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIGpkPWZ1bmN0aW9uKGEsYil7aWYoYT1hLmgoKSl7cShiLCJUaGUgZWxlbWVudCBwYXNzZWQgYXMgYSBmaXJzdCBwYXJhbWV0ZXIgY2Fubm90IGJlIG51bGwuIik7dmFyIGM9Yi5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDthIT1jJiZ2YihiLGEpfX0sa2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYztpZihhLnYmMzImJihjPWEuZigpKSl7aWYoIWImJmEubyYzMil7dHJ5e2MuYmx1cigpfWNhdGNoKGQpe31hLm8mMzImJmEuRmEobnVsbCl9KHNiKGMpJiZ0YihjKSkhPWImJnJiKGMsYil9fSxsZD1mdW5jdGlvbihhLGIsYyl7Y2R8fChjZD17MToiZGlzYWJsZWQiLDg6InNlbGVjdGVkIiwxNjoiY2hlY2tlZCIsNjQ6ImV4cGFuZGVkIn0pO3EoYSwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO2I9Y2RbYl07dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDtkJiYoZD1kZFtkXXx8YixiPSJjaGVja2VkIj09Ynx8InNlbGVjdGVkIj09CmI/ZDpiKTtiJiZ4YihhLGIsYyl9O00ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250cm9sIn07CnZhciBlZD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuYSgpLGQ9W2NdLGU9YS5hKCk7ZSE9YyYmZC5wdXNoKGUpO2M9Yi5vO2ZvcihlPVtdO2M7KXt2YXIgZj1jJi1jO2UucHVzaChtZChhLGYpKTtjJj1+Zn1kLnB1c2guYXBwbHkoZCxlKTsoYT1iLndhKSYmZC5wdXNoLmFwcGx5KGQsYSk7diYmIUEoIjciKSYmZC5wdXNoLmFwcGx5KGQsZmQoZCkpO3JldHVybiBkfSxmZD1mdW5jdGlvbihhLGIpe3ZhciBjPVtdO2ImJihhPUlhKGEsW2JdKSk7cihbXSxmdW5jdGlvbihkKXshRmEoZCxsYShHYSxhKSl8fGImJiFHYShkLGIpfHxjLnB1c2goZC5qb2luKCJfIikpfSk7cmV0dXJuIGN9LG1kPWZ1bmN0aW9uKGEsYil7YS5ifHxuZChhKTtyZXR1cm4gYS5iW2JdfSxpZD1mdW5jdGlvbihhLGIpe2Euanx8KGEuYnx8bmQoYSksYS5qPXNhKGEuYikpO2E9cGFyc2VJbnQoYS5qW2JdLDEwKTtyZXR1cm4gaXNOYU4oYSk/MDphfSxuZD1mdW5jdGlvbihhKXt2YXIgYj1hLmEoKSxjPSF0KGIucmVwbGFjZSgvXHhhMHxccy9nLAoiICIpLCIgIik7cShjLCJDb250cm9sUmVuZGVyZXIgaGFzIGFuIGludmFsaWQgY3NzIGNsYXNzOiAnIitiKyInIik7YS5iPXsxOmIrIi1kaXNhYmxlZCIsMjpiKyItaG92ZXIiLDQ6YisiLWFjdGl2ZSIsODpiKyItc2VsZWN0ZWQiLDE2OmIrIi1jaGVja2VkIiwzMjpiKyItZm9jdXNlZCIsNjQ6YisiLW9wZW4ifX07dmFyIE49ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO2lmKCFiKXtiPXRoaXMuY29uc3RydWN0b3I7Zm9yKHZhciBkO2I7KXtkPWJbamFdfHwoYltqYV09KytrYSk7aWYoZD1XY1tkXSlicmVhaztiPWIuaT9iLmkuY29uc3RydWN0b3I6bnVsbH1iPWQ/aWEoZC5SKT9kLlIoKTpuZXcgZDpudWxsfXRoaXMuQj1iO3RoaXMuYmE9dm9pZCAwIT09YT9hOm51bGx9O24oTixLKTtoPU4ucHJvdG90eXBlO2guYmE9bnVsbDtoLm89MDtoLnY9Mzk7aC5LPTA7aC5JYT0hMDtoLndhPW51bGw7aC55YT0hMDtoLmlhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CLmModGhpcyk7dGhpcy5hPWE7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmeGIoYSwiaGlkZGVuIiwhMCkpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hPXRoaXMuQi5nKHRoaXMsYSk7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5JYT0ibm9uZSIhPWEuc3R5bGUuZGlzcGxheX07CmguRD1mdW5jdGlvbigpe04uaS5ELmNhbGwodGhpcyk7dmFyIGE9TmModGhpcyk7cSh0aGlzKTtxKGEpO3RoaXMuaXNWaXNpYmxlKCl8fHhiKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fGxkKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy52JjgmJmxkKGEsOCwhISh0aGlzLm8mOCkpO3RoaXMudiYxNiYmbGQoYSwxNiwhISh0aGlzLm8mMTYpKTt0aGlzLnYmNjQmJmxkKGEsNjQsISEodGhpcy5vJjY0KSk7YT10aGlzLkI7U2ModGhpcykmJmdkKHRoaXMuZigpLGEuYSgpKyItcnRsIiwhMCk7dGhpcy5pc0VuYWJsZWQoKSYma2QodGhpcyx0aGlzLmlzVmlzaWJsZSgpKTtpZih0aGlzLnYmLTImJih0aGlzLnlhJiZvZCh0aGlzLCEwKSx0aGlzLnYmMzImJihhPXRoaXMuZigpKSkpe3ZhciBiPXRoaXMuV3x8KHRoaXMuVz1uZXcgSik7emMoYixhKTtIKEgoSChPYyh0aGlzKSxiLCJrZXkiLHRoaXMuZmEpLGEsImZvY3VzIix0aGlzLk5hKSxhLCJibHVyIiwKdGhpcy5GYSl9fTt2YXIgb2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYz1PYyhhKSxkPWEuZigpO2I/KEgoSChIKEgoYyxkLEYuTCxhLmthKSxkLFtGLk0sRi5hYV0sYS5sYSksZCwibW91c2VvdmVyIixhLkFhKSxkLCJtb3VzZW91dCIsYS56YSksYS5lYSE9Y2EmJkgoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fEgoYyxkLCJkYmxjbGljayIsYS5KYSksYS5nYXx8KGEuZ2E9bmV3IHBkKGEpLHpiKGEsbGEoQWIsYS5nYSkpKSkpOihxYyhxYyhxYyhxYyhjLGQsRi5MLGEua2EpLGQsW0YuTSxGLmFhXSxhLmxhKSxkLCJtb3VzZW92ZXIiLGEuQWEpLGQsIm1vdXNlb3V0IixhLnphKSxhLmVhIT1jYSYmcWMoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fHFjKGMsZCwiZGJsY2xpY2siLGEuSmEpLEFiKGEuZ2EpLGEuZ2E9bnVsbCkpfTsKTi5wcm90b3R5cGUuUD1mdW5jdGlvbigpe04uaS5QLmNhbGwodGhpcyk7dGhpcy5XJiZGYyh0aGlzLlcpO3RoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJmtkKHRoaXMsITEpfTtOLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7Ti5pLnUuY2FsbCh0aGlzKTt0aGlzLlcmJih0aGlzLlcuTigpLGRlbGV0ZSB0aGlzLlcpO2RlbGV0ZSB0aGlzLkI7dGhpcy5nYT10aGlzLndhPXRoaXMuYmE9bnVsbH07dmFyIGhkPWZ1bmN0aW9uKGEsYil7YS5iYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm8mMSl9OwpOLnByb3RvdHlwZS5aPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYjtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0VuYWJsZWQmJiFiLmlzRW5hYmxlZCgpfHwhTyh0aGlzLDEsIWEpfHwoYXx8KHFkKHRoaXMsITEpLFAodGhpcywhMSkpLHRoaXMuaXNWaXNpYmxlKCkmJmtkKHRoaXMsYSksUSh0aGlzLDEsIWEsITApKX07CnZhciBQPWZ1bmN0aW9uKGEsYil7TyhhLDIsYikmJlEoYSwyLGIpfSxxZD1mdW5jdGlvbihhLGIpe08oYSw0LGIpJiZRKGEsNCxiKX0scmQ9ZnVuY3Rpb24oYSxiKXtPKGEsOCxiKSYmUShhLDgsYil9LHNkPWZ1bmN0aW9uKGEsYil7TyhhLDY0LGIpJiZRKGEsNjQsYil9LFE9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIWQmJjE9PWIpYS5aKCFjKTtlbHNlIGlmKGEudiZiJiZjIT0hIShhLm8mYikpe3ZhciBlPWEuQjtpZihkPWEuZigpKShlPW1kKGUsYikpJiZnZChhLGUsYyksbGQoZCxiLGMpO2Eubz1jP2Eub3xiOmEubyZ+Yn19LHRkPWZ1bmN0aW9uKGEsYixjKXtpZihhLm0mJmEubyZiJiYhYyl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTshYyYmYS5vJmImJlEoYSxiLCExKTthLnY9Yz9hLnZ8YjphLnYmfmJ9LFI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hISgyNTUmYikmJiEhKGEudiZiKX0sTz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuISEoYS52JmIpJiYhIShhLm8mCmIpIT1jJiYoIShhLksmYil8fHVjKGEsS2MoYixjKSkpJiYhYS5VfTtoPU4ucHJvdG90eXBlO2guQWE9ZnVuY3Rpb24oYSl7KCFhLnJlbGF0ZWRUYXJnZXR8fCFwYih0aGlzLmYoKSxhLnJlbGF0ZWRUYXJnZXQpKSYmdWModGhpcywiZW50ZXIiKSYmdGhpcy5pc0VuYWJsZWQoKSYmUih0aGlzLDIpJiZQKHRoaXMsITApfTtoLnphPWZ1bmN0aW9uKGEpe2EucmVsYXRlZFRhcmdldCYmcGIodGhpcy5mKCksYS5yZWxhdGVkVGFyZ2V0KXx8IXVjKHRoaXMsImxlYXZlIil8fChSKHRoaXMsNCkmJnFkKHRoaXMsITEpLFIodGhpcywyKSYmUCh0aGlzLCExKSl9O2guZWE9Y2E7Cmgua2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSxPYihhKSYmISh5JiZ6JiZhLmN0cmxLZXkpKSl7Uih0aGlzLDQpJiZxZCh0aGlzLCEwKTt2YXIgYjtpZihiPXRoaXMuQil7dmFyIGM7Yj10aGlzLnYmMzImJihjPXRoaXMuZigpKT9zYihjKSYmdGIoYyk6ITF9YiYmdGhpcy5mKCkuZm9jdXMoKX0hT2IoYSl8fHkmJnomJmEuY3RybEtleXx8YS5nKCl9O2gubGE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSx0aGlzLm8mNCYmdWQodGhpcyxhKSYmUih0aGlzLDQpJiZxZCh0aGlzLCExKSl9O2guSmE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmdWQodGhpcyxhKX07CnZhciB1ZD1mdW5jdGlvbihhLGIpe2lmKFIoYSwxNikpe3ZhciBjPSEoYS5vJjE2KTtPKGEsMTYsYykmJlEoYSwxNixjKX1SKGEsOCkmJnJkKGEsITApO1IoYSw2NCkmJnNkKGEsIShhLm8mNjQpKTtjPW5ldyBFKCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuQT1iLkEpO3JldHVybiB1YyhhLGMpfTtOLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe1IodGhpcywzMikmJk8odGhpcywzMiwhMCkmJlEodGhpcywzMiwhMCl9O04ucHJvdG90eXBlLkZhPWZ1bmN0aW9uKCl7Uih0aGlzLDQpJiZxZCh0aGlzLCExKTtSKHRoaXMsMzIpJiZPKHRoaXMsMzIsITEpJiZRKHRoaXMsMzIsITEpfTsKTi5wcm90b3R5cGUuZmE9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJjEzPT1hLmMmJnVkKHRoaXMsYSk/KGEuZygpLGEuaigpLCEwKTohMX07aWYoIWlhKE4pKXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBjbGFzcyAiK04pO2lmKCFpYShNKSl0aHJvdyBFcnJvcigiSW52YWxpZCByZW5kZXJlciBjbGFzcyAiK00pO3ZhciB2ZD1OW2phXXx8KE5bamFdPSsra2EpO1djW3ZkXT1NO1ZjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIHBkPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9ITE7dGhpcy5jPW5ldyBvYyh0aGlzKTt6Yih0aGlzLGxhKEFiLHRoaXMuYykpO2E9TmModGhpcy5iKTtIKEgoSCh0aGlzLmMsYSxGLkwsdGhpcy5oKSxhLEYuTSx0aGlzLmopLGEsImNsaWNrIix0aGlzLmcpfTtuKHBkLEMpO3ZhciB3ZD0hdnx8OTw9TnVtYmVyKGliKTsKcGQucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXt0aGlzLmE9ITF9O3BkLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7dGhpcy5hPSEwfTt2YXIgeGQ9ZnVuY3Rpb24oYSxiKXtpZighd2QpcmV0dXJuIGEuYnV0dG9uPTAsYS50eXBlPWIsYTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudHMiKTtjLmluaXRNb3VzZUV2ZW50KGIsYS5idWJibGVzLGEuY2FuY2VsYWJsZSxhLnZpZXd8fG51bGwsYS5kZXRhaWwsYS5zY3JlZW5YLGEuc2NyZWVuWSxhLmNsaWVudFgsYS5jbGllbnRZLGEuY3RybEtleSxhLmFsdEtleSxhLnNoaWZ0S2V5LGEubWV0YUtleSwwLGEucmVsYXRlZFRhcmdldHx8bnVsbCk7cmV0dXJuIGN9OwpwZC5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXtpZih0aGlzLmEpdGhpcy5hPSExO2Vsc2V7dmFyIGI9YS5iLGM9Yi5idXR0b24sZD1iLnR5cGUsZT14ZChiLCJtb3VzZWRvd24iKTt0aGlzLmIua2EobmV3IEcoZSxhLmEpKTtlPXhkKGIsIm1vdXNldXAiKTt0aGlzLmIubGEobmV3IEcoZSxhLmEpKTt3ZHx8KGIuYnV0dG9uPWMsYi50eXBlPWQpfX07cGQucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt0aGlzLmI9bnVsbDtwZC5pLnUuY2FsbCh0aGlzKX07dmFyIFM9ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO3RoaXMuZGE9Ynx8WGMuUigpO3RoaXMuSD1hfHwidmVydGljYWwifTtuKFMsSyk7aD1TLnByb3RvdHlwZTtoLkRhPW51bGw7aC5jYT1udWxsO2guZGE9bnVsbDtoLkg9bnVsbDtoLlQ9ITA7aC5PPSEwO2gubD0tMTtoLnM9bnVsbDtoLlY9ITE7aC5JPW51bGw7dmFyIHlkPWZ1bmN0aW9uKGEpe3JldHVybiBhLkRhfHxhLmYoKX07aD1TLnByb3RvdHlwZTtoLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPXRoaXMuai5iKCJESVYiLHRoaXMuZGEuYyh0aGlzKS5qb2luKCIgIikpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKGEpe3JldHVybiJESVYiPT1hLnRhZ05hbWV9O2gudmE9ZnVuY3Rpb24oYSl7dGhpcy5hPSRjKHRoaXMuZGEsdGhpcyxhKTsibm9uZSI9PWEuc3R5bGUuZGlzcGxheSYmKHRoaXMuVD0hMSl9OwpoLkQ9ZnVuY3Rpb24oKXtTLmkuRC5jYWxsKHRoaXMpO1FjKHRoaXMsZnVuY3Rpb24oYil7Yi5tJiZ6ZCh0aGlzLGIpfSx0aGlzKTt2YXIgYT10aGlzLmYoKTtiZCh0aGlzLmRhLHRoaXMpO0FkKHRoaXMsdGhpcy5UKTtIKEgoSChIKEgoSChIKEgoT2ModGhpcyksdGhpcywiZW50ZXIiLHRoaXMuV2EpLHRoaXMsImhpZ2hsaWdodCIsdGhpcy5YYSksdGhpcywidW5oaWdobGlnaHQiLHRoaXMuY2IpLHRoaXMsIm9wZW4iLHRoaXMuWWEpLHRoaXMsImNsb3NlIix0aGlzLlVhKSxhLEYuTCx0aGlzLlNhKSxxYihhKSxbRi5NLEYuYWFdLHRoaXMuVmEpLGEsW0YuTCxGLk0sRi5hYSwibW91c2VvdmVyIiwibW91c2VvdXQiLCJjb250ZXh0bWVudSJdLHRoaXMuVGEpO0JkKHRoaXMpfTt2YXIgQmQ9ZnVuY3Rpb24oYSl7dmFyIGI9T2MoYSksYz15ZChhKTtIKEgoSChiLGMsImZvY3VzIixhLkhhKSxjLCJibHVyIixhLlFhKSxhLmNhfHwoYS5jYT1uZXcgSih5ZChhKSkpLCJrZXkiLGEuUmEpfTtoPVMucHJvdG90eXBlOwpoLlA9ZnVuY3Rpb24oKXtDZCh0aGlzLC0xKTt0aGlzLnMmJnNkKHRoaXMucywhMSk7dGhpcy5WPSExO1MuaS5QLmNhbGwodGhpcyl9O2gudT1mdW5jdGlvbigpe1MuaS51LmNhbGwodGhpcyk7dGhpcy5jYSYmKHRoaXMuY2EuTigpLHRoaXMuY2E9bnVsbCk7dGhpcy5kYT10aGlzLnM9dGhpcy5JPXRoaXMuRGE9bnVsbH07aC5XYT1mdW5jdGlvbigpe3JldHVybiEwfTsKaC5YYT1mdW5jdGlvbihhKXt2YXIgYj1UYyh0aGlzLGEudGFyZ2V0KTtpZigtMTxiJiZiIT10aGlzLmwpe3ZhciBjPUwodGhpcyx0aGlzLmwpO2MmJlAoYywhMSk7dGhpcy5sPWI7Yz1MKHRoaXMsdGhpcy5sKTt0aGlzLlYmJnFkKGMsITApO3RoaXMucyYmYyE9dGhpcy5zJiYoYy52JjY0P3NkKGMsITApOnNkKHRoaXMucywhMSkpfWI9dGhpcy5mKCk7cShiLCJUaGUgRE9NIGVsZW1lbnQgZm9yIHRoZSBjb250YWluZXIgY2Fubm90IGJlIG51bGwuIik7bnVsbCE9YS50YXJnZXQuZigpJiZ4YihiLCJhY3RpdmVkZXNjZW5kYW50IixhLnRhcmdldC5mKCkuaWQpfTtoLmNiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT1MKHRoaXMsdGhpcy5sKSYmKHRoaXMubD0tMSk7YT10aGlzLmYoKTtxKGEsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnJlbW92ZUF0dHJpYnV0ZSh3YigiYWN0aXZlZGVzY2VuZGFudCIpKX07CmguWWE9ZnVuY3Rpb24oYSl7KGE9YS50YXJnZXQpJiZhIT10aGlzLnMmJmEuYj09dGhpcyYmKHRoaXMucyYmc2QodGhpcy5zLCExKSx0aGlzLnM9YSl9O2guVWE9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMucyYmKHRoaXMucz1udWxsKTt2YXIgYj10aGlzLmYoKSxjPWEudGFyZ2V0LmYoKTtiJiZhLnRhcmdldC5vJjImJmMmJihhPSIiLGMmJihhPWMuaWQscShhLCJUaGUgYWN0aXZlIGVsZW1lbnQgc2hvdWxkIGhhdmUgYW4gaWQuIikpLHhiKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEpKX07aC5TYT1mdW5jdGlvbihhKXt0aGlzLk8mJih0aGlzLlY9ITApO3ZhciBiPXlkKHRoaXMpO2ImJnNiKGIpJiZ0YihiKT9iLmZvY3VzKCk6YS5nKCl9O2guVmE9ZnVuY3Rpb24oKXt0aGlzLlY9ITF9OwpoLlRhPWZ1bmN0aW9uKGEpe2E6e3ZhciBiPWEudGFyZ2V0O2lmKHRoaXMuSSlmb3IodmFyIGM9dGhpcy5mKCk7YiYmYiE9PWM7KXt2YXIgZD1iLmlkO2lmKGQgaW4gdGhpcy5JKXtiPXRoaXMuSVtkXTticmVhayBhfWI9Yi5wYXJlbnROb2RlfWI9bnVsbH1pZihiKXN3aXRjaChhLnR5cGUpe2Nhc2UgRi5MOmIua2EoYSk7YnJlYWs7Y2FzZSBGLk06Y2FzZSBGLmFhOmIubGEoYSk7YnJlYWs7Y2FzZSAibW91c2VvdmVyIjpiLkFhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3V0IjpiLnphKGEpO2JyZWFrO2Nhc2UgImNvbnRleHRtZW51IjpiLmVhKGEpfX07aC5IYT1mdW5jdGlvbigpe307aC5RYT1mdW5jdGlvbigpe0NkKHRoaXMsLTEpO3RoaXMuVj0hMTt0aGlzLnMmJnNkKHRoaXMucywhMSl9OwpoLlJhPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmlzRW5hYmxlZCgpJiZ0aGlzLmlzVmlzaWJsZSgpJiYoMCE9UmModGhpcyl8fHRoaXMuRGEpJiZEZCh0aGlzLGEpPyhhLmcoKSxhLmooKSwhMCk6ITF9Owp2YXIgRGQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1MKGEsYS5sKTtpZihjJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5mYSYmYy5mYShiKXx8YS5zJiZhLnMhPWMmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLnMuZmEmJmEucy5mYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuYyl7Y2FzZSAyNzp5ZChhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpFZChhKTticmVhaztjYXNlIDM1OkZkKGEpO2JyZWFrO2Nhc2UgMzg6aWYoInZlcnRpY2FsIj09YS5IKUdkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9IZChhKTpHZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoInZlcnRpY2FsIj09YS5IKUhkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9HZChhKTpIZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSx6ZD1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZigpO2M9Yy5pZHx8KGMuaWQ9TGMoYikpO2EuSXx8KGEuST17fSk7YS5JW2NdPWJ9O1MucHJvdG90eXBlLnNhPWZ1bmN0aW9uKGEsYil7Q2EoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtTLmkuc2EuY2FsbCh0aGlzLGEsYil9O1MucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEsYixjKXtDYShhLE4pO2EuS3w9MjthLkt8PTY0O3RkKGEsMzIsITEpO2EubSYmMCE9YS55YSYmb2QoYSwhMSk7YS55YT0hMTt2YXIgZD1hLmI9PXRoaXM/VGModGhpcyxhKTotMTtTLmkudGEuY2FsbCh0aGlzLGEsYixjKTthLm0mJnRoaXMubSYmemQodGhpcyxhKTthPWQ7LTE9PWEmJihhPVJjKHRoaXMpKTthPT10aGlzLmw/dGhpcy5sPU1hdGgubWluKFJjKHRoaXMpLTEsYik6YT50aGlzLmwmJmI8PXRoaXMubD90aGlzLmwrKzphPHRoaXMubCYmYj50aGlzLmwmJnRoaXMubC0tfTsKdmFyIGFkPWZ1bmN0aW9uKGEsYil7aWYoYS5mKCkpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5IPWJ9O1MucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O3ZhciBBZD1mdW5jdGlvbihhLGIpe2EuVD1iO3ZhciBjPWEuZigpO2MmJihjLnN0eWxlLmRpc3BsYXk9Yj8iIjoibm9uZSIsWWMoeWQoYSksYS5PJiZhLlQpKX07Uy5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT307Uy5wcm90b3R5cGUuWj1mdW5jdGlvbihhKXt0aGlzLk8hPWEmJnVjKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5PPSEwLFFjKHRoaXMsZnVuY3Rpb24oYil7Yi5MYT9kZWxldGUgYi5MYTpiLlooITApfSkpOihRYyh0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5aKCExKTpiLkxhPSEwfSksdGhpcy5WPXRoaXMuTz0hMSksWWMoeWQodGhpcyksYSYmdGhpcy5UKSl9Owp2YXIgQ2Q9ZnVuY3Rpb24oYSxiKXsoYj1MKGEsYikpP1AoYiwhMCk6LTE8YS5sJiZQKEwoYSxhLmwpLCExKX0sRWQ9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LFJjKGEpLTEpfSxGZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiAwPmI/Yy0xOmJ9LDApfSxIZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7cmV0dXJuKGIrMSklY30sYS5sKX0sR2Q9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe2ItLTtyZXR1cm4gMD5iP2MtMTpifSxhLmwpfSxJZD1mdW5jdGlvbihhLGIsYyl7Yz0wPmM/VGMoYSxhLnMpOmM7dmFyIGQ9UmMoYSk7Yz1iLmNhbGwoYSxjLGQpO2Zvcih2YXIgZT0wO2U8PWQ7KXt2YXIgZj1MKGEsYyksZztpZihnPWYpZz1mLmlzVmlzaWJsZSgpJiZmLmlzRW5hYmxlZCgpJiYhIShmLnYmMik7aWYoZyl7YS5FYShjKTticmVha31lKys7Yz1iLmNhbGwoYSxjLGQpfX07ClMucHJvdG90eXBlLkVhPWZ1bmN0aW9uKGEpe0NkKHRoaXMsYSl9O3ZhciBUPWZ1bmN0aW9uKCl7fTtuKFQsTSk7ZGEoVCk7VC5wcm90b3R5cGUuYT1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYiJ9O1QucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXtyZXR1cm4idGFiIn07VC5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYj1ULmkuYy5jYWxsKHRoaXMsYSk7KGE9YS5QYSkmJmImJihiLnRpdGxlPWF8fCIiKTtyZXR1cm4gYn07VC5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIpe2I9VC5pLmcuY2FsbCh0aGlzLGEsYik7dmFyIGM9Yi50aXRsZXx8IiI7YyYmKGEuUGE9Yyk7YS5vJjgmJihjPWEuYikmJmlhKGMuRykmJihRKGEsOCwhMSksYy5HKGEpKTtyZXR1cm4gYn07dmFyIEpkPWZ1bmN0aW9uKGEsYixjKXtOLmNhbGwodGhpcyxhLGJ8fFQuUigpLGMpO3RkKHRoaXMsOCwhMCk7dGhpcy5LfD05fTtuKEpkLE4pO1ZjKCJnb29nLXRhYiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEpkKG51bGwpfSk7dmFyIFU9ZnVuY3Rpb24oKXt0aGlzLmg9InRhYmxpc3QifTtuKFUsWGMpO2RhKFUpO1UucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWItYmFyIn07VS5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIsYyl7dGhpcy5qfHwodGhpcy5hfHxLZCh0aGlzKSx0aGlzLmo9c2EodGhpcy5hKSk7dmFyIGQ9dGhpcy5qW2JdO2Q/KGFkKGEsTGQoZCkpLGEuQj1kKTpVLmkuZy5jYWxsKHRoaXMsYSxiLGMpfTtVLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPVUuaS5jLmNhbGwodGhpcyxhKTt0aGlzLmF8fEtkKHRoaXMpO2IucHVzaCh0aGlzLmFbYS5CXSk7cmV0dXJuIGJ9O3ZhciBLZD1mdW5jdGlvbihhKXt2YXIgYj1hLmIoKTthLmE9e3RvcDpiKyItdG9wIixib3R0b206YisiLWJvdHRvbSIsc3RhcnQ6YisiLXN0YXJ0IixlbmQ6YisiLWVuZCJ9fTt2YXIgVj1mdW5jdGlvbihhLGIsYyl7YT1hfHwidG9wIjthZCh0aGlzLExkKGEpKTt0aGlzLkI9YTtTLmNhbGwodGhpcyx0aGlzLkgsYnx8VS5SKCksYyk7TWQodGhpcyl9O24oVixTKTtoPVYucHJvdG90eXBlO2guQz1udWxsO2guRD1mdW5jdGlvbigpe1YuaS5ELmNhbGwodGhpcyk7TWQodGhpcyl9O2gudT1mdW5jdGlvbigpe1YuaS51LmNhbGwodGhpcyk7dGhpcy5DPW51bGx9O2guRWE9ZnVuY3Rpb24oYSl7Vi5pLkVhLmNhbGwodGhpcyxhKTt0aGlzLkcoTCh0aGlzLGEpKX07aC5HPWZ1bmN0aW9uKGEpe2E/cmQoYSwhMCk6dGhpcy5DJiZyZCh0aGlzLkMsITEpfTsKdmFyIE5kPWZ1bmN0aW9uKGEsYil7aWYoYiYmYj09YS5DKXtmb3IodmFyIGM9VGMoYSxiKSxkPWMtMTtiPUwoYSxkKTtkLS0pe3ZhciBlPWI7aWYoZS5pc1Zpc2libGUoKSYmZS5pc0VuYWJsZWQoKSl7YS5HKGIpO3JldHVybn19Zm9yKGMrPTE7Yj1MKGEsYyk7YysrKWlmKGQ9YixkLmlzVmlzaWJsZSgpJiZkLmlzRW5hYmxlZCgpKXthLkcoYik7cmV0dXJufWEuRyhudWxsKX19O2g9Vi5wcm90b3R5cGU7aC5hYj1mdW5jdGlvbihhKXt0aGlzLkMmJnRoaXMuQyE9YS50YXJnZXQmJnJkKHRoaXMuQywhMSk7dGhpcy5DPWEudGFyZ2V0fTtoLmJiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT10aGlzLkMmJih0aGlzLkM9bnVsbCl9O2guWmE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guJGE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guSGE9ZnVuY3Rpb24oKXtMKHRoaXMsdGhpcy5sKXx8Q2QodGhpcyxUYyh0aGlzLHRoaXMuQ3x8TCh0aGlzLDApKSl9Owp2YXIgTWQ9ZnVuY3Rpb24oYSl7SChIKEgoSChPYyhhKSxhLCJzZWxlY3QiLGEuYWIpLGEsInVuc2VsZWN0IixhLmJiKSxhLCJkaXNhYmxlIixhLlphKSxhLCJoaWRlIixhLiRhKX0sTGQ9ZnVuY3Rpb24oYSl7cmV0dXJuInN0YXJ0Ij09YXx8ImVuZCI9PWE/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O1ZjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBWfSk7ZnVuY3Rpb24gT2QoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIFBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgZz1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIrZyk7Zm9yKHZhciBrPVtdLHA9YmEoYyksdz1wLm5leHQoKTshdy5kb25lO3c9cC5uZXh0KCkpe3c9dy52YWx1ZTt2YXIgQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKQi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO0IudGV4dENvbnRlbnQ9dztmLmFwcGVuZENoaWxkKEIpO2sucHVzaChCKX0iYm90dG9tIiE9ZyYmZS5hcHBlbmRDaGlsZChmKTtwPW51bGw7aWYoInRvcCI9PWd8fCJib3R0b20iPT1nKXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTsidG9wIj09ZyYmcCYmZS5hcHBlbmRDaGlsZChwKTtCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0IuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciByYT1bXTtjPWJhKGMpO2Zvcih3PWMubmV4dCgpOyF3LmRvbmU7dz1jLm5leHQoKSl3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHcuaWQ9ZS5pZCsiX2NvbnRlbnRfIityYS5sZW5ndGgsdy5zdHlsZS5kaXNwbGF5PSJub25lIixCLmFwcGVuZENoaWxkKHcpLHJhLnB1c2godyk7ZS5hcHBlbmRDaGlsZChCKTsiYm90dG9tIj09ZyYmKHAmJgplLmFwcGVuZENoaWxkKHApLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBYPW5ldyBWKGcpO1BjKFgsZik7dmFyIFk9LTE7ZGMoWCwic2VsZWN0IixmdW5jdGlvbihaKXtaPWsuaW5kZXhPZihaLnRhcmdldC5mKCkpO1ohPVkmJigwPD1ZJiZZPHJhLmxlbmd0aCYmKHJhW1ldLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFk9LTEpLDA8PVomJlo8cmEubGVuZ3RoJiYoWT1aLHJhW1ldLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksWC5HKEwoWCxZKSkpfSk7WC5HKEwoWCxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFope1guRyhMKFgsWikpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChPZChhKSl9LFFkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sVz1sOwpRZFswXWluIFd8fCJ1bmRlZmluZWQiPT10eXBlb2YgVy5leGVjU2NyaXB0fHxXLmV4ZWNTY3JpcHQoInZhciAiK1FkWzBdKTtmb3IodmFyIFJkO1FkLmxlbmd0aCYmKFJkPVFkLnNoaWZ0KCkpOylRZC5sZW5ndGh8fHZvaWQgMD09PVBkP1dbUmRdJiZXW1JkXSE9PU9iamVjdC5wcm90b3R5cGVbUmRdP1c9V1tSZF06Vz1XW1JkXT17fTpXW1JkXT1QZDt9KS5jYWxsKHRoaXMpOwovLyBjbGFuZy1mb3JtYXQgb24K", + "headers": [ + [ + "content-type", + "application/javascript" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + } + } + }, + "executionInfo": { + "elapsed": 3969, + "status": "ok", + "timestamp": 1600709611604, + "user": { + "displayName": "Evgeny Skvortsov", + "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhiQjODaOVLfYnUuWS9rB3LRntzJDM0hqElzsUkdQ=s64", + "userId": "11510585406840398626" + }, + "user_tz": 420 + }, + "id": "2FbNzkaLWNEv", + "outputId": "0d05ef6f-2d56-419d-f51c-bbcc1617dfa6" + }, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id5" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id5" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id5" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"90515ef6-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id5\", \"tabNames\": [\"Test\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_e4b635f621" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id5" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9051a9c4-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id5\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_1f30d8d521" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id5" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9052e546-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_ca45682fb9" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_1", + "outputarea_id5" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"905333c0-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id5_content_1\");\n", + "//# sourceURL=js_43a1e09414" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_1", + "outputarea_id5" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9053876c-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"905333c0-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_e4d01885b4" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_1", + "outputarea_id5" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9053cb78-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id5\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_fbd88f07ea" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_1", + "outputarea_id5" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running Test\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"905596d8-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9052e546-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_b5646b4861" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_1", + "outputarea_id5" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"90570446-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_56298367b4" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_0", + "outputarea_id5" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"905752de-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id5_content_0\");\n", + "//# sourceURL=js_edf0b3a94d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_0", + "outputarea_id5" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9057a5fe-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"905752de-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_4e03987998" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_0", + "outputarea_id5" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9057e7ee-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id5\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_196eaa98ef" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_0", + "outputarea_id5" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_0", + "outputarea_id5", + "outputarea_id6", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_0", + "outputarea_id5", + "outputarea_id6", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_0", + "outputarea_id5", + "outputarea_id6", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"90598d56-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id6\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_dfcb13ee78" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_0", + "outputarea_id5", + "outputarea_id6", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9059c5aa-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id6\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_b79edd1b0e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_0", + "outputarea_id5", + "outputarea_id6", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"905aff10-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_944b3b0e4e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_0", + "id6_content_0", + "outputarea_id5", + "outputarea_id6", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"905b4196-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id6_content_0\");\n", + "//# sourceURL=js_5fb0749341" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_0", + "id6_content_0", + "outputarea_id5", + "outputarea_id6", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"905b8df4-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"905b4196-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_162c299360" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_0", + "id6_content_0", + "outputarea_id5", + "outputarea_id6", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"905bd4d0-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id6\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_2a8f5aa07d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_0", + "id6_content_0", + "outputarea_id5", + "outputarea_id6", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mTest_sql\u001b[0m variable.\n", + "SELECT * FROM (\n", + " \n", + " SELECT\n", + " 1 AS a,\n", + " 2 AS b,\n", + " \"universe\" AS c\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " ((1) + (2)) AS a,\n", + " ((2) * (((2) + (1)))) AS b,\n", + " CONCAT(CONCAT(\"hello\", \" \"), \"world\") AS c\n", + " \n", + ") ;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"905d9572-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"905aff10-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_36f278da5b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_0", + "id6_content_0", + "outputarea_id5", + "outputarea_id6", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"905ecd16-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"90570446-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_3bba713d97" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_0", + "outputarea_id5" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9060498e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_d2408b323f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_1", + "outputarea_id5" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"90609bbe-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id5_content_1\");\n", + "//# sourceURL=js_0b56981f51" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_1", + "outputarea_id5" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9060dea8-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"90609bbe-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_a07494b2be" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_1", + "outputarea_id5" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"90612ad4-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id5\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_dc69db7f8c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_1", + "outputarea_id5" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"90f3db54-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9060498e-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_094d3dc99c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_1", + "outputarea_id5" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"90f7bc38-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_1b2db13f36" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_0", + "outputarea_id5" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"90f84cde-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id5_content_0\");\n", + "//# sourceURL=js_f859b7888d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_0", + "outputarea_id5" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"90f8e87e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"90f84cde-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_6a6697ad13" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_0", + "outputarea_id5" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"90f973a2-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id5\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_56cf04eb7e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_0", + "outputarea_id5" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"90fb3138-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_964e0495f5" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_0", + "id6_content_1", + "outputarea_id5", + "outputarea_id6", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"90fbf898-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id6_content_1\");\n", + "//# sourceURL=js_1b39356863" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_0", + "id6_content_1", + "outputarea_id5", + "outputarea_id6", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"90fc9686-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"90fbf898-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_fe3191b683" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_0", + "id6_content_1", + "outputarea_id5", + "outputarea_id6", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"90fcd916-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id6\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_2d23c14d3f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_0", + "id6_content_1", + "outputarea_id5", + "outputarea_id6", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mTest\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
abc
012universe
136hello world
\n", + "
" + ], + "text/plain": [ + " a b c\n", + "0 1 2 universe\n", + "1 3 6 hello world" + ] + }, + "metadata": { + "tags": [ + "id5_content_0", + "id6_content_1", + "outputarea_id5", + "outputarea_id6", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"910003f2-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"90fb3138-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_be060fcc23" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_0", + "id6_content_1", + "outputarea_id5", + "outputarea_id6", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"910141fe-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"90f7bc38-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_9f6ce42958" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id5_content_0", + "outputarea_id5" + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "%%logica Test\n", + "\n", + "Test(a: 1, b: 2, c: \"universe\");\n", + "Test(a: 1 + 2, b: 2 * (2 + 1), c: \"hello\" ++ \" \" ++ \"world\");\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "c8RlzYjqm7i0" + }, + "source": [ + "### Structures\n", + "\n", + "You can define structures via syntax that is similar to json and textproto." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 208, + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH0=", + "headers": [ + [ + "content-type", + "text/css" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgaCxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9ZnVuY3Rpb24oYSl7dmFyIGI9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmYVtTeW1ib2wuaXRlcmF0b3JdO3JldHVybiBiP2IuY2FsbChhKTp7bmV4dDphYShhKX19LGw9dGhpc3x8c2VsZixjYT1mdW5jdGlvbigpe30sZGE9ZnVuY3Rpb24oYSl7YS5CYT12b2lkIDA7YS5SPWZ1bmN0aW9uKCl7cmV0dXJuIGEuQmE/YS5CYTphLkJhPW5ldyBhfX0sZWE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7aWYoIm9iamVjdCI9PWIpaWYoYSl7aWYoYSBpbnN0YW5jZW9mIEFycmF5KXJldHVybiJhcnJheSI7aWYoYSBpbnN0YW5jZW9mIE9iamVjdClyZXR1cm4gYjt2YXIgYz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk7aWYoIltvYmplY3QgV2luZG93XSI9PWMpcmV0dXJuIm9iamVjdCI7CmlmKCJbb2JqZWN0IEFycmF5XSI9PWN8fCJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGgmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5zcGxpY2UmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoInNwbGljZSIpKXJldHVybiJhcnJheSI7aWYoIltvYmplY3QgRnVuY3Rpb25dIj09Y3x8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmNhbGwmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoImNhbGwiKSlyZXR1cm4iZnVuY3Rpb24ifWVsc2UgcmV0dXJuIm51bGwiO2Vsc2UgaWYoImZ1bmN0aW9uIj09YiYmInVuZGVmaW5lZCI9PXR5cGVvZiBhLmNhbGwpcmV0dXJuIm9iamVjdCI7cmV0dXJuIGJ9LGZhPWZ1bmN0aW9uKGEpe3JldHVybiJhcnJheSI9PWVhKGEpfSxoYT1mdW5jdGlvbihhKXt2YXIgYj1lYShhKTtyZXR1cm4iYXJyYXkiPT1ifHwib2JqZWN0Ij09CmImJiJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGh9LGlhPWZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PWVhKGEpfSxtPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBhO3JldHVybiJvYmplY3QiPT1iJiZudWxsIT1hfHwiZnVuY3Rpb24iPT1ifSxqYT0iY2xvc3VyZV91aWRfIisoMUU5Kk1hdGgucmFuZG9tKCk+Pj4wKSxrYT0wLGxhPWZ1bmN0aW9uKGEsYil7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe3ZhciBkPWMuc2xpY2UoKTtkLnB1c2guYXBwbHkoZCxhcmd1bWVudHMpO3JldHVybiBhLmFwcGx5KHRoaXMsZCl9fSxuPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe31jLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLmk9Yi5wcm90b3R5cGU7YS5wcm90b3R5cGU9bmV3IGM7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YX07dmFyIG1hLG5hPXtlYjoiYWN0aXZlZGVzY2VuZGFudCIsamI6ImF0b21pYyIsa2I6ImF1dG9jb21wbGV0ZSIsbWI6ImJ1c3kiLHBiOiJjaGVja2VkIixxYjoiY29saW5kZXgiLHZiOiJjb250cm9scyIseGI6ImRlc2NyaWJlZGJ5IixBYjoiZGlzYWJsZWQiLENiOiJkcm9wZWZmZWN0IixEYjoiZXhwYW5kZWQiLEViOiJmbG93dG8iLEdiOiJncmFiYmVkIixLYjoiaGFzcG9wdXAiLE1iOiJoaWRkZW4iLE9iOiJpbnZhbGlkIixQYjoibGFiZWwiLFFiOiJsYWJlbGxlZGJ5IixSYjoibGV2ZWwiLFdiOiJsaXZlIixrYzoibXVsdGlsaW5lIixsYzoibXVsdGlzZWxlY3RhYmxlIixwYzoib3JpZW50YXRpb24iLHFjOiJvd25zIixyYzoicG9zaW5zZXQiLHRjOiJwcmVzc2VkIix4YzoicmVhZG9ubHkiLHpjOiJyZWxldmFudCIsQWM6InJlcXVpcmVkIixFYzoicm93aW5kZXgiLEhjOiJzZWxlY3RlZCIsSmM6InNldHNpemUiLExjOiJzb3J0IixaYzoidmFsdWVtYXgiLCRjOiJ2YWx1ZW1pbiIsYWQ6InZhbHVlbm93IiwKYmQ6InZhbHVldGV4dCJ9O3ZhciBvYT1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkIGluIGEpYi5jYWxsKGMsYVtkXSxkLGEpfSxwYT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyBpbiBhKWlmKGFbY109PWIpcmV0dXJuITA7cmV0dXJuITF9LHFhPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsIT09YSYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfSxzYT1mdW5jdGlvbihhKXt2YXIgYj17fSxjO2ZvcihjIGluIGEpYlthW2NdXT1jO3JldHVybiBifSx0YT0iY29uc3RydWN0b3IgaGFzT3duUHJvcGVydHkgaXNQcm90b3R5cGVPZiBwcm9wZXJ0eUlzRW51bWVyYWJsZSB0b0xvY2FsZVN0cmluZyB0b1N0cmluZyB2YWx1ZU9mIi5zcGxpdCgiICIpLHVhPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8dGEubGVuZ3RoO2YrKyljPQp0YVtmXSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZCxjKSYmKGFbY109ZFtjXSl9fTt2YXIgdmE9e2ZiOiJhbGVydCIsZ2I6ImFsZXJ0ZGlhbG9nIixoYjoiYXBwbGljYXRpb24iLGliOiJhcnRpY2xlIixsYjoiYmFubmVyIixuYjoiYnV0dG9uIixvYjoiY2hlY2tib3giLHJiOiJjb2x1bW5oZWFkZXIiLHNiOiJjb21ib2JveCIsdGI6ImNvbXBsZW1lbnRhcnkiLHViOiJjb250ZW50aW5mbyIsd2I6ImRlZmluaXRpb24iLHliOiJkaWFsb2ciLHpiOiJkaXJlY3RvcnkiLEJiOiJkb2N1bWVudCIsRmI6ImZvcm0iLEhiOiJncmlkIixJYjoiZ3JpZGNlbGwiLEpiOiJncm91cCIsTGI6ImhlYWRpbmciLE5iOiJpbWciLFNiOiJsaW5rIixUYjoibGlzdCIsVWI6Imxpc3Rib3giLFZiOiJsaXN0aXRlbSIsWGI6ImxvZyIsWWI6Im1haW4iLFpiOiJtYXJxdWVlIiwkYjoibWF0aCIsYWM6Im1lbnUiLGJjOiJtZW51YmFyIixjYzoibWVudWl0ZW0iLGRjOiJtZW51aXRlbWNoZWNrYm94IixlYzoibWVudWl0ZW1yYWRpbyIsbWM6Im5hdmlnYXRpb24iLG5jOiJub3RlIixvYzoib3B0aW9uIiwKc2M6InByZXNlbnRhdGlvbiIsdWM6InByb2dyZXNzYmFyIix2YzoicmFkaW8iLHdjOiJyYWRpb2dyb3VwIix5YzoicmVnaW9uIixCYzoicm93IixDYzoicm93Z3JvdXAiLERjOiJyb3doZWFkZXIiLEZjOiJzY3JvbGxiYXIiLEdjOiJzZWFyY2giLEljOiJzZXBhcmF0b3IiLEtjOiJzbGlkZXIiLE1jOiJzcGluYnV0dG9uIixOYzoic3RhdHVzIixPYzoidGFiIixQYzoidGFibGlzdCIsUWM6InRhYnBhbmVsIixSYzoidGV4dGJveCIsU2M6InRleHRpbmZvIixUYzoidGltZXIiLFVjOiJ0b29sYmFyIixWYzoidG9vbHRpcCIsV2M6InRyZWUiLFhjOiJ0cmVlZ3JpZCIsWWM6InRyZWVpdGVtIn07dmFyIHdhPWZ1bmN0aW9uKGEpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsd2EpO2Vsc2V7dmFyIGI9RXJyb3IoKS5zdGFjaztiJiYodGhpcy5zdGFjaz1iKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSl9O24od2EsRXJyb3IpO3dhLnByb3RvdHlwZS5uYW1lPSJDdXN0b21FcnJvciI7dmFyIHhhO3ZhciB5YT1mdW5jdGlvbihhLGIpe2E9YS5zcGxpdCgiJXMiKTtmb3IodmFyIGM9IiIsZD1hLmxlbmd0aC0xLGU9MDtlPGQ7ZSsrKWMrPWFbZV0rKGU8Yi5sZW5ndGg/YltlXToiJXMiKTt3YS5jYWxsKHRoaXMsYythW2RdKX07bih5YSx3YSk7eWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjsKdmFyIHphPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSJBc3NlcnRpb24gZmFpbGVkIjtpZihjKXtlKz0iOiAiK2M7dmFyIGY9ZH1lbHNlIGEmJihlKz0iOiAiK2EsZj1iKTt0aHJvdyBuZXcgeWEoIiIrZSxmfHxbXSk7fSxxPWZ1bmN0aW9uKGEsYixjKXthfHx6YSgiIixudWxsLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX0sQWE9ZnVuY3Rpb24oYSxiLGMpe20oYSkmJjE9PWEubm9kZVR5cGV8fHphKCJFeHBlY3RlZCBFbGVtZW50IGJ1dCBnb3QgJXM6ICVzLiIsW2VhKGEpLGFdLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKX0sQ2E9ZnVuY3Rpb24oYSxiLGMsZCl7YSBpbnN0YW5jZW9mIGJ8fHphKCJFeHBlY3RlZCBpbnN0YW5jZW9mICVzIGJ1dCBnb3QgJXMuIixbQmEoYiksQmEoYSldLGMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpKX0sQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZgpGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTpudWxsPT09YT8ibnVsbCI6dHlwZW9mIGF9O3ZhciBEYT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3EobnVsbCE9YS5sZW5ndGgpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKCJzdHJpbmciPT09dHlwZW9mIGEpcmV0dXJuInN0cmluZyIhPT10eXBlb2YgYnx8MSE9Yi5sZW5ndGg/LTE6YS5pbmRleE9mKGIsMCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspaWYoYyBpbiBhJiZhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX0scj1BcnJheS5wcm90b3R5cGUuZm9yRWFjaD9mdW5jdGlvbihhLGIsYyl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsYyl9OmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9YS5sZW5ndGgsZT0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZj0wO2Y8ZDtmKyspZiBpbiBlJiZiLmNhbGwoYyxlW2ZdLGYsYSl9LEVhPUFycmF5LnByb3RvdHlwZS5maWx0ZXI/CmZ1bmN0aW9uKGEsYil7cShudWxsIT1hLmxlbmd0aCk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD1bXSxlPTAsZj0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZz0wO2c8YztnKyspaWYoZyBpbiBmKXt2YXIgaz1mW2ddO2IuY2FsbCh2b2lkIDAsayxnLGEpJiYoZFtlKytdPWspfXJldHVybiBkfSxGYT1BcnJheS5wcm90b3R5cGUuZXZlcnk/ZnVuY3Rpb24oYSxiKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmV2ZXJ5LmNhbGwoYSxiLHZvaWQgMCl9OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWEubGVuZ3RoLGQ9InN0cmluZyI9PT10eXBlb2YgYT9hLnNwbGl0KCIiKTphLGU9MDtlPGM7ZSsrKWlmKGUgaW4gZCYmIWIuY2FsbCh2b2lkIDAsZFtlXSxlLGEpKXJldHVybiExO3JldHVybiEwfSxHYT1mdW5jdGlvbihhLGIpe3JldHVybiAwPD0KRGEoYSxiKX0sSGE9ZnVuY3Rpb24oYSxiKXtiPURhKGEsYik7dmFyIGM7aWYoYz0wPD1iKXEobnVsbCE9YS5sZW5ndGgpLEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhLGIsMSk7cmV0dXJuIGN9LElhPWZ1bmN0aW9uKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGFyZ3VtZW50cyl9LEphPWZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDA8Yil7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX0sTGE9ZnVuY3Rpb24oYSxiLGMsZCl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShhLEthKGFyZ3VtZW50cywxKSl9LEthPWZ1bmN0aW9uKGEsYixjKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gMj49YXJndW1lbnRzLmxlbmd0aD9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsYixjKX07dmFyIE1hPVN0cmluZy5wcm90b3R5cGUudHJpbT9mdW5jdGlvbihhKXtyZXR1cm4gYS50cmltKCl9OmZ1bmN0aW9uKGEpe3JldHVybi9eW1xzXHhhMF0qKFtcc1xTXSo/KVtcc1x4YTBdKiQvLmV4ZWMoYSlbMV19LE5hPS8mL2csT2E9LzwvZyxQYT0vPi9nLFFhPS8iL2csUmE9LycvZyxTYT0vXHgwMC9nLFRhPS9bXHgwMCY8PiInXS8sdD1mdW5jdGlvbihhLGIpe3JldHVybi0xIT1hLmluZGV4T2YoYil9LFVhPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE8Yj8tMTphPmI/MTowfTt2YXIgdTthOnt2YXIgVmE9bC5uYXZpZ2F0b3I7aWYoVmEpe3ZhciBXYT1WYS51c2VyQWdlbnQ7aWYoV2Epe3U9V2E7YnJlYWsgYX19dT0iIn07LyoKCiBDb3B5cmlnaHQgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzLgogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKKi8KdmFyIFhhPWZ1bmN0aW9uKGEpe1RhLnRlc3QoYSkmJigtMSE9YS5pbmRleE9mKCImIikmJihhPWEucmVwbGFjZShOYSwiJmFtcDsiKSksLTEhPWEuaW5kZXhPZigiPCIpJiYoYT1hLnJlcGxhY2UoT2EsIiZsdDsiKSksLTEhPWEuaW5kZXhPZigiPiIpJiYoYT1hLnJlcGxhY2UoUGEsIiZndDsiKSksLTEhPWEuaW5kZXhPZignIicpJiYoYT1hLnJlcGxhY2UoUWEsIiZxdW90OyIpKSwtMSE9YS5pbmRleE9mKCInIikmJihhPWEucmVwbGFjZShSYSwiJiMzOTsiKSksLTEhPWEuaW5kZXhPZigiXHgwMCIpJiYoYT1hLnJlcGxhY2UoU2EsIiYjMDsiKSkpO3JldHVybiBhfTt2YXIgWWE9ZnVuY3Rpb24oYSl7WWFbIiAiXShhKTtyZXR1cm4gYX07WWFbIiAiXT1jYTt2YXIgJGE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1aYTtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsYSk/Y1thXTpjW2FdPWIoYSl9O3ZhciBhYj10KHUsIk9wZXJhIiksdj10KHUsIlRyaWRlbnQiKXx8dCh1LCJNU0lFIiksYmI9dCh1LCJFZGdlIikseD10KHUsIkdlY2tvIikmJiEodCh1LnRvTG93ZXJDYXNlKCksIndlYmtpdCIpJiYhdCh1LCJFZGdlIikpJiYhKHQodSwiVHJpZGVudCIpfHx0KHUsIk1TSUUiKSkmJiF0KHUsIkVkZ2UiKSx5PXQodS50b0xvd2VyQ2FzZSgpLCJ3ZWJraXQiKSYmIXQodSwiRWRnZSIpLHo9dCh1LCJNYWNpbnRvc2giKSxjYj1mdW5jdGlvbigpe3ZhciBhPWwuZG9jdW1lbnQ7cmV0dXJuIGE/YS5kb2N1bWVudE1vZGU6dm9pZCAwfSxkYjsKYTp7dmFyIGViPSIiLGZiPWZ1bmN0aW9uKCl7dmFyIGE9dTtpZih4KXJldHVybi9ydjooW15cKTtdKykoXCl8OykvLmV4ZWMoYSk7aWYoYmIpcmV0dXJuL0VkZ2VcLyhbXGRcLl0rKS8uZXhlYyhhKTtpZih2KXJldHVybi9cYig/Ok1TSUV8cnYpWzogXShbXlwpO10rKShcKXw7KS8uZXhlYyhhKTtpZih5KXJldHVybi9XZWJLaXRcLyhcUyspLy5leGVjKGEpO2lmKGFiKXJldHVybi8oPzpWZXJzaW9uKVsgXC9dPyhcUyspLy5leGVjKGEpfSgpO2ZiJiYoZWI9ZmI/ZmJbMV06IiIpO2lmKHYpe3ZhciBnYj1jYigpO2lmKG51bGwhPWdiJiZnYj5wYXJzZUZsb2F0KGViKSl7ZGI9U3RyaW5nKGdiKTticmVhayBhfX1kYj1lYn0KdmFyIGhiPWRiLFphPXt9LEE9ZnVuY3Rpb24oYSl7cmV0dXJuICRhKGEsZnVuY3Rpb24oKXtmb3IodmFyIGI9MCxjPU1hKFN0cmluZyhoYikpLnNwbGl0KCIuIiksZD1NYShTdHJpbmcoYSkpLnNwbGl0KCIuIiksZT1NYXRoLm1heChjLmxlbmd0aCxkLmxlbmd0aCksZj0wOzA9PWImJmY8ZTtmKyspe3ZhciBnPWNbZl18fCIiLGs9ZFtmXXx8IiI7ZG97Zz0vKFxkKikoXEQqKSguKikvLmV4ZWMoZyl8fFsiIiwiIiwiIiwiIl07az0vKFxkKikoXEQqKSguKikvLmV4ZWMoayl8fFsiIiwiIiwiIiwiIl07aWYoMD09Z1swXS5sZW5ndGgmJjA9PWtbMF0ubGVuZ3RoKWJyZWFrO2I9VWEoMD09Z1sxXS5sZW5ndGg/MDpwYXJzZUludChnWzFdLDEwKSwwPT1rWzFdLmxlbmd0aD8wOnBhcnNlSW50KGtbMV0sMTApKXx8VWEoMD09Z1syXS5sZW5ndGgsMD09a1syXS5sZW5ndGgpfHxVYShnWzJdLGtbMl0pO2c9Z1szXTtrPWtbM119d2hpbGUoMD09Yil9cmV0dXJuIDA8PWJ9KX0saWI7CmliPWwuZG9jdW1lbnQmJnY/Y2IoKTp2b2lkIDA7dmFyIGpiPSF2fHw5PD1OdW1iZXIoaWIpO3ZhciBsYj1mdW5jdGlvbihhLGIpe29hKGIsZnVuY3Rpb24oYyxkKXtjJiYib2JqZWN0Ij09dHlwZW9mIGMmJmMuZGQmJihjPWMuY2QoKSk7InN0eWxlIj09ZD9hLnN0eWxlLmNzc1RleHQ9YzoiY2xhc3MiPT1kP2EuY2xhc3NOYW1lPWM6ImZvciI9PWQ/YS5odG1sRm9yPWM6a2IuaGFzT3duUHJvcGVydHkoZCk/YS5zZXRBdHRyaWJ1dGUoa2JbZF0sYyk6MD09ZC5sYXN0SW5kZXhPZigiYXJpYS0iLDApfHwwPT1kLmxhc3RJbmRleE9mKCJkYXRhLSIsMCk/YS5zZXRBdHRyaWJ1dGUoZCxjKTphW2RdPWN9KX0sa2I9e2NlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjb2xzcGFuOiJjb2xTcGFuIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGhlaWdodDoiaGVpZ2h0IixtYXhsZW5ndGg6Im1heExlbmd0aCIsbm9uY2U6Im5vbmNlIixyb2xlOiJyb2xlIixyb3dzcGFuOiJyb3dTcGFuIix0eXBlOiJ0eXBlIix1c2VtYXA6InVzZU1hcCIsdmFsaWduOiJ2QWxpZ24iLAp3aWR0aDoid2lkdGgifSxtYj1mdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChrKXtrJiZiLmFwcGVuZENoaWxkKCJzdHJpbmciPT09dHlwZW9mIGs/YS5jcmVhdGVUZXh0Tm9kZShrKTprKX1mb3IodmFyIGU9MjtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXTtpZighaGEoZil8fG0oZikmJjA8Zi5ub2RlVHlwZSlkKGYpO2Vsc2V7YTp7aWYoZiYmIm51bWJlciI9PXR5cGVvZiBmLmxlbmd0aCl7aWYobShmKSl7dmFyIGc9ImZ1bmN0aW9uIj09dHlwZW9mIGYuaXRlbXx8InN0cmluZyI9PXR5cGVvZiBmLml0ZW07YnJlYWsgYX1pZihpYShmKSl7Zz0iZnVuY3Rpb24iPT10eXBlb2YgZi5pdGVtO2JyZWFrIGF9fWc9ITF9cihnP0phKGYpOmYsZCl9fX0sbmI9ZnVuY3Rpb24oYSxiKXtiPVN0cmluZyhiKTsiYXBwbGljYXRpb24veGh0bWwreG1sIj09PWEuY29udGVudFR5cGUmJihiPWIudG9Mb3dlckNhc2UoKSk7cmV0dXJuIGEuY3JlYXRlRWxlbWVudChiKX0sb2I9ZnVuY3Rpb24oYSl7YSYmCmEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpfSxwYj1mdW5jdGlvbihhLGIpe2lmKCFhfHwhYilyZXR1cm4hMTtpZihhLmNvbnRhaW5zJiYxPT1iLm5vZGVUeXBlKXJldHVybiBhPT1ifHxhLmNvbnRhaW5zKGIpO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbilyZXR1cm4gYT09Ynx8ISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNik7Zm9yKDtiJiZhIT1iOyliPWIucGFyZW50Tm9kZTtyZXR1cm4gYj09YX0scWI9ZnVuY3Rpb24oYSl7cShhLCJOb2RlIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4iKTtyZXR1cm4gOT09YS5ub2RlVHlwZT9hOmEub3duZXJEb2N1bWVudHx8YS5kb2N1bWVudH0scmI9ZnVuY3Rpb24oYSxiKXtiP2EudGFiSW5kZXg9MDooYS50YWJJbmRleD0tMSxhLnJlbW92ZUF0dHJpYnV0ZSgidGFiSW5kZXgiKSl9LHNiPWZ1bmN0aW9uKGEpe3JldHVybiB2JiYhQSgiOSIpPyhhPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKSwKbnVsbCE9YSYmYS5zcGVjaWZpZWQpOmEuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpfSx0Yj1mdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgYSYmMDw9YSYmMzI3Njg+YX0sdWI9ZnVuY3Rpb24oYSl7dGhpcy5hPWF8fGwuZG9jdW1lbnR8fGRvY3VtZW50fTt1Yi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBhP3RoaXMuYS5nZXRFbGVtZW50QnlJZChhKTphfTsKdWIucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuYSxlPWFyZ3VtZW50cyxmPVN0cmluZyhlWzBdKSxnPWVbMV07aWYoIWpiJiZnJiYoZy5uYW1lfHxnLnR5cGUpKXtmPVsiPCIsZl07Zy5uYW1lJiZmLnB1c2goJyBuYW1lPSInLFhhKGcubmFtZSksJyInKTtpZihnLnR5cGUpe2YucHVzaCgnIHR5cGU9IicsWGEoZy50eXBlKSwnIicpO3ZhciBrPXt9O3VhKGssZyk7ZGVsZXRlIGsudHlwZTtnPWt9Zi5wdXNoKCI+Iik7Zj1mLmpvaW4oIiIpfWY9bmIoZCxmKTtnJiYoInN0cmluZyI9PT10eXBlb2YgZz9mLmNsYXNzTmFtZT1nOmZhKGcpP2YuY2xhc3NOYW1lPWcuam9pbigiICIpOmxiKGYsZykpOzI8ZS5sZW5ndGgmJm1iKGQsZixlKTtyZXR1cm4gZn07dmFyIHZiPWZ1bmN0aW9uKGEsYil7Yj8ocShwYSh2YSxiKSwiTm8gc3VjaCBBUklBIHJvbGUgIitiKSxhLnNldEF0dHJpYnV0ZSgicm9sZSIsYikpOmEucmVtb3ZlQXR0cmlidXRlKCJyb2xlIil9LHhiPWZ1bmN0aW9uKGEsYixjKXtmYShjKSYmKGM9Yy5qb2luKCIgIikpO3ZhciBkPXdiKGIpOyIiPT09Y3x8dm9pZCAwPT1jPyhtYXx8KG1hPXthdG9taWM6ITEsYXV0b2NvbXBsZXRlOiJub25lIixkcm9wZWZmZWN0OiJub25lIixoYXNwb3B1cDohMSxsaXZlOiJvZmYiLG11bHRpbGluZTohMSxtdWx0aXNlbGVjdGFibGU6ITEsb3JpZW50YXRpb246InZlcnRpY2FsIixyZWFkb25seTohMSxyZWxldmFudDoiYWRkaXRpb25zIHRleHQiLHJlcXVpcmVkOiExLHNvcnQ6Im5vbmUiLGJ1c3k6ITEsZGlzYWJsZWQ6ITEsaGlkZGVuOiExLGludmFsaWQ6ImZhbHNlIn0pLGM9bWEsYiBpbiBjP2Euc2V0QXR0cmlidXRlKGQsY1tiXSk6YS5yZW1vdmVBdHRyaWJ1dGUoZCkpOmEuc2V0QXR0cmlidXRlKGQsCmMpfSx3Yj1mdW5jdGlvbihhKXtxKGEsIkFSSUEgYXR0cmlidXRlIGNhbm5vdCBiZSBlbXB0eS4iKTtxKHBhKG5hLGEpLCJObyBzdWNoIEFSSUEgYXR0cmlidXRlICIrYSk7cmV0dXJuImFyaWEtIithfTt2YXIgeWI9T2JqZWN0LmZyZWV6ZXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O3ZhciBDPWZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVTt0aGlzLko9dGhpcy5KfTtDLnByb3RvdHlwZS5VPSExO0MucHJvdG90eXBlLk49ZnVuY3Rpb24oKXt0aGlzLlV8fCh0aGlzLlU9ITAsdGhpcy51KCkpfTt2YXIgemI9ZnVuY3Rpb24oYSxiKXthLlU/YigpOihhLkp8fChhLko9W10pLGEuSi5wdXNoKGIpKX07Qy5wcm90b3R5cGUudT1mdW5jdGlvbigpe2lmKHRoaXMuSilmb3IoO3RoaXMuSi5sZW5ndGg7KXRoaXMuSi5zaGlmdCgpKCl9O3ZhciBBYj1mdW5jdGlvbihhKXthJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5OJiZhLk4oKX07dmFyIEJiPWZ1bmN0aW9uKGEpe3JldHVybiJzdHJpbmciPT10eXBlb2YgYS5jbGFzc05hbWU/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sRD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6QmIoYSkubWF0Y2goL1xTKy9nKXx8W119LENiPWZ1bmN0aW9uKGEsYil7InN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZT9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxEYj1mdW5jdGlvbihhLGIpe3JldHVybiBhLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5jb250YWlucyhiKTpHYShEKGEpLGIpfSxFYj1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFEYihhLGIpKXt2YXIgYz1CYihhKTtDYihhLGMrKDA8Yy5sZW5ndGg/IiAiK2I6YikpfX0sRmI9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClyKGIsCmZ1bmN0aW9uKGUpe0ViKGEsZSl9KTtlbHNle3ZhciBjPXt9O3IoRChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7cihiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPTA8Yi5sZW5ndGg/IiAiK2Q6ZDtDYihhLGIpfX0sR2I9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6RGIoYSxiKSYmQ2IoYSxFYShEKGEpLGZ1bmN0aW9uKGMpe3JldHVybiBjIT1ifSkuam9pbigiICIpKX0sSGI9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9yKGIsZnVuY3Rpb24oYyl7R2IoYSxjKX0pOkNiKGEsRWEoRChhKSxmdW5jdGlvbihjKXtyZXR1cm4hR2EoYixjKX0pLmpvaW4oIiAiKSl9O3ZhciBJYj0hdnx8OTw9TnVtYmVyKGliKSxKYj0hdnx8OTw9TnVtYmVyKGliKSxLYj12JiYhQSgiOSIpLExiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e2wuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsY2EsYiksbC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjYSxiKX1jYXRjaChjKXt9cmV0dXJuIGF9KCk7dmFyIEU9ZnVuY3Rpb24oYSxiKXt0aGlzLnR5cGU9YTt0aGlzLmE9dGhpcy50YXJnZXQ9Yjt0aGlzLmg9ITE7dGhpcy5LYT0hMH07RS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuaD0hMH07RS5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3RoaXMuS2E9ITF9O3ZhciBGPXtMOiJtb3VzZWRvd24iLE06Im1vdXNldXAiLGFhOiJtb3VzZWNhbmNlbCIsaGM6Im1vdXNlbW92ZSIsamM6Im1vdXNlb3ZlciIsaWM6Im1vdXNlb3V0IixmYzoibW91c2VlbnRlciIsZ2M6Im1vdXNlbGVhdmUifTt2YXIgRz1mdW5jdGlvbihhLGIpe0UuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy5hPXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5jPTA7dGhpcy5BPXRoaXMubWV0YUtleT10aGlzLnNoaWZ0S2V5PXRoaXMuYWx0S2V5PXRoaXMuY3RybEtleT0hMTt0aGlzLnBvaW50ZXJJZD0wO3RoaXMucG9pbnRlclR5cGU9IiI7dGhpcy5iPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMuYT1iO2lmKGI9YS5yZWxhdGVkVGFyZ2V0KXtpZih4KXthOnt0cnl7WWEoYi5ub2RlTmFtZSk7dmFyIGU9ITA7YnJlYWsgYX1jYXRjaChmKXt9ZT0KITF9ZXx8KGI9bnVsbCl9fWVsc2UibW91c2VvdmVyIj09Yz9iPWEuZnJvbUVsZW1lbnQ6Im1vdXNlb3V0Ij09YyYmKGI9YS50b0VsZW1lbnQpO3RoaXMucmVsYXRlZFRhcmdldD1iO2Q/KHRoaXMuY2xpZW50WD12b2lkIDAhPT1kLmNsaWVudFg/ZC5jbGllbnRYOmQucGFnZVgsdGhpcy5jbGllbnRZPXZvaWQgMCE9PWQuY2xpZW50WT9kLmNsaWVudFk6ZC5wYWdlWSx0aGlzLnNjcmVlblg9ZC5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1kLnNjcmVlbll8fDApOih0aGlzLmNsaWVudFg9dm9pZCAwIT09YS5jbGllbnRYP2EuY2xpZW50WDphLnBhZ2VYLHRoaXMuY2xpZW50WT12b2lkIDAhPT1hLmNsaWVudFk/YS5jbGllbnRZOmEucGFnZVksdGhpcy5zY3JlZW5YPWEuc2NyZWVuWHx8MCx0aGlzLnNjcmVlblk9YS5zY3JlZW5ZfHwwKTt0aGlzLmJ1dHRvbj1hLmJ1dHRvbjt0aGlzLmM9YS5rZXlDb2RlfHwwO3RoaXMua2V5PWEua2V5fHwiIjt0aGlzLmN0cmxLZXk9YS5jdHJsS2V5O3RoaXMuYWx0S2V5PQphLmFsdEtleTt0aGlzLnNoaWZ0S2V5PWEuc2hpZnRLZXk7dGhpcy5tZXRhS2V5PWEubWV0YUtleTt0aGlzLkE9ej9hLm1ldGFLZXk6YS5jdHJsS2V5O3RoaXMucG9pbnRlcklkPWEucG9pbnRlcklkfHwwO3RoaXMucG9pbnRlclR5cGU9InN0cmluZyI9PT10eXBlb2YgYS5wb2ludGVyVHlwZT9hLnBvaW50ZXJUeXBlOk1iW2EucG9pbnRlclR5cGVdfHwiIjt0aGlzLmI9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnRoaXMuZygpfX07bihHLEUpO3ZhciBOYj15YihbMSw0LDJdKSxNYj15Yih7MjoidG91Y2giLDM6InBlbiIsNDoibW91c2UifSksT2I9ZnVuY3Rpb24oYSl7cmV0dXJuIEliPzA9PWEuYi5idXR0b246ImNsaWNrIj09YS50eXBlPyEwOiEhKGEuYi5idXR0b24mTmJbMF0pfTtHLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7Ry5pLmouY2FsbCh0aGlzKTt0aGlzLmIuc3RvcFByb3BhZ2F0aW9uP3RoaXMuYi5zdG9wUHJvcGFnYXRpb24oKTp0aGlzLmIuY2FuY2VsQnViYmxlPSEwfTsKRy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe0cuaS5nLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5iO2lmKGEucHJldmVudERlZmF1bHQpYS5wcmV2ZW50RGVmYXVsdCgpO2Vsc2UgaWYoYS5yZXR1cm5WYWx1ZT0hMSxLYil0cnl7aWYoYS5jdHJsS2V5fHwxMTI8PWEua2V5Q29kZSYmMTIzPj1hLmtleUNvZGUpYS5rZXlDb2RlPS0xfWNhdGNoKGIpe319O3ZhciBQYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKDFFNipNYXRoLnJhbmRvbSgpfDApLFFiPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW1BiXSl9LFJiPTA7dmFyIFNiPWZ1bmN0aW9uKGEsYixjLGQsZSl7dGhpcy5saXN0ZW5lcj1hO3RoaXMuYT1udWxsO3RoaXMuc3JjPWI7dGhpcy50eXBlPWM7dGhpcy5jYXB0dXJlPSEhZDt0aGlzLm1hPWU7dGhpcy5rZXk9KytSYjt0aGlzLlg9dGhpcy5oYT0hMX0sVGI9ZnVuY3Rpb24oYSl7YS5YPSEwO2EubGlzdGVuZXI9bnVsbDthLmE9bnVsbDthLnNyYz1udWxsO2EubWE9bnVsbH07dmFyIFViPWZ1bmN0aW9uKGEpe3RoaXMuc3JjPWE7dGhpcy5hPXt9O3RoaXMuYj0wfTtVYi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS50b1N0cmluZygpO2E9dGhpcy5hW2ZdO2F8fChhPXRoaXMuYVtmXT1bXSx0aGlzLmIrKyk7dmFyIGc9VmIoYSxiLGQsZSk7LTE8Zz8oYj1hW2ddLGN8fChiLmhhPSExKSk6KGI9bmV3IFNiKGIsdGhpcy5zcmMsZiwhIWQsZSksYi5oYT1jLGEucHVzaChiKSk7cmV0dXJuIGJ9Owp2YXIgV2I9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLnR5cGU7YyBpbiBhLmEmJkhhKGEuYVtjXSxiKSYmKFRiKGIpLDA9PWEuYVtjXS5sZW5ndGgmJihkZWxldGUgYS5hW2NdLGEuYi0tKSl9LFhiPWZ1bmN0aW9uKGEsYixjLGQsZSl7YT1hLmFbYi50b1N0cmluZygpXTtiPS0xO2EmJihiPVZiKGEsYyxkLGUpKTtyZXR1cm4tMTxiP2FbYl06bnVsbH0sVmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuWCYmZi5saXN0ZW5lcj09YiYmZi5jYXB0dXJlPT0hIWMmJmYubWE9PWQpcmV0dXJuIGV9cmV0dXJuLTF9O3ZhciBZYj0iY2xvc3VyZV9sbV8iKygxRTYqTWF0aC5yYW5kb20oKXwwKSxaYj17fSwkYj0wLGJjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZCYmZC5vbmNlKXJldHVybiBhYyhhLGIsYyxkLGUpO2lmKGZhKGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyliYyhhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9Y2MoYyk7cmV0dXJuIFFiKGEpP2RjKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOmVjKGEsYixjLCExLGQsZSl9LGVjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGc9bShlKT8hIWUuY2FwdHVyZTohIWUsaz1mYyhhKTtrfHwoYVtZYl09az1uZXcgVWIoYSkpO2M9ay5hZGQoYixjLGQsZyxmKTtpZihjLmEpcmV0dXJuIGM7ZD1nYygpO2MuYT1kO2Quc3JjPWE7ZC5saXN0ZW5lcj1jO2lmKGEuYWRkRXZlbnRMaXN0ZW5lcilMYnx8KGU9Zyksdm9pZCAwPT09ZSYmKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksCmQsZSk7ZWxzZSBpZihhLmF0dGFjaEV2ZW50KWEuYXR0YWNoRXZlbnQoaGMoYi50b1N0cmluZygpKSxkKTtlbHNlIGlmKGEuYWRkTGlzdGVuZXImJmEucmVtb3ZlTGlzdGVuZXIpcSgiY2hhbmdlIj09PWIsIk1lZGlhUXVlcnlMaXN0IG9ubHkgaGFzIGEgY2hhbmdlIGV2ZW50IiksYS5hZGRMaXN0ZW5lcihkKTtlbHNlIHRocm93IEVycm9yKCJhZGRFdmVudExpc3RlbmVyIGFuZCBhdHRhY2hFdmVudCBhcmUgdW5hdmFpbGFibGUuIik7JGIrKztyZXR1cm4gY30sZ2M9ZnVuY3Rpb24oKXt2YXIgYT1pYyxiPUpiP2Z1bmN0aW9uKGMpe3JldHVybiBhLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKX06ZnVuY3Rpb24oYyl7Yz1hLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKTtpZighYylyZXR1cm4gY307cmV0dXJuIGJ9LGFjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZmEoYikpe2Zvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWFjKGEsYltmXSxjLGQsZSk7cmV0dXJuIG51bGx9Yz1jYyhjKTtyZXR1cm4gUWIoYSk/CmEuaC5hZGQoU3RyaW5nKGIpLGMsITAsbShkKT8hIWQuY2FwdHVyZTohIWQsZSk6ZWMoYSxiLGMsITAsZCxlKX0samM9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihmYShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylqYyhhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPWNjKGMpLFFiKGEpPyhhPWEuaCxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5hJiYoZj1hLmFbYl0sYz1WYihmLGMsZCxlKSwtMTxjJiYoVGIoZltjXSkscShudWxsIT1mLmxlbmd0aCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSwwPT1mLmxlbmd0aCYmKGRlbGV0ZSBhLmFbYl0sYS5iLS0pKSkpOmEmJihhPWZjKGEpKSYmKGM9WGIoYSxiLGMsZCxlKSkmJmtjKGMpfSxrYz1mdW5jdGlvbihhKXtpZigibnVtYmVyIiE9PXR5cGVvZiBhJiZhJiYhYS5YKXt2YXIgYj1hLnNyYztpZihRYihiKSlXYihiLmgsYSk7ZWxzZXt2YXIgYz1hLnR5cGUsZD1hLmE7Yi5yZW1vdmVFdmVudExpc3RlbmVyPwpiLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KGhjKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7JGItLTsoYz1mYyhiKSk/KFdiKGMsYSksMD09Yy5iJiYoYy5zcmM9bnVsbCxiW1liXT1udWxsKSk6VGIoYSl9fX0saGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gWmI/WmJbYV06WmJbYV09Im9uIithfSxtYz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMDtpZihhPWZjKGEpKWlmKGI9YS5hW2IudG9TdHJpbmcoKV0pZm9yKGI9Yi5jb25jYXQoKSxhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBmPWJbYV07ZiYmZi5jYXB0dXJlPT1jJiYhZi5YJiYoZj1sYyhmLGQpLGU9ZSYmITEhPT1mKX1yZXR1cm4gZX0sbGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5tYXx8YS5zcmM7YS5oYSYma2MoYSk7cmV0dXJuIGMuY2FsbChkLGIpfSxpYz1mdW5jdGlvbihhLApiKXtpZihhLlgpcmV0dXJuITA7aWYoIUpiKXtpZighYilhOntiPVsid2luZG93IiwiZXZlbnQiXTtmb3IodmFyIGM9bCxkPTA7ZDxiLmxlbmd0aDtkKyspaWYoYz1jW2JbZF1dLG51bGw9PWMpe2I9bnVsbDticmVhayBhfWI9Y31kPWI7Yj1uZXcgRyhkLHRoaXMpO2M9ITA7aWYoISgwPmQua2V5Q29kZXx8dm9pZCAwIT1kLnJldHVyblZhbHVlKSl7YTp7dmFyIGU9ITE7aWYoMD09ZC5rZXlDb2RlKXRyeXtkLmtleUNvZGU9LTE7YnJlYWsgYX1jYXRjaChnKXtlPSEwfWlmKGV8fHZvaWQgMD09ZC5yZXR1cm5WYWx1ZSlkLnJldHVyblZhbHVlPSEwfWQ9W107Zm9yKGU9Yi5hO2U7ZT1lLnBhcmVudE5vZGUpZC5wdXNoKGUpO2E9YS50eXBlO2ZvcihlPWQubGVuZ3RoLTE7IWIuaCYmMDw9ZTtlLS0pe2IuYT1kW2VdO3ZhciBmPW1jKGRbZV0sYSwhMCxiKTtjPWMmJmZ9Zm9yKGU9MDshYi5oJiZlPGQubGVuZ3RoO2UrKyliLmE9ZFtlXSxmPW1jKGRbZV0sYSwhMSxiKSxjPWMmJmZ9cmV0dXJuIGN9cmV0dXJuIGxjKGEsCm5ldyBHKGIsdGhpcykpfSxmYz1mdW5jdGlvbihhKXthPWFbWWJdO3JldHVybiBhIGluc3RhbmNlb2YgVWI/YTpudWxsfSxuYz0iX19jbG9zdXJlX2V2ZW50c19mbl8iKygxRTkqTWF0aC5yYW5kb20oKT4+PjApLGNjPWZ1bmN0aW9uKGEpe3EoYSwiTGlzdGVuZXIgY2FuIG5vdCBiZSBudWxsLiIpO2lmKGlhKGEpKXJldHVybiBhO3EoYS5oYW5kbGVFdmVudCwiQW4gb2JqZWN0IGxpc3RlbmVyIG11c3QgaGF2ZSBoYW5kbGVFdmVudCBtZXRob2QuIik7YVtuY118fChhW25jXT1mdW5jdGlvbihiKXtyZXR1cm4gYS5oYW5kbGVFdmVudChiKX0pO3JldHVybiBhW25jXX07dmFyIG9jPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9e319O24ob2MsQyk7CnZhciBwYz1bXSxIPWZ1bmN0aW9uKGEsYixjLGQpe2ZhKGMpfHwoYyYmKHBjWzBdPWMudG9TdHJpbmcoKSksYz1wYyk7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWJjKGIsY1tlXSxkfHxhLmhhbmRsZUV2ZW50LCExLGEuYnx8YSk7aWYoIWYpYnJlYWs7YS5hW2Yua2V5XT1mfXJldHVybiBhfSxxYz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoZmEoYykpZm9yKHZhciBnPTA7ZzxjLmxlbmd0aDtnKyspcWMoYSxiLGNbZ10sZCxlLGYpO2Vsc2UgZD1kfHxhLmhhbmRsZUV2ZW50LGU9bShlKT8hIWUuY2FwdHVyZTohIWUsZj1mfHxhLmJ8fGEsZD1jYyhkKSxlPSEhZSxjPVFiKGIpP1hiKGIuaCxTdHJpbmcoYyksZCxlLGYpOmI/KGI9ZmMoYikpP1hiKGIsYyxkLGUsZik6bnVsbDpudWxsLGMmJihrYyhjKSxkZWxldGUgYS5hW2Mua2V5XSk7cmV0dXJuIGF9LHJjPWZ1bmN0aW9uKGEpe29hKGEuYSxmdW5jdGlvbihiLGMpe3RoaXMuYS5oYXNPd25Qcm9wZXJ0eShjKSYma2MoYil9LAphKTthLmE9e319O29jLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7b2MuaS51LmNhbGwodGhpcyk7cmModGhpcyl9O29jLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJFdmVudEhhbmRsZXIuaGFuZGxlRXZlbnQgbm90IGltcGxlbWVudGVkIik7fTt2YXIgST1mdW5jdGlvbigpe0MuY2FsbCh0aGlzKTt0aGlzLmg9bmV3IFViKHRoaXMpO3RoaXMuTWE9dGhpczt0aGlzLnBhPW51bGx9O24oSSxDKTtJLnByb3RvdHlwZVtQYl09ITA7SS5wcm90b3R5cGUucmE9ZnVuY3Rpb24oYSl7dGhpcy5wYT1hfTtJLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjLGQpe2pjKHRoaXMsYSxiLGMsZCl9Owp2YXIgdWM9ZnVuY3Rpb24oYSxiKXtzYyhhKTt2YXIgYz1hLnBhO2lmKGMpe3ZhciBkPVtdO2Zvcih2YXIgZT0xO2M7Yz1jLnBhKWQucHVzaChjKSxxKDFFMz4rK2UsImluZmluaXRlIGxvb3AiKX1hPWEuTWE7Yz1iLnR5cGV8fGI7InN0cmluZyI9PT10eXBlb2YgYj9iPW5ldyBFKGIsYSk6YiBpbnN0YW5jZW9mIEU/Yi50YXJnZXQ9Yi50YXJnZXR8fGE6KGU9YixiPW5ldyBFKGMsYSksdWEoYixlKSk7ZT0hMDtpZihkKWZvcih2YXIgZj1kLmxlbmd0aC0xOyFiLmgmJjA8PWY7Zi0tKXt2YXIgZz1iLmE9ZFtmXTtlPXRjKGcsYywhMCxiKSYmZX1iLmh8fChnPWIuYT1hLGU9dGMoZyxjLCEwLGIpJiZlLGIuaHx8KGU9dGMoZyxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLmgmJmY8ZC5sZW5ndGg7ZisrKWc9Yi5hPWRbZl0sZT10YyhnLGMsITEsYikmJmU7cmV0dXJuIGV9OwpJLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7SS5pLnUuY2FsbCh0aGlzKTtpZih0aGlzLmgpe3ZhciBhPXRoaXMuaCxiPTAsYztmb3IoYyBpbiBhLmEpe2Zvcih2YXIgZD1hLmFbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixUYihkW2VdKTtkZWxldGUgYS5hW2NdO2EuYi0tfX10aGlzLnBhPW51bGx9O3ZhciBkYz1mdW5jdGlvbihhLGIsYyxkLGUpe3NjKGEpO3JldHVybiBhLmguYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LHRjPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5oLmFbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGc9YltmXTtpZihnJiYhZy5YJiZnLmNhcHR1cmU9PWMpe3ZhciBrPWcubGlzdGVuZXIscD1nLm1hfHxnLnNyYztnLmhhJiZXYihhLmgsZyk7ZT0hMSE9PWsuY2FsbChwLGQpJiZlfX1yZXR1cm4gZSYmMCE9ZC5LYX0sc2M9ZnVuY3Rpb24oYSl7cShhLmgsIkV2ZW50IHRhcmdldCBpcyBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgY2FsbCB0aGUgc3VwZXJjbGFzcyAoZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpIGNvbnN0cnVjdG9yPyIpfTt2YXIgeGM9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKHkmJiFBKCI1MjUiKSlyZXR1cm4hMDtpZih6JiZlKXJldHVybiB2YyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZigheCl7Im51bWJlciI9PT10eXBlb2YgYiYmKGI9d2MoYikpO3ZhciBnPTE3PT1ifHwxOD09Ynx8eiYmOTE9PWI7aWYoKCFjfHx6KSYmZ3x8eiYmMTY9PWImJihkfHxmKSlyZXR1cm4hMX1pZigoeXx8YmIpJiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1pZih2JiZkJiZiPT1hKXJldHVybiExO3N3aXRjaChhKXtjYXNlIDEzOnJldHVybiB4P2Z8fGU/ITE6IShjJiZkKTohMDtjYXNlIDI3OnJldHVybiEoeXx8YmJ8fHgpfXJldHVybiB4JiYoZHx8ZXx8Zik/ITE6dmMoYSl9LHZjPWZ1bmN0aW9uKGEpe2lmKDQ4PD1hJiY1Nz49YXx8Cjk2PD1hJiYxMDY+PWF8fDY1PD1hJiY5MD49YXx8KHl8fGJiKSYmMD09YSlyZXR1cm4hMDtzd2l0Y2goYSl7Y2FzZSAzMjpjYXNlIDQzOmNhc2UgNjM6Y2FzZSA2NDpjYXNlIDEwNzpjYXNlIDEwOTpjYXNlIDExMDpjYXNlIDExMTpjYXNlIDE4NjpjYXNlIDU5OmNhc2UgMTg5OmNhc2UgMTg3OmNhc2UgNjE6Y2FzZSAxODg6Y2FzZSAxOTA6Y2FzZSAxOTE6Y2FzZSAxOTI6Y2FzZSAyMjI6Y2FzZSAyMTk6Y2FzZSAyMjA6Y2FzZSAyMjE6Y2FzZSAxNjM6Y2FzZSA1ODpyZXR1cm4hMDtjYXNlIDE3MzpyZXR1cm4geDtkZWZhdWx0OnJldHVybiExfX0sd2M9ZnVuY3Rpb24oYSl7aWYoeClhPXljKGEpO2Vsc2UgaWYoeiYmeSlzd2l0Y2goYSl7Y2FzZSA5MzphPTkxfXJldHVybiBhfSx5Yz1mdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSA2MTpyZXR1cm4gMTg3O2Nhc2UgNTk6cmV0dXJuIDE4NjtjYXNlIDE3MzpyZXR1cm4gMTg5O2Nhc2UgMjI0OnJldHVybiA5MTtjYXNlIDA6cmV0dXJuIDIyNDsKZGVmYXVsdDpyZXR1cm4gYX19O3ZhciBKPWZ1bmN0aW9uKGEsYil7SS5jYWxsKHRoaXMpO2EmJnpjKHRoaXMsYSxiKX07bihKLEkpO2g9Si5wcm90b3R5cGU7aC5TPW51bGw7aC5uYT1udWxsO2guQ2E9bnVsbDtoLm9hPW51bGw7aC53PS0xO2guRj0tMTtoLnVhPSExOwp2YXIgQWM9ezM6MTMsMTI6MTQ0LDYzMjMyOjM4LDYzMjMzOjQwLDYzMjM0OjM3LDYzMjM1OjM5LDYzMjM2OjExMiw2MzIzNzoxMTMsNjMyMzg6MTE0LDYzMjM5OjExNSw2MzI0MDoxMTYsNjMyNDE6MTE3LDYzMjQyOjExOCw2MzI0MzoxMTksNjMyNDQ6MTIwLDYzMjQ1OjEyMSw2MzI0NjoxMjIsNjMyNDc6MTIzLDYzMjQ4OjQ0LDYzMjcyOjQ2LDYzMjczOjM2LDYzMjc1OjM1LDYzMjc2OjMzLDYzMjc3OjM0LDYzMjg5OjE0NCw2MzMwMjo0NX0sQmM9e1VwOjM4LERvd246NDAsTGVmdDozNyxSaWdodDozOSxFbnRlcjoxMyxGMToxMTIsRjI6MTEzLEYzOjExNCxGNDoxMTUsRjU6MTE2LEY2OjExNyxGNzoxMTgsRjg6MTE5LEY5OjEyMCxGMTA6MTIxLEYxMToxMjIsRjEyOjEyMywiVSswMDdGIjo0NixIb21lOjM2LEVuZDozNSxQYWdlVXA6MzMsUGFnZURvd246MzQsSW5zZXJ0OjQ1fSxDYz0heXx8QSgiNTI1IiksRGM9eiYmeDsKSi5wcm90b3R5cGUuYT1mdW5jdGlvbihhKXtpZih5fHxiYilpZigxNz09dGhpcy53JiYhYS5jdHJsS2V5fHwxOD09dGhpcy53JiYhYS5hbHRLZXl8fHomJjkxPT10aGlzLncmJiFhLm1ldGFLZXkpdGhpcy5GPXRoaXMudz0tMTstMT09dGhpcy53JiYoYS5jdHJsS2V5JiYxNyE9YS5jP3RoaXMudz0xNzphLmFsdEtleSYmMTghPWEuYz90aGlzLnc9MTg6YS5tZXRhS2V5JiY5MSE9YS5jJiYodGhpcy53PTkxKSk7Q2MmJiF4YyhhLmMsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGEuYWx0S2V5LGEubWV0YUtleSk/dGhpcy5oYW5kbGVFdmVudChhKToodGhpcy5GPXdjKGEuYyksRGMmJih0aGlzLnVhPWEuYWx0S2V5KSl9O0oucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dGhpcy5GPXRoaXMudz0tMTt0aGlzLnVhPWEuYWx0S2V5fTsKSi5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5iLGM9Yi5hbHRLZXk7aWYodiYmImtleXByZXNzIj09YS50eXBlKXt2YXIgZD10aGlzLkY7dmFyIGU9MTMhPWQmJjI3IT1kP2Iua2V5Q29kZTowfWVsc2UoeXx8YmIpJiYia2V5cHJlc3MiPT1hLnR5cGU/KGQ9dGhpcy5GLGU9MDw9Yi5jaGFyQ29kZSYmNjMyMzI+Yi5jaGFyQ29kZSYmdmMoZCk/Yi5jaGFyQ29kZTowKTphYiYmIXk/KGQ9dGhpcy5GLGU9dmMoZCk/Yi5rZXlDb2RlOjApOigia2V5cHJlc3MiPT1hLnR5cGU/KERjJiYoYz10aGlzLnVhKSxiLmtleUNvZGU9PWIuY2hhckNvZGU/MzI+Yi5rZXlDb2RlPyhkPWIua2V5Q29kZSxlPTApOihkPXRoaXMuRixlPWIuY2hhckNvZGUpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkseiYmNjM9PWUmJjIyND09ZCYmKGQ9MTkxKSk7dmFyIGY9ZD13YyhkKTtkPzYzMjMyPD0KZCYmZCBpbiBBYz9mPUFjW2RdOjI1PT1kJiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBCYyYmKGY9QmNbYi5rZXlJZGVudGlmaWVyXSk7eCYmQ2MmJiJrZXlwcmVzcyI9PWEudHlwZSYmIXhjKGYsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KXx8KGE9Zj09dGhpcy53LHRoaXMudz1mLGI9bmV3IEVjKGYsZSxhLGIpLGIuYWx0S2V5PWMsdWModGhpcyxiKSl9O0oucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTsKdmFyIHpjPWZ1bmN0aW9uKGEsYixjKXthLm9hJiZGYyhhKTthLlM9YjthLm5hPWJjKGEuUywia2V5cHJlc3MiLGEsYyk7YS5DYT1iYyhhLlMsImtleWRvd24iLGEuYSxjLGEpO2Eub2E9YmMoYS5TLCJrZXl1cCIsYS5iLGMsYSl9LEZjPWZ1bmN0aW9uKGEpe2EubmEmJihrYyhhLm5hKSxrYyhhLkNhKSxrYyhhLm9hKSxhLm5hPW51bGwsYS5DYT1udWxsLGEub2E9bnVsbCk7YS5TPW51bGw7YS53PS0xO2EuRj0tMX07Si5wcm90b3R5cGUudT1mdW5jdGlvbigpe0ouaS51LmNhbGwodGhpcyk7RmModGhpcyl9O3ZhciBFYz1mdW5jdGlvbihhLGIsYyxkKXtHLmNhbGwodGhpcyxkKTt0aGlzLnR5cGU9ImtleSI7dGhpcy5jPWE7dGhpcy5yZXBlYXQ9Y307bihFYyxHKTt2YXIgR2M9eD8iTW96VXNlclNlbGVjdCI6eXx8YmI/IldlYmtpdFVzZXJTZWxlY3QiOm51bGwsSGM9ZnVuY3Rpb24oYSxiKXtiPWI/bnVsbDphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7aWYoR2Mpe3ZhciBjPSJub25lIjthLnN0eWxlJiYoYS5zdHlsZVtHY109Yyk7aWYoYil7YT0wO2Zvcih2YXIgZDtkPWJbYV07YSsrKWQuc3R5bGUmJihkLnN0eWxlW0djXT1jKX19ZWxzZSBpZih2fHxhYilpZihjPSJvbiIsYS5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyksYilmb3IoYT0wO2Q9YlthXTthKyspZC5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyl9O3ZhciBJYz1mdW5jdGlvbigpe307ZGEoSWMpO0ljLnByb3RvdHlwZS5hPTA7dmFyIEs9ZnVuY3Rpb24oYSl7SS5jYWxsKHRoaXMpO3RoaXMuaj1hfHx4YXx8KHhhPW5ldyB1Yik7dGhpcy5xYT1KYzt0aGlzLlk9bnVsbDt0aGlzLm09ITE7dGhpcy5hPW51bGw7dGhpcy5BPXZvaWQgMDt0aGlzLmc9dGhpcy5jPXRoaXMuYj1udWxsO3RoaXMuR2E9ITF9O24oSyxJKTtLLnByb3RvdHlwZS5PYT1JYy5SKCk7CnZhciBKYz1udWxsLEtjPWZ1bmN0aW9uKGEsYil7c3dpdGNoKGEpe2Nhc2UgMTpyZXR1cm4gYj8iZGlzYWJsZSI6ImVuYWJsZSI7Y2FzZSAyOnJldHVybiBiPyJoaWdobGlnaHQiOiJ1bmhpZ2hsaWdodCI7Y2FzZSA0OnJldHVybiBiPyJhY3RpdmF0ZSI6ImRlYWN0aXZhdGUiO2Nhc2UgODpyZXR1cm4gYj8ic2VsZWN0IjoidW5zZWxlY3QiO2Nhc2UgMTY6cmV0dXJuIGI/ImNoZWNrIjoidW5jaGVjayI7Y2FzZSAzMjpyZXR1cm4gYj8iZm9jdXMiOiJibHVyIjtjYXNlIDY0OnJldHVybiBiPyJvcGVuIjoiY2xvc2UifXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBzdGF0ZSIpO30sTGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuWXx8KGEuWT0iOiIrKGEuT2EuYSsrKS50b1N0cmluZygzNikpfSxNYz1mdW5jdGlvbihhLGIpe2lmKGEuYiYmYS5iLmcpe3ZhciBjPWEuYi5nLGQ9YS5ZO2QgaW4gYyYmZGVsZXRlIGNbZF07cWEoYS5iLmcsYixhKX1hLlk9Yn07Sy5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9Owp2YXIgTmM9ZnVuY3Rpb24oYSl7YT1hLmE7cShhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cmV0dXJuIGF9LE9jPWZ1bmN0aW9uKGEpe2EuQXx8KGEuQT1uZXcgb2MoYSkpO3JldHVybiBxKGEuQSl9O0sucHJvdG90eXBlLnJhPWZ1bmN0aW9uKGEpe2lmKHRoaXMuYiYmdGhpcy5iIT1hKXRocm93IEVycm9yKCJNZXRob2Qgbm90IHN1cHBvcnRlZCIpO0suaS5yYS5jYWxsKHRoaXMsYSl9O0sucHJvdG90eXBlLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPW5iKHRoaXMuai5hLCJESVYiKX07CnZhciBQYz1mdW5jdGlvbihhLGIpe2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiJiZhLnhhKGIpKXthLkdhPSEwO3ZhciBjPXFiKGIpO2EuaiYmYS5qLmE9PWN8fChhLmo9Yj9uZXcgdWIocWIoYikpOnhhfHwoeGE9bmV3IHViKSk7YS52YShiKTthLkQoKX1lbHNlIHRocm93IEVycm9yKCJJbnZhbGlkIGVsZW1lbnQgdG8gZGVjb3JhdGUiKTt9O2g9Sy5wcm90b3R5cGU7aC54YT1mdW5jdGlvbigpe3JldHVybiEwfTtoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hfTtoLkQ9ZnVuY3Rpb24oKXt0aGlzLm09ITA7UWModGhpcyxmdW5jdGlvbihhKXshYS5tJiZhLmYoKSYmYS5EKCl9KX07aC5QPWZ1bmN0aW9uKCl7UWModGhpcyxmdW5jdGlvbihhKXthLm0mJmEuUCgpfSk7dGhpcy5BJiZyYyh0aGlzLkEpO3RoaXMubT0hMX07CmgudT1mdW5jdGlvbigpe3RoaXMubSYmdGhpcy5QKCk7dGhpcy5BJiYodGhpcy5BLk4oKSxkZWxldGUgdGhpcy5BKTtRYyh0aGlzLGZ1bmN0aW9uKGEpe2EuTigpfSk7IXRoaXMuR2EmJnRoaXMuYSYmb2IodGhpcy5hKTt0aGlzLmI9dGhpcy5hPXRoaXMuZz10aGlzLmM9bnVsbDtLLmkudS5jYWxsKHRoaXMpfTtoLnNhPWZ1bmN0aW9uKGEsYil7dGhpcy50YShhLFJjKHRoaXMpLGIpfTsKaC50YT1mdW5jdGlvbihhLGIsYyl7cSghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLm0mJihjfHwhdGhpcy5tKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZigwPmJ8fGI+UmModGhpcykpdGhyb3cgRXJyb3IoIkNoaWxkIGNvbXBvbmVudCBpbmRleCBvdXQgb2YgYm91bmRzIik7dGhpcy5nJiZ0aGlzLmN8fCh0aGlzLmc9e30sdGhpcy5jPVtdKTtpZihhLmI9PXRoaXMpe3ZhciBkPUxjKGEpO3RoaXMuZ1tkXT1hO0hhKHRoaXMuYyxhKX1lbHNlIHFhKHRoaXMuZyxMYyhhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuYiYmYS5ZKXt2YXIgZT1hLmI7ZD1hLlk7ZS5nJiZkPyhlPWUuZyxkPShudWxsIT09ZSYmZCBpbiBlP2VbZF06dm9pZCAwKXx8bnVsbCk6ZD1udWxsfWlmKGQmJmEuYiE9dGhpcyl0aHJvdyBFcnJvcigiVW5hYmxlIHRvIHNldCBwYXJlbnQgY29tcG9uZW50Iik7CmEuYj10aGlzO0suaS5yYS5jYWxsKGEsdGhpcyk7TGEodGhpcy5jLGIsMCxhKTtpZihhLm0mJnRoaXMubSYmYS5iPT10aGlzKWM9dGhpcy5qYSgpLGI9Yy5jaGlsZE5vZGVzW2JdfHxudWxsLGIhPWEuZigpJiZjLmluc2VydEJlZm9yZShhLmYoKSxiKTtlbHNlIGlmKGMpe3RoaXMuYXx8dGhpcy5pYSgpO2M9TCh0aGlzLGIrMSk7Yj10aGlzLmphKCk7Yz1jP2MuYTpudWxsO2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTthLmF8fGEuaWEoKTtiP2IuaW5zZXJ0QmVmb3JlKGEuYSxjfHxudWxsKTphLmouYS5ib2R5LmFwcGVuZENoaWxkKGEuYSk7YS5iJiYhYS5iLm18fGEuRCgpfWVsc2UgdGhpcy5tJiYhYS5tJiZhLmEmJmEuYS5wYXJlbnROb2RlJiYxPT1hLmEucGFyZW50Tm9kZS5ub2RlVHlwZSYmYS5EKCl9O2guamE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hfTsKdmFyIFNjPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEucWEpe3ZhciBiPWEubT9hLmE6YS5qLmEuYm9keTthOnt2YXIgYz1xYihiKTtpZihjLmRlZmF1bHRWaWV3JiZjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihjPWMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpKSl7Yz1jLmRpcmVjdGlvbnx8Yy5nZXRQcm9wZXJ0eVZhbHVlKCJkaXJlY3Rpb24iKXx8IiI7YnJlYWsgYX1jPSIifWEucWE9InJ0bCI9PShjfHwoYi5jdXJyZW50U3R5bGU/Yi5jdXJyZW50U3R5bGUuZGlyZWN0aW9uOm51bGwpfHxiLnN0eWxlJiZiLnN0eWxlLmRpcmVjdGlvbil9cmV0dXJuIGEucWF9LFJjPWZ1bmN0aW9uKGEpe3JldHVybiBhLmM/YS5jLmxlbmd0aDowfSxMPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuYz9hLmNbYl18fG51bGw6bnVsbH0sUWM9ZnVuY3Rpb24oYSxiLGMpe2EuYyYmcihhLmMsYixjKX0sVGM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jJiZiP0RhKGEuYyxiKTotMX07dmFyIFZjPWZ1bmN0aW9uKGEsYil7aWYoIWEpdGhyb3cgRXJyb3IoIkludmFsaWQgY2xhc3MgbmFtZSAiK2EpO2lmKCFpYShiKSl0aHJvdyBFcnJvcigiSW52YWxpZCBkZWNvcmF0b3IgZnVuY3Rpb24gIitiKTtVY1thXT1ifSxXYz17fSxVYz17fTt2YXIgWGM9ZnVuY3Rpb24oYSl7dGhpcy5oPWF9O2RhKFhjKTt2YXIgWWM9ZnVuY3Rpb24oYSxiKXthJiYoYS50YWJJbmRleD1iPzA6LTEpfSwkYz1mdW5jdGlvbihhLGIsYyl7Yy5pZCYmTWMoYixjLmlkKTt2YXIgZD1hLmIoKSxlPSExLGY9RChjKTtmJiZyKGYsZnVuY3Rpb24oZyl7Zz09ZD9lPSEwOmcmJnRoaXMuZyhiLGcsZCl9LGEpO2V8fEViKGMsZCk7WmMoYixjKTtyZXR1cm4gY307WGMucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiLGMpe2I9PWMrIi1kaXNhYmxlZCI/YS5aKCExKTpiPT1jKyItaG9yaXpvbnRhbCI/YWQoYSwiaG9yaXpvbnRhbCIpOmI9PWMrIi12ZXJ0aWNhbCImJmFkKGEsInZlcnRpY2FsIil9Owp2YXIgWmM9ZnVuY3Rpb24oYSxiKXtpZihiKWZvcih2YXIgYz1iLmZpcnN0Q2hpbGQsZDtjJiZjLnBhcmVudE5vZGU9PWI7KXtkPWMubmV4dFNpYmxpbmc7aWYoMT09Yy5ub2RlVHlwZSl7YTp7dmFyIGU9YztxKGUpO2U9RChlKTtmb3IodmFyIGY9MCxnPWUubGVuZ3RoO2Y8ZztmKyspe3ZhciBrPWVbZl07aWYoaz1rIGluIFVjP1VjW2tdKCk6bnVsbCl7ZT1rO2JyZWFrIGF9fWU9bnVsbH1lJiYoZS5hPWMsYS5pc0VuYWJsZWQoKXx8ZS5aKCExKSxhLnNhKGUpLFBjKGUsYykpfWVsc2UgYy5ub2RlVmFsdWUmJiIiIT1NYShjLm5vZGVWYWx1ZSl8fGIucmVtb3ZlQ2hpbGQoYyk7Yz1kfX0sYmQ9ZnVuY3Rpb24oYSxiKXtiPWIuZigpO3EoYiwiVGhlIGNvbnRhaW5lciBET00gZWxlbWVudCBjYW5ub3QgYmUgbnVsbC4iKTtIYyhiLHgpO3YmJihiLmhpZGVGb2N1cz0hMCk7KGE9YS5oKSYmdmIoYixhKX07WGMucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKWGMucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5iKCksYz1bYiwiaG9yaXpvbnRhbCI9PWEuSD9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgTT1mdW5jdGlvbigpe30sY2Q7ZGEoTSk7dmFyIGRkPXtidXR0b246InByZXNzZWQiLGNoZWNrYm94OiJjaGVja2VkIixtZW51aXRlbToic2VsZWN0ZWQiLG1lbnVpdGVtY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtcmFkaW86ImNoZWNrZWQiLHJhZGlvOiJjaGVja2VkIix0YWI6InNlbGVjdGVkIix0cmVlaXRlbToic2VsZWN0ZWQifTtNLnByb3RvdHlwZS5oPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLmouYigiRElWIixlZCh0aGlzLGEpLmpvaW4oIiAiKSxhLmJhKX07dmFyIGdkPWZ1bmN0aW9uKGEsYixjKXtpZihhPWEuZj9hLmYoKTphKXt2YXIgZD1bYl07diYmIUEoIjciKSYmKGQ9ZmQoRChhKSxiKSxkLnB1c2goYikpOyhjP0ZiOkhiKShhLGQpfX07Ck0ucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiKXtiLmlkJiZNYyhhLGIuaWQpO2ImJmIuZmlyc3RDaGlsZD9oZChhLGIuZmlyc3RDaGlsZC5uZXh0U2libGluZz9KYShiLmNoaWxkTm9kZXMpOmIuZmlyc3RDaGlsZCk6YS5iYT1udWxsO3ZhciBjPTAsZD10aGlzLmEoKSxlPXRoaXMuYSgpLGY9ITEsZz0hMSxrPSExLHA9SmEoRChiKSk7cihwLGZ1bmN0aW9uKEIpe2Z8fEIhPWQ/Z3x8QiE9ZT9jfD1pZCh0aGlzLEIpOmc9ITA6KGY9ITAsZT09ZCYmKGc9ITApKTsxPT1pZCh0aGlzLEIpJiYoQWEoYiksc2IoYikmJnRiKGIpJiZyYihiLCExKSl9LHRoaXMpO2Eubz1jO2Z8fChwLnB1c2goZCksZT09ZCYmKGc9ITApKTtnfHxwLnB1c2goZSk7KGE9YS53YSkmJnAucHVzaC5hcHBseShwLGEpO2lmKHYmJiFBKCI3Iikpe3ZhciB3PWZkKHApOzA8dy5sZW5ndGgmJihwLnB1c2guYXBwbHkocCx3KSxrPSEwKX1mJiZnJiYhYSYmIWt8fENiKGIscC5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIGpkPWZ1bmN0aW9uKGEsYil7aWYoYT1hLmgoKSl7cShiLCJUaGUgZWxlbWVudCBwYXNzZWQgYXMgYSBmaXJzdCBwYXJhbWV0ZXIgY2Fubm90IGJlIG51bGwuIik7dmFyIGM9Yi5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDthIT1jJiZ2YihiLGEpfX0sa2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYztpZihhLnYmMzImJihjPWEuZigpKSl7aWYoIWImJmEubyYzMil7dHJ5e2MuYmx1cigpfWNhdGNoKGQpe31hLm8mMzImJmEuRmEobnVsbCl9KHNiKGMpJiZ0YihjKSkhPWImJnJiKGMsYil9fSxsZD1mdW5jdGlvbihhLGIsYyl7Y2R8fChjZD17MToiZGlzYWJsZWQiLDg6InNlbGVjdGVkIiwxNjoiY2hlY2tlZCIsNjQ6ImV4cGFuZGVkIn0pO3EoYSwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO2I9Y2RbYl07dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDtkJiYoZD1kZFtkXXx8YixiPSJjaGVja2VkIj09Ynx8InNlbGVjdGVkIj09CmI/ZDpiKTtiJiZ4YihhLGIsYyl9O00ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250cm9sIn07CnZhciBlZD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuYSgpLGQ9W2NdLGU9YS5hKCk7ZSE9YyYmZC5wdXNoKGUpO2M9Yi5vO2ZvcihlPVtdO2M7KXt2YXIgZj1jJi1jO2UucHVzaChtZChhLGYpKTtjJj1+Zn1kLnB1c2guYXBwbHkoZCxlKTsoYT1iLndhKSYmZC5wdXNoLmFwcGx5KGQsYSk7diYmIUEoIjciKSYmZC5wdXNoLmFwcGx5KGQsZmQoZCkpO3JldHVybiBkfSxmZD1mdW5jdGlvbihhLGIpe3ZhciBjPVtdO2ImJihhPUlhKGEsW2JdKSk7cihbXSxmdW5jdGlvbihkKXshRmEoZCxsYShHYSxhKSl8fGImJiFHYShkLGIpfHxjLnB1c2goZC5qb2luKCJfIikpfSk7cmV0dXJuIGN9LG1kPWZ1bmN0aW9uKGEsYil7YS5ifHxuZChhKTtyZXR1cm4gYS5iW2JdfSxpZD1mdW5jdGlvbihhLGIpe2Euanx8KGEuYnx8bmQoYSksYS5qPXNhKGEuYikpO2E9cGFyc2VJbnQoYS5qW2JdLDEwKTtyZXR1cm4gaXNOYU4oYSk/MDphfSxuZD1mdW5jdGlvbihhKXt2YXIgYj1hLmEoKSxjPSF0KGIucmVwbGFjZSgvXHhhMHxccy9nLAoiICIpLCIgIik7cShjLCJDb250cm9sUmVuZGVyZXIgaGFzIGFuIGludmFsaWQgY3NzIGNsYXNzOiAnIitiKyInIik7YS5iPXsxOmIrIi1kaXNhYmxlZCIsMjpiKyItaG92ZXIiLDQ6YisiLWFjdGl2ZSIsODpiKyItc2VsZWN0ZWQiLDE2OmIrIi1jaGVja2VkIiwzMjpiKyItZm9jdXNlZCIsNjQ6YisiLW9wZW4ifX07dmFyIE49ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO2lmKCFiKXtiPXRoaXMuY29uc3RydWN0b3I7Zm9yKHZhciBkO2I7KXtkPWJbamFdfHwoYltqYV09KytrYSk7aWYoZD1XY1tkXSlicmVhaztiPWIuaT9iLmkuY29uc3RydWN0b3I6bnVsbH1iPWQ/aWEoZC5SKT9kLlIoKTpuZXcgZDpudWxsfXRoaXMuQj1iO3RoaXMuYmE9dm9pZCAwIT09YT9hOm51bGx9O24oTixLKTtoPU4ucHJvdG90eXBlO2guYmE9bnVsbDtoLm89MDtoLnY9Mzk7aC5LPTA7aC5JYT0hMDtoLndhPW51bGw7aC55YT0hMDtoLmlhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CLmModGhpcyk7dGhpcy5hPWE7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmeGIoYSwiaGlkZGVuIiwhMCkpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hPXRoaXMuQi5nKHRoaXMsYSk7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5JYT0ibm9uZSIhPWEuc3R5bGUuZGlzcGxheX07CmguRD1mdW5jdGlvbigpe04uaS5ELmNhbGwodGhpcyk7dmFyIGE9TmModGhpcyk7cSh0aGlzKTtxKGEpO3RoaXMuaXNWaXNpYmxlKCl8fHhiKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fGxkKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy52JjgmJmxkKGEsOCwhISh0aGlzLm8mOCkpO3RoaXMudiYxNiYmbGQoYSwxNiwhISh0aGlzLm8mMTYpKTt0aGlzLnYmNjQmJmxkKGEsNjQsISEodGhpcy5vJjY0KSk7YT10aGlzLkI7U2ModGhpcykmJmdkKHRoaXMuZigpLGEuYSgpKyItcnRsIiwhMCk7dGhpcy5pc0VuYWJsZWQoKSYma2QodGhpcyx0aGlzLmlzVmlzaWJsZSgpKTtpZih0aGlzLnYmLTImJih0aGlzLnlhJiZvZCh0aGlzLCEwKSx0aGlzLnYmMzImJihhPXRoaXMuZigpKSkpe3ZhciBiPXRoaXMuV3x8KHRoaXMuVz1uZXcgSik7emMoYixhKTtIKEgoSChPYyh0aGlzKSxiLCJrZXkiLHRoaXMuZmEpLGEsImZvY3VzIix0aGlzLk5hKSxhLCJibHVyIiwKdGhpcy5GYSl9fTt2YXIgb2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYz1PYyhhKSxkPWEuZigpO2I/KEgoSChIKEgoYyxkLEYuTCxhLmthKSxkLFtGLk0sRi5hYV0sYS5sYSksZCwibW91c2VvdmVyIixhLkFhKSxkLCJtb3VzZW91dCIsYS56YSksYS5lYSE9Y2EmJkgoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fEgoYyxkLCJkYmxjbGljayIsYS5KYSksYS5nYXx8KGEuZ2E9bmV3IHBkKGEpLHpiKGEsbGEoQWIsYS5nYSkpKSkpOihxYyhxYyhxYyhxYyhjLGQsRi5MLGEua2EpLGQsW0YuTSxGLmFhXSxhLmxhKSxkLCJtb3VzZW92ZXIiLGEuQWEpLGQsIm1vdXNlb3V0IixhLnphKSxhLmVhIT1jYSYmcWMoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fHFjKGMsZCwiZGJsY2xpY2siLGEuSmEpLEFiKGEuZ2EpLGEuZ2E9bnVsbCkpfTsKTi5wcm90b3R5cGUuUD1mdW5jdGlvbigpe04uaS5QLmNhbGwodGhpcyk7dGhpcy5XJiZGYyh0aGlzLlcpO3RoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJmtkKHRoaXMsITEpfTtOLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7Ti5pLnUuY2FsbCh0aGlzKTt0aGlzLlcmJih0aGlzLlcuTigpLGRlbGV0ZSB0aGlzLlcpO2RlbGV0ZSB0aGlzLkI7dGhpcy5nYT10aGlzLndhPXRoaXMuYmE9bnVsbH07dmFyIGhkPWZ1bmN0aW9uKGEsYil7YS5iYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm8mMSl9OwpOLnByb3RvdHlwZS5aPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYjtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0VuYWJsZWQmJiFiLmlzRW5hYmxlZCgpfHwhTyh0aGlzLDEsIWEpfHwoYXx8KHFkKHRoaXMsITEpLFAodGhpcywhMSkpLHRoaXMuaXNWaXNpYmxlKCkmJmtkKHRoaXMsYSksUSh0aGlzLDEsIWEsITApKX07CnZhciBQPWZ1bmN0aW9uKGEsYil7TyhhLDIsYikmJlEoYSwyLGIpfSxxZD1mdW5jdGlvbihhLGIpe08oYSw0LGIpJiZRKGEsNCxiKX0scmQ9ZnVuY3Rpb24oYSxiKXtPKGEsOCxiKSYmUShhLDgsYil9LHNkPWZ1bmN0aW9uKGEsYil7TyhhLDY0LGIpJiZRKGEsNjQsYil9LFE9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIWQmJjE9PWIpYS5aKCFjKTtlbHNlIGlmKGEudiZiJiZjIT0hIShhLm8mYikpe3ZhciBlPWEuQjtpZihkPWEuZigpKShlPW1kKGUsYikpJiZnZChhLGUsYyksbGQoZCxiLGMpO2Eubz1jP2Eub3xiOmEubyZ+Yn19LHRkPWZ1bmN0aW9uKGEsYixjKXtpZihhLm0mJmEubyZiJiYhYyl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTshYyYmYS5vJmImJlEoYSxiLCExKTthLnY9Yz9hLnZ8YjphLnYmfmJ9LFI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hISgyNTUmYikmJiEhKGEudiZiKX0sTz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuISEoYS52JmIpJiYhIShhLm8mCmIpIT1jJiYoIShhLksmYil8fHVjKGEsS2MoYixjKSkpJiYhYS5VfTtoPU4ucHJvdG90eXBlO2guQWE9ZnVuY3Rpb24oYSl7KCFhLnJlbGF0ZWRUYXJnZXR8fCFwYih0aGlzLmYoKSxhLnJlbGF0ZWRUYXJnZXQpKSYmdWModGhpcywiZW50ZXIiKSYmdGhpcy5pc0VuYWJsZWQoKSYmUih0aGlzLDIpJiZQKHRoaXMsITApfTtoLnphPWZ1bmN0aW9uKGEpe2EucmVsYXRlZFRhcmdldCYmcGIodGhpcy5mKCksYS5yZWxhdGVkVGFyZ2V0KXx8IXVjKHRoaXMsImxlYXZlIil8fChSKHRoaXMsNCkmJnFkKHRoaXMsITEpLFIodGhpcywyKSYmUCh0aGlzLCExKSl9O2guZWE9Y2E7Cmgua2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSxPYihhKSYmISh5JiZ6JiZhLmN0cmxLZXkpKSl7Uih0aGlzLDQpJiZxZCh0aGlzLCEwKTt2YXIgYjtpZihiPXRoaXMuQil7dmFyIGM7Yj10aGlzLnYmMzImJihjPXRoaXMuZigpKT9zYihjKSYmdGIoYyk6ITF9YiYmdGhpcy5mKCkuZm9jdXMoKX0hT2IoYSl8fHkmJnomJmEuY3RybEtleXx8YS5nKCl9O2gubGE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSx0aGlzLm8mNCYmdWQodGhpcyxhKSYmUih0aGlzLDQpJiZxZCh0aGlzLCExKSl9O2guSmE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmdWQodGhpcyxhKX07CnZhciB1ZD1mdW5jdGlvbihhLGIpe2lmKFIoYSwxNikpe3ZhciBjPSEoYS5vJjE2KTtPKGEsMTYsYykmJlEoYSwxNixjKX1SKGEsOCkmJnJkKGEsITApO1IoYSw2NCkmJnNkKGEsIShhLm8mNjQpKTtjPW5ldyBFKCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuQT1iLkEpO3JldHVybiB1YyhhLGMpfTtOLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe1IodGhpcywzMikmJk8odGhpcywzMiwhMCkmJlEodGhpcywzMiwhMCl9O04ucHJvdG90eXBlLkZhPWZ1bmN0aW9uKCl7Uih0aGlzLDQpJiZxZCh0aGlzLCExKTtSKHRoaXMsMzIpJiZPKHRoaXMsMzIsITEpJiZRKHRoaXMsMzIsITEpfTsKTi5wcm90b3R5cGUuZmE9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJjEzPT1hLmMmJnVkKHRoaXMsYSk/KGEuZygpLGEuaigpLCEwKTohMX07aWYoIWlhKE4pKXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBjbGFzcyAiK04pO2lmKCFpYShNKSl0aHJvdyBFcnJvcigiSW52YWxpZCByZW5kZXJlciBjbGFzcyAiK00pO3ZhciB2ZD1OW2phXXx8KE5bamFdPSsra2EpO1djW3ZkXT1NO1ZjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIHBkPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9ITE7dGhpcy5jPW5ldyBvYyh0aGlzKTt6Yih0aGlzLGxhKEFiLHRoaXMuYykpO2E9TmModGhpcy5iKTtIKEgoSCh0aGlzLmMsYSxGLkwsdGhpcy5oKSxhLEYuTSx0aGlzLmopLGEsImNsaWNrIix0aGlzLmcpfTtuKHBkLEMpO3ZhciB3ZD0hdnx8OTw9TnVtYmVyKGliKTsKcGQucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXt0aGlzLmE9ITF9O3BkLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7dGhpcy5hPSEwfTt2YXIgeGQ9ZnVuY3Rpb24oYSxiKXtpZighd2QpcmV0dXJuIGEuYnV0dG9uPTAsYS50eXBlPWIsYTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudHMiKTtjLmluaXRNb3VzZUV2ZW50KGIsYS5idWJibGVzLGEuY2FuY2VsYWJsZSxhLnZpZXd8fG51bGwsYS5kZXRhaWwsYS5zY3JlZW5YLGEuc2NyZWVuWSxhLmNsaWVudFgsYS5jbGllbnRZLGEuY3RybEtleSxhLmFsdEtleSxhLnNoaWZ0S2V5LGEubWV0YUtleSwwLGEucmVsYXRlZFRhcmdldHx8bnVsbCk7cmV0dXJuIGN9OwpwZC5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXtpZih0aGlzLmEpdGhpcy5hPSExO2Vsc2V7dmFyIGI9YS5iLGM9Yi5idXR0b24sZD1iLnR5cGUsZT14ZChiLCJtb3VzZWRvd24iKTt0aGlzLmIua2EobmV3IEcoZSxhLmEpKTtlPXhkKGIsIm1vdXNldXAiKTt0aGlzLmIubGEobmV3IEcoZSxhLmEpKTt3ZHx8KGIuYnV0dG9uPWMsYi50eXBlPWQpfX07cGQucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt0aGlzLmI9bnVsbDtwZC5pLnUuY2FsbCh0aGlzKX07dmFyIFM9ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO3RoaXMuZGE9Ynx8WGMuUigpO3RoaXMuSD1hfHwidmVydGljYWwifTtuKFMsSyk7aD1TLnByb3RvdHlwZTtoLkRhPW51bGw7aC5jYT1udWxsO2guZGE9bnVsbDtoLkg9bnVsbDtoLlQ9ITA7aC5PPSEwO2gubD0tMTtoLnM9bnVsbDtoLlY9ITE7aC5JPW51bGw7dmFyIHlkPWZ1bmN0aW9uKGEpe3JldHVybiBhLkRhfHxhLmYoKX07aD1TLnByb3RvdHlwZTtoLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPXRoaXMuai5iKCJESVYiLHRoaXMuZGEuYyh0aGlzKS5qb2luKCIgIikpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKGEpe3JldHVybiJESVYiPT1hLnRhZ05hbWV9O2gudmE9ZnVuY3Rpb24oYSl7dGhpcy5hPSRjKHRoaXMuZGEsdGhpcyxhKTsibm9uZSI9PWEuc3R5bGUuZGlzcGxheSYmKHRoaXMuVD0hMSl9OwpoLkQ9ZnVuY3Rpb24oKXtTLmkuRC5jYWxsKHRoaXMpO1FjKHRoaXMsZnVuY3Rpb24oYil7Yi5tJiZ6ZCh0aGlzLGIpfSx0aGlzKTt2YXIgYT10aGlzLmYoKTtiZCh0aGlzLmRhLHRoaXMpO0FkKHRoaXMsdGhpcy5UKTtIKEgoSChIKEgoSChIKEgoT2ModGhpcyksdGhpcywiZW50ZXIiLHRoaXMuV2EpLHRoaXMsImhpZ2hsaWdodCIsdGhpcy5YYSksdGhpcywidW5oaWdobGlnaHQiLHRoaXMuY2IpLHRoaXMsIm9wZW4iLHRoaXMuWWEpLHRoaXMsImNsb3NlIix0aGlzLlVhKSxhLEYuTCx0aGlzLlNhKSxxYihhKSxbRi5NLEYuYWFdLHRoaXMuVmEpLGEsW0YuTCxGLk0sRi5hYSwibW91c2VvdmVyIiwibW91c2VvdXQiLCJjb250ZXh0bWVudSJdLHRoaXMuVGEpO0JkKHRoaXMpfTt2YXIgQmQ9ZnVuY3Rpb24oYSl7dmFyIGI9T2MoYSksYz15ZChhKTtIKEgoSChiLGMsImZvY3VzIixhLkhhKSxjLCJibHVyIixhLlFhKSxhLmNhfHwoYS5jYT1uZXcgSih5ZChhKSkpLCJrZXkiLGEuUmEpfTtoPVMucHJvdG90eXBlOwpoLlA9ZnVuY3Rpb24oKXtDZCh0aGlzLC0xKTt0aGlzLnMmJnNkKHRoaXMucywhMSk7dGhpcy5WPSExO1MuaS5QLmNhbGwodGhpcyl9O2gudT1mdW5jdGlvbigpe1MuaS51LmNhbGwodGhpcyk7dGhpcy5jYSYmKHRoaXMuY2EuTigpLHRoaXMuY2E9bnVsbCk7dGhpcy5kYT10aGlzLnM9dGhpcy5JPXRoaXMuRGE9bnVsbH07aC5XYT1mdW5jdGlvbigpe3JldHVybiEwfTsKaC5YYT1mdW5jdGlvbihhKXt2YXIgYj1UYyh0aGlzLGEudGFyZ2V0KTtpZigtMTxiJiZiIT10aGlzLmwpe3ZhciBjPUwodGhpcyx0aGlzLmwpO2MmJlAoYywhMSk7dGhpcy5sPWI7Yz1MKHRoaXMsdGhpcy5sKTt0aGlzLlYmJnFkKGMsITApO3RoaXMucyYmYyE9dGhpcy5zJiYoYy52JjY0P3NkKGMsITApOnNkKHRoaXMucywhMSkpfWI9dGhpcy5mKCk7cShiLCJUaGUgRE9NIGVsZW1lbnQgZm9yIHRoZSBjb250YWluZXIgY2Fubm90IGJlIG51bGwuIik7bnVsbCE9YS50YXJnZXQuZigpJiZ4YihiLCJhY3RpdmVkZXNjZW5kYW50IixhLnRhcmdldC5mKCkuaWQpfTtoLmNiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT1MKHRoaXMsdGhpcy5sKSYmKHRoaXMubD0tMSk7YT10aGlzLmYoKTtxKGEsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnJlbW92ZUF0dHJpYnV0ZSh3YigiYWN0aXZlZGVzY2VuZGFudCIpKX07CmguWWE9ZnVuY3Rpb24oYSl7KGE9YS50YXJnZXQpJiZhIT10aGlzLnMmJmEuYj09dGhpcyYmKHRoaXMucyYmc2QodGhpcy5zLCExKSx0aGlzLnM9YSl9O2guVWE9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMucyYmKHRoaXMucz1udWxsKTt2YXIgYj10aGlzLmYoKSxjPWEudGFyZ2V0LmYoKTtiJiZhLnRhcmdldC5vJjImJmMmJihhPSIiLGMmJihhPWMuaWQscShhLCJUaGUgYWN0aXZlIGVsZW1lbnQgc2hvdWxkIGhhdmUgYW4gaWQuIikpLHhiKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEpKX07aC5TYT1mdW5jdGlvbihhKXt0aGlzLk8mJih0aGlzLlY9ITApO3ZhciBiPXlkKHRoaXMpO2ImJnNiKGIpJiZ0YihiKT9iLmZvY3VzKCk6YS5nKCl9O2guVmE9ZnVuY3Rpb24oKXt0aGlzLlY9ITF9OwpoLlRhPWZ1bmN0aW9uKGEpe2E6e3ZhciBiPWEudGFyZ2V0O2lmKHRoaXMuSSlmb3IodmFyIGM9dGhpcy5mKCk7YiYmYiE9PWM7KXt2YXIgZD1iLmlkO2lmKGQgaW4gdGhpcy5JKXtiPXRoaXMuSVtkXTticmVhayBhfWI9Yi5wYXJlbnROb2RlfWI9bnVsbH1pZihiKXN3aXRjaChhLnR5cGUpe2Nhc2UgRi5MOmIua2EoYSk7YnJlYWs7Y2FzZSBGLk06Y2FzZSBGLmFhOmIubGEoYSk7YnJlYWs7Y2FzZSAibW91c2VvdmVyIjpiLkFhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3V0IjpiLnphKGEpO2JyZWFrO2Nhc2UgImNvbnRleHRtZW51IjpiLmVhKGEpfX07aC5IYT1mdW5jdGlvbigpe307aC5RYT1mdW5jdGlvbigpe0NkKHRoaXMsLTEpO3RoaXMuVj0hMTt0aGlzLnMmJnNkKHRoaXMucywhMSl9OwpoLlJhPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmlzRW5hYmxlZCgpJiZ0aGlzLmlzVmlzaWJsZSgpJiYoMCE9UmModGhpcyl8fHRoaXMuRGEpJiZEZCh0aGlzLGEpPyhhLmcoKSxhLmooKSwhMCk6ITF9Owp2YXIgRGQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1MKGEsYS5sKTtpZihjJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5mYSYmYy5mYShiKXx8YS5zJiZhLnMhPWMmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLnMuZmEmJmEucy5mYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuYyl7Y2FzZSAyNzp5ZChhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpFZChhKTticmVhaztjYXNlIDM1OkZkKGEpO2JyZWFrO2Nhc2UgMzg6aWYoInZlcnRpY2FsIj09YS5IKUdkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9IZChhKTpHZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoInZlcnRpY2FsIj09YS5IKUhkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9HZChhKTpIZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSx6ZD1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZigpO2M9Yy5pZHx8KGMuaWQ9TGMoYikpO2EuSXx8KGEuST17fSk7YS5JW2NdPWJ9O1MucHJvdG90eXBlLnNhPWZ1bmN0aW9uKGEsYil7Q2EoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtTLmkuc2EuY2FsbCh0aGlzLGEsYil9O1MucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEsYixjKXtDYShhLE4pO2EuS3w9MjthLkt8PTY0O3RkKGEsMzIsITEpO2EubSYmMCE9YS55YSYmb2QoYSwhMSk7YS55YT0hMTt2YXIgZD1hLmI9PXRoaXM/VGModGhpcyxhKTotMTtTLmkudGEuY2FsbCh0aGlzLGEsYixjKTthLm0mJnRoaXMubSYmemQodGhpcyxhKTthPWQ7LTE9PWEmJihhPVJjKHRoaXMpKTthPT10aGlzLmw/dGhpcy5sPU1hdGgubWluKFJjKHRoaXMpLTEsYik6YT50aGlzLmwmJmI8PXRoaXMubD90aGlzLmwrKzphPHRoaXMubCYmYj50aGlzLmwmJnRoaXMubC0tfTsKdmFyIGFkPWZ1bmN0aW9uKGEsYil7aWYoYS5mKCkpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5IPWJ9O1MucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O3ZhciBBZD1mdW5jdGlvbihhLGIpe2EuVD1iO3ZhciBjPWEuZigpO2MmJihjLnN0eWxlLmRpc3BsYXk9Yj8iIjoibm9uZSIsWWMoeWQoYSksYS5PJiZhLlQpKX07Uy5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT307Uy5wcm90b3R5cGUuWj1mdW5jdGlvbihhKXt0aGlzLk8hPWEmJnVjKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5PPSEwLFFjKHRoaXMsZnVuY3Rpb24oYil7Yi5MYT9kZWxldGUgYi5MYTpiLlooITApfSkpOihRYyh0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5aKCExKTpiLkxhPSEwfSksdGhpcy5WPXRoaXMuTz0hMSksWWMoeWQodGhpcyksYSYmdGhpcy5UKSl9Owp2YXIgQ2Q9ZnVuY3Rpb24oYSxiKXsoYj1MKGEsYikpP1AoYiwhMCk6LTE8YS5sJiZQKEwoYSxhLmwpLCExKX0sRWQ9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LFJjKGEpLTEpfSxGZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiAwPmI/Yy0xOmJ9LDApfSxIZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7cmV0dXJuKGIrMSklY30sYS5sKX0sR2Q9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe2ItLTtyZXR1cm4gMD5iP2MtMTpifSxhLmwpfSxJZD1mdW5jdGlvbihhLGIsYyl7Yz0wPmM/VGMoYSxhLnMpOmM7dmFyIGQ9UmMoYSk7Yz1iLmNhbGwoYSxjLGQpO2Zvcih2YXIgZT0wO2U8PWQ7KXt2YXIgZj1MKGEsYyksZztpZihnPWYpZz1mLmlzVmlzaWJsZSgpJiZmLmlzRW5hYmxlZCgpJiYhIShmLnYmMik7aWYoZyl7YS5FYShjKTticmVha31lKys7Yz1iLmNhbGwoYSxjLGQpfX07ClMucHJvdG90eXBlLkVhPWZ1bmN0aW9uKGEpe0NkKHRoaXMsYSl9O3ZhciBUPWZ1bmN0aW9uKCl7fTtuKFQsTSk7ZGEoVCk7VC5wcm90b3R5cGUuYT1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYiJ9O1QucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXtyZXR1cm4idGFiIn07VC5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYj1ULmkuYy5jYWxsKHRoaXMsYSk7KGE9YS5QYSkmJmImJihiLnRpdGxlPWF8fCIiKTtyZXR1cm4gYn07VC5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIpe2I9VC5pLmcuY2FsbCh0aGlzLGEsYik7dmFyIGM9Yi50aXRsZXx8IiI7YyYmKGEuUGE9Yyk7YS5vJjgmJihjPWEuYikmJmlhKGMuRykmJihRKGEsOCwhMSksYy5HKGEpKTtyZXR1cm4gYn07dmFyIEpkPWZ1bmN0aW9uKGEsYixjKXtOLmNhbGwodGhpcyxhLGJ8fFQuUigpLGMpO3RkKHRoaXMsOCwhMCk7dGhpcy5LfD05fTtuKEpkLE4pO1ZjKCJnb29nLXRhYiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEpkKG51bGwpfSk7dmFyIFU9ZnVuY3Rpb24oKXt0aGlzLmg9InRhYmxpc3QifTtuKFUsWGMpO2RhKFUpO1UucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWItYmFyIn07VS5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIsYyl7dGhpcy5qfHwodGhpcy5hfHxLZCh0aGlzKSx0aGlzLmo9c2EodGhpcy5hKSk7dmFyIGQ9dGhpcy5qW2JdO2Q/KGFkKGEsTGQoZCkpLGEuQj1kKTpVLmkuZy5jYWxsKHRoaXMsYSxiLGMpfTtVLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPVUuaS5jLmNhbGwodGhpcyxhKTt0aGlzLmF8fEtkKHRoaXMpO2IucHVzaCh0aGlzLmFbYS5CXSk7cmV0dXJuIGJ9O3ZhciBLZD1mdW5jdGlvbihhKXt2YXIgYj1hLmIoKTthLmE9e3RvcDpiKyItdG9wIixib3R0b206YisiLWJvdHRvbSIsc3RhcnQ6YisiLXN0YXJ0IixlbmQ6YisiLWVuZCJ9fTt2YXIgVj1mdW5jdGlvbihhLGIsYyl7YT1hfHwidG9wIjthZCh0aGlzLExkKGEpKTt0aGlzLkI9YTtTLmNhbGwodGhpcyx0aGlzLkgsYnx8VS5SKCksYyk7TWQodGhpcyl9O24oVixTKTtoPVYucHJvdG90eXBlO2guQz1udWxsO2guRD1mdW5jdGlvbigpe1YuaS5ELmNhbGwodGhpcyk7TWQodGhpcyl9O2gudT1mdW5jdGlvbigpe1YuaS51LmNhbGwodGhpcyk7dGhpcy5DPW51bGx9O2guRWE9ZnVuY3Rpb24oYSl7Vi5pLkVhLmNhbGwodGhpcyxhKTt0aGlzLkcoTCh0aGlzLGEpKX07aC5HPWZ1bmN0aW9uKGEpe2E/cmQoYSwhMCk6dGhpcy5DJiZyZCh0aGlzLkMsITEpfTsKdmFyIE5kPWZ1bmN0aW9uKGEsYil7aWYoYiYmYj09YS5DKXtmb3IodmFyIGM9VGMoYSxiKSxkPWMtMTtiPUwoYSxkKTtkLS0pe3ZhciBlPWI7aWYoZS5pc1Zpc2libGUoKSYmZS5pc0VuYWJsZWQoKSl7YS5HKGIpO3JldHVybn19Zm9yKGMrPTE7Yj1MKGEsYyk7YysrKWlmKGQ9YixkLmlzVmlzaWJsZSgpJiZkLmlzRW5hYmxlZCgpKXthLkcoYik7cmV0dXJufWEuRyhudWxsKX19O2g9Vi5wcm90b3R5cGU7aC5hYj1mdW5jdGlvbihhKXt0aGlzLkMmJnRoaXMuQyE9YS50YXJnZXQmJnJkKHRoaXMuQywhMSk7dGhpcy5DPWEudGFyZ2V0fTtoLmJiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT10aGlzLkMmJih0aGlzLkM9bnVsbCl9O2guWmE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guJGE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guSGE9ZnVuY3Rpb24oKXtMKHRoaXMsdGhpcy5sKXx8Q2QodGhpcyxUYyh0aGlzLHRoaXMuQ3x8TCh0aGlzLDApKSl9Owp2YXIgTWQ9ZnVuY3Rpb24oYSl7SChIKEgoSChPYyhhKSxhLCJzZWxlY3QiLGEuYWIpLGEsInVuc2VsZWN0IixhLmJiKSxhLCJkaXNhYmxlIixhLlphKSxhLCJoaWRlIixhLiRhKX0sTGQ9ZnVuY3Rpb24oYSl7cmV0dXJuInN0YXJ0Ij09YXx8ImVuZCI9PWE/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O1ZjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBWfSk7ZnVuY3Rpb24gT2QoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIFBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgZz1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIrZyk7Zm9yKHZhciBrPVtdLHA9YmEoYyksdz1wLm5leHQoKTshdy5kb25lO3c9cC5uZXh0KCkpe3c9dy52YWx1ZTt2YXIgQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKQi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO0IudGV4dENvbnRlbnQ9dztmLmFwcGVuZENoaWxkKEIpO2sucHVzaChCKX0iYm90dG9tIiE9ZyYmZS5hcHBlbmRDaGlsZChmKTtwPW51bGw7aWYoInRvcCI9PWd8fCJib3R0b20iPT1nKXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTsidG9wIj09ZyYmcCYmZS5hcHBlbmRDaGlsZChwKTtCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0IuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciByYT1bXTtjPWJhKGMpO2Zvcih3PWMubmV4dCgpOyF3LmRvbmU7dz1jLm5leHQoKSl3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHcuaWQ9ZS5pZCsiX2NvbnRlbnRfIityYS5sZW5ndGgsdy5zdHlsZS5kaXNwbGF5PSJub25lIixCLmFwcGVuZENoaWxkKHcpLHJhLnB1c2godyk7ZS5hcHBlbmRDaGlsZChCKTsiYm90dG9tIj09ZyYmKHAmJgplLmFwcGVuZENoaWxkKHApLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBYPW5ldyBWKGcpO1BjKFgsZik7dmFyIFk9LTE7ZGMoWCwic2VsZWN0IixmdW5jdGlvbihaKXtaPWsuaW5kZXhPZihaLnRhcmdldC5mKCkpO1ohPVkmJigwPD1ZJiZZPHJhLmxlbmd0aCYmKHJhW1ldLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFk9LTEpLDA8PVomJlo8cmEubGVuZ3RoJiYoWT1aLHJhW1ldLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksWC5HKEwoWCxZKSkpfSk7WC5HKEwoWCxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFope1guRyhMKFgsWikpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChPZChhKSl9LFFkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sVz1sOwpRZFswXWluIFd8fCJ1bmRlZmluZWQiPT10eXBlb2YgVy5leGVjU2NyaXB0fHxXLmV4ZWNTY3JpcHQoInZhciAiK1FkWzBdKTtmb3IodmFyIFJkO1FkLmxlbmd0aCYmKFJkPVFkLnNoaWZ0KCkpOylRZC5sZW5ndGh8fHZvaWQgMD09PVBkP1dbUmRdJiZXW1JkXSE9PU9iamVjdC5wcm90b3R5cGVbUmRdP1c9V1tSZF06Vz1XW1JkXT17fTpXW1JkXT1QZDt9KS5jYWxsKHRoaXMpOwovLyBjbGFuZy1mb3JtYXQgb24K", + "headers": [ + [ + "content-type", + "application/javascript" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + } + } + }, + "executionInfo": { + "elapsed": 5908, + "status": "ok", + "timestamp": 1600709613559, + "user": { + "displayName": "Evgeny Skvortsov", + "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhiQjODaOVLfYnUuWS9rB3LRntzJDM0hqElzsUkdQ=s64", + "userId": "11510585406840398626" + }, + "user_tz": 420 + }, + "id": "VXX6gSt-m72D", + "outputId": "955ad260-8550-4ea6-95da-1d876cde3491" + }, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id7" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id7" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id7" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"91086b0a-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id7\", \"tabNames\": [\"StructureTest\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_3e636b10ae" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id7" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9108b45c-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id7\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_6a35ed4c58" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id7" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9109cd60-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_47dfd1ac5c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_1", + "outputarea_id7" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"910a1400-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id7_content_1\");\n", + "//# sourceURL=js_f6962ff4b0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_1", + "outputarea_id7" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"910a5a0a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"910a1400-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_ee71304046" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_1", + "outputarea_id7" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"910a9cfe-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id7\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_b3b5fe11a9" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_1", + "outputarea_id7" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running StructureTest\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"910c2e52-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9109cd60-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_0abacdd1c3" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_1", + "outputarea_id7" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"910d9260-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_02d8437e91" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_0", + "outputarea_id7" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"910de15c-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id7_content_0\");\n", + "//# sourceURL=js_90a81e9fcd" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_0", + "outputarea_id7" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"910e27ac-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"910de15c-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_a7af3853ba" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_0", + "outputarea_id7" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"910e6cee-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id7\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_78bf0fb119" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_0", + "outputarea_id7" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_0", + "outputarea_id7", + "outputarea_id8", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_0", + "outputarea_id7", + "outputarea_id8", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_0", + "outputarea_id7", + "outputarea_id8", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"910ff1fe-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id8\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_1b52e8696b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_0", + "outputarea_id7", + "outputarea_id8", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"91103966-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id8\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_b9fa4ee6dc" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_0", + "outputarea_id7", + "outputarea_id8", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"91115e22-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_1c2694fc0d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_0", + "id8_content_0", + "outputarea_id7", + "outputarea_id8", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9111a242-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id8_content_0\");\n", + "//# sourceURL=js_7dd5a968a7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_0", + "id8_content_0", + "outputarea_id7", + "outputarea_id8", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9111e50e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9111a242-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_1615eefea6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_0", + "id8_content_0", + "outputarea_id7", + "outputarea_id8", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9112242e-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id8\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_2e272cfe34" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_0", + "id8_content_0", + "outputarea_id7", + "outputarea_id8", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mStructureTest_sql\u001b[0m variable.\n", + "SELECT * FROM (\n", + " \n", + " SELECT\n", + " STRUCT(1 AS x, 2 AS y, STRUCT(\"hello\" AS w, \"world\" AS v) AS z) AS a\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " STRUCT(3 AS x, 4 AS y, STRUCT(\"bonjour\" AS w, \"monde\" AS v) AS z) AS a\n", + " \n", + ") ;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"91131c62-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"91115e22-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_87a4642e10" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_0", + "id8_content_0", + "outputarea_id7", + "outputarea_id8", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"91143412-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"910d9260-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_8d713cf856" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_0", + "outputarea_id7" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"911599b0-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_20c13ceb3f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_1", + "outputarea_id7" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9115e9a6-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id7_content_1\");\n", + "//# sourceURL=js_7a5e95bbef" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_1", + "outputarea_id7" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"91163474-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9115e9a6-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_6ecc440dd4" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_1", + "outputarea_id7" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"91167ad8-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id7\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_ba64a7ee71" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_1", + "outputarea_id7" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"925c3c7a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"911599b0-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_84ef9c61f6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_1", + "outputarea_id7" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"925f0798-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_cb31d49091" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_0", + "outputarea_id7" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"925f7b88-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id7_content_0\");\n", + "//# sourceURL=js_dfd4fd1199" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_0", + "outputarea_id7" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"92601e12-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"925f7b88-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_ac01204e75" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_0", + "outputarea_id7" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"92613928-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id7\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_be0e4be8a4" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_0", + "outputarea_id7" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9262be6a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_6633ca6e60" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_0", + "id8_content_1", + "outputarea_id7", + "outputarea_id8", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"92630186-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id8_content_1\");\n", + "//# sourceURL=js_105bb291fd" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_0", + "id8_content_1", + "outputarea_id7", + "outputarea_id8", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9264839e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"92630186-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_e89555ecd4" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_0", + "id8_content_1", + "outputarea_id7", + "outputarea_id8", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9264d858-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id8\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_8150bd46b6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_0", + "id8_content_1", + "outputarea_id7", + "outputarea_id8", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mStructureTest\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
a
0{'x': 1, 'y': 2, 'z': {'w': 'hello', 'v': 'wor...
1{'x': 3, 'y': 4, 'z': {'w': 'bonjour', 'v': 'm...
\n", + "
" + ], + "text/plain": [ + " a\n", + "0 {'x': 1, 'y': 2, 'z': {'w': 'hello', 'v': 'wor...\n", + "1 {'x': 3, 'y': 4, 'z': {'w': 'bonjour', 'v': 'm..." + ] + }, + "metadata": { + "tags": [ + "id7_content_0", + "id8_content_1", + "outputarea_id7", + "outputarea_id8", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"92685168-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9262be6a-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_cdb2e9e604" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_0", + "id8_content_1", + "outputarea_id7", + "outputarea_id8", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"92699776-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"925f0798-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_47dc8d01f2" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id7_content_0", + "outputarea_id7" + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "%%logica StructureTest\n", + "\n", + "StructureTest(a: {x: 1, y: 2, z: { w: \"hello\", v: \"world\"}});\n", + "StructureTest(a: {x: 3, y: 4, z: { w: \"bonjour\", v: \"monde\"}});" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "executionInfo": { + "elapsed": 5925, + "status": "ok", + "timestamp": 1600709613583, + "user": { + "displayName": "Evgeny Skvortsov", + "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhiQjODaOVLfYnUuWS9rB3LRntzJDM0hqElzsUkdQ=s64", + "userId": "11510585406840398626" + }, + "user_tz": 420 + }, + "id": "4sV4SJjMnRKs", + "outputId": "e21f51bd-d7db-48cc-f058-6754fd6a2e64" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "hello\n" + ] + } + ], + "source": [ + "print(StructureTest['a'].values[0]['z']['w'])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "IWqb0W3-Z2Ji" + }, + "source": [ + "### Variables\n", + "\n", + "You can define auxiliary variables. Both assignment and comparison is done via `==`. A single equality sign is reserved for function definition (see Functions section)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 177, + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH0=", + "headers": [ + [ + "content-type", + "text/css" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgaCxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9ZnVuY3Rpb24oYSl7dmFyIGI9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmYVtTeW1ib2wuaXRlcmF0b3JdO3JldHVybiBiP2IuY2FsbChhKTp7bmV4dDphYShhKX19LGw9dGhpc3x8c2VsZixjYT1mdW5jdGlvbigpe30sZGE9ZnVuY3Rpb24oYSl7YS5CYT12b2lkIDA7YS5SPWZ1bmN0aW9uKCl7cmV0dXJuIGEuQmE/YS5CYTphLkJhPW5ldyBhfX0sZWE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7aWYoIm9iamVjdCI9PWIpaWYoYSl7aWYoYSBpbnN0YW5jZW9mIEFycmF5KXJldHVybiJhcnJheSI7aWYoYSBpbnN0YW5jZW9mIE9iamVjdClyZXR1cm4gYjt2YXIgYz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk7aWYoIltvYmplY3QgV2luZG93XSI9PWMpcmV0dXJuIm9iamVjdCI7CmlmKCJbb2JqZWN0IEFycmF5XSI9PWN8fCJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGgmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5zcGxpY2UmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoInNwbGljZSIpKXJldHVybiJhcnJheSI7aWYoIltvYmplY3QgRnVuY3Rpb25dIj09Y3x8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmNhbGwmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoImNhbGwiKSlyZXR1cm4iZnVuY3Rpb24ifWVsc2UgcmV0dXJuIm51bGwiO2Vsc2UgaWYoImZ1bmN0aW9uIj09YiYmInVuZGVmaW5lZCI9PXR5cGVvZiBhLmNhbGwpcmV0dXJuIm9iamVjdCI7cmV0dXJuIGJ9LGZhPWZ1bmN0aW9uKGEpe3JldHVybiJhcnJheSI9PWVhKGEpfSxoYT1mdW5jdGlvbihhKXt2YXIgYj1lYShhKTtyZXR1cm4iYXJyYXkiPT1ifHwib2JqZWN0Ij09CmImJiJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGh9LGlhPWZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PWVhKGEpfSxtPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBhO3JldHVybiJvYmplY3QiPT1iJiZudWxsIT1hfHwiZnVuY3Rpb24iPT1ifSxqYT0iY2xvc3VyZV91aWRfIisoMUU5Kk1hdGgucmFuZG9tKCk+Pj4wKSxrYT0wLGxhPWZ1bmN0aW9uKGEsYil7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe3ZhciBkPWMuc2xpY2UoKTtkLnB1c2guYXBwbHkoZCxhcmd1bWVudHMpO3JldHVybiBhLmFwcGx5KHRoaXMsZCl9fSxuPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe31jLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLmk9Yi5wcm90b3R5cGU7YS5wcm90b3R5cGU9bmV3IGM7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YX07dmFyIG1hLG5hPXtlYjoiYWN0aXZlZGVzY2VuZGFudCIsamI6ImF0b21pYyIsa2I6ImF1dG9jb21wbGV0ZSIsbWI6ImJ1c3kiLHBiOiJjaGVja2VkIixxYjoiY29saW5kZXgiLHZiOiJjb250cm9scyIseGI6ImRlc2NyaWJlZGJ5IixBYjoiZGlzYWJsZWQiLENiOiJkcm9wZWZmZWN0IixEYjoiZXhwYW5kZWQiLEViOiJmbG93dG8iLEdiOiJncmFiYmVkIixLYjoiaGFzcG9wdXAiLE1iOiJoaWRkZW4iLE9iOiJpbnZhbGlkIixQYjoibGFiZWwiLFFiOiJsYWJlbGxlZGJ5IixSYjoibGV2ZWwiLFdiOiJsaXZlIixrYzoibXVsdGlsaW5lIixsYzoibXVsdGlzZWxlY3RhYmxlIixwYzoib3JpZW50YXRpb24iLHFjOiJvd25zIixyYzoicG9zaW5zZXQiLHRjOiJwcmVzc2VkIix4YzoicmVhZG9ubHkiLHpjOiJyZWxldmFudCIsQWM6InJlcXVpcmVkIixFYzoicm93aW5kZXgiLEhjOiJzZWxlY3RlZCIsSmM6InNldHNpemUiLExjOiJzb3J0IixaYzoidmFsdWVtYXgiLCRjOiJ2YWx1ZW1pbiIsYWQ6InZhbHVlbm93IiwKYmQ6InZhbHVldGV4dCJ9O3ZhciBvYT1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkIGluIGEpYi5jYWxsKGMsYVtkXSxkLGEpfSxwYT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyBpbiBhKWlmKGFbY109PWIpcmV0dXJuITA7cmV0dXJuITF9LHFhPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsIT09YSYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfSxzYT1mdW5jdGlvbihhKXt2YXIgYj17fSxjO2ZvcihjIGluIGEpYlthW2NdXT1jO3JldHVybiBifSx0YT0iY29uc3RydWN0b3IgaGFzT3duUHJvcGVydHkgaXNQcm90b3R5cGVPZiBwcm9wZXJ0eUlzRW51bWVyYWJsZSB0b0xvY2FsZVN0cmluZyB0b1N0cmluZyB2YWx1ZU9mIi5zcGxpdCgiICIpLHVhPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8dGEubGVuZ3RoO2YrKyljPQp0YVtmXSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZCxjKSYmKGFbY109ZFtjXSl9fTt2YXIgdmE9e2ZiOiJhbGVydCIsZ2I6ImFsZXJ0ZGlhbG9nIixoYjoiYXBwbGljYXRpb24iLGliOiJhcnRpY2xlIixsYjoiYmFubmVyIixuYjoiYnV0dG9uIixvYjoiY2hlY2tib3giLHJiOiJjb2x1bW5oZWFkZXIiLHNiOiJjb21ib2JveCIsdGI6ImNvbXBsZW1lbnRhcnkiLHViOiJjb250ZW50aW5mbyIsd2I6ImRlZmluaXRpb24iLHliOiJkaWFsb2ciLHpiOiJkaXJlY3RvcnkiLEJiOiJkb2N1bWVudCIsRmI6ImZvcm0iLEhiOiJncmlkIixJYjoiZ3JpZGNlbGwiLEpiOiJncm91cCIsTGI6ImhlYWRpbmciLE5iOiJpbWciLFNiOiJsaW5rIixUYjoibGlzdCIsVWI6Imxpc3Rib3giLFZiOiJsaXN0aXRlbSIsWGI6ImxvZyIsWWI6Im1haW4iLFpiOiJtYXJxdWVlIiwkYjoibWF0aCIsYWM6Im1lbnUiLGJjOiJtZW51YmFyIixjYzoibWVudWl0ZW0iLGRjOiJtZW51aXRlbWNoZWNrYm94IixlYzoibWVudWl0ZW1yYWRpbyIsbWM6Im5hdmlnYXRpb24iLG5jOiJub3RlIixvYzoib3B0aW9uIiwKc2M6InByZXNlbnRhdGlvbiIsdWM6InByb2dyZXNzYmFyIix2YzoicmFkaW8iLHdjOiJyYWRpb2dyb3VwIix5YzoicmVnaW9uIixCYzoicm93IixDYzoicm93Z3JvdXAiLERjOiJyb3doZWFkZXIiLEZjOiJzY3JvbGxiYXIiLEdjOiJzZWFyY2giLEljOiJzZXBhcmF0b3IiLEtjOiJzbGlkZXIiLE1jOiJzcGluYnV0dG9uIixOYzoic3RhdHVzIixPYzoidGFiIixQYzoidGFibGlzdCIsUWM6InRhYnBhbmVsIixSYzoidGV4dGJveCIsU2M6InRleHRpbmZvIixUYzoidGltZXIiLFVjOiJ0b29sYmFyIixWYzoidG9vbHRpcCIsV2M6InRyZWUiLFhjOiJ0cmVlZ3JpZCIsWWM6InRyZWVpdGVtIn07dmFyIHdhPWZ1bmN0aW9uKGEpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsd2EpO2Vsc2V7dmFyIGI9RXJyb3IoKS5zdGFjaztiJiYodGhpcy5zdGFjaz1iKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSl9O24od2EsRXJyb3IpO3dhLnByb3RvdHlwZS5uYW1lPSJDdXN0b21FcnJvciI7dmFyIHhhO3ZhciB5YT1mdW5jdGlvbihhLGIpe2E9YS5zcGxpdCgiJXMiKTtmb3IodmFyIGM9IiIsZD1hLmxlbmd0aC0xLGU9MDtlPGQ7ZSsrKWMrPWFbZV0rKGU8Yi5sZW5ndGg/YltlXToiJXMiKTt3YS5jYWxsKHRoaXMsYythW2RdKX07bih5YSx3YSk7eWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjsKdmFyIHphPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSJBc3NlcnRpb24gZmFpbGVkIjtpZihjKXtlKz0iOiAiK2M7dmFyIGY9ZH1lbHNlIGEmJihlKz0iOiAiK2EsZj1iKTt0aHJvdyBuZXcgeWEoIiIrZSxmfHxbXSk7fSxxPWZ1bmN0aW9uKGEsYixjKXthfHx6YSgiIixudWxsLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX0sQWE9ZnVuY3Rpb24oYSxiLGMpe20oYSkmJjE9PWEubm9kZVR5cGV8fHphKCJFeHBlY3RlZCBFbGVtZW50IGJ1dCBnb3QgJXM6ICVzLiIsW2VhKGEpLGFdLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKX0sQ2E9ZnVuY3Rpb24oYSxiLGMsZCl7YSBpbnN0YW5jZW9mIGJ8fHphKCJFeHBlY3RlZCBpbnN0YW5jZW9mICVzIGJ1dCBnb3QgJXMuIixbQmEoYiksQmEoYSldLGMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpKX0sQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZgpGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTpudWxsPT09YT8ibnVsbCI6dHlwZW9mIGF9O3ZhciBEYT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3EobnVsbCE9YS5sZW5ndGgpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKCJzdHJpbmciPT09dHlwZW9mIGEpcmV0dXJuInN0cmluZyIhPT10eXBlb2YgYnx8MSE9Yi5sZW5ndGg/LTE6YS5pbmRleE9mKGIsMCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspaWYoYyBpbiBhJiZhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX0scj1BcnJheS5wcm90b3R5cGUuZm9yRWFjaD9mdW5jdGlvbihhLGIsYyl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsYyl9OmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9YS5sZW5ndGgsZT0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZj0wO2Y8ZDtmKyspZiBpbiBlJiZiLmNhbGwoYyxlW2ZdLGYsYSl9LEVhPUFycmF5LnByb3RvdHlwZS5maWx0ZXI/CmZ1bmN0aW9uKGEsYil7cShudWxsIT1hLmxlbmd0aCk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD1bXSxlPTAsZj0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZz0wO2c8YztnKyspaWYoZyBpbiBmKXt2YXIgaz1mW2ddO2IuY2FsbCh2b2lkIDAsayxnLGEpJiYoZFtlKytdPWspfXJldHVybiBkfSxGYT1BcnJheS5wcm90b3R5cGUuZXZlcnk/ZnVuY3Rpb24oYSxiKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmV2ZXJ5LmNhbGwoYSxiLHZvaWQgMCl9OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWEubGVuZ3RoLGQ9InN0cmluZyI9PT10eXBlb2YgYT9hLnNwbGl0KCIiKTphLGU9MDtlPGM7ZSsrKWlmKGUgaW4gZCYmIWIuY2FsbCh2b2lkIDAsZFtlXSxlLGEpKXJldHVybiExO3JldHVybiEwfSxHYT1mdW5jdGlvbihhLGIpe3JldHVybiAwPD0KRGEoYSxiKX0sSGE9ZnVuY3Rpb24oYSxiKXtiPURhKGEsYik7dmFyIGM7aWYoYz0wPD1iKXEobnVsbCE9YS5sZW5ndGgpLEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhLGIsMSk7cmV0dXJuIGN9LElhPWZ1bmN0aW9uKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGFyZ3VtZW50cyl9LEphPWZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDA8Yil7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX0sTGE9ZnVuY3Rpb24oYSxiLGMsZCl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShhLEthKGFyZ3VtZW50cywxKSl9LEthPWZ1bmN0aW9uKGEsYixjKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gMj49YXJndW1lbnRzLmxlbmd0aD9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsYixjKX07dmFyIE1hPVN0cmluZy5wcm90b3R5cGUudHJpbT9mdW5jdGlvbihhKXtyZXR1cm4gYS50cmltKCl9OmZ1bmN0aW9uKGEpe3JldHVybi9eW1xzXHhhMF0qKFtcc1xTXSo/KVtcc1x4YTBdKiQvLmV4ZWMoYSlbMV19LE5hPS8mL2csT2E9LzwvZyxQYT0vPi9nLFFhPS8iL2csUmE9LycvZyxTYT0vXHgwMC9nLFRhPS9bXHgwMCY8PiInXS8sdD1mdW5jdGlvbihhLGIpe3JldHVybi0xIT1hLmluZGV4T2YoYil9LFVhPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE8Yj8tMTphPmI/MTowfTt2YXIgdTthOnt2YXIgVmE9bC5uYXZpZ2F0b3I7aWYoVmEpe3ZhciBXYT1WYS51c2VyQWdlbnQ7aWYoV2Epe3U9V2E7YnJlYWsgYX19dT0iIn07LyoKCiBDb3B5cmlnaHQgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzLgogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKKi8KdmFyIFhhPWZ1bmN0aW9uKGEpe1RhLnRlc3QoYSkmJigtMSE9YS5pbmRleE9mKCImIikmJihhPWEucmVwbGFjZShOYSwiJmFtcDsiKSksLTEhPWEuaW5kZXhPZigiPCIpJiYoYT1hLnJlcGxhY2UoT2EsIiZsdDsiKSksLTEhPWEuaW5kZXhPZigiPiIpJiYoYT1hLnJlcGxhY2UoUGEsIiZndDsiKSksLTEhPWEuaW5kZXhPZignIicpJiYoYT1hLnJlcGxhY2UoUWEsIiZxdW90OyIpKSwtMSE9YS5pbmRleE9mKCInIikmJihhPWEucmVwbGFjZShSYSwiJiMzOTsiKSksLTEhPWEuaW5kZXhPZigiXHgwMCIpJiYoYT1hLnJlcGxhY2UoU2EsIiYjMDsiKSkpO3JldHVybiBhfTt2YXIgWWE9ZnVuY3Rpb24oYSl7WWFbIiAiXShhKTtyZXR1cm4gYX07WWFbIiAiXT1jYTt2YXIgJGE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1aYTtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsYSk/Y1thXTpjW2FdPWIoYSl9O3ZhciBhYj10KHUsIk9wZXJhIiksdj10KHUsIlRyaWRlbnQiKXx8dCh1LCJNU0lFIiksYmI9dCh1LCJFZGdlIikseD10KHUsIkdlY2tvIikmJiEodCh1LnRvTG93ZXJDYXNlKCksIndlYmtpdCIpJiYhdCh1LCJFZGdlIikpJiYhKHQodSwiVHJpZGVudCIpfHx0KHUsIk1TSUUiKSkmJiF0KHUsIkVkZ2UiKSx5PXQodS50b0xvd2VyQ2FzZSgpLCJ3ZWJraXQiKSYmIXQodSwiRWRnZSIpLHo9dCh1LCJNYWNpbnRvc2giKSxjYj1mdW5jdGlvbigpe3ZhciBhPWwuZG9jdW1lbnQ7cmV0dXJuIGE/YS5kb2N1bWVudE1vZGU6dm9pZCAwfSxkYjsKYTp7dmFyIGViPSIiLGZiPWZ1bmN0aW9uKCl7dmFyIGE9dTtpZih4KXJldHVybi9ydjooW15cKTtdKykoXCl8OykvLmV4ZWMoYSk7aWYoYmIpcmV0dXJuL0VkZ2VcLyhbXGRcLl0rKS8uZXhlYyhhKTtpZih2KXJldHVybi9cYig/Ok1TSUV8cnYpWzogXShbXlwpO10rKShcKXw7KS8uZXhlYyhhKTtpZih5KXJldHVybi9XZWJLaXRcLyhcUyspLy5leGVjKGEpO2lmKGFiKXJldHVybi8oPzpWZXJzaW9uKVsgXC9dPyhcUyspLy5leGVjKGEpfSgpO2ZiJiYoZWI9ZmI/ZmJbMV06IiIpO2lmKHYpe3ZhciBnYj1jYigpO2lmKG51bGwhPWdiJiZnYj5wYXJzZUZsb2F0KGViKSl7ZGI9U3RyaW5nKGdiKTticmVhayBhfX1kYj1lYn0KdmFyIGhiPWRiLFphPXt9LEE9ZnVuY3Rpb24oYSl7cmV0dXJuICRhKGEsZnVuY3Rpb24oKXtmb3IodmFyIGI9MCxjPU1hKFN0cmluZyhoYikpLnNwbGl0KCIuIiksZD1NYShTdHJpbmcoYSkpLnNwbGl0KCIuIiksZT1NYXRoLm1heChjLmxlbmd0aCxkLmxlbmd0aCksZj0wOzA9PWImJmY8ZTtmKyspe3ZhciBnPWNbZl18fCIiLGs9ZFtmXXx8IiI7ZG97Zz0vKFxkKikoXEQqKSguKikvLmV4ZWMoZyl8fFsiIiwiIiwiIiwiIl07az0vKFxkKikoXEQqKSguKikvLmV4ZWMoayl8fFsiIiwiIiwiIiwiIl07aWYoMD09Z1swXS5sZW5ndGgmJjA9PWtbMF0ubGVuZ3RoKWJyZWFrO2I9VWEoMD09Z1sxXS5sZW5ndGg/MDpwYXJzZUludChnWzFdLDEwKSwwPT1rWzFdLmxlbmd0aD8wOnBhcnNlSW50KGtbMV0sMTApKXx8VWEoMD09Z1syXS5sZW5ndGgsMD09a1syXS5sZW5ndGgpfHxVYShnWzJdLGtbMl0pO2c9Z1szXTtrPWtbM119d2hpbGUoMD09Yil9cmV0dXJuIDA8PWJ9KX0saWI7CmliPWwuZG9jdW1lbnQmJnY/Y2IoKTp2b2lkIDA7dmFyIGpiPSF2fHw5PD1OdW1iZXIoaWIpO3ZhciBsYj1mdW5jdGlvbihhLGIpe29hKGIsZnVuY3Rpb24oYyxkKXtjJiYib2JqZWN0Ij09dHlwZW9mIGMmJmMuZGQmJihjPWMuY2QoKSk7InN0eWxlIj09ZD9hLnN0eWxlLmNzc1RleHQ9YzoiY2xhc3MiPT1kP2EuY2xhc3NOYW1lPWM6ImZvciI9PWQ/YS5odG1sRm9yPWM6a2IuaGFzT3duUHJvcGVydHkoZCk/YS5zZXRBdHRyaWJ1dGUoa2JbZF0sYyk6MD09ZC5sYXN0SW5kZXhPZigiYXJpYS0iLDApfHwwPT1kLmxhc3RJbmRleE9mKCJkYXRhLSIsMCk/YS5zZXRBdHRyaWJ1dGUoZCxjKTphW2RdPWN9KX0sa2I9e2NlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjb2xzcGFuOiJjb2xTcGFuIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGhlaWdodDoiaGVpZ2h0IixtYXhsZW5ndGg6Im1heExlbmd0aCIsbm9uY2U6Im5vbmNlIixyb2xlOiJyb2xlIixyb3dzcGFuOiJyb3dTcGFuIix0eXBlOiJ0eXBlIix1c2VtYXA6InVzZU1hcCIsdmFsaWduOiJ2QWxpZ24iLAp3aWR0aDoid2lkdGgifSxtYj1mdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChrKXtrJiZiLmFwcGVuZENoaWxkKCJzdHJpbmciPT09dHlwZW9mIGs/YS5jcmVhdGVUZXh0Tm9kZShrKTprKX1mb3IodmFyIGU9MjtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXTtpZighaGEoZil8fG0oZikmJjA8Zi5ub2RlVHlwZSlkKGYpO2Vsc2V7YTp7aWYoZiYmIm51bWJlciI9PXR5cGVvZiBmLmxlbmd0aCl7aWYobShmKSl7dmFyIGc9ImZ1bmN0aW9uIj09dHlwZW9mIGYuaXRlbXx8InN0cmluZyI9PXR5cGVvZiBmLml0ZW07YnJlYWsgYX1pZihpYShmKSl7Zz0iZnVuY3Rpb24iPT10eXBlb2YgZi5pdGVtO2JyZWFrIGF9fWc9ITF9cihnP0phKGYpOmYsZCl9fX0sbmI9ZnVuY3Rpb24oYSxiKXtiPVN0cmluZyhiKTsiYXBwbGljYXRpb24veGh0bWwreG1sIj09PWEuY29udGVudFR5cGUmJihiPWIudG9Mb3dlckNhc2UoKSk7cmV0dXJuIGEuY3JlYXRlRWxlbWVudChiKX0sb2I9ZnVuY3Rpb24oYSl7YSYmCmEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpfSxwYj1mdW5jdGlvbihhLGIpe2lmKCFhfHwhYilyZXR1cm4hMTtpZihhLmNvbnRhaW5zJiYxPT1iLm5vZGVUeXBlKXJldHVybiBhPT1ifHxhLmNvbnRhaW5zKGIpO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbilyZXR1cm4gYT09Ynx8ISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNik7Zm9yKDtiJiZhIT1iOyliPWIucGFyZW50Tm9kZTtyZXR1cm4gYj09YX0scWI9ZnVuY3Rpb24oYSl7cShhLCJOb2RlIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4iKTtyZXR1cm4gOT09YS5ub2RlVHlwZT9hOmEub3duZXJEb2N1bWVudHx8YS5kb2N1bWVudH0scmI9ZnVuY3Rpb24oYSxiKXtiP2EudGFiSW5kZXg9MDooYS50YWJJbmRleD0tMSxhLnJlbW92ZUF0dHJpYnV0ZSgidGFiSW5kZXgiKSl9LHNiPWZ1bmN0aW9uKGEpe3JldHVybiB2JiYhQSgiOSIpPyhhPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKSwKbnVsbCE9YSYmYS5zcGVjaWZpZWQpOmEuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpfSx0Yj1mdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgYSYmMDw9YSYmMzI3Njg+YX0sdWI9ZnVuY3Rpb24oYSl7dGhpcy5hPWF8fGwuZG9jdW1lbnR8fGRvY3VtZW50fTt1Yi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBhP3RoaXMuYS5nZXRFbGVtZW50QnlJZChhKTphfTsKdWIucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuYSxlPWFyZ3VtZW50cyxmPVN0cmluZyhlWzBdKSxnPWVbMV07aWYoIWpiJiZnJiYoZy5uYW1lfHxnLnR5cGUpKXtmPVsiPCIsZl07Zy5uYW1lJiZmLnB1c2goJyBuYW1lPSInLFhhKGcubmFtZSksJyInKTtpZihnLnR5cGUpe2YucHVzaCgnIHR5cGU9IicsWGEoZy50eXBlKSwnIicpO3ZhciBrPXt9O3VhKGssZyk7ZGVsZXRlIGsudHlwZTtnPWt9Zi5wdXNoKCI+Iik7Zj1mLmpvaW4oIiIpfWY9bmIoZCxmKTtnJiYoInN0cmluZyI9PT10eXBlb2YgZz9mLmNsYXNzTmFtZT1nOmZhKGcpP2YuY2xhc3NOYW1lPWcuam9pbigiICIpOmxiKGYsZykpOzI8ZS5sZW5ndGgmJm1iKGQsZixlKTtyZXR1cm4gZn07dmFyIHZiPWZ1bmN0aW9uKGEsYil7Yj8ocShwYSh2YSxiKSwiTm8gc3VjaCBBUklBIHJvbGUgIitiKSxhLnNldEF0dHJpYnV0ZSgicm9sZSIsYikpOmEucmVtb3ZlQXR0cmlidXRlKCJyb2xlIil9LHhiPWZ1bmN0aW9uKGEsYixjKXtmYShjKSYmKGM9Yy5qb2luKCIgIikpO3ZhciBkPXdiKGIpOyIiPT09Y3x8dm9pZCAwPT1jPyhtYXx8KG1hPXthdG9taWM6ITEsYXV0b2NvbXBsZXRlOiJub25lIixkcm9wZWZmZWN0OiJub25lIixoYXNwb3B1cDohMSxsaXZlOiJvZmYiLG11bHRpbGluZTohMSxtdWx0aXNlbGVjdGFibGU6ITEsb3JpZW50YXRpb246InZlcnRpY2FsIixyZWFkb25seTohMSxyZWxldmFudDoiYWRkaXRpb25zIHRleHQiLHJlcXVpcmVkOiExLHNvcnQ6Im5vbmUiLGJ1c3k6ITEsZGlzYWJsZWQ6ITEsaGlkZGVuOiExLGludmFsaWQ6ImZhbHNlIn0pLGM9bWEsYiBpbiBjP2Euc2V0QXR0cmlidXRlKGQsY1tiXSk6YS5yZW1vdmVBdHRyaWJ1dGUoZCkpOmEuc2V0QXR0cmlidXRlKGQsCmMpfSx3Yj1mdW5jdGlvbihhKXtxKGEsIkFSSUEgYXR0cmlidXRlIGNhbm5vdCBiZSBlbXB0eS4iKTtxKHBhKG5hLGEpLCJObyBzdWNoIEFSSUEgYXR0cmlidXRlICIrYSk7cmV0dXJuImFyaWEtIithfTt2YXIgeWI9T2JqZWN0LmZyZWV6ZXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O3ZhciBDPWZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVTt0aGlzLko9dGhpcy5KfTtDLnByb3RvdHlwZS5VPSExO0MucHJvdG90eXBlLk49ZnVuY3Rpb24oKXt0aGlzLlV8fCh0aGlzLlU9ITAsdGhpcy51KCkpfTt2YXIgemI9ZnVuY3Rpb24oYSxiKXthLlU/YigpOihhLkp8fChhLko9W10pLGEuSi5wdXNoKGIpKX07Qy5wcm90b3R5cGUudT1mdW5jdGlvbigpe2lmKHRoaXMuSilmb3IoO3RoaXMuSi5sZW5ndGg7KXRoaXMuSi5zaGlmdCgpKCl9O3ZhciBBYj1mdW5jdGlvbihhKXthJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5OJiZhLk4oKX07dmFyIEJiPWZ1bmN0aW9uKGEpe3JldHVybiJzdHJpbmciPT10eXBlb2YgYS5jbGFzc05hbWU/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sRD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6QmIoYSkubWF0Y2goL1xTKy9nKXx8W119LENiPWZ1bmN0aW9uKGEsYil7InN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZT9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxEYj1mdW5jdGlvbihhLGIpe3JldHVybiBhLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5jb250YWlucyhiKTpHYShEKGEpLGIpfSxFYj1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFEYihhLGIpKXt2YXIgYz1CYihhKTtDYihhLGMrKDA8Yy5sZW5ndGg/IiAiK2I6YikpfX0sRmI9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClyKGIsCmZ1bmN0aW9uKGUpe0ViKGEsZSl9KTtlbHNle3ZhciBjPXt9O3IoRChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7cihiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPTA8Yi5sZW5ndGg/IiAiK2Q6ZDtDYihhLGIpfX0sR2I9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6RGIoYSxiKSYmQ2IoYSxFYShEKGEpLGZ1bmN0aW9uKGMpe3JldHVybiBjIT1ifSkuam9pbigiICIpKX0sSGI9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9yKGIsZnVuY3Rpb24oYyl7R2IoYSxjKX0pOkNiKGEsRWEoRChhKSxmdW5jdGlvbihjKXtyZXR1cm4hR2EoYixjKX0pLmpvaW4oIiAiKSl9O3ZhciBJYj0hdnx8OTw9TnVtYmVyKGliKSxKYj0hdnx8OTw9TnVtYmVyKGliKSxLYj12JiYhQSgiOSIpLExiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e2wuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsY2EsYiksbC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjYSxiKX1jYXRjaChjKXt9cmV0dXJuIGF9KCk7dmFyIEU9ZnVuY3Rpb24oYSxiKXt0aGlzLnR5cGU9YTt0aGlzLmE9dGhpcy50YXJnZXQ9Yjt0aGlzLmg9ITE7dGhpcy5LYT0hMH07RS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuaD0hMH07RS5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3RoaXMuS2E9ITF9O3ZhciBGPXtMOiJtb3VzZWRvd24iLE06Im1vdXNldXAiLGFhOiJtb3VzZWNhbmNlbCIsaGM6Im1vdXNlbW92ZSIsamM6Im1vdXNlb3ZlciIsaWM6Im1vdXNlb3V0IixmYzoibW91c2VlbnRlciIsZ2M6Im1vdXNlbGVhdmUifTt2YXIgRz1mdW5jdGlvbihhLGIpe0UuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy5hPXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5jPTA7dGhpcy5BPXRoaXMubWV0YUtleT10aGlzLnNoaWZ0S2V5PXRoaXMuYWx0S2V5PXRoaXMuY3RybEtleT0hMTt0aGlzLnBvaW50ZXJJZD0wO3RoaXMucG9pbnRlclR5cGU9IiI7dGhpcy5iPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMuYT1iO2lmKGI9YS5yZWxhdGVkVGFyZ2V0KXtpZih4KXthOnt0cnl7WWEoYi5ub2RlTmFtZSk7dmFyIGU9ITA7YnJlYWsgYX1jYXRjaChmKXt9ZT0KITF9ZXx8KGI9bnVsbCl9fWVsc2UibW91c2VvdmVyIj09Yz9iPWEuZnJvbUVsZW1lbnQ6Im1vdXNlb3V0Ij09YyYmKGI9YS50b0VsZW1lbnQpO3RoaXMucmVsYXRlZFRhcmdldD1iO2Q/KHRoaXMuY2xpZW50WD12b2lkIDAhPT1kLmNsaWVudFg/ZC5jbGllbnRYOmQucGFnZVgsdGhpcy5jbGllbnRZPXZvaWQgMCE9PWQuY2xpZW50WT9kLmNsaWVudFk6ZC5wYWdlWSx0aGlzLnNjcmVlblg9ZC5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1kLnNjcmVlbll8fDApOih0aGlzLmNsaWVudFg9dm9pZCAwIT09YS5jbGllbnRYP2EuY2xpZW50WDphLnBhZ2VYLHRoaXMuY2xpZW50WT12b2lkIDAhPT1hLmNsaWVudFk/YS5jbGllbnRZOmEucGFnZVksdGhpcy5zY3JlZW5YPWEuc2NyZWVuWHx8MCx0aGlzLnNjcmVlblk9YS5zY3JlZW5ZfHwwKTt0aGlzLmJ1dHRvbj1hLmJ1dHRvbjt0aGlzLmM9YS5rZXlDb2RlfHwwO3RoaXMua2V5PWEua2V5fHwiIjt0aGlzLmN0cmxLZXk9YS5jdHJsS2V5O3RoaXMuYWx0S2V5PQphLmFsdEtleTt0aGlzLnNoaWZ0S2V5PWEuc2hpZnRLZXk7dGhpcy5tZXRhS2V5PWEubWV0YUtleTt0aGlzLkE9ej9hLm1ldGFLZXk6YS5jdHJsS2V5O3RoaXMucG9pbnRlcklkPWEucG9pbnRlcklkfHwwO3RoaXMucG9pbnRlclR5cGU9InN0cmluZyI9PT10eXBlb2YgYS5wb2ludGVyVHlwZT9hLnBvaW50ZXJUeXBlOk1iW2EucG9pbnRlclR5cGVdfHwiIjt0aGlzLmI9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnRoaXMuZygpfX07bihHLEUpO3ZhciBOYj15YihbMSw0LDJdKSxNYj15Yih7MjoidG91Y2giLDM6InBlbiIsNDoibW91c2UifSksT2I9ZnVuY3Rpb24oYSl7cmV0dXJuIEliPzA9PWEuYi5idXR0b246ImNsaWNrIj09YS50eXBlPyEwOiEhKGEuYi5idXR0b24mTmJbMF0pfTtHLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7Ry5pLmouY2FsbCh0aGlzKTt0aGlzLmIuc3RvcFByb3BhZ2F0aW9uP3RoaXMuYi5zdG9wUHJvcGFnYXRpb24oKTp0aGlzLmIuY2FuY2VsQnViYmxlPSEwfTsKRy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe0cuaS5nLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5iO2lmKGEucHJldmVudERlZmF1bHQpYS5wcmV2ZW50RGVmYXVsdCgpO2Vsc2UgaWYoYS5yZXR1cm5WYWx1ZT0hMSxLYil0cnl7aWYoYS5jdHJsS2V5fHwxMTI8PWEua2V5Q29kZSYmMTIzPj1hLmtleUNvZGUpYS5rZXlDb2RlPS0xfWNhdGNoKGIpe319O3ZhciBQYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKDFFNipNYXRoLnJhbmRvbSgpfDApLFFiPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW1BiXSl9LFJiPTA7dmFyIFNiPWZ1bmN0aW9uKGEsYixjLGQsZSl7dGhpcy5saXN0ZW5lcj1hO3RoaXMuYT1udWxsO3RoaXMuc3JjPWI7dGhpcy50eXBlPWM7dGhpcy5jYXB0dXJlPSEhZDt0aGlzLm1hPWU7dGhpcy5rZXk9KytSYjt0aGlzLlg9dGhpcy5oYT0hMX0sVGI9ZnVuY3Rpb24oYSl7YS5YPSEwO2EubGlzdGVuZXI9bnVsbDthLmE9bnVsbDthLnNyYz1udWxsO2EubWE9bnVsbH07dmFyIFViPWZ1bmN0aW9uKGEpe3RoaXMuc3JjPWE7dGhpcy5hPXt9O3RoaXMuYj0wfTtVYi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS50b1N0cmluZygpO2E9dGhpcy5hW2ZdO2F8fChhPXRoaXMuYVtmXT1bXSx0aGlzLmIrKyk7dmFyIGc9VmIoYSxiLGQsZSk7LTE8Zz8oYj1hW2ddLGN8fChiLmhhPSExKSk6KGI9bmV3IFNiKGIsdGhpcy5zcmMsZiwhIWQsZSksYi5oYT1jLGEucHVzaChiKSk7cmV0dXJuIGJ9Owp2YXIgV2I9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLnR5cGU7YyBpbiBhLmEmJkhhKGEuYVtjXSxiKSYmKFRiKGIpLDA9PWEuYVtjXS5sZW5ndGgmJihkZWxldGUgYS5hW2NdLGEuYi0tKSl9LFhiPWZ1bmN0aW9uKGEsYixjLGQsZSl7YT1hLmFbYi50b1N0cmluZygpXTtiPS0xO2EmJihiPVZiKGEsYyxkLGUpKTtyZXR1cm4tMTxiP2FbYl06bnVsbH0sVmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuWCYmZi5saXN0ZW5lcj09YiYmZi5jYXB0dXJlPT0hIWMmJmYubWE9PWQpcmV0dXJuIGV9cmV0dXJuLTF9O3ZhciBZYj0iY2xvc3VyZV9sbV8iKygxRTYqTWF0aC5yYW5kb20oKXwwKSxaYj17fSwkYj0wLGJjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZCYmZC5vbmNlKXJldHVybiBhYyhhLGIsYyxkLGUpO2lmKGZhKGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyliYyhhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9Y2MoYyk7cmV0dXJuIFFiKGEpP2RjKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOmVjKGEsYixjLCExLGQsZSl9LGVjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGc9bShlKT8hIWUuY2FwdHVyZTohIWUsaz1mYyhhKTtrfHwoYVtZYl09az1uZXcgVWIoYSkpO2M9ay5hZGQoYixjLGQsZyxmKTtpZihjLmEpcmV0dXJuIGM7ZD1nYygpO2MuYT1kO2Quc3JjPWE7ZC5saXN0ZW5lcj1jO2lmKGEuYWRkRXZlbnRMaXN0ZW5lcilMYnx8KGU9Zyksdm9pZCAwPT09ZSYmKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksCmQsZSk7ZWxzZSBpZihhLmF0dGFjaEV2ZW50KWEuYXR0YWNoRXZlbnQoaGMoYi50b1N0cmluZygpKSxkKTtlbHNlIGlmKGEuYWRkTGlzdGVuZXImJmEucmVtb3ZlTGlzdGVuZXIpcSgiY2hhbmdlIj09PWIsIk1lZGlhUXVlcnlMaXN0IG9ubHkgaGFzIGEgY2hhbmdlIGV2ZW50IiksYS5hZGRMaXN0ZW5lcihkKTtlbHNlIHRocm93IEVycm9yKCJhZGRFdmVudExpc3RlbmVyIGFuZCBhdHRhY2hFdmVudCBhcmUgdW5hdmFpbGFibGUuIik7JGIrKztyZXR1cm4gY30sZ2M9ZnVuY3Rpb24oKXt2YXIgYT1pYyxiPUpiP2Z1bmN0aW9uKGMpe3JldHVybiBhLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKX06ZnVuY3Rpb24oYyl7Yz1hLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKTtpZighYylyZXR1cm4gY307cmV0dXJuIGJ9LGFjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZmEoYikpe2Zvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWFjKGEsYltmXSxjLGQsZSk7cmV0dXJuIG51bGx9Yz1jYyhjKTtyZXR1cm4gUWIoYSk/CmEuaC5hZGQoU3RyaW5nKGIpLGMsITAsbShkKT8hIWQuY2FwdHVyZTohIWQsZSk6ZWMoYSxiLGMsITAsZCxlKX0samM9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihmYShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylqYyhhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPWNjKGMpLFFiKGEpPyhhPWEuaCxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5hJiYoZj1hLmFbYl0sYz1WYihmLGMsZCxlKSwtMTxjJiYoVGIoZltjXSkscShudWxsIT1mLmxlbmd0aCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSwwPT1mLmxlbmd0aCYmKGRlbGV0ZSBhLmFbYl0sYS5iLS0pKSkpOmEmJihhPWZjKGEpKSYmKGM9WGIoYSxiLGMsZCxlKSkmJmtjKGMpfSxrYz1mdW5jdGlvbihhKXtpZigibnVtYmVyIiE9PXR5cGVvZiBhJiZhJiYhYS5YKXt2YXIgYj1hLnNyYztpZihRYihiKSlXYihiLmgsYSk7ZWxzZXt2YXIgYz1hLnR5cGUsZD1hLmE7Yi5yZW1vdmVFdmVudExpc3RlbmVyPwpiLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KGhjKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7JGItLTsoYz1mYyhiKSk/KFdiKGMsYSksMD09Yy5iJiYoYy5zcmM9bnVsbCxiW1liXT1udWxsKSk6VGIoYSl9fX0saGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gWmI/WmJbYV06WmJbYV09Im9uIithfSxtYz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMDtpZihhPWZjKGEpKWlmKGI9YS5hW2IudG9TdHJpbmcoKV0pZm9yKGI9Yi5jb25jYXQoKSxhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBmPWJbYV07ZiYmZi5jYXB0dXJlPT1jJiYhZi5YJiYoZj1sYyhmLGQpLGU9ZSYmITEhPT1mKX1yZXR1cm4gZX0sbGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5tYXx8YS5zcmM7YS5oYSYma2MoYSk7cmV0dXJuIGMuY2FsbChkLGIpfSxpYz1mdW5jdGlvbihhLApiKXtpZihhLlgpcmV0dXJuITA7aWYoIUpiKXtpZighYilhOntiPVsid2luZG93IiwiZXZlbnQiXTtmb3IodmFyIGM9bCxkPTA7ZDxiLmxlbmd0aDtkKyspaWYoYz1jW2JbZF1dLG51bGw9PWMpe2I9bnVsbDticmVhayBhfWI9Y31kPWI7Yj1uZXcgRyhkLHRoaXMpO2M9ITA7aWYoISgwPmQua2V5Q29kZXx8dm9pZCAwIT1kLnJldHVyblZhbHVlKSl7YTp7dmFyIGU9ITE7aWYoMD09ZC5rZXlDb2RlKXRyeXtkLmtleUNvZGU9LTE7YnJlYWsgYX1jYXRjaChnKXtlPSEwfWlmKGV8fHZvaWQgMD09ZC5yZXR1cm5WYWx1ZSlkLnJldHVyblZhbHVlPSEwfWQ9W107Zm9yKGU9Yi5hO2U7ZT1lLnBhcmVudE5vZGUpZC5wdXNoKGUpO2E9YS50eXBlO2ZvcihlPWQubGVuZ3RoLTE7IWIuaCYmMDw9ZTtlLS0pe2IuYT1kW2VdO3ZhciBmPW1jKGRbZV0sYSwhMCxiKTtjPWMmJmZ9Zm9yKGU9MDshYi5oJiZlPGQubGVuZ3RoO2UrKyliLmE9ZFtlXSxmPW1jKGRbZV0sYSwhMSxiKSxjPWMmJmZ9cmV0dXJuIGN9cmV0dXJuIGxjKGEsCm5ldyBHKGIsdGhpcykpfSxmYz1mdW5jdGlvbihhKXthPWFbWWJdO3JldHVybiBhIGluc3RhbmNlb2YgVWI/YTpudWxsfSxuYz0iX19jbG9zdXJlX2V2ZW50c19mbl8iKygxRTkqTWF0aC5yYW5kb20oKT4+PjApLGNjPWZ1bmN0aW9uKGEpe3EoYSwiTGlzdGVuZXIgY2FuIG5vdCBiZSBudWxsLiIpO2lmKGlhKGEpKXJldHVybiBhO3EoYS5oYW5kbGVFdmVudCwiQW4gb2JqZWN0IGxpc3RlbmVyIG11c3QgaGF2ZSBoYW5kbGVFdmVudCBtZXRob2QuIik7YVtuY118fChhW25jXT1mdW5jdGlvbihiKXtyZXR1cm4gYS5oYW5kbGVFdmVudChiKX0pO3JldHVybiBhW25jXX07dmFyIG9jPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9e319O24ob2MsQyk7CnZhciBwYz1bXSxIPWZ1bmN0aW9uKGEsYixjLGQpe2ZhKGMpfHwoYyYmKHBjWzBdPWMudG9TdHJpbmcoKSksYz1wYyk7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWJjKGIsY1tlXSxkfHxhLmhhbmRsZUV2ZW50LCExLGEuYnx8YSk7aWYoIWYpYnJlYWs7YS5hW2Yua2V5XT1mfXJldHVybiBhfSxxYz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoZmEoYykpZm9yKHZhciBnPTA7ZzxjLmxlbmd0aDtnKyspcWMoYSxiLGNbZ10sZCxlLGYpO2Vsc2UgZD1kfHxhLmhhbmRsZUV2ZW50LGU9bShlKT8hIWUuY2FwdHVyZTohIWUsZj1mfHxhLmJ8fGEsZD1jYyhkKSxlPSEhZSxjPVFiKGIpP1hiKGIuaCxTdHJpbmcoYyksZCxlLGYpOmI/KGI9ZmMoYikpP1hiKGIsYyxkLGUsZik6bnVsbDpudWxsLGMmJihrYyhjKSxkZWxldGUgYS5hW2Mua2V5XSk7cmV0dXJuIGF9LHJjPWZ1bmN0aW9uKGEpe29hKGEuYSxmdW5jdGlvbihiLGMpe3RoaXMuYS5oYXNPd25Qcm9wZXJ0eShjKSYma2MoYil9LAphKTthLmE9e319O29jLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7b2MuaS51LmNhbGwodGhpcyk7cmModGhpcyl9O29jLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJFdmVudEhhbmRsZXIuaGFuZGxlRXZlbnQgbm90IGltcGxlbWVudGVkIik7fTt2YXIgST1mdW5jdGlvbigpe0MuY2FsbCh0aGlzKTt0aGlzLmg9bmV3IFViKHRoaXMpO3RoaXMuTWE9dGhpczt0aGlzLnBhPW51bGx9O24oSSxDKTtJLnByb3RvdHlwZVtQYl09ITA7SS5wcm90b3R5cGUucmE9ZnVuY3Rpb24oYSl7dGhpcy5wYT1hfTtJLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjLGQpe2pjKHRoaXMsYSxiLGMsZCl9Owp2YXIgdWM9ZnVuY3Rpb24oYSxiKXtzYyhhKTt2YXIgYz1hLnBhO2lmKGMpe3ZhciBkPVtdO2Zvcih2YXIgZT0xO2M7Yz1jLnBhKWQucHVzaChjKSxxKDFFMz4rK2UsImluZmluaXRlIGxvb3AiKX1hPWEuTWE7Yz1iLnR5cGV8fGI7InN0cmluZyI9PT10eXBlb2YgYj9iPW5ldyBFKGIsYSk6YiBpbnN0YW5jZW9mIEU/Yi50YXJnZXQ9Yi50YXJnZXR8fGE6KGU9YixiPW5ldyBFKGMsYSksdWEoYixlKSk7ZT0hMDtpZihkKWZvcih2YXIgZj1kLmxlbmd0aC0xOyFiLmgmJjA8PWY7Zi0tKXt2YXIgZz1iLmE9ZFtmXTtlPXRjKGcsYywhMCxiKSYmZX1iLmh8fChnPWIuYT1hLGU9dGMoZyxjLCEwLGIpJiZlLGIuaHx8KGU9dGMoZyxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLmgmJmY8ZC5sZW5ndGg7ZisrKWc9Yi5hPWRbZl0sZT10YyhnLGMsITEsYikmJmU7cmV0dXJuIGV9OwpJLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7SS5pLnUuY2FsbCh0aGlzKTtpZih0aGlzLmgpe3ZhciBhPXRoaXMuaCxiPTAsYztmb3IoYyBpbiBhLmEpe2Zvcih2YXIgZD1hLmFbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixUYihkW2VdKTtkZWxldGUgYS5hW2NdO2EuYi0tfX10aGlzLnBhPW51bGx9O3ZhciBkYz1mdW5jdGlvbihhLGIsYyxkLGUpe3NjKGEpO3JldHVybiBhLmguYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LHRjPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5oLmFbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGc9YltmXTtpZihnJiYhZy5YJiZnLmNhcHR1cmU9PWMpe3ZhciBrPWcubGlzdGVuZXIscD1nLm1hfHxnLnNyYztnLmhhJiZXYihhLmgsZyk7ZT0hMSE9PWsuY2FsbChwLGQpJiZlfX1yZXR1cm4gZSYmMCE9ZC5LYX0sc2M9ZnVuY3Rpb24oYSl7cShhLmgsIkV2ZW50IHRhcmdldCBpcyBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgY2FsbCB0aGUgc3VwZXJjbGFzcyAoZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpIGNvbnN0cnVjdG9yPyIpfTt2YXIgeGM9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKHkmJiFBKCI1MjUiKSlyZXR1cm4hMDtpZih6JiZlKXJldHVybiB2YyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZigheCl7Im51bWJlciI9PT10eXBlb2YgYiYmKGI9d2MoYikpO3ZhciBnPTE3PT1ifHwxOD09Ynx8eiYmOTE9PWI7aWYoKCFjfHx6KSYmZ3x8eiYmMTY9PWImJihkfHxmKSlyZXR1cm4hMX1pZigoeXx8YmIpJiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1pZih2JiZkJiZiPT1hKXJldHVybiExO3N3aXRjaChhKXtjYXNlIDEzOnJldHVybiB4P2Z8fGU/ITE6IShjJiZkKTohMDtjYXNlIDI3OnJldHVybiEoeXx8YmJ8fHgpfXJldHVybiB4JiYoZHx8ZXx8Zik/ITE6dmMoYSl9LHZjPWZ1bmN0aW9uKGEpe2lmKDQ4PD1hJiY1Nz49YXx8Cjk2PD1hJiYxMDY+PWF8fDY1PD1hJiY5MD49YXx8KHl8fGJiKSYmMD09YSlyZXR1cm4hMDtzd2l0Y2goYSl7Y2FzZSAzMjpjYXNlIDQzOmNhc2UgNjM6Y2FzZSA2NDpjYXNlIDEwNzpjYXNlIDEwOTpjYXNlIDExMDpjYXNlIDExMTpjYXNlIDE4NjpjYXNlIDU5OmNhc2UgMTg5OmNhc2UgMTg3OmNhc2UgNjE6Y2FzZSAxODg6Y2FzZSAxOTA6Y2FzZSAxOTE6Y2FzZSAxOTI6Y2FzZSAyMjI6Y2FzZSAyMTk6Y2FzZSAyMjA6Y2FzZSAyMjE6Y2FzZSAxNjM6Y2FzZSA1ODpyZXR1cm4hMDtjYXNlIDE3MzpyZXR1cm4geDtkZWZhdWx0OnJldHVybiExfX0sd2M9ZnVuY3Rpb24oYSl7aWYoeClhPXljKGEpO2Vsc2UgaWYoeiYmeSlzd2l0Y2goYSl7Y2FzZSA5MzphPTkxfXJldHVybiBhfSx5Yz1mdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSA2MTpyZXR1cm4gMTg3O2Nhc2UgNTk6cmV0dXJuIDE4NjtjYXNlIDE3MzpyZXR1cm4gMTg5O2Nhc2UgMjI0OnJldHVybiA5MTtjYXNlIDA6cmV0dXJuIDIyNDsKZGVmYXVsdDpyZXR1cm4gYX19O3ZhciBKPWZ1bmN0aW9uKGEsYil7SS5jYWxsKHRoaXMpO2EmJnpjKHRoaXMsYSxiKX07bihKLEkpO2g9Si5wcm90b3R5cGU7aC5TPW51bGw7aC5uYT1udWxsO2guQ2E9bnVsbDtoLm9hPW51bGw7aC53PS0xO2guRj0tMTtoLnVhPSExOwp2YXIgQWM9ezM6MTMsMTI6MTQ0LDYzMjMyOjM4LDYzMjMzOjQwLDYzMjM0OjM3LDYzMjM1OjM5LDYzMjM2OjExMiw2MzIzNzoxMTMsNjMyMzg6MTE0LDYzMjM5OjExNSw2MzI0MDoxMTYsNjMyNDE6MTE3LDYzMjQyOjExOCw2MzI0MzoxMTksNjMyNDQ6MTIwLDYzMjQ1OjEyMSw2MzI0NjoxMjIsNjMyNDc6MTIzLDYzMjQ4OjQ0LDYzMjcyOjQ2LDYzMjczOjM2LDYzMjc1OjM1LDYzMjc2OjMzLDYzMjc3OjM0LDYzMjg5OjE0NCw2MzMwMjo0NX0sQmM9e1VwOjM4LERvd246NDAsTGVmdDozNyxSaWdodDozOSxFbnRlcjoxMyxGMToxMTIsRjI6MTEzLEYzOjExNCxGNDoxMTUsRjU6MTE2LEY2OjExNyxGNzoxMTgsRjg6MTE5LEY5OjEyMCxGMTA6MTIxLEYxMToxMjIsRjEyOjEyMywiVSswMDdGIjo0NixIb21lOjM2LEVuZDozNSxQYWdlVXA6MzMsUGFnZURvd246MzQsSW5zZXJ0OjQ1fSxDYz0heXx8QSgiNTI1IiksRGM9eiYmeDsKSi5wcm90b3R5cGUuYT1mdW5jdGlvbihhKXtpZih5fHxiYilpZigxNz09dGhpcy53JiYhYS5jdHJsS2V5fHwxOD09dGhpcy53JiYhYS5hbHRLZXl8fHomJjkxPT10aGlzLncmJiFhLm1ldGFLZXkpdGhpcy5GPXRoaXMudz0tMTstMT09dGhpcy53JiYoYS5jdHJsS2V5JiYxNyE9YS5jP3RoaXMudz0xNzphLmFsdEtleSYmMTghPWEuYz90aGlzLnc9MTg6YS5tZXRhS2V5JiY5MSE9YS5jJiYodGhpcy53PTkxKSk7Q2MmJiF4YyhhLmMsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGEuYWx0S2V5LGEubWV0YUtleSk/dGhpcy5oYW5kbGVFdmVudChhKToodGhpcy5GPXdjKGEuYyksRGMmJih0aGlzLnVhPWEuYWx0S2V5KSl9O0oucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dGhpcy5GPXRoaXMudz0tMTt0aGlzLnVhPWEuYWx0S2V5fTsKSi5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5iLGM9Yi5hbHRLZXk7aWYodiYmImtleXByZXNzIj09YS50eXBlKXt2YXIgZD10aGlzLkY7dmFyIGU9MTMhPWQmJjI3IT1kP2Iua2V5Q29kZTowfWVsc2UoeXx8YmIpJiYia2V5cHJlc3MiPT1hLnR5cGU/KGQ9dGhpcy5GLGU9MDw9Yi5jaGFyQ29kZSYmNjMyMzI+Yi5jaGFyQ29kZSYmdmMoZCk/Yi5jaGFyQ29kZTowKTphYiYmIXk/KGQ9dGhpcy5GLGU9dmMoZCk/Yi5rZXlDb2RlOjApOigia2V5cHJlc3MiPT1hLnR5cGU/KERjJiYoYz10aGlzLnVhKSxiLmtleUNvZGU9PWIuY2hhckNvZGU/MzI+Yi5rZXlDb2RlPyhkPWIua2V5Q29kZSxlPTApOihkPXRoaXMuRixlPWIuY2hhckNvZGUpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkseiYmNjM9PWUmJjIyND09ZCYmKGQ9MTkxKSk7dmFyIGY9ZD13YyhkKTtkPzYzMjMyPD0KZCYmZCBpbiBBYz9mPUFjW2RdOjI1PT1kJiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBCYyYmKGY9QmNbYi5rZXlJZGVudGlmaWVyXSk7eCYmQ2MmJiJrZXlwcmVzcyI9PWEudHlwZSYmIXhjKGYsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KXx8KGE9Zj09dGhpcy53LHRoaXMudz1mLGI9bmV3IEVjKGYsZSxhLGIpLGIuYWx0S2V5PWMsdWModGhpcyxiKSl9O0oucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTsKdmFyIHpjPWZ1bmN0aW9uKGEsYixjKXthLm9hJiZGYyhhKTthLlM9YjthLm5hPWJjKGEuUywia2V5cHJlc3MiLGEsYyk7YS5DYT1iYyhhLlMsImtleWRvd24iLGEuYSxjLGEpO2Eub2E9YmMoYS5TLCJrZXl1cCIsYS5iLGMsYSl9LEZjPWZ1bmN0aW9uKGEpe2EubmEmJihrYyhhLm5hKSxrYyhhLkNhKSxrYyhhLm9hKSxhLm5hPW51bGwsYS5DYT1udWxsLGEub2E9bnVsbCk7YS5TPW51bGw7YS53PS0xO2EuRj0tMX07Si5wcm90b3R5cGUudT1mdW5jdGlvbigpe0ouaS51LmNhbGwodGhpcyk7RmModGhpcyl9O3ZhciBFYz1mdW5jdGlvbihhLGIsYyxkKXtHLmNhbGwodGhpcyxkKTt0aGlzLnR5cGU9ImtleSI7dGhpcy5jPWE7dGhpcy5yZXBlYXQ9Y307bihFYyxHKTt2YXIgR2M9eD8iTW96VXNlclNlbGVjdCI6eXx8YmI/IldlYmtpdFVzZXJTZWxlY3QiOm51bGwsSGM9ZnVuY3Rpb24oYSxiKXtiPWI/bnVsbDphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7aWYoR2Mpe3ZhciBjPSJub25lIjthLnN0eWxlJiYoYS5zdHlsZVtHY109Yyk7aWYoYil7YT0wO2Zvcih2YXIgZDtkPWJbYV07YSsrKWQuc3R5bGUmJihkLnN0eWxlW0djXT1jKX19ZWxzZSBpZih2fHxhYilpZihjPSJvbiIsYS5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyksYilmb3IoYT0wO2Q9YlthXTthKyspZC5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyl9O3ZhciBJYz1mdW5jdGlvbigpe307ZGEoSWMpO0ljLnByb3RvdHlwZS5hPTA7dmFyIEs9ZnVuY3Rpb24oYSl7SS5jYWxsKHRoaXMpO3RoaXMuaj1hfHx4YXx8KHhhPW5ldyB1Yik7dGhpcy5xYT1KYzt0aGlzLlk9bnVsbDt0aGlzLm09ITE7dGhpcy5hPW51bGw7dGhpcy5BPXZvaWQgMDt0aGlzLmc9dGhpcy5jPXRoaXMuYj1udWxsO3RoaXMuR2E9ITF9O24oSyxJKTtLLnByb3RvdHlwZS5PYT1JYy5SKCk7CnZhciBKYz1udWxsLEtjPWZ1bmN0aW9uKGEsYil7c3dpdGNoKGEpe2Nhc2UgMTpyZXR1cm4gYj8iZGlzYWJsZSI6ImVuYWJsZSI7Y2FzZSAyOnJldHVybiBiPyJoaWdobGlnaHQiOiJ1bmhpZ2hsaWdodCI7Y2FzZSA0OnJldHVybiBiPyJhY3RpdmF0ZSI6ImRlYWN0aXZhdGUiO2Nhc2UgODpyZXR1cm4gYj8ic2VsZWN0IjoidW5zZWxlY3QiO2Nhc2UgMTY6cmV0dXJuIGI/ImNoZWNrIjoidW5jaGVjayI7Y2FzZSAzMjpyZXR1cm4gYj8iZm9jdXMiOiJibHVyIjtjYXNlIDY0OnJldHVybiBiPyJvcGVuIjoiY2xvc2UifXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBzdGF0ZSIpO30sTGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuWXx8KGEuWT0iOiIrKGEuT2EuYSsrKS50b1N0cmluZygzNikpfSxNYz1mdW5jdGlvbihhLGIpe2lmKGEuYiYmYS5iLmcpe3ZhciBjPWEuYi5nLGQ9YS5ZO2QgaW4gYyYmZGVsZXRlIGNbZF07cWEoYS5iLmcsYixhKX1hLlk9Yn07Sy5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9Owp2YXIgTmM9ZnVuY3Rpb24oYSl7YT1hLmE7cShhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cmV0dXJuIGF9LE9jPWZ1bmN0aW9uKGEpe2EuQXx8KGEuQT1uZXcgb2MoYSkpO3JldHVybiBxKGEuQSl9O0sucHJvdG90eXBlLnJhPWZ1bmN0aW9uKGEpe2lmKHRoaXMuYiYmdGhpcy5iIT1hKXRocm93IEVycm9yKCJNZXRob2Qgbm90IHN1cHBvcnRlZCIpO0suaS5yYS5jYWxsKHRoaXMsYSl9O0sucHJvdG90eXBlLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPW5iKHRoaXMuai5hLCJESVYiKX07CnZhciBQYz1mdW5jdGlvbihhLGIpe2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiJiZhLnhhKGIpKXthLkdhPSEwO3ZhciBjPXFiKGIpO2EuaiYmYS5qLmE9PWN8fChhLmo9Yj9uZXcgdWIocWIoYikpOnhhfHwoeGE9bmV3IHViKSk7YS52YShiKTthLkQoKX1lbHNlIHRocm93IEVycm9yKCJJbnZhbGlkIGVsZW1lbnQgdG8gZGVjb3JhdGUiKTt9O2g9Sy5wcm90b3R5cGU7aC54YT1mdW5jdGlvbigpe3JldHVybiEwfTtoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hfTtoLkQ9ZnVuY3Rpb24oKXt0aGlzLm09ITA7UWModGhpcyxmdW5jdGlvbihhKXshYS5tJiZhLmYoKSYmYS5EKCl9KX07aC5QPWZ1bmN0aW9uKCl7UWModGhpcyxmdW5jdGlvbihhKXthLm0mJmEuUCgpfSk7dGhpcy5BJiZyYyh0aGlzLkEpO3RoaXMubT0hMX07CmgudT1mdW5jdGlvbigpe3RoaXMubSYmdGhpcy5QKCk7dGhpcy5BJiYodGhpcy5BLk4oKSxkZWxldGUgdGhpcy5BKTtRYyh0aGlzLGZ1bmN0aW9uKGEpe2EuTigpfSk7IXRoaXMuR2EmJnRoaXMuYSYmb2IodGhpcy5hKTt0aGlzLmI9dGhpcy5hPXRoaXMuZz10aGlzLmM9bnVsbDtLLmkudS5jYWxsKHRoaXMpfTtoLnNhPWZ1bmN0aW9uKGEsYil7dGhpcy50YShhLFJjKHRoaXMpLGIpfTsKaC50YT1mdW5jdGlvbihhLGIsYyl7cSghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLm0mJihjfHwhdGhpcy5tKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZigwPmJ8fGI+UmModGhpcykpdGhyb3cgRXJyb3IoIkNoaWxkIGNvbXBvbmVudCBpbmRleCBvdXQgb2YgYm91bmRzIik7dGhpcy5nJiZ0aGlzLmN8fCh0aGlzLmc9e30sdGhpcy5jPVtdKTtpZihhLmI9PXRoaXMpe3ZhciBkPUxjKGEpO3RoaXMuZ1tkXT1hO0hhKHRoaXMuYyxhKX1lbHNlIHFhKHRoaXMuZyxMYyhhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuYiYmYS5ZKXt2YXIgZT1hLmI7ZD1hLlk7ZS5nJiZkPyhlPWUuZyxkPShudWxsIT09ZSYmZCBpbiBlP2VbZF06dm9pZCAwKXx8bnVsbCk6ZD1udWxsfWlmKGQmJmEuYiE9dGhpcyl0aHJvdyBFcnJvcigiVW5hYmxlIHRvIHNldCBwYXJlbnQgY29tcG9uZW50Iik7CmEuYj10aGlzO0suaS5yYS5jYWxsKGEsdGhpcyk7TGEodGhpcy5jLGIsMCxhKTtpZihhLm0mJnRoaXMubSYmYS5iPT10aGlzKWM9dGhpcy5qYSgpLGI9Yy5jaGlsZE5vZGVzW2JdfHxudWxsLGIhPWEuZigpJiZjLmluc2VydEJlZm9yZShhLmYoKSxiKTtlbHNlIGlmKGMpe3RoaXMuYXx8dGhpcy5pYSgpO2M9TCh0aGlzLGIrMSk7Yj10aGlzLmphKCk7Yz1jP2MuYTpudWxsO2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTthLmF8fGEuaWEoKTtiP2IuaW5zZXJ0QmVmb3JlKGEuYSxjfHxudWxsKTphLmouYS5ib2R5LmFwcGVuZENoaWxkKGEuYSk7YS5iJiYhYS5iLm18fGEuRCgpfWVsc2UgdGhpcy5tJiYhYS5tJiZhLmEmJmEuYS5wYXJlbnROb2RlJiYxPT1hLmEucGFyZW50Tm9kZS5ub2RlVHlwZSYmYS5EKCl9O2guamE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hfTsKdmFyIFNjPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEucWEpe3ZhciBiPWEubT9hLmE6YS5qLmEuYm9keTthOnt2YXIgYz1xYihiKTtpZihjLmRlZmF1bHRWaWV3JiZjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihjPWMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpKSl7Yz1jLmRpcmVjdGlvbnx8Yy5nZXRQcm9wZXJ0eVZhbHVlKCJkaXJlY3Rpb24iKXx8IiI7YnJlYWsgYX1jPSIifWEucWE9InJ0bCI9PShjfHwoYi5jdXJyZW50U3R5bGU/Yi5jdXJyZW50U3R5bGUuZGlyZWN0aW9uOm51bGwpfHxiLnN0eWxlJiZiLnN0eWxlLmRpcmVjdGlvbil9cmV0dXJuIGEucWF9LFJjPWZ1bmN0aW9uKGEpe3JldHVybiBhLmM/YS5jLmxlbmd0aDowfSxMPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuYz9hLmNbYl18fG51bGw6bnVsbH0sUWM9ZnVuY3Rpb24oYSxiLGMpe2EuYyYmcihhLmMsYixjKX0sVGM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jJiZiP0RhKGEuYyxiKTotMX07dmFyIFZjPWZ1bmN0aW9uKGEsYil7aWYoIWEpdGhyb3cgRXJyb3IoIkludmFsaWQgY2xhc3MgbmFtZSAiK2EpO2lmKCFpYShiKSl0aHJvdyBFcnJvcigiSW52YWxpZCBkZWNvcmF0b3IgZnVuY3Rpb24gIitiKTtVY1thXT1ifSxXYz17fSxVYz17fTt2YXIgWGM9ZnVuY3Rpb24oYSl7dGhpcy5oPWF9O2RhKFhjKTt2YXIgWWM9ZnVuY3Rpb24oYSxiKXthJiYoYS50YWJJbmRleD1iPzA6LTEpfSwkYz1mdW5jdGlvbihhLGIsYyl7Yy5pZCYmTWMoYixjLmlkKTt2YXIgZD1hLmIoKSxlPSExLGY9RChjKTtmJiZyKGYsZnVuY3Rpb24oZyl7Zz09ZD9lPSEwOmcmJnRoaXMuZyhiLGcsZCl9LGEpO2V8fEViKGMsZCk7WmMoYixjKTtyZXR1cm4gY307WGMucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiLGMpe2I9PWMrIi1kaXNhYmxlZCI/YS5aKCExKTpiPT1jKyItaG9yaXpvbnRhbCI/YWQoYSwiaG9yaXpvbnRhbCIpOmI9PWMrIi12ZXJ0aWNhbCImJmFkKGEsInZlcnRpY2FsIil9Owp2YXIgWmM9ZnVuY3Rpb24oYSxiKXtpZihiKWZvcih2YXIgYz1iLmZpcnN0Q2hpbGQsZDtjJiZjLnBhcmVudE5vZGU9PWI7KXtkPWMubmV4dFNpYmxpbmc7aWYoMT09Yy5ub2RlVHlwZSl7YTp7dmFyIGU9YztxKGUpO2U9RChlKTtmb3IodmFyIGY9MCxnPWUubGVuZ3RoO2Y8ZztmKyspe3ZhciBrPWVbZl07aWYoaz1rIGluIFVjP1VjW2tdKCk6bnVsbCl7ZT1rO2JyZWFrIGF9fWU9bnVsbH1lJiYoZS5hPWMsYS5pc0VuYWJsZWQoKXx8ZS5aKCExKSxhLnNhKGUpLFBjKGUsYykpfWVsc2UgYy5ub2RlVmFsdWUmJiIiIT1NYShjLm5vZGVWYWx1ZSl8fGIucmVtb3ZlQ2hpbGQoYyk7Yz1kfX0sYmQ9ZnVuY3Rpb24oYSxiKXtiPWIuZigpO3EoYiwiVGhlIGNvbnRhaW5lciBET00gZWxlbWVudCBjYW5ub3QgYmUgbnVsbC4iKTtIYyhiLHgpO3YmJihiLmhpZGVGb2N1cz0hMCk7KGE9YS5oKSYmdmIoYixhKX07WGMucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKWGMucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5iKCksYz1bYiwiaG9yaXpvbnRhbCI9PWEuSD9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgTT1mdW5jdGlvbigpe30sY2Q7ZGEoTSk7dmFyIGRkPXtidXR0b246InByZXNzZWQiLGNoZWNrYm94OiJjaGVja2VkIixtZW51aXRlbToic2VsZWN0ZWQiLG1lbnVpdGVtY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtcmFkaW86ImNoZWNrZWQiLHJhZGlvOiJjaGVja2VkIix0YWI6InNlbGVjdGVkIix0cmVlaXRlbToic2VsZWN0ZWQifTtNLnByb3RvdHlwZS5oPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLmouYigiRElWIixlZCh0aGlzLGEpLmpvaW4oIiAiKSxhLmJhKX07dmFyIGdkPWZ1bmN0aW9uKGEsYixjKXtpZihhPWEuZj9hLmYoKTphKXt2YXIgZD1bYl07diYmIUEoIjciKSYmKGQ9ZmQoRChhKSxiKSxkLnB1c2goYikpOyhjP0ZiOkhiKShhLGQpfX07Ck0ucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiKXtiLmlkJiZNYyhhLGIuaWQpO2ImJmIuZmlyc3RDaGlsZD9oZChhLGIuZmlyc3RDaGlsZC5uZXh0U2libGluZz9KYShiLmNoaWxkTm9kZXMpOmIuZmlyc3RDaGlsZCk6YS5iYT1udWxsO3ZhciBjPTAsZD10aGlzLmEoKSxlPXRoaXMuYSgpLGY9ITEsZz0hMSxrPSExLHA9SmEoRChiKSk7cihwLGZ1bmN0aW9uKEIpe2Z8fEIhPWQ/Z3x8QiE9ZT9jfD1pZCh0aGlzLEIpOmc9ITA6KGY9ITAsZT09ZCYmKGc9ITApKTsxPT1pZCh0aGlzLEIpJiYoQWEoYiksc2IoYikmJnRiKGIpJiZyYihiLCExKSl9LHRoaXMpO2Eubz1jO2Z8fChwLnB1c2goZCksZT09ZCYmKGc9ITApKTtnfHxwLnB1c2goZSk7KGE9YS53YSkmJnAucHVzaC5hcHBseShwLGEpO2lmKHYmJiFBKCI3Iikpe3ZhciB3PWZkKHApOzA8dy5sZW5ndGgmJihwLnB1c2guYXBwbHkocCx3KSxrPSEwKX1mJiZnJiYhYSYmIWt8fENiKGIscC5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIGpkPWZ1bmN0aW9uKGEsYil7aWYoYT1hLmgoKSl7cShiLCJUaGUgZWxlbWVudCBwYXNzZWQgYXMgYSBmaXJzdCBwYXJhbWV0ZXIgY2Fubm90IGJlIG51bGwuIik7dmFyIGM9Yi5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDthIT1jJiZ2YihiLGEpfX0sa2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYztpZihhLnYmMzImJihjPWEuZigpKSl7aWYoIWImJmEubyYzMil7dHJ5e2MuYmx1cigpfWNhdGNoKGQpe31hLm8mMzImJmEuRmEobnVsbCl9KHNiKGMpJiZ0YihjKSkhPWImJnJiKGMsYil9fSxsZD1mdW5jdGlvbihhLGIsYyl7Y2R8fChjZD17MToiZGlzYWJsZWQiLDg6InNlbGVjdGVkIiwxNjoiY2hlY2tlZCIsNjQ6ImV4cGFuZGVkIn0pO3EoYSwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO2I9Y2RbYl07dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDtkJiYoZD1kZFtkXXx8YixiPSJjaGVja2VkIj09Ynx8InNlbGVjdGVkIj09CmI/ZDpiKTtiJiZ4YihhLGIsYyl9O00ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250cm9sIn07CnZhciBlZD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuYSgpLGQ9W2NdLGU9YS5hKCk7ZSE9YyYmZC5wdXNoKGUpO2M9Yi5vO2ZvcihlPVtdO2M7KXt2YXIgZj1jJi1jO2UucHVzaChtZChhLGYpKTtjJj1+Zn1kLnB1c2guYXBwbHkoZCxlKTsoYT1iLndhKSYmZC5wdXNoLmFwcGx5KGQsYSk7diYmIUEoIjciKSYmZC5wdXNoLmFwcGx5KGQsZmQoZCkpO3JldHVybiBkfSxmZD1mdW5jdGlvbihhLGIpe3ZhciBjPVtdO2ImJihhPUlhKGEsW2JdKSk7cihbXSxmdW5jdGlvbihkKXshRmEoZCxsYShHYSxhKSl8fGImJiFHYShkLGIpfHxjLnB1c2goZC5qb2luKCJfIikpfSk7cmV0dXJuIGN9LG1kPWZ1bmN0aW9uKGEsYil7YS5ifHxuZChhKTtyZXR1cm4gYS5iW2JdfSxpZD1mdW5jdGlvbihhLGIpe2Euanx8KGEuYnx8bmQoYSksYS5qPXNhKGEuYikpO2E9cGFyc2VJbnQoYS5qW2JdLDEwKTtyZXR1cm4gaXNOYU4oYSk/MDphfSxuZD1mdW5jdGlvbihhKXt2YXIgYj1hLmEoKSxjPSF0KGIucmVwbGFjZSgvXHhhMHxccy9nLAoiICIpLCIgIik7cShjLCJDb250cm9sUmVuZGVyZXIgaGFzIGFuIGludmFsaWQgY3NzIGNsYXNzOiAnIitiKyInIik7YS5iPXsxOmIrIi1kaXNhYmxlZCIsMjpiKyItaG92ZXIiLDQ6YisiLWFjdGl2ZSIsODpiKyItc2VsZWN0ZWQiLDE2OmIrIi1jaGVja2VkIiwzMjpiKyItZm9jdXNlZCIsNjQ6YisiLW9wZW4ifX07dmFyIE49ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO2lmKCFiKXtiPXRoaXMuY29uc3RydWN0b3I7Zm9yKHZhciBkO2I7KXtkPWJbamFdfHwoYltqYV09KytrYSk7aWYoZD1XY1tkXSlicmVhaztiPWIuaT9iLmkuY29uc3RydWN0b3I6bnVsbH1iPWQ/aWEoZC5SKT9kLlIoKTpuZXcgZDpudWxsfXRoaXMuQj1iO3RoaXMuYmE9dm9pZCAwIT09YT9hOm51bGx9O24oTixLKTtoPU4ucHJvdG90eXBlO2guYmE9bnVsbDtoLm89MDtoLnY9Mzk7aC5LPTA7aC5JYT0hMDtoLndhPW51bGw7aC55YT0hMDtoLmlhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CLmModGhpcyk7dGhpcy5hPWE7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmeGIoYSwiaGlkZGVuIiwhMCkpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hPXRoaXMuQi5nKHRoaXMsYSk7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5JYT0ibm9uZSIhPWEuc3R5bGUuZGlzcGxheX07CmguRD1mdW5jdGlvbigpe04uaS5ELmNhbGwodGhpcyk7dmFyIGE9TmModGhpcyk7cSh0aGlzKTtxKGEpO3RoaXMuaXNWaXNpYmxlKCl8fHhiKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fGxkKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy52JjgmJmxkKGEsOCwhISh0aGlzLm8mOCkpO3RoaXMudiYxNiYmbGQoYSwxNiwhISh0aGlzLm8mMTYpKTt0aGlzLnYmNjQmJmxkKGEsNjQsISEodGhpcy5vJjY0KSk7YT10aGlzLkI7U2ModGhpcykmJmdkKHRoaXMuZigpLGEuYSgpKyItcnRsIiwhMCk7dGhpcy5pc0VuYWJsZWQoKSYma2QodGhpcyx0aGlzLmlzVmlzaWJsZSgpKTtpZih0aGlzLnYmLTImJih0aGlzLnlhJiZvZCh0aGlzLCEwKSx0aGlzLnYmMzImJihhPXRoaXMuZigpKSkpe3ZhciBiPXRoaXMuV3x8KHRoaXMuVz1uZXcgSik7emMoYixhKTtIKEgoSChPYyh0aGlzKSxiLCJrZXkiLHRoaXMuZmEpLGEsImZvY3VzIix0aGlzLk5hKSxhLCJibHVyIiwKdGhpcy5GYSl9fTt2YXIgb2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYz1PYyhhKSxkPWEuZigpO2I/KEgoSChIKEgoYyxkLEYuTCxhLmthKSxkLFtGLk0sRi5hYV0sYS5sYSksZCwibW91c2VvdmVyIixhLkFhKSxkLCJtb3VzZW91dCIsYS56YSksYS5lYSE9Y2EmJkgoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fEgoYyxkLCJkYmxjbGljayIsYS5KYSksYS5nYXx8KGEuZ2E9bmV3IHBkKGEpLHpiKGEsbGEoQWIsYS5nYSkpKSkpOihxYyhxYyhxYyhxYyhjLGQsRi5MLGEua2EpLGQsW0YuTSxGLmFhXSxhLmxhKSxkLCJtb3VzZW92ZXIiLGEuQWEpLGQsIm1vdXNlb3V0IixhLnphKSxhLmVhIT1jYSYmcWMoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fHFjKGMsZCwiZGJsY2xpY2siLGEuSmEpLEFiKGEuZ2EpLGEuZ2E9bnVsbCkpfTsKTi5wcm90b3R5cGUuUD1mdW5jdGlvbigpe04uaS5QLmNhbGwodGhpcyk7dGhpcy5XJiZGYyh0aGlzLlcpO3RoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJmtkKHRoaXMsITEpfTtOLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7Ti5pLnUuY2FsbCh0aGlzKTt0aGlzLlcmJih0aGlzLlcuTigpLGRlbGV0ZSB0aGlzLlcpO2RlbGV0ZSB0aGlzLkI7dGhpcy5nYT10aGlzLndhPXRoaXMuYmE9bnVsbH07dmFyIGhkPWZ1bmN0aW9uKGEsYil7YS5iYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm8mMSl9OwpOLnByb3RvdHlwZS5aPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYjtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0VuYWJsZWQmJiFiLmlzRW5hYmxlZCgpfHwhTyh0aGlzLDEsIWEpfHwoYXx8KHFkKHRoaXMsITEpLFAodGhpcywhMSkpLHRoaXMuaXNWaXNpYmxlKCkmJmtkKHRoaXMsYSksUSh0aGlzLDEsIWEsITApKX07CnZhciBQPWZ1bmN0aW9uKGEsYil7TyhhLDIsYikmJlEoYSwyLGIpfSxxZD1mdW5jdGlvbihhLGIpe08oYSw0LGIpJiZRKGEsNCxiKX0scmQ9ZnVuY3Rpb24oYSxiKXtPKGEsOCxiKSYmUShhLDgsYil9LHNkPWZ1bmN0aW9uKGEsYil7TyhhLDY0LGIpJiZRKGEsNjQsYil9LFE9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIWQmJjE9PWIpYS5aKCFjKTtlbHNlIGlmKGEudiZiJiZjIT0hIShhLm8mYikpe3ZhciBlPWEuQjtpZihkPWEuZigpKShlPW1kKGUsYikpJiZnZChhLGUsYyksbGQoZCxiLGMpO2Eubz1jP2Eub3xiOmEubyZ+Yn19LHRkPWZ1bmN0aW9uKGEsYixjKXtpZihhLm0mJmEubyZiJiYhYyl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTshYyYmYS5vJmImJlEoYSxiLCExKTthLnY9Yz9hLnZ8YjphLnYmfmJ9LFI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hISgyNTUmYikmJiEhKGEudiZiKX0sTz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuISEoYS52JmIpJiYhIShhLm8mCmIpIT1jJiYoIShhLksmYil8fHVjKGEsS2MoYixjKSkpJiYhYS5VfTtoPU4ucHJvdG90eXBlO2guQWE9ZnVuY3Rpb24oYSl7KCFhLnJlbGF0ZWRUYXJnZXR8fCFwYih0aGlzLmYoKSxhLnJlbGF0ZWRUYXJnZXQpKSYmdWModGhpcywiZW50ZXIiKSYmdGhpcy5pc0VuYWJsZWQoKSYmUih0aGlzLDIpJiZQKHRoaXMsITApfTtoLnphPWZ1bmN0aW9uKGEpe2EucmVsYXRlZFRhcmdldCYmcGIodGhpcy5mKCksYS5yZWxhdGVkVGFyZ2V0KXx8IXVjKHRoaXMsImxlYXZlIil8fChSKHRoaXMsNCkmJnFkKHRoaXMsITEpLFIodGhpcywyKSYmUCh0aGlzLCExKSl9O2guZWE9Y2E7Cmgua2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSxPYihhKSYmISh5JiZ6JiZhLmN0cmxLZXkpKSl7Uih0aGlzLDQpJiZxZCh0aGlzLCEwKTt2YXIgYjtpZihiPXRoaXMuQil7dmFyIGM7Yj10aGlzLnYmMzImJihjPXRoaXMuZigpKT9zYihjKSYmdGIoYyk6ITF9YiYmdGhpcy5mKCkuZm9jdXMoKX0hT2IoYSl8fHkmJnomJmEuY3RybEtleXx8YS5nKCl9O2gubGE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSx0aGlzLm8mNCYmdWQodGhpcyxhKSYmUih0aGlzLDQpJiZxZCh0aGlzLCExKSl9O2guSmE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmdWQodGhpcyxhKX07CnZhciB1ZD1mdW5jdGlvbihhLGIpe2lmKFIoYSwxNikpe3ZhciBjPSEoYS5vJjE2KTtPKGEsMTYsYykmJlEoYSwxNixjKX1SKGEsOCkmJnJkKGEsITApO1IoYSw2NCkmJnNkKGEsIShhLm8mNjQpKTtjPW5ldyBFKCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuQT1iLkEpO3JldHVybiB1YyhhLGMpfTtOLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe1IodGhpcywzMikmJk8odGhpcywzMiwhMCkmJlEodGhpcywzMiwhMCl9O04ucHJvdG90eXBlLkZhPWZ1bmN0aW9uKCl7Uih0aGlzLDQpJiZxZCh0aGlzLCExKTtSKHRoaXMsMzIpJiZPKHRoaXMsMzIsITEpJiZRKHRoaXMsMzIsITEpfTsKTi5wcm90b3R5cGUuZmE9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJjEzPT1hLmMmJnVkKHRoaXMsYSk/KGEuZygpLGEuaigpLCEwKTohMX07aWYoIWlhKE4pKXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBjbGFzcyAiK04pO2lmKCFpYShNKSl0aHJvdyBFcnJvcigiSW52YWxpZCByZW5kZXJlciBjbGFzcyAiK00pO3ZhciB2ZD1OW2phXXx8KE5bamFdPSsra2EpO1djW3ZkXT1NO1ZjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIHBkPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9ITE7dGhpcy5jPW5ldyBvYyh0aGlzKTt6Yih0aGlzLGxhKEFiLHRoaXMuYykpO2E9TmModGhpcy5iKTtIKEgoSCh0aGlzLmMsYSxGLkwsdGhpcy5oKSxhLEYuTSx0aGlzLmopLGEsImNsaWNrIix0aGlzLmcpfTtuKHBkLEMpO3ZhciB3ZD0hdnx8OTw9TnVtYmVyKGliKTsKcGQucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXt0aGlzLmE9ITF9O3BkLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7dGhpcy5hPSEwfTt2YXIgeGQ9ZnVuY3Rpb24oYSxiKXtpZighd2QpcmV0dXJuIGEuYnV0dG9uPTAsYS50eXBlPWIsYTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudHMiKTtjLmluaXRNb3VzZUV2ZW50KGIsYS5idWJibGVzLGEuY2FuY2VsYWJsZSxhLnZpZXd8fG51bGwsYS5kZXRhaWwsYS5zY3JlZW5YLGEuc2NyZWVuWSxhLmNsaWVudFgsYS5jbGllbnRZLGEuY3RybEtleSxhLmFsdEtleSxhLnNoaWZ0S2V5LGEubWV0YUtleSwwLGEucmVsYXRlZFRhcmdldHx8bnVsbCk7cmV0dXJuIGN9OwpwZC5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXtpZih0aGlzLmEpdGhpcy5hPSExO2Vsc2V7dmFyIGI9YS5iLGM9Yi5idXR0b24sZD1iLnR5cGUsZT14ZChiLCJtb3VzZWRvd24iKTt0aGlzLmIua2EobmV3IEcoZSxhLmEpKTtlPXhkKGIsIm1vdXNldXAiKTt0aGlzLmIubGEobmV3IEcoZSxhLmEpKTt3ZHx8KGIuYnV0dG9uPWMsYi50eXBlPWQpfX07cGQucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt0aGlzLmI9bnVsbDtwZC5pLnUuY2FsbCh0aGlzKX07dmFyIFM9ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO3RoaXMuZGE9Ynx8WGMuUigpO3RoaXMuSD1hfHwidmVydGljYWwifTtuKFMsSyk7aD1TLnByb3RvdHlwZTtoLkRhPW51bGw7aC5jYT1udWxsO2guZGE9bnVsbDtoLkg9bnVsbDtoLlQ9ITA7aC5PPSEwO2gubD0tMTtoLnM9bnVsbDtoLlY9ITE7aC5JPW51bGw7dmFyIHlkPWZ1bmN0aW9uKGEpe3JldHVybiBhLkRhfHxhLmYoKX07aD1TLnByb3RvdHlwZTtoLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPXRoaXMuai5iKCJESVYiLHRoaXMuZGEuYyh0aGlzKS5qb2luKCIgIikpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKGEpe3JldHVybiJESVYiPT1hLnRhZ05hbWV9O2gudmE9ZnVuY3Rpb24oYSl7dGhpcy5hPSRjKHRoaXMuZGEsdGhpcyxhKTsibm9uZSI9PWEuc3R5bGUuZGlzcGxheSYmKHRoaXMuVD0hMSl9OwpoLkQ9ZnVuY3Rpb24oKXtTLmkuRC5jYWxsKHRoaXMpO1FjKHRoaXMsZnVuY3Rpb24oYil7Yi5tJiZ6ZCh0aGlzLGIpfSx0aGlzKTt2YXIgYT10aGlzLmYoKTtiZCh0aGlzLmRhLHRoaXMpO0FkKHRoaXMsdGhpcy5UKTtIKEgoSChIKEgoSChIKEgoT2ModGhpcyksdGhpcywiZW50ZXIiLHRoaXMuV2EpLHRoaXMsImhpZ2hsaWdodCIsdGhpcy5YYSksdGhpcywidW5oaWdobGlnaHQiLHRoaXMuY2IpLHRoaXMsIm9wZW4iLHRoaXMuWWEpLHRoaXMsImNsb3NlIix0aGlzLlVhKSxhLEYuTCx0aGlzLlNhKSxxYihhKSxbRi5NLEYuYWFdLHRoaXMuVmEpLGEsW0YuTCxGLk0sRi5hYSwibW91c2VvdmVyIiwibW91c2VvdXQiLCJjb250ZXh0bWVudSJdLHRoaXMuVGEpO0JkKHRoaXMpfTt2YXIgQmQ9ZnVuY3Rpb24oYSl7dmFyIGI9T2MoYSksYz15ZChhKTtIKEgoSChiLGMsImZvY3VzIixhLkhhKSxjLCJibHVyIixhLlFhKSxhLmNhfHwoYS5jYT1uZXcgSih5ZChhKSkpLCJrZXkiLGEuUmEpfTtoPVMucHJvdG90eXBlOwpoLlA9ZnVuY3Rpb24oKXtDZCh0aGlzLC0xKTt0aGlzLnMmJnNkKHRoaXMucywhMSk7dGhpcy5WPSExO1MuaS5QLmNhbGwodGhpcyl9O2gudT1mdW5jdGlvbigpe1MuaS51LmNhbGwodGhpcyk7dGhpcy5jYSYmKHRoaXMuY2EuTigpLHRoaXMuY2E9bnVsbCk7dGhpcy5kYT10aGlzLnM9dGhpcy5JPXRoaXMuRGE9bnVsbH07aC5XYT1mdW5jdGlvbigpe3JldHVybiEwfTsKaC5YYT1mdW5jdGlvbihhKXt2YXIgYj1UYyh0aGlzLGEudGFyZ2V0KTtpZigtMTxiJiZiIT10aGlzLmwpe3ZhciBjPUwodGhpcyx0aGlzLmwpO2MmJlAoYywhMSk7dGhpcy5sPWI7Yz1MKHRoaXMsdGhpcy5sKTt0aGlzLlYmJnFkKGMsITApO3RoaXMucyYmYyE9dGhpcy5zJiYoYy52JjY0P3NkKGMsITApOnNkKHRoaXMucywhMSkpfWI9dGhpcy5mKCk7cShiLCJUaGUgRE9NIGVsZW1lbnQgZm9yIHRoZSBjb250YWluZXIgY2Fubm90IGJlIG51bGwuIik7bnVsbCE9YS50YXJnZXQuZigpJiZ4YihiLCJhY3RpdmVkZXNjZW5kYW50IixhLnRhcmdldC5mKCkuaWQpfTtoLmNiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT1MKHRoaXMsdGhpcy5sKSYmKHRoaXMubD0tMSk7YT10aGlzLmYoKTtxKGEsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnJlbW92ZUF0dHJpYnV0ZSh3YigiYWN0aXZlZGVzY2VuZGFudCIpKX07CmguWWE9ZnVuY3Rpb24oYSl7KGE9YS50YXJnZXQpJiZhIT10aGlzLnMmJmEuYj09dGhpcyYmKHRoaXMucyYmc2QodGhpcy5zLCExKSx0aGlzLnM9YSl9O2guVWE9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMucyYmKHRoaXMucz1udWxsKTt2YXIgYj10aGlzLmYoKSxjPWEudGFyZ2V0LmYoKTtiJiZhLnRhcmdldC5vJjImJmMmJihhPSIiLGMmJihhPWMuaWQscShhLCJUaGUgYWN0aXZlIGVsZW1lbnQgc2hvdWxkIGhhdmUgYW4gaWQuIikpLHhiKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEpKX07aC5TYT1mdW5jdGlvbihhKXt0aGlzLk8mJih0aGlzLlY9ITApO3ZhciBiPXlkKHRoaXMpO2ImJnNiKGIpJiZ0YihiKT9iLmZvY3VzKCk6YS5nKCl9O2guVmE9ZnVuY3Rpb24oKXt0aGlzLlY9ITF9OwpoLlRhPWZ1bmN0aW9uKGEpe2E6e3ZhciBiPWEudGFyZ2V0O2lmKHRoaXMuSSlmb3IodmFyIGM9dGhpcy5mKCk7YiYmYiE9PWM7KXt2YXIgZD1iLmlkO2lmKGQgaW4gdGhpcy5JKXtiPXRoaXMuSVtkXTticmVhayBhfWI9Yi5wYXJlbnROb2RlfWI9bnVsbH1pZihiKXN3aXRjaChhLnR5cGUpe2Nhc2UgRi5MOmIua2EoYSk7YnJlYWs7Y2FzZSBGLk06Y2FzZSBGLmFhOmIubGEoYSk7YnJlYWs7Y2FzZSAibW91c2VvdmVyIjpiLkFhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3V0IjpiLnphKGEpO2JyZWFrO2Nhc2UgImNvbnRleHRtZW51IjpiLmVhKGEpfX07aC5IYT1mdW5jdGlvbigpe307aC5RYT1mdW5jdGlvbigpe0NkKHRoaXMsLTEpO3RoaXMuVj0hMTt0aGlzLnMmJnNkKHRoaXMucywhMSl9OwpoLlJhPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmlzRW5hYmxlZCgpJiZ0aGlzLmlzVmlzaWJsZSgpJiYoMCE9UmModGhpcyl8fHRoaXMuRGEpJiZEZCh0aGlzLGEpPyhhLmcoKSxhLmooKSwhMCk6ITF9Owp2YXIgRGQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1MKGEsYS5sKTtpZihjJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5mYSYmYy5mYShiKXx8YS5zJiZhLnMhPWMmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLnMuZmEmJmEucy5mYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuYyl7Y2FzZSAyNzp5ZChhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpFZChhKTticmVhaztjYXNlIDM1OkZkKGEpO2JyZWFrO2Nhc2UgMzg6aWYoInZlcnRpY2FsIj09YS5IKUdkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9IZChhKTpHZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoInZlcnRpY2FsIj09YS5IKUhkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9HZChhKTpIZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSx6ZD1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZigpO2M9Yy5pZHx8KGMuaWQ9TGMoYikpO2EuSXx8KGEuST17fSk7YS5JW2NdPWJ9O1MucHJvdG90eXBlLnNhPWZ1bmN0aW9uKGEsYil7Q2EoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtTLmkuc2EuY2FsbCh0aGlzLGEsYil9O1MucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEsYixjKXtDYShhLE4pO2EuS3w9MjthLkt8PTY0O3RkKGEsMzIsITEpO2EubSYmMCE9YS55YSYmb2QoYSwhMSk7YS55YT0hMTt2YXIgZD1hLmI9PXRoaXM/VGModGhpcyxhKTotMTtTLmkudGEuY2FsbCh0aGlzLGEsYixjKTthLm0mJnRoaXMubSYmemQodGhpcyxhKTthPWQ7LTE9PWEmJihhPVJjKHRoaXMpKTthPT10aGlzLmw/dGhpcy5sPU1hdGgubWluKFJjKHRoaXMpLTEsYik6YT50aGlzLmwmJmI8PXRoaXMubD90aGlzLmwrKzphPHRoaXMubCYmYj50aGlzLmwmJnRoaXMubC0tfTsKdmFyIGFkPWZ1bmN0aW9uKGEsYil7aWYoYS5mKCkpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5IPWJ9O1MucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O3ZhciBBZD1mdW5jdGlvbihhLGIpe2EuVD1iO3ZhciBjPWEuZigpO2MmJihjLnN0eWxlLmRpc3BsYXk9Yj8iIjoibm9uZSIsWWMoeWQoYSksYS5PJiZhLlQpKX07Uy5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT307Uy5wcm90b3R5cGUuWj1mdW5jdGlvbihhKXt0aGlzLk8hPWEmJnVjKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5PPSEwLFFjKHRoaXMsZnVuY3Rpb24oYil7Yi5MYT9kZWxldGUgYi5MYTpiLlooITApfSkpOihRYyh0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5aKCExKTpiLkxhPSEwfSksdGhpcy5WPXRoaXMuTz0hMSksWWMoeWQodGhpcyksYSYmdGhpcy5UKSl9Owp2YXIgQ2Q9ZnVuY3Rpb24oYSxiKXsoYj1MKGEsYikpP1AoYiwhMCk6LTE8YS5sJiZQKEwoYSxhLmwpLCExKX0sRWQ9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LFJjKGEpLTEpfSxGZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiAwPmI/Yy0xOmJ9LDApfSxIZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7cmV0dXJuKGIrMSklY30sYS5sKX0sR2Q9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe2ItLTtyZXR1cm4gMD5iP2MtMTpifSxhLmwpfSxJZD1mdW5jdGlvbihhLGIsYyl7Yz0wPmM/VGMoYSxhLnMpOmM7dmFyIGQ9UmMoYSk7Yz1iLmNhbGwoYSxjLGQpO2Zvcih2YXIgZT0wO2U8PWQ7KXt2YXIgZj1MKGEsYyksZztpZihnPWYpZz1mLmlzVmlzaWJsZSgpJiZmLmlzRW5hYmxlZCgpJiYhIShmLnYmMik7aWYoZyl7YS5FYShjKTticmVha31lKys7Yz1iLmNhbGwoYSxjLGQpfX07ClMucHJvdG90eXBlLkVhPWZ1bmN0aW9uKGEpe0NkKHRoaXMsYSl9O3ZhciBUPWZ1bmN0aW9uKCl7fTtuKFQsTSk7ZGEoVCk7VC5wcm90b3R5cGUuYT1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYiJ9O1QucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXtyZXR1cm4idGFiIn07VC5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYj1ULmkuYy5jYWxsKHRoaXMsYSk7KGE9YS5QYSkmJmImJihiLnRpdGxlPWF8fCIiKTtyZXR1cm4gYn07VC5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIpe2I9VC5pLmcuY2FsbCh0aGlzLGEsYik7dmFyIGM9Yi50aXRsZXx8IiI7YyYmKGEuUGE9Yyk7YS5vJjgmJihjPWEuYikmJmlhKGMuRykmJihRKGEsOCwhMSksYy5HKGEpKTtyZXR1cm4gYn07dmFyIEpkPWZ1bmN0aW9uKGEsYixjKXtOLmNhbGwodGhpcyxhLGJ8fFQuUigpLGMpO3RkKHRoaXMsOCwhMCk7dGhpcy5LfD05fTtuKEpkLE4pO1ZjKCJnb29nLXRhYiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEpkKG51bGwpfSk7dmFyIFU9ZnVuY3Rpb24oKXt0aGlzLmg9InRhYmxpc3QifTtuKFUsWGMpO2RhKFUpO1UucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWItYmFyIn07VS5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIsYyl7dGhpcy5qfHwodGhpcy5hfHxLZCh0aGlzKSx0aGlzLmo9c2EodGhpcy5hKSk7dmFyIGQ9dGhpcy5qW2JdO2Q/KGFkKGEsTGQoZCkpLGEuQj1kKTpVLmkuZy5jYWxsKHRoaXMsYSxiLGMpfTtVLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPVUuaS5jLmNhbGwodGhpcyxhKTt0aGlzLmF8fEtkKHRoaXMpO2IucHVzaCh0aGlzLmFbYS5CXSk7cmV0dXJuIGJ9O3ZhciBLZD1mdW5jdGlvbihhKXt2YXIgYj1hLmIoKTthLmE9e3RvcDpiKyItdG9wIixib3R0b206YisiLWJvdHRvbSIsc3RhcnQ6YisiLXN0YXJ0IixlbmQ6YisiLWVuZCJ9fTt2YXIgVj1mdW5jdGlvbihhLGIsYyl7YT1hfHwidG9wIjthZCh0aGlzLExkKGEpKTt0aGlzLkI9YTtTLmNhbGwodGhpcyx0aGlzLkgsYnx8VS5SKCksYyk7TWQodGhpcyl9O24oVixTKTtoPVYucHJvdG90eXBlO2guQz1udWxsO2guRD1mdW5jdGlvbigpe1YuaS5ELmNhbGwodGhpcyk7TWQodGhpcyl9O2gudT1mdW5jdGlvbigpe1YuaS51LmNhbGwodGhpcyk7dGhpcy5DPW51bGx9O2guRWE9ZnVuY3Rpb24oYSl7Vi5pLkVhLmNhbGwodGhpcyxhKTt0aGlzLkcoTCh0aGlzLGEpKX07aC5HPWZ1bmN0aW9uKGEpe2E/cmQoYSwhMCk6dGhpcy5DJiZyZCh0aGlzLkMsITEpfTsKdmFyIE5kPWZ1bmN0aW9uKGEsYil7aWYoYiYmYj09YS5DKXtmb3IodmFyIGM9VGMoYSxiKSxkPWMtMTtiPUwoYSxkKTtkLS0pe3ZhciBlPWI7aWYoZS5pc1Zpc2libGUoKSYmZS5pc0VuYWJsZWQoKSl7YS5HKGIpO3JldHVybn19Zm9yKGMrPTE7Yj1MKGEsYyk7YysrKWlmKGQ9YixkLmlzVmlzaWJsZSgpJiZkLmlzRW5hYmxlZCgpKXthLkcoYik7cmV0dXJufWEuRyhudWxsKX19O2g9Vi5wcm90b3R5cGU7aC5hYj1mdW5jdGlvbihhKXt0aGlzLkMmJnRoaXMuQyE9YS50YXJnZXQmJnJkKHRoaXMuQywhMSk7dGhpcy5DPWEudGFyZ2V0fTtoLmJiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT10aGlzLkMmJih0aGlzLkM9bnVsbCl9O2guWmE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guJGE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guSGE9ZnVuY3Rpb24oKXtMKHRoaXMsdGhpcy5sKXx8Q2QodGhpcyxUYyh0aGlzLHRoaXMuQ3x8TCh0aGlzLDApKSl9Owp2YXIgTWQ9ZnVuY3Rpb24oYSl7SChIKEgoSChPYyhhKSxhLCJzZWxlY3QiLGEuYWIpLGEsInVuc2VsZWN0IixhLmJiKSxhLCJkaXNhYmxlIixhLlphKSxhLCJoaWRlIixhLiRhKX0sTGQ9ZnVuY3Rpb24oYSl7cmV0dXJuInN0YXJ0Ij09YXx8ImVuZCI9PWE/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O1ZjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBWfSk7ZnVuY3Rpb24gT2QoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIFBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgZz1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIrZyk7Zm9yKHZhciBrPVtdLHA9YmEoYyksdz1wLm5leHQoKTshdy5kb25lO3c9cC5uZXh0KCkpe3c9dy52YWx1ZTt2YXIgQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKQi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO0IudGV4dENvbnRlbnQ9dztmLmFwcGVuZENoaWxkKEIpO2sucHVzaChCKX0iYm90dG9tIiE9ZyYmZS5hcHBlbmRDaGlsZChmKTtwPW51bGw7aWYoInRvcCI9PWd8fCJib3R0b20iPT1nKXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTsidG9wIj09ZyYmcCYmZS5hcHBlbmRDaGlsZChwKTtCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0IuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciByYT1bXTtjPWJhKGMpO2Zvcih3PWMubmV4dCgpOyF3LmRvbmU7dz1jLm5leHQoKSl3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHcuaWQ9ZS5pZCsiX2NvbnRlbnRfIityYS5sZW5ndGgsdy5zdHlsZS5kaXNwbGF5PSJub25lIixCLmFwcGVuZENoaWxkKHcpLHJhLnB1c2godyk7ZS5hcHBlbmRDaGlsZChCKTsiYm90dG9tIj09ZyYmKHAmJgplLmFwcGVuZENoaWxkKHApLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBYPW5ldyBWKGcpO1BjKFgsZik7dmFyIFk9LTE7ZGMoWCwic2VsZWN0IixmdW5jdGlvbihaKXtaPWsuaW5kZXhPZihaLnRhcmdldC5mKCkpO1ohPVkmJigwPD1ZJiZZPHJhLmxlbmd0aCYmKHJhW1ldLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFk9LTEpLDA8PVomJlo8cmEubGVuZ3RoJiYoWT1aLHJhW1ldLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksWC5HKEwoWCxZKSkpfSk7WC5HKEwoWCxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFope1guRyhMKFgsWikpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChPZChhKSl9LFFkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sVz1sOwpRZFswXWluIFd8fCJ1bmRlZmluZWQiPT10eXBlb2YgVy5leGVjU2NyaXB0fHxXLmV4ZWNTY3JpcHQoInZhciAiK1FkWzBdKTtmb3IodmFyIFJkO1FkLmxlbmd0aCYmKFJkPVFkLnNoaWZ0KCkpOylRZC5sZW5ndGh8fHZvaWQgMD09PVBkP1dbUmRdJiZXW1JkXSE9PU9iamVjdC5wcm90b3R5cGVbUmRdP1c9V1tSZF06Vz1XW1JkXT17fTpXW1JkXT1QZDt9KS5jYWxsKHRoaXMpOwovLyBjbGFuZy1mb3JtYXQgb24K", + "headers": [ + [ + "content-type", + "application/javascript" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + } + } + }, + "executionInfo": { + "elapsed": 7394, + "status": "ok", + "timestamp": 1600709615059, + "user": { + "displayName": "Evgeny Skvortsov", + "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhiQjODaOVLfYnUuWS9rB3LRntzJDM0hqElzsUkdQ=s64", + "userId": "11510585406840398626" + }, + "user_tz": 420 + }, + "id": "irse8Jg7XQMD", + "outputId": "1efbf894-bd6f-4983-c637-8bc12fe766da" + }, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id9" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id9" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id9" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9274dffa-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id9\", \"tabNames\": [\"Test\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_5973d390df" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id9" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9275343c-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id9\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_c7c49f98ef" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id9" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"92767c3e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_aeb0c0ef0b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id9_content_1", + "outputarea_id9" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9276cd10-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id9_content_1\");\n", + "//# sourceURL=js_4bd27e0073" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id9_content_1", + "outputarea_id9" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"92772454-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9276cd10-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_1d61b09a5d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id9_content_1", + "outputarea_id9" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"92776ffe-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id9\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_592035fa05" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id9_content_1", + "outputarea_id9" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running Test\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"9279e1a8-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"92767c3e-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_f32d791f1c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id9_content_1", + "outputarea_id9" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"927b45c0-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b09a2f0566" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id9_content_0", + "outputarea_id9" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"927b93c2-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id9_content_0\");\n", + "//# sourceURL=js_04b02c54bc" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id9_content_0", + "outputarea_id9" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"927bdf26-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"927b93c2-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_fef55176e6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id9_content_0", + "outputarea_id9" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"927c285a-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id9\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_fcacea4fc5" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id9_content_0", + "outputarea_id9" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id9_content_0", + "outputarea_id10", + "outputarea_id9", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id9_content_0", + "outputarea_id10", + "outputarea_id9", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id9_content_0", + "outputarea_id10", + "outputarea_id9", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"927dbd32-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id10\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_875e8c97ed" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id9_content_0", + "outputarea_id10", + "outputarea_id9", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"927e1200-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id10\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_a311aed609" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id9_content_0", + "outputarea_id10", + "outputarea_id9", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"927f43aa-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_f45043f8f3" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id10_content_0", + "id9_content_0", + "outputarea_id10", + "outputarea_id9", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"927f8a9a-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id10_content_0\");\n", + "//# sourceURL=js_892168072c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id10_content_0", + "id9_content_0", + "outputarea_id10", + "outputarea_id9", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"927fd9dc-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"927f8a9a-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_a3c5955e55" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id10_content_0", + "id9_content_0", + "outputarea_id10", + "outputarea_id9", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"92801dd4-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id10\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_b59154d867" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id10_content_0", + "id9_content_0", + "outputarea_id10", + "outputarea_id9", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mTest_sql\u001b[0m variable.\n", + "SELECT\n", + " ((((((10) * (10))) + (((2) * (10))))) + (5)) AS y;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"92811efa-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"927f43aa-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_9d3b09c2c9" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id10_content_0", + "id9_content_0", + "outputarea_id10", + "outputarea_id9", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"92826350-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"927b45c0-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_25b64a36da" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id9_content_0", + "outputarea_id9" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9283c740-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_5d1258c280" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id9_content_1", + "outputarea_id9" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"928416b4-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id9_content_1\");\n", + "//# sourceURL=js_ea91d4133c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id9_content_1", + "outputarea_id9" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"92846bfa-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"928416b4-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_5cd86d8daa" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id9_content_1", + "outputarea_id9" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9284af02-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id9\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_dcdc91bf3f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id9_content_1", + "outputarea_id9" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"930351fe-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9283c740-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_44bbf8e065" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id9_content_1", + "outputarea_id9" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9304aae0-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_e0c8aa175e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id9_content_0", + "outputarea_id9" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9304f234-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id9_content_0\");\n", + "//# sourceURL=js_f990570ae3" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id9_content_0", + "outputarea_id9" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"930544e6-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9304f234-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_7abff8772c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id9_content_0", + "outputarea_id9" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"930588f2-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id9\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_d8ad7ad3ad" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id9_content_0", + "outputarea_id9" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93066f74-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_dc61092d2b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id10_content_1", + "id9_content_0", + "outputarea_id10", + "outputarea_id9", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9306bfa6-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id10_content_1\");\n", + "//# sourceURL=js_48372c2eb7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id10_content_1", + "id9_content_0", + "outputarea_id10", + "outputarea_id9", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"930700c4-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9306bfa6-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_8fd2bbe496" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id10_content_1", + "id9_content_0", + "outputarea_id10", + "outputarea_id9", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93073bca-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id10\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_74b4019f9f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id10_content_1", + "id9_content_0", + "outputarea_id10", + "outputarea_id9", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mTest\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
y
0125
\n", + "
" + ], + "text/plain": [ + " y\n", + "0 125" + ] + }, + "metadata": { + "tags": [ + "id10_content_1", + "id9_content_0", + "outputarea_id10", + "outputarea_id9", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"930a4c20-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"93066f74-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_262bf7a46a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id10_content_1", + "id9_content_0", + "outputarea_id10", + "outputarea_id9", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"930b7f0a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9304aae0-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_97e10861f7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id9_content_0", + "outputarea_id9" + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "%%logica Test\n", + "\n", + "Test(y: value) :-\n", + " value == x * x + 2 * x + 5,\n", + " x == 10;\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "zQ5x660dMNXT" + }, + "source": [ + "There are a couple of syntactical conventions regarding field names.\n", + "\n", + "If field value is omitted, then it is assumed that field value is the variable with the same name as field name.\n", + "\n", + "If field name is omitted then field name is assumed to be equal to colX, where X is at which position the field stands." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 177, + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH0=", + "headers": [ + [ + "content-type", + "text/css" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgaCxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9ZnVuY3Rpb24oYSl7dmFyIGI9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmYVtTeW1ib2wuaXRlcmF0b3JdO3JldHVybiBiP2IuY2FsbChhKTp7bmV4dDphYShhKX19LGw9dGhpc3x8c2VsZixjYT1mdW5jdGlvbigpe30sZGE9ZnVuY3Rpb24oYSl7YS5CYT12b2lkIDA7YS5SPWZ1bmN0aW9uKCl7cmV0dXJuIGEuQmE/YS5CYTphLkJhPW5ldyBhfX0sZWE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7aWYoIm9iamVjdCI9PWIpaWYoYSl7aWYoYSBpbnN0YW5jZW9mIEFycmF5KXJldHVybiJhcnJheSI7aWYoYSBpbnN0YW5jZW9mIE9iamVjdClyZXR1cm4gYjt2YXIgYz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk7aWYoIltvYmplY3QgV2luZG93XSI9PWMpcmV0dXJuIm9iamVjdCI7CmlmKCJbb2JqZWN0IEFycmF5XSI9PWN8fCJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGgmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5zcGxpY2UmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoInNwbGljZSIpKXJldHVybiJhcnJheSI7aWYoIltvYmplY3QgRnVuY3Rpb25dIj09Y3x8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmNhbGwmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoImNhbGwiKSlyZXR1cm4iZnVuY3Rpb24ifWVsc2UgcmV0dXJuIm51bGwiO2Vsc2UgaWYoImZ1bmN0aW9uIj09YiYmInVuZGVmaW5lZCI9PXR5cGVvZiBhLmNhbGwpcmV0dXJuIm9iamVjdCI7cmV0dXJuIGJ9LGZhPWZ1bmN0aW9uKGEpe3JldHVybiJhcnJheSI9PWVhKGEpfSxoYT1mdW5jdGlvbihhKXt2YXIgYj1lYShhKTtyZXR1cm4iYXJyYXkiPT1ifHwib2JqZWN0Ij09CmImJiJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGh9LGlhPWZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PWVhKGEpfSxtPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBhO3JldHVybiJvYmplY3QiPT1iJiZudWxsIT1hfHwiZnVuY3Rpb24iPT1ifSxqYT0iY2xvc3VyZV91aWRfIisoMUU5Kk1hdGgucmFuZG9tKCk+Pj4wKSxrYT0wLGxhPWZ1bmN0aW9uKGEsYil7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe3ZhciBkPWMuc2xpY2UoKTtkLnB1c2guYXBwbHkoZCxhcmd1bWVudHMpO3JldHVybiBhLmFwcGx5KHRoaXMsZCl9fSxuPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe31jLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLmk9Yi5wcm90b3R5cGU7YS5wcm90b3R5cGU9bmV3IGM7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YX07dmFyIG1hLG5hPXtlYjoiYWN0aXZlZGVzY2VuZGFudCIsamI6ImF0b21pYyIsa2I6ImF1dG9jb21wbGV0ZSIsbWI6ImJ1c3kiLHBiOiJjaGVja2VkIixxYjoiY29saW5kZXgiLHZiOiJjb250cm9scyIseGI6ImRlc2NyaWJlZGJ5IixBYjoiZGlzYWJsZWQiLENiOiJkcm9wZWZmZWN0IixEYjoiZXhwYW5kZWQiLEViOiJmbG93dG8iLEdiOiJncmFiYmVkIixLYjoiaGFzcG9wdXAiLE1iOiJoaWRkZW4iLE9iOiJpbnZhbGlkIixQYjoibGFiZWwiLFFiOiJsYWJlbGxlZGJ5IixSYjoibGV2ZWwiLFdiOiJsaXZlIixrYzoibXVsdGlsaW5lIixsYzoibXVsdGlzZWxlY3RhYmxlIixwYzoib3JpZW50YXRpb24iLHFjOiJvd25zIixyYzoicG9zaW5zZXQiLHRjOiJwcmVzc2VkIix4YzoicmVhZG9ubHkiLHpjOiJyZWxldmFudCIsQWM6InJlcXVpcmVkIixFYzoicm93aW5kZXgiLEhjOiJzZWxlY3RlZCIsSmM6InNldHNpemUiLExjOiJzb3J0IixaYzoidmFsdWVtYXgiLCRjOiJ2YWx1ZW1pbiIsYWQ6InZhbHVlbm93IiwKYmQ6InZhbHVldGV4dCJ9O3ZhciBvYT1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkIGluIGEpYi5jYWxsKGMsYVtkXSxkLGEpfSxwYT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyBpbiBhKWlmKGFbY109PWIpcmV0dXJuITA7cmV0dXJuITF9LHFhPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsIT09YSYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfSxzYT1mdW5jdGlvbihhKXt2YXIgYj17fSxjO2ZvcihjIGluIGEpYlthW2NdXT1jO3JldHVybiBifSx0YT0iY29uc3RydWN0b3IgaGFzT3duUHJvcGVydHkgaXNQcm90b3R5cGVPZiBwcm9wZXJ0eUlzRW51bWVyYWJsZSB0b0xvY2FsZVN0cmluZyB0b1N0cmluZyB2YWx1ZU9mIi5zcGxpdCgiICIpLHVhPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8dGEubGVuZ3RoO2YrKyljPQp0YVtmXSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZCxjKSYmKGFbY109ZFtjXSl9fTt2YXIgdmE9e2ZiOiJhbGVydCIsZ2I6ImFsZXJ0ZGlhbG9nIixoYjoiYXBwbGljYXRpb24iLGliOiJhcnRpY2xlIixsYjoiYmFubmVyIixuYjoiYnV0dG9uIixvYjoiY2hlY2tib3giLHJiOiJjb2x1bW5oZWFkZXIiLHNiOiJjb21ib2JveCIsdGI6ImNvbXBsZW1lbnRhcnkiLHViOiJjb250ZW50aW5mbyIsd2I6ImRlZmluaXRpb24iLHliOiJkaWFsb2ciLHpiOiJkaXJlY3RvcnkiLEJiOiJkb2N1bWVudCIsRmI6ImZvcm0iLEhiOiJncmlkIixJYjoiZ3JpZGNlbGwiLEpiOiJncm91cCIsTGI6ImhlYWRpbmciLE5iOiJpbWciLFNiOiJsaW5rIixUYjoibGlzdCIsVWI6Imxpc3Rib3giLFZiOiJsaXN0aXRlbSIsWGI6ImxvZyIsWWI6Im1haW4iLFpiOiJtYXJxdWVlIiwkYjoibWF0aCIsYWM6Im1lbnUiLGJjOiJtZW51YmFyIixjYzoibWVudWl0ZW0iLGRjOiJtZW51aXRlbWNoZWNrYm94IixlYzoibWVudWl0ZW1yYWRpbyIsbWM6Im5hdmlnYXRpb24iLG5jOiJub3RlIixvYzoib3B0aW9uIiwKc2M6InByZXNlbnRhdGlvbiIsdWM6InByb2dyZXNzYmFyIix2YzoicmFkaW8iLHdjOiJyYWRpb2dyb3VwIix5YzoicmVnaW9uIixCYzoicm93IixDYzoicm93Z3JvdXAiLERjOiJyb3doZWFkZXIiLEZjOiJzY3JvbGxiYXIiLEdjOiJzZWFyY2giLEljOiJzZXBhcmF0b3IiLEtjOiJzbGlkZXIiLE1jOiJzcGluYnV0dG9uIixOYzoic3RhdHVzIixPYzoidGFiIixQYzoidGFibGlzdCIsUWM6InRhYnBhbmVsIixSYzoidGV4dGJveCIsU2M6InRleHRpbmZvIixUYzoidGltZXIiLFVjOiJ0b29sYmFyIixWYzoidG9vbHRpcCIsV2M6InRyZWUiLFhjOiJ0cmVlZ3JpZCIsWWM6InRyZWVpdGVtIn07dmFyIHdhPWZ1bmN0aW9uKGEpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsd2EpO2Vsc2V7dmFyIGI9RXJyb3IoKS5zdGFjaztiJiYodGhpcy5zdGFjaz1iKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSl9O24od2EsRXJyb3IpO3dhLnByb3RvdHlwZS5uYW1lPSJDdXN0b21FcnJvciI7dmFyIHhhO3ZhciB5YT1mdW5jdGlvbihhLGIpe2E9YS5zcGxpdCgiJXMiKTtmb3IodmFyIGM9IiIsZD1hLmxlbmd0aC0xLGU9MDtlPGQ7ZSsrKWMrPWFbZV0rKGU8Yi5sZW5ndGg/YltlXToiJXMiKTt3YS5jYWxsKHRoaXMsYythW2RdKX07bih5YSx3YSk7eWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjsKdmFyIHphPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSJBc3NlcnRpb24gZmFpbGVkIjtpZihjKXtlKz0iOiAiK2M7dmFyIGY9ZH1lbHNlIGEmJihlKz0iOiAiK2EsZj1iKTt0aHJvdyBuZXcgeWEoIiIrZSxmfHxbXSk7fSxxPWZ1bmN0aW9uKGEsYixjKXthfHx6YSgiIixudWxsLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX0sQWE9ZnVuY3Rpb24oYSxiLGMpe20oYSkmJjE9PWEubm9kZVR5cGV8fHphKCJFeHBlY3RlZCBFbGVtZW50IGJ1dCBnb3QgJXM6ICVzLiIsW2VhKGEpLGFdLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKX0sQ2E9ZnVuY3Rpb24oYSxiLGMsZCl7YSBpbnN0YW5jZW9mIGJ8fHphKCJFeHBlY3RlZCBpbnN0YW5jZW9mICVzIGJ1dCBnb3QgJXMuIixbQmEoYiksQmEoYSldLGMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpKX0sQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZgpGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTpudWxsPT09YT8ibnVsbCI6dHlwZW9mIGF9O3ZhciBEYT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3EobnVsbCE9YS5sZW5ndGgpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKCJzdHJpbmciPT09dHlwZW9mIGEpcmV0dXJuInN0cmluZyIhPT10eXBlb2YgYnx8MSE9Yi5sZW5ndGg/LTE6YS5pbmRleE9mKGIsMCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspaWYoYyBpbiBhJiZhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX0scj1BcnJheS5wcm90b3R5cGUuZm9yRWFjaD9mdW5jdGlvbihhLGIsYyl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsYyl9OmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9YS5sZW5ndGgsZT0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZj0wO2Y8ZDtmKyspZiBpbiBlJiZiLmNhbGwoYyxlW2ZdLGYsYSl9LEVhPUFycmF5LnByb3RvdHlwZS5maWx0ZXI/CmZ1bmN0aW9uKGEsYil7cShudWxsIT1hLmxlbmd0aCk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD1bXSxlPTAsZj0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZz0wO2c8YztnKyspaWYoZyBpbiBmKXt2YXIgaz1mW2ddO2IuY2FsbCh2b2lkIDAsayxnLGEpJiYoZFtlKytdPWspfXJldHVybiBkfSxGYT1BcnJheS5wcm90b3R5cGUuZXZlcnk/ZnVuY3Rpb24oYSxiKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmV2ZXJ5LmNhbGwoYSxiLHZvaWQgMCl9OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWEubGVuZ3RoLGQ9InN0cmluZyI9PT10eXBlb2YgYT9hLnNwbGl0KCIiKTphLGU9MDtlPGM7ZSsrKWlmKGUgaW4gZCYmIWIuY2FsbCh2b2lkIDAsZFtlXSxlLGEpKXJldHVybiExO3JldHVybiEwfSxHYT1mdW5jdGlvbihhLGIpe3JldHVybiAwPD0KRGEoYSxiKX0sSGE9ZnVuY3Rpb24oYSxiKXtiPURhKGEsYik7dmFyIGM7aWYoYz0wPD1iKXEobnVsbCE9YS5sZW5ndGgpLEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhLGIsMSk7cmV0dXJuIGN9LElhPWZ1bmN0aW9uKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGFyZ3VtZW50cyl9LEphPWZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDA8Yil7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX0sTGE9ZnVuY3Rpb24oYSxiLGMsZCl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShhLEthKGFyZ3VtZW50cywxKSl9LEthPWZ1bmN0aW9uKGEsYixjKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gMj49YXJndW1lbnRzLmxlbmd0aD9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsYixjKX07dmFyIE1hPVN0cmluZy5wcm90b3R5cGUudHJpbT9mdW5jdGlvbihhKXtyZXR1cm4gYS50cmltKCl9OmZ1bmN0aW9uKGEpe3JldHVybi9eW1xzXHhhMF0qKFtcc1xTXSo/KVtcc1x4YTBdKiQvLmV4ZWMoYSlbMV19LE5hPS8mL2csT2E9LzwvZyxQYT0vPi9nLFFhPS8iL2csUmE9LycvZyxTYT0vXHgwMC9nLFRhPS9bXHgwMCY8PiInXS8sdD1mdW5jdGlvbihhLGIpe3JldHVybi0xIT1hLmluZGV4T2YoYil9LFVhPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE8Yj8tMTphPmI/MTowfTt2YXIgdTthOnt2YXIgVmE9bC5uYXZpZ2F0b3I7aWYoVmEpe3ZhciBXYT1WYS51c2VyQWdlbnQ7aWYoV2Epe3U9V2E7YnJlYWsgYX19dT0iIn07LyoKCiBDb3B5cmlnaHQgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzLgogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKKi8KdmFyIFhhPWZ1bmN0aW9uKGEpe1RhLnRlc3QoYSkmJigtMSE9YS5pbmRleE9mKCImIikmJihhPWEucmVwbGFjZShOYSwiJmFtcDsiKSksLTEhPWEuaW5kZXhPZigiPCIpJiYoYT1hLnJlcGxhY2UoT2EsIiZsdDsiKSksLTEhPWEuaW5kZXhPZigiPiIpJiYoYT1hLnJlcGxhY2UoUGEsIiZndDsiKSksLTEhPWEuaW5kZXhPZignIicpJiYoYT1hLnJlcGxhY2UoUWEsIiZxdW90OyIpKSwtMSE9YS5pbmRleE9mKCInIikmJihhPWEucmVwbGFjZShSYSwiJiMzOTsiKSksLTEhPWEuaW5kZXhPZigiXHgwMCIpJiYoYT1hLnJlcGxhY2UoU2EsIiYjMDsiKSkpO3JldHVybiBhfTt2YXIgWWE9ZnVuY3Rpb24oYSl7WWFbIiAiXShhKTtyZXR1cm4gYX07WWFbIiAiXT1jYTt2YXIgJGE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1aYTtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsYSk/Y1thXTpjW2FdPWIoYSl9O3ZhciBhYj10KHUsIk9wZXJhIiksdj10KHUsIlRyaWRlbnQiKXx8dCh1LCJNU0lFIiksYmI9dCh1LCJFZGdlIikseD10KHUsIkdlY2tvIikmJiEodCh1LnRvTG93ZXJDYXNlKCksIndlYmtpdCIpJiYhdCh1LCJFZGdlIikpJiYhKHQodSwiVHJpZGVudCIpfHx0KHUsIk1TSUUiKSkmJiF0KHUsIkVkZ2UiKSx5PXQodS50b0xvd2VyQ2FzZSgpLCJ3ZWJraXQiKSYmIXQodSwiRWRnZSIpLHo9dCh1LCJNYWNpbnRvc2giKSxjYj1mdW5jdGlvbigpe3ZhciBhPWwuZG9jdW1lbnQ7cmV0dXJuIGE/YS5kb2N1bWVudE1vZGU6dm9pZCAwfSxkYjsKYTp7dmFyIGViPSIiLGZiPWZ1bmN0aW9uKCl7dmFyIGE9dTtpZih4KXJldHVybi9ydjooW15cKTtdKykoXCl8OykvLmV4ZWMoYSk7aWYoYmIpcmV0dXJuL0VkZ2VcLyhbXGRcLl0rKS8uZXhlYyhhKTtpZih2KXJldHVybi9cYig/Ok1TSUV8cnYpWzogXShbXlwpO10rKShcKXw7KS8uZXhlYyhhKTtpZih5KXJldHVybi9XZWJLaXRcLyhcUyspLy5leGVjKGEpO2lmKGFiKXJldHVybi8oPzpWZXJzaW9uKVsgXC9dPyhcUyspLy5leGVjKGEpfSgpO2ZiJiYoZWI9ZmI/ZmJbMV06IiIpO2lmKHYpe3ZhciBnYj1jYigpO2lmKG51bGwhPWdiJiZnYj5wYXJzZUZsb2F0KGViKSl7ZGI9U3RyaW5nKGdiKTticmVhayBhfX1kYj1lYn0KdmFyIGhiPWRiLFphPXt9LEE9ZnVuY3Rpb24oYSl7cmV0dXJuICRhKGEsZnVuY3Rpb24oKXtmb3IodmFyIGI9MCxjPU1hKFN0cmluZyhoYikpLnNwbGl0KCIuIiksZD1NYShTdHJpbmcoYSkpLnNwbGl0KCIuIiksZT1NYXRoLm1heChjLmxlbmd0aCxkLmxlbmd0aCksZj0wOzA9PWImJmY8ZTtmKyspe3ZhciBnPWNbZl18fCIiLGs9ZFtmXXx8IiI7ZG97Zz0vKFxkKikoXEQqKSguKikvLmV4ZWMoZyl8fFsiIiwiIiwiIiwiIl07az0vKFxkKikoXEQqKSguKikvLmV4ZWMoayl8fFsiIiwiIiwiIiwiIl07aWYoMD09Z1swXS5sZW5ndGgmJjA9PWtbMF0ubGVuZ3RoKWJyZWFrO2I9VWEoMD09Z1sxXS5sZW5ndGg/MDpwYXJzZUludChnWzFdLDEwKSwwPT1rWzFdLmxlbmd0aD8wOnBhcnNlSW50KGtbMV0sMTApKXx8VWEoMD09Z1syXS5sZW5ndGgsMD09a1syXS5sZW5ndGgpfHxVYShnWzJdLGtbMl0pO2c9Z1szXTtrPWtbM119d2hpbGUoMD09Yil9cmV0dXJuIDA8PWJ9KX0saWI7CmliPWwuZG9jdW1lbnQmJnY/Y2IoKTp2b2lkIDA7dmFyIGpiPSF2fHw5PD1OdW1iZXIoaWIpO3ZhciBsYj1mdW5jdGlvbihhLGIpe29hKGIsZnVuY3Rpb24oYyxkKXtjJiYib2JqZWN0Ij09dHlwZW9mIGMmJmMuZGQmJihjPWMuY2QoKSk7InN0eWxlIj09ZD9hLnN0eWxlLmNzc1RleHQ9YzoiY2xhc3MiPT1kP2EuY2xhc3NOYW1lPWM6ImZvciI9PWQ/YS5odG1sRm9yPWM6a2IuaGFzT3duUHJvcGVydHkoZCk/YS5zZXRBdHRyaWJ1dGUoa2JbZF0sYyk6MD09ZC5sYXN0SW5kZXhPZigiYXJpYS0iLDApfHwwPT1kLmxhc3RJbmRleE9mKCJkYXRhLSIsMCk/YS5zZXRBdHRyaWJ1dGUoZCxjKTphW2RdPWN9KX0sa2I9e2NlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjb2xzcGFuOiJjb2xTcGFuIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGhlaWdodDoiaGVpZ2h0IixtYXhsZW5ndGg6Im1heExlbmd0aCIsbm9uY2U6Im5vbmNlIixyb2xlOiJyb2xlIixyb3dzcGFuOiJyb3dTcGFuIix0eXBlOiJ0eXBlIix1c2VtYXA6InVzZU1hcCIsdmFsaWduOiJ2QWxpZ24iLAp3aWR0aDoid2lkdGgifSxtYj1mdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChrKXtrJiZiLmFwcGVuZENoaWxkKCJzdHJpbmciPT09dHlwZW9mIGs/YS5jcmVhdGVUZXh0Tm9kZShrKTprKX1mb3IodmFyIGU9MjtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXTtpZighaGEoZil8fG0oZikmJjA8Zi5ub2RlVHlwZSlkKGYpO2Vsc2V7YTp7aWYoZiYmIm51bWJlciI9PXR5cGVvZiBmLmxlbmd0aCl7aWYobShmKSl7dmFyIGc9ImZ1bmN0aW9uIj09dHlwZW9mIGYuaXRlbXx8InN0cmluZyI9PXR5cGVvZiBmLml0ZW07YnJlYWsgYX1pZihpYShmKSl7Zz0iZnVuY3Rpb24iPT10eXBlb2YgZi5pdGVtO2JyZWFrIGF9fWc9ITF9cihnP0phKGYpOmYsZCl9fX0sbmI9ZnVuY3Rpb24oYSxiKXtiPVN0cmluZyhiKTsiYXBwbGljYXRpb24veGh0bWwreG1sIj09PWEuY29udGVudFR5cGUmJihiPWIudG9Mb3dlckNhc2UoKSk7cmV0dXJuIGEuY3JlYXRlRWxlbWVudChiKX0sb2I9ZnVuY3Rpb24oYSl7YSYmCmEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpfSxwYj1mdW5jdGlvbihhLGIpe2lmKCFhfHwhYilyZXR1cm4hMTtpZihhLmNvbnRhaW5zJiYxPT1iLm5vZGVUeXBlKXJldHVybiBhPT1ifHxhLmNvbnRhaW5zKGIpO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbilyZXR1cm4gYT09Ynx8ISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNik7Zm9yKDtiJiZhIT1iOyliPWIucGFyZW50Tm9kZTtyZXR1cm4gYj09YX0scWI9ZnVuY3Rpb24oYSl7cShhLCJOb2RlIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4iKTtyZXR1cm4gOT09YS5ub2RlVHlwZT9hOmEub3duZXJEb2N1bWVudHx8YS5kb2N1bWVudH0scmI9ZnVuY3Rpb24oYSxiKXtiP2EudGFiSW5kZXg9MDooYS50YWJJbmRleD0tMSxhLnJlbW92ZUF0dHJpYnV0ZSgidGFiSW5kZXgiKSl9LHNiPWZ1bmN0aW9uKGEpe3JldHVybiB2JiYhQSgiOSIpPyhhPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKSwKbnVsbCE9YSYmYS5zcGVjaWZpZWQpOmEuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpfSx0Yj1mdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgYSYmMDw9YSYmMzI3Njg+YX0sdWI9ZnVuY3Rpb24oYSl7dGhpcy5hPWF8fGwuZG9jdW1lbnR8fGRvY3VtZW50fTt1Yi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBhP3RoaXMuYS5nZXRFbGVtZW50QnlJZChhKTphfTsKdWIucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuYSxlPWFyZ3VtZW50cyxmPVN0cmluZyhlWzBdKSxnPWVbMV07aWYoIWpiJiZnJiYoZy5uYW1lfHxnLnR5cGUpKXtmPVsiPCIsZl07Zy5uYW1lJiZmLnB1c2goJyBuYW1lPSInLFhhKGcubmFtZSksJyInKTtpZihnLnR5cGUpe2YucHVzaCgnIHR5cGU9IicsWGEoZy50eXBlKSwnIicpO3ZhciBrPXt9O3VhKGssZyk7ZGVsZXRlIGsudHlwZTtnPWt9Zi5wdXNoKCI+Iik7Zj1mLmpvaW4oIiIpfWY9bmIoZCxmKTtnJiYoInN0cmluZyI9PT10eXBlb2YgZz9mLmNsYXNzTmFtZT1nOmZhKGcpP2YuY2xhc3NOYW1lPWcuam9pbigiICIpOmxiKGYsZykpOzI8ZS5sZW5ndGgmJm1iKGQsZixlKTtyZXR1cm4gZn07dmFyIHZiPWZ1bmN0aW9uKGEsYil7Yj8ocShwYSh2YSxiKSwiTm8gc3VjaCBBUklBIHJvbGUgIitiKSxhLnNldEF0dHJpYnV0ZSgicm9sZSIsYikpOmEucmVtb3ZlQXR0cmlidXRlKCJyb2xlIil9LHhiPWZ1bmN0aW9uKGEsYixjKXtmYShjKSYmKGM9Yy5qb2luKCIgIikpO3ZhciBkPXdiKGIpOyIiPT09Y3x8dm9pZCAwPT1jPyhtYXx8KG1hPXthdG9taWM6ITEsYXV0b2NvbXBsZXRlOiJub25lIixkcm9wZWZmZWN0OiJub25lIixoYXNwb3B1cDohMSxsaXZlOiJvZmYiLG11bHRpbGluZTohMSxtdWx0aXNlbGVjdGFibGU6ITEsb3JpZW50YXRpb246InZlcnRpY2FsIixyZWFkb25seTohMSxyZWxldmFudDoiYWRkaXRpb25zIHRleHQiLHJlcXVpcmVkOiExLHNvcnQ6Im5vbmUiLGJ1c3k6ITEsZGlzYWJsZWQ6ITEsaGlkZGVuOiExLGludmFsaWQ6ImZhbHNlIn0pLGM9bWEsYiBpbiBjP2Euc2V0QXR0cmlidXRlKGQsY1tiXSk6YS5yZW1vdmVBdHRyaWJ1dGUoZCkpOmEuc2V0QXR0cmlidXRlKGQsCmMpfSx3Yj1mdW5jdGlvbihhKXtxKGEsIkFSSUEgYXR0cmlidXRlIGNhbm5vdCBiZSBlbXB0eS4iKTtxKHBhKG5hLGEpLCJObyBzdWNoIEFSSUEgYXR0cmlidXRlICIrYSk7cmV0dXJuImFyaWEtIithfTt2YXIgeWI9T2JqZWN0LmZyZWV6ZXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O3ZhciBDPWZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVTt0aGlzLko9dGhpcy5KfTtDLnByb3RvdHlwZS5VPSExO0MucHJvdG90eXBlLk49ZnVuY3Rpb24oKXt0aGlzLlV8fCh0aGlzLlU9ITAsdGhpcy51KCkpfTt2YXIgemI9ZnVuY3Rpb24oYSxiKXthLlU/YigpOihhLkp8fChhLko9W10pLGEuSi5wdXNoKGIpKX07Qy5wcm90b3R5cGUudT1mdW5jdGlvbigpe2lmKHRoaXMuSilmb3IoO3RoaXMuSi5sZW5ndGg7KXRoaXMuSi5zaGlmdCgpKCl9O3ZhciBBYj1mdW5jdGlvbihhKXthJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5OJiZhLk4oKX07dmFyIEJiPWZ1bmN0aW9uKGEpe3JldHVybiJzdHJpbmciPT10eXBlb2YgYS5jbGFzc05hbWU/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sRD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6QmIoYSkubWF0Y2goL1xTKy9nKXx8W119LENiPWZ1bmN0aW9uKGEsYil7InN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZT9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxEYj1mdW5jdGlvbihhLGIpe3JldHVybiBhLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5jb250YWlucyhiKTpHYShEKGEpLGIpfSxFYj1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFEYihhLGIpKXt2YXIgYz1CYihhKTtDYihhLGMrKDA8Yy5sZW5ndGg/IiAiK2I6YikpfX0sRmI9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClyKGIsCmZ1bmN0aW9uKGUpe0ViKGEsZSl9KTtlbHNle3ZhciBjPXt9O3IoRChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7cihiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPTA8Yi5sZW5ndGg/IiAiK2Q6ZDtDYihhLGIpfX0sR2I9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6RGIoYSxiKSYmQ2IoYSxFYShEKGEpLGZ1bmN0aW9uKGMpe3JldHVybiBjIT1ifSkuam9pbigiICIpKX0sSGI9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9yKGIsZnVuY3Rpb24oYyl7R2IoYSxjKX0pOkNiKGEsRWEoRChhKSxmdW5jdGlvbihjKXtyZXR1cm4hR2EoYixjKX0pLmpvaW4oIiAiKSl9O3ZhciBJYj0hdnx8OTw9TnVtYmVyKGliKSxKYj0hdnx8OTw9TnVtYmVyKGliKSxLYj12JiYhQSgiOSIpLExiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e2wuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsY2EsYiksbC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjYSxiKX1jYXRjaChjKXt9cmV0dXJuIGF9KCk7dmFyIEU9ZnVuY3Rpb24oYSxiKXt0aGlzLnR5cGU9YTt0aGlzLmE9dGhpcy50YXJnZXQ9Yjt0aGlzLmg9ITE7dGhpcy5LYT0hMH07RS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuaD0hMH07RS5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3RoaXMuS2E9ITF9O3ZhciBGPXtMOiJtb3VzZWRvd24iLE06Im1vdXNldXAiLGFhOiJtb3VzZWNhbmNlbCIsaGM6Im1vdXNlbW92ZSIsamM6Im1vdXNlb3ZlciIsaWM6Im1vdXNlb3V0IixmYzoibW91c2VlbnRlciIsZ2M6Im1vdXNlbGVhdmUifTt2YXIgRz1mdW5jdGlvbihhLGIpe0UuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy5hPXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5jPTA7dGhpcy5BPXRoaXMubWV0YUtleT10aGlzLnNoaWZ0S2V5PXRoaXMuYWx0S2V5PXRoaXMuY3RybEtleT0hMTt0aGlzLnBvaW50ZXJJZD0wO3RoaXMucG9pbnRlclR5cGU9IiI7dGhpcy5iPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMuYT1iO2lmKGI9YS5yZWxhdGVkVGFyZ2V0KXtpZih4KXthOnt0cnl7WWEoYi5ub2RlTmFtZSk7dmFyIGU9ITA7YnJlYWsgYX1jYXRjaChmKXt9ZT0KITF9ZXx8KGI9bnVsbCl9fWVsc2UibW91c2VvdmVyIj09Yz9iPWEuZnJvbUVsZW1lbnQ6Im1vdXNlb3V0Ij09YyYmKGI9YS50b0VsZW1lbnQpO3RoaXMucmVsYXRlZFRhcmdldD1iO2Q/KHRoaXMuY2xpZW50WD12b2lkIDAhPT1kLmNsaWVudFg/ZC5jbGllbnRYOmQucGFnZVgsdGhpcy5jbGllbnRZPXZvaWQgMCE9PWQuY2xpZW50WT9kLmNsaWVudFk6ZC5wYWdlWSx0aGlzLnNjcmVlblg9ZC5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1kLnNjcmVlbll8fDApOih0aGlzLmNsaWVudFg9dm9pZCAwIT09YS5jbGllbnRYP2EuY2xpZW50WDphLnBhZ2VYLHRoaXMuY2xpZW50WT12b2lkIDAhPT1hLmNsaWVudFk/YS5jbGllbnRZOmEucGFnZVksdGhpcy5zY3JlZW5YPWEuc2NyZWVuWHx8MCx0aGlzLnNjcmVlblk9YS5zY3JlZW5ZfHwwKTt0aGlzLmJ1dHRvbj1hLmJ1dHRvbjt0aGlzLmM9YS5rZXlDb2RlfHwwO3RoaXMua2V5PWEua2V5fHwiIjt0aGlzLmN0cmxLZXk9YS5jdHJsS2V5O3RoaXMuYWx0S2V5PQphLmFsdEtleTt0aGlzLnNoaWZ0S2V5PWEuc2hpZnRLZXk7dGhpcy5tZXRhS2V5PWEubWV0YUtleTt0aGlzLkE9ej9hLm1ldGFLZXk6YS5jdHJsS2V5O3RoaXMucG9pbnRlcklkPWEucG9pbnRlcklkfHwwO3RoaXMucG9pbnRlclR5cGU9InN0cmluZyI9PT10eXBlb2YgYS5wb2ludGVyVHlwZT9hLnBvaW50ZXJUeXBlOk1iW2EucG9pbnRlclR5cGVdfHwiIjt0aGlzLmI9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnRoaXMuZygpfX07bihHLEUpO3ZhciBOYj15YihbMSw0LDJdKSxNYj15Yih7MjoidG91Y2giLDM6InBlbiIsNDoibW91c2UifSksT2I9ZnVuY3Rpb24oYSl7cmV0dXJuIEliPzA9PWEuYi5idXR0b246ImNsaWNrIj09YS50eXBlPyEwOiEhKGEuYi5idXR0b24mTmJbMF0pfTtHLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7Ry5pLmouY2FsbCh0aGlzKTt0aGlzLmIuc3RvcFByb3BhZ2F0aW9uP3RoaXMuYi5zdG9wUHJvcGFnYXRpb24oKTp0aGlzLmIuY2FuY2VsQnViYmxlPSEwfTsKRy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe0cuaS5nLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5iO2lmKGEucHJldmVudERlZmF1bHQpYS5wcmV2ZW50RGVmYXVsdCgpO2Vsc2UgaWYoYS5yZXR1cm5WYWx1ZT0hMSxLYil0cnl7aWYoYS5jdHJsS2V5fHwxMTI8PWEua2V5Q29kZSYmMTIzPj1hLmtleUNvZGUpYS5rZXlDb2RlPS0xfWNhdGNoKGIpe319O3ZhciBQYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKDFFNipNYXRoLnJhbmRvbSgpfDApLFFiPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW1BiXSl9LFJiPTA7dmFyIFNiPWZ1bmN0aW9uKGEsYixjLGQsZSl7dGhpcy5saXN0ZW5lcj1hO3RoaXMuYT1udWxsO3RoaXMuc3JjPWI7dGhpcy50eXBlPWM7dGhpcy5jYXB0dXJlPSEhZDt0aGlzLm1hPWU7dGhpcy5rZXk9KytSYjt0aGlzLlg9dGhpcy5oYT0hMX0sVGI9ZnVuY3Rpb24oYSl7YS5YPSEwO2EubGlzdGVuZXI9bnVsbDthLmE9bnVsbDthLnNyYz1udWxsO2EubWE9bnVsbH07dmFyIFViPWZ1bmN0aW9uKGEpe3RoaXMuc3JjPWE7dGhpcy5hPXt9O3RoaXMuYj0wfTtVYi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS50b1N0cmluZygpO2E9dGhpcy5hW2ZdO2F8fChhPXRoaXMuYVtmXT1bXSx0aGlzLmIrKyk7dmFyIGc9VmIoYSxiLGQsZSk7LTE8Zz8oYj1hW2ddLGN8fChiLmhhPSExKSk6KGI9bmV3IFNiKGIsdGhpcy5zcmMsZiwhIWQsZSksYi5oYT1jLGEucHVzaChiKSk7cmV0dXJuIGJ9Owp2YXIgV2I9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLnR5cGU7YyBpbiBhLmEmJkhhKGEuYVtjXSxiKSYmKFRiKGIpLDA9PWEuYVtjXS5sZW5ndGgmJihkZWxldGUgYS5hW2NdLGEuYi0tKSl9LFhiPWZ1bmN0aW9uKGEsYixjLGQsZSl7YT1hLmFbYi50b1N0cmluZygpXTtiPS0xO2EmJihiPVZiKGEsYyxkLGUpKTtyZXR1cm4tMTxiP2FbYl06bnVsbH0sVmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuWCYmZi5saXN0ZW5lcj09YiYmZi5jYXB0dXJlPT0hIWMmJmYubWE9PWQpcmV0dXJuIGV9cmV0dXJuLTF9O3ZhciBZYj0iY2xvc3VyZV9sbV8iKygxRTYqTWF0aC5yYW5kb20oKXwwKSxaYj17fSwkYj0wLGJjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZCYmZC5vbmNlKXJldHVybiBhYyhhLGIsYyxkLGUpO2lmKGZhKGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyliYyhhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9Y2MoYyk7cmV0dXJuIFFiKGEpP2RjKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOmVjKGEsYixjLCExLGQsZSl9LGVjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGc9bShlKT8hIWUuY2FwdHVyZTohIWUsaz1mYyhhKTtrfHwoYVtZYl09az1uZXcgVWIoYSkpO2M9ay5hZGQoYixjLGQsZyxmKTtpZihjLmEpcmV0dXJuIGM7ZD1nYygpO2MuYT1kO2Quc3JjPWE7ZC5saXN0ZW5lcj1jO2lmKGEuYWRkRXZlbnRMaXN0ZW5lcilMYnx8KGU9Zyksdm9pZCAwPT09ZSYmKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksCmQsZSk7ZWxzZSBpZihhLmF0dGFjaEV2ZW50KWEuYXR0YWNoRXZlbnQoaGMoYi50b1N0cmluZygpKSxkKTtlbHNlIGlmKGEuYWRkTGlzdGVuZXImJmEucmVtb3ZlTGlzdGVuZXIpcSgiY2hhbmdlIj09PWIsIk1lZGlhUXVlcnlMaXN0IG9ubHkgaGFzIGEgY2hhbmdlIGV2ZW50IiksYS5hZGRMaXN0ZW5lcihkKTtlbHNlIHRocm93IEVycm9yKCJhZGRFdmVudExpc3RlbmVyIGFuZCBhdHRhY2hFdmVudCBhcmUgdW5hdmFpbGFibGUuIik7JGIrKztyZXR1cm4gY30sZ2M9ZnVuY3Rpb24oKXt2YXIgYT1pYyxiPUpiP2Z1bmN0aW9uKGMpe3JldHVybiBhLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKX06ZnVuY3Rpb24oYyl7Yz1hLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKTtpZighYylyZXR1cm4gY307cmV0dXJuIGJ9LGFjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZmEoYikpe2Zvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWFjKGEsYltmXSxjLGQsZSk7cmV0dXJuIG51bGx9Yz1jYyhjKTtyZXR1cm4gUWIoYSk/CmEuaC5hZGQoU3RyaW5nKGIpLGMsITAsbShkKT8hIWQuY2FwdHVyZTohIWQsZSk6ZWMoYSxiLGMsITAsZCxlKX0samM9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihmYShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylqYyhhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPWNjKGMpLFFiKGEpPyhhPWEuaCxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5hJiYoZj1hLmFbYl0sYz1WYihmLGMsZCxlKSwtMTxjJiYoVGIoZltjXSkscShudWxsIT1mLmxlbmd0aCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSwwPT1mLmxlbmd0aCYmKGRlbGV0ZSBhLmFbYl0sYS5iLS0pKSkpOmEmJihhPWZjKGEpKSYmKGM9WGIoYSxiLGMsZCxlKSkmJmtjKGMpfSxrYz1mdW5jdGlvbihhKXtpZigibnVtYmVyIiE9PXR5cGVvZiBhJiZhJiYhYS5YKXt2YXIgYj1hLnNyYztpZihRYihiKSlXYihiLmgsYSk7ZWxzZXt2YXIgYz1hLnR5cGUsZD1hLmE7Yi5yZW1vdmVFdmVudExpc3RlbmVyPwpiLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KGhjKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7JGItLTsoYz1mYyhiKSk/KFdiKGMsYSksMD09Yy5iJiYoYy5zcmM9bnVsbCxiW1liXT1udWxsKSk6VGIoYSl9fX0saGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gWmI/WmJbYV06WmJbYV09Im9uIithfSxtYz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMDtpZihhPWZjKGEpKWlmKGI9YS5hW2IudG9TdHJpbmcoKV0pZm9yKGI9Yi5jb25jYXQoKSxhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBmPWJbYV07ZiYmZi5jYXB0dXJlPT1jJiYhZi5YJiYoZj1sYyhmLGQpLGU9ZSYmITEhPT1mKX1yZXR1cm4gZX0sbGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5tYXx8YS5zcmM7YS5oYSYma2MoYSk7cmV0dXJuIGMuY2FsbChkLGIpfSxpYz1mdW5jdGlvbihhLApiKXtpZihhLlgpcmV0dXJuITA7aWYoIUpiKXtpZighYilhOntiPVsid2luZG93IiwiZXZlbnQiXTtmb3IodmFyIGM9bCxkPTA7ZDxiLmxlbmd0aDtkKyspaWYoYz1jW2JbZF1dLG51bGw9PWMpe2I9bnVsbDticmVhayBhfWI9Y31kPWI7Yj1uZXcgRyhkLHRoaXMpO2M9ITA7aWYoISgwPmQua2V5Q29kZXx8dm9pZCAwIT1kLnJldHVyblZhbHVlKSl7YTp7dmFyIGU9ITE7aWYoMD09ZC5rZXlDb2RlKXRyeXtkLmtleUNvZGU9LTE7YnJlYWsgYX1jYXRjaChnKXtlPSEwfWlmKGV8fHZvaWQgMD09ZC5yZXR1cm5WYWx1ZSlkLnJldHVyblZhbHVlPSEwfWQ9W107Zm9yKGU9Yi5hO2U7ZT1lLnBhcmVudE5vZGUpZC5wdXNoKGUpO2E9YS50eXBlO2ZvcihlPWQubGVuZ3RoLTE7IWIuaCYmMDw9ZTtlLS0pe2IuYT1kW2VdO3ZhciBmPW1jKGRbZV0sYSwhMCxiKTtjPWMmJmZ9Zm9yKGU9MDshYi5oJiZlPGQubGVuZ3RoO2UrKyliLmE9ZFtlXSxmPW1jKGRbZV0sYSwhMSxiKSxjPWMmJmZ9cmV0dXJuIGN9cmV0dXJuIGxjKGEsCm5ldyBHKGIsdGhpcykpfSxmYz1mdW5jdGlvbihhKXthPWFbWWJdO3JldHVybiBhIGluc3RhbmNlb2YgVWI/YTpudWxsfSxuYz0iX19jbG9zdXJlX2V2ZW50c19mbl8iKygxRTkqTWF0aC5yYW5kb20oKT4+PjApLGNjPWZ1bmN0aW9uKGEpe3EoYSwiTGlzdGVuZXIgY2FuIG5vdCBiZSBudWxsLiIpO2lmKGlhKGEpKXJldHVybiBhO3EoYS5oYW5kbGVFdmVudCwiQW4gb2JqZWN0IGxpc3RlbmVyIG11c3QgaGF2ZSBoYW5kbGVFdmVudCBtZXRob2QuIik7YVtuY118fChhW25jXT1mdW5jdGlvbihiKXtyZXR1cm4gYS5oYW5kbGVFdmVudChiKX0pO3JldHVybiBhW25jXX07dmFyIG9jPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9e319O24ob2MsQyk7CnZhciBwYz1bXSxIPWZ1bmN0aW9uKGEsYixjLGQpe2ZhKGMpfHwoYyYmKHBjWzBdPWMudG9TdHJpbmcoKSksYz1wYyk7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWJjKGIsY1tlXSxkfHxhLmhhbmRsZUV2ZW50LCExLGEuYnx8YSk7aWYoIWYpYnJlYWs7YS5hW2Yua2V5XT1mfXJldHVybiBhfSxxYz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoZmEoYykpZm9yKHZhciBnPTA7ZzxjLmxlbmd0aDtnKyspcWMoYSxiLGNbZ10sZCxlLGYpO2Vsc2UgZD1kfHxhLmhhbmRsZUV2ZW50LGU9bShlKT8hIWUuY2FwdHVyZTohIWUsZj1mfHxhLmJ8fGEsZD1jYyhkKSxlPSEhZSxjPVFiKGIpP1hiKGIuaCxTdHJpbmcoYyksZCxlLGYpOmI/KGI9ZmMoYikpP1hiKGIsYyxkLGUsZik6bnVsbDpudWxsLGMmJihrYyhjKSxkZWxldGUgYS5hW2Mua2V5XSk7cmV0dXJuIGF9LHJjPWZ1bmN0aW9uKGEpe29hKGEuYSxmdW5jdGlvbihiLGMpe3RoaXMuYS5oYXNPd25Qcm9wZXJ0eShjKSYma2MoYil9LAphKTthLmE9e319O29jLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7b2MuaS51LmNhbGwodGhpcyk7cmModGhpcyl9O29jLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJFdmVudEhhbmRsZXIuaGFuZGxlRXZlbnQgbm90IGltcGxlbWVudGVkIik7fTt2YXIgST1mdW5jdGlvbigpe0MuY2FsbCh0aGlzKTt0aGlzLmg9bmV3IFViKHRoaXMpO3RoaXMuTWE9dGhpczt0aGlzLnBhPW51bGx9O24oSSxDKTtJLnByb3RvdHlwZVtQYl09ITA7SS5wcm90b3R5cGUucmE9ZnVuY3Rpb24oYSl7dGhpcy5wYT1hfTtJLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjLGQpe2pjKHRoaXMsYSxiLGMsZCl9Owp2YXIgdWM9ZnVuY3Rpb24oYSxiKXtzYyhhKTt2YXIgYz1hLnBhO2lmKGMpe3ZhciBkPVtdO2Zvcih2YXIgZT0xO2M7Yz1jLnBhKWQucHVzaChjKSxxKDFFMz4rK2UsImluZmluaXRlIGxvb3AiKX1hPWEuTWE7Yz1iLnR5cGV8fGI7InN0cmluZyI9PT10eXBlb2YgYj9iPW5ldyBFKGIsYSk6YiBpbnN0YW5jZW9mIEU/Yi50YXJnZXQ9Yi50YXJnZXR8fGE6KGU9YixiPW5ldyBFKGMsYSksdWEoYixlKSk7ZT0hMDtpZihkKWZvcih2YXIgZj1kLmxlbmd0aC0xOyFiLmgmJjA8PWY7Zi0tKXt2YXIgZz1iLmE9ZFtmXTtlPXRjKGcsYywhMCxiKSYmZX1iLmh8fChnPWIuYT1hLGU9dGMoZyxjLCEwLGIpJiZlLGIuaHx8KGU9dGMoZyxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLmgmJmY8ZC5sZW5ndGg7ZisrKWc9Yi5hPWRbZl0sZT10YyhnLGMsITEsYikmJmU7cmV0dXJuIGV9OwpJLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7SS5pLnUuY2FsbCh0aGlzKTtpZih0aGlzLmgpe3ZhciBhPXRoaXMuaCxiPTAsYztmb3IoYyBpbiBhLmEpe2Zvcih2YXIgZD1hLmFbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixUYihkW2VdKTtkZWxldGUgYS5hW2NdO2EuYi0tfX10aGlzLnBhPW51bGx9O3ZhciBkYz1mdW5jdGlvbihhLGIsYyxkLGUpe3NjKGEpO3JldHVybiBhLmguYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LHRjPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5oLmFbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGc9YltmXTtpZihnJiYhZy5YJiZnLmNhcHR1cmU9PWMpe3ZhciBrPWcubGlzdGVuZXIscD1nLm1hfHxnLnNyYztnLmhhJiZXYihhLmgsZyk7ZT0hMSE9PWsuY2FsbChwLGQpJiZlfX1yZXR1cm4gZSYmMCE9ZC5LYX0sc2M9ZnVuY3Rpb24oYSl7cShhLmgsIkV2ZW50IHRhcmdldCBpcyBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgY2FsbCB0aGUgc3VwZXJjbGFzcyAoZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpIGNvbnN0cnVjdG9yPyIpfTt2YXIgeGM9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKHkmJiFBKCI1MjUiKSlyZXR1cm4hMDtpZih6JiZlKXJldHVybiB2YyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZigheCl7Im51bWJlciI9PT10eXBlb2YgYiYmKGI9d2MoYikpO3ZhciBnPTE3PT1ifHwxOD09Ynx8eiYmOTE9PWI7aWYoKCFjfHx6KSYmZ3x8eiYmMTY9PWImJihkfHxmKSlyZXR1cm4hMX1pZigoeXx8YmIpJiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1pZih2JiZkJiZiPT1hKXJldHVybiExO3N3aXRjaChhKXtjYXNlIDEzOnJldHVybiB4P2Z8fGU/ITE6IShjJiZkKTohMDtjYXNlIDI3OnJldHVybiEoeXx8YmJ8fHgpfXJldHVybiB4JiYoZHx8ZXx8Zik/ITE6dmMoYSl9LHZjPWZ1bmN0aW9uKGEpe2lmKDQ4PD1hJiY1Nz49YXx8Cjk2PD1hJiYxMDY+PWF8fDY1PD1hJiY5MD49YXx8KHl8fGJiKSYmMD09YSlyZXR1cm4hMDtzd2l0Y2goYSl7Y2FzZSAzMjpjYXNlIDQzOmNhc2UgNjM6Y2FzZSA2NDpjYXNlIDEwNzpjYXNlIDEwOTpjYXNlIDExMDpjYXNlIDExMTpjYXNlIDE4NjpjYXNlIDU5OmNhc2UgMTg5OmNhc2UgMTg3OmNhc2UgNjE6Y2FzZSAxODg6Y2FzZSAxOTA6Y2FzZSAxOTE6Y2FzZSAxOTI6Y2FzZSAyMjI6Y2FzZSAyMTk6Y2FzZSAyMjA6Y2FzZSAyMjE6Y2FzZSAxNjM6Y2FzZSA1ODpyZXR1cm4hMDtjYXNlIDE3MzpyZXR1cm4geDtkZWZhdWx0OnJldHVybiExfX0sd2M9ZnVuY3Rpb24oYSl7aWYoeClhPXljKGEpO2Vsc2UgaWYoeiYmeSlzd2l0Y2goYSl7Y2FzZSA5MzphPTkxfXJldHVybiBhfSx5Yz1mdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSA2MTpyZXR1cm4gMTg3O2Nhc2UgNTk6cmV0dXJuIDE4NjtjYXNlIDE3MzpyZXR1cm4gMTg5O2Nhc2UgMjI0OnJldHVybiA5MTtjYXNlIDA6cmV0dXJuIDIyNDsKZGVmYXVsdDpyZXR1cm4gYX19O3ZhciBKPWZ1bmN0aW9uKGEsYil7SS5jYWxsKHRoaXMpO2EmJnpjKHRoaXMsYSxiKX07bihKLEkpO2g9Si5wcm90b3R5cGU7aC5TPW51bGw7aC5uYT1udWxsO2guQ2E9bnVsbDtoLm9hPW51bGw7aC53PS0xO2guRj0tMTtoLnVhPSExOwp2YXIgQWM9ezM6MTMsMTI6MTQ0LDYzMjMyOjM4LDYzMjMzOjQwLDYzMjM0OjM3LDYzMjM1OjM5LDYzMjM2OjExMiw2MzIzNzoxMTMsNjMyMzg6MTE0LDYzMjM5OjExNSw2MzI0MDoxMTYsNjMyNDE6MTE3LDYzMjQyOjExOCw2MzI0MzoxMTksNjMyNDQ6MTIwLDYzMjQ1OjEyMSw2MzI0NjoxMjIsNjMyNDc6MTIzLDYzMjQ4OjQ0LDYzMjcyOjQ2LDYzMjczOjM2LDYzMjc1OjM1LDYzMjc2OjMzLDYzMjc3OjM0LDYzMjg5OjE0NCw2MzMwMjo0NX0sQmM9e1VwOjM4LERvd246NDAsTGVmdDozNyxSaWdodDozOSxFbnRlcjoxMyxGMToxMTIsRjI6MTEzLEYzOjExNCxGNDoxMTUsRjU6MTE2LEY2OjExNyxGNzoxMTgsRjg6MTE5LEY5OjEyMCxGMTA6MTIxLEYxMToxMjIsRjEyOjEyMywiVSswMDdGIjo0NixIb21lOjM2LEVuZDozNSxQYWdlVXA6MzMsUGFnZURvd246MzQsSW5zZXJ0OjQ1fSxDYz0heXx8QSgiNTI1IiksRGM9eiYmeDsKSi5wcm90b3R5cGUuYT1mdW5jdGlvbihhKXtpZih5fHxiYilpZigxNz09dGhpcy53JiYhYS5jdHJsS2V5fHwxOD09dGhpcy53JiYhYS5hbHRLZXl8fHomJjkxPT10aGlzLncmJiFhLm1ldGFLZXkpdGhpcy5GPXRoaXMudz0tMTstMT09dGhpcy53JiYoYS5jdHJsS2V5JiYxNyE9YS5jP3RoaXMudz0xNzphLmFsdEtleSYmMTghPWEuYz90aGlzLnc9MTg6YS5tZXRhS2V5JiY5MSE9YS5jJiYodGhpcy53PTkxKSk7Q2MmJiF4YyhhLmMsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGEuYWx0S2V5LGEubWV0YUtleSk/dGhpcy5oYW5kbGVFdmVudChhKToodGhpcy5GPXdjKGEuYyksRGMmJih0aGlzLnVhPWEuYWx0S2V5KSl9O0oucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dGhpcy5GPXRoaXMudz0tMTt0aGlzLnVhPWEuYWx0S2V5fTsKSi5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5iLGM9Yi5hbHRLZXk7aWYodiYmImtleXByZXNzIj09YS50eXBlKXt2YXIgZD10aGlzLkY7dmFyIGU9MTMhPWQmJjI3IT1kP2Iua2V5Q29kZTowfWVsc2UoeXx8YmIpJiYia2V5cHJlc3MiPT1hLnR5cGU/KGQ9dGhpcy5GLGU9MDw9Yi5jaGFyQ29kZSYmNjMyMzI+Yi5jaGFyQ29kZSYmdmMoZCk/Yi5jaGFyQ29kZTowKTphYiYmIXk/KGQ9dGhpcy5GLGU9dmMoZCk/Yi5rZXlDb2RlOjApOigia2V5cHJlc3MiPT1hLnR5cGU/KERjJiYoYz10aGlzLnVhKSxiLmtleUNvZGU9PWIuY2hhckNvZGU/MzI+Yi5rZXlDb2RlPyhkPWIua2V5Q29kZSxlPTApOihkPXRoaXMuRixlPWIuY2hhckNvZGUpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkseiYmNjM9PWUmJjIyND09ZCYmKGQ9MTkxKSk7dmFyIGY9ZD13YyhkKTtkPzYzMjMyPD0KZCYmZCBpbiBBYz9mPUFjW2RdOjI1PT1kJiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBCYyYmKGY9QmNbYi5rZXlJZGVudGlmaWVyXSk7eCYmQ2MmJiJrZXlwcmVzcyI9PWEudHlwZSYmIXhjKGYsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KXx8KGE9Zj09dGhpcy53LHRoaXMudz1mLGI9bmV3IEVjKGYsZSxhLGIpLGIuYWx0S2V5PWMsdWModGhpcyxiKSl9O0oucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTsKdmFyIHpjPWZ1bmN0aW9uKGEsYixjKXthLm9hJiZGYyhhKTthLlM9YjthLm5hPWJjKGEuUywia2V5cHJlc3MiLGEsYyk7YS5DYT1iYyhhLlMsImtleWRvd24iLGEuYSxjLGEpO2Eub2E9YmMoYS5TLCJrZXl1cCIsYS5iLGMsYSl9LEZjPWZ1bmN0aW9uKGEpe2EubmEmJihrYyhhLm5hKSxrYyhhLkNhKSxrYyhhLm9hKSxhLm5hPW51bGwsYS5DYT1udWxsLGEub2E9bnVsbCk7YS5TPW51bGw7YS53PS0xO2EuRj0tMX07Si5wcm90b3R5cGUudT1mdW5jdGlvbigpe0ouaS51LmNhbGwodGhpcyk7RmModGhpcyl9O3ZhciBFYz1mdW5jdGlvbihhLGIsYyxkKXtHLmNhbGwodGhpcyxkKTt0aGlzLnR5cGU9ImtleSI7dGhpcy5jPWE7dGhpcy5yZXBlYXQ9Y307bihFYyxHKTt2YXIgR2M9eD8iTW96VXNlclNlbGVjdCI6eXx8YmI/IldlYmtpdFVzZXJTZWxlY3QiOm51bGwsSGM9ZnVuY3Rpb24oYSxiKXtiPWI/bnVsbDphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7aWYoR2Mpe3ZhciBjPSJub25lIjthLnN0eWxlJiYoYS5zdHlsZVtHY109Yyk7aWYoYil7YT0wO2Zvcih2YXIgZDtkPWJbYV07YSsrKWQuc3R5bGUmJihkLnN0eWxlW0djXT1jKX19ZWxzZSBpZih2fHxhYilpZihjPSJvbiIsYS5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyksYilmb3IoYT0wO2Q9YlthXTthKyspZC5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyl9O3ZhciBJYz1mdW5jdGlvbigpe307ZGEoSWMpO0ljLnByb3RvdHlwZS5hPTA7dmFyIEs9ZnVuY3Rpb24oYSl7SS5jYWxsKHRoaXMpO3RoaXMuaj1hfHx4YXx8KHhhPW5ldyB1Yik7dGhpcy5xYT1KYzt0aGlzLlk9bnVsbDt0aGlzLm09ITE7dGhpcy5hPW51bGw7dGhpcy5BPXZvaWQgMDt0aGlzLmc9dGhpcy5jPXRoaXMuYj1udWxsO3RoaXMuR2E9ITF9O24oSyxJKTtLLnByb3RvdHlwZS5PYT1JYy5SKCk7CnZhciBKYz1udWxsLEtjPWZ1bmN0aW9uKGEsYil7c3dpdGNoKGEpe2Nhc2UgMTpyZXR1cm4gYj8iZGlzYWJsZSI6ImVuYWJsZSI7Y2FzZSAyOnJldHVybiBiPyJoaWdobGlnaHQiOiJ1bmhpZ2hsaWdodCI7Y2FzZSA0OnJldHVybiBiPyJhY3RpdmF0ZSI6ImRlYWN0aXZhdGUiO2Nhc2UgODpyZXR1cm4gYj8ic2VsZWN0IjoidW5zZWxlY3QiO2Nhc2UgMTY6cmV0dXJuIGI/ImNoZWNrIjoidW5jaGVjayI7Y2FzZSAzMjpyZXR1cm4gYj8iZm9jdXMiOiJibHVyIjtjYXNlIDY0OnJldHVybiBiPyJvcGVuIjoiY2xvc2UifXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBzdGF0ZSIpO30sTGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuWXx8KGEuWT0iOiIrKGEuT2EuYSsrKS50b1N0cmluZygzNikpfSxNYz1mdW5jdGlvbihhLGIpe2lmKGEuYiYmYS5iLmcpe3ZhciBjPWEuYi5nLGQ9YS5ZO2QgaW4gYyYmZGVsZXRlIGNbZF07cWEoYS5iLmcsYixhKX1hLlk9Yn07Sy5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9Owp2YXIgTmM9ZnVuY3Rpb24oYSl7YT1hLmE7cShhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cmV0dXJuIGF9LE9jPWZ1bmN0aW9uKGEpe2EuQXx8KGEuQT1uZXcgb2MoYSkpO3JldHVybiBxKGEuQSl9O0sucHJvdG90eXBlLnJhPWZ1bmN0aW9uKGEpe2lmKHRoaXMuYiYmdGhpcy5iIT1hKXRocm93IEVycm9yKCJNZXRob2Qgbm90IHN1cHBvcnRlZCIpO0suaS5yYS5jYWxsKHRoaXMsYSl9O0sucHJvdG90eXBlLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPW5iKHRoaXMuai5hLCJESVYiKX07CnZhciBQYz1mdW5jdGlvbihhLGIpe2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiJiZhLnhhKGIpKXthLkdhPSEwO3ZhciBjPXFiKGIpO2EuaiYmYS5qLmE9PWN8fChhLmo9Yj9uZXcgdWIocWIoYikpOnhhfHwoeGE9bmV3IHViKSk7YS52YShiKTthLkQoKX1lbHNlIHRocm93IEVycm9yKCJJbnZhbGlkIGVsZW1lbnQgdG8gZGVjb3JhdGUiKTt9O2g9Sy5wcm90b3R5cGU7aC54YT1mdW5jdGlvbigpe3JldHVybiEwfTtoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hfTtoLkQ9ZnVuY3Rpb24oKXt0aGlzLm09ITA7UWModGhpcyxmdW5jdGlvbihhKXshYS5tJiZhLmYoKSYmYS5EKCl9KX07aC5QPWZ1bmN0aW9uKCl7UWModGhpcyxmdW5jdGlvbihhKXthLm0mJmEuUCgpfSk7dGhpcy5BJiZyYyh0aGlzLkEpO3RoaXMubT0hMX07CmgudT1mdW5jdGlvbigpe3RoaXMubSYmdGhpcy5QKCk7dGhpcy5BJiYodGhpcy5BLk4oKSxkZWxldGUgdGhpcy5BKTtRYyh0aGlzLGZ1bmN0aW9uKGEpe2EuTigpfSk7IXRoaXMuR2EmJnRoaXMuYSYmb2IodGhpcy5hKTt0aGlzLmI9dGhpcy5hPXRoaXMuZz10aGlzLmM9bnVsbDtLLmkudS5jYWxsKHRoaXMpfTtoLnNhPWZ1bmN0aW9uKGEsYil7dGhpcy50YShhLFJjKHRoaXMpLGIpfTsKaC50YT1mdW5jdGlvbihhLGIsYyl7cSghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLm0mJihjfHwhdGhpcy5tKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZigwPmJ8fGI+UmModGhpcykpdGhyb3cgRXJyb3IoIkNoaWxkIGNvbXBvbmVudCBpbmRleCBvdXQgb2YgYm91bmRzIik7dGhpcy5nJiZ0aGlzLmN8fCh0aGlzLmc9e30sdGhpcy5jPVtdKTtpZihhLmI9PXRoaXMpe3ZhciBkPUxjKGEpO3RoaXMuZ1tkXT1hO0hhKHRoaXMuYyxhKX1lbHNlIHFhKHRoaXMuZyxMYyhhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuYiYmYS5ZKXt2YXIgZT1hLmI7ZD1hLlk7ZS5nJiZkPyhlPWUuZyxkPShudWxsIT09ZSYmZCBpbiBlP2VbZF06dm9pZCAwKXx8bnVsbCk6ZD1udWxsfWlmKGQmJmEuYiE9dGhpcyl0aHJvdyBFcnJvcigiVW5hYmxlIHRvIHNldCBwYXJlbnQgY29tcG9uZW50Iik7CmEuYj10aGlzO0suaS5yYS5jYWxsKGEsdGhpcyk7TGEodGhpcy5jLGIsMCxhKTtpZihhLm0mJnRoaXMubSYmYS5iPT10aGlzKWM9dGhpcy5qYSgpLGI9Yy5jaGlsZE5vZGVzW2JdfHxudWxsLGIhPWEuZigpJiZjLmluc2VydEJlZm9yZShhLmYoKSxiKTtlbHNlIGlmKGMpe3RoaXMuYXx8dGhpcy5pYSgpO2M9TCh0aGlzLGIrMSk7Yj10aGlzLmphKCk7Yz1jP2MuYTpudWxsO2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTthLmF8fGEuaWEoKTtiP2IuaW5zZXJ0QmVmb3JlKGEuYSxjfHxudWxsKTphLmouYS5ib2R5LmFwcGVuZENoaWxkKGEuYSk7YS5iJiYhYS5iLm18fGEuRCgpfWVsc2UgdGhpcy5tJiYhYS5tJiZhLmEmJmEuYS5wYXJlbnROb2RlJiYxPT1hLmEucGFyZW50Tm9kZS5ub2RlVHlwZSYmYS5EKCl9O2guamE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hfTsKdmFyIFNjPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEucWEpe3ZhciBiPWEubT9hLmE6YS5qLmEuYm9keTthOnt2YXIgYz1xYihiKTtpZihjLmRlZmF1bHRWaWV3JiZjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihjPWMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpKSl7Yz1jLmRpcmVjdGlvbnx8Yy5nZXRQcm9wZXJ0eVZhbHVlKCJkaXJlY3Rpb24iKXx8IiI7YnJlYWsgYX1jPSIifWEucWE9InJ0bCI9PShjfHwoYi5jdXJyZW50U3R5bGU/Yi5jdXJyZW50U3R5bGUuZGlyZWN0aW9uOm51bGwpfHxiLnN0eWxlJiZiLnN0eWxlLmRpcmVjdGlvbil9cmV0dXJuIGEucWF9LFJjPWZ1bmN0aW9uKGEpe3JldHVybiBhLmM/YS5jLmxlbmd0aDowfSxMPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuYz9hLmNbYl18fG51bGw6bnVsbH0sUWM9ZnVuY3Rpb24oYSxiLGMpe2EuYyYmcihhLmMsYixjKX0sVGM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jJiZiP0RhKGEuYyxiKTotMX07dmFyIFZjPWZ1bmN0aW9uKGEsYil7aWYoIWEpdGhyb3cgRXJyb3IoIkludmFsaWQgY2xhc3MgbmFtZSAiK2EpO2lmKCFpYShiKSl0aHJvdyBFcnJvcigiSW52YWxpZCBkZWNvcmF0b3IgZnVuY3Rpb24gIitiKTtVY1thXT1ifSxXYz17fSxVYz17fTt2YXIgWGM9ZnVuY3Rpb24oYSl7dGhpcy5oPWF9O2RhKFhjKTt2YXIgWWM9ZnVuY3Rpb24oYSxiKXthJiYoYS50YWJJbmRleD1iPzA6LTEpfSwkYz1mdW5jdGlvbihhLGIsYyl7Yy5pZCYmTWMoYixjLmlkKTt2YXIgZD1hLmIoKSxlPSExLGY9RChjKTtmJiZyKGYsZnVuY3Rpb24oZyl7Zz09ZD9lPSEwOmcmJnRoaXMuZyhiLGcsZCl9LGEpO2V8fEViKGMsZCk7WmMoYixjKTtyZXR1cm4gY307WGMucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiLGMpe2I9PWMrIi1kaXNhYmxlZCI/YS5aKCExKTpiPT1jKyItaG9yaXpvbnRhbCI/YWQoYSwiaG9yaXpvbnRhbCIpOmI9PWMrIi12ZXJ0aWNhbCImJmFkKGEsInZlcnRpY2FsIil9Owp2YXIgWmM9ZnVuY3Rpb24oYSxiKXtpZihiKWZvcih2YXIgYz1iLmZpcnN0Q2hpbGQsZDtjJiZjLnBhcmVudE5vZGU9PWI7KXtkPWMubmV4dFNpYmxpbmc7aWYoMT09Yy5ub2RlVHlwZSl7YTp7dmFyIGU9YztxKGUpO2U9RChlKTtmb3IodmFyIGY9MCxnPWUubGVuZ3RoO2Y8ZztmKyspe3ZhciBrPWVbZl07aWYoaz1rIGluIFVjP1VjW2tdKCk6bnVsbCl7ZT1rO2JyZWFrIGF9fWU9bnVsbH1lJiYoZS5hPWMsYS5pc0VuYWJsZWQoKXx8ZS5aKCExKSxhLnNhKGUpLFBjKGUsYykpfWVsc2UgYy5ub2RlVmFsdWUmJiIiIT1NYShjLm5vZGVWYWx1ZSl8fGIucmVtb3ZlQ2hpbGQoYyk7Yz1kfX0sYmQ9ZnVuY3Rpb24oYSxiKXtiPWIuZigpO3EoYiwiVGhlIGNvbnRhaW5lciBET00gZWxlbWVudCBjYW5ub3QgYmUgbnVsbC4iKTtIYyhiLHgpO3YmJihiLmhpZGVGb2N1cz0hMCk7KGE9YS5oKSYmdmIoYixhKX07WGMucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKWGMucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5iKCksYz1bYiwiaG9yaXpvbnRhbCI9PWEuSD9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgTT1mdW5jdGlvbigpe30sY2Q7ZGEoTSk7dmFyIGRkPXtidXR0b246InByZXNzZWQiLGNoZWNrYm94OiJjaGVja2VkIixtZW51aXRlbToic2VsZWN0ZWQiLG1lbnVpdGVtY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtcmFkaW86ImNoZWNrZWQiLHJhZGlvOiJjaGVja2VkIix0YWI6InNlbGVjdGVkIix0cmVlaXRlbToic2VsZWN0ZWQifTtNLnByb3RvdHlwZS5oPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLmouYigiRElWIixlZCh0aGlzLGEpLmpvaW4oIiAiKSxhLmJhKX07dmFyIGdkPWZ1bmN0aW9uKGEsYixjKXtpZihhPWEuZj9hLmYoKTphKXt2YXIgZD1bYl07diYmIUEoIjciKSYmKGQ9ZmQoRChhKSxiKSxkLnB1c2goYikpOyhjP0ZiOkhiKShhLGQpfX07Ck0ucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiKXtiLmlkJiZNYyhhLGIuaWQpO2ImJmIuZmlyc3RDaGlsZD9oZChhLGIuZmlyc3RDaGlsZC5uZXh0U2libGluZz9KYShiLmNoaWxkTm9kZXMpOmIuZmlyc3RDaGlsZCk6YS5iYT1udWxsO3ZhciBjPTAsZD10aGlzLmEoKSxlPXRoaXMuYSgpLGY9ITEsZz0hMSxrPSExLHA9SmEoRChiKSk7cihwLGZ1bmN0aW9uKEIpe2Z8fEIhPWQ/Z3x8QiE9ZT9jfD1pZCh0aGlzLEIpOmc9ITA6KGY9ITAsZT09ZCYmKGc9ITApKTsxPT1pZCh0aGlzLEIpJiYoQWEoYiksc2IoYikmJnRiKGIpJiZyYihiLCExKSl9LHRoaXMpO2Eubz1jO2Z8fChwLnB1c2goZCksZT09ZCYmKGc9ITApKTtnfHxwLnB1c2goZSk7KGE9YS53YSkmJnAucHVzaC5hcHBseShwLGEpO2lmKHYmJiFBKCI3Iikpe3ZhciB3PWZkKHApOzA8dy5sZW5ndGgmJihwLnB1c2guYXBwbHkocCx3KSxrPSEwKX1mJiZnJiYhYSYmIWt8fENiKGIscC5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIGpkPWZ1bmN0aW9uKGEsYil7aWYoYT1hLmgoKSl7cShiLCJUaGUgZWxlbWVudCBwYXNzZWQgYXMgYSBmaXJzdCBwYXJhbWV0ZXIgY2Fubm90IGJlIG51bGwuIik7dmFyIGM9Yi5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDthIT1jJiZ2YihiLGEpfX0sa2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYztpZihhLnYmMzImJihjPWEuZigpKSl7aWYoIWImJmEubyYzMil7dHJ5e2MuYmx1cigpfWNhdGNoKGQpe31hLm8mMzImJmEuRmEobnVsbCl9KHNiKGMpJiZ0YihjKSkhPWImJnJiKGMsYil9fSxsZD1mdW5jdGlvbihhLGIsYyl7Y2R8fChjZD17MToiZGlzYWJsZWQiLDg6InNlbGVjdGVkIiwxNjoiY2hlY2tlZCIsNjQ6ImV4cGFuZGVkIn0pO3EoYSwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO2I9Y2RbYl07dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDtkJiYoZD1kZFtkXXx8YixiPSJjaGVja2VkIj09Ynx8InNlbGVjdGVkIj09CmI/ZDpiKTtiJiZ4YihhLGIsYyl9O00ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250cm9sIn07CnZhciBlZD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuYSgpLGQ9W2NdLGU9YS5hKCk7ZSE9YyYmZC5wdXNoKGUpO2M9Yi5vO2ZvcihlPVtdO2M7KXt2YXIgZj1jJi1jO2UucHVzaChtZChhLGYpKTtjJj1+Zn1kLnB1c2guYXBwbHkoZCxlKTsoYT1iLndhKSYmZC5wdXNoLmFwcGx5KGQsYSk7diYmIUEoIjciKSYmZC5wdXNoLmFwcGx5KGQsZmQoZCkpO3JldHVybiBkfSxmZD1mdW5jdGlvbihhLGIpe3ZhciBjPVtdO2ImJihhPUlhKGEsW2JdKSk7cihbXSxmdW5jdGlvbihkKXshRmEoZCxsYShHYSxhKSl8fGImJiFHYShkLGIpfHxjLnB1c2goZC5qb2luKCJfIikpfSk7cmV0dXJuIGN9LG1kPWZ1bmN0aW9uKGEsYil7YS5ifHxuZChhKTtyZXR1cm4gYS5iW2JdfSxpZD1mdW5jdGlvbihhLGIpe2Euanx8KGEuYnx8bmQoYSksYS5qPXNhKGEuYikpO2E9cGFyc2VJbnQoYS5qW2JdLDEwKTtyZXR1cm4gaXNOYU4oYSk/MDphfSxuZD1mdW5jdGlvbihhKXt2YXIgYj1hLmEoKSxjPSF0KGIucmVwbGFjZSgvXHhhMHxccy9nLAoiICIpLCIgIik7cShjLCJDb250cm9sUmVuZGVyZXIgaGFzIGFuIGludmFsaWQgY3NzIGNsYXNzOiAnIitiKyInIik7YS5iPXsxOmIrIi1kaXNhYmxlZCIsMjpiKyItaG92ZXIiLDQ6YisiLWFjdGl2ZSIsODpiKyItc2VsZWN0ZWQiLDE2OmIrIi1jaGVja2VkIiwzMjpiKyItZm9jdXNlZCIsNjQ6YisiLW9wZW4ifX07dmFyIE49ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO2lmKCFiKXtiPXRoaXMuY29uc3RydWN0b3I7Zm9yKHZhciBkO2I7KXtkPWJbamFdfHwoYltqYV09KytrYSk7aWYoZD1XY1tkXSlicmVhaztiPWIuaT9iLmkuY29uc3RydWN0b3I6bnVsbH1iPWQ/aWEoZC5SKT9kLlIoKTpuZXcgZDpudWxsfXRoaXMuQj1iO3RoaXMuYmE9dm9pZCAwIT09YT9hOm51bGx9O24oTixLKTtoPU4ucHJvdG90eXBlO2guYmE9bnVsbDtoLm89MDtoLnY9Mzk7aC5LPTA7aC5JYT0hMDtoLndhPW51bGw7aC55YT0hMDtoLmlhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CLmModGhpcyk7dGhpcy5hPWE7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmeGIoYSwiaGlkZGVuIiwhMCkpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hPXRoaXMuQi5nKHRoaXMsYSk7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5JYT0ibm9uZSIhPWEuc3R5bGUuZGlzcGxheX07CmguRD1mdW5jdGlvbigpe04uaS5ELmNhbGwodGhpcyk7dmFyIGE9TmModGhpcyk7cSh0aGlzKTtxKGEpO3RoaXMuaXNWaXNpYmxlKCl8fHhiKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fGxkKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy52JjgmJmxkKGEsOCwhISh0aGlzLm8mOCkpO3RoaXMudiYxNiYmbGQoYSwxNiwhISh0aGlzLm8mMTYpKTt0aGlzLnYmNjQmJmxkKGEsNjQsISEodGhpcy5vJjY0KSk7YT10aGlzLkI7U2ModGhpcykmJmdkKHRoaXMuZigpLGEuYSgpKyItcnRsIiwhMCk7dGhpcy5pc0VuYWJsZWQoKSYma2QodGhpcyx0aGlzLmlzVmlzaWJsZSgpKTtpZih0aGlzLnYmLTImJih0aGlzLnlhJiZvZCh0aGlzLCEwKSx0aGlzLnYmMzImJihhPXRoaXMuZigpKSkpe3ZhciBiPXRoaXMuV3x8KHRoaXMuVz1uZXcgSik7emMoYixhKTtIKEgoSChPYyh0aGlzKSxiLCJrZXkiLHRoaXMuZmEpLGEsImZvY3VzIix0aGlzLk5hKSxhLCJibHVyIiwKdGhpcy5GYSl9fTt2YXIgb2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYz1PYyhhKSxkPWEuZigpO2I/KEgoSChIKEgoYyxkLEYuTCxhLmthKSxkLFtGLk0sRi5hYV0sYS5sYSksZCwibW91c2VvdmVyIixhLkFhKSxkLCJtb3VzZW91dCIsYS56YSksYS5lYSE9Y2EmJkgoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fEgoYyxkLCJkYmxjbGljayIsYS5KYSksYS5nYXx8KGEuZ2E9bmV3IHBkKGEpLHpiKGEsbGEoQWIsYS5nYSkpKSkpOihxYyhxYyhxYyhxYyhjLGQsRi5MLGEua2EpLGQsW0YuTSxGLmFhXSxhLmxhKSxkLCJtb3VzZW92ZXIiLGEuQWEpLGQsIm1vdXNlb3V0IixhLnphKSxhLmVhIT1jYSYmcWMoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fHFjKGMsZCwiZGJsY2xpY2siLGEuSmEpLEFiKGEuZ2EpLGEuZ2E9bnVsbCkpfTsKTi5wcm90b3R5cGUuUD1mdW5jdGlvbigpe04uaS5QLmNhbGwodGhpcyk7dGhpcy5XJiZGYyh0aGlzLlcpO3RoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJmtkKHRoaXMsITEpfTtOLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7Ti5pLnUuY2FsbCh0aGlzKTt0aGlzLlcmJih0aGlzLlcuTigpLGRlbGV0ZSB0aGlzLlcpO2RlbGV0ZSB0aGlzLkI7dGhpcy5nYT10aGlzLndhPXRoaXMuYmE9bnVsbH07dmFyIGhkPWZ1bmN0aW9uKGEsYil7YS5iYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm8mMSl9OwpOLnByb3RvdHlwZS5aPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYjtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0VuYWJsZWQmJiFiLmlzRW5hYmxlZCgpfHwhTyh0aGlzLDEsIWEpfHwoYXx8KHFkKHRoaXMsITEpLFAodGhpcywhMSkpLHRoaXMuaXNWaXNpYmxlKCkmJmtkKHRoaXMsYSksUSh0aGlzLDEsIWEsITApKX07CnZhciBQPWZ1bmN0aW9uKGEsYil7TyhhLDIsYikmJlEoYSwyLGIpfSxxZD1mdW5jdGlvbihhLGIpe08oYSw0LGIpJiZRKGEsNCxiKX0scmQ9ZnVuY3Rpb24oYSxiKXtPKGEsOCxiKSYmUShhLDgsYil9LHNkPWZ1bmN0aW9uKGEsYil7TyhhLDY0LGIpJiZRKGEsNjQsYil9LFE9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIWQmJjE9PWIpYS5aKCFjKTtlbHNlIGlmKGEudiZiJiZjIT0hIShhLm8mYikpe3ZhciBlPWEuQjtpZihkPWEuZigpKShlPW1kKGUsYikpJiZnZChhLGUsYyksbGQoZCxiLGMpO2Eubz1jP2Eub3xiOmEubyZ+Yn19LHRkPWZ1bmN0aW9uKGEsYixjKXtpZihhLm0mJmEubyZiJiYhYyl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTshYyYmYS5vJmImJlEoYSxiLCExKTthLnY9Yz9hLnZ8YjphLnYmfmJ9LFI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hISgyNTUmYikmJiEhKGEudiZiKX0sTz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuISEoYS52JmIpJiYhIShhLm8mCmIpIT1jJiYoIShhLksmYil8fHVjKGEsS2MoYixjKSkpJiYhYS5VfTtoPU4ucHJvdG90eXBlO2guQWE9ZnVuY3Rpb24oYSl7KCFhLnJlbGF0ZWRUYXJnZXR8fCFwYih0aGlzLmYoKSxhLnJlbGF0ZWRUYXJnZXQpKSYmdWModGhpcywiZW50ZXIiKSYmdGhpcy5pc0VuYWJsZWQoKSYmUih0aGlzLDIpJiZQKHRoaXMsITApfTtoLnphPWZ1bmN0aW9uKGEpe2EucmVsYXRlZFRhcmdldCYmcGIodGhpcy5mKCksYS5yZWxhdGVkVGFyZ2V0KXx8IXVjKHRoaXMsImxlYXZlIil8fChSKHRoaXMsNCkmJnFkKHRoaXMsITEpLFIodGhpcywyKSYmUCh0aGlzLCExKSl9O2guZWE9Y2E7Cmgua2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSxPYihhKSYmISh5JiZ6JiZhLmN0cmxLZXkpKSl7Uih0aGlzLDQpJiZxZCh0aGlzLCEwKTt2YXIgYjtpZihiPXRoaXMuQil7dmFyIGM7Yj10aGlzLnYmMzImJihjPXRoaXMuZigpKT9zYihjKSYmdGIoYyk6ITF9YiYmdGhpcy5mKCkuZm9jdXMoKX0hT2IoYSl8fHkmJnomJmEuY3RybEtleXx8YS5nKCl9O2gubGE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSx0aGlzLm8mNCYmdWQodGhpcyxhKSYmUih0aGlzLDQpJiZxZCh0aGlzLCExKSl9O2guSmE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmdWQodGhpcyxhKX07CnZhciB1ZD1mdW5jdGlvbihhLGIpe2lmKFIoYSwxNikpe3ZhciBjPSEoYS5vJjE2KTtPKGEsMTYsYykmJlEoYSwxNixjKX1SKGEsOCkmJnJkKGEsITApO1IoYSw2NCkmJnNkKGEsIShhLm8mNjQpKTtjPW5ldyBFKCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuQT1iLkEpO3JldHVybiB1YyhhLGMpfTtOLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe1IodGhpcywzMikmJk8odGhpcywzMiwhMCkmJlEodGhpcywzMiwhMCl9O04ucHJvdG90eXBlLkZhPWZ1bmN0aW9uKCl7Uih0aGlzLDQpJiZxZCh0aGlzLCExKTtSKHRoaXMsMzIpJiZPKHRoaXMsMzIsITEpJiZRKHRoaXMsMzIsITEpfTsKTi5wcm90b3R5cGUuZmE9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJjEzPT1hLmMmJnVkKHRoaXMsYSk/KGEuZygpLGEuaigpLCEwKTohMX07aWYoIWlhKE4pKXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBjbGFzcyAiK04pO2lmKCFpYShNKSl0aHJvdyBFcnJvcigiSW52YWxpZCByZW5kZXJlciBjbGFzcyAiK00pO3ZhciB2ZD1OW2phXXx8KE5bamFdPSsra2EpO1djW3ZkXT1NO1ZjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIHBkPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9ITE7dGhpcy5jPW5ldyBvYyh0aGlzKTt6Yih0aGlzLGxhKEFiLHRoaXMuYykpO2E9TmModGhpcy5iKTtIKEgoSCh0aGlzLmMsYSxGLkwsdGhpcy5oKSxhLEYuTSx0aGlzLmopLGEsImNsaWNrIix0aGlzLmcpfTtuKHBkLEMpO3ZhciB3ZD0hdnx8OTw9TnVtYmVyKGliKTsKcGQucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXt0aGlzLmE9ITF9O3BkLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7dGhpcy5hPSEwfTt2YXIgeGQ9ZnVuY3Rpb24oYSxiKXtpZighd2QpcmV0dXJuIGEuYnV0dG9uPTAsYS50eXBlPWIsYTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudHMiKTtjLmluaXRNb3VzZUV2ZW50KGIsYS5idWJibGVzLGEuY2FuY2VsYWJsZSxhLnZpZXd8fG51bGwsYS5kZXRhaWwsYS5zY3JlZW5YLGEuc2NyZWVuWSxhLmNsaWVudFgsYS5jbGllbnRZLGEuY3RybEtleSxhLmFsdEtleSxhLnNoaWZ0S2V5LGEubWV0YUtleSwwLGEucmVsYXRlZFRhcmdldHx8bnVsbCk7cmV0dXJuIGN9OwpwZC5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXtpZih0aGlzLmEpdGhpcy5hPSExO2Vsc2V7dmFyIGI9YS5iLGM9Yi5idXR0b24sZD1iLnR5cGUsZT14ZChiLCJtb3VzZWRvd24iKTt0aGlzLmIua2EobmV3IEcoZSxhLmEpKTtlPXhkKGIsIm1vdXNldXAiKTt0aGlzLmIubGEobmV3IEcoZSxhLmEpKTt3ZHx8KGIuYnV0dG9uPWMsYi50eXBlPWQpfX07cGQucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt0aGlzLmI9bnVsbDtwZC5pLnUuY2FsbCh0aGlzKX07dmFyIFM9ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO3RoaXMuZGE9Ynx8WGMuUigpO3RoaXMuSD1hfHwidmVydGljYWwifTtuKFMsSyk7aD1TLnByb3RvdHlwZTtoLkRhPW51bGw7aC5jYT1udWxsO2guZGE9bnVsbDtoLkg9bnVsbDtoLlQ9ITA7aC5PPSEwO2gubD0tMTtoLnM9bnVsbDtoLlY9ITE7aC5JPW51bGw7dmFyIHlkPWZ1bmN0aW9uKGEpe3JldHVybiBhLkRhfHxhLmYoKX07aD1TLnByb3RvdHlwZTtoLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPXRoaXMuai5iKCJESVYiLHRoaXMuZGEuYyh0aGlzKS5qb2luKCIgIikpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKGEpe3JldHVybiJESVYiPT1hLnRhZ05hbWV9O2gudmE9ZnVuY3Rpb24oYSl7dGhpcy5hPSRjKHRoaXMuZGEsdGhpcyxhKTsibm9uZSI9PWEuc3R5bGUuZGlzcGxheSYmKHRoaXMuVD0hMSl9OwpoLkQ9ZnVuY3Rpb24oKXtTLmkuRC5jYWxsKHRoaXMpO1FjKHRoaXMsZnVuY3Rpb24oYil7Yi5tJiZ6ZCh0aGlzLGIpfSx0aGlzKTt2YXIgYT10aGlzLmYoKTtiZCh0aGlzLmRhLHRoaXMpO0FkKHRoaXMsdGhpcy5UKTtIKEgoSChIKEgoSChIKEgoT2ModGhpcyksdGhpcywiZW50ZXIiLHRoaXMuV2EpLHRoaXMsImhpZ2hsaWdodCIsdGhpcy5YYSksdGhpcywidW5oaWdobGlnaHQiLHRoaXMuY2IpLHRoaXMsIm9wZW4iLHRoaXMuWWEpLHRoaXMsImNsb3NlIix0aGlzLlVhKSxhLEYuTCx0aGlzLlNhKSxxYihhKSxbRi5NLEYuYWFdLHRoaXMuVmEpLGEsW0YuTCxGLk0sRi5hYSwibW91c2VvdmVyIiwibW91c2VvdXQiLCJjb250ZXh0bWVudSJdLHRoaXMuVGEpO0JkKHRoaXMpfTt2YXIgQmQ9ZnVuY3Rpb24oYSl7dmFyIGI9T2MoYSksYz15ZChhKTtIKEgoSChiLGMsImZvY3VzIixhLkhhKSxjLCJibHVyIixhLlFhKSxhLmNhfHwoYS5jYT1uZXcgSih5ZChhKSkpLCJrZXkiLGEuUmEpfTtoPVMucHJvdG90eXBlOwpoLlA9ZnVuY3Rpb24oKXtDZCh0aGlzLC0xKTt0aGlzLnMmJnNkKHRoaXMucywhMSk7dGhpcy5WPSExO1MuaS5QLmNhbGwodGhpcyl9O2gudT1mdW5jdGlvbigpe1MuaS51LmNhbGwodGhpcyk7dGhpcy5jYSYmKHRoaXMuY2EuTigpLHRoaXMuY2E9bnVsbCk7dGhpcy5kYT10aGlzLnM9dGhpcy5JPXRoaXMuRGE9bnVsbH07aC5XYT1mdW5jdGlvbigpe3JldHVybiEwfTsKaC5YYT1mdW5jdGlvbihhKXt2YXIgYj1UYyh0aGlzLGEudGFyZ2V0KTtpZigtMTxiJiZiIT10aGlzLmwpe3ZhciBjPUwodGhpcyx0aGlzLmwpO2MmJlAoYywhMSk7dGhpcy5sPWI7Yz1MKHRoaXMsdGhpcy5sKTt0aGlzLlYmJnFkKGMsITApO3RoaXMucyYmYyE9dGhpcy5zJiYoYy52JjY0P3NkKGMsITApOnNkKHRoaXMucywhMSkpfWI9dGhpcy5mKCk7cShiLCJUaGUgRE9NIGVsZW1lbnQgZm9yIHRoZSBjb250YWluZXIgY2Fubm90IGJlIG51bGwuIik7bnVsbCE9YS50YXJnZXQuZigpJiZ4YihiLCJhY3RpdmVkZXNjZW5kYW50IixhLnRhcmdldC5mKCkuaWQpfTtoLmNiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT1MKHRoaXMsdGhpcy5sKSYmKHRoaXMubD0tMSk7YT10aGlzLmYoKTtxKGEsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnJlbW92ZUF0dHJpYnV0ZSh3YigiYWN0aXZlZGVzY2VuZGFudCIpKX07CmguWWE9ZnVuY3Rpb24oYSl7KGE9YS50YXJnZXQpJiZhIT10aGlzLnMmJmEuYj09dGhpcyYmKHRoaXMucyYmc2QodGhpcy5zLCExKSx0aGlzLnM9YSl9O2guVWE9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMucyYmKHRoaXMucz1udWxsKTt2YXIgYj10aGlzLmYoKSxjPWEudGFyZ2V0LmYoKTtiJiZhLnRhcmdldC5vJjImJmMmJihhPSIiLGMmJihhPWMuaWQscShhLCJUaGUgYWN0aXZlIGVsZW1lbnQgc2hvdWxkIGhhdmUgYW4gaWQuIikpLHhiKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEpKX07aC5TYT1mdW5jdGlvbihhKXt0aGlzLk8mJih0aGlzLlY9ITApO3ZhciBiPXlkKHRoaXMpO2ImJnNiKGIpJiZ0YihiKT9iLmZvY3VzKCk6YS5nKCl9O2guVmE9ZnVuY3Rpb24oKXt0aGlzLlY9ITF9OwpoLlRhPWZ1bmN0aW9uKGEpe2E6e3ZhciBiPWEudGFyZ2V0O2lmKHRoaXMuSSlmb3IodmFyIGM9dGhpcy5mKCk7YiYmYiE9PWM7KXt2YXIgZD1iLmlkO2lmKGQgaW4gdGhpcy5JKXtiPXRoaXMuSVtkXTticmVhayBhfWI9Yi5wYXJlbnROb2RlfWI9bnVsbH1pZihiKXN3aXRjaChhLnR5cGUpe2Nhc2UgRi5MOmIua2EoYSk7YnJlYWs7Y2FzZSBGLk06Y2FzZSBGLmFhOmIubGEoYSk7YnJlYWs7Y2FzZSAibW91c2VvdmVyIjpiLkFhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3V0IjpiLnphKGEpO2JyZWFrO2Nhc2UgImNvbnRleHRtZW51IjpiLmVhKGEpfX07aC5IYT1mdW5jdGlvbigpe307aC5RYT1mdW5jdGlvbigpe0NkKHRoaXMsLTEpO3RoaXMuVj0hMTt0aGlzLnMmJnNkKHRoaXMucywhMSl9OwpoLlJhPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmlzRW5hYmxlZCgpJiZ0aGlzLmlzVmlzaWJsZSgpJiYoMCE9UmModGhpcyl8fHRoaXMuRGEpJiZEZCh0aGlzLGEpPyhhLmcoKSxhLmooKSwhMCk6ITF9Owp2YXIgRGQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1MKGEsYS5sKTtpZihjJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5mYSYmYy5mYShiKXx8YS5zJiZhLnMhPWMmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLnMuZmEmJmEucy5mYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuYyl7Y2FzZSAyNzp5ZChhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpFZChhKTticmVhaztjYXNlIDM1OkZkKGEpO2JyZWFrO2Nhc2UgMzg6aWYoInZlcnRpY2FsIj09YS5IKUdkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9IZChhKTpHZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoInZlcnRpY2FsIj09YS5IKUhkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9HZChhKTpIZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSx6ZD1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZigpO2M9Yy5pZHx8KGMuaWQ9TGMoYikpO2EuSXx8KGEuST17fSk7YS5JW2NdPWJ9O1MucHJvdG90eXBlLnNhPWZ1bmN0aW9uKGEsYil7Q2EoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtTLmkuc2EuY2FsbCh0aGlzLGEsYil9O1MucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEsYixjKXtDYShhLE4pO2EuS3w9MjthLkt8PTY0O3RkKGEsMzIsITEpO2EubSYmMCE9YS55YSYmb2QoYSwhMSk7YS55YT0hMTt2YXIgZD1hLmI9PXRoaXM/VGModGhpcyxhKTotMTtTLmkudGEuY2FsbCh0aGlzLGEsYixjKTthLm0mJnRoaXMubSYmemQodGhpcyxhKTthPWQ7LTE9PWEmJihhPVJjKHRoaXMpKTthPT10aGlzLmw/dGhpcy5sPU1hdGgubWluKFJjKHRoaXMpLTEsYik6YT50aGlzLmwmJmI8PXRoaXMubD90aGlzLmwrKzphPHRoaXMubCYmYj50aGlzLmwmJnRoaXMubC0tfTsKdmFyIGFkPWZ1bmN0aW9uKGEsYil7aWYoYS5mKCkpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5IPWJ9O1MucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O3ZhciBBZD1mdW5jdGlvbihhLGIpe2EuVD1iO3ZhciBjPWEuZigpO2MmJihjLnN0eWxlLmRpc3BsYXk9Yj8iIjoibm9uZSIsWWMoeWQoYSksYS5PJiZhLlQpKX07Uy5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT307Uy5wcm90b3R5cGUuWj1mdW5jdGlvbihhKXt0aGlzLk8hPWEmJnVjKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5PPSEwLFFjKHRoaXMsZnVuY3Rpb24oYil7Yi5MYT9kZWxldGUgYi5MYTpiLlooITApfSkpOihRYyh0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5aKCExKTpiLkxhPSEwfSksdGhpcy5WPXRoaXMuTz0hMSksWWMoeWQodGhpcyksYSYmdGhpcy5UKSl9Owp2YXIgQ2Q9ZnVuY3Rpb24oYSxiKXsoYj1MKGEsYikpP1AoYiwhMCk6LTE8YS5sJiZQKEwoYSxhLmwpLCExKX0sRWQ9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LFJjKGEpLTEpfSxGZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiAwPmI/Yy0xOmJ9LDApfSxIZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7cmV0dXJuKGIrMSklY30sYS5sKX0sR2Q9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe2ItLTtyZXR1cm4gMD5iP2MtMTpifSxhLmwpfSxJZD1mdW5jdGlvbihhLGIsYyl7Yz0wPmM/VGMoYSxhLnMpOmM7dmFyIGQ9UmMoYSk7Yz1iLmNhbGwoYSxjLGQpO2Zvcih2YXIgZT0wO2U8PWQ7KXt2YXIgZj1MKGEsYyksZztpZihnPWYpZz1mLmlzVmlzaWJsZSgpJiZmLmlzRW5hYmxlZCgpJiYhIShmLnYmMik7aWYoZyl7YS5FYShjKTticmVha31lKys7Yz1iLmNhbGwoYSxjLGQpfX07ClMucHJvdG90eXBlLkVhPWZ1bmN0aW9uKGEpe0NkKHRoaXMsYSl9O3ZhciBUPWZ1bmN0aW9uKCl7fTtuKFQsTSk7ZGEoVCk7VC5wcm90b3R5cGUuYT1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYiJ9O1QucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXtyZXR1cm4idGFiIn07VC5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYj1ULmkuYy5jYWxsKHRoaXMsYSk7KGE9YS5QYSkmJmImJihiLnRpdGxlPWF8fCIiKTtyZXR1cm4gYn07VC5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIpe2I9VC5pLmcuY2FsbCh0aGlzLGEsYik7dmFyIGM9Yi50aXRsZXx8IiI7YyYmKGEuUGE9Yyk7YS5vJjgmJihjPWEuYikmJmlhKGMuRykmJihRKGEsOCwhMSksYy5HKGEpKTtyZXR1cm4gYn07dmFyIEpkPWZ1bmN0aW9uKGEsYixjKXtOLmNhbGwodGhpcyxhLGJ8fFQuUigpLGMpO3RkKHRoaXMsOCwhMCk7dGhpcy5LfD05fTtuKEpkLE4pO1ZjKCJnb29nLXRhYiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEpkKG51bGwpfSk7dmFyIFU9ZnVuY3Rpb24oKXt0aGlzLmg9InRhYmxpc3QifTtuKFUsWGMpO2RhKFUpO1UucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWItYmFyIn07VS5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIsYyl7dGhpcy5qfHwodGhpcy5hfHxLZCh0aGlzKSx0aGlzLmo9c2EodGhpcy5hKSk7dmFyIGQ9dGhpcy5qW2JdO2Q/KGFkKGEsTGQoZCkpLGEuQj1kKTpVLmkuZy5jYWxsKHRoaXMsYSxiLGMpfTtVLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPVUuaS5jLmNhbGwodGhpcyxhKTt0aGlzLmF8fEtkKHRoaXMpO2IucHVzaCh0aGlzLmFbYS5CXSk7cmV0dXJuIGJ9O3ZhciBLZD1mdW5jdGlvbihhKXt2YXIgYj1hLmIoKTthLmE9e3RvcDpiKyItdG9wIixib3R0b206YisiLWJvdHRvbSIsc3RhcnQ6YisiLXN0YXJ0IixlbmQ6YisiLWVuZCJ9fTt2YXIgVj1mdW5jdGlvbihhLGIsYyl7YT1hfHwidG9wIjthZCh0aGlzLExkKGEpKTt0aGlzLkI9YTtTLmNhbGwodGhpcyx0aGlzLkgsYnx8VS5SKCksYyk7TWQodGhpcyl9O24oVixTKTtoPVYucHJvdG90eXBlO2guQz1udWxsO2guRD1mdW5jdGlvbigpe1YuaS5ELmNhbGwodGhpcyk7TWQodGhpcyl9O2gudT1mdW5jdGlvbigpe1YuaS51LmNhbGwodGhpcyk7dGhpcy5DPW51bGx9O2guRWE9ZnVuY3Rpb24oYSl7Vi5pLkVhLmNhbGwodGhpcyxhKTt0aGlzLkcoTCh0aGlzLGEpKX07aC5HPWZ1bmN0aW9uKGEpe2E/cmQoYSwhMCk6dGhpcy5DJiZyZCh0aGlzLkMsITEpfTsKdmFyIE5kPWZ1bmN0aW9uKGEsYil7aWYoYiYmYj09YS5DKXtmb3IodmFyIGM9VGMoYSxiKSxkPWMtMTtiPUwoYSxkKTtkLS0pe3ZhciBlPWI7aWYoZS5pc1Zpc2libGUoKSYmZS5pc0VuYWJsZWQoKSl7YS5HKGIpO3JldHVybn19Zm9yKGMrPTE7Yj1MKGEsYyk7YysrKWlmKGQ9YixkLmlzVmlzaWJsZSgpJiZkLmlzRW5hYmxlZCgpKXthLkcoYik7cmV0dXJufWEuRyhudWxsKX19O2g9Vi5wcm90b3R5cGU7aC5hYj1mdW5jdGlvbihhKXt0aGlzLkMmJnRoaXMuQyE9YS50YXJnZXQmJnJkKHRoaXMuQywhMSk7dGhpcy5DPWEudGFyZ2V0fTtoLmJiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT10aGlzLkMmJih0aGlzLkM9bnVsbCl9O2guWmE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guJGE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guSGE9ZnVuY3Rpb24oKXtMKHRoaXMsdGhpcy5sKXx8Q2QodGhpcyxUYyh0aGlzLHRoaXMuQ3x8TCh0aGlzLDApKSl9Owp2YXIgTWQ9ZnVuY3Rpb24oYSl7SChIKEgoSChPYyhhKSxhLCJzZWxlY3QiLGEuYWIpLGEsInVuc2VsZWN0IixhLmJiKSxhLCJkaXNhYmxlIixhLlphKSxhLCJoaWRlIixhLiRhKX0sTGQ9ZnVuY3Rpb24oYSl7cmV0dXJuInN0YXJ0Ij09YXx8ImVuZCI9PWE/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O1ZjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBWfSk7ZnVuY3Rpb24gT2QoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIFBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgZz1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIrZyk7Zm9yKHZhciBrPVtdLHA9YmEoYyksdz1wLm5leHQoKTshdy5kb25lO3c9cC5uZXh0KCkpe3c9dy52YWx1ZTt2YXIgQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKQi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO0IudGV4dENvbnRlbnQ9dztmLmFwcGVuZENoaWxkKEIpO2sucHVzaChCKX0iYm90dG9tIiE9ZyYmZS5hcHBlbmRDaGlsZChmKTtwPW51bGw7aWYoInRvcCI9PWd8fCJib3R0b20iPT1nKXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTsidG9wIj09ZyYmcCYmZS5hcHBlbmRDaGlsZChwKTtCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0IuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciByYT1bXTtjPWJhKGMpO2Zvcih3PWMubmV4dCgpOyF3LmRvbmU7dz1jLm5leHQoKSl3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHcuaWQ9ZS5pZCsiX2NvbnRlbnRfIityYS5sZW5ndGgsdy5zdHlsZS5kaXNwbGF5PSJub25lIixCLmFwcGVuZENoaWxkKHcpLHJhLnB1c2godyk7ZS5hcHBlbmRDaGlsZChCKTsiYm90dG9tIj09ZyYmKHAmJgplLmFwcGVuZENoaWxkKHApLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBYPW5ldyBWKGcpO1BjKFgsZik7dmFyIFk9LTE7ZGMoWCwic2VsZWN0IixmdW5jdGlvbihaKXtaPWsuaW5kZXhPZihaLnRhcmdldC5mKCkpO1ohPVkmJigwPD1ZJiZZPHJhLmxlbmd0aCYmKHJhW1ldLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFk9LTEpLDA8PVomJlo8cmEubGVuZ3RoJiYoWT1aLHJhW1ldLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksWC5HKEwoWCxZKSkpfSk7WC5HKEwoWCxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFope1guRyhMKFgsWikpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChPZChhKSl9LFFkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sVz1sOwpRZFswXWluIFd8fCJ1bmRlZmluZWQiPT10eXBlb2YgVy5leGVjU2NyaXB0fHxXLmV4ZWNTY3JpcHQoInZhciAiK1FkWzBdKTtmb3IodmFyIFJkO1FkLmxlbmd0aCYmKFJkPVFkLnNoaWZ0KCkpOylRZC5sZW5ndGh8fHZvaWQgMD09PVBkP1dbUmRdJiZXW1JkXSE9PU9iamVjdC5wcm90b3R5cGVbUmRdP1c9V1tSZF06Vz1XW1JkXT17fTpXW1JkXT1QZDt9KS5jYWxsKHRoaXMpOwovLyBjbGFuZy1mb3JtYXQgb24K", + "headers": [ + [ + "content-type", + "application/javascript" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + } + } + }, + "executionInfo": { + "elapsed": 9553, + "status": "ok", + "timestamp": 1600709617227, + "user": { + "displayName": "Evgeny Skvortsov", + "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhiQjODaOVLfYnUuWS9rB3LRntzJDM0hqElzsUkdQ=s64", + "userId": "11510585406840398626" + }, + "user_tz": 420 + }, + "id": "FVHSuIyGXjXP", + "outputId": "29a06c36-9db5-461e-8a13-463cf4aaffa8" + }, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9314107a-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id11\", \"tabNames\": [\"Test1\", \"Test2\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_d679621f1a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"931455a8-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id11\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_466b79889f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9315b402-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_f360a2957c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_2", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9315fc64-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id11_content_2\");\n", + "//# sourceURL=js_9d290cb8ae" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_2", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"931642be-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9315fc64-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_2d563183bf" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_2", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93168602-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id11\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_2b5ae18bf3" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_2", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running Test1\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"9318ef00-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9315b402-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_c5ceaada0c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_2", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"931af0ca-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_7cb1e2c0ed" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_0", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"931b3738-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id11_content_0\");\n", + "//# sourceURL=js_7a23a3223b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_0", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"931b82ba-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"931b3738-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_e3176eb30c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_0", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"931bcd38-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id11\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_a3e77df7b6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_0", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_0", + "outputarea_id11", + "outputarea_id12", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_0", + "outputarea_id11", + "outputarea_id12", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_0", + "outputarea_id11", + "outputarea_id12", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"931da040-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id12\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_1938fe27a4" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_0", + "outputarea_id11", + "outputarea_id12", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"931e06fc-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id12\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_4533cf5231" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_0", + "outputarea_id11", + "outputarea_id12", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"931f6aa6-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b877d79b01" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_0", + "id12_content_0", + "outputarea_id11", + "outputarea_id12", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"931faafc-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id12_content_0\");\n", + "//# sourceURL=js_b7f576dd81" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_0", + "id12_content_0", + "outputarea_id11", + "outputarea_id12", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"931ff3fe-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"931faafc-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_301a3657b6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_0", + "id12_content_0", + "outputarea_id11", + "outputarea_id12", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93204368-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id12\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_a57dcff555" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_0", + "id12_content_0", + "outputarea_id11", + "outputarea_id12", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mTest1_sql\u001b[0m variable.\n", + "SELECT\n", + " 10 AS x,\n", + " ((((((10) * (10))) + (((2) * (10))))) + (5)) AS y;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"932170d0-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"931f6aa6-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_666ccd6db2" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_0", + "id12_content_0", + "outputarea_id11", + "outputarea_id12", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9322cd40-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"931af0ca-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_408db83bbf" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_0", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"932465ba-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_2f1b429b68" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_2", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9324b2b8-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id11_content_2\");\n", + "//# sourceURL=js_31cd91158c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_2", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9325039e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9324b2b8-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_70d1fd1e01" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_2", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93254f20-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id11\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_24ec55f019" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_2", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93b56a6a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"932465ba-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_bd36d8a138" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_2", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93b8e582-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_fb605a57af" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_0", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93b97150-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id11_content_0\");\n", + "//# sourceURL=js_c8d73a7a27" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_0", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93ba0458-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"93b97150-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_c4d0e67f14" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_0", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93ba92ba-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id11\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_2464590fcc" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_0", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93bc765c-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_391d39ce13" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_0", + "id12_content_1", + "outputarea_id11", + "outputarea_id12", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93bcec22-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id12_content_1\");\n", + "//# sourceURL=js_eac8dad2ec" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_0", + "id12_content_1", + "outputarea_id11", + "outputarea_id12", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93bd2ac0-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"93bcec22-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_3021c58230" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_0", + "id12_content_1", + "outputarea_id11", + "outputarea_id12", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93bd8678-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id12\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_0fe560d1ef" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_0", + "id12_content_1", + "outputarea_id11", + "outputarea_id12", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mTest1\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
xy
010125
\n", + "
" + ], + "text/plain": [ + " x y\n", + "0 10 125" + ] + }, + "metadata": { + "tags": [ + "id11_content_0", + "id12_content_1", + "outputarea_id11", + "outputarea_id12", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93c0d44a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"93bc765c-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_d8257cfd27" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_0", + "id12_content_1", + "outputarea_id11", + "outputarea_id12", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93c20d7e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"93b8e582-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_dca1292c46" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_0", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93c383e8-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_4f1c1ee7a8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_2", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93c3d708-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id11_content_2\");\n", + "//# sourceURL=js_98560c1001" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_2", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93c42424-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"93c3d708-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_21870233fc" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_2", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93c471ea-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id11\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_488ddb65a7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_2", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running Test2\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"93c60802-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"93c383e8-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_9ac6280843" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_2", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93c7a950-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_ed495da08d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_1", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93c7ecee-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id11_content_1\");\n", + "//# sourceURL=js_8f3054da4b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_1", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93c8319a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"93c7ecee-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_9fcf553e3e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_1", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93c86a7a-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id11\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_6a732ca3dd" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_1", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_1", + "outputarea_id11", + "outputarea_id13", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_1", + "outputarea_id11", + "outputarea_id13", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_1", + "outputarea_id11", + "outputarea_id13", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93ca07e0-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id13\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_38d0d06b33" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_1", + "outputarea_id11", + "outputarea_id13", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93ca5024-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id13\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_c95bc83a61" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_1", + "outputarea_id11", + "outputarea_id13", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93cb7fa8-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_1bfaa7f032" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_1", + "id13_content_0", + "outputarea_id11", + "outputarea_id13", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93cbeea2-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id13_content_0\");\n", + "//# sourceURL=js_9b5e480b7e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_1", + "id13_content_0", + "outputarea_id11", + "outputarea_id13", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93cc3786-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"93cbeea2-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_4df625fc15" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_1", + "id13_content_0", + "outputarea_id11", + "outputarea_id13", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93cc845c-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id13\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_875b9170bf" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_1", + "id13_content_0", + "outputarea_id11", + "outputarea_id13", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mTest2_sql\u001b[0m variable.\n", + "SELECT\n", + " 5 AS col0,\n", + " ((10) * (5)) AS col1;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"93cdb7dc-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"93cb7fa8-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_54f15008ab" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_1", + "id13_content_0", + "outputarea_id11", + "outputarea_id13", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93cf5e48-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"93c7a950-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_d67d6d9503" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_1", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93d10f7c-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_4dd088bf75" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_2", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93d161e8-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id11_content_2\");\n", + "//# sourceURL=js_721fc5c180" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_2", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93d1bd78-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"93d161e8-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_b6b8f8aa4e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_2", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"93d21110-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id11\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_66facd0940" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_2", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"946769ae-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"93d10f7c-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_ed55570ec1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_2", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"946a84e0-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_385b2ba771" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_1", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"946ad210-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id11_content_1\");\n", + "//# sourceURL=js_7dd316a30d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_1", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"946b3200-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"946ad210-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_45ad528182" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_1", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"946b7a12-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id11\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_61af7722a8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_1", + "outputarea_id11" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"946ca6a8-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_fc6db1e76f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_1", + "id13_content_1", + "outputarea_id11", + "outputarea_id13", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"946cee10-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id13_content_1\");\n", + "//# sourceURL=js_437db93854" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_1", + "id13_content_1", + "outputarea_id11", + "outputarea_id13", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"946d35e6-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"946cee10-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_4872073c6d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_1", + "id13_content_1", + "outputarea_id11", + "outputarea_id13", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"946d7d08-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id13\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_67d031e56c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_1", + "id13_content_1", + "outputarea_id11", + "outputarea_id13", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mTest2\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1
0550
\n", + "
" + ], + "text/plain": [ + " col0 col1\n", + "0 5 50" + ] + }, + "metadata": { + "tags": [ + "id11_content_1", + "id13_content_1", + "outputarea_id11", + "outputarea_id13", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9470d2fa-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"946ca6a8-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_902beee05a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_1", + "id13_content_1", + "outputarea_id11", + "outputarea_id13", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"94720788-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"946a84e0-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_69be97300e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id11_content_1", + "outputarea_id11" + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "%%logica Test1, Test2\n", + "\n", + "Test1(x:, y:) :-\n", + " y == x * x + 2 * x + 5,\n", + " x == 10;\n", + "\n", + "Test2(x, 10 * x) :- x == 5;" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "s1YNyj78Zvhg" + }, + "source": [ + "### Basic data extraction and filtering\n", + "\n", + "You can easily extract certain columns, or filter rows." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 239, + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH0=", + "headers": [ + [ + "content-type", + "text/css" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgaCxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9ZnVuY3Rpb24oYSl7dmFyIGI9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmYVtTeW1ib2wuaXRlcmF0b3JdO3JldHVybiBiP2IuY2FsbChhKTp7bmV4dDphYShhKX19LGw9dGhpc3x8c2VsZixjYT1mdW5jdGlvbigpe30sZGE9ZnVuY3Rpb24oYSl7YS5CYT12b2lkIDA7YS5SPWZ1bmN0aW9uKCl7cmV0dXJuIGEuQmE/YS5CYTphLkJhPW5ldyBhfX0sZWE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7aWYoIm9iamVjdCI9PWIpaWYoYSl7aWYoYSBpbnN0YW5jZW9mIEFycmF5KXJldHVybiJhcnJheSI7aWYoYSBpbnN0YW5jZW9mIE9iamVjdClyZXR1cm4gYjt2YXIgYz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk7aWYoIltvYmplY3QgV2luZG93XSI9PWMpcmV0dXJuIm9iamVjdCI7CmlmKCJbb2JqZWN0IEFycmF5XSI9PWN8fCJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGgmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5zcGxpY2UmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoInNwbGljZSIpKXJldHVybiJhcnJheSI7aWYoIltvYmplY3QgRnVuY3Rpb25dIj09Y3x8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmNhbGwmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoImNhbGwiKSlyZXR1cm4iZnVuY3Rpb24ifWVsc2UgcmV0dXJuIm51bGwiO2Vsc2UgaWYoImZ1bmN0aW9uIj09YiYmInVuZGVmaW5lZCI9PXR5cGVvZiBhLmNhbGwpcmV0dXJuIm9iamVjdCI7cmV0dXJuIGJ9LGZhPWZ1bmN0aW9uKGEpe3JldHVybiJhcnJheSI9PWVhKGEpfSxoYT1mdW5jdGlvbihhKXt2YXIgYj1lYShhKTtyZXR1cm4iYXJyYXkiPT1ifHwib2JqZWN0Ij09CmImJiJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGh9LGlhPWZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PWVhKGEpfSxtPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBhO3JldHVybiJvYmplY3QiPT1iJiZudWxsIT1hfHwiZnVuY3Rpb24iPT1ifSxqYT0iY2xvc3VyZV91aWRfIisoMUU5Kk1hdGgucmFuZG9tKCk+Pj4wKSxrYT0wLGxhPWZ1bmN0aW9uKGEsYil7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe3ZhciBkPWMuc2xpY2UoKTtkLnB1c2guYXBwbHkoZCxhcmd1bWVudHMpO3JldHVybiBhLmFwcGx5KHRoaXMsZCl9fSxuPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe31jLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLmk9Yi5wcm90b3R5cGU7YS5wcm90b3R5cGU9bmV3IGM7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YX07dmFyIG1hLG5hPXtlYjoiYWN0aXZlZGVzY2VuZGFudCIsamI6ImF0b21pYyIsa2I6ImF1dG9jb21wbGV0ZSIsbWI6ImJ1c3kiLHBiOiJjaGVja2VkIixxYjoiY29saW5kZXgiLHZiOiJjb250cm9scyIseGI6ImRlc2NyaWJlZGJ5IixBYjoiZGlzYWJsZWQiLENiOiJkcm9wZWZmZWN0IixEYjoiZXhwYW5kZWQiLEViOiJmbG93dG8iLEdiOiJncmFiYmVkIixLYjoiaGFzcG9wdXAiLE1iOiJoaWRkZW4iLE9iOiJpbnZhbGlkIixQYjoibGFiZWwiLFFiOiJsYWJlbGxlZGJ5IixSYjoibGV2ZWwiLFdiOiJsaXZlIixrYzoibXVsdGlsaW5lIixsYzoibXVsdGlzZWxlY3RhYmxlIixwYzoib3JpZW50YXRpb24iLHFjOiJvd25zIixyYzoicG9zaW5zZXQiLHRjOiJwcmVzc2VkIix4YzoicmVhZG9ubHkiLHpjOiJyZWxldmFudCIsQWM6InJlcXVpcmVkIixFYzoicm93aW5kZXgiLEhjOiJzZWxlY3RlZCIsSmM6InNldHNpemUiLExjOiJzb3J0IixaYzoidmFsdWVtYXgiLCRjOiJ2YWx1ZW1pbiIsYWQ6InZhbHVlbm93IiwKYmQ6InZhbHVldGV4dCJ9O3ZhciBvYT1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkIGluIGEpYi5jYWxsKGMsYVtkXSxkLGEpfSxwYT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyBpbiBhKWlmKGFbY109PWIpcmV0dXJuITA7cmV0dXJuITF9LHFhPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsIT09YSYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfSxzYT1mdW5jdGlvbihhKXt2YXIgYj17fSxjO2ZvcihjIGluIGEpYlthW2NdXT1jO3JldHVybiBifSx0YT0iY29uc3RydWN0b3IgaGFzT3duUHJvcGVydHkgaXNQcm90b3R5cGVPZiBwcm9wZXJ0eUlzRW51bWVyYWJsZSB0b0xvY2FsZVN0cmluZyB0b1N0cmluZyB2YWx1ZU9mIi5zcGxpdCgiICIpLHVhPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8dGEubGVuZ3RoO2YrKyljPQp0YVtmXSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZCxjKSYmKGFbY109ZFtjXSl9fTt2YXIgdmE9e2ZiOiJhbGVydCIsZ2I6ImFsZXJ0ZGlhbG9nIixoYjoiYXBwbGljYXRpb24iLGliOiJhcnRpY2xlIixsYjoiYmFubmVyIixuYjoiYnV0dG9uIixvYjoiY2hlY2tib3giLHJiOiJjb2x1bW5oZWFkZXIiLHNiOiJjb21ib2JveCIsdGI6ImNvbXBsZW1lbnRhcnkiLHViOiJjb250ZW50aW5mbyIsd2I6ImRlZmluaXRpb24iLHliOiJkaWFsb2ciLHpiOiJkaXJlY3RvcnkiLEJiOiJkb2N1bWVudCIsRmI6ImZvcm0iLEhiOiJncmlkIixJYjoiZ3JpZGNlbGwiLEpiOiJncm91cCIsTGI6ImhlYWRpbmciLE5iOiJpbWciLFNiOiJsaW5rIixUYjoibGlzdCIsVWI6Imxpc3Rib3giLFZiOiJsaXN0aXRlbSIsWGI6ImxvZyIsWWI6Im1haW4iLFpiOiJtYXJxdWVlIiwkYjoibWF0aCIsYWM6Im1lbnUiLGJjOiJtZW51YmFyIixjYzoibWVudWl0ZW0iLGRjOiJtZW51aXRlbWNoZWNrYm94IixlYzoibWVudWl0ZW1yYWRpbyIsbWM6Im5hdmlnYXRpb24iLG5jOiJub3RlIixvYzoib3B0aW9uIiwKc2M6InByZXNlbnRhdGlvbiIsdWM6InByb2dyZXNzYmFyIix2YzoicmFkaW8iLHdjOiJyYWRpb2dyb3VwIix5YzoicmVnaW9uIixCYzoicm93IixDYzoicm93Z3JvdXAiLERjOiJyb3doZWFkZXIiLEZjOiJzY3JvbGxiYXIiLEdjOiJzZWFyY2giLEljOiJzZXBhcmF0b3IiLEtjOiJzbGlkZXIiLE1jOiJzcGluYnV0dG9uIixOYzoic3RhdHVzIixPYzoidGFiIixQYzoidGFibGlzdCIsUWM6InRhYnBhbmVsIixSYzoidGV4dGJveCIsU2M6InRleHRpbmZvIixUYzoidGltZXIiLFVjOiJ0b29sYmFyIixWYzoidG9vbHRpcCIsV2M6InRyZWUiLFhjOiJ0cmVlZ3JpZCIsWWM6InRyZWVpdGVtIn07dmFyIHdhPWZ1bmN0aW9uKGEpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsd2EpO2Vsc2V7dmFyIGI9RXJyb3IoKS5zdGFjaztiJiYodGhpcy5zdGFjaz1iKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSl9O24od2EsRXJyb3IpO3dhLnByb3RvdHlwZS5uYW1lPSJDdXN0b21FcnJvciI7dmFyIHhhO3ZhciB5YT1mdW5jdGlvbihhLGIpe2E9YS5zcGxpdCgiJXMiKTtmb3IodmFyIGM9IiIsZD1hLmxlbmd0aC0xLGU9MDtlPGQ7ZSsrKWMrPWFbZV0rKGU8Yi5sZW5ndGg/YltlXToiJXMiKTt3YS5jYWxsKHRoaXMsYythW2RdKX07bih5YSx3YSk7eWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjsKdmFyIHphPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSJBc3NlcnRpb24gZmFpbGVkIjtpZihjKXtlKz0iOiAiK2M7dmFyIGY9ZH1lbHNlIGEmJihlKz0iOiAiK2EsZj1iKTt0aHJvdyBuZXcgeWEoIiIrZSxmfHxbXSk7fSxxPWZ1bmN0aW9uKGEsYixjKXthfHx6YSgiIixudWxsLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX0sQWE9ZnVuY3Rpb24oYSxiLGMpe20oYSkmJjE9PWEubm9kZVR5cGV8fHphKCJFeHBlY3RlZCBFbGVtZW50IGJ1dCBnb3QgJXM6ICVzLiIsW2VhKGEpLGFdLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKX0sQ2E9ZnVuY3Rpb24oYSxiLGMsZCl7YSBpbnN0YW5jZW9mIGJ8fHphKCJFeHBlY3RlZCBpbnN0YW5jZW9mICVzIGJ1dCBnb3QgJXMuIixbQmEoYiksQmEoYSldLGMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpKX0sQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZgpGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTpudWxsPT09YT8ibnVsbCI6dHlwZW9mIGF9O3ZhciBEYT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3EobnVsbCE9YS5sZW5ndGgpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKCJzdHJpbmciPT09dHlwZW9mIGEpcmV0dXJuInN0cmluZyIhPT10eXBlb2YgYnx8MSE9Yi5sZW5ndGg/LTE6YS5pbmRleE9mKGIsMCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspaWYoYyBpbiBhJiZhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX0scj1BcnJheS5wcm90b3R5cGUuZm9yRWFjaD9mdW5jdGlvbihhLGIsYyl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsYyl9OmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9YS5sZW5ndGgsZT0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZj0wO2Y8ZDtmKyspZiBpbiBlJiZiLmNhbGwoYyxlW2ZdLGYsYSl9LEVhPUFycmF5LnByb3RvdHlwZS5maWx0ZXI/CmZ1bmN0aW9uKGEsYil7cShudWxsIT1hLmxlbmd0aCk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD1bXSxlPTAsZj0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZz0wO2c8YztnKyspaWYoZyBpbiBmKXt2YXIgaz1mW2ddO2IuY2FsbCh2b2lkIDAsayxnLGEpJiYoZFtlKytdPWspfXJldHVybiBkfSxGYT1BcnJheS5wcm90b3R5cGUuZXZlcnk/ZnVuY3Rpb24oYSxiKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmV2ZXJ5LmNhbGwoYSxiLHZvaWQgMCl9OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWEubGVuZ3RoLGQ9InN0cmluZyI9PT10eXBlb2YgYT9hLnNwbGl0KCIiKTphLGU9MDtlPGM7ZSsrKWlmKGUgaW4gZCYmIWIuY2FsbCh2b2lkIDAsZFtlXSxlLGEpKXJldHVybiExO3JldHVybiEwfSxHYT1mdW5jdGlvbihhLGIpe3JldHVybiAwPD0KRGEoYSxiKX0sSGE9ZnVuY3Rpb24oYSxiKXtiPURhKGEsYik7dmFyIGM7aWYoYz0wPD1iKXEobnVsbCE9YS5sZW5ndGgpLEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhLGIsMSk7cmV0dXJuIGN9LElhPWZ1bmN0aW9uKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGFyZ3VtZW50cyl9LEphPWZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDA8Yil7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX0sTGE9ZnVuY3Rpb24oYSxiLGMsZCl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShhLEthKGFyZ3VtZW50cywxKSl9LEthPWZ1bmN0aW9uKGEsYixjKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gMj49YXJndW1lbnRzLmxlbmd0aD9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsYixjKX07dmFyIE1hPVN0cmluZy5wcm90b3R5cGUudHJpbT9mdW5jdGlvbihhKXtyZXR1cm4gYS50cmltKCl9OmZ1bmN0aW9uKGEpe3JldHVybi9eW1xzXHhhMF0qKFtcc1xTXSo/KVtcc1x4YTBdKiQvLmV4ZWMoYSlbMV19LE5hPS8mL2csT2E9LzwvZyxQYT0vPi9nLFFhPS8iL2csUmE9LycvZyxTYT0vXHgwMC9nLFRhPS9bXHgwMCY8PiInXS8sdD1mdW5jdGlvbihhLGIpe3JldHVybi0xIT1hLmluZGV4T2YoYil9LFVhPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE8Yj8tMTphPmI/MTowfTt2YXIgdTthOnt2YXIgVmE9bC5uYXZpZ2F0b3I7aWYoVmEpe3ZhciBXYT1WYS51c2VyQWdlbnQ7aWYoV2Epe3U9V2E7YnJlYWsgYX19dT0iIn07LyoKCiBDb3B5cmlnaHQgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzLgogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKKi8KdmFyIFhhPWZ1bmN0aW9uKGEpe1RhLnRlc3QoYSkmJigtMSE9YS5pbmRleE9mKCImIikmJihhPWEucmVwbGFjZShOYSwiJmFtcDsiKSksLTEhPWEuaW5kZXhPZigiPCIpJiYoYT1hLnJlcGxhY2UoT2EsIiZsdDsiKSksLTEhPWEuaW5kZXhPZigiPiIpJiYoYT1hLnJlcGxhY2UoUGEsIiZndDsiKSksLTEhPWEuaW5kZXhPZignIicpJiYoYT1hLnJlcGxhY2UoUWEsIiZxdW90OyIpKSwtMSE9YS5pbmRleE9mKCInIikmJihhPWEucmVwbGFjZShSYSwiJiMzOTsiKSksLTEhPWEuaW5kZXhPZigiXHgwMCIpJiYoYT1hLnJlcGxhY2UoU2EsIiYjMDsiKSkpO3JldHVybiBhfTt2YXIgWWE9ZnVuY3Rpb24oYSl7WWFbIiAiXShhKTtyZXR1cm4gYX07WWFbIiAiXT1jYTt2YXIgJGE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1aYTtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsYSk/Y1thXTpjW2FdPWIoYSl9O3ZhciBhYj10KHUsIk9wZXJhIiksdj10KHUsIlRyaWRlbnQiKXx8dCh1LCJNU0lFIiksYmI9dCh1LCJFZGdlIikseD10KHUsIkdlY2tvIikmJiEodCh1LnRvTG93ZXJDYXNlKCksIndlYmtpdCIpJiYhdCh1LCJFZGdlIikpJiYhKHQodSwiVHJpZGVudCIpfHx0KHUsIk1TSUUiKSkmJiF0KHUsIkVkZ2UiKSx5PXQodS50b0xvd2VyQ2FzZSgpLCJ3ZWJraXQiKSYmIXQodSwiRWRnZSIpLHo9dCh1LCJNYWNpbnRvc2giKSxjYj1mdW5jdGlvbigpe3ZhciBhPWwuZG9jdW1lbnQ7cmV0dXJuIGE/YS5kb2N1bWVudE1vZGU6dm9pZCAwfSxkYjsKYTp7dmFyIGViPSIiLGZiPWZ1bmN0aW9uKCl7dmFyIGE9dTtpZih4KXJldHVybi9ydjooW15cKTtdKykoXCl8OykvLmV4ZWMoYSk7aWYoYmIpcmV0dXJuL0VkZ2VcLyhbXGRcLl0rKS8uZXhlYyhhKTtpZih2KXJldHVybi9cYig/Ok1TSUV8cnYpWzogXShbXlwpO10rKShcKXw7KS8uZXhlYyhhKTtpZih5KXJldHVybi9XZWJLaXRcLyhcUyspLy5leGVjKGEpO2lmKGFiKXJldHVybi8oPzpWZXJzaW9uKVsgXC9dPyhcUyspLy5leGVjKGEpfSgpO2ZiJiYoZWI9ZmI/ZmJbMV06IiIpO2lmKHYpe3ZhciBnYj1jYigpO2lmKG51bGwhPWdiJiZnYj5wYXJzZUZsb2F0KGViKSl7ZGI9U3RyaW5nKGdiKTticmVhayBhfX1kYj1lYn0KdmFyIGhiPWRiLFphPXt9LEE9ZnVuY3Rpb24oYSl7cmV0dXJuICRhKGEsZnVuY3Rpb24oKXtmb3IodmFyIGI9MCxjPU1hKFN0cmluZyhoYikpLnNwbGl0KCIuIiksZD1NYShTdHJpbmcoYSkpLnNwbGl0KCIuIiksZT1NYXRoLm1heChjLmxlbmd0aCxkLmxlbmd0aCksZj0wOzA9PWImJmY8ZTtmKyspe3ZhciBnPWNbZl18fCIiLGs9ZFtmXXx8IiI7ZG97Zz0vKFxkKikoXEQqKSguKikvLmV4ZWMoZyl8fFsiIiwiIiwiIiwiIl07az0vKFxkKikoXEQqKSguKikvLmV4ZWMoayl8fFsiIiwiIiwiIiwiIl07aWYoMD09Z1swXS5sZW5ndGgmJjA9PWtbMF0ubGVuZ3RoKWJyZWFrO2I9VWEoMD09Z1sxXS5sZW5ndGg/MDpwYXJzZUludChnWzFdLDEwKSwwPT1rWzFdLmxlbmd0aD8wOnBhcnNlSW50KGtbMV0sMTApKXx8VWEoMD09Z1syXS5sZW5ndGgsMD09a1syXS5sZW5ndGgpfHxVYShnWzJdLGtbMl0pO2c9Z1szXTtrPWtbM119d2hpbGUoMD09Yil9cmV0dXJuIDA8PWJ9KX0saWI7CmliPWwuZG9jdW1lbnQmJnY/Y2IoKTp2b2lkIDA7dmFyIGpiPSF2fHw5PD1OdW1iZXIoaWIpO3ZhciBsYj1mdW5jdGlvbihhLGIpe29hKGIsZnVuY3Rpb24oYyxkKXtjJiYib2JqZWN0Ij09dHlwZW9mIGMmJmMuZGQmJihjPWMuY2QoKSk7InN0eWxlIj09ZD9hLnN0eWxlLmNzc1RleHQ9YzoiY2xhc3MiPT1kP2EuY2xhc3NOYW1lPWM6ImZvciI9PWQ/YS5odG1sRm9yPWM6a2IuaGFzT3duUHJvcGVydHkoZCk/YS5zZXRBdHRyaWJ1dGUoa2JbZF0sYyk6MD09ZC5sYXN0SW5kZXhPZigiYXJpYS0iLDApfHwwPT1kLmxhc3RJbmRleE9mKCJkYXRhLSIsMCk/YS5zZXRBdHRyaWJ1dGUoZCxjKTphW2RdPWN9KX0sa2I9e2NlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjb2xzcGFuOiJjb2xTcGFuIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGhlaWdodDoiaGVpZ2h0IixtYXhsZW5ndGg6Im1heExlbmd0aCIsbm9uY2U6Im5vbmNlIixyb2xlOiJyb2xlIixyb3dzcGFuOiJyb3dTcGFuIix0eXBlOiJ0eXBlIix1c2VtYXA6InVzZU1hcCIsdmFsaWduOiJ2QWxpZ24iLAp3aWR0aDoid2lkdGgifSxtYj1mdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChrKXtrJiZiLmFwcGVuZENoaWxkKCJzdHJpbmciPT09dHlwZW9mIGs/YS5jcmVhdGVUZXh0Tm9kZShrKTprKX1mb3IodmFyIGU9MjtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXTtpZighaGEoZil8fG0oZikmJjA8Zi5ub2RlVHlwZSlkKGYpO2Vsc2V7YTp7aWYoZiYmIm51bWJlciI9PXR5cGVvZiBmLmxlbmd0aCl7aWYobShmKSl7dmFyIGc9ImZ1bmN0aW9uIj09dHlwZW9mIGYuaXRlbXx8InN0cmluZyI9PXR5cGVvZiBmLml0ZW07YnJlYWsgYX1pZihpYShmKSl7Zz0iZnVuY3Rpb24iPT10eXBlb2YgZi5pdGVtO2JyZWFrIGF9fWc9ITF9cihnP0phKGYpOmYsZCl9fX0sbmI9ZnVuY3Rpb24oYSxiKXtiPVN0cmluZyhiKTsiYXBwbGljYXRpb24veGh0bWwreG1sIj09PWEuY29udGVudFR5cGUmJihiPWIudG9Mb3dlckNhc2UoKSk7cmV0dXJuIGEuY3JlYXRlRWxlbWVudChiKX0sb2I9ZnVuY3Rpb24oYSl7YSYmCmEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpfSxwYj1mdW5jdGlvbihhLGIpe2lmKCFhfHwhYilyZXR1cm4hMTtpZihhLmNvbnRhaW5zJiYxPT1iLm5vZGVUeXBlKXJldHVybiBhPT1ifHxhLmNvbnRhaW5zKGIpO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbilyZXR1cm4gYT09Ynx8ISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNik7Zm9yKDtiJiZhIT1iOyliPWIucGFyZW50Tm9kZTtyZXR1cm4gYj09YX0scWI9ZnVuY3Rpb24oYSl7cShhLCJOb2RlIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4iKTtyZXR1cm4gOT09YS5ub2RlVHlwZT9hOmEub3duZXJEb2N1bWVudHx8YS5kb2N1bWVudH0scmI9ZnVuY3Rpb24oYSxiKXtiP2EudGFiSW5kZXg9MDooYS50YWJJbmRleD0tMSxhLnJlbW92ZUF0dHJpYnV0ZSgidGFiSW5kZXgiKSl9LHNiPWZ1bmN0aW9uKGEpe3JldHVybiB2JiYhQSgiOSIpPyhhPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKSwKbnVsbCE9YSYmYS5zcGVjaWZpZWQpOmEuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpfSx0Yj1mdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgYSYmMDw9YSYmMzI3Njg+YX0sdWI9ZnVuY3Rpb24oYSl7dGhpcy5hPWF8fGwuZG9jdW1lbnR8fGRvY3VtZW50fTt1Yi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBhP3RoaXMuYS5nZXRFbGVtZW50QnlJZChhKTphfTsKdWIucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuYSxlPWFyZ3VtZW50cyxmPVN0cmluZyhlWzBdKSxnPWVbMV07aWYoIWpiJiZnJiYoZy5uYW1lfHxnLnR5cGUpKXtmPVsiPCIsZl07Zy5uYW1lJiZmLnB1c2goJyBuYW1lPSInLFhhKGcubmFtZSksJyInKTtpZihnLnR5cGUpe2YucHVzaCgnIHR5cGU9IicsWGEoZy50eXBlKSwnIicpO3ZhciBrPXt9O3VhKGssZyk7ZGVsZXRlIGsudHlwZTtnPWt9Zi5wdXNoKCI+Iik7Zj1mLmpvaW4oIiIpfWY9bmIoZCxmKTtnJiYoInN0cmluZyI9PT10eXBlb2YgZz9mLmNsYXNzTmFtZT1nOmZhKGcpP2YuY2xhc3NOYW1lPWcuam9pbigiICIpOmxiKGYsZykpOzI8ZS5sZW5ndGgmJm1iKGQsZixlKTtyZXR1cm4gZn07dmFyIHZiPWZ1bmN0aW9uKGEsYil7Yj8ocShwYSh2YSxiKSwiTm8gc3VjaCBBUklBIHJvbGUgIitiKSxhLnNldEF0dHJpYnV0ZSgicm9sZSIsYikpOmEucmVtb3ZlQXR0cmlidXRlKCJyb2xlIil9LHhiPWZ1bmN0aW9uKGEsYixjKXtmYShjKSYmKGM9Yy5qb2luKCIgIikpO3ZhciBkPXdiKGIpOyIiPT09Y3x8dm9pZCAwPT1jPyhtYXx8KG1hPXthdG9taWM6ITEsYXV0b2NvbXBsZXRlOiJub25lIixkcm9wZWZmZWN0OiJub25lIixoYXNwb3B1cDohMSxsaXZlOiJvZmYiLG11bHRpbGluZTohMSxtdWx0aXNlbGVjdGFibGU6ITEsb3JpZW50YXRpb246InZlcnRpY2FsIixyZWFkb25seTohMSxyZWxldmFudDoiYWRkaXRpb25zIHRleHQiLHJlcXVpcmVkOiExLHNvcnQ6Im5vbmUiLGJ1c3k6ITEsZGlzYWJsZWQ6ITEsaGlkZGVuOiExLGludmFsaWQ6ImZhbHNlIn0pLGM9bWEsYiBpbiBjP2Euc2V0QXR0cmlidXRlKGQsY1tiXSk6YS5yZW1vdmVBdHRyaWJ1dGUoZCkpOmEuc2V0QXR0cmlidXRlKGQsCmMpfSx3Yj1mdW5jdGlvbihhKXtxKGEsIkFSSUEgYXR0cmlidXRlIGNhbm5vdCBiZSBlbXB0eS4iKTtxKHBhKG5hLGEpLCJObyBzdWNoIEFSSUEgYXR0cmlidXRlICIrYSk7cmV0dXJuImFyaWEtIithfTt2YXIgeWI9T2JqZWN0LmZyZWV6ZXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O3ZhciBDPWZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVTt0aGlzLko9dGhpcy5KfTtDLnByb3RvdHlwZS5VPSExO0MucHJvdG90eXBlLk49ZnVuY3Rpb24oKXt0aGlzLlV8fCh0aGlzLlU9ITAsdGhpcy51KCkpfTt2YXIgemI9ZnVuY3Rpb24oYSxiKXthLlU/YigpOihhLkp8fChhLko9W10pLGEuSi5wdXNoKGIpKX07Qy5wcm90b3R5cGUudT1mdW5jdGlvbigpe2lmKHRoaXMuSilmb3IoO3RoaXMuSi5sZW5ndGg7KXRoaXMuSi5zaGlmdCgpKCl9O3ZhciBBYj1mdW5jdGlvbihhKXthJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5OJiZhLk4oKX07dmFyIEJiPWZ1bmN0aW9uKGEpe3JldHVybiJzdHJpbmciPT10eXBlb2YgYS5jbGFzc05hbWU/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sRD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6QmIoYSkubWF0Y2goL1xTKy9nKXx8W119LENiPWZ1bmN0aW9uKGEsYil7InN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZT9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxEYj1mdW5jdGlvbihhLGIpe3JldHVybiBhLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5jb250YWlucyhiKTpHYShEKGEpLGIpfSxFYj1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFEYihhLGIpKXt2YXIgYz1CYihhKTtDYihhLGMrKDA8Yy5sZW5ndGg/IiAiK2I6YikpfX0sRmI9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClyKGIsCmZ1bmN0aW9uKGUpe0ViKGEsZSl9KTtlbHNle3ZhciBjPXt9O3IoRChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7cihiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPTA8Yi5sZW5ndGg/IiAiK2Q6ZDtDYihhLGIpfX0sR2I9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6RGIoYSxiKSYmQ2IoYSxFYShEKGEpLGZ1bmN0aW9uKGMpe3JldHVybiBjIT1ifSkuam9pbigiICIpKX0sSGI9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9yKGIsZnVuY3Rpb24oYyl7R2IoYSxjKX0pOkNiKGEsRWEoRChhKSxmdW5jdGlvbihjKXtyZXR1cm4hR2EoYixjKX0pLmpvaW4oIiAiKSl9O3ZhciBJYj0hdnx8OTw9TnVtYmVyKGliKSxKYj0hdnx8OTw9TnVtYmVyKGliKSxLYj12JiYhQSgiOSIpLExiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e2wuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsY2EsYiksbC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjYSxiKX1jYXRjaChjKXt9cmV0dXJuIGF9KCk7dmFyIEU9ZnVuY3Rpb24oYSxiKXt0aGlzLnR5cGU9YTt0aGlzLmE9dGhpcy50YXJnZXQ9Yjt0aGlzLmg9ITE7dGhpcy5LYT0hMH07RS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuaD0hMH07RS5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3RoaXMuS2E9ITF9O3ZhciBGPXtMOiJtb3VzZWRvd24iLE06Im1vdXNldXAiLGFhOiJtb3VzZWNhbmNlbCIsaGM6Im1vdXNlbW92ZSIsamM6Im1vdXNlb3ZlciIsaWM6Im1vdXNlb3V0IixmYzoibW91c2VlbnRlciIsZ2M6Im1vdXNlbGVhdmUifTt2YXIgRz1mdW5jdGlvbihhLGIpe0UuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy5hPXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5jPTA7dGhpcy5BPXRoaXMubWV0YUtleT10aGlzLnNoaWZ0S2V5PXRoaXMuYWx0S2V5PXRoaXMuY3RybEtleT0hMTt0aGlzLnBvaW50ZXJJZD0wO3RoaXMucG9pbnRlclR5cGU9IiI7dGhpcy5iPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMuYT1iO2lmKGI9YS5yZWxhdGVkVGFyZ2V0KXtpZih4KXthOnt0cnl7WWEoYi5ub2RlTmFtZSk7dmFyIGU9ITA7YnJlYWsgYX1jYXRjaChmKXt9ZT0KITF9ZXx8KGI9bnVsbCl9fWVsc2UibW91c2VvdmVyIj09Yz9iPWEuZnJvbUVsZW1lbnQ6Im1vdXNlb3V0Ij09YyYmKGI9YS50b0VsZW1lbnQpO3RoaXMucmVsYXRlZFRhcmdldD1iO2Q/KHRoaXMuY2xpZW50WD12b2lkIDAhPT1kLmNsaWVudFg/ZC5jbGllbnRYOmQucGFnZVgsdGhpcy5jbGllbnRZPXZvaWQgMCE9PWQuY2xpZW50WT9kLmNsaWVudFk6ZC5wYWdlWSx0aGlzLnNjcmVlblg9ZC5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1kLnNjcmVlbll8fDApOih0aGlzLmNsaWVudFg9dm9pZCAwIT09YS5jbGllbnRYP2EuY2xpZW50WDphLnBhZ2VYLHRoaXMuY2xpZW50WT12b2lkIDAhPT1hLmNsaWVudFk/YS5jbGllbnRZOmEucGFnZVksdGhpcy5zY3JlZW5YPWEuc2NyZWVuWHx8MCx0aGlzLnNjcmVlblk9YS5zY3JlZW5ZfHwwKTt0aGlzLmJ1dHRvbj1hLmJ1dHRvbjt0aGlzLmM9YS5rZXlDb2RlfHwwO3RoaXMua2V5PWEua2V5fHwiIjt0aGlzLmN0cmxLZXk9YS5jdHJsS2V5O3RoaXMuYWx0S2V5PQphLmFsdEtleTt0aGlzLnNoaWZ0S2V5PWEuc2hpZnRLZXk7dGhpcy5tZXRhS2V5PWEubWV0YUtleTt0aGlzLkE9ej9hLm1ldGFLZXk6YS5jdHJsS2V5O3RoaXMucG9pbnRlcklkPWEucG9pbnRlcklkfHwwO3RoaXMucG9pbnRlclR5cGU9InN0cmluZyI9PT10eXBlb2YgYS5wb2ludGVyVHlwZT9hLnBvaW50ZXJUeXBlOk1iW2EucG9pbnRlclR5cGVdfHwiIjt0aGlzLmI9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnRoaXMuZygpfX07bihHLEUpO3ZhciBOYj15YihbMSw0LDJdKSxNYj15Yih7MjoidG91Y2giLDM6InBlbiIsNDoibW91c2UifSksT2I9ZnVuY3Rpb24oYSl7cmV0dXJuIEliPzA9PWEuYi5idXR0b246ImNsaWNrIj09YS50eXBlPyEwOiEhKGEuYi5idXR0b24mTmJbMF0pfTtHLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7Ry5pLmouY2FsbCh0aGlzKTt0aGlzLmIuc3RvcFByb3BhZ2F0aW9uP3RoaXMuYi5zdG9wUHJvcGFnYXRpb24oKTp0aGlzLmIuY2FuY2VsQnViYmxlPSEwfTsKRy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe0cuaS5nLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5iO2lmKGEucHJldmVudERlZmF1bHQpYS5wcmV2ZW50RGVmYXVsdCgpO2Vsc2UgaWYoYS5yZXR1cm5WYWx1ZT0hMSxLYil0cnl7aWYoYS5jdHJsS2V5fHwxMTI8PWEua2V5Q29kZSYmMTIzPj1hLmtleUNvZGUpYS5rZXlDb2RlPS0xfWNhdGNoKGIpe319O3ZhciBQYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKDFFNipNYXRoLnJhbmRvbSgpfDApLFFiPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW1BiXSl9LFJiPTA7dmFyIFNiPWZ1bmN0aW9uKGEsYixjLGQsZSl7dGhpcy5saXN0ZW5lcj1hO3RoaXMuYT1udWxsO3RoaXMuc3JjPWI7dGhpcy50eXBlPWM7dGhpcy5jYXB0dXJlPSEhZDt0aGlzLm1hPWU7dGhpcy5rZXk9KytSYjt0aGlzLlg9dGhpcy5oYT0hMX0sVGI9ZnVuY3Rpb24oYSl7YS5YPSEwO2EubGlzdGVuZXI9bnVsbDthLmE9bnVsbDthLnNyYz1udWxsO2EubWE9bnVsbH07dmFyIFViPWZ1bmN0aW9uKGEpe3RoaXMuc3JjPWE7dGhpcy5hPXt9O3RoaXMuYj0wfTtVYi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS50b1N0cmluZygpO2E9dGhpcy5hW2ZdO2F8fChhPXRoaXMuYVtmXT1bXSx0aGlzLmIrKyk7dmFyIGc9VmIoYSxiLGQsZSk7LTE8Zz8oYj1hW2ddLGN8fChiLmhhPSExKSk6KGI9bmV3IFNiKGIsdGhpcy5zcmMsZiwhIWQsZSksYi5oYT1jLGEucHVzaChiKSk7cmV0dXJuIGJ9Owp2YXIgV2I9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLnR5cGU7YyBpbiBhLmEmJkhhKGEuYVtjXSxiKSYmKFRiKGIpLDA9PWEuYVtjXS5sZW5ndGgmJihkZWxldGUgYS5hW2NdLGEuYi0tKSl9LFhiPWZ1bmN0aW9uKGEsYixjLGQsZSl7YT1hLmFbYi50b1N0cmluZygpXTtiPS0xO2EmJihiPVZiKGEsYyxkLGUpKTtyZXR1cm4tMTxiP2FbYl06bnVsbH0sVmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuWCYmZi5saXN0ZW5lcj09YiYmZi5jYXB0dXJlPT0hIWMmJmYubWE9PWQpcmV0dXJuIGV9cmV0dXJuLTF9O3ZhciBZYj0iY2xvc3VyZV9sbV8iKygxRTYqTWF0aC5yYW5kb20oKXwwKSxaYj17fSwkYj0wLGJjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZCYmZC5vbmNlKXJldHVybiBhYyhhLGIsYyxkLGUpO2lmKGZhKGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyliYyhhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9Y2MoYyk7cmV0dXJuIFFiKGEpP2RjKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOmVjKGEsYixjLCExLGQsZSl9LGVjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGc9bShlKT8hIWUuY2FwdHVyZTohIWUsaz1mYyhhKTtrfHwoYVtZYl09az1uZXcgVWIoYSkpO2M9ay5hZGQoYixjLGQsZyxmKTtpZihjLmEpcmV0dXJuIGM7ZD1nYygpO2MuYT1kO2Quc3JjPWE7ZC5saXN0ZW5lcj1jO2lmKGEuYWRkRXZlbnRMaXN0ZW5lcilMYnx8KGU9Zyksdm9pZCAwPT09ZSYmKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksCmQsZSk7ZWxzZSBpZihhLmF0dGFjaEV2ZW50KWEuYXR0YWNoRXZlbnQoaGMoYi50b1N0cmluZygpKSxkKTtlbHNlIGlmKGEuYWRkTGlzdGVuZXImJmEucmVtb3ZlTGlzdGVuZXIpcSgiY2hhbmdlIj09PWIsIk1lZGlhUXVlcnlMaXN0IG9ubHkgaGFzIGEgY2hhbmdlIGV2ZW50IiksYS5hZGRMaXN0ZW5lcihkKTtlbHNlIHRocm93IEVycm9yKCJhZGRFdmVudExpc3RlbmVyIGFuZCBhdHRhY2hFdmVudCBhcmUgdW5hdmFpbGFibGUuIik7JGIrKztyZXR1cm4gY30sZ2M9ZnVuY3Rpb24oKXt2YXIgYT1pYyxiPUpiP2Z1bmN0aW9uKGMpe3JldHVybiBhLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKX06ZnVuY3Rpb24oYyl7Yz1hLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKTtpZighYylyZXR1cm4gY307cmV0dXJuIGJ9LGFjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZmEoYikpe2Zvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWFjKGEsYltmXSxjLGQsZSk7cmV0dXJuIG51bGx9Yz1jYyhjKTtyZXR1cm4gUWIoYSk/CmEuaC5hZGQoU3RyaW5nKGIpLGMsITAsbShkKT8hIWQuY2FwdHVyZTohIWQsZSk6ZWMoYSxiLGMsITAsZCxlKX0samM9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihmYShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylqYyhhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPWNjKGMpLFFiKGEpPyhhPWEuaCxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5hJiYoZj1hLmFbYl0sYz1WYihmLGMsZCxlKSwtMTxjJiYoVGIoZltjXSkscShudWxsIT1mLmxlbmd0aCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSwwPT1mLmxlbmd0aCYmKGRlbGV0ZSBhLmFbYl0sYS5iLS0pKSkpOmEmJihhPWZjKGEpKSYmKGM9WGIoYSxiLGMsZCxlKSkmJmtjKGMpfSxrYz1mdW5jdGlvbihhKXtpZigibnVtYmVyIiE9PXR5cGVvZiBhJiZhJiYhYS5YKXt2YXIgYj1hLnNyYztpZihRYihiKSlXYihiLmgsYSk7ZWxzZXt2YXIgYz1hLnR5cGUsZD1hLmE7Yi5yZW1vdmVFdmVudExpc3RlbmVyPwpiLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KGhjKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7JGItLTsoYz1mYyhiKSk/KFdiKGMsYSksMD09Yy5iJiYoYy5zcmM9bnVsbCxiW1liXT1udWxsKSk6VGIoYSl9fX0saGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gWmI/WmJbYV06WmJbYV09Im9uIithfSxtYz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMDtpZihhPWZjKGEpKWlmKGI9YS5hW2IudG9TdHJpbmcoKV0pZm9yKGI9Yi5jb25jYXQoKSxhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBmPWJbYV07ZiYmZi5jYXB0dXJlPT1jJiYhZi5YJiYoZj1sYyhmLGQpLGU9ZSYmITEhPT1mKX1yZXR1cm4gZX0sbGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5tYXx8YS5zcmM7YS5oYSYma2MoYSk7cmV0dXJuIGMuY2FsbChkLGIpfSxpYz1mdW5jdGlvbihhLApiKXtpZihhLlgpcmV0dXJuITA7aWYoIUpiKXtpZighYilhOntiPVsid2luZG93IiwiZXZlbnQiXTtmb3IodmFyIGM9bCxkPTA7ZDxiLmxlbmd0aDtkKyspaWYoYz1jW2JbZF1dLG51bGw9PWMpe2I9bnVsbDticmVhayBhfWI9Y31kPWI7Yj1uZXcgRyhkLHRoaXMpO2M9ITA7aWYoISgwPmQua2V5Q29kZXx8dm9pZCAwIT1kLnJldHVyblZhbHVlKSl7YTp7dmFyIGU9ITE7aWYoMD09ZC5rZXlDb2RlKXRyeXtkLmtleUNvZGU9LTE7YnJlYWsgYX1jYXRjaChnKXtlPSEwfWlmKGV8fHZvaWQgMD09ZC5yZXR1cm5WYWx1ZSlkLnJldHVyblZhbHVlPSEwfWQ9W107Zm9yKGU9Yi5hO2U7ZT1lLnBhcmVudE5vZGUpZC5wdXNoKGUpO2E9YS50eXBlO2ZvcihlPWQubGVuZ3RoLTE7IWIuaCYmMDw9ZTtlLS0pe2IuYT1kW2VdO3ZhciBmPW1jKGRbZV0sYSwhMCxiKTtjPWMmJmZ9Zm9yKGU9MDshYi5oJiZlPGQubGVuZ3RoO2UrKyliLmE9ZFtlXSxmPW1jKGRbZV0sYSwhMSxiKSxjPWMmJmZ9cmV0dXJuIGN9cmV0dXJuIGxjKGEsCm5ldyBHKGIsdGhpcykpfSxmYz1mdW5jdGlvbihhKXthPWFbWWJdO3JldHVybiBhIGluc3RhbmNlb2YgVWI/YTpudWxsfSxuYz0iX19jbG9zdXJlX2V2ZW50c19mbl8iKygxRTkqTWF0aC5yYW5kb20oKT4+PjApLGNjPWZ1bmN0aW9uKGEpe3EoYSwiTGlzdGVuZXIgY2FuIG5vdCBiZSBudWxsLiIpO2lmKGlhKGEpKXJldHVybiBhO3EoYS5oYW5kbGVFdmVudCwiQW4gb2JqZWN0IGxpc3RlbmVyIG11c3QgaGF2ZSBoYW5kbGVFdmVudCBtZXRob2QuIik7YVtuY118fChhW25jXT1mdW5jdGlvbihiKXtyZXR1cm4gYS5oYW5kbGVFdmVudChiKX0pO3JldHVybiBhW25jXX07dmFyIG9jPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9e319O24ob2MsQyk7CnZhciBwYz1bXSxIPWZ1bmN0aW9uKGEsYixjLGQpe2ZhKGMpfHwoYyYmKHBjWzBdPWMudG9TdHJpbmcoKSksYz1wYyk7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWJjKGIsY1tlXSxkfHxhLmhhbmRsZUV2ZW50LCExLGEuYnx8YSk7aWYoIWYpYnJlYWs7YS5hW2Yua2V5XT1mfXJldHVybiBhfSxxYz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoZmEoYykpZm9yKHZhciBnPTA7ZzxjLmxlbmd0aDtnKyspcWMoYSxiLGNbZ10sZCxlLGYpO2Vsc2UgZD1kfHxhLmhhbmRsZUV2ZW50LGU9bShlKT8hIWUuY2FwdHVyZTohIWUsZj1mfHxhLmJ8fGEsZD1jYyhkKSxlPSEhZSxjPVFiKGIpP1hiKGIuaCxTdHJpbmcoYyksZCxlLGYpOmI/KGI9ZmMoYikpP1hiKGIsYyxkLGUsZik6bnVsbDpudWxsLGMmJihrYyhjKSxkZWxldGUgYS5hW2Mua2V5XSk7cmV0dXJuIGF9LHJjPWZ1bmN0aW9uKGEpe29hKGEuYSxmdW5jdGlvbihiLGMpe3RoaXMuYS5oYXNPd25Qcm9wZXJ0eShjKSYma2MoYil9LAphKTthLmE9e319O29jLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7b2MuaS51LmNhbGwodGhpcyk7cmModGhpcyl9O29jLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJFdmVudEhhbmRsZXIuaGFuZGxlRXZlbnQgbm90IGltcGxlbWVudGVkIik7fTt2YXIgST1mdW5jdGlvbigpe0MuY2FsbCh0aGlzKTt0aGlzLmg9bmV3IFViKHRoaXMpO3RoaXMuTWE9dGhpczt0aGlzLnBhPW51bGx9O24oSSxDKTtJLnByb3RvdHlwZVtQYl09ITA7SS5wcm90b3R5cGUucmE9ZnVuY3Rpb24oYSl7dGhpcy5wYT1hfTtJLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjLGQpe2pjKHRoaXMsYSxiLGMsZCl9Owp2YXIgdWM9ZnVuY3Rpb24oYSxiKXtzYyhhKTt2YXIgYz1hLnBhO2lmKGMpe3ZhciBkPVtdO2Zvcih2YXIgZT0xO2M7Yz1jLnBhKWQucHVzaChjKSxxKDFFMz4rK2UsImluZmluaXRlIGxvb3AiKX1hPWEuTWE7Yz1iLnR5cGV8fGI7InN0cmluZyI9PT10eXBlb2YgYj9iPW5ldyBFKGIsYSk6YiBpbnN0YW5jZW9mIEU/Yi50YXJnZXQ9Yi50YXJnZXR8fGE6KGU9YixiPW5ldyBFKGMsYSksdWEoYixlKSk7ZT0hMDtpZihkKWZvcih2YXIgZj1kLmxlbmd0aC0xOyFiLmgmJjA8PWY7Zi0tKXt2YXIgZz1iLmE9ZFtmXTtlPXRjKGcsYywhMCxiKSYmZX1iLmh8fChnPWIuYT1hLGU9dGMoZyxjLCEwLGIpJiZlLGIuaHx8KGU9dGMoZyxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLmgmJmY8ZC5sZW5ndGg7ZisrKWc9Yi5hPWRbZl0sZT10YyhnLGMsITEsYikmJmU7cmV0dXJuIGV9OwpJLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7SS5pLnUuY2FsbCh0aGlzKTtpZih0aGlzLmgpe3ZhciBhPXRoaXMuaCxiPTAsYztmb3IoYyBpbiBhLmEpe2Zvcih2YXIgZD1hLmFbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixUYihkW2VdKTtkZWxldGUgYS5hW2NdO2EuYi0tfX10aGlzLnBhPW51bGx9O3ZhciBkYz1mdW5jdGlvbihhLGIsYyxkLGUpe3NjKGEpO3JldHVybiBhLmguYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LHRjPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5oLmFbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGc9YltmXTtpZihnJiYhZy5YJiZnLmNhcHR1cmU9PWMpe3ZhciBrPWcubGlzdGVuZXIscD1nLm1hfHxnLnNyYztnLmhhJiZXYihhLmgsZyk7ZT0hMSE9PWsuY2FsbChwLGQpJiZlfX1yZXR1cm4gZSYmMCE9ZC5LYX0sc2M9ZnVuY3Rpb24oYSl7cShhLmgsIkV2ZW50IHRhcmdldCBpcyBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgY2FsbCB0aGUgc3VwZXJjbGFzcyAoZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpIGNvbnN0cnVjdG9yPyIpfTt2YXIgeGM9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKHkmJiFBKCI1MjUiKSlyZXR1cm4hMDtpZih6JiZlKXJldHVybiB2YyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZigheCl7Im51bWJlciI9PT10eXBlb2YgYiYmKGI9d2MoYikpO3ZhciBnPTE3PT1ifHwxOD09Ynx8eiYmOTE9PWI7aWYoKCFjfHx6KSYmZ3x8eiYmMTY9PWImJihkfHxmKSlyZXR1cm4hMX1pZigoeXx8YmIpJiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1pZih2JiZkJiZiPT1hKXJldHVybiExO3N3aXRjaChhKXtjYXNlIDEzOnJldHVybiB4P2Z8fGU/ITE6IShjJiZkKTohMDtjYXNlIDI3OnJldHVybiEoeXx8YmJ8fHgpfXJldHVybiB4JiYoZHx8ZXx8Zik/ITE6dmMoYSl9LHZjPWZ1bmN0aW9uKGEpe2lmKDQ4PD1hJiY1Nz49YXx8Cjk2PD1hJiYxMDY+PWF8fDY1PD1hJiY5MD49YXx8KHl8fGJiKSYmMD09YSlyZXR1cm4hMDtzd2l0Y2goYSl7Y2FzZSAzMjpjYXNlIDQzOmNhc2UgNjM6Y2FzZSA2NDpjYXNlIDEwNzpjYXNlIDEwOTpjYXNlIDExMDpjYXNlIDExMTpjYXNlIDE4NjpjYXNlIDU5OmNhc2UgMTg5OmNhc2UgMTg3OmNhc2UgNjE6Y2FzZSAxODg6Y2FzZSAxOTA6Y2FzZSAxOTE6Y2FzZSAxOTI6Y2FzZSAyMjI6Y2FzZSAyMTk6Y2FzZSAyMjA6Y2FzZSAyMjE6Y2FzZSAxNjM6Y2FzZSA1ODpyZXR1cm4hMDtjYXNlIDE3MzpyZXR1cm4geDtkZWZhdWx0OnJldHVybiExfX0sd2M9ZnVuY3Rpb24oYSl7aWYoeClhPXljKGEpO2Vsc2UgaWYoeiYmeSlzd2l0Y2goYSl7Y2FzZSA5MzphPTkxfXJldHVybiBhfSx5Yz1mdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSA2MTpyZXR1cm4gMTg3O2Nhc2UgNTk6cmV0dXJuIDE4NjtjYXNlIDE3MzpyZXR1cm4gMTg5O2Nhc2UgMjI0OnJldHVybiA5MTtjYXNlIDA6cmV0dXJuIDIyNDsKZGVmYXVsdDpyZXR1cm4gYX19O3ZhciBKPWZ1bmN0aW9uKGEsYil7SS5jYWxsKHRoaXMpO2EmJnpjKHRoaXMsYSxiKX07bihKLEkpO2g9Si5wcm90b3R5cGU7aC5TPW51bGw7aC5uYT1udWxsO2guQ2E9bnVsbDtoLm9hPW51bGw7aC53PS0xO2guRj0tMTtoLnVhPSExOwp2YXIgQWM9ezM6MTMsMTI6MTQ0LDYzMjMyOjM4LDYzMjMzOjQwLDYzMjM0OjM3LDYzMjM1OjM5LDYzMjM2OjExMiw2MzIzNzoxMTMsNjMyMzg6MTE0LDYzMjM5OjExNSw2MzI0MDoxMTYsNjMyNDE6MTE3LDYzMjQyOjExOCw2MzI0MzoxMTksNjMyNDQ6MTIwLDYzMjQ1OjEyMSw2MzI0NjoxMjIsNjMyNDc6MTIzLDYzMjQ4OjQ0LDYzMjcyOjQ2LDYzMjczOjM2LDYzMjc1OjM1LDYzMjc2OjMzLDYzMjc3OjM0LDYzMjg5OjE0NCw2MzMwMjo0NX0sQmM9e1VwOjM4LERvd246NDAsTGVmdDozNyxSaWdodDozOSxFbnRlcjoxMyxGMToxMTIsRjI6MTEzLEYzOjExNCxGNDoxMTUsRjU6MTE2LEY2OjExNyxGNzoxMTgsRjg6MTE5LEY5OjEyMCxGMTA6MTIxLEYxMToxMjIsRjEyOjEyMywiVSswMDdGIjo0NixIb21lOjM2LEVuZDozNSxQYWdlVXA6MzMsUGFnZURvd246MzQsSW5zZXJ0OjQ1fSxDYz0heXx8QSgiNTI1IiksRGM9eiYmeDsKSi5wcm90b3R5cGUuYT1mdW5jdGlvbihhKXtpZih5fHxiYilpZigxNz09dGhpcy53JiYhYS5jdHJsS2V5fHwxOD09dGhpcy53JiYhYS5hbHRLZXl8fHomJjkxPT10aGlzLncmJiFhLm1ldGFLZXkpdGhpcy5GPXRoaXMudz0tMTstMT09dGhpcy53JiYoYS5jdHJsS2V5JiYxNyE9YS5jP3RoaXMudz0xNzphLmFsdEtleSYmMTghPWEuYz90aGlzLnc9MTg6YS5tZXRhS2V5JiY5MSE9YS5jJiYodGhpcy53PTkxKSk7Q2MmJiF4YyhhLmMsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGEuYWx0S2V5LGEubWV0YUtleSk/dGhpcy5oYW5kbGVFdmVudChhKToodGhpcy5GPXdjKGEuYyksRGMmJih0aGlzLnVhPWEuYWx0S2V5KSl9O0oucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dGhpcy5GPXRoaXMudz0tMTt0aGlzLnVhPWEuYWx0S2V5fTsKSi5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5iLGM9Yi5hbHRLZXk7aWYodiYmImtleXByZXNzIj09YS50eXBlKXt2YXIgZD10aGlzLkY7dmFyIGU9MTMhPWQmJjI3IT1kP2Iua2V5Q29kZTowfWVsc2UoeXx8YmIpJiYia2V5cHJlc3MiPT1hLnR5cGU/KGQ9dGhpcy5GLGU9MDw9Yi5jaGFyQ29kZSYmNjMyMzI+Yi5jaGFyQ29kZSYmdmMoZCk/Yi5jaGFyQ29kZTowKTphYiYmIXk/KGQ9dGhpcy5GLGU9dmMoZCk/Yi5rZXlDb2RlOjApOigia2V5cHJlc3MiPT1hLnR5cGU/KERjJiYoYz10aGlzLnVhKSxiLmtleUNvZGU9PWIuY2hhckNvZGU/MzI+Yi5rZXlDb2RlPyhkPWIua2V5Q29kZSxlPTApOihkPXRoaXMuRixlPWIuY2hhckNvZGUpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkseiYmNjM9PWUmJjIyND09ZCYmKGQ9MTkxKSk7dmFyIGY9ZD13YyhkKTtkPzYzMjMyPD0KZCYmZCBpbiBBYz9mPUFjW2RdOjI1PT1kJiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBCYyYmKGY9QmNbYi5rZXlJZGVudGlmaWVyXSk7eCYmQ2MmJiJrZXlwcmVzcyI9PWEudHlwZSYmIXhjKGYsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KXx8KGE9Zj09dGhpcy53LHRoaXMudz1mLGI9bmV3IEVjKGYsZSxhLGIpLGIuYWx0S2V5PWMsdWModGhpcyxiKSl9O0oucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTsKdmFyIHpjPWZ1bmN0aW9uKGEsYixjKXthLm9hJiZGYyhhKTthLlM9YjthLm5hPWJjKGEuUywia2V5cHJlc3MiLGEsYyk7YS5DYT1iYyhhLlMsImtleWRvd24iLGEuYSxjLGEpO2Eub2E9YmMoYS5TLCJrZXl1cCIsYS5iLGMsYSl9LEZjPWZ1bmN0aW9uKGEpe2EubmEmJihrYyhhLm5hKSxrYyhhLkNhKSxrYyhhLm9hKSxhLm5hPW51bGwsYS5DYT1udWxsLGEub2E9bnVsbCk7YS5TPW51bGw7YS53PS0xO2EuRj0tMX07Si5wcm90b3R5cGUudT1mdW5jdGlvbigpe0ouaS51LmNhbGwodGhpcyk7RmModGhpcyl9O3ZhciBFYz1mdW5jdGlvbihhLGIsYyxkKXtHLmNhbGwodGhpcyxkKTt0aGlzLnR5cGU9ImtleSI7dGhpcy5jPWE7dGhpcy5yZXBlYXQ9Y307bihFYyxHKTt2YXIgR2M9eD8iTW96VXNlclNlbGVjdCI6eXx8YmI/IldlYmtpdFVzZXJTZWxlY3QiOm51bGwsSGM9ZnVuY3Rpb24oYSxiKXtiPWI/bnVsbDphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7aWYoR2Mpe3ZhciBjPSJub25lIjthLnN0eWxlJiYoYS5zdHlsZVtHY109Yyk7aWYoYil7YT0wO2Zvcih2YXIgZDtkPWJbYV07YSsrKWQuc3R5bGUmJihkLnN0eWxlW0djXT1jKX19ZWxzZSBpZih2fHxhYilpZihjPSJvbiIsYS5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyksYilmb3IoYT0wO2Q9YlthXTthKyspZC5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyl9O3ZhciBJYz1mdW5jdGlvbigpe307ZGEoSWMpO0ljLnByb3RvdHlwZS5hPTA7dmFyIEs9ZnVuY3Rpb24oYSl7SS5jYWxsKHRoaXMpO3RoaXMuaj1hfHx4YXx8KHhhPW5ldyB1Yik7dGhpcy5xYT1KYzt0aGlzLlk9bnVsbDt0aGlzLm09ITE7dGhpcy5hPW51bGw7dGhpcy5BPXZvaWQgMDt0aGlzLmc9dGhpcy5jPXRoaXMuYj1udWxsO3RoaXMuR2E9ITF9O24oSyxJKTtLLnByb3RvdHlwZS5PYT1JYy5SKCk7CnZhciBKYz1udWxsLEtjPWZ1bmN0aW9uKGEsYil7c3dpdGNoKGEpe2Nhc2UgMTpyZXR1cm4gYj8iZGlzYWJsZSI6ImVuYWJsZSI7Y2FzZSAyOnJldHVybiBiPyJoaWdobGlnaHQiOiJ1bmhpZ2hsaWdodCI7Y2FzZSA0OnJldHVybiBiPyJhY3RpdmF0ZSI6ImRlYWN0aXZhdGUiO2Nhc2UgODpyZXR1cm4gYj8ic2VsZWN0IjoidW5zZWxlY3QiO2Nhc2UgMTY6cmV0dXJuIGI/ImNoZWNrIjoidW5jaGVjayI7Y2FzZSAzMjpyZXR1cm4gYj8iZm9jdXMiOiJibHVyIjtjYXNlIDY0OnJldHVybiBiPyJvcGVuIjoiY2xvc2UifXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBzdGF0ZSIpO30sTGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuWXx8KGEuWT0iOiIrKGEuT2EuYSsrKS50b1N0cmluZygzNikpfSxNYz1mdW5jdGlvbihhLGIpe2lmKGEuYiYmYS5iLmcpe3ZhciBjPWEuYi5nLGQ9YS5ZO2QgaW4gYyYmZGVsZXRlIGNbZF07cWEoYS5iLmcsYixhKX1hLlk9Yn07Sy5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9Owp2YXIgTmM9ZnVuY3Rpb24oYSl7YT1hLmE7cShhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cmV0dXJuIGF9LE9jPWZ1bmN0aW9uKGEpe2EuQXx8KGEuQT1uZXcgb2MoYSkpO3JldHVybiBxKGEuQSl9O0sucHJvdG90eXBlLnJhPWZ1bmN0aW9uKGEpe2lmKHRoaXMuYiYmdGhpcy5iIT1hKXRocm93IEVycm9yKCJNZXRob2Qgbm90IHN1cHBvcnRlZCIpO0suaS5yYS5jYWxsKHRoaXMsYSl9O0sucHJvdG90eXBlLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPW5iKHRoaXMuai5hLCJESVYiKX07CnZhciBQYz1mdW5jdGlvbihhLGIpe2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiJiZhLnhhKGIpKXthLkdhPSEwO3ZhciBjPXFiKGIpO2EuaiYmYS5qLmE9PWN8fChhLmo9Yj9uZXcgdWIocWIoYikpOnhhfHwoeGE9bmV3IHViKSk7YS52YShiKTthLkQoKX1lbHNlIHRocm93IEVycm9yKCJJbnZhbGlkIGVsZW1lbnQgdG8gZGVjb3JhdGUiKTt9O2g9Sy5wcm90b3R5cGU7aC54YT1mdW5jdGlvbigpe3JldHVybiEwfTtoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hfTtoLkQ9ZnVuY3Rpb24oKXt0aGlzLm09ITA7UWModGhpcyxmdW5jdGlvbihhKXshYS5tJiZhLmYoKSYmYS5EKCl9KX07aC5QPWZ1bmN0aW9uKCl7UWModGhpcyxmdW5jdGlvbihhKXthLm0mJmEuUCgpfSk7dGhpcy5BJiZyYyh0aGlzLkEpO3RoaXMubT0hMX07CmgudT1mdW5jdGlvbigpe3RoaXMubSYmdGhpcy5QKCk7dGhpcy5BJiYodGhpcy5BLk4oKSxkZWxldGUgdGhpcy5BKTtRYyh0aGlzLGZ1bmN0aW9uKGEpe2EuTigpfSk7IXRoaXMuR2EmJnRoaXMuYSYmb2IodGhpcy5hKTt0aGlzLmI9dGhpcy5hPXRoaXMuZz10aGlzLmM9bnVsbDtLLmkudS5jYWxsKHRoaXMpfTtoLnNhPWZ1bmN0aW9uKGEsYil7dGhpcy50YShhLFJjKHRoaXMpLGIpfTsKaC50YT1mdW5jdGlvbihhLGIsYyl7cSghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLm0mJihjfHwhdGhpcy5tKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZigwPmJ8fGI+UmModGhpcykpdGhyb3cgRXJyb3IoIkNoaWxkIGNvbXBvbmVudCBpbmRleCBvdXQgb2YgYm91bmRzIik7dGhpcy5nJiZ0aGlzLmN8fCh0aGlzLmc9e30sdGhpcy5jPVtdKTtpZihhLmI9PXRoaXMpe3ZhciBkPUxjKGEpO3RoaXMuZ1tkXT1hO0hhKHRoaXMuYyxhKX1lbHNlIHFhKHRoaXMuZyxMYyhhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuYiYmYS5ZKXt2YXIgZT1hLmI7ZD1hLlk7ZS5nJiZkPyhlPWUuZyxkPShudWxsIT09ZSYmZCBpbiBlP2VbZF06dm9pZCAwKXx8bnVsbCk6ZD1udWxsfWlmKGQmJmEuYiE9dGhpcyl0aHJvdyBFcnJvcigiVW5hYmxlIHRvIHNldCBwYXJlbnQgY29tcG9uZW50Iik7CmEuYj10aGlzO0suaS5yYS5jYWxsKGEsdGhpcyk7TGEodGhpcy5jLGIsMCxhKTtpZihhLm0mJnRoaXMubSYmYS5iPT10aGlzKWM9dGhpcy5qYSgpLGI9Yy5jaGlsZE5vZGVzW2JdfHxudWxsLGIhPWEuZigpJiZjLmluc2VydEJlZm9yZShhLmYoKSxiKTtlbHNlIGlmKGMpe3RoaXMuYXx8dGhpcy5pYSgpO2M9TCh0aGlzLGIrMSk7Yj10aGlzLmphKCk7Yz1jP2MuYTpudWxsO2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTthLmF8fGEuaWEoKTtiP2IuaW5zZXJ0QmVmb3JlKGEuYSxjfHxudWxsKTphLmouYS5ib2R5LmFwcGVuZENoaWxkKGEuYSk7YS5iJiYhYS5iLm18fGEuRCgpfWVsc2UgdGhpcy5tJiYhYS5tJiZhLmEmJmEuYS5wYXJlbnROb2RlJiYxPT1hLmEucGFyZW50Tm9kZS5ub2RlVHlwZSYmYS5EKCl9O2guamE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hfTsKdmFyIFNjPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEucWEpe3ZhciBiPWEubT9hLmE6YS5qLmEuYm9keTthOnt2YXIgYz1xYihiKTtpZihjLmRlZmF1bHRWaWV3JiZjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihjPWMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpKSl7Yz1jLmRpcmVjdGlvbnx8Yy5nZXRQcm9wZXJ0eVZhbHVlKCJkaXJlY3Rpb24iKXx8IiI7YnJlYWsgYX1jPSIifWEucWE9InJ0bCI9PShjfHwoYi5jdXJyZW50U3R5bGU/Yi5jdXJyZW50U3R5bGUuZGlyZWN0aW9uOm51bGwpfHxiLnN0eWxlJiZiLnN0eWxlLmRpcmVjdGlvbil9cmV0dXJuIGEucWF9LFJjPWZ1bmN0aW9uKGEpe3JldHVybiBhLmM/YS5jLmxlbmd0aDowfSxMPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuYz9hLmNbYl18fG51bGw6bnVsbH0sUWM9ZnVuY3Rpb24oYSxiLGMpe2EuYyYmcihhLmMsYixjKX0sVGM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jJiZiP0RhKGEuYyxiKTotMX07dmFyIFZjPWZ1bmN0aW9uKGEsYil7aWYoIWEpdGhyb3cgRXJyb3IoIkludmFsaWQgY2xhc3MgbmFtZSAiK2EpO2lmKCFpYShiKSl0aHJvdyBFcnJvcigiSW52YWxpZCBkZWNvcmF0b3IgZnVuY3Rpb24gIitiKTtVY1thXT1ifSxXYz17fSxVYz17fTt2YXIgWGM9ZnVuY3Rpb24oYSl7dGhpcy5oPWF9O2RhKFhjKTt2YXIgWWM9ZnVuY3Rpb24oYSxiKXthJiYoYS50YWJJbmRleD1iPzA6LTEpfSwkYz1mdW5jdGlvbihhLGIsYyl7Yy5pZCYmTWMoYixjLmlkKTt2YXIgZD1hLmIoKSxlPSExLGY9RChjKTtmJiZyKGYsZnVuY3Rpb24oZyl7Zz09ZD9lPSEwOmcmJnRoaXMuZyhiLGcsZCl9LGEpO2V8fEViKGMsZCk7WmMoYixjKTtyZXR1cm4gY307WGMucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiLGMpe2I9PWMrIi1kaXNhYmxlZCI/YS5aKCExKTpiPT1jKyItaG9yaXpvbnRhbCI/YWQoYSwiaG9yaXpvbnRhbCIpOmI9PWMrIi12ZXJ0aWNhbCImJmFkKGEsInZlcnRpY2FsIil9Owp2YXIgWmM9ZnVuY3Rpb24oYSxiKXtpZihiKWZvcih2YXIgYz1iLmZpcnN0Q2hpbGQsZDtjJiZjLnBhcmVudE5vZGU9PWI7KXtkPWMubmV4dFNpYmxpbmc7aWYoMT09Yy5ub2RlVHlwZSl7YTp7dmFyIGU9YztxKGUpO2U9RChlKTtmb3IodmFyIGY9MCxnPWUubGVuZ3RoO2Y8ZztmKyspe3ZhciBrPWVbZl07aWYoaz1rIGluIFVjP1VjW2tdKCk6bnVsbCl7ZT1rO2JyZWFrIGF9fWU9bnVsbH1lJiYoZS5hPWMsYS5pc0VuYWJsZWQoKXx8ZS5aKCExKSxhLnNhKGUpLFBjKGUsYykpfWVsc2UgYy5ub2RlVmFsdWUmJiIiIT1NYShjLm5vZGVWYWx1ZSl8fGIucmVtb3ZlQ2hpbGQoYyk7Yz1kfX0sYmQ9ZnVuY3Rpb24oYSxiKXtiPWIuZigpO3EoYiwiVGhlIGNvbnRhaW5lciBET00gZWxlbWVudCBjYW5ub3QgYmUgbnVsbC4iKTtIYyhiLHgpO3YmJihiLmhpZGVGb2N1cz0hMCk7KGE9YS5oKSYmdmIoYixhKX07WGMucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKWGMucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5iKCksYz1bYiwiaG9yaXpvbnRhbCI9PWEuSD9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgTT1mdW5jdGlvbigpe30sY2Q7ZGEoTSk7dmFyIGRkPXtidXR0b246InByZXNzZWQiLGNoZWNrYm94OiJjaGVja2VkIixtZW51aXRlbToic2VsZWN0ZWQiLG1lbnVpdGVtY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtcmFkaW86ImNoZWNrZWQiLHJhZGlvOiJjaGVja2VkIix0YWI6InNlbGVjdGVkIix0cmVlaXRlbToic2VsZWN0ZWQifTtNLnByb3RvdHlwZS5oPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLmouYigiRElWIixlZCh0aGlzLGEpLmpvaW4oIiAiKSxhLmJhKX07dmFyIGdkPWZ1bmN0aW9uKGEsYixjKXtpZihhPWEuZj9hLmYoKTphKXt2YXIgZD1bYl07diYmIUEoIjciKSYmKGQ9ZmQoRChhKSxiKSxkLnB1c2goYikpOyhjP0ZiOkhiKShhLGQpfX07Ck0ucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiKXtiLmlkJiZNYyhhLGIuaWQpO2ImJmIuZmlyc3RDaGlsZD9oZChhLGIuZmlyc3RDaGlsZC5uZXh0U2libGluZz9KYShiLmNoaWxkTm9kZXMpOmIuZmlyc3RDaGlsZCk6YS5iYT1udWxsO3ZhciBjPTAsZD10aGlzLmEoKSxlPXRoaXMuYSgpLGY9ITEsZz0hMSxrPSExLHA9SmEoRChiKSk7cihwLGZ1bmN0aW9uKEIpe2Z8fEIhPWQ/Z3x8QiE9ZT9jfD1pZCh0aGlzLEIpOmc9ITA6KGY9ITAsZT09ZCYmKGc9ITApKTsxPT1pZCh0aGlzLEIpJiYoQWEoYiksc2IoYikmJnRiKGIpJiZyYihiLCExKSl9LHRoaXMpO2Eubz1jO2Z8fChwLnB1c2goZCksZT09ZCYmKGc9ITApKTtnfHxwLnB1c2goZSk7KGE9YS53YSkmJnAucHVzaC5hcHBseShwLGEpO2lmKHYmJiFBKCI3Iikpe3ZhciB3PWZkKHApOzA8dy5sZW5ndGgmJihwLnB1c2guYXBwbHkocCx3KSxrPSEwKX1mJiZnJiYhYSYmIWt8fENiKGIscC5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIGpkPWZ1bmN0aW9uKGEsYil7aWYoYT1hLmgoKSl7cShiLCJUaGUgZWxlbWVudCBwYXNzZWQgYXMgYSBmaXJzdCBwYXJhbWV0ZXIgY2Fubm90IGJlIG51bGwuIik7dmFyIGM9Yi5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDthIT1jJiZ2YihiLGEpfX0sa2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYztpZihhLnYmMzImJihjPWEuZigpKSl7aWYoIWImJmEubyYzMil7dHJ5e2MuYmx1cigpfWNhdGNoKGQpe31hLm8mMzImJmEuRmEobnVsbCl9KHNiKGMpJiZ0YihjKSkhPWImJnJiKGMsYil9fSxsZD1mdW5jdGlvbihhLGIsYyl7Y2R8fChjZD17MToiZGlzYWJsZWQiLDg6InNlbGVjdGVkIiwxNjoiY2hlY2tlZCIsNjQ6ImV4cGFuZGVkIn0pO3EoYSwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO2I9Y2RbYl07dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDtkJiYoZD1kZFtkXXx8YixiPSJjaGVja2VkIj09Ynx8InNlbGVjdGVkIj09CmI/ZDpiKTtiJiZ4YihhLGIsYyl9O00ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250cm9sIn07CnZhciBlZD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuYSgpLGQ9W2NdLGU9YS5hKCk7ZSE9YyYmZC5wdXNoKGUpO2M9Yi5vO2ZvcihlPVtdO2M7KXt2YXIgZj1jJi1jO2UucHVzaChtZChhLGYpKTtjJj1+Zn1kLnB1c2guYXBwbHkoZCxlKTsoYT1iLndhKSYmZC5wdXNoLmFwcGx5KGQsYSk7diYmIUEoIjciKSYmZC5wdXNoLmFwcGx5KGQsZmQoZCkpO3JldHVybiBkfSxmZD1mdW5jdGlvbihhLGIpe3ZhciBjPVtdO2ImJihhPUlhKGEsW2JdKSk7cihbXSxmdW5jdGlvbihkKXshRmEoZCxsYShHYSxhKSl8fGImJiFHYShkLGIpfHxjLnB1c2goZC5qb2luKCJfIikpfSk7cmV0dXJuIGN9LG1kPWZ1bmN0aW9uKGEsYil7YS5ifHxuZChhKTtyZXR1cm4gYS5iW2JdfSxpZD1mdW5jdGlvbihhLGIpe2Euanx8KGEuYnx8bmQoYSksYS5qPXNhKGEuYikpO2E9cGFyc2VJbnQoYS5qW2JdLDEwKTtyZXR1cm4gaXNOYU4oYSk/MDphfSxuZD1mdW5jdGlvbihhKXt2YXIgYj1hLmEoKSxjPSF0KGIucmVwbGFjZSgvXHhhMHxccy9nLAoiICIpLCIgIik7cShjLCJDb250cm9sUmVuZGVyZXIgaGFzIGFuIGludmFsaWQgY3NzIGNsYXNzOiAnIitiKyInIik7YS5iPXsxOmIrIi1kaXNhYmxlZCIsMjpiKyItaG92ZXIiLDQ6YisiLWFjdGl2ZSIsODpiKyItc2VsZWN0ZWQiLDE2OmIrIi1jaGVja2VkIiwzMjpiKyItZm9jdXNlZCIsNjQ6YisiLW9wZW4ifX07dmFyIE49ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO2lmKCFiKXtiPXRoaXMuY29uc3RydWN0b3I7Zm9yKHZhciBkO2I7KXtkPWJbamFdfHwoYltqYV09KytrYSk7aWYoZD1XY1tkXSlicmVhaztiPWIuaT9iLmkuY29uc3RydWN0b3I6bnVsbH1iPWQ/aWEoZC5SKT9kLlIoKTpuZXcgZDpudWxsfXRoaXMuQj1iO3RoaXMuYmE9dm9pZCAwIT09YT9hOm51bGx9O24oTixLKTtoPU4ucHJvdG90eXBlO2guYmE9bnVsbDtoLm89MDtoLnY9Mzk7aC5LPTA7aC5JYT0hMDtoLndhPW51bGw7aC55YT0hMDtoLmlhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CLmModGhpcyk7dGhpcy5hPWE7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmeGIoYSwiaGlkZGVuIiwhMCkpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hPXRoaXMuQi5nKHRoaXMsYSk7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5JYT0ibm9uZSIhPWEuc3R5bGUuZGlzcGxheX07CmguRD1mdW5jdGlvbigpe04uaS5ELmNhbGwodGhpcyk7dmFyIGE9TmModGhpcyk7cSh0aGlzKTtxKGEpO3RoaXMuaXNWaXNpYmxlKCl8fHhiKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fGxkKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy52JjgmJmxkKGEsOCwhISh0aGlzLm8mOCkpO3RoaXMudiYxNiYmbGQoYSwxNiwhISh0aGlzLm8mMTYpKTt0aGlzLnYmNjQmJmxkKGEsNjQsISEodGhpcy5vJjY0KSk7YT10aGlzLkI7U2ModGhpcykmJmdkKHRoaXMuZigpLGEuYSgpKyItcnRsIiwhMCk7dGhpcy5pc0VuYWJsZWQoKSYma2QodGhpcyx0aGlzLmlzVmlzaWJsZSgpKTtpZih0aGlzLnYmLTImJih0aGlzLnlhJiZvZCh0aGlzLCEwKSx0aGlzLnYmMzImJihhPXRoaXMuZigpKSkpe3ZhciBiPXRoaXMuV3x8KHRoaXMuVz1uZXcgSik7emMoYixhKTtIKEgoSChPYyh0aGlzKSxiLCJrZXkiLHRoaXMuZmEpLGEsImZvY3VzIix0aGlzLk5hKSxhLCJibHVyIiwKdGhpcy5GYSl9fTt2YXIgb2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYz1PYyhhKSxkPWEuZigpO2I/KEgoSChIKEgoYyxkLEYuTCxhLmthKSxkLFtGLk0sRi5hYV0sYS5sYSksZCwibW91c2VvdmVyIixhLkFhKSxkLCJtb3VzZW91dCIsYS56YSksYS5lYSE9Y2EmJkgoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fEgoYyxkLCJkYmxjbGljayIsYS5KYSksYS5nYXx8KGEuZ2E9bmV3IHBkKGEpLHpiKGEsbGEoQWIsYS5nYSkpKSkpOihxYyhxYyhxYyhxYyhjLGQsRi5MLGEua2EpLGQsW0YuTSxGLmFhXSxhLmxhKSxkLCJtb3VzZW92ZXIiLGEuQWEpLGQsIm1vdXNlb3V0IixhLnphKSxhLmVhIT1jYSYmcWMoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fHFjKGMsZCwiZGJsY2xpY2siLGEuSmEpLEFiKGEuZ2EpLGEuZ2E9bnVsbCkpfTsKTi5wcm90b3R5cGUuUD1mdW5jdGlvbigpe04uaS5QLmNhbGwodGhpcyk7dGhpcy5XJiZGYyh0aGlzLlcpO3RoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJmtkKHRoaXMsITEpfTtOLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7Ti5pLnUuY2FsbCh0aGlzKTt0aGlzLlcmJih0aGlzLlcuTigpLGRlbGV0ZSB0aGlzLlcpO2RlbGV0ZSB0aGlzLkI7dGhpcy5nYT10aGlzLndhPXRoaXMuYmE9bnVsbH07dmFyIGhkPWZ1bmN0aW9uKGEsYil7YS5iYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm8mMSl9OwpOLnByb3RvdHlwZS5aPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYjtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0VuYWJsZWQmJiFiLmlzRW5hYmxlZCgpfHwhTyh0aGlzLDEsIWEpfHwoYXx8KHFkKHRoaXMsITEpLFAodGhpcywhMSkpLHRoaXMuaXNWaXNpYmxlKCkmJmtkKHRoaXMsYSksUSh0aGlzLDEsIWEsITApKX07CnZhciBQPWZ1bmN0aW9uKGEsYil7TyhhLDIsYikmJlEoYSwyLGIpfSxxZD1mdW5jdGlvbihhLGIpe08oYSw0LGIpJiZRKGEsNCxiKX0scmQ9ZnVuY3Rpb24oYSxiKXtPKGEsOCxiKSYmUShhLDgsYil9LHNkPWZ1bmN0aW9uKGEsYil7TyhhLDY0LGIpJiZRKGEsNjQsYil9LFE9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIWQmJjE9PWIpYS5aKCFjKTtlbHNlIGlmKGEudiZiJiZjIT0hIShhLm8mYikpe3ZhciBlPWEuQjtpZihkPWEuZigpKShlPW1kKGUsYikpJiZnZChhLGUsYyksbGQoZCxiLGMpO2Eubz1jP2Eub3xiOmEubyZ+Yn19LHRkPWZ1bmN0aW9uKGEsYixjKXtpZihhLm0mJmEubyZiJiYhYyl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTshYyYmYS5vJmImJlEoYSxiLCExKTthLnY9Yz9hLnZ8YjphLnYmfmJ9LFI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hISgyNTUmYikmJiEhKGEudiZiKX0sTz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuISEoYS52JmIpJiYhIShhLm8mCmIpIT1jJiYoIShhLksmYil8fHVjKGEsS2MoYixjKSkpJiYhYS5VfTtoPU4ucHJvdG90eXBlO2guQWE9ZnVuY3Rpb24oYSl7KCFhLnJlbGF0ZWRUYXJnZXR8fCFwYih0aGlzLmYoKSxhLnJlbGF0ZWRUYXJnZXQpKSYmdWModGhpcywiZW50ZXIiKSYmdGhpcy5pc0VuYWJsZWQoKSYmUih0aGlzLDIpJiZQKHRoaXMsITApfTtoLnphPWZ1bmN0aW9uKGEpe2EucmVsYXRlZFRhcmdldCYmcGIodGhpcy5mKCksYS5yZWxhdGVkVGFyZ2V0KXx8IXVjKHRoaXMsImxlYXZlIil8fChSKHRoaXMsNCkmJnFkKHRoaXMsITEpLFIodGhpcywyKSYmUCh0aGlzLCExKSl9O2guZWE9Y2E7Cmgua2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSxPYihhKSYmISh5JiZ6JiZhLmN0cmxLZXkpKSl7Uih0aGlzLDQpJiZxZCh0aGlzLCEwKTt2YXIgYjtpZihiPXRoaXMuQil7dmFyIGM7Yj10aGlzLnYmMzImJihjPXRoaXMuZigpKT9zYihjKSYmdGIoYyk6ITF9YiYmdGhpcy5mKCkuZm9jdXMoKX0hT2IoYSl8fHkmJnomJmEuY3RybEtleXx8YS5nKCl9O2gubGE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSx0aGlzLm8mNCYmdWQodGhpcyxhKSYmUih0aGlzLDQpJiZxZCh0aGlzLCExKSl9O2guSmE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmdWQodGhpcyxhKX07CnZhciB1ZD1mdW5jdGlvbihhLGIpe2lmKFIoYSwxNikpe3ZhciBjPSEoYS5vJjE2KTtPKGEsMTYsYykmJlEoYSwxNixjKX1SKGEsOCkmJnJkKGEsITApO1IoYSw2NCkmJnNkKGEsIShhLm8mNjQpKTtjPW5ldyBFKCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuQT1iLkEpO3JldHVybiB1YyhhLGMpfTtOLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe1IodGhpcywzMikmJk8odGhpcywzMiwhMCkmJlEodGhpcywzMiwhMCl9O04ucHJvdG90eXBlLkZhPWZ1bmN0aW9uKCl7Uih0aGlzLDQpJiZxZCh0aGlzLCExKTtSKHRoaXMsMzIpJiZPKHRoaXMsMzIsITEpJiZRKHRoaXMsMzIsITEpfTsKTi5wcm90b3R5cGUuZmE9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJjEzPT1hLmMmJnVkKHRoaXMsYSk/KGEuZygpLGEuaigpLCEwKTohMX07aWYoIWlhKE4pKXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBjbGFzcyAiK04pO2lmKCFpYShNKSl0aHJvdyBFcnJvcigiSW52YWxpZCByZW5kZXJlciBjbGFzcyAiK00pO3ZhciB2ZD1OW2phXXx8KE5bamFdPSsra2EpO1djW3ZkXT1NO1ZjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIHBkPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9ITE7dGhpcy5jPW5ldyBvYyh0aGlzKTt6Yih0aGlzLGxhKEFiLHRoaXMuYykpO2E9TmModGhpcy5iKTtIKEgoSCh0aGlzLmMsYSxGLkwsdGhpcy5oKSxhLEYuTSx0aGlzLmopLGEsImNsaWNrIix0aGlzLmcpfTtuKHBkLEMpO3ZhciB3ZD0hdnx8OTw9TnVtYmVyKGliKTsKcGQucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXt0aGlzLmE9ITF9O3BkLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7dGhpcy5hPSEwfTt2YXIgeGQ9ZnVuY3Rpb24oYSxiKXtpZighd2QpcmV0dXJuIGEuYnV0dG9uPTAsYS50eXBlPWIsYTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudHMiKTtjLmluaXRNb3VzZUV2ZW50KGIsYS5idWJibGVzLGEuY2FuY2VsYWJsZSxhLnZpZXd8fG51bGwsYS5kZXRhaWwsYS5zY3JlZW5YLGEuc2NyZWVuWSxhLmNsaWVudFgsYS5jbGllbnRZLGEuY3RybEtleSxhLmFsdEtleSxhLnNoaWZ0S2V5LGEubWV0YUtleSwwLGEucmVsYXRlZFRhcmdldHx8bnVsbCk7cmV0dXJuIGN9OwpwZC5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXtpZih0aGlzLmEpdGhpcy5hPSExO2Vsc2V7dmFyIGI9YS5iLGM9Yi5idXR0b24sZD1iLnR5cGUsZT14ZChiLCJtb3VzZWRvd24iKTt0aGlzLmIua2EobmV3IEcoZSxhLmEpKTtlPXhkKGIsIm1vdXNldXAiKTt0aGlzLmIubGEobmV3IEcoZSxhLmEpKTt3ZHx8KGIuYnV0dG9uPWMsYi50eXBlPWQpfX07cGQucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt0aGlzLmI9bnVsbDtwZC5pLnUuY2FsbCh0aGlzKX07dmFyIFM9ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO3RoaXMuZGE9Ynx8WGMuUigpO3RoaXMuSD1hfHwidmVydGljYWwifTtuKFMsSyk7aD1TLnByb3RvdHlwZTtoLkRhPW51bGw7aC5jYT1udWxsO2guZGE9bnVsbDtoLkg9bnVsbDtoLlQ9ITA7aC5PPSEwO2gubD0tMTtoLnM9bnVsbDtoLlY9ITE7aC5JPW51bGw7dmFyIHlkPWZ1bmN0aW9uKGEpe3JldHVybiBhLkRhfHxhLmYoKX07aD1TLnByb3RvdHlwZTtoLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPXRoaXMuai5iKCJESVYiLHRoaXMuZGEuYyh0aGlzKS5qb2luKCIgIikpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKGEpe3JldHVybiJESVYiPT1hLnRhZ05hbWV9O2gudmE9ZnVuY3Rpb24oYSl7dGhpcy5hPSRjKHRoaXMuZGEsdGhpcyxhKTsibm9uZSI9PWEuc3R5bGUuZGlzcGxheSYmKHRoaXMuVD0hMSl9OwpoLkQ9ZnVuY3Rpb24oKXtTLmkuRC5jYWxsKHRoaXMpO1FjKHRoaXMsZnVuY3Rpb24oYil7Yi5tJiZ6ZCh0aGlzLGIpfSx0aGlzKTt2YXIgYT10aGlzLmYoKTtiZCh0aGlzLmRhLHRoaXMpO0FkKHRoaXMsdGhpcy5UKTtIKEgoSChIKEgoSChIKEgoT2ModGhpcyksdGhpcywiZW50ZXIiLHRoaXMuV2EpLHRoaXMsImhpZ2hsaWdodCIsdGhpcy5YYSksdGhpcywidW5oaWdobGlnaHQiLHRoaXMuY2IpLHRoaXMsIm9wZW4iLHRoaXMuWWEpLHRoaXMsImNsb3NlIix0aGlzLlVhKSxhLEYuTCx0aGlzLlNhKSxxYihhKSxbRi5NLEYuYWFdLHRoaXMuVmEpLGEsW0YuTCxGLk0sRi5hYSwibW91c2VvdmVyIiwibW91c2VvdXQiLCJjb250ZXh0bWVudSJdLHRoaXMuVGEpO0JkKHRoaXMpfTt2YXIgQmQ9ZnVuY3Rpb24oYSl7dmFyIGI9T2MoYSksYz15ZChhKTtIKEgoSChiLGMsImZvY3VzIixhLkhhKSxjLCJibHVyIixhLlFhKSxhLmNhfHwoYS5jYT1uZXcgSih5ZChhKSkpLCJrZXkiLGEuUmEpfTtoPVMucHJvdG90eXBlOwpoLlA9ZnVuY3Rpb24oKXtDZCh0aGlzLC0xKTt0aGlzLnMmJnNkKHRoaXMucywhMSk7dGhpcy5WPSExO1MuaS5QLmNhbGwodGhpcyl9O2gudT1mdW5jdGlvbigpe1MuaS51LmNhbGwodGhpcyk7dGhpcy5jYSYmKHRoaXMuY2EuTigpLHRoaXMuY2E9bnVsbCk7dGhpcy5kYT10aGlzLnM9dGhpcy5JPXRoaXMuRGE9bnVsbH07aC5XYT1mdW5jdGlvbigpe3JldHVybiEwfTsKaC5YYT1mdW5jdGlvbihhKXt2YXIgYj1UYyh0aGlzLGEudGFyZ2V0KTtpZigtMTxiJiZiIT10aGlzLmwpe3ZhciBjPUwodGhpcyx0aGlzLmwpO2MmJlAoYywhMSk7dGhpcy5sPWI7Yz1MKHRoaXMsdGhpcy5sKTt0aGlzLlYmJnFkKGMsITApO3RoaXMucyYmYyE9dGhpcy5zJiYoYy52JjY0P3NkKGMsITApOnNkKHRoaXMucywhMSkpfWI9dGhpcy5mKCk7cShiLCJUaGUgRE9NIGVsZW1lbnQgZm9yIHRoZSBjb250YWluZXIgY2Fubm90IGJlIG51bGwuIik7bnVsbCE9YS50YXJnZXQuZigpJiZ4YihiLCJhY3RpdmVkZXNjZW5kYW50IixhLnRhcmdldC5mKCkuaWQpfTtoLmNiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT1MKHRoaXMsdGhpcy5sKSYmKHRoaXMubD0tMSk7YT10aGlzLmYoKTtxKGEsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnJlbW92ZUF0dHJpYnV0ZSh3YigiYWN0aXZlZGVzY2VuZGFudCIpKX07CmguWWE9ZnVuY3Rpb24oYSl7KGE9YS50YXJnZXQpJiZhIT10aGlzLnMmJmEuYj09dGhpcyYmKHRoaXMucyYmc2QodGhpcy5zLCExKSx0aGlzLnM9YSl9O2guVWE9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMucyYmKHRoaXMucz1udWxsKTt2YXIgYj10aGlzLmYoKSxjPWEudGFyZ2V0LmYoKTtiJiZhLnRhcmdldC5vJjImJmMmJihhPSIiLGMmJihhPWMuaWQscShhLCJUaGUgYWN0aXZlIGVsZW1lbnQgc2hvdWxkIGhhdmUgYW4gaWQuIikpLHhiKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEpKX07aC5TYT1mdW5jdGlvbihhKXt0aGlzLk8mJih0aGlzLlY9ITApO3ZhciBiPXlkKHRoaXMpO2ImJnNiKGIpJiZ0YihiKT9iLmZvY3VzKCk6YS5nKCl9O2guVmE9ZnVuY3Rpb24oKXt0aGlzLlY9ITF9OwpoLlRhPWZ1bmN0aW9uKGEpe2E6e3ZhciBiPWEudGFyZ2V0O2lmKHRoaXMuSSlmb3IodmFyIGM9dGhpcy5mKCk7YiYmYiE9PWM7KXt2YXIgZD1iLmlkO2lmKGQgaW4gdGhpcy5JKXtiPXRoaXMuSVtkXTticmVhayBhfWI9Yi5wYXJlbnROb2RlfWI9bnVsbH1pZihiKXN3aXRjaChhLnR5cGUpe2Nhc2UgRi5MOmIua2EoYSk7YnJlYWs7Y2FzZSBGLk06Y2FzZSBGLmFhOmIubGEoYSk7YnJlYWs7Y2FzZSAibW91c2VvdmVyIjpiLkFhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3V0IjpiLnphKGEpO2JyZWFrO2Nhc2UgImNvbnRleHRtZW51IjpiLmVhKGEpfX07aC5IYT1mdW5jdGlvbigpe307aC5RYT1mdW5jdGlvbigpe0NkKHRoaXMsLTEpO3RoaXMuVj0hMTt0aGlzLnMmJnNkKHRoaXMucywhMSl9OwpoLlJhPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmlzRW5hYmxlZCgpJiZ0aGlzLmlzVmlzaWJsZSgpJiYoMCE9UmModGhpcyl8fHRoaXMuRGEpJiZEZCh0aGlzLGEpPyhhLmcoKSxhLmooKSwhMCk6ITF9Owp2YXIgRGQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1MKGEsYS5sKTtpZihjJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5mYSYmYy5mYShiKXx8YS5zJiZhLnMhPWMmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLnMuZmEmJmEucy5mYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuYyl7Y2FzZSAyNzp5ZChhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpFZChhKTticmVhaztjYXNlIDM1OkZkKGEpO2JyZWFrO2Nhc2UgMzg6aWYoInZlcnRpY2FsIj09YS5IKUdkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9IZChhKTpHZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoInZlcnRpY2FsIj09YS5IKUhkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9HZChhKTpIZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSx6ZD1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZigpO2M9Yy5pZHx8KGMuaWQ9TGMoYikpO2EuSXx8KGEuST17fSk7YS5JW2NdPWJ9O1MucHJvdG90eXBlLnNhPWZ1bmN0aW9uKGEsYil7Q2EoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtTLmkuc2EuY2FsbCh0aGlzLGEsYil9O1MucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEsYixjKXtDYShhLE4pO2EuS3w9MjthLkt8PTY0O3RkKGEsMzIsITEpO2EubSYmMCE9YS55YSYmb2QoYSwhMSk7YS55YT0hMTt2YXIgZD1hLmI9PXRoaXM/VGModGhpcyxhKTotMTtTLmkudGEuY2FsbCh0aGlzLGEsYixjKTthLm0mJnRoaXMubSYmemQodGhpcyxhKTthPWQ7LTE9PWEmJihhPVJjKHRoaXMpKTthPT10aGlzLmw/dGhpcy5sPU1hdGgubWluKFJjKHRoaXMpLTEsYik6YT50aGlzLmwmJmI8PXRoaXMubD90aGlzLmwrKzphPHRoaXMubCYmYj50aGlzLmwmJnRoaXMubC0tfTsKdmFyIGFkPWZ1bmN0aW9uKGEsYil7aWYoYS5mKCkpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5IPWJ9O1MucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O3ZhciBBZD1mdW5jdGlvbihhLGIpe2EuVD1iO3ZhciBjPWEuZigpO2MmJihjLnN0eWxlLmRpc3BsYXk9Yj8iIjoibm9uZSIsWWMoeWQoYSksYS5PJiZhLlQpKX07Uy5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT307Uy5wcm90b3R5cGUuWj1mdW5jdGlvbihhKXt0aGlzLk8hPWEmJnVjKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5PPSEwLFFjKHRoaXMsZnVuY3Rpb24oYil7Yi5MYT9kZWxldGUgYi5MYTpiLlooITApfSkpOihRYyh0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5aKCExKTpiLkxhPSEwfSksdGhpcy5WPXRoaXMuTz0hMSksWWMoeWQodGhpcyksYSYmdGhpcy5UKSl9Owp2YXIgQ2Q9ZnVuY3Rpb24oYSxiKXsoYj1MKGEsYikpP1AoYiwhMCk6LTE8YS5sJiZQKEwoYSxhLmwpLCExKX0sRWQ9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LFJjKGEpLTEpfSxGZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiAwPmI/Yy0xOmJ9LDApfSxIZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7cmV0dXJuKGIrMSklY30sYS5sKX0sR2Q9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe2ItLTtyZXR1cm4gMD5iP2MtMTpifSxhLmwpfSxJZD1mdW5jdGlvbihhLGIsYyl7Yz0wPmM/VGMoYSxhLnMpOmM7dmFyIGQ9UmMoYSk7Yz1iLmNhbGwoYSxjLGQpO2Zvcih2YXIgZT0wO2U8PWQ7KXt2YXIgZj1MKGEsYyksZztpZihnPWYpZz1mLmlzVmlzaWJsZSgpJiZmLmlzRW5hYmxlZCgpJiYhIShmLnYmMik7aWYoZyl7YS5FYShjKTticmVha31lKys7Yz1iLmNhbGwoYSxjLGQpfX07ClMucHJvdG90eXBlLkVhPWZ1bmN0aW9uKGEpe0NkKHRoaXMsYSl9O3ZhciBUPWZ1bmN0aW9uKCl7fTtuKFQsTSk7ZGEoVCk7VC5wcm90b3R5cGUuYT1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYiJ9O1QucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXtyZXR1cm4idGFiIn07VC5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYj1ULmkuYy5jYWxsKHRoaXMsYSk7KGE9YS5QYSkmJmImJihiLnRpdGxlPWF8fCIiKTtyZXR1cm4gYn07VC5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIpe2I9VC5pLmcuY2FsbCh0aGlzLGEsYik7dmFyIGM9Yi50aXRsZXx8IiI7YyYmKGEuUGE9Yyk7YS5vJjgmJihjPWEuYikmJmlhKGMuRykmJihRKGEsOCwhMSksYy5HKGEpKTtyZXR1cm4gYn07dmFyIEpkPWZ1bmN0aW9uKGEsYixjKXtOLmNhbGwodGhpcyxhLGJ8fFQuUigpLGMpO3RkKHRoaXMsOCwhMCk7dGhpcy5LfD05fTtuKEpkLE4pO1ZjKCJnb29nLXRhYiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEpkKG51bGwpfSk7dmFyIFU9ZnVuY3Rpb24oKXt0aGlzLmg9InRhYmxpc3QifTtuKFUsWGMpO2RhKFUpO1UucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWItYmFyIn07VS5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIsYyl7dGhpcy5qfHwodGhpcy5hfHxLZCh0aGlzKSx0aGlzLmo9c2EodGhpcy5hKSk7dmFyIGQ9dGhpcy5qW2JdO2Q/KGFkKGEsTGQoZCkpLGEuQj1kKTpVLmkuZy5jYWxsKHRoaXMsYSxiLGMpfTtVLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPVUuaS5jLmNhbGwodGhpcyxhKTt0aGlzLmF8fEtkKHRoaXMpO2IucHVzaCh0aGlzLmFbYS5CXSk7cmV0dXJuIGJ9O3ZhciBLZD1mdW5jdGlvbihhKXt2YXIgYj1hLmIoKTthLmE9e3RvcDpiKyItdG9wIixib3R0b206YisiLWJvdHRvbSIsc3RhcnQ6YisiLXN0YXJ0IixlbmQ6YisiLWVuZCJ9fTt2YXIgVj1mdW5jdGlvbihhLGIsYyl7YT1hfHwidG9wIjthZCh0aGlzLExkKGEpKTt0aGlzLkI9YTtTLmNhbGwodGhpcyx0aGlzLkgsYnx8VS5SKCksYyk7TWQodGhpcyl9O24oVixTKTtoPVYucHJvdG90eXBlO2guQz1udWxsO2guRD1mdW5jdGlvbigpe1YuaS5ELmNhbGwodGhpcyk7TWQodGhpcyl9O2gudT1mdW5jdGlvbigpe1YuaS51LmNhbGwodGhpcyk7dGhpcy5DPW51bGx9O2guRWE9ZnVuY3Rpb24oYSl7Vi5pLkVhLmNhbGwodGhpcyxhKTt0aGlzLkcoTCh0aGlzLGEpKX07aC5HPWZ1bmN0aW9uKGEpe2E/cmQoYSwhMCk6dGhpcy5DJiZyZCh0aGlzLkMsITEpfTsKdmFyIE5kPWZ1bmN0aW9uKGEsYil7aWYoYiYmYj09YS5DKXtmb3IodmFyIGM9VGMoYSxiKSxkPWMtMTtiPUwoYSxkKTtkLS0pe3ZhciBlPWI7aWYoZS5pc1Zpc2libGUoKSYmZS5pc0VuYWJsZWQoKSl7YS5HKGIpO3JldHVybn19Zm9yKGMrPTE7Yj1MKGEsYyk7YysrKWlmKGQ9YixkLmlzVmlzaWJsZSgpJiZkLmlzRW5hYmxlZCgpKXthLkcoYik7cmV0dXJufWEuRyhudWxsKX19O2g9Vi5wcm90b3R5cGU7aC5hYj1mdW5jdGlvbihhKXt0aGlzLkMmJnRoaXMuQyE9YS50YXJnZXQmJnJkKHRoaXMuQywhMSk7dGhpcy5DPWEudGFyZ2V0fTtoLmJiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT10aGlzLkMmJih0aGlzLkM9bnVsbCl9O2guWmE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guJGE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guSGE9ZnVuY3Rpb24oKXtMKHRoaXMsdGhpcy5sKXx8Q2QodGhpcyxUYyh0aGlzLHRoaXMuQ3x8TCh0aGlzLDApKSl9Owp2YXIgTWQ9ZnVuY3Rpb24oYSl7SChIKEgoSChPYyhhKSxhLCJzZWxlY3QiLGEuYWIpLGEsInVuc2VsZWN0IixhLmJiKSxhLCJkaXNhYmxlIixhLlphKSxhLCJoaWRlIixhLiRhKX0sTGQ9ZnVuY3Rpb24oYSl7cmV0dXJuInN0YXJ0Ij09YXx8ImVuZCI9PWE/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O1ZjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBWfSk7ZnVuY3Rpb24gT2QoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIFBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgZz1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIrZyk7Zm9yKHZhciBrPVtdLHA9YmEoYyksdz1wLm5leHQoKTshdy5kb25lO3c9cC5uZXh0KCkpe3c9dy52YWx1ZTt2YXIgQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKQi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO0IudGV4dENvbnRlbnQ9dztmLmFwcGVuZENoaWxkKEIpO2sucHVzaChCKX0iYm90dG9tIiE9ZyYmZS5hcHBlbmRDaGlsZChmKTtwPW51bGw7aWYoInRvcCI9PWd8fCJib3R0b20iPT1nKXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTsidG9wIj09ZyYmcCYmZS5hcHBlbmRDaGlsZChwKTtCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0IuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciByYT1bXTtjPWJhKGMpO2Zvcih3PWMubmV4dCgpOyF3LmRvbmU7dz1jLm5leHQoKSl3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHcuaWQ9ZS5pZCsiX2NvbnRlbnRfIityYS5sZW5ndGgsdy5zdHlsZS5kaXNwbGF5PSJub25lIixCLmFwcGVuZENoaWxkKHcpLHJhLnB1c2godyk7ZS5hcHBlbmRDaGlsZChCKTsiYm90dG9tIj09ZyYmKHAmJgplLmFwcGVuZENoaWxkKHApLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBYPW5ldyBWKGcpO1BjKFgsZik7dmFyIFk9LTE7ZGMoWCwic2VsZWN0IixmdW5jdGlvbihaKXtaPWsuaW5kZXhPZihaLnRhcmdldC5mKCkpO1ohPVkmJigwPD1ZJiZZPHJhLmxlbmd0aCYmKHJhW1ldLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFk9LTEpLDA8PVomJlo8cmEubGVuZ3RoJiYoWT1aLHJhW1ldLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksWC5HKEwoWCxZKSkpfSk7WC5HKEwoWCxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFope1guRyhMKFgsWikpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChPZChhKSl9LFFkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sVz1sOwpRZFswXWluIFd8fCJ1bmRlZmluZWQiPT10eXBlb2YgVy5leGVjU2NyaXB0fHxXLmV4ZWNTY3JpcHQoInZhciAiK1FkWzBdKTtmb3IodmFyIFJkO1FkLmxlbmd0aCYmKFJkPVFkLnNoaWZ0KCkpOylRZC5sZW5ndGh8fHZvaWQgMD09PVBkP1dbUmRdJiZXW1JkXSE9PU9iamVjdC5wcm90b3R5cGVbUmRdP1c9V1tSZF06Vz1XW1JkXT17fTpXW1JkXT1QZDt9KS5jYWxsKHRoaXMpOwovLyBjbGFuZy1mb3JtYXQgb24K", + "headers": [ + [ + "content-type", + "application/javascript" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + } + } + }, + "executionInfo": { + "elapsed": 12780, + "status": "ok", + "timestamp": 1600709620472, + "user": { + "displayName": "Evgeny Skvortsov", + "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhiQjODaOVLfYnUuWS9rB3LRntzJDM0hqElzsUkdQ=s64", + "userId": "11510585406840398626" + }, + "user_tz": 420 + }, + "id": "DznTm114TvD7", + "outputId": "51b443f3-5482-47be-bdf1-3d43db426538" + }, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"947df430-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id14\", \"tabNames\": [\"EmployeeName\", \"Engineer\", \"EngineersAndProductManagers\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_975af794ad" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"947e48c2-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id14\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_17ae683fe6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"947f9b64-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b0eed28ee0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_3", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"947ff014-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id14_content_3\");\n", + "//# sourceURL=js_0f3a805378" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_3", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"948035b0-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"947ff014-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_e83c926948" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_3", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"94808ae2-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id14\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_0aca471bb9" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_3", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running EmployeeName\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"94830f88-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"947f9b64-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_72aab863b5" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_3", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9484abc2-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_bd4fc0d6cd" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_0", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"94850068-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id14_content_0\");\n", + "//# sourceURL=js_b146eb7817" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_0", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"948554b4-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"94850068-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_014a6475d0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_0", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"94859546-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id14\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_6ff3d4b3ed" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_0", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_0", + "outputarea_id14", + "outputarea_id15", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_0", + "outputarea_id14", + "outputarea_id15", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_0", + "outputarea_id14", + "outputarea_id15", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"948745ee-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id15\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_551e5b649e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_0", + "outputarea_id14", + "outputarea_id15", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"94879274-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id15\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_8ac901ee73" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_0", + "outputarea_id14", + "outputarea_id15", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9488bc3a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_4d5a16ed30" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_0", + "id15_content_0", + "outputarea_id14", + "outputarea_id15", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"94890a28-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id15_content_0\");\n", + "//# sourceURL=js_16f8539b89" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_0", + "id15_content_0", + "outputarea_id14", + "outputarea_id15", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"94895c58-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"94890a28-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_8a07df2dd1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_0", + "id15_content_0", + "outputarea_id14", + "outputarea_id15", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"94899dee-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id15\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_e33b9b3989" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_0", + "id15_content_0", + "outputarea_id14", + "outputarea_id15", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mEmployeeName_sql\u001b[0m variable.\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " \"Alice\" AS name,\n", + " \"Product Manager\" AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Bob\" AS name,\n", + " \"Engineer\" AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Caroline\" AS name,\n", + " \"Engineer\" AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"David\" AS name,\n", + " \"Data Scientist\" AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Eve\" AS name,\n", + " \"Data Scientist\" AS role\n", + " \n", + ") )\n", + "SELECT\n", + " Employee.name AS name\n", + "FROM\n", + " t_0_Employee AS Employee;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"948abb2a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9488bc3a-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_89602749db" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_0", + "id15_content_0", + "outputarea_id14", + "outputarea_id15", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"948bfcc4-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9484abc2-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_16f8fe06ed" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_0", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"948d74dc-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_c19f86d57c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_3", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"948dc84c-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id14_content_3\");\n", + "//# sourceURL=js_0ae40777e1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_3", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"948e0aaa-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"948dc84c-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_6d6eec5de7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_3", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"948e9f9c-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id14\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_78f1c597b8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_3", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95181fd8-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"948d74dc-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_96ade85141" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_3", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"951af122-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_739f107e10" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_0", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"951b6e7c-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id14_content_0\");\n", + "//# sourceURL=js_725992ddbe" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_0", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"951bfa18-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"951b6e7c-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_5d5d89c4cb" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_0", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"951c51ca-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id14\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_8318e7752e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_0", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"951e75d6-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_0088d67e02" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_0", + "id15_content_1", + "outputarea_id14", + "outputarea_id15", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"951ec388-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id15_content_1\");\n", + "//# sourceURL=js_7359a41186" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_0", + "id15_content_1", + "outputarea_id14", + "outputarea_id15", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"951f0fc8-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"951ec388-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_ca33a5eb6a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_0", + "id15_content_1", + "outputarea_id14", + "outputarea_id15", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"951f69a0-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id15\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_09b2e700a2" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_0", + "id15_content_1", + "outputarea_id14", + "outputarea_id15", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mEmployeeName\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
name
0Alice
1Bob
2Caroline
3David
4Eve
\n", + "
" + ], + "text/plain": [ + " name\n", + "0 Alice\n", + "1 Bob\n", + "2 Caroline\n", + "3 David\n", + "4 Eve" + ] + }, + "metadata": { + "tags": [ + "id14_content_0", + "id15_content_1", + "outputarea_id14", + "outputarea_id15", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9521fe2c-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"951e75d6-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_4321f0fa1d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_0", + "id15_content_1", + "outputarea_id14", + "outputarea_id15", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95235588-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"951af122-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_ca811b871e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_0", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9524a8de-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_f8387e7e08" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_3", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9524ea74-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id14_content_3\");\n", + "//# sourceURL=js_7c34f2734e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_3", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95253006-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9524ea74-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_a4155975f8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_3", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"952570a2-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id14\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_61cdb91186" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_3", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running Engineer\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"95295834-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9524a8de-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_311bdfe601" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_3", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"952ab53a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_d2fe4d0356" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_1", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"952afa86-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id14_content_1\");\n", + "//# sourceURL=js_2a24e117c4" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_1", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"952b40b8-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"952afa86-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_9b11cc22ad" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_1", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"952b8564-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id14\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_2323809a76" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_1", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_1", + "outputarea_id14", + "outputarea_id16", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_1", + "outputarea_id14", + "outputarea_id16", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_1", + "outputarea_id14", + "outputarea_id16", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"952d2892-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id16\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_f672ca21ad" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_1", + "outputarea_id14", + "outputarea_id16", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"952d6b36-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id16\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_dc3078adb7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_1", + "outputarea_id14", + "outputarea_id16", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"952e92a4-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_57ed2f833d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_1", + "id16_content_0", + "outputarea_id14", + "outputarea_id16", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"952ed3b8-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id16_content_0\");\n", + "//# sourceURL=js_89091f9c01" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_1", + "id16_content_0", + "outputarea_id14", + "outputarea_id16", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"952f1440-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"952ed3b8-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_20edea2010" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_1", + "id16_content_0", + "outputarea_id14", + "outputarea_id16", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"952f5a40-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id16\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_37c1e6597e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_1", + "id16_content_0", + "outputarea_id14", + "outputarea_id16", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mEngineer_sql\u001b[0m variable.\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " \"Alice\" AS name,\n", + " \"Product Manager\" AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Bob\" AS name,\n", + " \"Engineer\" AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Caroline\" AS name,\n", + " \"Engineer\" AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"David\" AS name,\n", + " \"Data Scientist\" AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Eve\" AS name,\n", + " \"Data Scientist\" AS role\n", + " \n", + ") )\n", + "SELECT\n", + " Employee.name AS name\n", + "FROM\n", + " t_0_Employee AS Employee\n", + "WHERE\n", + " Employee.role = \"Engineer\";\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"95304e28-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"952e92a4-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_e3eb516385" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_1", + "id16_content_0", + "outputarea_id14", + "outputarea_id16", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"953160c4-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"952ab53a-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_1ae6f6bf2a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_1", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9532bae6-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_fb1d2d1ac1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_3", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9532fe52-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id14_content_3\");\n", + "//# sourceURL=js_480190b9ae" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_3", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95333fa2-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9532fe52-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_495897f5c3" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_3", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95338480-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id14\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_4a02a0c9af" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_3", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95a9926a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9532bae6-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_846ea1cc05" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_3", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95ac0478-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_cfa40e01a1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_1", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95ac5d1a-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id14_content_1\");\n", + "//# sourceURL=js_f4688a6e49" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_1", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95acb814-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"95ac5d1a-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_b3c8419273" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_1", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95ad10a2-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id14\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_b9c14f7977" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_1", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95ae53d6-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_7798062f16" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_1", + "id16_content_1", + "outputarea_id14", + "outputarea_id16", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95aea610-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id16_content_1\");\n", + "//# sourceURL=js_6f8b4e16a9" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_1", + "id16_content_1", + "outputarea_id14", + "outputarea_id16", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95aef1f6-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"95aea610-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_d2312f7a08" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_1", + "id16_content_1", + "outputarea_id14", + "outputarea_id16", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95af4ab6-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id16\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_03433d66a0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_1", + "id16_content_1", + "outputarea_id14", + "outputarea_id16", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mEngineer\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
name
0Bob
1Caroline
\n", + "
" + ], + "text/plain": [ + " name\n", + "0 Bob\n", + "1 Caroline" + ] + }, + "metadata": { + "tags": [ + "id14_content_1", + "id16_content_1", + "outputarea_id14", + "outputarea_id16", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95b2f65c-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"95ae53d6-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_b1677b2fc4" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_1", + "id16_content_1", + "outputarea_id14", + "outputarea_id16", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95b43832-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"95ac0478-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_a22ff4fc3d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_1", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95b5abe0-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b5adbedffe" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_3", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95b5ee0c-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id14_content_3\");\n", + "//# sourceURL=js_23f0bbb1d6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_3", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95b63f24-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"95b5ee0c-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_783377cfe8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_3", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95b689b6-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id14\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_75e15e6149" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_3", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running EngineersAndProductManagers\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"95b90a74-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"95b5abe0-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_8774959989" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_3", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95ba718e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_5105db6eb4" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_2", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95bac314-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id14_content_2\");\n", + "//# sourceURL=js_f290665692" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_2", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95bb1080-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"95bac314-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_8b851d1dfe" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_2", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95bb4f78-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id14\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_c2fa7afc47" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_2", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_2", + "outputarea_id14", + "outputarea_id17", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_2", + "outputarea_id14", + "outputarea_id17", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_2", + "outputarea_id14", + "outputarea_id17", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95bcf1fc-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id17\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_80d43e9eff" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_2", + "outputarea_id14", + "outputarea_id17", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95bd3162-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id17\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_dd479d0055" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_2", + "outputarea_id14", + "outputarea_id17", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95be614a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_0536c1dcf1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_2", + "id17_content_0", + "outputarea_id14", + "outputarea_id17", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95be9ed0-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id17_content_0\");\n", + "//# sourceURL=js_c5466fa1da" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_2", + "id17_content_0", + "outputarea_id14", + "outputarea_id17", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95bedd1e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"95be9ed0-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_41c0498c77" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_2", + "id17_content_0", + "outputarea_id14", + "outputarea_id17", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95bf32b4-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id17\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_8010d0f63b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_2", + "id17_content_0", + "outputarea_id14", + "outputarea_id17", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mEngineersAndProductManagers_sql\u001b[0m variable.\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " \"Alice\" AS name,\n", + " \"Product Manager\" AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Bob\" AS name,\n", + " \"Engineer\" AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Caroline\" AS name,\n", + " \"Engineer\" AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"David\" AS name,\n", + " \"Data Scientist\" AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Eve\" AS name,\n", + " \"Data Scientist\" AS role\n", + " \n", + ") )\n", + "SELECT\n", + " Employee.name AS name\n", + "FROM\n", + " t_0_Employee AS Employee\n", + "WHERE\n", + " (Employee.role = \"Engineer\" OR Employee.role = \"Product Manager\");\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"95c0bc10-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"95be614a-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_86732e2653" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_2", + "id17_content_0", + "outputarea_id14", + "outputarea_id17", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95c1dfe6-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"95ba718e-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_882cfe8a11" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_2", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95c34d86-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_41e13fbe2b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_3", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95c39f84-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id14_content_3\");\n", + "//# sourceURL=js_134f29969c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_3", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95c3eb24-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"95c39f84-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_593b48d777" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_3", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"95c42abc-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id14\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_eca9a6b602" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_3", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"962f8a32-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"95c34d86-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_10e962aca5" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_3", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9632db2e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_1ffd3a8579" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_2", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"96331940-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id14_content_2\");\n", + "//# sourceURL=js_260f571393" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_2", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"963377d2-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"96331940-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_79f3710b39" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_2", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9633d4ca-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id14\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_9f9e7bbd55" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_2", + "outputarea_id14" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"96355c00-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_03a7b68c62" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_2", + "id17_content_1", + "outputarea_id14", + "outputarea_id17", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9635a944-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id17_content_1\");\n", + "//# sourceURL=js_93db6504c1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_2", + "id17_content_1", + "outputarea_id14", + "outputarea_id17", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"96360556-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9635a944-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_8f89b1cc85" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_2", + "id17_content_1", + "outputarea_id14", + "outputarea_id17", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"963664a6-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id17\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_ab280486c2" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_2", + "id17_content_1", + "outputarea_id14", + "outputarea_id17", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mEngineersAndProductManagers\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
name
0Alice
1Bob
2Caroline
\n", + "
" + ], + "text/plain": [ + " name\n", + "0 Alice\n", + "1 Bob\n", + "2 Caroline" + ] + }, + "metadata": { + "tags": [ + "id14_content_2", + "id17_content_1", + "outputarea_id14", + "outputarea_id17", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"96391e76-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"96355c00-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_3abda6785f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_2", + "id17_content_1", + "outputarea_id14", + "outputarea_id17", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"963ab56a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9632db2e-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_6cfc458428" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id14_content_2", + "outputarea_id14" + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "%%logica EmployeeName, Engineer, EngineersAndProductManagers\n", + "\n", + "Employee(name: \"Alice\", role: \"Product Manager\");\n", + "Employee(name: \"Bob\", role: \"Engineer\");\n", + "Employee(name: \"Caroline\", role: \"Engineer\");\n", + "Employee(name: \"David\", role: \"Data Scientist\");\n", + "Employee(name: \"Eve\", role: \"Data Scientist\");\n", + "\n", + "EmployeeName(name:) :- Employee(name:);\n", + "\n", + "Engineer(name:) :- Employee(name:, role: \"Engineer\");\n", + "\n", + "EngineersAndProductManagers(name:) :-\n", + " Employee(name:, role:),\n", + " role == \"Engineer\" || role == \"Product Manager\";\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GA_MzWuURFKY" + }, + "source": [ + "Expression `..` is used to extract or emit a whole table row as one record." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 208, + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH0=", + "headers": [ + [ + "content-type", + "text/css" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgaCxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9ZnVuY3Rpb24oYSl7dmFyIGI9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmYVtTeW1ib2wuaXRlcmF0b3JdO3JldHVybiBiP2IuY2FsbChhKTp7bmV4dDphYShhKX19LGw9dGhpc3x8c2VsZixjYT1mdW5jdGlvbigpe30sZGE9ZnVuY3Rpb24oYSl7YS5CYT12b2lkIDA7YS5SPWZ1bmN0aW9uKCl7cmV0dXJuIGEuQmE/YS5CYTphLkJhPW5ldyBhfX0sZWE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7aWYoIm9iamVjdCI9PWIpaWYoYSl7aWYoYSBpbnN0YW5jZW9mIEFycmF5KXJldHVybiJhcnJheSI7aWYoYSBpbnN0YW5jZW9mIE9iamVjdClyZXR1cm4gYjt2YXIgYz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk7aWYoIltvYmplY3QgV2luZG93XSI9PWMpcmV0dXJuIm9iamVjdCI7CmlmKCJbb2JqZWN0IEFycmF5XSI9PWN8fCJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGgmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5zcGxpY2UmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoInNwbGljZSIpKXJldHVybiJhcnJheSI7aWYoIltvYmplY3QgRnVuY3Rpb25dIj09Y3x8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmNhbGwmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoImNhbGwiKSlyZXR1cm4iZnVuY3Rpb24ifWVsc2UgcmV0dXJuIm51bGwiO2Vsc2UgaWYoImZ1bmN0aW9uIj09YiYmInVuZGVmaW5lZCI9PXR5cGVvZiBhLmNhbGwpcmV0dXJuIm9iamVjdCI7cmV0dXJuIGJ9LGZhPWZ1bmN0aW9uKGEpe3JldHVybiJhcnJheSI9PWVhKGEpfSxoYT1mdW5jdGlvbihhKXt2YXIgYj1lYShhKTtyZXR1cm4iYXJyYXkiPT1ifHwib2JqZWN0Ij09CmImJiJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGh9LGlhPWZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PWVhKGEpfSxtPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBhO3JldHVybiJvYmplY3QiPT1iJiZudWxsIT1hfHwiZnVuY3Rpb24iPT1ifSxqYT0iY2xvc3VyZV91aWRfIisoMUU5Kk1hdGgucmFuZG9tKCk+Pj4wKSxrYT0wLGxhPWZ1bmN0aW9uKGEsYil7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe3ZhciBkPWMuc2xpY2UoKTtkLnB1c2guYXBwbHkoZCxhcmd1bWVudHMpO3JldHVybiBhLmFwcGx5KHRoaXMsZCl9fSxuPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe31jLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLmk9Yi5wcm90b3R5cGU7YS5wcm90b3R5cGU9bmV3IGM7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YX07dmFyIG1hLG5hPXtlYjoiYWN0aXZlZGVzY2VuZGFudCIsamI6ImF0b21pYyIsa2I6ImF1dG9jb21wbGV0ZSIsbWI6ImJ1c3kiLHBiOiJjaGVja2VkIixxYjoiY29saW5kZXgiLHZiOiJjb250cm9scyIseGI6ImRlc2NyaWJlZGJ5IixBYjoiZGlzYWJsZWQiLENiOiJkcm9wZWZmZWN0IixEYjoiZXhwYW5kZWQiLEViOiJmbG93dG8iLEdiOiJncmFiYmVkIixLYjoiaGFzcG9wdXAiLE1iOiJoaWRkZW4iLE9iOiJpbnZhbGlkIixQYjoibGFiZWwiLFFiOiJsYWJlbGxlZGJ5IixSYjoibGV2ZWwiLFdiOiJsaXZlIixrYzoibXVsdGlsaW5lIixsYzoibXVsdGlzZWxlY3RhYmxlIixwYzoib3JpZW50YXRpb24iLHFjOiJvd25zIixyYzoicG9zaW5zZXQiLHRjOiJwcmVzc2VkIix4YzoicmVhZG9ubHkiLHpjOiJyZWxldmFudCIsQWM6InJlcXVpcmVkIixFYzoicm93aW5kZXgiLEhjOiJzZWxlY3RlZCIsSmM6InNldHNpemUiLExjOiJzb3J0IixaYzoidmFsdWVtYXgiLCRjOiJ2YWx1ZW1pbiIsYWQ6InZhbHVlbm93IiwKYmQ6InZhbHVldGV4dCJ9O3ZhciBvYT1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkIGluIGEpYi5jYWxsKGMsYVtkXSxkLGEpfSxwYT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyBpbiBhKWlmKGFbY109PWIpcmV0dXJuITA7cmV0dXJuITF9LHFhPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsIT09YSYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfSxzYT1mdW5jdGlvbihhKXt2YXIgYj17fSxjO2ZvcihjIGluIGEpYlthW2NdXT1jO3JldHVybiBifSx0YT0iY29uc3RydWN0b3IgaGFzT3duUHJvcGVydHkgaXNQcm90b3R5cGVPZiBwcm9wZXJ0eUlzRW51bWVyYWJsZSB0b0xvY2FsZVN0cmluZyB0b1N0cmluZyB2YWx1ZU9mIi5zcGxpdCgiICIpLHVhPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8dGEubGVuZ3RoO2YrKyljPQp0YVtmXSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZCxjKSYmKGFbY109ZFtjXSl9fTt2YXIgdmE9e2ZiOiJhbGVydCIsZ2I6ImFsZXJ0ZGlhbG9nIixoYjoiYXBwbGljYXRpb24iLGliOiJhcnRpY2xlIixsYjoiYmFubmVyIixuYjoiYnV0dG9uIixvYjoiY2hlY2tib3giLHJiOiJjb2x1bW5oZWFkZXIiLHNiOiJjb21ib2JveCIsdGI6ImNvbXBsZW1lbnRhcnkiLHViOiJjb250ZW50aW5mbyIsd2I6ImRlZmluaXRpb24iLHliOiJkaWFsb2ciLHpiOiJkaXJlY3RvcnkiLEJiOiJkb2N1bWVudCIsRmI6ImZvcm0iLEhiOiJncmlkIixJYjoiZ3JpZGNlbGwiLEpiOiJncm91cCIsTGI6ImhlYWRpbmciLE5iOiJpbWciLFNiOiJsaW5rIixUYjoibGlzdCIsVWI6Imxpc3Rib3giLFZiOiJsaXN0aXRlbSIsWGI6ImxvZyIsWWI6Im1haW4iLFpiOiJtYXJxdWVlIiwkYjoibWF0aCIsYWM6Im1lbnUiLGJjOiJtZW51YmFyIixjYzoibWVudWl0ZW0iLGRjOiJtZW51aXRlbWNoZWNrYm94IixlYzoibWVudWl0ZW1yYWRpbyIsbWM6Im5hdmlnYXRpb24iLG5jOiJub3RlIixvYzoib3B0aW9uIiwKc2M6InByZXNlbnRhdGlvbiIsdWM6InByb2dyZXNzYmFyIix2YzoicmFkaW8iLHdjOiJyYWRpb2dyb3VwIix5YzoicmVnaW9uIixCYzoicm93IixDYzoicm93Z3JvdXAiLERjOiJyb3doZWFkZXIiLEZjOiJzY3JvbGxiYXIiLEdjOiJzZWFyY2giLEljOiJzZXBhcmF0b3IiLEtjOiJzbGlkZXIiLE1jOiJzcGluYnV0dG9uIixOYzoic3RhdHVzIixPYzoidGFiIixQYzoidGFibGlzdCIsUWM6InRhYnBhbmVsIixSYzoidGV4dGJveCIsU2M6InRleHRpbmZvIixUYzoidGltZXIiLFVjOiJ0b29sYmFyIixWYzoidG9vbHRpcCIsV2M6InRyZWUiLFhjOiJ0cmVlZ3JpZCIsWWM6InRyZWVpdGVtIn07dmFyIHdhPWZ1bmN0aW9uKGEpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsd2EpO2Vsc2V7dmFyIGI9RXJyb3IoKS5zdGFjaztiJiYodGhpcy5zdGFjaz1iKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSl9O24od2EsRXJyb3IpO3dhLnByb3RvdHlwZS5uYW1lPSJDdXN0b21FcnJvciI7dmFyIHhhO3ZhciB5YT1mdW5jdGlvbihhLGIpe2E9YS5zcGxpdCgiJXMiKTtmb3IodmFyIGM9IiIsZD1hLmxlbmd0aC0xLGU9MDtlPGQ7ZSsrKWMrPWFbZV0rKGU8Yi5sZW5ndGg/YltlXToiJXMiKTt3YS5jYWxsKHRoaXMsYythW2RdKX07bih5YSx3YSk7eWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjsKdmFyIHphPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSJBc3NlcnRpb24gZmFpbGVkIjtpZihjKXtlKz0iOiAiK2M7dmFyIGY9ZH1lbHNlIGEmJihlKz0iOiAiK2EsZj1iKTt0aHJvdyBuZXcgeWEoIiIrZSxmfHxbXSk7fSxxPWZ1bmN0aW9uKGEsYixjKXthfHx6YSgiIixudWxsLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX0sQWE9ZnVuY3Rpb24oYSxiLGMpe20oYSkmJjE9PWEubm9kZVR5cGV8fHphKCJFeHBlY3RlZCBFbGVtZW50IGJ1dCBnb3QgJXM6ICVzLiIsW2VhKGEpLGFdLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKX0sQ2E9ZnVuY3Rpb24oYSxiLGMsZCl7YSBpbnN0YW5jZW9mIGJ8fHphKCJFeHBlY3RlZCBpbnN0YW5jZW9mICVzIGJ1dCBnb3QgJXMuIixbQmEoYiksQmEoYSldLGMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpKX0sQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZgpGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTpudWxsPT09YT8ibnVsbCI6dHlwZW9mIGF9O3ZhciBEYT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3EobnVsbCE9YS5sZW5ndGgpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKCJzdHJpbmciPT09dHlwZW9mIGEpcmV0dXJuInN0cmluZyIhPT10eXBlb2YgYnx8MSE9Yi5sZW5ndGg/LTE6YS5pbmRleE9mKGIsMCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspaWYoYyBpbiBhJiZhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX0scj1BcnJheS5wcm90b3R5cGUuZm9yRWFjaD9mdW5jdGlvbihhLGIsYyl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsYyl9OmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9YS5sZW5ndGgsZT0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZj0wO2Y8ZDtmKyspZiBpbiBlJiZiLmNhbGwoYyxlW2ZdLGYsYSl9LEVhPUFycmF5LnByb3RvdHlwZS5maWx0ZXI/CmZ1bmN0aW9uKGEsYil7cShudWxsIT1hLmxlbmd0aCk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD1bXSxlPTAsZj0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZz0wO2c8YztnKyspaWYoZyBpbiBmKXt2YXIgaz1mW2ddO2IuY2FsbCh2b2lkIDAsayxnLGEpJiYoZFtlKytdPWspfXJldHVybiBkfSxGYT1BcnJheS5wcm90b3R5cGUuZXZlcnk/ZnVuY3Rpb24oYSxiKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmV2ZXJ5LmNhbGwoYSxiLHZvaWQgMCl9OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWEubGVuZ3RoLGQ9InN0cmluZyI9PT10eXBlb2YgYT9hLnNwbGl0KCIiKTphLGU9MDtlPGM7ZSsrKWlmKGUgaW4gZCYmIWIuY2FsbCh2b2lkIDAsZFtlXSxlLGEpKXJldHVybiExO3JldHVybiEwfSxHYT1mdW5jdGlvbihhLGIpe3JldHVybiAwPD0KRGEoYSxiKX0sSGE9ZnVuY3Rpb24oYSxiKXtiPURhKGEsYik7dmFyIGM7aWYoYz0wPD1iKXEobnVsbCE9YS5sZW5ndGgpLEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhLGIsMSk7cmV0dXJuIGN9LElhPWZ1bmN0aW9uKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGFyZ3VtZW50cyl9LEphPWZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDA8Yil7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX0sTGE9ZnVuY3Rpb24oYSxiLGMsZCl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShhLEthKGFyZ3VtZW50cywxKSl9LEthPWZ1bmN0aW9uKGEsYixjKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gMj49YXJndW1lbnRzLmxlbmd0aD9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsYixjKX07dmFyIE1hPVN0cmluZy5wcm90b3R5cGUudHJpbT9mdW5jdGlvbihhKXtyZXR1cm4gYS50cmltKCl9OmZ1bmN0aW9uKGEpe3JldHVybi9eW1xzXHhhMF0qKFtcc1xTXSo/KVtcc1x4YTBdKiQvLmV4ZWMoYSlbMV19LE5hPS8mL2csT2E9LzwvZyxQYT0vPi9nLFFhPS8iL2csUmE9LycvZyxTYT0vXHgwMC9nLFRhPS9bXHgwMCY8PiInXS8sdD1mdW5jdGlvbihhLGIpe3JldHVybi0xIT1hLmluZGV4T2YoYil9LFVhPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE8Yj8tMTphPmI/MTowfTt2YXIgdTthOnt2YXIgVmE9bC5uYXZpZ2F0b3I7aWYoVmEpe3ZhciBXYT1WYS51c2VyQWdlbnQ7aWYoV2Epe3U9V2E7YnJlYWsgYX19dT0iIn07LyoKCiBDb3B5cmlnaHQgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzLgogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKKi8KdmFyIFhhPWZ1bmN0aW9uKGEpe1RhLnRlc3QoYSkmJigtMSE9YS5pbmRleE9mKCImIikmJihhPWEucmVwbGFjZShOYSwiJmFtcDsiKSksLTEhPWEuaW5kZXhPZigiPCIpJiYoYT1hLnJlcGxhY2UoT2EsIiZsdDsiKSksLTEhPWEuaW5kZXhPZigiPiIpJiYoYT1hLnJlcGxhY2UoUGEsIiZndDsiKSksLTEhPWEuaW5kZXhPZignIicpJiYoYT1hLnJlcGxhY2UoUWEsIiZxdW90OyIpKSwtMSE9YS5pbmRleE9mKCInIikmJihhPWEucmVwbGFjZShSYSwiJiMzOTsiKSksLTEhPWEuaW5kZXhPZigiXHgwMCIpJiYoYT1hLnJlcGxhY2UoU2EsIiYjMDsiKSkpO3JldHVybiBhfTt2YXIgWWE9ZnVuY3Rpb24oYSl7WWFbIiAiXShhKTtyZXR1cm4gYX07WWFbIiAiXT1jYTt2YXIgJGE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1aYTtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsYSk/Y1thXTpjW2FdPWIoYSl9O3ZhciBhYj10KHUsIk9wZXJhIiksdj10KHUsIlRyaWRlbnQiKXx8dCh1LCJNU0lFIiksYmI9dCh1LCJFZGdlIikseD10KHUsIkdlY2tvIikmJiEodCh1LnRvTG93ZXJDYXNlKCksIndlYmtpdCIpJiYhdCh1LCJFZGdlIikpJiYhKHQodSwiVHJpZGVudCIpfHx0KHUsIk1TSUUiKSkmJiF0KHUsIkVkZ2UiKSx5PXQodS50b0xvd2VyQ2FzZSgpLCJ3ZWJraXQiKSYmIXQodSwiRWRnZSIpLHo9dCh1LCJNYWNpbnRvc2giKSxjYj1mdW5jdGlvbigpe3ZhciBhPWwuZG9jdW1lbnQ7cmV0dXJuIGE/YS5kb2N1bWVudE1vZGU6dm9pZCAwfSxkYjsKYTp7dmFyIGViPSIiLGZiPWZ1bmN0aW9uKCl7dmFyIGE9dTtpZih4KXJldHVybi9ydjooW15cKTtdKykoXCl8OykvLmV4ZWMoYSk7aWYoYmIpcmV0dXJuL0VkZ2VcLyhbXGRcLl0rKS8uZXhlYyhhKTtpZih2KXJldHVybi9cYig/Ok1TSUV8cnYpWzogXShbXlwpO10rKShcKXw7KS8uZXhlYyhhKTtpZih5KXJldHVybi9XZWJLaXRcLyhcUyspLy5leGVjKGEpO2lmKGFiKXJldHVybi8oPzpWZXJzaW9uKVsgXC9dPyhcUyspLy5leGVjKGEpfSgpO2ZiJiYoZWI9ZmI/ZmJbMV06IiIpO2lmKHYpe3ZhciBnYj1jYigpO2lmKG51bGwhPWdiJiZnYj5wYXJzZUZsb2F0KGViKSl7ZGI9U3RyaW5nKGdiKTticmVhayBhfX1kYj1lYn0KdmFyIGhiPWRiLFphPXt9LEE9ZnVuY3Rpb24oYSl7cmV0dXJuICRhKGEsZnVuY3Rpb24oKXtmb3IodmFyIGI9MCxjPU1hKFN0cmluZyhoYikpLnNwbGl0KCIuIiksZD1NYShTdHJpbmcoYSkpLnNwbGl0KCIuIiksZT1NYXRoLm1heChjLmxlbmd0aCxkLmxlbmd0aCksZj0wOzA9PWImJmY8ZTtmKyspe3ZhciBnPWNbZl18fCIiLGs9ZFtmXXx8IiI7ZG97Zz0vKFxkKikoXEQqKSguKikvLmV4ZWMoZyl8fFsiIiwiIiwiIiwiIl07az0vKFxkKikoXEQqKSguKikvLmV4ZWMoayl8fFsiIiwiIiwiIiwiIl07aWYoMD09Z1swXS5sZW5ndGgmJjA9PWtbMF0ubGVuZ3RoKWJyZWFrO2I9VWEoMD09Z1sxXS5sZW5ndGg/MDpwYXJzZUludChnWzFdLDEwKSwwPT1rWzFdLmxlbmd0aD8wOnBhcnNlSW50KGtbMV0sMTApKXx8VWEoMD09Z1syXS5sZW5ndGgsMD09a1syXS5sZW5ndGgpfHxVYShnWzJdLGtbMl0pO2c9Z1szXTtrPWtbM119d2hpbGUoMD09Yil9cmV0dXJuIDA8PWJ9KX0saWI7CmliPWwuZG9jdW1lbnQmJnY/Y2IoKTp2b2lkIDA7dmFyIGpiPSF2fHw5PD1OdW1iZXIoaWIpO3ZhciBsYj1mdW5jdGlvbihhLGIpe29hKGIsZnVuY3Rpb24oYyxkKXtjJiYib2JqZWN0Ij09dHlwZW9mIGMmJmMuZGQmJihjPWMuY2QoKSk7InN0eWxlIj09ZD9hLnN0eWxlLmNzc1RleHQ9YzoiY2xhc3MiPT1kP2EuY2xhc3NOYW1lPWM6ImZvciI9PWQ/YS5odG1sRm9yPWM6a2IuaGFzT3duUHJvcGVydHkoZCk/YS5zZXRBdHRyaWJ1dGUoa2JbZF0sYyk6MD09ZC5sYXN0SW5kZXhPZigiYXJpYS0iLDApfHwwPT1kLmxhc3RJbmRleE9mKCJkYXRhLSIsMCk/YS5zZXRBdHRyaWJ1dGUoZCxjKTphW2RdPWN9KX0sa2I9e2NlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjb2xzcGFuOiJjb2xTcGFuIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGhlaWdodDoiaGVpZ2h0IixtYXhsZW5ndGg6Im1heExlbmd0aCIsbm9uY2U6Im5vbmNlIixyb2xlOiJyb2xlIixyb3dzcGFuOiJyb3dTcGFuIix0eXBlOiJ0eXBlIix1c2VtYXA6InVzZU1hcCIsdmFsaWduOiJ2QWxpZ24iLAp3aWR0aDoid2lkdGgifSxtYj1mdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChrKXtrJiZiLmFwcGVuZENoaWxkKCJzdHJpbmciPT09dHlwZW9mIGs/YS5jcmVhdGVUZXh0Tm9kZShrKTprKX1mb3IodmFyIGU9MjtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXTtpZighaGEoZil8fG0oZikmJjA8Zi5ub2RlVHlwZSlkKGYpO2Vsc2V7YTp7aWYoZiYmIm51bWJlciI9PXR5cGVvZiBmLmxlbmd0aCl7aWYobShmKSl7dmFyIGc9ImZ1bmN0aW9uIj09dHlwZW9mIGYuaXRlbXx8InN0cmluZyI9PXR5cGVvZiBmLml0ZW07YnJlYWsgYX1pZihpYShmKSl7Zz0iZnVuY3Rpb24iPT10eXBlb2YgZi5pdGVtO2JyZWFrIGF9fWc9ITF9cihnP0phKGYpOmYsZCl9fX0sbmI9ZnVuY3Rpb24oYSxiKXtiPVN0cmluZyhiKTsiYXBwbGljYXRpb24veGh0bWwreG1sIj09PWEuY29udGVudFR5cGUmJihiPWIudG9Mb3dlckNhc2UoKSk7cmV0dXJuIGEuY3JlYXRlRWxlbWVudChiKX0sb2I9ZnVuY3Rpb24oYSl7YSYmCmEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpfSxwYj1mdW5jdGlvbihhLGIpe2lmKCFhfHwhYilyZXR1cm4hMTtpZihhLmNvbnRhaW5zJiYxPT1iLm5vZGVUeXBlKXJldHVybiBhPT1ifHxhLmNvbnRhaW5zKGIpO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbilyZXR1cm4gYT09Ynx8ISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNik7Zm9yKDtiJiZhIT1iOyliPWIucGFyZW50Tm9kZTtyZXR1cm4gYj09YX0scWI9ZnVuY3Rpb24oYSl7cShhLCJOb2RlIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4iKTtyZXR1cm4gOT09YS5ub2RlVHlwZT9hOmEub3duZXJEb2N1bWVudHx8YS5kb2N1bWVudH0scmI9ZnVuY3Rpb24oYSxiKXtiP2EudGFiSW5kZXg9MDooYS50YWJJbmRleD0tMSxhLnJlbW92ZUF0dHJpYnV0ZSgidGFiSW5kZXgiKSl9LHNiPWZ1bmN0aW9uKGEpe3JldHVybiB2JiYhQSgiOSIpPyhhPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKSwKbnVsbCE9YSYmYS5zcGVjaWZpZWQpOmEuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpfSx0Yj1mdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgYSYmMDw9YSYmMzI3Njg+YX0sdWI9ZnVuY3Rpb24oYSl7dGhpcy5hPWF8fGwuZG9jdW1lbnR8fGRvY3VtZW50fTt1Yi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBhP3RoaXMuYS5nZXRFbGVtZW50QnlJZChhKTphfTsKdWIucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuYSxlPWFyZ3VtZW50cyxmPVN0cmluZyhlWzBdKSxnPWVbMV07aWYoIWpiJiZnJiYoZy5uYW1lfHxnLnR5cGUpKXtmPVsiPCIsZl07Zy5uYW1lJiZmLnB1c2goJyBuYW1lPSInLFhhKGcubmFtZSksJyInKTtpZihnLnR5cGUpe2YucHVzaCgnIHR5cGU9IicsWGEoZy50eXBlKSwnIicpO3ZhciBrPXt9O3VhKGssZyk7ZGVsZXRlIGsudHlwZTtnPWt9Zi5wdXNoKCI+Iik7Zj1mLmpvaW4oIiIpfWY9bmIoZCxmKTtnJiYoInN0cmluZyI9PT10eXBlb2YgZz9mLmNsYXNzTmFtZT1nOmZhKGcpP2YuY2xhc3NOYW1lPWcuam9pbigiICIpOmxiKGYsZykpOzI8ZS5sZW5ndGgmJm1iKGQsZixlKTtyZXR1cm4gZn07dmFyIHZiPWZ1bmN0aW9uKGEsYil7Yj8ocShwYSh2YSxiKSwiTm8gc3VjaCBBUklBIHJvbGUgIitiKSxhLnNldEF0dHJpYnV0ZSgicm9sZSIsYikpOmEucmVtb3ZlQXR0cmlidXRlKCJyb2xlIil9LHhiPWZ1bmN0aW9uKGEsYixjKXtmYShjKSYmKGM9Yy5qb2luKCIgIikpO3ZhciBkPXdiKGIpOyIiPT09Y3x8dm9pZCAwPT1jPyhtYXx8KG1hPXthdG9taWM6ITEsYXV0b2NvbXBsZXRlOiJub25lIixkcm9wZWZmZWN0OiJub25lIixoYXNwb3B1cDohMSxsaXZlOiJvZmYiLG11bHRpbGluZTohMSxtdWx0aXNlbGVjdGFibGU6ITEsb3JpZW50YXRpb246InZlcnRpY2FsIixyZWFkb25seTohMSxyZWxldmFudDoiYWRkaXRpb25zIHRleHQiLHJlcXVpcmVkOiExLHNvcnQ6Im5vbmUiLGJ1c3k6ITEsZGlzYWJsZWQ6ITEsaGlkZGVuOiExLGludmFsaWQ6ImZhbHNlIn0pLGM9bWEsYiBpbiBjP2Euc2V0QXR0cmlidXRlKGQsY1tiXSk6YS5yZW1vdmVBdHRyaWJ1dGUoZCkpOmEuc2V0QXR0cmlidXRlKGQsCmMpfSx3Yj1mdW5jdGlvbihhKXtxKGEsIkFSSUEgYXR0cmlidXRlIGNhbm5vdCBiZSBlbXB0eS4iKTtxKHBhKG5hLGEpLCJObyBzdWNoIEFSSUEgYXR0cmlidXRlICIrYSk7cmV0dXJuImFyaWEtIithfTt2YXIgeWI9T2JqZWN0LmZyZWV6ZXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O3ZhciBDPWZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVTt0aGlzLko9dGhpcy5KfTtDLnByb3RvdHlwZS5VPSExO0MucHJvdG90eXBlLk49ZnVuY3Rpb24oKXt0aGlzLlV8fCh0aGlzLlU9ITAsdGhpcy51KCkpfTt2YXIgemI9ZnVuY3Rpb24oYSxiKXthLlU/YigpOihhLkp8fChhLko9W10pLGEuSi5wdXNoKGIpKX07Qy5wcm90b3R5cGUudT1mdW5jdGlvbigpe2lmKHRoaXMuSilmb3IoO3RoaXMuSi5sZW5ndGg7KXRoaXMuSi5zaGlmdCgpKCl9O3ZhciBBYj1mdW5jdGlvbihhKXthJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5OJiZhLk4oKX07dmFyIEJiPWZ1bmN0aW9uKGEpe3JldHVybiJzdHJpbmciPT10eXBlb2YgYS5jbGFzc05hbWU/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sRD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6QmIoYSkubWF0Y2goL1xTKy9nKXx8W119LENiPWZ1bmN0aW9uKGEsYil7InN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZT9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxEYj1mdW5jdGlvbihhLGIpe3JldHVybiBhLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5jb250YWlucyhiKTpHYShEKGEpLGIpfSxFYj1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFEYihhLGIpKXt2YXIgYz1CYihhKTtDYihhLGMrKDA8Yy5sZW5ndGg/IiAiK2I6YikpfX0sRmI9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClyKGIsCmZ1bmN0aW9uKGUpe0ViKGEsZSl9KTtlbHNle3ZhciBjPXt9O3IoRChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7cihiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPTA8Yi5sZW5ndGg/IiAiK2Q6ZDtDYihhLGIpfX0sR2I9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6RGIoYSxiKSYmQ2IoYSxFYShEKGEpLGZ1bmN0aW9uKGMpe3JldHVybiBjIT1ifSkuam9pbigiICIpKX0sSGI9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9yKGIsZnVuY3Rpb24oYyl7R2IoYSxjKX0pOkNiKGEsRWEoRChhKSxmdW5jdGlvbihjKXtyZXR1cm4hR2EoYixjKX0pLmpvaW4oIiAiKSl9O3ZhciBJYj0hdnx8OTw9TnVtYmVyKGliKSxKYj0hdnx8OTw9TnVtYmVyKGliKSxLYj12JiYhQSgiOSIpLExiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e2wuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsY2EsYiksbC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjYSxiKX1jYXRjaChjKXt9cmV0dXJuIGF9KCk7dmFyIEU9ZnVuY3Rpb24oYSxiKXt0aGlzLnR5cGU9YTt0aGlzLmE9dGhpcy50YXJnZXQ9Yjt0aGlzLmg9ITE7dGhpcy5LYT0hMH07RS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuaD0hMH07RS5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3RoaXMuS2E9ITF9O3ZhciBGPXtMOiJtb3VzZWRvd24iLE06Im1vdXNldXAiLGFhOiJtb3VzZWNhbmNlbCIsaGM6Im1vdXNlbW92ZSIsamM6Im1vdXNlb3ZlciIsaWM6Im1vdXNlb3V0IixmYzoibW91c2VlbnRlciIsZ2M6Im1vdXNlbGVhdmUifTt2YXIgRz1mdW5jdGlvbihhLGIpe0UuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy5hPXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5jPTA7dGhpcy5BPXRoaXMubWV0YUtleT10aGlzLnNoaWZ0S2V5PXRoaXMuYWx0S2V5PXRoaXMuY3RybEtleT0hMTt0aGlzLnBvaW50ZXJJZD0wO3RoaXMucG9pbnRlclR5cGU9IiI7dGhpcy5iPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMuYT1iO2lmKGI9YS5yZWxhdGVkVGFyZ2V0KXtpZih4KXthOnt0cnl7WWEoYi5ub2RlTmFtZSk7dmFyIGU9ITA7YnJlYWsgYX1jYXRjaChmKXt9ZT0KITF9ZXx8KGI9bnVsbCl9fWVsc2UibW91c2VvdmVyIj09Yz9iPWEuZnJvbUVsZW1lbnQ6Im1vdXNlb3V0Ij09YyYmKGI9YS50b0VsZW1lbnQpO3RoaXMucmVsYXRlZFRhcmdldD1iO2Q/KHRoaXMuY2xpZW50WD12b2lkIDAhPT1kLmNsaWVudFg/ZC5jbGllbnRYOmQucGFnZVgsdGhpcy5jbGllbnRZPXZvaWQgMCE9PWQuY2xpZW50WT9kLmNsaWVudFk6ZC5wYWdlWSx0aGlzLnNjcmVlblg9ZC5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1kLnNjcmVlbll8fDApOih0aGlzLmNsaWVudFg9dm9pZCAwIT09YS5jbGllbnRYP2EuY2xpZW50WDphLnBhZ2VYLHRoaXMuY2xpZW50WT12b2lkIDAhPT1hLmNsaWVudFk/YS5jbGllbnRZOmEucGFnZVksdGhpcy5zY3JlZW5YPWEuc2NyZWVuWHx8MCx0aGlzLnNjcmVlblk9YS5zY3JlZW5ZfHwwKTt0aGlzLmJ1dHRvbj1hLmJ1dHRvbjt0aGlzLmM9YS5rZXlDb2RlfHwwO3RoaXMua2V5PWEua2V5fHwiIjt0aGlzLmN0cmxLZXk9YS5jdHJsS2V5O3RoaXMuYWx0S2V5PQphLmFsdEtleTt0aGlzLnNoaWZ0S2V5PWEuc2hpZnRLZXk7dGhpcy5tZXRhS2V5PWEubWV0YUtleTt0aGlzLkE9ej9hLm1ldGFLZXk6YS5jdHJsS2V5O3RoaXMucG9pbnRlcklkPWEucG9pbnRlcklkfHwwO3RoaXMucG9pbnRlclR5cGU9InN0cmluZyI9PT10eXBlb2YgYS5wb2ludGVyVHlwZT9hLnBvaW50ZXJUeXBlOk1iW2EucG9pbnRlclR5cGVdfHwiIjt0aGlzLmI9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnRoaXMuZygpfX07bihHLEUpO3ZhciBOYj15YihbMSw0LDJdKSxNYj15Yih7MjoidG91Y2giLDM6InBlbiIsNDoibW91c2UifSksT2I9ZnVuY3Rpb24oYSl7cmV0dXJuIEliPzA9PWEuYi5idXR0b246ImNsaWNrIj09YS50eXBlPyEwOiEhKGEuYi5idXR0b24mTmJbMF0pfTtHLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7Ry5pLmouY2FsbCh0aGlzKTt0aGlzLmIuc3RvcFByb3BhZ2F0aW9uP3RoaXMuYi5zdG9wUHJvcGFnYXRpb24oKTp0aGlzLmIuY2FuY2VsQnViYmxlPSEwfTsKRy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe0cuaS5nLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5iO2lmKGEucHJldmVudERlZmF1bHQpYS5wcmV2ZW50RGVmYXVsdCgpO2Vsc2UgaWYoYS5yZXR1cm5WYWx1ZT0hMSxLYil0cnl7aWYoYS5jdHJsS2V5fHwxMTI8PWEua2V5Q29kZSYmMTIzPj1hLmtleUNvZGUpYS5rZXlDb2RlPS0xfWNhdGNoKGIpe319O3ZhciBQYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKDFFNipNYXRoLnJhbmRvbSgpfDApLFFiPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW1BiXSl9LFJiPTA7dmFyIFNiPWZ1bmN0aW9uKGEsYixjLGQsZSl7dGhpcy5saXN0ZW5lcj1hO3RoaXMuYT1udWxsO3RoaXMuc3JjPWI7dGhpcy50eXBlPWM7dGhpcy5jYXB0dXJlPSEhZDt0aGlzLm1hPWU7dGhpcy5rZXk9KytSYjt0aGlzLlg9dGhpcy5oYT0hMX0sVGI9ZnVuY3Rpb24oYSl7YS5YPSEwO2EubGlzdGVuZXI9bnVsbDthLmE9bnVsbDthLnNyYz1udWxsO2EubWE9bnVsbH07dmFyIFViPWZ1bmN0aW9uKGEpe3RoaXMuc3JjPWE7dGhpcy5hPXt9O3RoaXMuYj0wfTtVYi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS50b1N0cmluZygpO2E9dGhpcy5hW2ZdO2F8fChhPXRoaXMuYVtmXT1bXSx0aGlzLmIrKyk7dmFyIGc9VmIoYSxiLGQsZSk7LTE8Zz8oYj1hW2ddLGN8fChiLmhhPSExKSk6KGI9bmV3IFNiKGIsdGhpcy5zcmMsZiwhIWQsZSksYi5oYT1jLGEucHVzaChiKSk7cmV0dXJuIGJ9Owp2YXIgV2I9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLnR5cGU7YyBpbiBhLmEmJkhhKGEuYVtjXSxiKSYmKFRiKGIpLDA9PWEuYVtjXS5sZW5ndGgmJihkZWxldGUgYS5hW2NdLGEuYi0tKSl9LFhiPWZ1bmN0aW9uKGEsYixjLGQsZSl7YT1hLmFbYi50b1N0cmluZygpXTtiPS0xO2EmJihiPVZiKGEsYyxkLGUpKTtyZXR1cm4tMTxiP2FbYl06bnVsbH0sVmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuWCYmZi5saXN0ZW5lcj09YiYmZi5jYXB0dXJlPT0hIWMmJmYubWE9PWQpcmV0dXJuIGV9cmV0dXJuLTF9O3ZhciBZYj0iY2xvc3VyZV9sbV8iKygxRTYqTWF0aC5yYW5kb20oKXwwKSxaYj17fSwkYj0wLGJjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZCYmZC5vbmNlKXJldHVybiBhYyhhLGIsYyxkLGUpO2lmKGZhKGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyliYyhhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9Y2MoYyk7cmV0dXJuIFFiKGEpP2RjKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOmVjKGEsYixjLCExLGQsZSl9LGVjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGc9bShlKT8hIWUuY2FwdHVyZTohIWUsaz1mYyhhKTtrfHwoYVtZYl09az1uZXcgVWIoYSkpO2M9ay5hZGQoYixjLGQsZyxmKTtpZihjLmEpcmV0dXJuIGM7ZD1nYygpO2MuYT1kO2Quc3JjPWE7ZC5saXN0ZW5lcj1jO2lmKGEuYWRkRXZlbnRMaXN0ZW5lcilMYnx8KGU9Zyksdm9pZCAwPT09ZSYmKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksCmQsZSk7ZWxzZSBpZihhLmF0dGFjaEV2ZW50KWEuYXR0YWNoRXZlbnQoaGMoYi50b1N0cmluZygpKSxkKTtlbHNlIGlmKGEuYWRkTGlzdGVuZXImJmEucmVtb3ZlTGlzdGVuZXIpcSgiY2hhbmdlIj09PWIsIk1lZGlhUXVlcnlMaXN0IG9ubHkgaGFzIGEgY2hhbmdlIGV2ZW50IiksYS5hZGRMaXN0ZW5lcihkKTtlbHNlIHRocm93IEVycm9yKCJhZGRFdmVudExpc3RlbmVyIGFuZCBhdHRhY2hFdmVudCBhcmUgdW5hdmFpbGFibGUuIik7JGIrKztyZXR1cm4gY30sZ2M9ZnVuY3Rpb24oKXt2YXIgYT1pYyxiPUpiP2Z1bmN0aW9uKGMpe3JldHVybiBhLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKX06ZnVuY3Rpb24oYyl7Yz1hLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKTtpZighYylyZXR1cm4gY307cmV0dXJuIGJ9LGFjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZmEoYikpe2Zvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWFjKGEsYltmXSxjLGQsZSk7cmV0dXJuIG51bGx9Yz1jYyhjKTtyZXR1cm4gUWIoYSk/CmEuaC5hZGQoU3RyaW5nKGIpLGMsITAsbShkKT8hIWQuY2FwdHVyZTohIWQsZSk6ZWMoYSxiLGMsITAsZCxlKX0samM9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihmYShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylqYyhhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPWNjKGMpLFFiKGEpPyhhPWEuaCxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5hJiYoZj1hLmFbYl0sYz1WYihmLGMsZCxlKSwtMTxjJiYoVGIoZltjXSkscShudWxsIT1mLmxlbmd0aCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSwwPT1mLmxlbmd0aCYmKGRlbGV0ZSBhLmFbYl0sYS5iLS0pKSkpOmEmJihhPWZjKGEpKSYmKGM9WGIoYSxiLGMsZCxlKSkmJmtjKGMpfSxrYz1mdW5jdGlvbihhKXtpZigibnVtYmVyIiE9PXR5cGVvZiBhJiZhJiYhYS5YKXt2YXIgYj1hLnNyYztpZihRYihiKSlXYihiLmgsYSk7ZWxzZXt2YXIgYz1hLnR5cGUsZD1hLmE7Yi5yZW1vdmVFdmVudExpc3RlbmVyPwpiLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KGhjKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7JGItLTsoYz1mYyhiKSk/KFdiKGMsYSksMD09Yy5iJiYoYy5zcmM9bnVsbCxiW1liXT1udWxsKSk6VGIoYSl9fX0saGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gWmI/WmJbYV06WmJbYV09Im9uIithfSxtYz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMDtpZihhPWZjKGEpKWlmKGI9YS5hW2IudG9TdHJpbmcoKV0pZm9yKGI9Yi5jb25jYXQoKSxhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBmPWJbYV07ZiYmZi5jYXB0dXJlPT1jJiYhZi5YJiYoZj1sYyhmLGQpLGU9ZSYmITEhPT1mKX1yZXR1cm4gZX0sbGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5tYXx8YS5zcmM7YS5oYSYma2MoYSk7cmV0dXJuIGMuY2FsbChkLGIpfSxpYz1mdW5jdGlvbihhLApiKXtpZihhLlgpcmV0dXJuITA7aWYoIUpiKXtpZighYilhOntiPVsid2luZG93IiwiZXZlbnQiXTtmb3IodmFyIGM9bCxkPTA7ZDxiLmxlbmd0aDtkKyspaWYoYz1jW2JbZF1dLG51bGw9PWMpe2I9bnVsbDticmVhayBhfWI9Y31kPWI7Yj1uZXcgRyhkLHRoaXMpO2M9ITA7aWYoISgwPmQua2V5Q29kZXx8dm9pZCAwIT1kLnJldHVyblZhbHVlKSl7YTp7dmFyIGU9ITE7aWYoMD09ZC5rZXlDb2RlKXRyeXtkLmtleUNvZGU9LTE7YnJlYWsgYX1jYXRjaChnKXtlPSEwfWlmKGV8fHZvaWQgMD09ZC5yZXR1cm5WYWx1ZSlkLnJldHVyblZhbHVlPSEwfWQ9W107Zm9yKGU9Yi5hO2U7ZT1lLnBhcmVudE5vZGUpZC5wdXNoKGUpO2E9YS50eXBlO2ZvcihlPWQubGVuZ3RoLTE7IWIuaCYmMDw9ZTtlLS0pe2IuYT1kW2VdO3ZhciBmPW1jKGRbZV0sYSwhMCxiKTtjPWMmJmZ9Zm9yKGU9MDshYi5oJiZlPGQubGVuZ3RoO2UrKyliLmE9ZFtlXSxmPW1jKGRbZV0sYSwhMSxiKSxjPWMmJmZ9cmV0dXJuIGN9cmV0dXJuIGxjKGEsCm5ldyBHKGIsdGhpcykpfSxmYz1mdW5jdGlvbihhKXthPWFbWWJdO3JldHVybiBhIGluc3RhbmNlb2YgVWI/YTpudWxsfSxuYz0iX19jbG9zdXJlX2V2ZW50c19mbl8iKygxRTkqTWF0aC5yYW5kb20oKT4+PjApLGNjPWZ1bmN0aW9uKGEpe3EoYSwiTGlzdGVuZXIgY2FuIG5vdCBiZSBudWxsLiIpO2lmKGlhKGEpKXJldHVybiBhO3EoYS5oYW5kbGVFdmVudCwiQW4gb2JqZWN0IGxpc3RlbmVyIG11c3QgaGF2ZSBoYW5kbGVFdmVudCBtZXRob2QuIik7YVtuY118fChhW25jXT1mdW5jdGlvbihiKXtyZXR1cm4gYS5oYW5kbGVFdmVudChiKX0pO3JldHVybiBhW25jXX07dmFyIG9jPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9e319O24ob2MsQyk7CnZhciBwYz1bXSxIPWZ1bmN0aW9uKGEsYixjLGQpe2ZhKGMpfHwoYyYmKHBjWzBdPWMudG9TdHJpbmcoKSksYz1wYyk7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWJjKGIsY1tlXSxkfHxhLmhhbmRsZUV2ZW50LCExLGEuYnx8YSk7aWYoIWYpYnJlYWs7YS5hW2Yua2V5XT1mfXJldHVybiBhfSxxYz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoZmEoYykpZm9yKHZhciBnPTA7ZzxjLmxlbmd0aDtnKyspcWMoYSxiLGNbZ10sZCxlLGYpO2Vsc2UgZD1kfHxhLmhhbmRsZUV2ZW50LGU9bShlKT8hIWUuY2FwdHVyZTohIWUsZj1mfHxhLmJ8fGEsZD1jYyhkKSxlPSEhZSxjPVFiKGIpP1hiKGIuaCxTdHJpbmcoYyksZCxlLGYpOmI/KGI9ZmMoYikpP1hiKGIsYyxkLGUsZik6bnVsbDpudWxsLGMmJihrYyhjKSxkZWxldGUgYS5hW2Mua2V5XSk7cmV0dXJuIGF9LHJjPWZ1bmN0aW9uKGEpe29hKGEuYSxmdW5jdGlvbihiLGMpe3RoaXMuYS5oYXNPd25Qcm9wZXJ0eShjKSYma2MoYil9LAphKTthLmE9e319O29jLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7b2MuaS51LmNhbGwodGhpcyk7cmModGhpcyl9O29jLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJFdmVudEhhbmRsZXIuaGFuZGxlRXZlbnQgbm90IGltcGxlbWVudGVkIik7fTt2YXIgST1mdW5jdGlvbigpe0MuY2FsbCh0aGlzKTt0aGlzLmg9bmV3IFViKHRoaXMpO3RoaXMuTWE9dGhpczt0aGlzLnBhPW51bGx9O24oSSxDKTtJLnByb3RvdHlwZVtQYl09ITA7SS5wcm90b3R5cGUucmE9ZnVuY3Rpb24oYSl7dGhpcy5wYT1hfTtJLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjLGQpe2pjKHRoaXMsYSxiLGMsZCl9Owp2YXIgdWM9ZnVuY3Rpb24oYSxiKXtzYyhhKTt2YXIgYz1hLnBhO2lmKGMpe3ZhciBkPVtdO2Zvcih2YXIgZT0xO2M7Yz1jLnBhKWQucHVzaChjKSxxKDFFMz4rK2UsImluZmluaXRlIGxvb3AiKX1hPWEuTWE7Yz1iLnR5cGV8fGI7InN0cmluZyI9PT10eXBlb2YgYj9iPW5ldyBFKGIsYSk6YiBpbnN0YW5jZW9mIEU/Yi50YXJnZXQ9Yi50YXJnZXR8fGE6KGU9YixiPW5ldyBFKGMsYSksdWEoYixlKSk7ZT0hMDtpZihkKWZvcih2YXIgZj1kLmxlbmd0aC0xOyFiLmgmJjA8PWY7Zi0tKXt2YXIgZz1iLmE9ZFtmXTtlPXRjKGcsYywhMCxiKSYmZX1iLmh8fChnPWIuYT1hLGU9dGMoZyxjLCEwLGIpJiZlLGIuaHx8KGU9dGMoZyxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLmgmJmY8ZC5sZW5ndGg7ZisrKWc9Yi5hPWRbZl0sZT10YyhnLGMsITEsYikmJmU7cmV0dXJuIGV9OwpJLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7SS5pLnUuY2FsbCh0aGlzKTtpZih0aGlzLmgpe3ZhciBhPXRoaXMuaCxiPTAsYztmb3IoYyBpbiBhLmEpe2Zvcih2YXIgZD1hLmFbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixUYihkW2VdKTtkZWxldGUgYS5hW2NdO2EuYi0tfX10aGlzLnBhPW51bGx9O3ZhciBkYz1mdW5jdGlvbihhLGIsYyxkLGUpe3NjKGEpO3JldHVybiBhLmguYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LHRjPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5oLmFbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGc9YltmXTtpZihnJiYhZy5YJiZnLmNhcHR1cmU9PWMpe3ZhciBrPWcubGlzdGVuZXIscD1nLm1hfHxnLnNyYztnLmhhJiZXYihhLmgsZyk7ZT0hMSE9PWsuY2FsbChwLGQpJiZlfX1yZXR1cm4gZSYmMCE9ZC5LYX0sc2M9ZnVuY3Rpb24oYSl7cShhLmgsIkV2ZW50IHRhcmdldCBpcyBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgY2FsbCB0aGUgc3VwZXJjbGFzcyAoZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpIGNvbnN0cnVjdG9yPyIpfTt2YXIgeGM9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKHkmJiFBKCI1MjUiKSlyZXR1cm4hMDtpZih6JiZlKXJldHVybiB2YyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZigheCl7Im51bWJlciI9PT10eXBlb2YgYiYmKGI9d2MoYikpO3ZhciBnPTE3PT1ifHwxOD09Ynx8eiYmOTE9PWI7aWYoKCFjfHx6KSYmZ3x8eiYmMTY9PWImJihkfHxmKSlyZXR1cm4hMX1pZigoeXx8YmIpJiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1pZih2JiZkJiZiPT1hKXJldHVybiExO3N3aXRjaChhKXtjYXNlIDEzOnJldHVybiB4P2Z8fGU/ITE6IShjJiZkKTohMDtjYXNlIDI3OnJldHVybiEoeXx8YmJ8fHgpfXJldHVybiB4JiYoZHx8ZXx8Zik/ITE6dmMoYSl9LHZjPWZ1bmN0aW9uKGEpe2lmKDQ4PD1hJiY1Nz49YXx8Cjk2PD1hJiYxMDY+PWF8fDY1PD1hJiY5MD49YXx8KHl8fGJiKSYmMD09YSlyZXR1cm4hMDtzd2l0Y2goYSl7Y2FzZSAzMjpjYXNlIDQzOmNhc2UgNjM6Y2FzZSA2NDpjYXNlIDEwNzpjYXNlIDEwOTpjYXNlIDExMDpjYXNlIDExMTpjYXNlIDE4NjpjYXNlIDU5OmNhc2UgMTg5OmNhc2UgMTg3OmNhc2UgNjE6Y2FzZSAxODg6Y2FzZSAxOTA6Y2FzZSAxOTE6Y2FzZSAxOTI6Y2FzZSAyMjI6Y2FzZSAyMTk6Y2FzZSAyMjA6Y2FzZSAyMjE6Y2FzZSAxNjM6Y2FzZSA1ODpyZXR1cm4hMDtjYXNlIDE3MzpyZXR1cm4geDtkZWZhdWx0OnJldHVybiExfX0sd2M9ZnVuY3Rpb24oYSl7aWYoeClhPXljKGEpO2Vsc2UgaWYoeiYmeSlzd2l0Y2goYSl7Y2FzZSA5MzphPTkxfXJldHVybiBhfSx5Yz1mdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSA2MTpyZXR1cm4gMTg3O2Nhc2UgNTk6cmV0dXJuIDE4NjtjYXNlIDE3MzpyZXR1cm4gMTg5O2Nhc2UgMjI0OnJldHVybiA5MTtjYXNlIDA6cmV0dXJuIDIyNDsKZGVmYXVsdDpyZXR1cm4gYX19O3ZhciBKPWZ1bmN0aW9uKGEsYil7SS5jYWxsKHRoaXMpO2EmJnpjKHRoaXMsYSxiKX07bihKLEkpO2g9Si5wcm90b3R5cGU7aC5TPW51bGw7aC5uYT1udWxsO2guQ2E9bnVsbDtoLm9hPW51bGw7aC53PS0xO2guRj0tMTtoLnVhPSExOwp2YXIgQWM9ezM6MTMsMTI6MTQ0LDYzMjMyOjM4LDYzMjMzOjQwLDYzMjM0OjM3LDYzMjM1OjM5LDYzMjM2OjExMiw2MzIzNzoxMTMsNjMyMzg6MTE0LDYzMjM5OjExNSw2MzI0MDoxMTYsNjMyNDE6MTE3LDYzMjQyOjExOCw2MzI0MzoxMTksNjMyNDQ6MTIwLDYzMjQ1OjEyMSw2MzI0NjoxMjIsNjMyNDc6MTIzLDYzMjQ4OjQ0LDYzMjcyOjQ2LDYzMjczOjM2LDYzMjc1OjM1LDYzMjc2OjMzLDYzMjc3OjM0LDYzMjg5OjE0NCw2MzMwMjo0NX0sQmM9e1VwOjM4LERvd246NDAsTGVmdDozNyxSaWdodDozOSxFbnRlcjoxMyxGMToxMTIsRjI6MTEzLEYzOjExNCxGNDoxMTUsRjU6MTE2LEY2OjExNyxGNzoxMTgsRjg6MTE5LEY5OjEyMCxGMTA6MTIxLEYxMToxMjIsRjEyOjEyMywiVSswMDdGIjo0NixIb21lOjM2LEVuZDozNSxQYWdlVXA6MzMsUGFnZURvd246MzQsSW5zZXJ0OjQ1fSxDYz0heXx8QSgiNTI1IiksRGM9eiYmeDsKSi5wcm90b3R5cGUuYT1mdW5jdGlvbihhKXtpZih5fHxiYilpZigxNz09dGhpcy53JiYhYS5jdHJsS2V5fHwxOD09dGhpcy53JiYhYS5hbHRLZXl8fHomJjkxPT10aGlzLncmJiFhLm1ldGFLZXkpdGhpcy5GPXRoaXMudz0tMTstMT09dGhpcy53JiYoYS5jdHJsS2V5JiYxNyE9YS5jP3RoaXMudz0xNzphLmFsdEtleSYmMTghPWEuYz90aGlzLnc9MTg6YS5tZXRhS2V5JiY5MSE9YS5jJiYodGhpcy53PTkxKSk7Q2MmJiF4YyhhLmMsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGEuYWx0S2V5LGEubWV0YUtleSk/dGhpcy5oYW5kbGVFdmVudChhKToodGhpcy5GPXdjKGEuYyksRGMmJih0aGlzLnVhPWEuYWx0S2V5KSl9O0oucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dGhpcy5GPXRoaXMudz0tMTt0aGlzLnVhPWEuYWx0S2V5fTsKSi5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5iLGM9Yi5hbHRLZXk7aWYodiYmImtleXByZXNzIj09YS50eXBlKXt2YXIgZD10aGlzLkY7dmFyIGU9MTMhPWQmJjI3IT1kP2Iua2V5Q29kZTowfWVsc2UoeXx8YmIpJiYia2V5cHJlc3MiPT1hLnR5cGU/KGQ9dGhpcy5GLGU9MDw9Yi5jaGFyQ29kZSYmNjMyMzI+Yi5jaGFyQ29kZSYmdmMoZCk/Yi5jaGFyQ29kZTowKTphYiYmIXk/KGQ9dGhpcy5GLGU9dmMoZCk/Yi5rZXlDb2RlOjApOigia2V5cHJlc3MiPT1hLnR5cGU/KERjJiYoYz10aGlzLnVhKSxiLmtleUNvZGU9PWIuY2hhckNvZGU/MzI+Yi5rZXlDb2RlPyhkPWIua2V5Q29kZSxlPTApOihkPXRoaXMuRixlPWIuY2hhckNvZGUpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkseiYmNjM9PWUmJjIyND09ZCYmKGQ9MTkxKSk7dmFyIGY9ZD13YyhkKTtkPzYzMjMyPD0KZCYmZCBpbiBBYz9mPUFjW2RdOjI1PT1kJiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBCYyYmKGY9QmNbYi5rZXlJZGVudGlmaWVyXSk7eCYmQ2MmJiJrZXlwcmVzcyI9PWEudHlwZSYmIXhjKGYsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KXx8KGE9Zj09dGhpcy53LHRoaXMudz1mLGI9bmV3IEVjKGYsZSxhLGIpLGIuYWx0S2V5PWMsdWModGhpcyxiKSl9O0oucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTsKdmFyIHpjPWZ1bmN0aW9uKGEsYixjKXthLm9hJiZGYyhhKTthLlM9YjthLm5hPWJjKGEuUywia2V5cHJlc3MiLGEsYyk7YS5DYT1iYyhhLlMsImtleWRvd24iLGEuYSxjLGEpO2Eub2E9YmMoYS5TLCJrZXl1cCIsYS5iLGMsYSl9LEZjPWZ1bmN0aW9uKGEpe2EubmEmJihrYyhhLm5hKSxrYyhhLkNhKSxrYyhhLm9hKSxhLm5hPW51bGwsYS5DYT1udWxsLGEub2E9bnVsbCk7YS5TPW51bGw7YS53PS0xO2EuRj0tMX07Si5wcm90b3R5cGUudT1mdW5jdGlvbigpe0ouaS51LmNhbGwodGhpcyk7RmModGhpcyl9O3ZhciBFYz1mdW5jdGlvbihhLGIsYyxkKXtHLmNhbGwodGhpcyxkKTt0aGlzLnR5cGU9ImtleSI7dGhpcy5jPWE7dGhpcy5yZXBlYXQ9Y307bihFYyxHKTt2YXIgR2M9eD8iTW96VXNlclNlbGVjdCI6eXx8YmI/IldlYmtpdFVzZXJTZWxlY3QiOm51bGwsSGM9ZnVuY3Rpb24oYSxiKXtiPWI/bnVsbDphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7aWYoR2Mpe3ZhciBjPSJub25lIjthLnN0eWxlJiYoYS5zdHlsZVtHY109Yyk7aWYoYil7YT0wO2Zvcih2YXIgZDtkPWJbYV07YSsrKWQuc3R5bGUmJihkLnN0eWxlW0djXT1jKX19ZWxzZSBpZih2fHxhYilpZihjPSJvbiIsYS5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyksYilmb3IoYT0wO2Q9YlthXTthKyspZC5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyl9O3ZhciBJYz1mdW5jdGlvbigpe307ZGEoSWMpO0ljLnByb3RvdHlwZS5hPTA7dmFyIEs9ZnVuY3Rpb24oYSl7SS5jYWxsKHRoaXMpO3RoaXMuaj1hfHx4YXx8KHhhPW5ldyB1Yik7dGhpcy5xYT1KYzt0aGlzLlk9bnVsbDt0aGlzLm09ITE7dGhpcy5hPW51bGw7dGhpcy5BPXZvaWQgMDt0aGlzLmc9dGhpcy5jPXRoaXMuYj1udWxsO3RoaXMuR2E9ITF9O24oSyxJKTtLLnByb3RvdHlwZS5PYT1JYy5SKCk7CnZhciBKYz1udWxsLEtjPWZ1bmN0aW9uKGEsYil7c3dpdGNoKGEpe2Nhc2UgMTpyZXR1cm4gYj8iZGlzYWJsZSI6ImVuYWJsZSI7Y2FzZSAyOnJldHVybiBiPyJoaWdobGlnaHQiOiJ1bmhpZ2hsaWdodCI7Y2FzZSA0OnJldHVybiBiPyJhY3RpdmF0ZSI6ImRlYWN0aXZhdGUiO2Nhc2UgODpyZXR1cm4gYj8ic2VsZWN0IjoidW5zZWxlY3QiO2Nhc2UgMTY6cmV0dXJuIGI/ImNoZWNrIjoidW5jaGVjayI7Y2FzZSAzMjpyZXR1cm4gYj8iZm9jdXMiOiJibHVyIjtjYXNlIDY0OnJldHVybiBiPyJvcGVuIjoiY2xvc2UifXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBzdGF0ZSIpO30sTGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuWXx8KGEuWT0iOiIrKGEuT2EuYSsrKS50b1N0cmluZygzNikpfSxNYz1mdW5jdGlvbihhLGIpe2lmKGEuYiYmYS5iLmcpe3ZhciBjPWEuYi5nLGQ9YS5ZO2QgaW4gYyYmZGVsZXRlIGNbZF07cWEoYS5iLmcsYixhKX1hLlk9Yn07Sy5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9Owp2YXIgTmM9ZnVuY3Rpb24oYSl7YT1hLmE7cShhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cmV0dXJuIGF9LE9jPWZ1bmN0aW9uKGEpe2EuQXx8KGEuQT1uZXcgb2MoYSkpO3JldHVybiBxKGEuQSl9O0sucHJvdG90eXBlLnJhPWZ1bmN0aW9uKGEpe2lmKHRoaXMuYiYmdGhpcy5iIT1hKXRocm93IEVycm9yKCJNZXRob2Qgbm90IHN1cHBvcnRlZCIpO0suaS5yYS5jYWxsKHRoaXMsYSl9O0sucHJvdG90eXBlLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPW5iKHRoaXMuai5hLCJESVYiKX07CnZhciBQYz1mdW5jdGlvbihhLGIpe2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiJiZhLnhhKGIpKXthLkdhPSEwO3ZhciBjPXFiKGIpO2EuaiYmYS5qLmE9PWN8fChhLmo9Yj9uZXcgdWIocWIoYikpOnhhfHwoeGE9bmV3IHViKSk7YS52YShiKTthLkQoKX1lbHNlIHRocm93IEVycm9yKCJJbnZhbGlkIGVsZW1lbnQgdG8gZGVjb3JhdGUiKTt9O2g9Sy5wcm90b3R5cGU7aC54YT1mdW5jdGlvbigpe3JldHVybiEwfTtoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hfTtoLkQ9ZnVuY3Rpb24oKXt0aGlzLm09ITA7UWModGhpcyxmdW5jdGlvbihhKXshYS5tJiZhLmYoKSYmYS5EKCl9KX07aC5QPWZ1bmN0aW9uKCl7UWModGhpcyxmdW5jdGlvbihhKXthLm0mJmEuUCgpfSk7dGhpcy5BJiZyYyh0aGlzLkEpO3RoaXMubT0hMX07CmgudT1mdW5jdGlvbigpe3RoaXMubSYmdGhpcy5QKCk7dGhpcy5BJiYodGhpcy5BLk4oKSxkZWxldGUgdGhpcy5BKTtRYyh0aGlzLGZ1bmN0aW9uKGEpe2EuTigpfSk7IXRoaXMuR2EmJnRoaXMuYSYmb2IodGhpcy5hKTt0aGlzLmI9dGhpcy5hPXRoaXMuZz10aGlzLmM9bnVsbDtLLmkudS5jYWxsKHRoaXMpfTtoLnNhPWZ1bmN0aW9uKGEsYil7dGhpcy50YShhLFJjKHRoaXMpLGIpfTsKaC50YT1mdW5jdGlvbihhLGIsYyl7cSghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLm0mJihjfHwhdGhpcy5tKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZigwPmJ8fGI+UmModGhpcykpdGhyb3cgRXJyb3IoIkNoaWxkIGNvbXBvbmVudCBpbmRleCBvdXQgb2YgYm91bmRzIik7dGhpcy5nJiZ0aGlzLmN8fCh0aGlzLmc9e30sdGhpcy5jPVtdKTtpZihhLmI9PXRoaXMpe3ZhciBkPUxjKGEpO3RoaXMuZ1tkXT1hO0hhKHRoaXMuYyxhKX1lbHNlIHFhKHRoaXMuZyxMYyhhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuYiYmYS5ZKXt2YXIgZT1hLmI7ZD1hLlk7ZS5nJiZkPyhlPWUuZyxkPShudWxsIT09ZSYmZCBpbiBlP2VbZF06dm9pZCAwKXx8bnVsbCk6ZD1udWxsfWlmKGQmJmEuYiE9dGhpcyl0aHJvdyBFcnJvcigiVW5hYmxlIHRvIHNldCBwYXJlbnQgY29tcG9uZW50Iik7CmEuYj10aGlzO0suaS5yYS5jYWxsKGEsdGhpcyk7TGEodGhpcy5jLGIsMCxhKTtpZihhLm0mJnRoaXMubSYmYS5iPT10aGlzKWM9dGhpcy5qYSgpLGI9Yy5jaGlsZE5vZGVzW2JdfHxudWxsLGIhPWEuZigpJiZjLmluc2VydEJlZm9yZShhLmYoKSxiKTtlbHNlIGlmKGMpe3RoaXMuYXx8dGhpcy5pYSgpO2M9TCh0aGlzLGIrMSk7Yj10aGlzLmphKCk7Yz1jP2MuYTpudWxsO2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTthLmF8fGEuaWEoKTtiP2IuaW5zZXJ0QmVmb3JlKGEuYSxjfHxudWxsKTphLmouYS5ib2R5LmFwcGVuZENoaWxkKGEuYSk7YS5iJiYhYS5iLm18fGEuRCgpfWVsc2UgdGhpcy5tJiYhYS5tJiZhLmEmJmEuYS5wYXJlbnROb2RlJiYxPT1hLmEucGFyZW50Tm9kZS5ub2RlVHlwZSYmYS5EKCl9O2guamE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hfTsKdmFyIFNjPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEucWEpe3ZhciBiPWEubT9hLmE6YS5qLmEuYm9keTthOnt2YXIgYz1xYihiKTtpZihjLmRlZmF1bHRWaWV3JiZjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihjPWMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpKSl7Yz1jLmRpcmVjdGlvbnx8Yy5nZXRQcm9wZXJ0eVZhbHVlKCJkaXJlY3Rpb24iKXx8IiI7YnJlYWsgYX1jPSIifWEucWE9InJ0bCI9PShjfHwoYi5jdXJyZW50U3R5bGU/Yi5jdXJyZW50U3R5bGUuZGlyZWN0aW9uOm51bGwpfHxiLnN0eWxlJiZiLnN0eWxlLmRpcmVjdGlvbil9cmV0dXJuIGEucWF9LFJjPWZ1bmN0aW9uKGEpe3JldHVybiBhLmM/YS5jLmxlbmd0aDowfSxMPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuYz9hLmNbYl18fG51bGw6bnVsbH0sUWM9ZnVuY3Rpb24oYSxiLGMpe2EuYyYmcihhLmMsYixjKX0sVGM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jJiZiP0RhKGEuYyxiKTotMX07dmFyIFZjPWZ1bmN0aW9uKGEsYil7aWYoIWEpdGhyb3cgRXJyb3IoIkludmFsaWQgY2xhc3MgbmFtZSAiK2EpO2lmKCFpYShiKSl0aHJvdyBFcnJvcigiSW52YWxpZCBkZWNvcmF0b3IgZnVuY3Rpb24gIitiKTtVY1thXT1ifSxXYz17fSxVYz17fTt2YXIgWGM9ZnVuY3Rpb24oYSl7dGhpcy5oPWF9O2RhKFhjKTt2YXIgWWM9ZnVuY3Rpb24oYSxiKXthJiYoYS50YWJJbmRleD1iPzA6LTEpfSwkYz1mdW5jdGlvbihhLGIsYyl7Yy5pZCYmTWMoYixjLmlkKTt2YXIgZD1hLmIoKSxlPSExLGY9RChjKTtmJiZyKGYsZnVuY3Rpb24oZyl7Zz09ZD9lPSEwOmcmJnRoaXMuZyhiLGcsZCl9LGEpO2V8fEViKGMsZCk7WmMoYixjKTtyZXR1cm4gY307WGMucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiLGMpe2I9PWMrIi1kaXNhYmxlZCI/YS5aKCExKTpiPT1jKyItaG9yaXpvbnRhbCI/YWQoYSwiaG9yaXpvbnRhbCIpOmI9PWMrIi12ZXJ0aWNhbCImJmFkKGEsInZlcnRpY2FsIil9Owp2YXIgWmM9ZnVuY3Rpb24oYSxiKXtpZihiKWZvcih2YXIgYz1iLmZpcnN0Q2hpbGQsZDtjJiZjLnBhcmVudE5vZGU9PWI7KXtkPWMubmV4dFNpYmxpbmc7aWYoMT09Yy5ub2RlVHlwZSl7YTp7dmFyIGU9YztxKGUpO2U9RChlKTtmb3IodmFyIGY9MCxnPWUubGVuZ3RoO2Y8ZztmKyspe3ZhciBrPWVbZl07aWYoaz1rIGluIFVjP1VjW2tdKCk6bnVsbCl7ZT1rO2JyZWFrIGF9fWU9bnVsbH1lJiYoZS5hPWMsYS5pc0VuYWJsZWQoKXx8ZS5aKCExKSxhLnNhKGUpLFBjKGUsYykpfWVsc2UgYy5ub2RlVmFsdWUmJiIiIT1NYShjLm5vZGVWYWx1ZSl8fGIucmVtb3ZlQ2hpbGQoYyk7Yz1kfX0sYmQ9ZnVuY3Rpb24oYSxiKXtiPWIuZigpO3EoYiwiVGhlIGNvbnRhaW5lciBET00gZWxlbWVudCBjYW5ub3QgYmUgbnVsbC4iKTtIYyhiLHgpO3YmJihiLmhpZGVGb2N1cz0hMCk7KGE9YS5oKSYmdmIoYixhKX07WGMucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKWGMucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5iKCksYz1bYiwiaG9yaXpvbnRhbCI9PWEuSD9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgTT1mdW5jdGlvbigpe30sY2Q7ZGEoTSk7dmFyIGRkPXtidXR0b246InByZXNzZWQiLGNoZWNrYm94OiJjaGVja2VkIixtZW51aXRlbToic2VsZWN0ZWQiLG1lbnVpdGVtY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtcmFkaW86ImNoZWNrZWQiLHJhZGlvOiJjaGVja2VkIix0YWI6InNlbGVjdGVkIix0cmVlaXRlbToic2VsZWN0ZWQifTtNLnByb3RvdHlwZS5oPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLmouYigiRElWIixlZCh0aGlzLGEpLmpvaW4oIiAiKSxhLmJhKX07dmFyIGdkPWZ1bmN0aW9uKGEsYixjKXtpZihhPWEuZj9hLmYoKTphKXt2YXIgZD1bYl07diYmIUEoIjciKSYmKGQ9ZmQoRChhKSxiKSxkLnB1c2goYikpOyhjP0ZiOkhiKShhLGQpfX07Ck0ucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiKXtiLmlkJiZNYyhhLGIuaWQpO2ImJmIuZmlyc3RDaGlsZD9oZChhLGIuZmlyc3RDaGlsZC5uZXh0U2libGluZz9KYShiLmNoaWxkTm9kZXMpOmIuZmlyc3RDaGlsZCk6YS5iYT1udWxsO3ZhciBjPTAsZD10aGlzLmEoKSxlPXRoaXMuYSgpLGY9ITEsZz0hMSxrPSExLHA9SmEoRChiKSk7cihwLGZ1bmN0aW9uKEIpe2Z8fEIhPWQ/Z3x8QiE9ZT9jfD1pZCh0aGlzLEIpOmc9ITA6KGY9ITAsZT09ZCYmKGc9ITApKTsxPT1pZCh0aGlzLEIpJiYoQWEoYiksc2IoYikmJnRiKGIpJiZyYihiLCExKSl9LHRoaXMpO2Eubz1jO2Z8fChwLnB1c2goZCksZT09ZCYmKGc9ITApKTtnfHxwLnB1c2goZSk7KGE9YS53YSkmJnAucHVzaC5hcHBseShwLGEpO2lmKHYmJiFBKCI3Iikpe3ZhciB3PWZkKHApOzA8dy5sZW5ndGgmJihwLnB1c2guYXBwbHkocCx3KSxrPSEwKX1mJiZnJiYhYSYmIWt8fENiKGIscC5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIGpkPWZ1bmN0aW9uKGEsYil7aWYoYT1hLmgoKSl7cShiLCJUaGUgZWxlbWVudCBwYXNzZWQgYXMgYSBmaXJzdCBwYXJhbWV0ZXIgY2Fubm90IGJlIG51bGwuIik7dmFyIGM9Yi5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDthIT1jJiZ2YihiLGEpfX0sa2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYztpZihhLnYmMzImJihjPWEuZigpKSl7aWYoIWImJmEubyYzMil7dHJ5e2MuYmx1cigpfWNhdGNoKGQpe31hLm8mMzImJmEuRmEobnVsbCl9KHNiKGMpJiZ0YihjKSkhPWImJnJiKGMsYil9fSxsZD1mdW5jdGlvbihhLGIsYyl7Y2R8fChjZD17MToiZGlzYWJsZWQiLDg6InNlbGVjdGVkIiwxNjoiY2hlY2tlZCIsNjQ6ImV4cGFuZGVkIn0pO3EoYSwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO2I9Y2RbYl07dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDtkJiYoZD1kZFtkXXx8YixiPSJjaGVja2VkIj09Ynx8InNlbGVjdGVkIj09CmI/ZDpiKTtiJiZ4YihhLGIsYyl9O00ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250cm9sIn07CnZhciBlZD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuYSgpLGQ9W2NdLGU9YS5hKCk7ZSE9YyYmZC5wdXNoKGUpO2M9Yi5vO2ZvcihlPVtdO2M7KXt2YXIgZj1jJi1jO2UucHVzaChtZChhLGYpKTtjJj1+Zn1kLnB1c2guYXBwbHkoZCxlKTsoYT1iLndhKSYmZC5wdXNoLmFwcGx5KGQsYSk7diYmIUEoIjciKSYmZC5wdXNoLmFwcGx5KGQsZmQoZCkpO3JldHVybiBkfSxmZD1mdW5jdGlvbihhLGIpe3ZhciBjPVtdO2ImJihhPUlhKGEsW2JdKSk7cihbXSxmdW5jdGlvbihkKXshRmEoZCxsYShHYSxhKSl8fGImJiFHYShkLGIpfHxjLnB1c2goZC5qb2luKCJfIikpfSk7cmV0dXJuIGN9LG1kPWZ1bmN0aW9uKGEsYil7YS5ifHxuZChhKTtyZXR1cm4gYS5iW2JdfSxpZD1mdW5jdGlvbihhLGIpe2Euanx8KGEuYnx8bmQoYSksYS5qPXNhKGEuYikpO2E9cGFyc2VJbnQoYS5qW2JdLDEwKTtyZXR1cm4gaXNOYU4oYSk/MDphfSxuZD1mdW5jdGlvbihhKXt2YXIgYj1hLmEoKSxjPSF0KGIucmVwbGFjZSgvXHhhMHxccy9nLAoiICIpLCIgIik7cShjLCJDb250cm9sUmVuZGVyZXIgaGFzIGFuIGludmFsaWQgY3NzIGNsYXNzOiAnIitiKyInIik7YS5iPXsxOmIrIi1kaXNhYmxlZCIsMjpiKyItaG92ZXIiLDQ6YisiLWFjdGl2ZSIsODpiKyItc2VsZWN0ZWQiLDE2OmIrIi1jaGVja2VkIiwzMjpiKyItZm9jdXNlZCIsNjQ6YisiLW9wZW4ifX07dmFyIE49ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO2lmKCFiKXtiPXRoaXMuY29uc3RydWN0b3I7Zm9yKHZhciBkO2I7KXtkPWJbamFdfHwoYltqYV09KytrYSk7aWYoZD1XY1tkXSlicmVhaztiPWIuaT9iLmkuY29uc3RydWN0b3I6bnVsbH1iPWQ/aWEoZC5SKT9kLlIoKTpuZXcgZDpudWxsfXRoaXMuQj1iO3RoaXMuYmE9dm9pZCAwIT09YT9hOm51bGx9O24oTixLKTtoPU4ucHJvdG90eXBlO2guYmE9bnVsbDtoLm89MDtoLnY9Mzk7aC5LPTA7aC5JYT0hMDtoLndhPW51bGw7aC55YT0hMDtoLmlhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CLmModGhpcyk7dGhpcy5hPWE7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmeGIoYSwiaGlkZGVuIiwhMCkpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hPXRoaXMuQi5nKHRoaXMsYSk7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5JYT0ibm9uZSIhPWEuc3R5bGUuZGlzcGxheX07CmguRD1mdW5jdGlvbigpe04uaS5ELmNhbGwodGhpcyk7dmFyIGE9TmModGhpcyk7cSh0aGlzKTtxKGEpO3RoaXMuaXNWaXNpYmxlKCl8fHhiKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fGxkKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy52JjgmJmxkKGEsOCwhISh0aGlzLm8mOCkpO3RoaXMudiYxNiYmbGQoYSwxNiwhISh0aGlzLm8mMTYpKTt0aGlzLnYmNjQmJmxkKGEsNjQsISEodGhpcy5vJjY0KSk7YT10aGlzLkI7U2ModGhpcykmJmdkKHRoaXMuZigpLGEuYSgpKyItcnRsIiwhMCk7dGhpcy5pc0VuYWJsZWQoKSYma2QodGhpcyx0aGlzLmlzVmlzaWJsZSgpKTtpZih0aGlzLnYmLTImJih0aGlzLnlhJiZvZCh0aGlzLCEwKSx0aGlzLnYmMzImJihhPXRoaXMuZigpKSkpe3ZhciBiPXRoaXMuV3x8KHRoaXMuVz1uZXcgSik7emMoYixhKTtIKEgoSChPYyh0aGlzKSxiLCJrZXkiLHRoaXMuZmEpLGEsImZvY3VzIix0aGlzLk5hKSxhLCJibHVyIiwKdGhpcy5GYSl9fTt2YXIgb2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYz1PYyhhKSxkPWEuZigpO2I/KEgoSChIKEgoYyxkLEYuTCxhLmthKSxkLFtGLk0sRi5hYV0sYS5sYSksZCwibW91c2VvdmVyIixhLkFhKSxkLCJtb3VzZW91dCIsYS56YSksYS5lYSE9Y2EmJkgoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fEgoYyxkLCJkYmxjbGljayIsYS5KYSksYS5nYXx8KGEuZ2E9bmV3IHBkKGEpLHpiKGEsbGEoQWIsYS5nYSkpKSkpOihxYyhxYyhxYyhxYyhjLGQsRi5MLGEua2EpLGQsW0YuTSxGLmFhXSxhLmxhKSxkLCJtb3VzZW92ZXIiLGEuQWEpLGQsIm1vdXNlb3V0IixhLnphKSxhLmVhIT1jYSYmcWMoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fHFjKGMsZCwiZGJsY2xpY2siLGEuSmEpLEFiKGEuZ2EpLGEuZ2E9bnVsbCkpfTsKTi5wcm90b3R5cGUuUD1mdW5jdGlvbigpe04uaS5QLmNhbGwodGhpcyk7dGhpcy5XJiZGYyh0aGlzLlcpO3RoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJmtkKHRoaXMsITEpfTtOLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7Ti5pLnUuY2FsbCh0aGlzKTt0aGlzLlcmJih0aGlzLlcuTigpLGRlbGV0ZSB0aGlzLlcpO2RlbGV0ZSB0aGlzLkI7dGhpcy5nYT10aGlzLndhPXRoaXMuYmE9bnVsbH07dmFyIGhkPWZ1bmN0aW9uKGEsYil7YS5iYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm8mMSl9OwpOLnByb3RvdHlwZS5aPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYjtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0VuYWJsZWQmJiFiLmlzRW5hYmxlZCgpfHwhTyh0aGlzLDEsIWEpfHwoYXx8KHFkKHRoaXMsITEpLFAodGhpcywhMSkpLHRoaXMuaXNWaXNpYmxlKCkmJmtkKHRoaXMsYSksUSh0aGlzLDEsIWEsITApKX07CnZhciBQPWZ1bmN0aW9uKGEsYil7TyhhLDIsYikmJlEoYSwyLGIpfSxxZD1mdW5jdGlvbihhLGIpe08oYSw0LGIpJiZRKGEsNCxiKX0scmQ9ZnVuY3Rpb24oYSxiKXtPKGEsOCxiKSYmUShhLDgsYil9LHNkPWZ1bmN0aW9uKGEsYil7TyhhLDY0LGIpJiZRKGEsNjQsYil9LFE9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIWQmJjE9PWIpYS5aKCFjKTtlbHNlIGlmKGEudiZiJiZjIT0hIShhLm8mYikpe3ZhciBlPWEuQjtpZihkPWEuZigpKShlPW1kKGUsYikpJiZnZChhLGUsYyksbGQoZCxiLGMpO2Eubz1jP2Eub3xiOmEubyZ+Yn19LHRkPWZ1bmN0aW9uKGEsYixjKXtpZihhLm0mJmEubyZiJiYhYyl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTshYyYmYS5vJmImJlEoYSxiLCExKTthLnY9Yz9hLnZ8YjphLnYmfmJ9LFI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hISgyNTUmYikmJiEhKGEudiZiKX0sTz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuISEoYS52JmIpJiYhIShhLm8mCmIpIT1jJiYoIShhLksmYil8fHVjKGEsS2MoYixjKSkpJiYhYS5VfTtoPU4ucHJvdG90eXBlO2guQWE9ZnVuY3Rpb24oYSl7KCFhLnJlbGF0ZWRUYXJnZXR8fCFwYih0aGlzLmYoKSxhLnJlbGF0ZWRUYXJnZXQpKSYmdWModGhpcywiZW50ZXIiKSYmdGhpcy5pc0VuYWJsZWQoKSYmUih0aGlzLDIpJiZQKHRoaXMsITApfTtoLnphPWZ1bmN0aW9uKGEpe2EucmVsYXRlZFRhcmdldCYmcGIodGhpcy5mKCksYS5yZWxhdGVkVGFyZ2V0KXx8IXVjKHRoaXMsImxlYXZlIil8fChSKHRoaXMsNCkmJnFkKHRoaXMsITEpLFIodGhpcywyKSYmUCh0aGlzLCExKSl9O2guZWE9Y2E7Cmgua2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSxPYihhKSYmISh5JiZ6JiZhLmN0cmxLZXkpKSl7Uih0aGlzLDQpJiZxZCh0aGlzLCEwKTt2YXIgYjtpZihiPXRoaXMuQil7dmFyIGM7Yj10aGlzLnYmMzImJihjPXRoaXMuZigpKT9zYihjKSYmdGIoYyk6ITF9YiYmdGhpcy5mKCkuZm9jdXMoKX0hT2IoYSl8fHkmJnomJmEuY3RybEtleXx8YS5nKCl9O2gubGE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSx0aGlzLm8mNCYmdWQodGhpcyxhKSYmUih0aGlzLDQpJiZxZCh0aGlzLCExKSl9O2guSmE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmdWQodGhpcyxhKX07CnZhciB1ZD1mdW5jdGlvbihhLGIpe2lmKFIoYSwxNikpe3ZhciBjPSEoYS5vJjE2KTtPKGEsMTYsYykmJlEoYSwxNixjKX1SKGEsOCkmJnJkKGEsITApO1IoYSw2NCkmJnNkKGEsIShhLm8mNjQpKTtjPW5ldyBFKCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuQT1iLkEpO3JldHVybiB1YyhhLGMpfTtOLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe1IodGhpcywzMikmJk8odGhpcywzMiwhMCkmJlEodGhpcywzMiwhMCl9O04ucHJvdG90eXBlLkZhPWZ1bmN0aW9uKCl7Uih0aGlzLDQpJiZxZCh0aGlzLCExKTtSKHRoaXMsMzIpJiZPKHRoaXMsMzIsITEpJiZRKHRoaXMsMzIsITEpfTsKTi5wcm90b3R5cGUuZmE9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJjEzPT1hLmMmJnVkKHRoaXMsYSk/KGEuZygpLGEuaigpLCEwKTohMX07aWYoIWlhKE4pKXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBjbGFzcyAiK04pO2lmKCFpYShNKSl0aHJvdyBFcnJvcigiSW52YWxpZCByZW5kZXJlciBjbGFzcyAiK00pO3ZhciB2ZD1OW2phXXx8KE5bamFdPSsra2EpO1djW3ZkXT1NO1ZjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIHBkPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9ITE7dGhpcy5jPW5ldyBvYyh0aGlzKTt6Yih0aGlzLGxhKEFiLHRoaXMuYykpO2E9TmModGhpcy5iKTtIKEgoSCh0aGlzLmMsYSxGLkwsdGhpcy5oKSxhLEYuTSx0aGlzLmopLGEsImNsaWNrIix0aGlzLmcpfTtuKHBkLEMpO3ZhciB3ZD0hdnx8OTw9TnVtYmVyKGliKTsKcGQucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXt0aGlzLmE9ITF9O3BkLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7dGhpcy5hPSEwfTt2YXIgeGQ9ZnVuY3Rpb24oYSxiKXtpZighd2QpcmV0dXJuIGEuYnV0dG9uPTAsYS50eXBlPWIsYTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudHMiKTtjLmluaXRNb3VzZUV2ZW50KGIsYS5idWJibGVzLGEuY2FuY2VsYWJsZSxhLnZpZXd8fG51bGwsYS5kZXRhaWwsYS5zY3JlZW5YLGEuc2NyZWVuWSxhLmNsaWVudFgsYS5jbGllbnRZLGEuY3RybEtleSxhLmFsdEtleSxhLnNoaWZ0S2V5LGEubWV0YUtleSwwLGEucmVsYXRlZFRhcmdldHx8bnVsbCk7cmV0dXJuIGN9OwpwZC5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXtpZih0aGlzLmEpdGhpcy5hPSExO2Vsc2V7dmFyIGI9YS5iLGM9Yi5idXR0b24sZD1iLnR5cGUsZT14ZChiLCJtb3VzZWRvd24iKTt0aGlzLmIua2EobmV3IEcoZSxhLmEpKTtlPXhkKGIsIm1vdXNldXAiKTt0aGlzLmIubGEobmV3IEcoZSxhLmEpKTt3ZHx8KGIuYnV0dG9uPWMsYi50eXBlPWQpfX07cGQucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt0aGlzLmI9bnVsbDtwZC5pLnUuY2FsbCh0aGlzKX07dmFyIFM9ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO3RoaXMuZGE9Ynx8WGMuUigpO3RoaXMuSD1hfHwidmVydGljYWwifTtuKFMsSyk7aD1TLnByb3RvdHlwZTtoLkRhPW51bGw7aC5jYT1udWxsO2guZGE9bnVsbDtoLkg9bnVsbDtoLlQ9ITA7aC5PPSEwO2gubD0tMTtoLnM9bnVsbDtoLlY9ITE7aC5JPW51bGw7dmFyIHlkPWZ1bmN0aW9uKGEpe3JldHVybiBhLkRhfHxhLmYoKX07aD1TLnByb3RvdHlwZTtoLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPXRoaXMuai5iKCJESVYiLHRoaXMuZGEuYyh0aGlzKS5qb2luKCIgIikpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKGEpe3JldHVybiJESVYiPT1hLnRhZ05hbWV9O2gudmE9ZnVuY3Rpb24oYSl7dGhpcy5hPSRjKHRoaXMuZGEsdGhpcyxhKTsibm9uZSI9PWEuc3R5bGUuZGlzcGxheSYmKHRoaXMuVD0hMSl9OwpoLkQ9ZnVuY3Rpb24oKXtTLmkuRC5jYWxsKHRoaXMpO1FjKHRoaXMsZnVuY3Rpb24oYil7Yi5tJiZ6ZCh0aGlzLGIpfSx0aGlzKTt2YXIgYT10aGlzLmYoKTtiZCh0aGlzLmRhLHRoaXMpO0FkKHRoaXMsdGhpcy5UKTtIKEgoSChIKEgoSChIKEgoT2ModGhpcyksdGhpcywiZW50ZXIiLHRoaXMuV2EpLHRoaXMsImhpZ2hsaWdodCIsdGhpcy5YYSksdGhpcywidW5oaWdobGlnaHQiLHRoaXMuY2IpLHRoaXMsIm9wZW4iLHRoaXMuWWEpLHRoaXMsImNsb3NlIix0aGlzLlVhKSxhLEYuTCx0aGlzLlNhKSxxYihhKSxbRi5NLEYuYWFdLHRoaXMuVmEpLGEsW0YuTCxGLk0sRi5hYSwibW91c2VvdmVyIiwibW91c2VvdXQiLCJjb250ZXh0bWVudSJdLHRoaXMuVGEpO0JkKHRoaXMpfTt2YXIgQmQ9ZnVuY3Rpb24oYSl7dmFyIGI9T2MoYSksYz15ZChhKTtIKEgoSChiLGMsImZvY3VzIixhLkhhKSxjLCJibHVyIixhLlFhKSxhLmNhfHwoYS5jYT1uZXcgSih5ZChhKSkpLCJrZXkiLGEuUmEpfTtoPVMucHJvdG90eXBlOwpoLlA9ZnVuY3Rpb24oKXtDZCh0aGlzLC0xKTt0aGlzLnMmJnNkKHRoaXMucywhMSk7dGhpcy5WPSExO1MuaS5QLmNhbGwodGhpcyl9O2gudT1mdW5jdGlvbigpe1MuaS51LmNhbGwodGhpcyk7dGhpcy5jYSYmKHRoaXMuY2EuTigpLHRoaXMuY2E9bnVsbCk7dGhpcy5kYT10aGlzLnM9dGhpcy5JPXRoaXMuRGE9bnVsbH07aC5XYT1mdW5jdGlvbigpe3JldHVybiEwfTsKaC5YYT1mdW5jdGlvbihhKXt2YXIgYj1UYyh0aGlzLGEudGFyZ2V0KTtpZigtMTxiJiZiIT10aGlzLmwpe3ZhciBjPUwodGhpcyx0aGlzLmwpO2MmJlAoYywhMSk7dGhpcy5sPWI7Yz1MKHRoaXMsdGhpcy5sKTt0aGlzLlYmJnFkKGMsITApO3RoaXMucyYmYyE9dGhpcy5zJiYoYy52JjY0P3NkKGMsITApOnNkKHRoaXMucywhMSkpfWI9dGhpcy5mKCk7cShiLCJUaGUgRE9NIGVsZW1lbnQgZm9yIHRoZSBjb250YWluZXIgY2Fubm90IGJlIG51bGwuIik7bnVsbCE9YS50YXJnZXQuZigpJiZ4YihiLCJhY3RpdmVkZXNjZW5kYW50IixhLnRhcmdldC5mKCkuaWQpfTtoLmNiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT1MKHRoaXMsdGhpcy5sKSYmKHRoaXMubD0tMSk7YT10aGlzLmYoKTtxKGEsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnJlbW92ZUF0dHJpYnV0ZSh3YigiYWN0aXZlZGVzY2VuZGFudCIpKX07CmguWWE9ZnVuY3Rpb24oYSl7KGE9YS50YXJnZXQpJiZhIT10aGlzLnMmJmEuYj09dGhpcyYmKHRoaXMucyYmc2QodGhpcy5zLCExKSx0aGlzLnM9YSl9O2guVWE9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMucyYmKHRoaXMucz1udWxsKTt2YXIgYj10aGlzLmYoKSxjPWEudGFyZ2V0LmYoKTtiJiZhLnRhcmdldC5vJjImJmMmJihhPSIiLGMmJihhPWMuaWQscShhLCJUaGUgYWN0aXZlIGVsZW1lbnQgc2hvdWxkIGhhdmUgYW4gaWQuIikpLHhiKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEpKX07aC5TYT1mdW5jdGlvbihhKXt0aGlzLk8mJih0aGlzLlY9ITApO3ZhciBiPXlkKHRoaXMpO2ImJnNiKGIpJiZ0YihiKT9iLmZvY3VzKCk6YS5nKCl9O2guVmE9ZnVuY3Rpb24oKXt0aGlzLlY9ITF9OwpoLlRhPWZ1bmN0aW9uKGEpe2E6e3ZhciBiPWEudGFyZ2V0O2lmKHRoaXMuSSlmb3IodmFyIGM9dGhpcy5mKCk7YiYmYiE9PWM7KXt2YXIgZD1iLmlkO2lmKGQgaW4gdGhpcy5JKXtiPXRoaXMuSVtkXTticmVhayBhfWI9Yi5wYXJlbnROb2RlfWI9bnVsbH1pZihiKXN3aXRjaChhLnR5cGUpe2Nhc2UgRi5MOmIua2EoYSk7YnJlYWs7Y2FzZSBGLk06Y2FzZSBGLmFhOmIubGEoYSk7YnJlYWs7Y2FzZSAibW91c2VvdmVyIjpiLkFhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3V0IjpiLnphKGEpO2JyZWFrO2Nhc2UgImNvbnRleHRtZW51IjpiLmVhKGEpfX07aC5IYT1mdW5jdGlvbigpe307aC5RYT1mdW5jdGlvbigpe0NkKHRoaXMsLTEpO3RoaXMuVj0hMTt0aGlzLnMmJnNkKHRoaXMucywhMSl9OwpoLlJhPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmlzRW5hYmxlZCgpJiZ0aGlzLmlzVmlzaWJsZSgpJiYoMCE9UmModGhpcyl8fHRoaXMuRGEpJiZEZCh0aGlzLGEpPyhhLmcoKSxhLmooKSwhMCk6ITF9Owp2YXIgRGQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1MKGEsYS5sKTtpZihjJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5mYSYmYy5mYShiKXx8YS5zJiZhLnMhPWMmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLnMuZmEmJmEucy5mYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuYyl7Y2FzZSAyNzp5ZChhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpFZChhKTticmVhaztjYXNlIDM1OkZkKGEpO2JyZWFrO2Nhc2UgMzg6aWYoInZlcnRpY2FsIj09YS5IKUdkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9IZChhKTpHZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoInZlcnRpY2FsIj09YS5IKUhkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9HZChhKTpIZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSx6ZD1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZigpO2M9Yy5pZHx8KGMuaWQ9TGMoYikpO2EuSXx8KGEuST17fSk7YS5JW2NdPWJ9O1MucHJvdG90eXBlLnNhPWZ1bmN0aW9uKGEsYil7Q2EoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtTLmkuc2EuY2FsbCh0aGlzLGEsYil9O1MucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEsYixjKXtDYShhLE4pO2EuS3w9MjthLkt8PTY0O3RkKGEsMzIsITEpO2EubSYmMCE9YS55YSYmb2QoYSwhMSk7YS55YT0hMTt2YXIgZD1hLmI9PXRoaXM/VGModGhpcyxhKTotMTtTLmkudGEuY2FsbCh0aGlzLGEsYixjKTthLm0mJnRoaXMubSYmemQodGhpcyxhKTthPWQ7LTE9PWEmJihhPVJjKHRoaXMpKTthPT10aGlzLmw/dGhpcy5sPU1hdGgubWluKFJjKHRoaXMpLTEsYik6YT50aGlzLmwmJmI8PXRoaXMubD90aGlzLmwrKzphPHRoaXMubCYmYj50aGlzLmwmJnRoaXMubC0tfTsKdmFyIGFkPWZ1bmN0aW9uKGEsYil7aWYoYS5mKCkpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5IPWJ9O1MucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O3ZhciBBZD1mdW5jdGlvbihhLGIpe2EuVD1iO3ZhciBjPWEuZigpO2MmJihjLnN0eWxlLmRpc3BsYXk9Yj8iIjoibm9uZSIsWWMoeWQoYSksYS5PJiZhLlQpKX07Uy5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT307Uy5wcm90b3R5cGUuWj1mdW5jdGlvbihhKXt0aGlzLk8hPWEmJnVjKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5PPSEwLFFjKHRoaXMsZnVuY3Rpb24oYil7Yi5MYT9kZWxldGUgYi5MYTpiLlooITApfSkpOihRYyh0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5aKCExKTpiLkxhPSEwfSksdGhpcy5WPXRoaXMuTz0hMSksWWMoeWQodGhpcyksYSYmdGhpcy5UKSl9Owp2YXIgQ2Q9ZnVuY3Rpb24oYSxiKXsoYj1MKGEsYikpP1AoYiwhMCk6LTE8YS5sJiZQKEwoYSxhLmwpLCExKX0sRWQ9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LFJjKGEpLTEpfSxGZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiAwPmI/Yy0xOmJ9LDApfSxIZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7cmV0dXJuKGIrMSklY30sYS5sKX0sR2Q9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe2ItLTtyZXR1cm4gMD5iP2MtMTpifSxhLmwpfSxJZD1mdW5jdGlvbihhLGIsYyl7Yz0wPmM/VGMoYSxhLnMpOmM7dmFyIGQ9UmMoYSk7Yz1iLmNhbGwoYSxjLGQpO2Zvcih2YXIgZT0wO2U8PWQ7KXt2YXIgZj1MKGEsYyksZztpZihnPWYpZz1mLmlzVmlzaWJsZSgpJiZmLmlzRW5hYmxlZCgpJiYhIShmLnYmMik7aWYoZyl7YS5FYShjKTticmVha31lKys7Yz1iLmNhbGwoYSxjLGQpfX07ClMucHJvdG90eXBlLkVhPWZ1bmN0aW9uKGEpe0NkKHRoaXMsYSl9O3ZhciBUPWZ1bmN0aW9uKCl7fTtuKFQsTSk7ZGEoVCk7VC5wcm90b3R5cGUuYT1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYiJ9O1QucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXtyZXR1cm4idGFiIn07VC5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYj1ULmkuYy5jYWxsKHRoaXMsYSk7KGE9YS5QYSkmJmImJihiLnRpdGxlPWF8fCIiKTtyZXR1cm4gYn07VC5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIpe2I9VC5pLmcuY2FsbCh0aGlzLGEsYik7dmFyIGM9Yi50aXRsZXx8IiI7YyYmKGEuUGE9Yyk7YS5vJjgmJihjPWEuYikmJmlhKGMuRykmJihRKGEsOCwhMSksYy5HKGEpKTtyZXR1cm4gYn07dmFyIEpkPWZ1bmN0aW9uKGEsYixjKXtOLmNhbGwodGhpcyxhLGJ8fFQuUigpLGMpO3RkKHRoaXMsOCwhMCk7dGhpcy5LfD05fTtuKEpkLE4pO1ZjKCJnb29nLXRhYiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEpkKG51bGwpfSk7dmFyIFU9ZnVuY3Rpb24oKXt0aGlzLmg9InRhYmxpc3QifTtuKFUsWGMpO2RhKFUpO1UucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWItYmFyIn07VS5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIsYyl7dGhpcy5qfHwodGhpcy5hfHxLZCh0aGlzKSx0aGlzLmo9c2EodGhpcy5hKSk7dmFyIGQ9dGhpcy5qW2JdO2Q/KGFkKGEsTGQoZCkpLGEuQj1kKTpVLmkuZy5jYWxsKHRoaXMsYSxiLGMpfTtVLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPVUuaS5jLmNhbGwodGhpcyxhKTt0aGlzLmF8fEtkKHRoaXMpO2IucHVzaCh0aGlzLmFbYS5CXSk7cmV0dXJuIGJ9O3ZhciBLZD1mdW5jdGlvbihhKXt2YXIgYj1hLmIoKTthLmE9e3RvcDpiKyItdG9wIixib3R0b206YisiLWJvdHRvbSIsc3RhcnQ6YisiLXN0YXJ0IixlbmQ6YisiLWVuZCJ9fTt2YXIgVj1mdW5jdGlvbihhLGIsYyl7YT1hfHwidG9wIjthZCh0aGlzLExkKGEpKTt0aGlzLkI9YTtTLmNhbGwodGhpcyx0aGlzLkgsYnx8VS5SKCksYyk7TWQodGhpcyl9O24oVixTKTtoPVYucHJvdG90eXBlO2guQz1udWxsO2guRD1mdW5jdGlvbigpe1YuaS5ELmNhbGwodGhpcyk7TWQodGhpcyl9O2gudT1mdW5jdGlvbigpe1YuaS51LmNhbGwodGhpcyk7dGhpcy5DPW51bGx9O2guRWE9ZnVuY3Rpb24oYSl7Vi5pLkVhLmNhbGwodGhpcyxhKTt0aGlzLkcoTCh0aGlzLGEpKX07aC5HPWZ1bmN0aW9uKGEpe2E/cmQoYSwhMCk6dGhpcy5DJiZyZCh0aGlzLkMsITEpfTsKdmFyIE5kPWZ1bmN0aW9uKGEsYil7aWYoYiYmYj09YS5DKXtmb3IodmFyIGM9VGMoYSxiKSxkPWMtMTtiPUwoYSxkKTtkLS0pe3ZhciBlPWI7aWYoZS5pc1Zpc2libGUoKSYmZS5pc0VuYWJsZWQoKSl7YS5HKGIpO3JldHVybn19Zm9yKGMrPTE7Yj1MKGEsYyk7YysrKWlmKGQ9YixkLmlzVmlzaWJsZSgpJiZkLmlzRW5hYmxlZCgpKXthLkcoYik7cmV0dXJufWEuRyhudWxsKX19O2g9Vi5wcm90b3R5cGU7aC5hYj1mdW5jdGlvbihhKXt0aGlzLkMmJnRoaXMuQyE9YS50YXJnZXQmJnJkKHRoaXMuQywhMSk7dGhpcy5DPWEudGFyZ2V0fTtoLmJiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT10aGlzLkMmJih0aGlzLkM9bnVsbCl9O2guWmE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guJGE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guSGE9ZnVuY3Rpb24oKXtMKHRoaXMsdGhpcy5sKXx8Q2QodGhpcyxUYyh0aGlzLHRoaXMuQ3x8TCh0aGlzLDApKSl9Owp2YXIgTWQ9ZnVuY3Rpb24oYSl7SChIKEgoSChPYyhhKSxhLCJzZWxlY3QiLGEuYWIpLGEsInVuc2VsZWN0IixhLmJiKSxhLCJkaXNhYmxlIixhLlphKSxhLCJoaWRlIixhLiRhKX0sTGQ9ZnVuY3Rpb24oYSl7cmV0dXJuInN0YXJ0Ij09YXx8ImVuZCI9PWE/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O1ZjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBWfSk7ZnVuY3Rpb24gT2QoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIFBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgZz1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIrZyk7Zm9yKHZhciBrPVtdLHA9YmEoYyksdz1wLm5leHQoKTshdy5kb25lO3c9cC5uZXh0KCkpe3c9dy52YWx1ZTt2YXIgQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKQi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO0IudGV4dENvbnRlbnQ9dztmLmFwcGVuZENoaWxkKEIpO2sucHVzaChCKX0iYm90dG9tIiE9ZyYmZS5hcHBlbmRDaGlsZChmKTtwPW51bGw7aWYoInRvcCI9PWd8fCJib3R0b20iPT1nKXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTsidG9wIj09ZyYmcCYmZS5hcHBlbmRDaGlsZChwKTtCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0IuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciByYT1bXTtjPWJhKGMpO2Zvcih3PWMubmV4dCgpOyF3LmRvbmU7dz1jLm5leHQoKSl3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHcuaWQ9ZS5pZCsiX2NvbnRlbnRfIityYS5sZW5ndGgsdy5zdHlsZS5kaXNwbGF5PSJub25lIixCLmFwcGVuZENoaWxkKHcpLHJhLnB1c2godyk7ZS5hcHBlbmRDaGlsZChCKTsiYm90dG9tIj09ZyYmKHAmJgplLmFwcGVuZENoaWxkKHApLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBYPW5ldyBWKGcpO1BjKFgsZik7dmFyIFk9LTE7ZGMoWCwic2VsZWN0IixmdW5jdGlvbihaKXtaPWsuaW5kZXhPZihaLnRhcmdldC5mKCkpO1ohPVkmJigwPD1ZJiZZPHJhLmxlbmd0aCYmKHJhW1ldLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFk9LTEpLDA8PVomJlo8cmEubGVuZ3RoJiYoWT1aLHJhW1ldLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksWC5HKEwoWCxZKSkpfSk7WC5HKEwoWCxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFope1guRyhMKFgsWikpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChPZChhKSl9LFFkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sVz1sOwpRZFswXWluIFd8fCJ1bmRlZmluZWQiPT10eXBlb2YgVy5leGVjU2NyaXB0fHxXLmV4ZWNTY3JpcHQoInZhciAiK1FkWzBdKTtmb3IodmFyIFJkO1FkLmxlbmd0aCYmKFJkPVFkLnNoaWZ0KCkpOylRZC5sZW5ndGh8fHZvaWQgMD09PVBkP1dbUmRdJiZXW1JkXSE9PU9iamVjdC5wcm90b3R5cGVbUmRdP1c9V1tSZF06Vz1XW1JkXT17fTpXW1JkXT1QZDt9KS5jYWxsKHRoaXMpOwovLyBjbGFuZy1mb3JtYXQgb24K", + "headers": [ + [ + "content-type", + "application/javascript" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + } + } + }, + "executionInfo": { + "elapsed": 13629, + "status": "ok", + "timestamp": 1600709621336, + "user": { + "displayName": "Evgeny Skvortsov", + "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhiQjODaOVLfYnUuWS9rB3LRntzJDM0hqElzsUkdQ=s64", + "userId": "11510585406840398626" + }, + "user_tz": 420 + }, + "id": "6VFrsJycREkJ", + "outputId": "e61555d5-12cb-4bd9-b09a-7b16a3f20a98" + }, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id18" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id18" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id18" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"96432524-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id18\", \"tabNames\": [\"Engineers\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_dd3dbfb639" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id18" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"96439d2e-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id18\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_51aec723a1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id18" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"96452482-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_2a60ba96ca" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_1", + "outputarea_id18" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9645586c-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id18_content_1\");\n", + "//# sourceURL=js_4c26d19c95" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_1", + "outputarea_id18" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"96459c8c-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9645586c-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_71e9c012bc" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_1", + "outputarea_id18" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9645cd24-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id18\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_17030efcbc" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_1", + "outputarea_id18" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running Engineers\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"964892b6-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"96452482-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_d123540303" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_1", + "outputarea_id18" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"964a15dc-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_440169395c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_0", + "outputarea_id18" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"964a678a-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id18_content_0\");\n", + "//# sourceURL=js_85398843b1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_0", + "outputarea_id18" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"964ab92e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"964a678a-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_a1266c0363" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_0", + "outputarea_id18" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"964afc4a-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id18\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_a67ea3d797" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_0", + "outputarea_id18" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_0", + "outputarea_id18", + "outputarea_id19", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_0", + "outputarea_id18", + "outputarea_id19", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_0", + "outputarea_id18", + "outputarea_id19", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"964c8e84-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id19\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_bb9967fc28" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_0", + "outputarea_id18", + "outputarea_id19", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"964ce528-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id19\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_501c0c93b6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_0", + "outputarea_id18", + "outputarea_id19", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"964e1a7e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b95c64c253" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_0", + "id19_content_0", + "outputarea_id18", + "outputarea_id19", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"964e692a-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id19_content_0\");\n", + "//# sourceURL=js_ae378885c4" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_0", + "id19_content_0", + "outputarea_id18", + "outputarea_id19", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"964eb556-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"964e692a-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_4a79b71c10" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_0", + "id19_content_0", + "outputarea_id18", + "outputarea_id19", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"964efa0c-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id19\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_0915e0449c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_0", + "id19_content_0", + "outputarea_id18", + "outputarea_id19", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mEngineers_sql\u001b[0m variable.\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " \"Alice\" AS name,\n", + " \"Product Manager\" AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Bob\" AS name,\n", + " \"Engineer\" AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Caroline\" AS name,\n", + " \"Engineer\" AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"David\" AS name,\n", + " \"Data Scientist\" AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Eve\" AS name,\n", + " \"Data Scientist\" AS role\n", + " \n", + ") )\n", + "SELECT\n", + " Employee.*\n", + "FROM\n", + " t_0_Employee AS Employee\n", + "WHERE\n", + " Employee.role = \"Engineer\";\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"96501bbc-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"964e1a7e-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_d64cef9583" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_0", + "id19_content_0", + "outputarea_id18", + "outputarea_id19", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"96515ec8-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"964a15dc-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_33b6af1be7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_0", + "outputarea_id18" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9652d564-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_10e8ff755b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_1", + "outputarea_id18" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9653322a-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id18_content_1\");\n", + "//# sourceURL=js_93e0fc69ee" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_1", + "outputarea_id18" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"965380e0-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9653322a-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_bd7ac3c13c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_1", + "outputarea_id18" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9653c4c4-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id18\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_265c973d1a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_1", + "outputarea_id18" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"96e63d4a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9652d564-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_fe72c4c4d3" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_1", + "outputarea_id18" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"96ea897c-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_4ea778f083" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_0", + "outputarea_id18" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"96eb173e-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id18_content_0\");\n", + "//# sourceURL=js_23170b2de0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_0", + "outputarea_id18" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"96eb968c-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"96eb173e-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_67e5eb51e2" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_0", + "outputarea_id18" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"96ebf3a2-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id18\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_1009e24719" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_0", + "outputarea_id18" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"96ed2b78-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_ed2c82ffbd" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_0", + "id19_content_1", + "outputarea_id18", + "outputarea_id19", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"96ed7e02-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id19_content_1\");\n", + "//# sourceURL=js_85805b1f7f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_0", + "id19_content_1", + "outputarea_id18", + "outputarea_id19", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"96edaf76-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"96ed7e02-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_863e396391" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_0", + "id19_content_1", + "outputarea_id18", + "outputarea_id19", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"96ee2c1c-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id19\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_769fa999fc" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_0", + "id19_content_1", + "outputarea_id18", + "outputarea_id19", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mEngineers\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
namerole
0BobEngineer
1CarolineEngineer
\n", + "
" + ], + "text/plain": [ + " name role\n", + "0 Bob Engineer\n", + "1 Caroline Engineer" + ] + }, + "metadata": { + "tags": [ + "id18_content_0", + "id19_content_1", + "outputarea_id18", + "outputarea_id19", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"96f1ce08-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"96ed2b78-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_c3311d3c17" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_0", + "id19_content_1", + "outputarea_id18", + "outputarea_id19", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"96f312fe-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"96ea897c-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_9ff16599bc" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id18_content_0", + "outputarea_id18" + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "%%logica Engineers\n", + "\n", + "Employee(name: \"Alice\", role: \"Product Manager\");\n", + "Employee(name: \"Bob\", role: \"Engineer\");\n", + "Employee(name: \"Caroline\", role: \"Engineer\");\n", + "Employee(name: \"David\", role: \"Data Scientist\");\n", + "Employee(name: \"Eve\", role: \"Data Scientist\");\n", + "\n", + "Engineers(..r) :- Employee(..r), r.role == \"Engineer\";" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "pna_1hZsaQZv" + }, + "source": [ + "### Conjunction (aka Join)\n", + "\n", + "To join a few tables simply list the tables in the body and connect columns via same name, or via using `==`.\n", + "\n", + "Note that logically the items listed via comma in the body of the rule can be thought of as conjuncts whether they are constraints, or joined tables." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 301, + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH0=", + "headers": [ + [ + "content-type", + "text/css" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgaCxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9ZnVuY3Rpb24oYSl7dmFyIGI9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmYVtTeW1ib2wuaXRlcmF0b3JdO3JldHVybiBiP2IuY2FsbChhKTp7bmV4dDphYShhKX19LGw9dGhpc3x8c2VsZixjYT1mdW5jdGlvbigpe30sZGE9ZnVuY3Rpb24oYSl7YS5CYT12b2lkIDA7YS5SPWZ1bmN0aW9uKCl7cmV0dXJuIGEuQmE/YS5CYTphLkJhPW5ldyBhfX0sZWE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7aWYoIm9iamVjdCI9PWIpaWYoYSl7aWYoYSBpbnN0YW5jZW9mIEFycmF5KXJldHVybiJhcnJheSI7aWYoYSBpbnN0YW5jZW9mIE9iamVjdClyZXR1cm4gYjt2YXIgYz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk7aWYoIltvYmplY3QgV2luZG93XSI9PWMpcmV0dXJuIm9iamVjdCI7CmlmKCJbb2JqZWN0IEFycmF5XSI9PWN8fCJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGgmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5zcGxpY2UmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoInNwbGljZSIpKXJldHVybiJhcnJheSI7aWYoIltvYmplY3QgRnVuY3Rpb25dIj09Y3x8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmNhbGwmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoImNhbGwiKSlyZXR1cm4iZnVuY3Rpb24ifWVsc2UgcmV0dXJuIm51bGwiO2Vsc2UgaWYoImZ1bmN0aW9uIj09YiYmInVuZGVmaW5lZCI9PXR5cGVvZiBhLmNhbGwpcmV0dXJuIm9iamVjdCI7cmV0dXJuIGJ9LGZhPWZ1bmN0aW9uKGEpe3JldHVybiJhcnJheSI9PWVhKGEpfSxoYT1mdW5jdGlvbihhKXt2YXIgYj1lYShhKTtyZXR1cm4iYXJyYXkiPT1ifHwib2JqZWN0Ij09CmImJiJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGh9LGlhPWZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PWVhKGEpfSxtPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBhO3JldHVybiJvYmplY3QiPT1iJiZudWxsIT1hfHwiZnVuY3Rpb24iPT1ifSxqYT0iY2xvc3VyZV91aWRfIisoMUU5Kk1hdGgucmFuZG9tKCk+Pj4wKSxrYT0wLGxhPWZ1bmN0aW9uKGEsYil7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe3ZhciBkPWMuc2xpY2UoKTtkLnB1c2guYXBwbHkoZCxhcmd1bWVudHMpO3JldHVybiBhLmFwcGx5KHRoaXMsZCl9fSxuPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe31jLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLmk9Yi5wcm90b3R5cGU7YS5wcm90b3R5cGU9bmV3IGM7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YX07dmFyIG1hLG5hPXtlYjoiYWN0aXZlZGVzY2VuZGFudCIsamI6ImF0b21pYyIsa2I6ImF1dG9jb21wbGV0ZSIsbWI6ImJ1c3kiLHBiOiJjaGVja2VkIixxYjoiY29saW5kZXgiLHZiOiJjb250cm9scyIseGI6ImRlc2NyaWJlZGJ5IixBYjoiZGlzYWJsZWQiLENiOiJkcm9wZWZmZWN0IixEYjoiZXhwYW5kZWQiLEViOiJmbG93dG8iLEdiOiJncmFiYmVkIixLYjoiaGFzcG9wdXAiLE1iOiJoaWRkZW4iLE9iOiJpbnZhbGlkIixQYjoibGFiZWwiLFFiOiJsYWJlbGxlZGJ5IixSYjoibGV2ZWwiLFdiOiJsaXZlIixrYzoibXVsdGlsaW5lIixsYzoibXVsdGlzZWxlY3RhYmxlIixwYzoib3JpZW50YXRpb24iLHFjOiJvd25zIixyYzoicG9zaW5zZXQiLHRjOiJwcmVzc2VkIix4YzoicmVhZG9ubHkiLHpjOiJyZWxldmFudCIsQWM6InJlcXVpcmVkIixFYzoicm93aW5kZXgiLEhjOiJzZWxlY3RlZCIsSmM6InNldHNpemUiLExjOiJzb3J0IixaYzoidmFsdWVtYXgiLCRjOiJ2YWx1ZW1pbiIsYWQ6InZhbHVlbm93IiwKYmQ6InZhbHVldGV4dCJ9O3ZhciBvYT1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkIGluIGEpYi5jYWxsKGMsYVtkXSxkLGEpfSxwYT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyBpbiBhKWlmKGFbY109PWIpcmV0dXJuITA7cmV0dXJuITF9LHFhPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsIT09YSYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfSxzYT1mdW5jdGlvbihhKXt2YXIgYj17fSxjO2ZvcihjIGluIGEpYlthW2NdXT1jO3JldHVybiBifSx0YT0iY29uc3RydWN0b3IgaGFzT3duUHJvcGVydHkgaXNQcm90b3R5cGVPZiBwcm9wZXJ0eUlzRW51bWVyYWJsZSB0b0xvY2FsZVN0cmluZyB0b1N0cmluZyB2YWx1ZU9mIi5zcGxpdCgiICIpLHVhPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8dGEubGVuZ3RoO2YrKyljPQp0YVtmXSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZCxjKSYmKGFbY109ZFtjXSl9fTt2YXIgdmE9e2ZiOiJhbGVydCIsZ2I6ImFsZXJ0ZGlhbG9nIixoYjoiYXBwbGljYXRpb24iLGliOiJhcnRpY2xlIixsYjoiYmFubmVyIixuYjoiYnV0dG9uIixvYjoiY2hlY2tib3giLHJiOiJjb2x1bW5oZWFkZXIiLHNiOiJjb21ib2JveCIsdGI6ImNvbXBsZW1lbnRhcnkiLHViOiJjb250ZW50aW5mbyIsd2I6ImRlZmluaXRpb24iLHliOiJkaWFsb2ciLHpiOiJkaXJlY3RvcnkiLEJiOiJkb2N1bWVudCIsRmI6ImZvcm0iLEhiOiJncmlkIixJYjoiZ3JpZGNlbGwiLEpiOiJncm91cCIsTGI6ImhlYWRpbmciLE5iOiJpbWciLFNiOiJsaW5rIixUYjoibGlzdCIsVWI6Imxpc3Rib3giLFZiOiJsaXN0aXRlbSIsWGI6ImxvZyIsWWI6Im1haW4iLFpiOiJtYXJxdWVlIiwkYjoibWF0aCIsYWM6Im1lbnUiLGJjOiJtZW51YmFyIixjYzoibWVudWl0ZW0iLGRjOiJtZW51aXRlbWNoZWNrYm94IixlYzoibWVudWl0ZW1yYWRpbyIsbWM6Im5hdmlnYXRpb24iLG5jOiJub3RlIixvYzoib3B0aW9uIiwKc2M6InByZXNlbnRhdGlvbiIsdWM6InByb2dyZXNzYmFyIix2YzoicmFkaW8iLHdjOiJyYWRpb2dyb3VwIix5YzoicmVnaW9uIixCYzoicm93IixDYzoicm93Z3JvdXAiLERjOiJyb3doZWFkZXIiLEZjOiJzY3JvbGxiYXIiLEdjOiJzZWFyY2giLEljOiJzZXBhcmF0b3IiLEtjOiJzbGlkZXIiLE1jOiJzcGluYnV0dG9uIixOYzoic3RhdHVzIixPYzoidGFiIixQYzoidGFibGlzdCIsUWM6InRhYnBhbmVsIixSYzoidGV4dGJveCIsU2M6InRleHRpbmZvIixUYzoidGltZXIiLFVjOiJ0b29sYmFyIixWYzoidG9vbHRpcCIsV2M6InRyZWUiLFhjOiJ0cmVlZ3JpZCIsWWM6InRyZWVpdGVtIn07dmFyIHdhPWZ1bmN0aW9uKGEpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsd2EpO2Vsc2V7dmFyIGI9RXJyb3IoKS5zdGFjaztiJiYodGhpcy5zdGFjaz1iKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSl9O24od2EsRXJyb3IpO3dhLnByb3RvdHlwZS5uYW1lPSJDdXN0b21FcnJvciI7dmFyIHhhO3ZhciB5YT1mdW5jdGlvbihhLGIpe2E9YS5zcGxpdCgiJXMiKTtmb3IodmFyIGM9IiIsZD1hLmxlbmd0aC0xLGU9MDtlPGQ7ZSsrKWMrPWFbZV0rKGU8Yi5sZW5ndGg/YltlXToiJXMiKTt3YS5jYWxsKHRoaXMsYythW2RdKX07bih5YSx3YSk7eWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjsKdmFyIHphPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSJBc3NlcnRpb24gZmFpbGVkIjtpZihjKXtlKz0iOiAiK2M7dmFyIGY9ZH1lbHNlIGEmJihlKz0iOiAiK2EsZj1iKTt0aHJvdyBuZXcgeWEoIiIrZSxmfHxbXSk7fSxxPWZ1bmN0aW9uKGEsYixjKXthfHx6YSgiIixudWxsLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX0sQWE9ZnVuY3Rpb24oYSxiLGMpe20oYSkmJjE9PWEubm9kZVR5cGV8fHphKCJFeHBlY3RlZCBFbGVtZW50IGJ1dCBnb3QgJXM6ICVzLiIsW2VhKGEpLGFdLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKX0sQ2E9ZnVuY3Rpb24oYSxiLGMsZCl7YSBpbnN0YW5jZW9mIGJ8fHphKCJFeHBlY3RlZCBpbnN0YW5jZW9mICVzIGJ1dCBnb3QgJXMuIixbQmEoYiksQmEoYSldLGMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpKX0sQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZgpGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTpudWxsPT09YT8ibnVsbCI6dHlwZW9mIGF9O3ZhciBEYT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3EobnVsbCE9YS5sZW5ndGgpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKCJzdHJpbmciPT09dHlwZW9mIGEpcmV0dXJuInN0cmluZyIhPT10eXBlb2YgYnx8MSE9Yi5sZW5ndGg/LTE6YS5pbmRleE9mKGIsMCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspaWYoYyBpbiBhJiZhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX0scj1BcnJheS5wcm90b3R5cGUuZm9yRWFjaD9mdW5jdGlvbihhLGIsYyl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsYyl9OmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9YS5sZW5ndGgsZT0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZj0wO2Y8ZDtmKyspZiBpbiBlJiZiLmNhbGwoYyxlW2ZdLGYsYSl9LEVhPUFycmF5LnByb3RvdHlwZS5maWx0ZXI/CmZ1bmN0aW9uKGEsYil7cShudWxsIT1hLmxlbmd0aCk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD1bXSxlPTAsZj0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZz0wO2c8YztnKyspaWYoZyBpbiBmKXt2YXIgaz1mW2ddO2IuY2FsbCh2b2lkIDAsayxnLGEpJiYoZFtlKytdPWspfXJldHVybiBkfSxGYT1BcnJheS5wcm90b3R5cGUuZXZlcnk/ZnVuY3Rpb24oYSxiKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmV2ZXJ5LmNhbGwoYSxiLHZvaWQgMCl9OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWEubGVuZ3RoLGQ9InN0cmluZyI9PT10eXBlb2YgYT9hLnNwbGl0KCIiKTphLGU9MDtlPGM7ZSsrKWlmKGUgaW4gZCYmIWIuY2FsbCh2b2lkIDAsZFtlXSxlLGEpKXJldHVybiExO3JldHVybiEwfSxHYT1mdW5jdGlvbihhLGIpe3JldHVybiAwPD0KRGEoYSxiKX0sSGE9ZnVuY3Rpb24oYSxiKXtiPURhKGEsYik7dmFyIGM7aWYoYz0wPD1iKXEobnVsbCE9YS5sZW5ndGgpLEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhLGIsMSk7cmV0dXJuIGN9LElhPWZ1bmN0aW9uKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGFyZ3VtZW50cyl9LEphPWZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDA8Yil7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX0sTGE9ZnVuY3Rpb24oYSxiLGMsZCl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShhLEthKGFyZ3VtZW50cywxKSl9LEthPWZ1bmN0aW9uKGEsYixjKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gMj49YXJndW1lbnRzLmxlbmd0aD9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsYixjKX07dmFyIE1hPVN0cmluZy5wcm90b3R5cGUudHJpbT9mdW5jdGlvbihhKXtyZXR1cm4gYS50cmltKCl9OmZ1bmN0aW9uKGEpe3JldHVybi9eW1xzXHhhMF0qKFtcc1xTXSo/KVtcc1x4YTBdKiQvLmV4ZWMoYSlbMV19LE5hPS8mL2csT2E9LzwvZyxQYT0vPi9nLFFhPS8iL2csUmE9LycvZyxTYT0vXHgwMC9nLFRhPS9bXHgwMCY8PiInXS8sdD1mdW5jdGlvbihhLGIpe3JldHVybi0xIT1hLmluZGV4T2YoYil9LFVhPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE8Yj8tMTphPmI/MTowfTt2YXIgdTthOnt2YXIgVmE9bC5uYXZpZ2F0b3I7aWYoVmEpe3ZhciBXYT1WYS51c2VyQWdlbnQ7aWYoV2Epe3U9V2E7YnJlYWsgYX19dT0iIn07LyoKCiBDb3B5cmlnaHQgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzLgogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKKi8KdmFyIFhhPWZ1bmN0aW9uKGEpe1RhLnRlc3QoYSkmJigtMSE9YS5pbmRleE9mKCImIikmJihhPWEucmVwbGFjZShOYSwiJmFtcDsiKSksLTEhPWEuaW5kZXhPZigiPCIpJiYoYT1hLnJlcGxhY2UoT2EsIiZsdDsiKSksLTEhPWEuaW5kZXhPZigiPiIpJiYoYT1hLnJlcGxhY2UoUGEsIiZndDsiKSksLTEhPWEuaW5kZXhPZignIicpJiYoYT1hLnJlcGxhY2UoUWEsIiZxdW90OyIpKSwtMSE9YS5pbmRleE9mKCInIikmJihhPWEucmVwbGFjZShSYSwiJiMzOTsiKSksLTEhPWEuaW5kZXhPZigiXHgwMCIpJiYoYT1hLnJlcGxhY2UoU2EsIiYjMDsiKSkpO3JldHVybiBhfTt2YXIgWWE9ZnVuY3Rpb24oYSl7WWFbIiAiXShhKTtyZXR1cm4gYX07WWFbIiAiXT1jYTt2YXIgJGE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1aYTtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsYSk/Y1thXTpjW2FdPWIoYSl9O3ZhciBhYj10KHUsIk9wZXJhIiksdj10KHUsIlRyaWRlbnQiKXx8dCh1LCJNU0lFIiksYmI9dCh1LCJFZGdlIikseD10KHUsIkdlY2tvIikmJiEodCh1LnRvTG93ZXJDYXNlKCksIndlYmtpdCIpJiYhdCh1LCJFZGdlIikpJiYhKHQodSwiVHJpZGVudCIpfHx0KHUsIk1TSUUiKSkmJiF0KHUsIkVkZ2UiKSx5PXQodS50b0xvd2VyQ2FzZSgpLCJ3ZWJraXQiKSYmIXQodSwiRWRnZSIpLHo9dCh1LCJNYWNpbnRvc2giKSxjYj1mdW5jdGlvbigpe3ZhciBhPWwuZG9jdW1lbnQ7cmV0dXJuIGE/YS5kb2N1bWVudE1vZGU6dm9pZCAwfSxkYjsKYTp7dmFyIGViPSIiLGZiPWZ1bmN0aW9uKCl7dmFyIGE9dTtpZih4KXJldHVybi9ydjooW15cKTtdKykoXCl8OykvLmV4ZWMoYSk7aWYoYmIpcmV0dXJuL0VkZ2VcLyhbXGRcLl0rKS8uZXhlYyhhKTtpZih2KXJldHVybi9cYig/Ok1TSUV8cnYpWzogXShbXlwpO10rKShcKXw7KS8uZXhlYyhhKTtpZih5KXJldHVybi9XZWJLaXRcLyhcUyspLy5leGVjKGEpO2lmKGFiKXJldHVybi8oPzpWZXJzaW9uKVsgXC9dPyhcUyspLy5leGVjKGEpfSgpO2ZiJiYoZWI9ZmI/ZmJbMV06IiIpO2lmKHYpe3ZhciBnYj1jYigpO2lmKG51bGwhPWdiJiZnYj5wYXJzZUZsb2F0KGViKSl7ZGI9U3RyaW5nKGdiKTticmVhayBhfX1kYj1lYn0KdmFyIGhiPWRiLFphPXt9LEE9ZnVuY3Rpb24oYSl7cmV0dXJuICRhKGEsZnVuY3Rpb24oKXtmb3IodmFyIGI9MCxjPU1hKFN0cmluZyhoYikpLnNwbGl0KCIuIiksZD1NYShTdHJpbmcoYSkpLnNwbGl0KCIuIiksZT1NYXRoLm1heChjLmxlbmd0aCxkLmxlbmd0aCksZj0wOzA9PWImJmY8ZTtmKyspe3ZhciBnPWNbZl18fCIiLGs9ZFtmXXx8IiI7ZG97Zz0vKFxkKikoXEQqKSguKikvLmV4ZWMoZyl8fFsiIiwiIiwiIiwiIl07az0vKFxkKikoXEQqKSguKikvLmV4ZWMoayl8fFsiIiwiIiwiIiwiIl07aWYoMD09Z1swXS5sZW5ndGgmJjA9PWtbMF0ubGVuZ3RoKWJyZWFrO2I9VWEoMD09Z1sxXS5sZW5ndGg/MDpwYXJzZUludChnWzFdLDEwKSwwPT1rWzFdLmxlbmd0aD8wOnBhcnNlSW50KGtbMV0sMTApKXx8VWEoMD09Z1syXS5sZW5ndGgsMD09a1syXS5sZW5ndGgpfHxVYShnWzJdLGtbMl0pO2c9Z1szXTtrPWtbM119d2hpbGUoMD09Yil9cmV0dXJuIDA8PWJ9KX0saWI7CmliPWwuZG9jdW1lbnQmJnY/Y2IoKTp2b2lkIDA7dmFyIGpiPSF2fHw5PD1OdW1iZXIoaWIpO3ZhciBsYj1mdW5jdGlvbihhLGIpe29hKGIsZnVuY3Rpb24oYyxkKXtjJiYib2JqZWN0Ij09dHlwZW9mIGMmJmMuZGQmJihjPWMuY2QoKSk7InN0eWxlIj09ZD9hLnN0eWxlLmNzc1RleHQ9YzoiY2xhc3MiPT1kP2EuY2xhc3NOYW1lPWM6ImZvciI9PWQ/YS5odG1sRm9yPWM6a2IuaGFzT3duUHJvcGVydHkoZCk/YS5zZXRBdHRyaWJ1dGUoa2JbZF0sYyk6MD09ZC5sYXN0SW5kZXhPZigiYXJpYS0iLDApfHwwPT1kLmxhc3RJbmRleE9mKCJkYXRhLSIsMCk/YS5zZXRBdHRyaWJ1dGUoZCxjKTphW2RdPWN9KX0sa2I9e2NlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjb2xzcGFuOiJjb2xTcGFuIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGhlaWdodDoiaGVpZ2h0IixtYXhsZW5ndGg6Im1heExlbmd0aCIsbm9uY2U6Im5vbmNlIixyb2xlOiJyb2xlIixyb3dzcGFuOiJyb3dTcGFuIix0eXBlOiJ0eXBlIix1c2VtYXA6InVzZU1hcCIsdmFsaWduOiJ2QWxpZ24iLAp3aWR0aDoid2lkdGgifSxtYj1mdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChrKXtrJiZiLmFwcGVuZENoaWxkKCJzdHJpbmciPT09dHlwZW9mIGs/YS5jcmVhdGVUZXh0Tm9kZShrKTprKX1mb3IodmFyIGU9MjtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXTtpZighaGEoZil8fG0oZikmJjA8Zi5ub2RlVHlwZSlkKGYpO2Vsc2V7YTp7aWYoZiYmIm51bWJlciI9PXR5cGVvZiBmLmxlbmd0aCl7aWYobShmKSl7dmFyIGc9ImZ1bmN0aW9uIj09dHlwZW9mIGYuaXRlbXx8InN0cmluZyI9PXR5cGVvZiBmLml0ZW07YnJlYWsgYX1pZihpYShmKSl7Zz0iZnVuY3Rpb24iPT10eXBlb2YgZi5pdGVtO2JyZWFrIGF9fWc9ITF9cihnP0phKGYpOmYsZCl9fX0sbmI9ZnVuY3Rpb24oYSxiKXtiPVN0cmluZyhiKTsiYXBwbGljYXRpb24veGh0bWwreG1sIj09PWEuY29udGVudFR5cGUmJihiPWIudG9Mb3dlckNhc2UoKSk7cmV0dXJuIGEuY3JlYXRlRWxlbWVudChiKX0sb2I9ZnVuY3Rpb24oYSl7YSYmCmEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpfSxwYj1mdW5jdGlvbihhLGIpe2lmKCFhfHwhYilyZXR1cm4hMTtpZihhLmNvbnRhaW5zJiYxPT1iLm5vZGVUeXBlKXJldHVybiBhPT1ifHxhLmNvbnRhaW5zKGIpO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbilyZXR1cm4gYT09Ynx8ISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNik7Zm9yKDtiJiZhIT1iOyliPWIucGFyZW50Tm9kZTtyZXR1cm4gYj09YX0scWI9ZnVuY3Rpb24oYSl7cShhLCJOb2RlIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4iKTtyZXR1cm4gOT09YS5ub2RlVHlwZT9hOmEub3duZXJEb2N1bWVudHx8YS5kb2N1bWVudH0scmI9ZnVuY3Rpb24oYSxiKXtiP2EudGFiSW5kZXg9MDooYS50YWJJbmRleD0tMSxhLnJlbW92ZUF0dHJpYnV0ZSgidGFiSW5kZXgiKSl9LHNiPWZ1bmN0aW9uKGEpe3JldHVybiB2JiYhQSgiOSIpPyhhPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKSwKbnVsbCE9YSYmYS5zcGVjaWZpZWQpOmEuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpfSx0Yj1mdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgYSYmMDw9YSYmMzI3Njg+YX0sdWI9ZnVuY3Rpb24oYSl7dGhpcy5hPWF8fGwuZG9jdW1lbnR8fGRvY3VtZW50fTt1Yi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBhP3RoaXMuYS5nZXRFbGVtZW50QnlJZChhKTphfTsKdWIucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuYSxlPWFyZ3VtZW50cyxmPVN0cmluZyhlWzBdKSxnPWVbMV07aWYoIWpiJiZnJiYoZy5uYW1lfHxnLnR5cGUpKXtmPVsiPCIsZl07Zy5uYW1lJiZmLnB1c2goJyBuYW1lPSInLFhhKGcubmFtZSksJyInKTtpZihnLnR5cGUpe2YucHVzaCgnIHR5cGU9IicsWGEoZy50eXBlKSwnIicpO3ZhciBrPXt9O3VhKGssZyk7ZGVsZXRlIGsudHlwZTtnPWt9Zi5wdXNoKCI+Iik7Zj1mLmpvaW4oIiIpfWY9bmIoZCxmKTtnJiYoInN0cmluZyI9PT10eXBlb2YgZz9mLmNsYXNzTmFtZT1nOmZhKGcpP2YuY2xhc3NOYW1lPWcuam9pbigiICIpOmxiKGYsZykpOzI8ZS5sZW5ndGgmJm1iKGQsZixlKTtyZXR1cm4gZn07dmFyIHZiPWZ1bmN0aW9uKGEsYil7Yj8ocShwYSh2YSxiKSwiTm8gc3VjaCBBUklBIHJvbGUgIitiKSxhLnNldEF0dHJpYnV0ZSgicm9sZSIsYikpOmEucmVtb3ZlQXR0cmlidXRlKCJyb2xlIil9LHhiPWZ1bmN0aW9uKGEsYixjKXtmYShjKSYmKGM9Yy5qb2luKCIgIikpO3ZhciBkPXdiKGIpOyIiPT09Y3x8dm9pZCAwPT1jPyhtYXx8KG1hPXthdG9taWM6ITEsYXV0b2NvbXBsZXRlOiJub25lIixkcm9wZWZmZWN0OiJub25lIixoYXNwb3B1cDohMSxsaXZlOiJvZmYiLG11bHRpbGluZTohMSxtdWx0aXNlbGVjdGFibGU6ITEsb3JpZW50YXRpb246InZlcnRpY2FsIixyZWFkb25seTohMSxyZWxldmFudDoiYWRkaXRpb25zIHRleHQiLHJlcXVpcmVkOiExLHNvcnQ6Im5vbmUiLGJ1c3k6ITEsZGlzYWJsZWQ6ITEsaGlkZGVuOiExLGludmFsaWQ6ImZhbHNlIn0pLGM9bWEsYiBpbiBjP2Euc2V0QXR0cmlidXRlKGQsY1tiXSk6YS5yZW1vdmVBdHRyaWJ1dGUoZCkpOmEuc2V0QXR0cmlidXRlKGQsCmMpfSx3Yj1mdW5jdGlvbihhKXtxKGEsIkFSSUEgYXR0cmlidXRlIGNhbm5vdCBiZSBlbXB0eS4iKTtxKHBhKG5hLGEpLCJObyBzdWNoIEFSSUEgYXR0cmlidXRlICIrYSk7cmV0dXJuImFyaWEtIithfTt2YXIgeWI9T2JqZWN0LmZyZWV6ZXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O3ZhciBDPWZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVTt0aGlzLko9dGhpcy5KfTtDLnByb3RvdHlwZS5VPSExO0MucHJvdG90eXBlLk49ZnVuY3Rpb24oKXt0aGlzLlV8fCh0aGlzLlU9ITAsdGhpcy51KCkpfTt2YXIgemI9ZnVuY3Rpb24oYSxiKXthLlU/YigpOihhLkp8fChhLko9W10pLGEuSi5wdXNoKGIpKX07Qy5wcm90b3R5cGUudT1mdW5jdGlvbigpe2lmKHRoaXMuSilmb3IoO3RoaXMuSi5sZW5ndGg7KXRoaXMuSi5zaGlmdCgpKCl9O3ZhciBBYj1mdW5jdGlvbihhKXthJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5OJiZhLk4oKX07dmFyIEJiPWZ1bmN0aW9uKGEpe3JldHVybiJzdHJpbmciPT10eXBlb2YgYS5jbGFzc05hbWU/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sRD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6QmIoYSkubWF0Y2goL1xTKy9nKXx8W119LENiPWZ1bmN0aW9uKGEsYil7InN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZT9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxEYj1mdW5jdGlvbihhLGIpe3JldHVybiBhLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5jb250YWlucyhiKTpHYShEKGEpLGIpfSxFYj1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFEYihhLGIpKXt2YXIgYz1CYihhKTtDYihhLGMrKDA8Yy5sZW5ndGg/IiAiK2I6YikpfX0sRmI9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClyKGIsCmZ1bmN0aW9uKGUpe0ViKGEsZSl9KTtlbHNle3ZhciBjPXt9O3IoRChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7cihiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPTA8Yi5sZW5ndGg/IiAiK2Q6ZDtDYihhLGIpfX0sR2I9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6RGIoYSxiKSYmQ2IoYSxFYShEKGEpLGZ1bmN0aW9uKGMpe3JldHVybiBjIT1ifSkuam9pbigiICIpKX0sSGI9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9yKGIsZnVuY3Rpb24oYyl7R2IoYSxjKX0pOkNiKGEsRWEoRChhKSxmdW5jdGlvbihjKXtyZXR1cm4hR2EoYixjKX0pLmpvaW4oIiAiKSl9O3ZhciBJYj0hdnx8OTw9TnVtYmVyKGliKSxKYj0hdnx8OTw9TnVtYmVyKGliKSxLYj12JiYhQSgiOSIpLExiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e2wuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsY2EsYiksbC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjYSxiKX1jYXRjaChjKXt9cmV0dXJuIGF9KCk7dmFyIEU9ZnVuY3Rpb24oYSxiKXt0aGlzLnR5cGU9YTt0aGlzLmE9dGhpcy50YXJnZXQ9Yjt0aGlzLmg9ITE7dGhpcy5LYT0hMH07RS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuaD0hMH07RS5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3RoaXMuS2E9ITF9O3ZhciBGPXtMOiJtb3VzZWRvd24iLE06Im1vdXNldXAiLGFhOiJtb3VzZWNhbmNlbCIsaGM6Im1vdXNlbW92ZSIsamM6Im1vdXNlb3ZlciIsaWM6Im1vdXNlb3V0IixmYzoibW91c2VlbnRlciIsZ2M6Im1vdXNlbGVhdmUifTt2YXIgRz1mdW5jdGlvbihhLGIpe0UuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy5hPXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5jPTA7dGhpcy5BPXRoaXMubWV0YUtleT10aGlzLnNoaWZ0S2V5PXRoaXMuYWx0S2V5PXRoaXMuY3RybEtleT0hMTt0aGlzLnBvaW50ZXJJZD0wO3RoaXMucG9pbnRlclR5cGU9IiI7dGhpcy5iPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMuYT1iO2lmKGI9YS5yZWxhdGVkVGFyZ2V0KXtpZih4KXthOnt0cnl7WWEoYi5ub2RlTmFtZSk7dmFyIGU9ITA7YnJlYWsgYX1jYXRjaChmKXt9ZT0KITF9ZXx8KGI9bnVsbCl9fWVsc2UibW91c2VvdmVyIj09Yz9iPWEuZnJvbUVsZW1lbnQ6Im1vdXNlb3V0Ij09YyYmKGI9YS50b0VsZW1lbnQpO3RoaXMucmVsYXRlZFRhcmdldD1iO2Q/KHRoaXMuY2xpZW50WD12b2lkIDAhPT1kLmNsaWVudFg/ZC5jbGllbnRYOmQucGFnZVgsdGhpcy5jbGllbnRZPXZvaWQgMCE9PWQuY2xpZW50WT9kLmNsaWVudFk6ZC5wYWdlWSx0aGlzLnNjcmVlblg9ZC5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1kLnNjcmVlbll8fDApOih0aGlzLmNsaWVudFg9dm9pZCAwIT09YS5jbGllbnRYP2EuY2xpZW50WDphLnBhZ2VYLHRoaXMuY2xpZW50WT12b2lkIDAhPT1hLmNsaWVudFk/YS5jbGllbnRZOmEucGFnZVksdGhpcy5zY3JlZW5YPWEuc2NyZWVuWHx8MCx0aGlzLnNjcmVlblk9YS5zY3JlZW5ZfHwwKTt0aGlzLmJ1dHRvbj1hLmJ1dHRvbjt0aGlzLmM9YS5rZXlDb2RlfHwwO3RoaXMua2V5PWEua2V5fHwiIjt0aGlzLmN0cmxLZXk9YS5jdHJsS2V5O3RoaXMuYWx0S2V5PQphLmFsdEtleTt0aGlzLnNoaWZ0S2V5PWEuc2hpZnRLZXk7dGhpcy5tZXRhS2V5PWEubWV0YUtleTt0aGlzLkE9ej9hLm1ldGFLZXk6YS5jdHJsS2V5O3RoaXMucG9pbnRlcklkPWEucG9pbnRlcklkfHwwO3RoaXMucG9pbnRlclR5cGU9InN0cmluZyI9PT10eXBlb2YgYS5wb2ludGVyVHlwZT9hLnBvaW50ZXJUeXBlOk1iW2EucG9pbnRlclR5cGVdfHwiIjt0aGlzLmI9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnRoaXMuZygpfX07bihHLEUpO3ZhciBOYj15YihbMSw0LDJdKSxNYj15Yih7MjoidG91Y2giLDM6InBlbiIsNDoibW91c2UifSksT2I9ZnVuY3Rpb24oYSl7cmV0dXJuIEliPzA9PWEuYi5idXR0b246ImNsaWNrIj09YS50eXBlPyEwOiEhKGEuYi5idXR0b24mTmJbMF0pfTtHLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7Ry5pLmouY2FsbCh0aGlzKTt0aGlzLmIuc3RvcFByb3BhZ2F0aW9uP3RoaXMuYi5zdG9wUHJvcGFnYXRpb24oKTp0aGlzLmIuY2FuY2VsQnViYmxlPSEwfTsKRy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe0cuaS5nLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5iO2lmKGEucHJldmVudERlZmF1bHQpYS5wcmV2ZW50RGVmYXVsdCgpO2Vsc2UgaWYoYS5yZXR1cm5WYWx1ZT0hMSxLYil0cnl7aWYoYS5jdHJsS2V5fHwxMTI8PWEua2V5Q29kZSYmMTIzPj1hLmtleUNvZGUpYS5rZXlDb2RlPS0xfWNhdGNoKGIpe319O3ZhciBQYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKDFFNipNYXRoLnJhbmRvbSgpfDApLFFiPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW1BiXSl9LFJiPTA7dmFyIFNiPWZ1bmN0aW9uKGEsYixjLGQsZSl7dGhpcy5saXN0ZW5lcj1hO3RoaXMuYT1udWxsO3RoaXMuc3JjPWI7dGhpcy50eXBlPWM7dGhpcy5jYXB0dXJlPSEhZDt0aGlzLm1hPWU7dGhpcy5rZXk9KytSYjt0aGlzLlg9dGhpcy5oYT0hMX0sVGI9ZnVuY3Rpb24oYSl7YS5YPSEwO2EubGlzdGVuZXI9bnVsbDthLmE9bnVsbDthLnNyYz1udWxsO2EubWE9bnVsbH07dmFyIFViPWZ1bmN0aW9uKGEpe3RoaXMuc3JjPWE7dGhpcy5hPXt9O3RoaXMuYj0wfTtVYi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS50b1N0cmluZygpO2E9dGhpcy5hW2ZdO2F8fChhPXRoaXMuYVtmXT1bXSx0aGlzLmIrKyk7dmFyIGc9VmIoYSxiLGQsZSk7LTE8Zz8oYj1hW2ddLGN8fChiLmhhPSExKSk6KGI9bmV3IFNiKGIsdGhpcy5zcmMsZiwhIWQsZSksYi5oYT1jLGEucHVzaChiKSk7cmV0dXJuIGJ9Owp2YXIgV2I9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLnR5cGU7YyBpbiBhLmEmJkhhKGEuYVtjXSxiKSYmKFRiKGIpLDA9PWEuYVtjXS5sZW5ndGgmJihkZWxldGUgYS5hW2NdLGEuYi0tKSl9LFhiPWZ1bmN0aW9uKGEsYixjLGQsZSl7YT1hLmFbYi50b1N0cmluZygpXTtiPS0xO2EmJihiPVZiKGEsYyxkLGUpKTtyZXR1cm4tMTxiP2FbYl06bnVsbH0sVmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuWCYmZi5saXN0ZW5lcj09YiYmZi5jYXB0dXJlPT0hIWMmJmYubWE9PWQpcmV0dXJuIGV9cmV0dXJuLTF9O3ZhciBZYj0iY2xvc3VyZV9sbV8iKygxRTYqTWF0aC5yYW5kb20oKXwwKSxaYj17fSwkYj0wLGJjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZCYmZC5vbmNlKXJldHVybiBhYyhhLGIsYyxkLGUpO2lmKGZhKGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyliYyhhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9Y2MoYyk7cmV0dXJuIFFiKGEpP2RjKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOmVjKGEsYixjLCExLGQsZSl9LGVjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGc9bShlKT8hIWUuY2FwdHVyZTohIWUsaz1mYyhhKTtrfHwoYVtZYl09az1uZXcgVWIoYSkpO2M9ay5hZGQoYixjLGQsZyxmKTtpZihjLmEpcmV0dXJuIGM7ZD1nYygpO2MuYT1kO2Quc3JjPWE7ZC5saXN0ZW5lcj1jO2lmKGEuYWRkRXZlbnRMaXN0ZW5lcilMYnx8KGU9Zyksdm9pZCAwPT09ZSYmKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksCmQsZSk7ZWxzZSBpZihhLmF0dGFjaEV2ZW50KWEuYXR0YWNoRXZlbnQoaGMoYi50b1N0cmluZygpKSxkKTtlbHNlIGlmKGEuYWRkTGlzdGVuZXImJmEucmVtb3ZlTGlzdGVuZXIpcSgiY2hhbmdlIj09PWIsIk1lZGlhUXVlcnlMaXN0IG9ubHkgaGFzIGEgY2hhbmdlIGV2ZW50IiksYS5hZGRMaXN0ZW5lcihkKTtlbHNlIHRocm93IEVycm9yKCJhZGRFdmVudExpc3RlbmVyIGFuZCBhdHRhY2hFdmVudCBhcmUgdW5hdmFpbGFibGUuIik7JGIrKztyZXR1cm4gY30sZ2M9ZnVuY3Rpb24oKXt2YXIgYT1pYyxiPUpiP2Z1bmN0aW9uKGMpe3JldHVybiBhLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKX06ZnVuY3Rpb24oYyl7Yz1hLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKTtpZighYylyZXR1cm4gY307cmV0dXJuIGJ9LGFjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZmEoYikpe2Zvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWFjKGEsYltmXSxjLGQsZSk7cmV0dXJuIG51bGx9Yz1jYyhjKTtyZXR1cm4gUWIoYSk/CmEuaC5hZGQoU3RyaW5nKGIpLGMsITAsbShkKT8hIWQuY2FwdHVyZTohIWQsZSk6ZWMoYSxiLGMsITAsZCxlKX0samM9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihmYShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylqYyhhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPWNjKGMpLFFiKGEpPyhhPWEuaCxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5hJiYoZj1hLmFbYl0sYz1WYihmLGMsZCxlKSwtMTxjJiYoVGIoZltjXSkscShudWxsIT1mLmxlbmd0aCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSwwPT1mLmxlbmd0aCYmKGRlbGV0ZSBhLmFbYl0sYS5iLS0pKSkpOmEmJihhPWZjKGEpKSYmKGM9WGIoYSxiLGMsZCxlKSkmJmtjKGMpfSxrYz1mdW5jdGlvbihhKXtpZigibnVtYmVyIiE9PXR5cGVvZiBhJiZhJiYhYS5YKXt2YXIgYj1hLnNyYztpZihRYihiKSlXYihiLmgsYSk7ZWxzZXt2YXIgYz1hLnR5cGUsZD1hLmE7Yi5yZW1vdmVFdmVudExpc3RlbmVyPwpiLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KGhjKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7JGItLTsoYz1mYyhiKSk/KFdiKGMsYSksMD09Yy5iJiYoYy5zcmM9bnVsbCxiW1liXT1udWxsKSk6VGIoYSl9fX0saGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gWmI/WmJbYV06WmJbYV09Im9uIithfSxtYz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMDtpZihhPWZjKGEpKWlmKGI9YS5hW2IudG9TdHJpbmcoKV0pZm9yKGI9Yi5jb25jYXQoKSxhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBmPWJbYV07ZiYmZi5jYXB0dXJlPT1jJiYhZi5YJiYoZj1sYyhmLGQpLGU9ZSYmITEhPT1mKX1yZXR1cm4gZX0sbGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5tYXx8YS5zcmM7YS5oYSYma2MoYSk7cmV0dXJuIGMuY2FsbChkLGIpfSxpYz1mdW5jdGlvbihhLApiKXtpZihhLlgpcmV0dXJuITA7aWYoIUpiKXtpZighYilhOntiPVsid2luZG93IiwiZXZlbnQiXTtmb3IodmFyIGM9bCxkPTA7ZDxiLmxlbmd0aDtkKyspaWYoYz1jW2JbZF1dLG51bGw9PWMpe2I9bnVsbDticmVhayBhfWI9Y31kPWI7Yj1uZXcgRyhkLHRoaXMpO2M9ITA7aWYoISgwPmQua2V5Q29kZXx8dm9pZCAwIT1kLnJldHVyblZhbHVlKSl7YTp7dmFyIGU9ITE7aWYoMD09ZC5rZXlDb2RlKXRyeXtkLmtleUNvZGU9LTE7YnJlYWsgYX1jYXRjaChnKXtlPSEwfWlmKGV8fHZvaWQgMD09ZC5yZXR1cm5WYWx1ZSlkLnJldHVyblZhbHVlPSEwfWQ9W107Zm9yKGU9Yi5hO2U7ZT1lLnBhcmVudE5vZGUpZC5wdXNoKGUpO2E9YS50eXBlO2ZvcihlPWQubGVuZ3RoLTE7IWIuaCYmMDw9ZTtlLS0pe2IuYT1kW2VdO3ZhciBmPW1jKGRbZV0sYSwhMCxiKTtjPWMmJmZ9Zm9yKGU9MDshYi5oJiZlPGQubGVuZ3RoO2UrKyliLmE9ZFtlXSxmPW1jKGRbZV0sYSwhMSxiKSxjPWMmJmZ9cmV0dXJuIGN9cmV0dXJuIGxjKGEsCm5ldyBHKGIsdGhpcykpfSxmYz1mdW5jdGlvbihhKXthPWFbWWJdO3JldHVybiBhIGluc3RhbmNlb2YgVWI/YTpudWxsfSxuYz0iX19jbG9zdXJlX2V2ZW50c19mbl8iKygxRTkqTWF0aC5yYW5kb20oKT4+PjApLGNjPWZ1bmN0aW9uKGEpe3EoYSwiTGlzdGVuZXIgY2FuIG5vdCBiZSBudWxsLiIpO2lmKGlhKGEpKXJldHVybiBhO3EoYS5oYW5kbGVFdmVudCwiQW4gb2JqZWN0IGxpc3RlbmVyIG11c3QgaGF2ZSBoYW5kbGVFdmVudCBtZXRob2QuIik7YVtuY118fChhW25jXT1mdW5jdGlvbihiKXtyZXR1cm4gYS5oYW5kbGVFdmVudChiKX0pO3JldHVybiBhW25jXX07dmFyIG9jPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9e319O24ob2MsQyk7CnZhciBwYz1bXSxIPWZ1bmN0aW9uKGEsYixjLGQpe2ZhKGMpfHwoYyYmKHBjWzBdPWMudG9TdHJpbmcoKSksYz1wYyk7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWJjKGIsY1tlXSxkfHxhLmhhbmRsZUV2ZW50LCExLGEuYnx8YSk7aWYoIWYpYnJlYWs7YS5hW2Yua2V5XT1mfXJldHVybiBhfSxxYz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoZmEoYykpZm9yKHZhciBnPTA7ZzxjLmxlbmd0aDtnKyspcWMoYSxiLGNbZ10sZCxlLGYpO2Vsc2UgZD1kfHxhLmhhbmRsZUV2ZW50LGU9bShlKT8hIWUuY2FwdHVyZTohIWUsZj1mfHxhLmJ8fGEsZD1jYyhkKSxlPSEhZSxjPVFiKGIpP1hiKGIuaCxTdHJpbmcoYyksZCxlLGYpOmI/KGI9ZmMoYikpP1hiKGIsYyxkLGUsZik6bnVsbDpudWxsLGMmJihrYyhjKSxkZWxldGUgYS5hW2Mua2V5XSk7cmV0dXJuIGF9LHJjPWZ1bmN0aW9uKGEpe29hKGEuYSxmdW5jdGlvbihiLGMpe3RoaXMuYS5oYXNPd25Qcm9wZXJ0eShjKSYma2MoYil9LAphKTthLmE9e319O29jLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7b2MuaS51LmNhbGwodGhpcyk7cmModGhpcyl9O29jLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJFdmVudEhhbmRsZXIuaGFuZGxlRXZlbnQgbm90IGltcGxlbWVudGVkIik7fTt2YXIgST1mdW5jdGlvbigpe0MuY2FsbCh0aGlzKTt0aGlzLmg9bmV3IFViKHRoaXMpO3RoaXMuTWE9dGhpczt0aGlzLnBhPW51bGx9O24oSSxDKTtJLnByb3RvdHlwZVtQYl09ITA7SS5wcm90b3R5cGUucmE9ZnVuY3Rpb24oYSl7dGhpcy5wYT1hfTtJLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjLGQpe2pjKHRoaXMsYSxiLGMsZCl9Owp2YXIgdWM9ZnVuY3Rpb24oYSxiKXtzYyhhKTt2YXIgYz1hLnBhO2lmKGMpe3ZhciBkPVtdO2Zvcih2YXIgZT0xO2M7Yz1jLnBhKWQucHVzaChjKSxxKDFFMz4rK2UsImluZmluaXRlIGxvb3AiKX1hPWEuTWE7Yz1iLnR5cGV8fGI7InN0cmluZyI9PT10eXBlb2YgYj9iPW5ldyBFKGIsYSk6YiBpbnN0YW5jZW9mIEU/Yi50YXJnZXQ9Yi50YXJnZXR8fGE6KGU9YixiPW5ldyBFKGMsYSksdWEoYixlKSk7ZT0hMDtpZihkKWZvcih2YXIgZj1kLmxlbmd0aC0xOyFiLmgmJjA8PWY7Zi0tKXt2YXIgZz1iLmE9ZFtmXTtlPXRjKGcsYywhMCxiKSYmZX1iLmh8fChnPWIuYT1hLGU9dGMoZyxjLCEwLGIpJiZlLGIuaHx8KGU9dGMoZyxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLmgmJmY8ZC5sZW5ndGg7ZisrKWc9Yi5hPWRbZl0sZT10YyhnLGMsITEsYikmJmU7cmV0dXJuIGV9OwpJLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7SS5pLnUuY2FsbCh0aGlzKTtpZih0aGlzLmgpe3ZhciBhPXRoaXMuaCxiPTAsYztmb3IoYyBpbiBhLmEpe2Zvcih2YXIgZD1hLmFbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixUYihkW2VdKTtkZWxldGUgYS5hW2NdO2EuYi0tfX10aGlzLnBhPW51bGx9O3ZhciBkYz1mdW5jdGlvbihhLGIsYyxkLGUpe3NjKGEpO3JldHVybiBhLmguYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LHRjPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5oLmFbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGc9YltmXTtpZihnJiYhZy5YJiZnLmNhcHR1cmU9PWMpe3ZhciBrPWcubGlzdGVuZXIscD1nLm1hfHxnLnNyYztnLmhhJiZXYihhLmgsZyk7ZT0hMSE9PWsuY2FsbChwLGQpJiZlfX1yZXR1cm4gZSYmMCE9ZC5LYX0sc2M9ZnVuY3Rpb24oYSl7cShhLmgsIkV2ZW50IHRhcmdldCBpcyBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgY2FsbCB0aGUgc3VwZXJjbGFzcyAoZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpIGNvbnN0cnVjdG9yPyIpfTt2YXIgeGM9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKHkmJiFBKCI1MjUiKSlyZXR1cm4hMDtpZih6JiZlKXJldHVybiB2YyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZigheCl7Im51bWJlciI9PT10eXBlb2YgYiYmKGI9d2MoYikpO3ZhciBnPTE3PT1ifHwxOD09Ynx8eiYmOTE9PWI7aWYoKCFjfHx6KSYmZ3x8eiYmMTY9PWImJihkfHxmKSlyZXR1cm4hMX1pZigoeXx8YmIpJiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1pZih2JiZkJiZiPT1hKXJldHVybiExO3N3aXRjaChhKXtjYXNlIDEzOnJldHVybiB4P2Z8fGU/ITE6IShjJiZkKTohMDtjYXNlIDI3OnJldHVybiEoeXx8YmJ8fHgpfXJldHVybiB4JiYoZHx8ZXx8Zik/ITE6dmMoYSl9LHZjPWZ1bmN0aW9uKGEpe2lmKDQ4PD1hJiY1Nz49YXx8Cjk2PD1hJiYxMDY+PWF8fDY1PD1hJiY5MD49YXx8KHl8fGJiKSYmMD09YSlyZXR1cm4hMDtzd2l0Y2goYSl7Y2FzZSAzMjpjYXNlIDQzOmNhc2UgNjM6Y2FzZSA2NDpjYXNlIDEwNzpjYXNlIDEwOTpjYXNlIDExMDpjYXNlIDExMTpjYXNlIDE4NjpjYXNlIDU5OmNhc2UgMTg5OmNhc2UgMTg3OmNhc2UgNjE6Y2FzZSAxODg6Y2FzZSAxOTA6Y2FzZSAxOTE6Y2FzZSAxOTI6Y2FzZSAyMjI6Y2FzZSAyMTk6Y2FzZSAyMjA6Y2FzZSAyMjE6Y2FzZSAxNjM6Y2FzZSA1ODpyZXR1cm4hMDtjYXNlIDE3MzpyZXR1cm4geDtkZWZhdWx0OnJldHVybiExfX0sd2M9ZnVuY3Rpb24oYSl7aWYoeClhPXljKGEpO2Vsc2UgaWYoeiYmeSlzd2l0Y2goYSl7Y2FzZSA5MzphPTkxfXJldHVybiBhfSx5Yz1mdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSA2MTpyZXR1cm4gMTg3O2Nhc2UgNTk6cmV0dXJuIDE4NjtjYXNlIDE3MzpyZXR1cm4gMTg5O2Nhc2UgMjI0OnJldHVybiA5MTtjYXNlIDA6cmV0dXJuIDIyNDsKZGVmYXVsdDpyZXR1cm4gYX19O3ZhciBKPWZ1bmN0aW9uKGEsYil7SS5jYWxsKHRoaXMpO2EmJnpjKHRoaXMsYSxiKX07bihKLEkpO2g9Si5wcm90b3R5cGU7aC5TPW51bGw7aC5uYT1udWxsO2guQ2E9bnVsbDtoLm9hPW51bGw7aC53PS0xO2guRj0tMTtoLnVhPSExOwp2YXIgQWM9ezM6MTMsMTI6MTQ0LDYzMjMyOjM4LDYzMjMzOjQwLDYzMjM0OjM3LDYzMjM1OjM5LDYzMjM2OjExMiw2MzIzNzoxMTMsNjMyMzg6MTE0LDYzMjM5OjExNSw2MzI0MDoxMTYsNjMyNDE6MTE3LDYzMjQyOjExOCw2MzI0MzoxMTksNjMyNDQ6MTIwLDYzMjQ1OjEyMSw2MzI0NjoxMjIsNjMyNDc6MTIzLDYzMjQ4OjQ0LDYzMjcyOjQ2LDYzMjczOjM2LDYzMjc1OjM1LDYzMjc2OjMzLDYzMjc3OjM0LDYzMjg5OjE0NCw2MzMwMjo0NX0sQmM9e1VwOjM4LERvd246NDAsTGVmdDozNyxSaWdodDozOSxFbnRlcjoxMyxGMToxMTIsRjI6MTEzLEYzOjExNCxGNDoxMTUsRjU6MTE2LEY2OjExNyxGNzoxMTgsRjg6MTE5LEY5OjEyMCxGMTA6MTIxLEYxMToxMjIsRjEyOjEyMywiVSswMDdGIjo0NixIb21lOjM2LEVuZDozNSxQYWdlVXA6MzMsUGFnZURvd246MzQsSW5zZXJ0OjQ1fSxDYz0heXx8QSgiNTI1IiksRGM9eiYmeDsKSi5wcm90b3R5cGUuYT1mdW5jdGlvbihhKXtpZih5fHxiYilpZigxNz09dGhpcy53JiYhYS5jdHJsS2V5fHwxOD09dGhpcy53JiYhYS5hbHRLZXl8fHomJjkxPT10aGlzLncmJiFhLm1ldGFLZXkpdGhpcy5GPXRoaXMudz0tMTstMT09dGhpcy53JiYoYS5jdHJsS2V5JiYxNyE9YS5jP3RoaXMudz0xNzphLmFsdEtleSYmMTghPWEuYz90aGlzLnc9MTg6YS5tZXRhS2V5JiY5MSE9YS5jJiYodGhpcy53PTkxKSk7Q2MmJiF4YyhhLmMsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGEuYWx0S2V5LGEubWV0YUtleSk/dGhpcy5oYW5kbGVFdmVudChhKToodGhpcy5GPXdjKGEuYyksRGMmJih0aGlzLnVhPWEuYWx0S2V5KSl9O0oucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dGhpcy5GPXRoaXMudz0tMTt0aGlzLnVhPWEuYWx0S2V5fTsKSi5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5iLGM9Yi5hbHRLZXk7aWYodiYmImtleXByZXNzIj09YS50eXBlKXt2YXIgZD10aGlzLkY7dmFyIGU9MTMhPWQmJjI3IT1kP2Iua2V5Q29kZTowfWVsc2UoeXx8YmIpJiYia2V5cHJlc3MiPT1hLnR5cGU/KGQ9dGhpcy5GLGU9MDw9Yi5jaGFyQ29kZSYmNjMyMzI+Yi5jaGFyQ29kZSYmdmMoZCk/Yi5jaGFyQ29kZTowKTphYiYmIXk/KGQ9dGhpcy5GLGU9dmMoZCk/Yi5rZXlDb2RlOjApOigia2V5cHJlc3MiPT1hLnR5cGU/KERjJiYoYz10aGlzLnVhKSxiLmtleUNvZGU9PWIuY2hhckNvZGU/MzI+Yi5rZXlDb2RlPyhkPWIua2V5Q29kZSxlPTApOihkPXRoaXMuRixlPWIuY2hhckNvZGUpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkseiYmNjM9PWUmJjIyND09ZCYmKGQ9MTkxKSk7dmFyIGY9ZD13YyhkKTtkPzYzMjMyPD0KZCYmZCBpbiBBYz9mPUFjW2RdOjI1PT1kJiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBCYyYmKGY9QmNbYi5rZXlJZGVudGlmaWVyXSk7eCYmQ2MmJiJrZXlwcmVzcyI9PWEudHlwZSYmIXhjKGYsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KXx8KGE9Zj09dGhpcy53LHRoaXMudz1mLGI9bmV3IEVjKGYsZSxhLGIpLGIuYWx0S2V5PWMsdWModGhpcyxiKSl9O0oucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTsKdmFyIHpjPWZ1bmN0aW9uKGEsYixjKXthLm9hJiZGYyhhKTthLlM9YjthLm5hPWJjKGEuUywia2V5cHJlc3MiLGEsYyk7YS5DYT1iYyhhLlMsImtleWRvd24iLGEuYSxjLGEpO2Eub2E9YmMoYS5TLCJrZXl1cCIsYS5iLGMsYSl9LEZjPWZ1bmN0aW9uKGEpe2EubmEmJihrYyhhLm5hKSxrYyhhLkNhKSxrYyhhLm9hKSxhLm5hPW51bGwsYS5DYT1udWxsLGEub2E9bnVsbCk7YS5TPW51bGw7YS53PS0xO2EuRj0tMX07Si5wcm90b3R5cGUudT1mdW5jdGlvbigpe0ouaS51LmNhbGwodGhpcyk7RmModGhpcyl9O3ZhciBFYz1mdW5jdGlvbihhLGIsYyxkKXtHLmNhbGwodGhpcyxkKTt0aGlzLnR5cGU9ImtleSI7dGhpcy5jPWE7dGhpcy5yZXBlYXQ9Y307bihFYyxHKTt2YXIgR2M9eD8iTW96VXNlclNlbGVjdCI6eXx8YmI/IldlYmtpdFVzZXJTZWxlY3QiOm51bGwsSGM9ZnVuY3Rpb24oYSxiKXtiPWI/bnVsbDphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7aWYoR2Mpe3ZhciBjPSJub25lIjthLnN0eWxlJiYoYS5zdHlsZVtHY109Yyk7aWYoYil7YT0wO2Zvcih2YXIgZDtkPWJbYV07YSsrKWQuc3R5bGUmJihkLnN0eWxlW0djXT1jKX19ZWxzZSBpZih2fHxhYilpZihjPSJvbiIsYS5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyksYilmb3IoYT0wO2Q9YlthXTthKyspZC5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyl9O3ZhciBJYz1mdW5jdGlvbigpe307ZGEoSWMpO0ljLnByb3RvdHlwZS5hPTA7dmFyIEs9ZnVuY3Rpb24oYSl7SS5jYWxsKHRoaXMpO3RoaXMuaj1hfHx4YXx8KHhhPW5ldyB1Yik7dGhpcy5xYT1KYzt0aGlzLlk9bnVsbDt0aGlzLm09ITE7dGhpcy5hPW51bGw7dGhpcy5BPXZvaWQgMDt0aGlzLmc9dGhpcy5jPXRoaXMuYj1udWxsO3RoaXMuR2E9ITF9O24oSyxJKTtLLnByb3RvdHlwZS5PYT1JYy5SKCk7CnZhciBKYz1udWxsLEtjPWZ1bmN0aW9uKGEsYil7c3dpdGNoKGEpe2Nhc2UgMTpyZXR1cm4gYj8iZGlzYWJsZSI6ImVuYWJsZSI7Y2FzZSAyOnJldHVybiBiPyJoaWdobGlnaHQiOiJ1bmhpZ2hsaWdodCI7Y2FzZSA0OnJldHVybiBiPyJhY3RpdmF0ZSI6ImRlYWN0aXZhdGUiO2Nhc2UgODpyZXR1cm4gYj8ic2VsZWN0IjoidW5zZWxlY3QiO2Nhc2UgMTY6cmV0dXJuIGI/ImNoZWNrIjoidW5jaGVjayI7Y2FzZSAzMjpyZXR1cm4gYj8iZm9jdXMiOiJibHVyIjtjYXNlIDY0OnJldHVybiBiPyJvcGVuIjoiY2xvc2UifXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBzdGF0ZSIpO30sTGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuWXx8KGEuWT0iOiIrKGEuT2EuYSsrKS50b1N0cmluZygzNikpfSxNYz1mdW5jdGlvbihhLGIpe2lmKGEuYiYmYS5iLmcpe3ZhciBjPWEuYi5nLGQ9YS5ZO2QgaW4gYyYmZGVsZXRlIGNbZF07cWEoYS5iLmcsYixhKX1hLlk9Yn07Sy5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9Owp2YXIgTmM9ZnVuY3Rpb24oYSl7YT1hLmE7cShhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cmV0dXJuIGF9LE9jPWZ1bmN0aW9uKGEpe2EuQXx8KGEuQT1uZXcgb2MoYSkpO3JldHVybiBxKGEuQSl9O0sucHJvdG90eXBlLnJhPWZ1bmN0aW9uKGEpe2lmKHRoaXMuYiYmdGhpcy5iIT1hKXRocm93IEVycm9yKCJNZXRob2Qgbm90IHN1cHBvcnRlZCIpO0suaS5yYS5jYWxsKHRoaXMsYSl9O0sucHJvdG90eXBlLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPW5iKHRoaXMuai5hLCJESVYiKX07CnZhciBQYz1mdW5jdGlvbihhLGIpe2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiJiZhLnhhKGIpKXthLkdhPSEwO3ZhciBjPXFiKGIpO2EuaiYmYS5qLmE9PWN8fChhLmo9Yj9uZXcgdWIocWIoYikpOnhhfHwoeGE9bmV3IHViKSk7YS52YShiKTthLkQoKX1lbHNlIHRocm93IEVycm9yKCJJbnZhbGlkIGVsZW1lbnQgdG8gZGVjb3JhdGUiKTt9O2g9Sy5wcm90b3R5cGU7aC54YT1mdW5jdGlvbigpe3JldHVybiEwfTtoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hfTtoLkQ9ZnVuY3Rpb24oKXt0aGlzLm09ITA7UWModGhpcyxmdW5jdGlvbihhKXshYS5tJiZhLmYoKSYmYS5EKCl9KX07aC5QPWZ1bmN0aW9uKCl7UWModGhpcyxmdW5jdGlvbihhKXthLm0mJmEuUCgpfSk7dGhpcy5BJiZyYyh0aGlzLkEpO3RoaXMubT0hMX07CmgudT1mdW5jdGlvbigpe3RoaXMubSYmdGhpcy5QKCk7dGhpcy5BJiYodGhpcy5BLk4oKSxkZWxldGUgdGhpcy5BKTtRYyh0aGlzLGZ1bmN0aW9uKGEpe2EuTigpfSk7IXRoaXMuR2EmJnRoaXMuYSYmb2IodGhpcy5hKTt0aGlzLmI9dGhpcy5hPXRoaXMuZz10aGlzLmM9bnVsbDtLLmkudS5jYWxsKHRoaXMpfTtoLnNhPWZ1bmN0aW9uKGEsYil7dGhpcy50YShhLFJjKHRoaXMpLGIpfTsKaC50YT1mdW5jdGlvbihhLGIsYyl7cSghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLm0mJihjfHwhdGhpcy5tKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZigwPmJ8fGI+UmModGhpcykpdGhyb3cgRXJyb3IoIkNoaWxkIGNvbXBvbmVudCBpbmRleCBvdXQgb2YgYm91bmRzIik7dGhpcy5nJiZ0aGlzLmN8fCh0aGlzLmc9e30sdGhpcy5jPVtdKTtpZihhLmI9PXRoaXMpe3ZhciBkPUxjKGEpO3RoaXMuZ1tkXT1hO0hhKHRoaXMuYyxhKX1lbHNlIHFhKHRoaXMuZyxMYyhhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuYiYmYS5ZKXt2YXIgZT1hLmI7ZD1hLlk7ZS5nJiZkPyhlPWUuZyxkPShudWxsIT09ZSYmZCBpbiBlP2VbZF06dm9pZCAwKXx8bnVsbCk6ZD1udWxsfWlmKGQmJmEuYiE9dGhpcyl0aHJvdyBFcnJvcigiVW5hYmxlIHRvIHNldCBwYXJlbnQgY29tcG9uZW50Iik7CmEuYj10aGlzO0suaS5yYS5jYWxsKGEsdGhpcyk7TGEodGhpcy5jLGIsMCxhKTtpZihhLm0mJnRoaXMubSYmYS5iPT10aGlzKWM9dGhpcy5qYSgpLGI9Yy5jaGlsZE5vZGVzW2JdfHxudWxsLGIhPWEuZigpJiZjLmluc2VydEJlZm9yZShhLmYoKSxiKTtlbHNlIGlmKGMpe3RoaXMuYXx8dGhpcy5pYSgpO2M9TCh0aGlzLGIrMSk7Yj10aGlzLmphKCk7Yz1jP2MuYTpudWxsO2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTthLmF8fGEuaWEoKTtiP2IuaW5zZXJ0QmVmb3JlKGEuYSxjfHxudWxsKTphLmouYS5ib2R5LmFwcGVuZENoaWxkKGEuYSk7YS5iJiYhYS5iLm18fGEuRCgpfWVsc2UgdGhpcy5tJiYhYS5tJiZhLmEmJmEuYS5wYXJlbnROb2RlJiYxPT1hLmEucGFyZW50Tm9kZS5ub2RlVHlwZSYmYS5EKCl9O2guamE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hfTsKdmFyIFNjPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEucWEpe3ZhciBiPWEubT9hLmE6YS5qLmEuYm9keTthOnt2YXIgYz1xYihiKTtpZihjLmRlZmF1bHRWaWV3JiZjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihjPWMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpKSl7Yz1jLmRpcmVjdGlvbnx8Yy5nZXRQcm9wZXJ0eVZhbHVlKCJkaXJlY3Rpb24iKXx8IiI7YnJlYWsgYX1jPSIifWEucWE9InJ0bCI9PShjfHwoYi5jdXJyZW50U3R5bGU/Yi5jdXJyZW50U3R5bGUuZGlyZWN0aW9uOm51bGwpfHxiLnN0eWxlJiZiLnN0eWxlLmRpcmVjdGlvbil9cmV0dXJuIGEucWF9LFJjPWZ1bmN0aW9uKGEpe3JldHVybiBhLmM/YS5jLmxlbmd0aDowfSxMPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuYz9hLmNbYl18fG51bGw6bnVsbH0sUWM9ZnVuY3Rpb24oYSxiLGMpe2EuYyYmcihhLmMsYixjKX0sVGM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jJiZiP0RhKGEuYyxiKTotMX07dmFyIFZjPWZ1bmN0aW9uKGEsYil7aWYoIWEpdGhyb3cgRXJyb3IoIkludmFsaWQgY2xhc3MgbmFtZSAiK2EpO2lmKCFpYShiKSl0aHJvdyBFcnJvcigiSW52YWxpZCBkZWNvcmF0b3IgZnVuY3Rpb24gIitiKTtVY1thXT1ifSxXYz17fSxVYz17fTt2YXIgWGM9ZnVuY3Rpb24oYSl7dGhpcy5oPWF9O2RhKFhjKTt2YXIgWWM9ZnVuY3Rpb24oYSxiKXthJiYoYS50YWJJbmRleD1iPzA6LTEpfSwkYz1mdW5jdGlvbihhLGIsYyl7Yy5pZCYmTWMoYixjLmlkKTt2YXIgZD1hLmIoKSxlPSExLGY9RChjKTtmJiZyKGYsZnVuY3Rpb24oZyl7Zz09ZD9lPSEwOmcmJnRoaXMuZyhiLGcsZCl9LGEpO2V8fEViKGMsZCk7WmMoYixjKTtyZXR1cm4gY307WGMucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiLGMpe2I9PWMrIi1kaXNhYmxlZCI/YS5aKCExKTpiPT1jKyItaG9yaXpvbnRhbCI/YWQoYSwiaG9yaXpvbnRhbCIpOmI9PWMrIi12ZXJ0aWNhbCImJmFkKGEsInZlcnRpY2FsIil9Owp2YXIgWmM9ZnVuY3Rpb24oYSxiKXtpZihiKWZvcih2YXIgYz1iLmZpcnN0Q2hpbGQsZDtjJiZjLnBhcmVudE5vZGU9PWI7KXtkPWMubmV4dFNpYmxpbmc7aWYoMT09Yy5ub2RlVHlwZSl7YTp7dmFyIGU9YztxKGUpO2U9RChlKTtmb3IodmFyIGY9MCxnPWUubGVuZ3RoO2Y8ZztmKyspe3ZhciBrPWVbZl07aWYoaz1rIGluIFVjP1VjW2tdKCk6bnVsbCl7ZT1rO2JyZWFrIGF9fWU9bnVsbH1lJiYoZS5hPWMsYS5pc0VuYWJsZWQoKXx8ZS5aKCExKSxhLnNhKGUpLFBjKGUsYykpfWVsc2UgYy5ub2RlVmFsdWUmJiIiIT1NYShjLm5vZGVWYWx1ZSl8fGIucmVtb3ZlQ2hpbGQoYyk7Yz1kfX0sYmQ9ZnVuY3Rpb24oYSxiKXtiPWIuZigpO3EoYiwiVGhlIGNvbnRhaW5lciBET00gZWxlbWVudCBjYW5ub3QgYmUgbnVsbC4iKTtIYyhiLHgpO3YmJihiLmhpZGVGb2N1cz0hMCk7KGE9YS5oKSYmdmIoYixhKX07WGMucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKWGMucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5iKCksYz1bYiwiaG9yaXpvbnRhbCI9PWEuSD9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgTT1mdW5jdGlvbigpe30sY2Q7ZGEoTSk7dmFyIGRkPXtidXR0b246InByZXNzZWQiLGNoZWNrYm94OiJjaGVja2VkIixtZW51aXRlbToic2VsZWN0ZWQiLG1lbnVpdGVtY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtcmFkaW86ImNoZWNrZWQiLHJhZGlvOiJjaGVja2VkIix0YWI6InNlbGVjdGVkIix0cmVlaXRlbToic2VsZWN0ZWQifTtNLnByb3RvdHlwZS5oPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLmouYigiRElWIixlZCh0aGlzLGEpLmpvaW4oIiAiKSxhLmJhKX07dmFyIGdkPWZ1bmN0aW9uKGEsYixjKXtpZihhPWEuZj9hLmYoKTphKXt2YXIgZD1bYl07diYmIUEoIjciKSYmKGQ9ZmQoRChhKSxiKSxkLnB1c2goYikpOyhjP0ZiOkhiKShhLGQpfX07Ck0ucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiKXtiLmlkJiZNYyhhLGIuaWQpO2ImJmIuZmlyc3RDaGlsZD9oZChhLGIuZmlyc3RDaGlsZC5uZXh0U2libGluZz9KYShiLmNoaWxkTm9kZXMpOmIuZmlyc3RDaGlsZCk6YS5iYT1udWxsO3ZhciBjPTAsZD10aGlzLmEoKSxlPXRoaXMuYSgpLGY9ITEsZz0hMSxrPSExLHA9SmEoRChiKSk7cihwLGZ1bmN0aW9uKEIpe2Z8fEIhPWQ/Z3x8QiE9ZT9jfD1pZCh0aGlzLEIpOmc9ITA6KGY9ITAsZT09ZCYmKGc9ITApKTsxPT1pZCh0aGlzLEIpJiYoQWEoYiksc2IoYikmJnRiKGIpJiZyYihiLCExKSl9LHRoaXMpO2Eubz1jO2Z8fChwLnB1c2goZCksZT09ZCYmKGc9ITApKTtnfHxwLnB1c2goZSk7KGE9YS53YSkmJnAucHVzaC5hcHBseShwLGEpO2lmKHYmJiFBKCI3Iikpe3ZhciB3PWZkKHApOzA8dy5sZW5ndGgmJihwLnB1c2guYXBwbHkocCx3KSxrPSEwKX1mJiZnJiYhYSYmIWt8fENiKGIscC5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIGpkPWZ1bmN0aW9uKGEsYil7aWYoYT1hLmgoKSl7cShiLCJUaGUgZWxlbWVudCBwYXNzZWQgYXMgYSBmaXJzdCBwYXJhbWV0ZXIgY2Fubm90IGJlIG51bGwuIik7dmFyIGM9Yi5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDthIT1jJiZ2YihiLGEpfX0sa2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYztpZihhLnYmMzImJihjPWEuZigpKSl7aWYoIWImJmEubyYzMil7dHJ5e2MuYmx1cigpfWNhdGNoKGQpe31hLm8mMzImJmEuRmEobnVsbCl9KHNiKGMpJiZ0YihjKSkhPWImJnJiKGMsYil9fSxsZD1mdW5jdGlvbihhLGIsYyl7Y2R8fChjZD17MToiZGlzYWJsZWQiLDg6InNlbGVjdGVkIiwxNjoiY2hlY2tlZCIsNjQ6ImV4cGFuZGVkIn0pO3EoYSwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO2I9Y2RbYl07dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDtkJiYoZD1kZFtkXXx8YixiPSJjaGVja2VkIj09Ynx8InNlbGVjdGVkIj09CmI/ZDpiKTtiJiZ4YihhLGIsYyl9O00ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250cm9sIn07CnZhciBlZD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuYSgpLGQ9W2NdLGU9YS5hKCk7ZSE9YyYmZC5wdXNoKGUpO2M9Yi5vO2ZvcihlPVtdO2M7KXt2YXIgZj1jJi1jO2UucHVzaChtZChhLGYpKTtjJj1+Zn1kLnB1c2guYXBwbHkoZCxlKTsoYT1iLndhKSYmZC5wdXNoLmFwcGx5KGQsYSk7diYmIUEoIjciKSYmZC5wdXNoLmFwcGx5KGQsZmQoZCkpO3JldHVybiBkfSxmZD1mdW5jdGlvbihhLGIpe3ZhciBjPVtdO2ImJihhPUlhKGEsW2JdKSk7cihbXSxmdW5jdGlvbihkKXshRmEoZCxsYShHYSxhKSl8fGImJiFHYShkLGIpfHxjLnB1c2goZC5qb2luKCJfIikpfSk7cmV0dXJuIGN9LG1kPWZ1bmN0aW9uKGEsYil7YS5ifHxuZChhKTtyZXR1cm4gYS5iW2JdfSxpZD1mdW5jdGlvbihhLGIpe2Euanx8KGEuYnx8bmQoYSksYS5qPXNhKGEuYikpO2E9cGFyc2VJbnQoYS5qW2JdLDEwKTtyZXR1cm4gaXNOYU4oYSk/MDphfSxuZD1mdW5jdGlvbihhKXt2YXIgYj1hLmEoKSxjPSF0KGIucmVwbGFjZSgvXHhhMHxccy9nLAoiICIpLCIgIik7cShjLCJDb250cm9sUmVuZGVyZXIgaGFzIGFuIGludmFsaWQgY3NzIGNsYXNzOiAnIitiKyInIik7YS5iPXsxOmIrIi1kaXNhYmxlZCIsMjpiKyItaG92ZXIiLDQ6YisiLWFjdGl2ZSIsODpiKyItc2VsZWN0ZWQiLDE2OmIrIi1jaGVja2VkIiwzMjpiKyItZm9jdXNlZCIsNjQ6YisiLW9wZW4ifX07dmFyIE49ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO2lmKCFiKXtiPXRoaXMuY29uc3RydWN0b3I7Zm9yKHZhciBkO2I7KXtkPWJbamFdfHwoYltqYV09KytrYSk7aWYoZD1XY1tkXSlicmVhaztiPWIuaT9iLmkuY29uc3RydWN0b3I6bnVsbH1iPWQ/aWEoZC5SKT9kLlIoKTpuZXcgZDpudWxsfXRoaXMuQj1iO3RoaXMuYmE9dm9pZCAwIT09YT9hOm51bGx9O24oTixLKTtoPU4ucHJvdG90eXBlO2guYmE9bnVsbDtoLm89MDtoLnY9Mzk7aC5LPTA7aC5JYT0hMDtoLndhPW51bGw7aC55YT0hMDtoLmlhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CLmModGhpcyk7dGhpcy5hPWE7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmeGIoYSwiaGlkZGVuIiwhMCkpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hPXRoaXMuQi5nKHRoaXMsYSk7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5JYT0ibm9uZSIhPWEuc3R5bGUuZGlzcGxheX07CmguRD1mdW5jdGlvbigpe04uaS5ELmNhbGwodGhpcyk7dmFyIGE9TmModGhpcyk7cSh0aGlzKTtxKGEpO3RoaXMuaXNWaXNpYmxlKCl8fHhiKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fGxkKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy52JjgmJmxkKGEsOCwhISh0aGlzLm8mOCkpO3RoaXMudiYxNiYmbGQoYSwxNiwhISh0aGlzLm8mMTYpKTt0aGlzLnYmNjQmJmxkKGEsNjQsISEodGhpcy5vJjY0KSk7YT10aGlzLkI7U2ModGhpcykmJmdkKHRoaXMuZigpLGEuYSgpKyItcnRsIiwhMCk7dGhpcy5pc0VuYWJsZWQoKSYma2QodGhpcyx0aGlzLmlzVmlzaWJsZSgpKTtpZih0aGlzLnYmLTImJih0aGlzLnlhJiZvZCh0aGlzLCEwKSx0aGlzLnYmMzImJihhPXRoaXMuZigpKSkpe3ZhciBiPXRoaXMuV3x8KHRoaXMuVz1uZXcgSik7emMoYixhKTtIKEgoSChPYyh0aGlzKSxiLCJrZXkiLHRoaXMuZmEpLGEsImZvY3VzIix0aGlzLk5hKSxhLCJibHVyIiwKdGhpcy5GYSl9fTt2YXIgb2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYz1PYyhhKSxkPWEuZigpO2I/KEgoSChIKEgoYyxkLEYuTCxhLmthKSxkLFtGLk0sRi5hYV0sYS5sYSksZCwibW91c2VvdmVyIixhLkFhKSxkLCJtb3VzZW91dCIsYS56YSksYS5lYSE9Y2EmJkgoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fEgoYyxkLCJkYmxjbGljayIsYS5KYSksYS5nYXx8KGEuZ2E9bmV3IHBkKGEpLHpiKGEsbGEoQWIsYS5nYSkpKSkpOihxYyhxYyhxYyhxYyhjLGQsRi5MLGEua2EpLGQsW0YuTSxGLmFhXSxhLmxhKSxkLCJtb3VzZW92ZXIiLGEuQWEpLGQsIm1vdXNlb3V0IixhLnphKSxhLmVhIT1jYSYmcWMoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fHFjKGMsZCwiZGJsY2xpY2siLGEuSmEpLEFiKGEuZ2EpLGEuZ2E9bnVsbCkpfTsKTi5wcm90b3R5cGUuUD1mdW5jdGlvbigpe04uaS5QLmNhbGwodGhpcyk7dGhpcy5XJiZGYyh0aGlzLlcpO3RoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJmtkKHRoaXMsITEpfTtOLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7Ti5pLnUuY2FsbCh0aGlzKTt0aGlzLlcmJih0aGlzLlcuTigpLGRlbGV0ZSB0aGlzLlcpO2RlbGV0ZSB0aGlzLkI7dGhpcy5nYT10aGlzLndhPXRoaXMuYmE9bnVsbH07dmFyIGhkPWZ1bmN0aW9uKGEsYil7YS5iYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm8mMSl9OwpOLnByb3RvdHlwZS5aPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYjtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0VuYWJsZWQmJiFiLmlzRW5hYmxlZCgpfHwhTyh0aGlzLDEsIWEpfHwoYXx8KHFkKHRoaXMsITEpLFAodGhpcywhMSkpLHRoaXMuaXNWaXNpYmxlKCkmJmtkKHRoaXMsYSksUSh0aGlzLDEsIWEsITApKX07CnZhciBQPWZ1bmN0aW9uKGEsYil7TyhhLDIsYikmJlEoYSwyLGIpfSxxZD1mdW5jdGlvbihhLGIpe08oYSw0LGIpJiZRKGEsNCxiKX0scmQ9ZnVuY3Rpb24oYSxiKXtPKGEsOCxiKSYmUShhLDgsYil9LHNkPWZ1bmN0aW9uKGEsYil7TyhhLDY0LGIpJiZRKGEsNjQsYil9LFE9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIWQmJjE9PWIpYS5aKCFjKTtlbHNlIGlmKGEudiZiJiZjIT0hIShhLm8mYikpe3ZhciBlPWEuQjtpZihkPWEuZigpKShlPW1kKGUsYikpJiZnZChhLGUsYyksbGQoZCxiLGMpO2Eubz1jP2Eub3xiOmEubyZ+Yn19LHRkPWZ1bmN0aW9uKGEsYixjKXtpZihhLm0mJmEubyZiJiYhYyl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTshYyYmYS5vJmImJlEoYSxiLCExKTthLnY9Yz9hLnZ8YjphLnYmfmJ9LFI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hISgyNTUmYikmJiEhKGEudiZiKX0sTz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuISEoYS52JmIpJiYhIShhLm8mCmIpIT1jJiYoIShhLksmYil8fHVjKGEsS2MoYixjKSkpJiYhYS5VfTtoPU4ucHJvdG90eXBlO2guQWE9ZnVuY3Rpb24oYSl7KCFhLnJlbGF0ZWRUYXJnZXR8fCFwYih0aGlzLmYoKSxhLnJlbGF0ZWRUYXJnZXQpKSYmdWModGhpcywiZW50ZXIiKSYmdGhpcy5pc0VuYWJsZWQoKSYmUih0aGlzLDIpJiZQKHRoaXMsITApfTtoLnphPWZ1bmN0aW9uKGEpe2EucmVsYXRlZFRhcmdldCYmcGIodGhpcy5mKCksYS5yZWxhdGVkVGFyZ2V0KXx8IXVjKHRoaXMsImxlYXZlIil8fChSKHRoaXMsNCkmJnFkKHRoaXMsITEpLFIodGhpcywyKSYmUCh0aGlzLCExKSl9O2guZWE9Y2E7Cmgua2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSxPYihhKSYmISh5JiZ6JiZhLmN0cmxLZXkpKSl7Uih0aGlzLDQpJiZxZCh0aGlzLCEwKTt2YXIgYjtpZihiPXRoaXMuQil7dmFyIGM7Yj10aGlzLnYmMzImJihjPXRoaXMuZigpKT9zYihjKSYmdGIoYyk6ITF9YiYmdGhpcy5mKCkuZm9jdXMoKX0hT2IoYSl8fHkmJnomJmEuY3RybEtleXx8YS5nKCl9O2gubGE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSx0aGlzLm8mNCYmdWQodGhpcyxhKSYmUih0aGlzLDQpJiZxZCh0aGlzLCExKSl9O2guSmE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmdWQodGhpcyxhKX07CnZhciB1ZD1mdW5jdGlvbihhLGIpe2lmKFIoYSwxNikpe3ZhciBjPSEoYS5vJjE2KTtPKGEsMTYsYykmJlEoYSwxNixjKX1SKGEsOCkmJnJkKGEsITApO1IoYSw2NCkmJnNkKGEsIShhLm8mNjQpKTtjPW5ldyBFKCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuQT1iLkEpO3JldHVybiB1YyhhLGMpfTtOLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe1IodGhpcywzMikmJk8odGhpcywzMiwhMCkmJlEodGhpcywzMiwhMCl9O04ucHJvdG90eXBlLkZhPWZ1bmN0aW9uKCl7Uih0aGlzLDQpJiZxZCh0aGlzLCExKTtSKHRoaXMsMzIpJiZPKHRoaXMsMzIsITEpJiZRKHRoaXMsMzIsITEpfTsKTi5wcm90b3R5cGUuZmE9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJjEzPT1hLmMmJnVkKHRoaXMsYSk/KGEuZygpLGEuaigpLCEwKTohMX07aWYoIWlhKE4pKXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBjbGFzcyAiK04pO2lmKCFpYShNKSl0aHJvdyBFcnJvcigiSW52YWxpZCByZW5kZXJlciBjbGFzcyAiK00pO3ZhciB2ZD1OW2phXXx8KE5bamFdPSsra2EpO1djW3ZkXT1NO1ZjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIHBkPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9ITE7dGhpcy5jPW5ldyBvYyh0aGlzKTt6Yih0aGlzLGxhKEFiLHRoaXMuYykpO2E9TmModGhpcy5iKTtIKEgoSCh0aGlzLmMsYSxGLkwsdGhpcy5oKSxhLEYuTSx0aGlzLmopLGEsImNsaWNrIix0aGlzLmcpfTtuKHBkLEMpO3ZhciB3ZD0hdnx8OTw9TnVtYmVyKGliKTsKcGQucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXt0aGlzLmE9ITF9O3BkLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7dGhpcy5hPSEwfTt2YXIgeGQ9ZnVuY3Rpb24oYSxiKXtpZighd2QpcmV0dXJuIGEuYnV0dG9uPTAsYS50eXBlPWIsYTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudHMiKTtjLmluaXRNb3VzZUV2ZW50KGIsYS5idWJibGVzLGEuY2FuY2VsYWJsZSxhLnZpZXd8fG51bGwsYS5kZXRhaWwsYS5zY3JlZW5YLGEuc2NyZWVuWSxhLmNsaWVudFgsYS5jbGllbnRZLGEuY3RybEtleSxhLmFsdEtleSxhLnNoaWZ0S2V5LGEubWV0YUtleSwwLGEucmVsYXRlZFRhcmdldHx8bnVsbCk7cmV0dXJuIGN9OwpwZC5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXtpZih0aGlzLmEpdGhpcy5hPSExO2Vsc2V7dmFyIGI9YS5iLGM9Yi5idXR0b24sZD1iLnR5cGUsZT14ZChiLCJtb3VzZWRvd24iKTt0aGlzLmIua2EobmV3IEcoZSxhLmEpKTtlPXhkKGIsIm1vdXNldXAiKTt0aGlzLmIubGEobmV3IEcoZSxhLmEpKTt3ZHx8KGIuYnV0dG9uPWMsYi50eXBlPWQpfX07cGQucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt0aGlzLmI9bnVsbDtwZC5pLnUuY2FsbCh0aGlzKX07dmFyIFM9ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO3RoaXMuZGE9Ynx8WGMuUigpO3RoaXMuSD1hfHwidmVydGljYWwifTtuKFMsSyk7aD1TLnByb3RvdHlwZTtoLkRhPW51bGw7aC5jYT1udWxsO2guZGE9bnVsbDtoLkg9bnVsbDtoLlQ9ITA7aC5PPSEwO2gubD0tMTtoLnM9bnVsbDtoLlY9ITE7aC5JPW51bGw7dmFyIHlkPWZ1bmN0aW9uKGEpe3JldHVybiBhLkRhfHxhLmYoKX07aD1TLnByb3RvdHlwZTtoLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPXRoaXMuai5iKCJESVYiLHRoaXMuZGEuYyh0aGlzKS5qb2luKCIgIikpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKGEpe3JldHVybiJESVYiPT1hLnRhZ05hbWV9O2gudmE9ZnVuY3Rpb24oYSl7dGhpcy5hPSRjKHRoaXMuZGEsdGhpcyxhKTsibm9uZSI9PWEuc3R5bGUuZGlzcGxheSYmKHRoaXMuVD0hMSl9OwpoLkQ9ZnVuY3Rpb24oKXtTLmkuRC5jYWxsKHRoaXMpO1FjKHRoaXMsZnVuY3Rpb24oYil7Yi5tJiZ6ZCh0aGlzLGIpfSx0aGlzKTt2YXIgYT10aGlzLmYoKTtiZCh0aGlzLmRhLHRoaXMpO0FkKHRoaXMsdGhpcy5UKTtIKEgoSChIKEgoSChIKEgoT2ModGhpcyksdGhpcywiZW50ZXIiLHRoaXMuV2EpLHRoaXMsImhpZ2hsaWdodCIsdGhpcy5YYSksdGhpcywidW5oaWdobGlnaHQiLHRoaXMuY2IpLHRoaXMsIm9wZW4iLHRoaXMuWWEpLHRoaXMsImNsb3NlIix0aGlzLlVhKSxhLEYuTCx0aGlzLlNhKSxxYihhKSxbRi5NLEYuYWFdLHRoaXMuVmEpLGEsW0YuTCxGLk0sRi5hYSwibW91c2VvdmVyIiwibW91c2VvdXQiLCJjb250ZXh0bWVudSJdLHRoaXMuVGEpO0JkKHRoaXMpfTt2YXIgQmQ9ZnVuY3Rpb24oYSl7dmFyIGI9T2MoYSksYz15ZChhKTtIKEgoSChiLGMsImZvY3VzIixhLkhhKSxjLCJibHVyIixhLlFhKSxhLmNhfHwoYS5jYT1uZXcgSih5ZChhKSkpLCJrZXkiLGEuUmEpfTtoPVMucHJvdG90eXBlOwpoLlA9ZnVuY3Rpb24oKXtDZCh0aGlzLC0xKTt0aGlzLnMmJnNkKHRoaXMucywhMSk7dGhpcy5WPSExO1MuaS5QLmNhbGwodGhpcyl9O2gudT1mdW5jdGlvbigpe1MuaS51LmNhbGwodGhpcyk7dGhpcy5jYSYmKHRoaXMuY2EuTigpLHRoaXMuY2E9bnVsbCk7dGhpcy5kYT10aGlzLnM9dGhpcy5JPXRoaXMuRGE9bnVsbH07aC5XYT1mdW5jdGlvbigpe3JldHVybiEwfTsKaC5YYT1mdW5jdGlvbihhKXt2YXIgYj1UYyh0aGlzLGEudGFyZ2V0KTtpZigtMTxiJiZiIT10aGlzLmwpe3ZhciBjPUwodGhpcyx0aGlzLmwpO2MmJlAoYywhMSk7dGhpcy5sPWI7Yz1MKHRoaXMsdGhpcy5sKTt0aGlzLlYmJnFkKGMsITApO3RoaXMucyYmYyE9dGhpcy5zJiYoYy52JjY0P3NkKGMsITApOnNkKHRoaXMucywhMSkpfWI9dGhpcy5mKCk7cShiLCJUaGUgRE9NIGVsZW1lbnQgZm9yIHRoZSBjb250YWluZXIgY2Fubm90IGJlIG51bGwuIik7bnVsbCE9YS50YXJnZXQuZigpJiZ4YihiLCJhY3RpdmVkZXNjZW5kYW50IixhLnRhcmdldC5mKCkuaWQpfTtoLmNiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT1MKHRoaXMsdGhpcy5sKSYmKHRoaXMubD0tMSk7YT10aGlzLmYoKTtxKGEsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnJlbW92ZUF0dHJpYnV0ZSh3YigiYWN0aXZlZGVzY2VuZGFudCIpKX07CmguWWE9ZnVuY3Rpb24oYSl7KGE9YS50YXJnZXQpJiZhIT10aGlzLnMmJmEuYj09dGhpcyYmKHRoaXMucyYmc2QodGhpcy5zLCExKSx0aGlzLnM9YSl9O2guVWE9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMucyYmKHRoaXMucz1udWxsKTt2YXIgYj10aGlzLmYoKSxjPWEudGFyZ2V0LmYoKTtiJiZhLnRhcmdldC5vJjImJmMmJihhPSIiLGMmJihhPWMuaWQscShhLCJUaGUgYWN0aXZlIGVsZW1lbnQgc2hvdWxkIGhhdmUgYW4gaWQuIikpLHhiKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEpKX07aC5TYT1mdW5jdGlvbihhKXt0aGlzLk8mJih0aGlzLlY9ITApO3ZhciBiPXlkKHRoaXMpO2ImJnNiKGIpJiZ0YihiKT9iLmZvY3VzKCk6YS5nKCl9O2guVmE9ZnVuY3Rpb24oKXt0aGlzLlY9ITF9OwpoLlRhPWZ1bmN0aW9uKGEpe2E6e3ZhciBiPWEudGFyZ2V0O2lmKHRoaXMuSSlmb3IodmFyIGM9dGhpcy5mKCk7YiYmYiE9PWM7KXt2YXIgZD1iLmlkO2lmKGQgaW4gdGhpcy5JKXtiPXRoaXMuSVtkXTticmVhayBhfWI9Yi5wYXJlbnROb2RlfWI9bnVsbH1pZihiKXN3aXRjaChhLnR5cGUpe2Nhc2UgRi5MOmIua2EoYSk7YnJlYWs7Y2FzZSBGLk06Y2FzZSBGLmFhOmIubGEoYSk7YnJlYWs7Y2FzZSAibW91c2VvdmVyIjpiLkFhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3V0IjpiLnphKGEpO2JyZWFrO2Nhc2UgImNvbnRleHRtZW51IjpiLmVhKGEpfX07aC5IYT1mdW5jdGlvbigpe307aC5RYT1mdW5jdGlvbigpe0NkKHRoaXMsLTEpO3RoaXMuVj0hMTt0aGlzLnMmJnNkKHRoaXMucywhMSl9OwpoLlJhPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmlzRW5hYmxlZCgpJiZ0aGlzLmlzVmlzaWJsZSgpJiYoMCE9UmModGhpcyl8fHRoaXMuRGEpJiZEZCh0aGlzLGEpPyhhLmcoKSxhLmooKSwhMCk6ITF9Owp2YXIgRGQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1MKGEsYS5sKTtpZihjJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5mYSYmYy5mYShiKXx8YS5zJiZhLnMhPWMmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLnMuZmEmJmEucy5mYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuYyl7Y2FzZSAyNzp5ZChhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpFZChhKTticmVhaztjYXNlIDM1OkZkKGEpO2JyZWFrO2Nhc2UgMzg6aWYoInZlcnRpY2FsIj09YS5IKUdkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9IZChhKTpHZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoInZlcnRpY2FsIj09YS5IKUhkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9HZChhKTpIZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSx6ZD1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZigpO2M9Yy5pZHx8KGMuaWQ9TGMoYikpO2EuSXx8KGEuST17fSk7YS5JW2NdPWJ9O1MucHJvdG90eXBlLnNhPWZ1bmN0aW9uKGEsYil7Q2EoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtTLmkuc2EuY2FsbCh0aGlzLGEsYil9O1MucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEsYixjKXtDYShhLE4pO2EuS3w9MjthLkt8PTY0O3RkKGEsMzIsITEpO2EubSYmMCE9YS55YSYmb2QoYSwhMSk7YS55YT0hMTt2YXIgZD1hLmI9PXRoaXM/VGModGhpcyxhKTotMTtTLmkudGEuY2FsbCh0aGlzLGEsYixjKTthLm0mJnRoaXMubSYmemQodGhpcyxhKTthPWQ7LTE9PWEmJihhPVJjKHRoaXMpKTthPT10aGlzLmw/dGhpcy5sPU1hdGgubWluKFJjKHRoaXMpLTEsYik6YT50aGlzLmwmJmI8PXRoaXMubD90aGlzLmwrKzphPHRoaXMubCYmYj50aGlzLmwmJnRoaXMubC0tfTsKdmFyIGFkPWZ1bmN0aW9uKGEsYil7aWYoYS5mKCkpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5IPWJ9O1MucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O3ZhciBBZD1mdW5jdGlvbihhLGIpe2EuVD1iO3ZhciBjPWEuZigpO2MmJihjLnN0eWxlLmRpc3BsYXk9Yj8iIjoibm9uZSIsWWMoeWQoYSksYS5PJiZhLlQpKX07Uy5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT307Uy5wcm90b3R5cGUuWj1mdW5jdGlvbihhKXt0aGlzLk8hPWEmJnVjKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5PPSEwLFFjKHRoaXMsZnVuY3Rpb24oYil7Yi5MYT9kZWxldGUgYi5MYTpiLlooITApfSkpOihRYyh0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5aKCExKTpiLkxhPSEwfSksdGhpcy5WPXRoaXMuTz0hMSksWWMoeWQodGhpcyksYSYmdGhpcy5UKSl9Owp2YXIgQ2Q9ZnVuY3Rpb24oYSxiKXsoYj1MKGEsYikpP1AoYiwhMCk6LTE8YS5sJiZQKEwoYSxhLmwpLCExKX0sRWQ9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LFJjKGEpLTEpfSxGZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiAwPmI/Yy0xOmJ9LDApfSxIZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7cmV0dXJuKGIrMSklY30sYS5sKX0sR2Q9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe2ItLTtyZXR1cm4gMD5iP2MtMTpifSxhLmwpfSxJZD1mdW5jdGlvbihhLGIsYyl7Yz0wPmM/VGMoYSxhLnMpOmM7dmFyIGQ9UmMoYSk7Yz1iLmNhbGwoYSxjLGQpO2Zvcih2YXIgZT0wO2U8PWQ7KXt2YXIgZj1MKGEsYyksZztpZihnPWYpZz1mLmlzVmlzaWJsZSgpJiZmLmlzRW5hYmxlZCgpJiYhIShmLnYmMik7aWYoZyl7YS5FYShjKTticmVha31lKys7Yz1iLmNhbGwoYSxjLGQpfX07ClMucHJvdG90eXBlLkVhPWZ1bmN0aW9uKGEpe0NkKHRoaXMsYSl9O3ZhciBUPWZ1bmN0aW9uKCl7fTtuKFQsTSk7ZGEoVCk7VC5wcm90b3R5cGUuYT1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYiJ9O1QucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXtyZXR1cm4idGFiIn07VC5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYj1ULmkuYy5jYWxsKHRoaXMsYSk7KGE9YS5QYSkmJmImJihiLnRpdGxlPWF8fCIiKTtyZXR1cm4gYn07VC5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIpe2I9VC5pLmcuY2FsbCh0aGlzLGEsYik7dmFyIGM9Yi50aXRsZXx8IiI7YyYmKGEuUGE9Yyk7YS5vJjgmJihjPWEuYikmJmlhKGMuRykmJihRKGEsOCwhMSksYy5HKGEpKTtyZXR1cm4gYn07dmFyIEpkPWZ1bmN0aW9uKGEsYixjKXtOLmNhbGwodGhpcyxhLGJ8fFQuUigpLGMpO3RkKHRoaXMsOCwhMCk7dGhpcy5LfD05fTtuKEpkLE4pO1ZjKCJnb29nLXRhYiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEpkKG51bGwpfSk7dmFyIFU9ZnVuY3Rpb24oKXt0aGlzLmg9InRhYmxpc3QifTtuKFUsWGMpO2RhKFUpO1UucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWItYmFyIn07VS5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIsYyl7dGhpcy5qfHwodGhpcy5hfHxLZCh0aGlzKSx0aGlzLmo9c2EodGhpcy5hKSk7dmFyIGQ9dGhpcy5qW2JdO2Q/KGFkKGEsTGQoZCkpLGEuQj1kKTpVLmkuZy5jYWxsKHRoaXMsYSxiLGMpfTtVLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPVUuaS5jLmNhbGwodGhpcyxhKTt0aGlzLmF8fEtkKHRoaXMpO2IucHVzaCh0aGlzLmFbYS5CXSk7cmV0dXJuIGJ9O3ZhciBLZD1mdW5jdGlvbihhKXt2YXIgYj1hLmIoKTthLmE9e3RvcDpiKyItdG9wIixib3R0b206YisiLWJvdHRvbSIsc3RhcnQ6YisiLXN0YXJ0IixlbmQ6YisiLWVuZCJ9fTt2YXIgVj1mdW5jdGlvbihhLGIsYyl7YT1hfHwidG9wIjthZCh0aGlzLExkKGEpKTt0aGlzLkI9YTtTLmNhbGwodGhpcyx0aGlzLkgsYnx8VS5SKCksYyk7TWQodGhpcyl9O24oVixTKTtoPVYucHJvdG90eXBlO2guQz1udWxsO2guRD1mdW5jdGlvbigpe1YuaS5ELmNhbGwodGhpcyk7TWQodGhpcyl9O2gudT1mdW5jdGlvbigpe1YuaS51LmNhbGwodGhpcyk7dGhpcy5DPW51bGx9O2guRWE9ZnVuY3Rpb24oYSl7Vi5pLkVhLmNhbGwodGhpcyxhKTt0aGlzLkcoTCh0aGlzLGEpKX07aC5HPWZ1bmN0aW9uKGEpe2E/cmQoYSwhMCk6dGhpcy5DJiZyZCh0aGlzLkMsITEpfTsKdmFyIE5kPWZ1bmN0aW9uKGEsYil7aWYoYiYmYj09YS5DKXtmb3IodmFyIGM9VGMoYSxiKSxkPWMtMTtiPUwoYSxkKTtkLS0pe3ZhciBlPWI7aWYoZS5pc1Zpc2libGUoKSYmZS5pc0VuYWJsZWQoKSl7YS5HKGIpO3JldHVybn19Zm9yKGMrPTE7Yj1MKGEsYyk7YysrKWlmKGQ9YixkLmlzVmlzaWJsZSgpJiZkLmlzRW5hYmxlZCgpKXthLkcoYik7cmV0dXJufWEuRyhudWxsKX19O2g9Vi5wcm90b3R5cGU7aC5hYj1mdW5jdGlvbihhKXt0aGlzLkMmJnRoaXMuQyE9YS50YXJnZXQmJnJkKHRoaXMuQywhMSk7dGhpcy5DPWEudGFyZ2V0fTtoLmJiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT10aGlzLkMmJih0aGlzLkM9bnVsbCl9O2guWmE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guJGE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guSGE9ZnVuY3Rpb24oKXtMKHRoaXMsdGhpcy5sKXx8Q2QodGhpcyxUYyh0aGlzLHRoaXMuQ3x8TCh0aGlzLDApKSl9Owp2YXIgTWQ9ZnVuY3Rpb24oYSl7SChIKEgoSChPYyhhKSxhLCJzZWxlY3QiLGEuYWIpLGEsInVuc2VsZWN0IixhLmJiKSxhLCJkaXNhYmxlIixhLlphKSxhLCJoaWRlIixhLiRhKX0sTGQ9ZnVuY3Rpb24oYSl7cmV0dXJuInN0YXJ0Ij09YXx8ImVuZCI9PWE/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O1ZjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBWfSk7ZnVuY3Rpb24gT2QoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIFBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgZz1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIrZyk7Zm9yKHZhciBrPVtdLHA9YmEoYyksdz1wLm5leHQoKTshdy5kb25lO3c9cC5uZXh0KCkpe3c9dy52YWx1ZTt2YXIgQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKQi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO0IudGV4dENvbnRlbnQ9dztmLmFwcGVuZENoaWxkKEIpO2sucHVzaChCKX0iYm90dG9tIiE9ZyYmZS5hcHBlbmRDaGlsZChmKTtwPW51bGw7aWYoInRvcCI9PWd8fCJib3R0b20iPT1nKXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTsidG9wIj09ZyYmcCYmZS5hcHBlbmRDaGlsZChwKTtCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0IuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciByYT1bXTtjPWJhKGMpO2Zvcih3PWMubmV4dCgpOyF3LmRvbmU7dz1jLm5leHQoKSl3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHcuaWQ9ZS5pZCsiX2NvbnRlbnRfIityYS5sZW5ndGgsdy5zdHlsZS5kaXNwbGF5PSJub25lIixCLmFwcGVuZENoaWxkKHcpLHJhLnB1c2godyk7ZS5hcHBlbmRDaGlsZChCKTsiYm90dG9tIj09ZyYmKHAmJgplLmFwcGVuZENoaWxkKHApLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBYPW5ldyBWKGcpO1BjKFgsZik7dmFyIFk9LTE7ZGMoWCwic2VsZWN0IixmdW5jdGlvbihaKXtaPWsuaW5kZXhPZihaLnRhcmdldC5mKCkpO1ohPVkmJigwPD1ZJiZZPHJhLmxlbmd0aCYmKHJhW1ldLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFk9LTEpLDA8PVomJlo8cmEubGVuZ3RoJiYoWT1aLHJhW1ldLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksWC5HKEwoWCxZKSkpfSk7WC5HKEwoWCxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFope1guRyhMKFgsWikpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChPZChhKSl9LFFkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sVz1sOwpRZFswXWluIFd8fCJ1bmRlZmluZWQiPT10eXBlb2YgVy5leGVjU2NyaXB0fHxXLmV4ZWNTY3JpcHQoInZhciAiK1FkWzBdKTtmb3IodmFyIFJkO1FkLmxlbmd0aCYmKFJkPVFkLnNoaWZ0KCkpOylRZC5sZW5ndGh8fHZvaWQgMD09PVBkP1dbUmRdJiZXW1JkXSE9PU9iamVjdC5wcm90b3R5cGVbUmRdP1c9V1tSZF06Vz1XW1JkXT17fTpXW1JkXT1QZDt9KS5jYWxsKHRoaXMpOwovLyBjbGFuZy1mb3JtYXQgb24K", + "headers": [ + [ + "content-type", + "application/javascript" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + } + } + }, + "executionInfo": { + "elapsed": 14970, + "status": "ok", + "timestamp": 1600709622702, + "user": { + "displayName": "Evgeny Skvortsov", + "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhiQjODaOVLfYnUuWS9rB3LRntzJDM0hqElzsUkdQ=s64", + "userId": "11510585406840398626" + }, + "user_tz": 420 + }, + "id": "FLWcN-HZT91l", + "outputId": "4d57d69a-3ac9-4537-8d47-264334f57519" + }, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id20" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id20" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id20" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9700b4f4-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id20\", \"tabNames\": [\"EmployeeLocation\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_467441c648" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id20" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9700f946-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id20\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_f56a0fca0f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id20" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97030a06-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_ccdbaaa470" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_1", + "outputarea_id20" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97033b7a-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id20_content_1\");\n", + "//# sourceURL=js_7e496e6fe3" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_1", + "outputarea_id20" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9703b690-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"97033b7a-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_dd3fa4ba03" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_1", + "outputarea_id20" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97040dfc-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id20\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_30fa091360" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_1", + "outputarea_id20" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running EmployeeLocation\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"9707b18c-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"97030a06-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_1e42def867" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_1", + "outputarea_id20" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9709fa50-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_3e371c161b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_0", + "outputarea_id20" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"970a6594-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id20_content_0\");\n", + "//# sourceURL=js_c4786244d9" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_0", + "outputarea_id20" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"970ac0d4-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"970a6594-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_f8d2e17774" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_0", + "outputarea_id20" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"970b00e4-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id20\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_3fcdf42f9b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_0", + "outputarea_id20" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_0", + "outputarea_id20", + "outputarea_id21", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_0", + "outputarea_id20", + "outputarea_id21", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_0", + "outputarea_id20", + "outputarea_id21", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"970ca2c8-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id21\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_4b8122dfa0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_0", + "outputarea_id20", + "outputarea_id21", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"970cf37c-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id21\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_eb696736e8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_0", + "outputarea_id20", + "outputarea_id21", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"970e378c-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_fb790e8d78" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_0", + "id21_content_0", + "outputarea_id20", + "outputarea_id21", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"970e835e-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id21_content_0\");\n", + "//# sourceURL=js_1f4736d3ab" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_0", + "id21_content_0", + "outputarea_id20", + "outputarea_id21", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"970ed0de-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"970e835e-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_f4109c29af" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_0", + "id21_content_0", + "outputarea_id20", + "outputarea_id21", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"970f15bc-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id21\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_34f9417e18" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_0", + "id21_content_0", + "outputarea_id20", + "outputarea_id21", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mEmployeeLocation_sql\u001b[0m variable.\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " \"Alice\" AS name,\n", + " \"Product Manager\" AS role,\n", + " \"SEA\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Bob\" AS name,\n", + " \"Engineer\" AS role,\n", + " \"SEA\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Caroline\" AS name,\n", + " \"Engineer\" AS role,\n", + " \"LAX\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"David\" AS name,\n", + " \"Data Scientist\" AS role,\n", + " \"LAX\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Eve\" AS name,\n", + " \"Data Scientist\" AS role,\n", + " \"SEA\" AS office\n", + " \n", + ") ),\n", + "t_1_OfficeLocation AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " \"SEA\" AS office,\n", + " \"Seattle\" AS city\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"LAX\" AS office,\n", + " \"Los Angeles\" AS city\n", + " \n", + ") )\n", + "SELECT\n", + " Employee.name AS employee,\n", + " OfficeLocation.city AS city\n", + "FROM\n", + " t_0_Employee AS Employee, t_1_OfficeLocation AS OfficeLocation\n", + "WHERE\n", + " OfficeLocation.office = Employee.office;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"971032d0-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"970e378c-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_1031418e66" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_0", + "id21_content_0", + "outputarea_id20", + "outputarea_id21", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"971175be-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9709fa50-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_f859ebf044" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_0", + "outputarea_id20" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97130424-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_060d3855fc" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_1", + "outputarea_id20" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97134c5e-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id20_content_1\");\n", + "//# sourceURL=js_35460332fe" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_1", + "outputarea_id20" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97139e20-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"97134c5e-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_a1e0717723" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_1", + "outputarea_id20" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9713e2b8-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id20\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_de7afe5305" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_1", + "outputarea_id20" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97b18892-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"97130424-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_4bd5de57fb" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_1", + "outputarea_id20" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97b3a28a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b2c8f5e08d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_0", + "outputarea_id20" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97b41666-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id20_content_0\");\n", + "//# sourceURL=js_5e83356272" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_0", + "outputarea_id20" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97b482b8-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"97b41666-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_73ccb1dd01" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_0", + "outputarea_id20" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97b4ea28-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id20\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_1bd436c338" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_0", + "outputarea_id20" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97b691b6-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_fce7e3eb64" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_0", + "id21_content_1", + "outputarea_id20", + "outputarea_id21", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97b703da-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id21_content_1\");\n", + "//# sourceURL=js_721bb965fc" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_0", + "id21_content_1", + "outputarea_id20", + "outputarea_id21", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97b774a0-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"97b703da-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_7f51901d0b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_0", + "id21_content_1", + "outputarea_id20", + "outputarea_id21", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97b7e084-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id21\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_69391fd71f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_0", + "id21_content_1", + "outputarea_id20", + "outputarea_id21", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mEmployeeLocation\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
employeecity
0AliceSeattle
1BobSeattle
2CarolineLos Angeles
3DavidLos Angeles
4EveSeattle
\n", + "
" + ], + "text/plain": [ + " employee city\n", + "0 Alice Seattle\n", + "1 Bob Seattle\n", + "2 Caroline Los Angeles\n", + "3 David Los Angeles\n", + "4 Eve Seattle" + ] + }, + "metadata": { + "tags": [ + "id20_content_0", + "id21_content_1", + "outputarea_id20", + "outputarea_id21", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97bc1d0c-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"97b691b6-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_6bcc181e21" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_0", + "id21_content_1", + "outputarea_id20", + "outputarea_id21", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97be032e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"97b3a28a-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_c401a190dd" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id20_content_0", + "outputarea_id20" + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "%%logica EmployeeLocation\n", + "\n", + "Employee(name: \"Alice\", role: \"Product Manager\", office: \"SEA\");\n", + "Employee(name: \"Bob\", role: \"Engineer\", office: \"SEA\");\n", + "Employee(name: \"Caroline\", role: \"Engineer\", office: \"LAX\");\n", + "Employee(name: \"David\", role: \"Data Scientist\", office: \"LAX\");\n", + "Employee(name: \"Eve\", role: \"Data Scientist\", office: \"SEA\");\n", + "\n", + "OfficeLocation(office: \"SEA\", city: \"Seattle\");\n", + "OfficeLocation(office: \"LAX\", city: \"Los Angeles\");\n", + "\n", + "Role(name: \"PM\", area: \"Product\");\n", + "Role(name: \"Eng\", area: \"Software\");\n", + "Role(name: \"AMT\", area: \"Statitics\");\n", + "\n", + "EmployeeLocation(employee: name, city:) :-\n", + " Employee(name:, office:),\n", + " OfficeLocation(office:, city:);\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tKYdjSq9egR0" + }, + "source": [ + "### Disjunction (aka Union)\n", + "\n", + "Symbol `|` denotes disjunction." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 270, + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH0=", + "headers": [ + [ + "content-type", + "text/css" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgaCxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9ZnVuY3Rpb24oYSl7dmFyIGI9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmYVtTeW1ib2wuaXRlcmF0b3JdO3JldHVybiBiP2IuY2FsbChhKTp7bmV4dDphYShhKX19LGw9dGhpc3x8c2VsZixjYT1mdW5jdGlvbigpe30sZGE9ZnVuY3Rpb24oYSl7YS5CYT12b2lkIDA7YS5SPWZ1bmN0aW9uKCl7cmV0dXJuIGEuQmE/YS5CYTphLkJhPW5ldyBhfX0sZWE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7aWYoIm9iamVjdCI9PWIpaWYoYSl7aWYoYSBpbnN0YW5jZW9mIEFycmF5KXJldHVybiJhcnJheSI7aWYoYSBpbnN0YW5jZW9mIE9iamVjdClyZXR1cm4gYjt2YXIgYz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk7aWYoIltvYmplY3QgV2luZG93XSI9PWMpcmV0dXJuIm9iamVjdCI7CmlmKCJbb2JqZWN0IEFycmF5XSI9PWN8fCJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGgmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5zcGxpY2UmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoInNwbGljZSIpKXJldHVybiJhcnJheSI7aWYoIltvYmplY3QgRnVuY3Rpb25dIj09Y3x8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmNhbGwmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoImNhbGwiKSlyZXR1cm4iZnVuY3Rpb24ifWVsc2UgcmV0dXJuIm51bGwiO2Vsc2UgaWYoImZ1bmN0aW9uIj09YiYmInVuZGVmaW5lZCI9PXR5cGVvZiBhLmNhbGwpcmV0dXJuIm9iamVjdCI7cmV0dXJuIGJ9LGZhPWZ1bmN0aW9uKGEpe3JldHVybiJhcnJheSI9PWVhKGEpfSxoYT1mdW5jdGlvbihhKXt2YXIgYj1lYShhKTtyZXR1cm4iYXJyYXkiPT1ifHwib2JqZWN0Ij09CmImJiJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGh9LGlhPWZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PWVhKGEpfSxtPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBhO3JldHVybiJvYmplY3QiPT1iJiZudWxsIT1hfHwiZnVuY3Rpb24iPT1ifSxqYT0iY2xvc3VyZV91aWRfIisoMUU5Kk1hdGgucmFuZG9tKCk+Pj4wKSxrYT0wLGxhPWZ1bmN0aW9uKGEsYil7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe3ZhciBkPWMuc2xpY2UoKTtkLnB1c2guYXBwbHkoZCxhcmd1bWVudHMpO3JldHVybiBhLmFwcGx5KHRoaXMsZCl9fSxuPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe31jLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLmk9Yi5wcm90b3R5cGU7YS5wcm90b3R5cGU9bmV3IGM7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YX07dmFyIG1hLG5hPXtlYjoiYWN0aXZlZGVzY2VuZGFudCIsamI6ImF0b21pYyIsa2I6ImF1dG9jb21wbGV0ZSIsbWI6ImJ1c3kiLHBiOiJjaGVja2VkIixxYjoiY29saW5kZXgiLHZiOiJjb250cm9scyIseGI6ImRlc2NyaWJlZGJ5IixBYjoiZGlzYWJsZWQiLENiOiJkcm9wZWZmZWN0IixEYjoiZXhwYW5kZWQiLEViOiJmbG93dG8iLEdiOiJncmFiYmVkIixLYjoiaGFzcG9wdXAiLE1iOiJoaWRkZW4iLE9iOiJpbnZhbGlkIixQYjoibGFiZWwiLFFiOiJsYWJlbGxlZGJ5IixSYjoibGV2ZWwiLFdiOiJsaXZlIixrYzoibXVsdGlsaW5lIixsYzoibXVsdGlzZWxlY3RhYmxlIixwYzoib3JpZW50YXRpb24iLHFjOiJvd25zIixyYzoicG9zaW5zZXQiLHRjOiJwcmVzc2VkIix4YzoicmVhZG9ubHkiLHpjOiJyZWxldmFudCIsQWM6InJlcXVpcmVkIixFYzoicm93aW5kZXgiLEhjOiJzZWxlY3RlZCIsSmM6InNldHNpemUiLExjOiJzb3J0IixaYzoidmFsdWVtYXgiLCRjOiJ2YWx1ZW1pbiIsYWQ6InZhbHVlbm93IiwKYmQ6InZhbHVldGV4dCJ9O3ZhciBvYT1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkIGluIGEpYi5jYWxsKGMsYVtkXSxkLGEpfSxwYT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyBpbiBhKWlmKGFbY109PWIpcmV0dXJuITA7cmV0dXJuITF9LHFhPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsIT09YSYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfSxzYT1mdW5jdGlvbihhKXt2YXIgYj17fSxjO2ZvcihjIGluIGEpYlthW2NdXT1jO3JldHVybiBifSx0YT0iY29uc3RydWN0b3IgaGFzT3duUHJvcGVydHkgaXNQcm90b3R5cGVPZiBwcm9wZXJ0eUlzRW51bWVyYWJsZSB0b0xvY2FsZVN0cmluZyB0b1N0cmluZyB2YWx1ZU9mIi5zcGxpdCgiICIpLHVhPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8dGEubGVuZ3RoO2YrKyljPQp0YVtmXSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZCxjKSYmKGFbY109ZFtjXSl9fTt2YXIgdmE9e2ZiOiJhbGVydCIsZ2I6ImFsZXJ0ZGlhbG9nIixoYjoiYXBwbGljYXRpb24iLGliOiJhcnRpY2xlIixsYjoiYmFubmVyIixuYjoiYnV0dG9uIixvYjoiY2hlY2tib3giLHJiOiJjb2x1bW5oZWFkZXIiLHNiOiJjb21ib2JveCIsdGI6ImNvbXBsZW1lbnRhcnkiLHViOiJjb250ZW50aW5mbyIsd2I6ImRlZmluaXRpb24iLHliOiJkaWFsb2ciLHpiOiJkaXJlY3RvcnkiLEJiOiJkb2N1bWVudCIsRmI6ImZvcm0iLEhiOiJncmlkIixJYjoiZ3JpZGNlbGwiLEpiOiJncm91cCIsTGI6ImhlYWRpbmciLE5iOiJpbWciLFNiOiJsaW5rIixUYjoibGlzdCIsVWI6Imxpc3Rib3giLFZiOiJsaXN0aXRlbSIsWGI6ImxvZyIsWWI6Im1haW4iLFpiOiJtYXJxdWVlIiwkYjoibWF0aCIsYWM6Im1lbnUiLGJjOiJtZW51YmFyIixjYzoibWVudWl0ZW0iLGRjOiJtZW51aXRlbWNoZWNrYm94IixlYzoibWVudWl0ZW1yYWRpbyIsbWM6Im5hdmlnYXRpb24iLG5jOiJub3RlIixvYzoib3B0aW9uIiwKc2M6InByZXNlbnRhdGlvbiIsdWM6InByb2dyZXNzYmFyIix2YzoicmFkaW8iLHdjOiJyYWRpb2dyb3VwIix5YzoicmVnaW9uIixCYzoicm93IixDYzoicm93Z3JvdXAiLERjOiJyb3doZWFkZXIiLEZjOiJzY3JvbGxiYXIiLEdjOiJzZWFyY2giLEljOiJzZXBhcmF0b3IiLEtjOiJzbGlkZXIiLE1jOiJzcGluYnV0dG9uIixOYzoic3RhdHVzIixPYzoidGFiIixQYzoidGFibGlzdCIsUWM6InRhYnBhbmVsIixSYzoidGV4dGJveCIsU2M6InRleHRpbmZvIixUYzoidGltZXIiLFVjOiJ0b29sYmFyIixWYzoidG9vbHRpcCIsV2M6InRyZWUiLFhjOiJ0cmVlZ3JpZCIsWWM6InRyZWVpdGVtIn07dmFyIHdhPWZ1bmN0aW9uKGEpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsd2EpO2Vsc2V7dmFyIGI9RXJyb3IoKS5zdGFjaztiJiYodGhpcy5zdGFjaz1iKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSl9O24od2EsRXJyb3IpO3dhLnByb3RvdHlwZS5uYW1lPSJDdXN0b21FcnJvciI7dmFyIHhhO3ZhciB5YT1mdW5jdGlvbihhLGIpe2E9YS5zcGxpdCgiJXMiKTtmb3IodmFyIGM9IiIsZD1hLmxlbmd0aC0xLGU9MDtlPGQ7ZSsrKWMrPWFbZV0rKGU8Yi5sZW5ndGg/YltlXToiJXMiKTt3YS5jYWxsKHRoaXMsYythW2RdKX07bih5YSx3YSk7eWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjsKdmFyIHphPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSJBc3NlcnRpb24gZmFpbGVkIjtpZihjKXtlKz0iOiAiK2M7dmFyIGY9ZH1lbHNlIGEmJihlKz0iOiAiK2EsZj1iKTt0aHJvdyBuZXcgeWEoIiIrZSxmfHxbXSk7fSxxPWZ1bmN0aW9uKGEsYixjKXthfHx6YSgiIixudWxsLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX0sQWE9ZnVuY3Rpb24oYSxiLGMpe20oYSkmJjE9PWEubm9kZVR5cGV8fHphKCJFeHBlY3RlZCBFbGVtZW50IGJ1dCBnb3QgJXM6ICVzLiIsW2VhKGEpLGFdLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKX0sQ2E9ZnVuY3Rpb24oYSxiLGMsZCl7YSBpbnN0YW5jZW9mIGJ8fHphKCJFeHBlY3RlZCBpbnN0YW5jZW9mICVzIGJ1dCBnb3QgJXMuIixbQmEoYiksQmEoYSldLGMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpKX0sQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZgpGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTpudWxsPT09YT8ibnVsbCI6dHlwZW9mIGF9O3ZhciBEYT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3EobnVsbCE9YS5sZW5ndGgpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKCJzdHJpbmciPT09dHlwZW9mIGEpcmV0dXJuInN0cmluZyIhPT10eXBlb2YgYnx8MSE9Yi5sZW5ndGg/LTE6YS5pbmRleE9mKGIsMCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspaWYoYyBpbiBhJiZhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX0scj1BcnJheS5wcm90b3R5cGUuZm9yRWFjaD9mdW5jdGlvbihhLGIsYyl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsYyl9OmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9YS5sZW5ndGgsZT0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZj0wO2Y8ZDtmKyspZiBpbiBlJiZiLmNhbGwoYyxlW2ZdLGYsYSl9LEVhPUFycmF5LnByb3RvdHlwZS5maWx0ZXI/CmZ1bmN0aW9uKGEsYil7cShudWxsIT1hLmxlbmd0aCk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD1bXSxlPTAsZj0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZz0wO2c8YztnKyspaWYoZyBpbiBmKXt2YXIgaz1mW2ddO2IuY2FsbCh2b2lkIDAsayxnLGEpJiYoZFtlKytdPWspfXJldHVybiBkfSxGYT1BcnJheS5wcm90b3R5cGUuZXZlcnk/ZnVuY3Rpb24oYSxiKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmV2ZXJ5LmNhbGwoYSxiLHZvaWQgMCl9OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWEubGVuZ3RoLGQ9InN0cmluZyI9PT10eXBlb2YgYT9hLnNwbGl0KCIiKTphLGU9MDtlPGM7ZSsrKWlmKGUgaW4gZCYmIWIuY2FsbCh2b2lkIDAsZFtlXSxlLGEpKXJldHVybiExO3JldHVybiEwfSxHYT1mdW5jdGlvbihhLGIpe3JldHVybiAwPD0KRGEoYSxiKX0sSGE9ZnVuY3Rpb24oYSxiKXtiPURhKGEsYik7dmFyIGM7aWYoYz0wPD1iKXEobnVsbCE9YS5sZW5ndGgpLEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhLGIsMSk7cmV0dXJuIGN9LElhPWZ1bmN0aW9uKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGFyZ3VtZW50cyl9LEphPWZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDA8Yil7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX0sTGE9ZnVuY3Rpb24oYSxiLGMsZCl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShhLEthKGFyZ3VtZW50cywxKSl9LEthPWZ1bmN0aW9uKGEsYixjKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gMj49YXJndW1lbnRzLmxlbmd0aD9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsYixjKX07dmFyIE1hPVN0cmluZy5wcm90b3R5cGUudHJpbT9mdW5jdGlvbihhKXtyZXR1cm4gYS50cmltKCl9OmZ1bmN0aW9uKGEpe3JldHVybi9eW1xzXHhhMF0qKFtcc1xTXSo/KVtcc1x4YTBdKiQvLmV4ZWMoYSlbMV19LE5hPS8mL2csT2E9LzwvZyxQYT0vPi9nLFFhPS8iL2csUmE9LycvZyxTYT0vXHgwMC9nLFRhPS9bXHgwMCY8PiInXS8sdD1mdW5jdGlvbihhLGIpe3JldHVybi0xIT1hLmluZGV4T2YoYil9LFVhPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE8Yj8tMTphPmI/MTowfTt2YXIgdTthOnt2YXIgVmE9bC5uYXZpZ2F0b3I7aWYoVmEpe3ZhciBXYT1WYS51c2VyQWdlbnQ7aWYoV2Epe3U9V2E7YnJlYWsgYX19dT0iIn07LyoKCiBDb3B5cmlnaHQgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzLgogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKKi8KdmFyIFhhPWZ1bmN0aW9uKGEpe1RhLnRlc3QoYSkmJigtMSE9YS5pbmRleE9mKCImIikmJihhPWEucmVwbGFjZShOYSwiJmFtcDsiKSksLTEhPWEuaW5kZXhPZigiPCIpJiYoYT1hLnJlcGxhY2UoT2EsIiZsdDsiKSksLTEhPWEuaW5kZXhPZigiPiIpJiYoYT1hLnJlcGxhY2UoUGEsIiZndDsiKSksLTEhPWEuaW5kZXhPZignIicpJiYoYT1hLnJlcGxhY2UoUWEsIiZxdW90OyIpKSwtMSE9YS5pbmRleE9mKCInIikmJihhPWEucmVwbGFjZShSYSwiJiMzOTsiKSksLTEhPWEuaW5kZXhPZigiXHgwMCIpJiYoYT1hLnJlcGxhY2UoU2EsIiYjMDsiKSkpO3JldHVybiBhfTt2YXIgWWE9ZnVuY3Rpb24oYSl7WWFbIiAiXShhKTtyZXR1cm4gYX07WWFbIiAiXT1jYTt2YXIgJGE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1aYTtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsYSk/Y1thXTpjW2FdPWIoYSl9O3ZhciBhYj10KHUsIk9wZXJhIiksdj10KHUsIlRyaWRlbnQiKXx8dCh1LCJNU0lFIiksYmI9dCh1LCJFZGdlIikseD10KHUsIkdlY2tvIikmJiEodCh1LnRvTG93ZXJDYXNlKCksIndlYmtpdCIpJiYhdCh1LCJFZGdlIikpJiYhKHQodSwiVHJpZGVudCIpfHx0KHUsIk1TSUUiKSkmJiF0KHUsIkVkZ2UiKSx5PXQodS50b0xvd2VyQ2FzZSgpLCJ3ZWJraXQiKSYmIXQodSwiRWRnZSIpLHo9dCh1LCJNYWNpbnRvc2giKSxjYj1mdW5jdGlvbigpe3ZhciBhPWwuZG9jdW1lbnQ7cmV0dXJuIGE/YS5kb2N1bWVudE1vZGU6dm9pZCAwfSxkYjsKYTp7dmFyIGViPSIiLGZiPWZ1bmN0aW9uKCl7dmFyIGE9dTtpZih4KXJldHVybi9ydjooW15cKTtdKykoXCl8OykvLmV4ZWMoYSk7aWYoYmIpcmV0dXJuL0VkZ2VcLyhbXGRcLl0rKS8uZXhlYyhhKTtpZih2KXJldHVybi9cYig/Ok1TSUV8cnYpWzogXShbXlwpO10rKShcKXw7KS8uZXhlYyhhKTtpZih5KXJldHVybi9XZWJLaXRcLyhcUyspLy5leGVjKGEpO2lmKGFiKXJldHVybi8oPzpWZXJzaW9uKVsgXC9dPyhcUyspLy5leGVjKGEpfSgpO2ZiJiYoZWI9ZmI/ZmJbMV06IiIpO2lmKHYpe3ZhciBnYj1jYigpO2lmKG51bGwhPWdiJiZnYj5wYXJzZUZsb2F0KGViKSl7ZGI9U3RyaW5nKGdiKTticmVhayBhfX1kYj1lYn0KdmFyIGhiPWRiLFphPXt9LEE9ZnVuY3Rpb24oYSl7cmV0dXJuICRhKGEsZnVuY3Rpb24oKXtmb3IodmFyIGI9MCxjPU1hKFN0cmluZyhoYikpLnNwbGl0KCIuIiksZD1NYShTdHJpbmcoYSkpLnNwbGl0KCIuIiksZT1NYXRoLm1heChjLmxlbmd0aCxkLmxlbmd0aCksZj0wOzA9PWImJmY8ZTtmKyspe3ZhciBnPWNbZl18fCIiLGs9ZFtmXXx8IiI7ZG97Zz0vKFxkKikoXEQqKSguKikvLmV4ZWMoZyl8fFsiIiwiIiwiIiwiIl07az0vKFxkKikoXEQqKSguKikvLmV4ZWMoayl8fFsiIiwiIiwiIiwiIl07aWYoMD09Z1swXS5sZW5ndGgmJjA9PWtbMF0ubGVuZ3RoKWJyZWFrO2I9VWEoMD09Z1sxXS5sZW5ndGg/MDpwYXJzZUludChnWzFdLDEwKSwwPT1rWzFdLmxlbmd0aD8wOnBhcnNlSW50KGtbMV0sMTApKXx8VWEoMD09Z1syXS5sZW5ndGgsMD09a1syXS5sZW5ndGgpfHxVYShnWzJdLGtbMl0pO2c9Z1szXTtrPWtbM119d2hpbGUoMD09Yil9cmV0dXJuIDA8PWJ9KX0saWI7CmliPWwuZG9jdW1lbnQmJnY/Y2IoKTp2b2lkIDA7dmFyIGpiPSF2fHw5PD1OdW1iZXIoaWIpO3ZhciBsYj1mdW5jdGlvbihhLGIpe29hKGIsZnVuY3Rpb24oYyxkKXtjJiYib2JqZWN0Ij09dHlwZW9mIGMmJmMuZGQmJihjPWMuY2QoKSk7InN0eWxlIj09ZD9hLnN0eWxlLmNzc1RleHQ9YzoiY2xhc3MiPT1kP2EuY2xhc3NOYW1lPWM6ImZvciI9PWQ/YS5odG1sRm9yPWM6a2IuaGFzT3duUHJvcGVydHkoZCk/YS5zZXRBdHRyaWJ1dGUoa2JbZF0sYyk6MD09ZC5sYXN0SW5kZXhPZigiYXJpYS0iLDApfHwwPT1kLmxhc3RJbmRleE9mKCJkYXRhLSIsMCk/YS5zZXRBdHRyaWJ1dGUoZCxjKTphW2RdPWN9KX0sa2I9e2NlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjb2xzcGFuOiJjb2xTcGFuIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGhlaWdodDoiaGVpZ2h0IixtYXhsZW5ndGg6Im1heExlbmd0aCIsbm9uY2U6Im5vbmNlIixyb2xlOiJyb2xlIixyb3dzcGFuOiJyb3dTcGFuIix0eXBlOiJ0eXBlIix1c2VtYXA6InVzZU1hcCIsdmFsaWduOiJ2QWxpZ24iLAp3aWR0aDoid2lkdGgifSxtYj1mdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChrKXtrJiZiLmFwcGVuZENoaWxkKCJzdHJpbmciPT09dHlwZW9mIGs/YS5jcmVhdGVUZXh0Tm9kZShrKTprKX1mb3IodmFyIGU9MjtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXTtpZighaGEoZil8fG0oZikmJjA8Zi5ub2RlVHlwZSlkKGYpO2Vsc2V7YTp7aWYoZiYmIm51bWJlciI9PXR5cGVvZiBmLmxlbmd0aCl7aWYobShmKSl7dmFyIGc9ImZ1bmN0aW9uIj09dHlwZW9mIGYuaXRlbXx8InN0cmluZyI9PXR5cGVvZiBmLml0ZW07YnJlYWsgYX1pZihpYShmKSl7Zz0iZnVuY3Rpb24iPT10eXBlb2YgZi5pdGVtO2JyZWFrIGF9fWc9ITF9cihnP0phKGYpOmYsZCl9fX0sbmI9ZnVuY3Rpb24oYSxiKXtiPVN0cmluZyhiKTsiYXBwbGljYXRpb24veGh0bWwreG1sIj09PWEuY29udGVudFR5cGUmJihiPWIudG9Mb3dlckNhc2UoKSk7cmV0dXJuIGEuY3JlYXRlRWxlbWVudChiKX0sb2I9ZnVuY3Rpb24oYSl7YSYmCmEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpfSxwYj1mdW5jdGlvbihhLGIpe2lmKCFhfHwhYilyZXR1cm4hMTtpZihhLmNvbnRhaW5zJiYxPT1iLm5vZGVUeXBlKXJldHVybiBhPT1ifHxhLmNvbnRhaW5zKGIpO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbilyZXR1cm4gYT09Ynx8ISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNik7Zm9yKDtiJiZhIT1iOyliPWIucGFyZW50Tm9kZTtyZXR1cm4gYj09YX0scWI9ZnVuY3Rpb24oYSl7cShhLCJOb2RlIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4iKTtyZXR1cm4gOT09YS5ub2RlVHlwZT9hOmEub3duZXJEb2N1bWVudHx8YS5kb2N1bWVudH0scmI9ZnVuY3Rpb24oYSxiKXtiP2EudGFiSW5kZXg9MDooYS50YWJJbmRleD0tMSxhLnJlbW92ZUF0dHJpYnV0ZSgidGFiSW5kZXgiKSl9LHNiPWZ1bmN0aW9uKGEpe3JldHVybiB2JiYhQSgiOSIpPyhhPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKSwKbnVsbCE9YSYmYS5zcGVjaWZpZWQpOmEuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpfSx0Yj1mdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgYSYmMDw9YSYmMzI3Njg+YX0sdWI9ZnVuY3Rpb24oYSl7dGhpcy5hPWF8fGwuZG9jdW1lbnR8fGRvY3VtZW50fTt1Yi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBhP3RoaXMuYS5nZXRFbGVtZW50QnlJZChhKTphfTsKdWIucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuYSxlPWFyZ3VtZW50cyxmPVN0cmluZyhlWzBdKSxnPWVbMV07aWYoIWpiJiZnJiYoZy5uYW1lfHxnLnR5cGUpKXtmPVsiPCIsZl07Zy5uYW1lJiZmLnB1c2goJyBuYW1lPSInLFhhKGcubmFtZSksJyInKTtpZihnLnR5cGUpe2YucHVzaCgnIHR5cGU9IicsWGEoZy50eXBlKSwnIicpO3ZhciBrPXt9O3VhKGssZyk7ZGVsZXRlIGsudHlwZTtnPWt9Zi5wdXNoKCI+Iik7Zj1mLmpvaW4oIiIpfWY9bmIoZCxmKTtnJiYoInN0cmluZyI9PT10eXBlb2YgZz9mLmNsYXNzTmFtZT1nOmZhKGcpP2YuY2xhc3NOYW1lPWcuam9pbigiICIpOmxiKGYsZykpOzI8ZS5sZW5ndGgmJm1iKGQsZixlKTtyZXR1cm4gZn07dmFyIHZiPWZ1bmN0aW9uKGEsYil7Yj8ocShwYSh2YSxiKSwiTm8gc3VjaCBBUklBIHJvbGUgIitiKSxhLnNldEF0dHJpYnV0ZSgicm9sZSIsYikpOmEucmVtb3ZlQXR0cmlidXRlKCJyb2xlIil9LHhiPWZ1bmN0aW9uKGEsYixjKXtmYShjKSYmKGM9Yy5qb2luKCIgIikpO3ZhciBkPXdiKGIpOyIiPT09Y3x8dm9pZCAwPT1jPyhtYXx8KG1hPXthdG9taWM6ITEsYXV0b2NvbXBsZXRlOiJub25lIixkcm9wZWZmZWN0OiJub25lIixoYXNwb3B1cDohMSxsaXZlOiJvZmYiLG11bHRpbGluZTohMSxtdWx0aXNlbGVjdGFibGU6ITEsb3JpZW50YXRpb246InZlcnRpY2FsIixyZWFkb25seTohMSxyZWxldmFudDoiYWRkaXRpb25zIHRleHQiLHJlcXVpcmVkOiExLHNvcnQ6Im5vbmUiLGJ1c3k6ITEsZGlzYWJsZWQ6ITEsaGlkZGVuOiExLGludmFsaWQ6ImZhbHNlIn0pLGM9bWEsYiBpbiBjP2Euc2V0QXR0cmlidXRlKGQsY1tiXSk6YS5yZW1vdmVBdHRyaWJ1dGUoZCkpOmEuc2V0QXR0cmlidXRlKGQsCmMpfSx3Yj1mdW5jdGlvbihhKXtxKGEsIkFSSUEgYXR0cmlidXRlIGNhbm5vdCBiZSBlbXB0eS4iKTtxKHBhKG5hLGEpLCJObyBzdWNoIEFSSUEgYXR0cmlidXRlICIrYSk7cmV0dXJuImFyaWEtIithfTt2YXIgeWI9T2JqZWN0LmZyZWV6ZXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O3ZhciBDPWZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVTt0aGlzLko9dGhpcy5KfTtDLnByb3RvdHlwZS5VPSExO0MucHJvdG90eXBlLk49ZnVuY3Rpb24oKXt0aGlzLlV8fCh0aGlzLlU9ITAsdGhpcy51KCkpfTt2YXIgemI9ZnVuY3Rpb24oYSxiKXthLlU/YigpOihhLkp8fChhLko9W10pLGEuSi5wdXNoKGIpKX07Qy5wcm90b3R5cGUudT1mdW5jdGlvbigpe2lmKHRoaXMuSilmb3IoO3RoaXMuSi5sZW5ndGg7KXRoaXMuSi5zaGlmdCgpKCl9O3ZhciBBYj1mdW5jdGlvbihhKXthJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5OJiZhLk4oKX07dmFyIEJiPWZ1bmN0aW9uKGEpe3JldHVybiJzdHJpbmciPT10eXBlb2YgYS5jbGFzc05hbWU/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sRD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6QmIoYSkubWF0Y2goL1xTKy9nKXx8W119LENiPWZ1bmN0aW9uKGEsYil7InN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZT9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxEYj1mdW5jdGlvbihhLGIpe3JldHVybiBhLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5jb250YWlucyhiKTpHYShEKGEpLGIpfSxFYj1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFEYihhLGIpKXt2YXIgYz1CYihhKTtDYihhLGMrKDA8Yy5sZW5ndGg/IiAiK2I6YikpfX0sRmI9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClyKGIsCmZ1bmN0aW9uKGUpe0ViKGEsZSl9KTtlbHNle3ZhciBjPXt9O3IoRChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7cihiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPTA8Yi5sZW5ndGg/IiAiK2Q6ZDtDYihhLGIpfX0sR2I9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6RGIoYSxiKSYmQ2IoYSxFYShEKGEpLGZ1bmN0aW9uKGMpe3JldHVybiBjIT1ifSkuam9pbigiICIpKX0sSGI9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9yKGIsZnVuY3Rpb24oYyl7R2IoYSxjKX0pOkNiKGEsRWEoRChhKSxmdW5jdGlvbihjKXtyZXR1cm4hR2EoYixjKX0pLmpvaW4oIiAiKSl9O3ZhciBJYj0hdnx8OTw9TnVtYmVyKGliKSxKYj0hdnx8OTw9TnVtYmVyKGliKSxLYj12JiYhQSgiOSIpLExiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e2wuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsY2EsYiksbC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjYSxiKX1jYXRjaChjKXt9cmV0dXJuIGF9KCk7dmFyIEU9ZnVuY3Rpb24oYSxiKXt0aGlzLnR5cGU9YTt0aGlzLmE9dGhpcy50YXJnZXQ9Yjt0aGlzLmg9ITE7dGhpcy5LYT0hMH07RS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuaD0hMH07RS5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3RoaXMuS2E9ITF9O3ZhciBGPXtMOiJtb3VzZWRvd24iLE06Im1vdXNldXAiLGFhOiJtb3VzZWNhbmNlbCIsaGM6Im1vdXNlbW92ZSIsamM6Im1vdXNlb3ZlciIsaWM6Im1vdXNlb3V0IixmYzoibW91c2VlbnRlciIsZ2M6Im1vdXNlbGVhdmUifTt2YXIgRz1mdW5jdGlvbihhLGIpe0UuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy5hPXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5jPTA7dGhpcy5BPXRoaXMubWV0YUtleT10aGlzLnNoaWZ0S2V5PXRoaXMuYWx0S2V5PXRoaXMuY3RybEtleT0hMTt0aGlzLnBvaW50ZXJJZD0wO3RoaXMucG9pbnRlclR5cGU9IiI7dGhpcy5iPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMuYT1iO2lmKGI9YS5yZWxhdGVkVGFyZ2V0KXtpZih4KXthOnt0cnl7WWEoYi5ub2RlTmFtZSk7dmFyIGU9ITA7YnJlYWsgYX1jYXRjaChmKXt9ZT0KITF9ZXx8KGI9bnVsbCl9fWVsc2UibW91c2VvdmVyIj09Yz9iPWEuZnJvbUVsZW1lbnQ6Im1vdXNlb3V0Ij09YyYmKGI9YS50b0VsZW1lbnQpO3RoaXMucmVsYXRlZFRhcmdldD1iO2Q/KHRoaXMuY2xpZW50WD12b2lkIDAhPT1kLmNsaWVudFg/ZC5jbGllbnRYOmQucGFnZVgsdGhpcy5jbGllbnRZPXZvaWQgMCE9PWQuY2xpZW50WT9kLmNsaWVudFk6ZC5wYWdlWSx0aGlzLnNjcmVlblg9ZC5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1kLnNjcmVlbll8fDApOih0aGlzLmNsaWVudFg9dm9pZCAwIT09YS5jbGllbnRYP2EuY2xpZW50WDphLnBhZ2VYLHRoaXMuY2xpZW50WT12b2lkIDAhPT1hLmNsaWVudFk/YS5jbGllbnRZOmEucGFnZVksdGhpcy5zY3JlZW5YPWEuc2NyZWVuWHx8MCx0aGlzLnNjcmVlblk9YS5zY3JlZW5ZfHwwKTt0aGlzLmJ1dHRvbj1hLmJ1dHRvbjt0aGlzLmM9YS5rZXlDb2RlfHwwO3RoaXMua2V5PWEua2V5fHwiIjt0aGlzLmN0cmxLZXk9YS5jdHJsS2V5O3RoaXMuYWx0S2V5PQphLmFsdEtleTt0aGlzLnNoaWZ0S2V5PWEuc2hpZnRLZXk7dGhpcy5tZXRhS2V5PWEubWV0YUtleTt0aGlzLkE9ej9hLm1ldGFLZXk6YS5jdHJsS2V5O3RoaXMucG9pbnRlcklkPWEucG9pbnRlcklkfHwwO3RoaXMucG9pbnRlclR5cGU9InN0cmluZyI9PT10eXBlb2YgYS5wb2ludGVyVHlwZT9hLnBvaW50ZXJUeXBlOk1iW2EucG9pbnRlclR5cGVdfHwiIjt0aGlzLmI9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnRoaXMuZygpfX07bihHLEUpO3ZhciBOYj15YihbMSw0LDJdKSxNYj15Yih7MjoidG91Y2giLDM6InBlbiIsNDoibW91c2UifSksT2I9ZnVuY3Rpb24oYSl7cmV0dXJuIEliPzA9PWEuYi5idXR0b246ImNsaWNrIj09YS50eXBlPyEwOiEhKGEuYi5idXR0b24mTmJbMF0pfTtHLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7Ry5pLmouY2FsbCh0aGlzKTt0aGlzLmIuc3RvcFByb3BhZ2F0aW9uP3RoaXMuYi5zdG9wUHJvcGFnYXRpb24oKTp0aGlzLmIuY2FuY2VsQnViYmxlPSEwfTsKRy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe0cuaS5nLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5iO2lmKGEucHJldmVudERlZmF1bHQpYS5wcmV2ZW50RGVmYXVsdCgpO2Vsc2UgaWYoYS5yZXR1cm5WYWx1ZT0hMSxLYil0cnl7aWYoYS5jdHJsS2V5fHwxMTI8PWEua2V5Q29kZSYmMTIzPj1hLmtleUNvZGUpYS5rZXlDb2RlPS0xfWNhdGNoKGIpe319O3ZhciBQYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKDFFNipNYXRoLnJhbmRvbSgpfDApLFFiPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW1BiXSl9LFJiPTA7dmFyIFNiPWZ1bmN0aW9uKGEsYixjLGQsZSl7dGhpcy5saXN0ZW5lcj1hO3RoaXMuYT1udWxsO3RoaXMuc3JjPWI7dGhpcy50eXBlPWM7dGhpcy5jYXB0dXJlPSEhZDt0aGlzLm1hPWU7dGhpcy5rZXk9KytSYjt0aGlzLlg9dGhpcy5oYT0hMX0sVGI9ZnVuY3Rpb24oYSl7YS5YPSEwO2EubGlzdGVuZXI9bnVsbDthLmE9bnVsbDthLnNyYz1udWxsO2EubWE9bnVsbH07dmFyIFViPWZ1bmN0aW9uKGEpe3RoaXMuc3JjPWE7dGhpcy5hPXt9O3RoaXMuYj0wfTtVYi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS50b1N0cmluZygpO2E9dGhpcy5hW2ZdO2F8fChhPXRoaXMuYVtmXT1bXSx0aGlzLmIrKyk7dmFyIGc9VmIoYSxiLGQsZSk7LTE8Zz8oYj1hW2ddLGN8fChiLmhhPSExKSk6KGI9bmV3IFNiKGIsdGhpcy5zcmMsZiwhIWQsZSksYi5oYT1jLGEucHVzaChiKSk7cmV0dXJuIGJ9Owp2YXIgV2I9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLnR5cGU7YyBpbiBhLmEmJkhhKGEuYVtjXSxiKSYmKFRiKGIpLDA9PWEuYVtjXS5sZW5ndGgmJihkZWxldGUgYS5hW2NdLGEuYi0tKSl9LFhiPWZ1bmN0aW9uKGEsYixjLGQsZSl7YT1hLmFbYi50b1N0cmluZygpXTtiPS0xO2EmJihiPVZiKGEsYyxkLGUpKTtyZXR1cm4tMTxiP2FbYl06bnVsbH0sVmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuWCYmZi5saXN0ZW5lcj09YiYmZi5jYXB0dXJlPT0hIWMmJmYubWE9PWQpcmV0dXJuIGV9cmV0dXJuLTF9O3ZhciBZYj0iY2xvc3VyZV9sbV8iKygxRTYqTWF0aC5yYW5kb20oKXwwKSxaYj17fSwkYj0wLGJjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZCYmZC5vbmNlKXJldHVybiBhYyhhLGIsYyxkLGUpO2lmKGZhKGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyliYyhhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9Y2MoYyk7cmV0dXJuIFFiKGEpP2RjKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOmVjKGEsYixjLCExLGQsZSl9LGVjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGc9bShlKT8hIWUuY2FwdHVyZTohIWUsaz1mYyhhKTtrfHwoYVtZYl09az1uZXcgVWIoYSkpO2M9ay5hZGQoYixjLGQsZyxmKTtpZihjLmEpcmV0dXJuIGM7ZD1nYygpO2MuYT1kO2Quc3JjPWE7ZC5saXN0ZW5lcj1jO2lmKGEuYWRkRXZlbnRMaXN0ZW5lcilMYnx8KGU9Zyksdm9pZCAwPT09ZSYmKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksCmQsZSk7ZWxzZSBpZihhLmF0dGFjaEV2ZW50KWEuYXR0YWNoRXZlbnQoaGMoYi50b1N0cmluZygpKSxkKTtlbHNlIGlmKGEuYWRkTGlzdGVuZXImJmEucmVtb3ZlTGlzdGVuZXIpcSgiY2hhbmdlIj09PWIsIk1lZGlhUXVlcnlMaXN0IG9ubHkgaGFzIGEgY2hhbmdlIGV2ZW50IiksYS5hZGRMaXN0ZW5lcihkKTtlbHNlIHRocm93IEVycm9yKCJhZGRFdmVudExpc3RlbmVyIGFuZCBhdHRhY2hFdmVudCBhcmUgdW5hdmFpbGFibGUuIik7JGIrKztyZXR1cm4gY30sZ2M9ZnVuY3Rpb24oKXt2YXIgYT1pYyxiPUpiP2Z1bmN0aW9uKGMpe3JldHVybiBhLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKX06ZnVuY3Rpb24oYyl7Yz1hLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKTtpZighYylyZXR1cm4gY307cmV0dXJuIGJ9LGFjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZmEoYikpe2Zvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWFjKGEsYltmXSxjLGQsZSk7cmV0dXJuIG51bGx9Yz1jYyhjKTtyZXR1cm4gUWIoYSk/CmEuaC5hZGQoU3RyaW5nKGIpLGMsITAsbShkKT8hIWQuY2FwdHVyZTohIWQsZSk6ZWMoYSxiLGMsITAsZCxlKX0samM9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihmYShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylqYyhhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPWNjKGMpLFFiKGEpPyhhPWEuaCxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5hJiYoZj1hLmFbYl0sYz1WYihmLGMsZCxlKSwtMTxjJiYoVGIoZltjXSkscShudWxsIT1mLmxlbmd0aCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSwwPT1mLmxlbmd0aCYmKGRlbGV0ZSBhLmFbYl0sYS5iLS0pKSkpOmEmJihhPWZjKGEpKSYmKGM9WGIoYSxiLGMsZCxlKSkmJmtjKGMpfSxrYz1mdW5jdGlvbihhKXtpZigibnVtYmVyIiE9PXR5cGVvZiBhJiZhJiYhYS5YKXt2YXIgYj1hLnNyYztpZihRYihiKSlXYihiLmgsYSk7ZWxzZXt2YXIgYz1hLnR5cGUsZD1hLmE7Yi5yZW1vdmVFdmVudExpc3RlbmVyPwpiLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KGhjKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7JGItLTsoYz1mYyhiKSk/KFdiKGMsYSksMD09Yy5iJiYoYy5zcmM9bnVsbCxiW1liXT1udWxsKSk6VGIoYSl9fX0saGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gWmI/WmJbYV06WmJbYV09Im9uIithfSxtYz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMDtpZihhPWZjKGEpKWlmKGI9YS5hW2IudG9TdHJpbmcoKV0pZm9yKGI9Yi5jb25jYXQoKSxhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBmPWJbYV07ZiYmZi5jYXB0dXJlPT1jJiYhZi5YJiYoZj1sYyhmLGQpLGU9ZSYmITEhPT1mKX1yZXR1cm4gZX0sbGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5tYXx8YS5zcmM7YS5oYSYma2MoYSk7cmV0dXJuIGMuY2FsbChkLGIpfSxpYz1mdW5jdGlvbihhLApiKXtpZihhLlgpcmV0dXJuITA7aWYoIUpiKXtpZighYilhOntiPVsid2luZG93IiwiZXZlbnQiXTtmb3IodmFyIGM9bCxkPTA7ZDxiLmxlbmd0aDtkKyspaWYoYz1jW2JbZF1dLG51bGw9PWMpe2I9bnVsbDticmVhayBhfWI9Y31kPWI7Yj1uZXcgRyhkLHRoaXMpO2M9ITA7aWYoISgwPmQua2V5Q29kZXx8dm9pZCAwIT1kLnJldHVyblZhbHVlKSl7YTp7dmFyIGU9ITE7aWYoMD09ZC5rZXlDb2RlKXRyeXtkLmtleUNvZGU9LTE7YnJlYWsgYX1jYXRjaChnKXtlPSEwfWlmKGV8fHZvaWQgMD09ZC5yZXR1cm5WYWx1ZSlkLnJldHVyblZhbHVlPSEwfWQ9W107Zm9yKGU9Yi5hO2U7ZT1lLnBhcmVudE5vZGUpZC5wdXNoKGUpO2E9YS50eXBlO2ZvcihlPWQubGVuZ3RoLTE7IWIuaCYmMDw9ZTtlLS0pe2IuYT1kW2VdO3ZhciBmPW1jKGRbZV0sYSwhMCxiKTtjPWMmJmZ9Zm9yKGU9MDshYi5oJiZlPGQubGVuZ3RoO2UrKyliLmE9ZFtlXSxmPW1jKGRbZV0sYSwhMSxiKSxjPWMmJmZ9cmV0dXJuIGN9cmV0dXJuIGxjKGEsCm5ldyBHKGIsdGhpcykpfSxmYz1mdW5jdGlvbihhKXthPWFbWWJdO3JldHVybiBhIGluc3RhbmNlb2YgVWI/YTpudWxsfSxuYz0iX19jbG9zdXJlX2V2ZW50c19mbl8iKygxRTkqTWF0aC5yYW5kb20oKT4+PjApLGNjPWZ1bmN0aW9uKGEpe3EoYSwiTGlzdGVuZXIgY2FuIG5vdCBiZSBudWxsLiIpO2lmKGlhKGEpKXJldHVybiBhO3EoYS5oYW5kbGVFdmVudCwiQW4gb2JqZWN0IGxpc3RlbmVyIG11c3QgaGF2ZSBoYW5kbGVFdmVudCBtZXRob2QuIik7YVtuY118fChhW25jXT1mdW5jdGlvbihiKXtyZXR1cm4gYS5oYW5kbGVFdmVudChiKX0pO3JldHVybiBhW25jXX07dmFyIG9jPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9e319O24ob2MsQyk7CnZhciBwYz1bXSxIPWZ1bmN0aW9uKGEsYixjLGQpe2ZhKGMpfHwoYyYmKHBjWzBdPWMudG9TdHJpbmcoKSksYz1wYyk7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWJjKGIsY1tlXSxkfHxhLmhhbmRsZUV2ZW50LCExLGEuYnx8YSk7aWYoIWYpYnJlYWs7YS5hW2Yua2V5XT1mfXJldHVybiBhfSxxYz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoZmEoYykpZm9yKHZhciBnPTA7ZzxjLmxlbmd0aDtnKyspcWMoYSxiLGNbZ10sZCxlLGYpO2Vsc2UgZD1kfHxhLmhhbmRsZUV2ZW50LGU9bShlKT8hIWUuY2FwdHVyZTohIWUsZj1mfHxhLmJ8fGEsZD1jYyhkKSxlPSEhZSxjPVFiKGIpP1hiKGIuaCxTdHJpbmcoYyksZCxlLGYpOmI/KGI9ZmMoYikpP1hiKGIsYyxkLGUsZik6bnVsbDpudWxsLGMmJihrYyhjKSxkZWxldGUgYS5hW2Mua2V5XSk7cmV0dXJuIGF9LHJjPWZ1bmN0aW9uKGEpe29hKGEuYSxmdW5jdGlvbihiLGMpe3RoaXMuYS5oYXNPd25Qcm9wZXJ0eShjKSYma2MoYil9LAphKTthLmE9e319O29jLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7b2MuaS51LmNhbGwodGhpcyk7cmModGhpcyl9O29jLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJFdmVudEhhbmRsZXIuaGFuZGxlRXZlbnQgbm90IGltcGxlbWVudGVkIik7fTt2YXIgST1mdW5jdGlvbigpe0MuY2FsbCh0aGlzKTt0aGlzLmg9bmV3IFViKHRoaXMpO3RoaXMuTWE9dGhpczt0aGlzLnBhPW51bGx9O24oSSxDKTtJLnByb3RvdHlwZVtQYl09ITA7SS5wcm90b3R5cGUucmE9ZnVuY3Rpb24oYSl7dGhpcy5wYT1hfTtJLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjLGQpe2pjKHRoaXMsYSxiLGMsZCl9Owp2YXIgdWM9ZnVuY3Rpb24oYSxiKXtzYyhhKTt2YXIgYz1hLnBhO2lmKGMpe3ZhciBkPVtdO2Zvcih2YXIgZT0xO2M7Yz1jLnBhKWQucHVzaChjKSxxKDFFMz4rK2UsImluZmluaXRlIGxvb3AiKX1hPWEuTWE7Yz1iLnR5cGV8fGI7InN0cmluZyI9PT10eXBlb2YgYj9iPW5ldyBFKGIsYSk6YiBpbnN0YW5jZW9mIEU/Yi50YXJnZXQ9Yi50YXJnZXR8fGE6KGU9YixiPW5ldyBFKGMsYSksdWEoYixlKSk7ZT0hMDtpZihkKWZvcih2YXIgZj1kLmxlbmd0aC0xOyFiLmgmJjA8PWY7Zi0tKXt2YXIgZz1iLmE9ZFtmXTtlPXRjKGcsYywhMCxiKSYmZX1iLmh8fChnPWIuYT1hLGU9dGMoZyxjLCEwLGIpJiZlLGIuaHx8KGU9dGMoZyxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLmgmJmY8ZC5sZW5ndGg7ZisrKWc9Yi5hPWRbZl0sZT10YyhnLGMsITEsYikmJmU7cmV0dXJuIGV9OwpJLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7SS5pLnUuY2FsbCh0aGlzKTtpZih0aGlzLmgpe3ZhciBhPXRoaXMuaCxiPTAsYztmb3IoYyBpbiBhLmEpe2Zvcih2YXIgZD1hLmFbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixUYihkW2VdKTtkZWxldGUgYS5hW2NdO2EuYi0tfX10aGlzLnBhPW51bGx9O3ZhciBkYz1mdW5jdGlvbihhLGIsYyxkLGUpe3NjKGEpO3JldHVybiBhLmguYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LHRjPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5oLmFbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGc9YltmXTtpZihnJiYhZy5YJiZnLmNhcHR1cmU9PWMpe3ZhciBrPWcubGlzdGVuZXIscD1nLm1hfHxnLnNyYztnLmhhJiZXYihhLmgsZyk7ZT0hMSE9PWsuY2FsbChwLGQpJiZlfX1yZXR1cm4gZSYmMCE9ZC5LYX0sc2M9ZnVuY3Rpb24oYSl7cShhLmgsIkV2ZW50IHRhcmdldCBpcyBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgY2FsbCB0aGUgc3VwZXJjbGFzcyAoZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpIGNvbnN0cnVjdG9yPyIpfTt2YXIgeGM9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKHkmJiFBKCI1MjUiKSlyZXR1cm4hMDtpZih6JiZlKXJldHVybiB2YyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZigheCl7Im51bWJlciI9PT10eXBlb2YgYiYmKGI9d2MoYikpO3ZhciBnPTE3PT1ifHwxOD09Ynx8eiYmOTE9PWI7aWYoKCFjfHx6KSYmZ3x8eiYmMTY9PWImJihkfHxmKSlyZXR1cm4hMX1pZigoeXx8YmIpJiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1pZih2JiZkJiZiPT1hKXJldHVybiExO3N3aXRjaChhKXtjYXNlIDEzOnJldHVybiB4P2Z8fGU/ITE6IShjJiZkKTohMDtjYXNlIDI3OnJldHVybiEoeXx8YmJ8fHgpfXJldHVybiB4JiYoZHx8ZXx8Zik/ITE6dmMoYSl9LHZjPWZ1bmN0aW9uKGEpe2lmKDQ4PD1hJiY1Nz49YXx8Cjk2PD1hJiYxMDY+PWF8fDY1PD1hJiY5MD49YXx8KHl8fGJiKSYmMD09YSlyZXR1cm4hMDtzd2l0Y2goYSl7Y2FzZSAzMjpjYXNlIDQzOmNhc2UgNjM6Y2FzZSA2NDpjYXNlIDEwNzpjYXNlIDEwOTpjYXNlIDExMDpjYXNlIDExMTpjYXNlIDE4NjpjYXNlIDU5OmNhc2UgMTg5OmNhc2UgMTg3OmNhc2UgNjE6Y2FzZSAxODg6Y2FzZSAxOTA6Y2FzZSAxOTE6Y2FzZSAxOTI6Y2FzZSAyMjI6Y2FzZSAyMTk6Y2FzZSAyMjA6Y2FzZSAyMjE6Y2FzZSAxNjM6Y2FzZSA1ODpyZXR1cm4hMDtjYXNlIDE3MzpyZXR1cm4geDtkZWZhdWx0OnJldHVybiExfX0sd2M9ZnVuY3Rpb24oYSl7aWYoeClhPXljKGEpO2Vsc2UgaWYoeiYmeSlzd2l0Y2goYSl7Y2FzZSA5MzphPTkxfXJldHVybiBhfSx5Yz1mdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSA2MTpyZXR1cm4gMTg3O2Nhc2UgNTk6cmV0dXJuIDE4NjtjYXNlIDE3MzpyZXR1cm4gMTg5O2Nhc2UgMjI0OnJldHVybiA5MTtjYXNlIDA6cmV0dXJuIDIyNDsKZGVmYXVsdDpyZXR1cm4gYX19O3ZhciBKPWZ1bmN0aW9uKGEsYil7SS5jYWxsKHRoaXMpO2EmJnpjKHRoaXMsYSxiKX07bihKLEkpO2g9Si5wcm90b3R5cGU7aC5TPW51bGw7aC5uYT1udWxsO2guQ2E9bnVsbDtoLm9hPW51bGw7aC53PS0xO2guRj0tMTtoLnVhPSExOwp2YXIgQWM9ezM6MTMsMTI6MTQ0LDYzMjMyOjM4LDYzMjMzOjQwLDYzMjM0OjM3LDYzMjM1OjM5LDYzMjM2OjExMiw2MzIzNzoxMTMsNjMyMzg6MTE0LDYzMjM5OjExNSw2MzI0MDoxMTYsNjMyNDE6MTE3LDYzMjQyOjExOCw2MzI0MzoxMTksNjMyNDQ6MTIwLDYzMjQ1OjEyMSw2MzI0NjoxMjIsNjMyNDc6MTIzLDYzMjQ4OjQ0LDYzMjcyOjQ2LDYzMjczOjM2LDYzMjc1OjM1LDYzMjc2OjMzLDYzMjc3OjM0LDYzMjg5OjE0NCw2MzMwMjo0NX0sQmM9e1VwOjM4LERvd246NDAsTGVmdDozNyxSaWdodDozOSxFbnRlcjoxMyxGMToxMTIsRjI6MTEzLEYzOjExNCxGNDoxMTUsRjU6MTE2LEY2OjExNyxGNzoxMTgsRjg6MTE5LEY5OjEyMCxGMTA6MTIxLEYxMToxMjIsRjEyOjEyMywiVSswMDdGIjo0NixIb21lOjM2LEVuZDozNSxQYWdlVXA6MzMsUGFnZURvd246MzQsSW5zZXJ0OjQ1fSxDYz0heXx8QSgiNTI1IiksRGM9eiYmeDsKSi5wcm90b3R5cGUuYT1mdW5jdGlvbihhKXtpZih5fHxiYilpZigxNz09dGhpcy53JiYhYS5jdHJsS2V5fHwxOD09dGhpcy53JiYhYS5hbHRLZXl8fHomJjkxPT10aGlzLncmJiFhLm1ldGFLZXkpdGhpcy5GPXRoaXMudz0tMTstMT09dGhpcy53JiYoYS5jdHJsS2V5JiYxNyE9YS5jP3RoaXMudz0xNzphLmFsdEtleSYmMTghPWEuYz90aGlzLnc9MTg6YS5tZXRhS2V5JiY5MSE9YS5jJiYodGhpcy53PTkxKSk7Q2MmJiF4YyhhLmMsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGEuYWx0S2V5LGEubWV0YUtleSk/dGhpcy5oYW5kbGVFdmVudChhKToodGhpcy5GPXdjKGEuYyksRGMmJih0aGlzLnVhPWEuYWx0S2V5KSl9O0oucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dGhpcy5GPXRoaXMudz0tMTt0aGlzLnVhPWEuYWx0S2V5fTsKSi5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5iLGM9Yi5hbHRLZXk7aWYodiYmImtleXByZXNzIj09YS50eXBlKXt2YXIgZD10aGlzLkY7dmFyIGU9MTMhPWQmJjI3IT1kP2Iua2V5Q29kZTowfWVsc2UoeXx8YmIpJiYia2V5cHJlc3MiPT1hLnR5cGU/KGQ9dGhpcy5GLGU9MDw9Yi5jaGFyQ29kZSYmNjMyMzI+Yi5jaGFyQ29kZSYmdmMoZCk/Yi5jaGFyQ29kZTowKTphYiYmIXk/KGQ9dGhpcy5GLGU9dmMoZCk/Yi5rZXlDb2RlOjApOigia2V5cHJlc3MiPT1hLnR5cGU/KERjJiYoYz10aGlzLnVhKSxiLmtleUNvZGU9PWIuY2hhckNvZGU/MzI+Yi5rZXlDb2RlPyhkPWIua2V5Q29kZSxlPTApOihkPXRoaXMuRixlPWIuY2hhckNvZGUpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkseiYmNjM9PWUmJjIyND09ZCYmKGQ9MTkxKSk7dmFyIGY9ZD13YyhkKTtkPzYzMjMyPD0KZCYmZCBpbiBBYz9mPUFjW2RdOjI1PT1kJiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBCYyYmKGY9QmNbYi5rZXlJZGVudGlmaWVyXSk7eCYmQ2MmJiJrZXlwcmVzcyI9PWEudHlwZSYmIXhjKGYsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KXx8KGE9Zj09dGhpcy53LHRoaXMudz1mLGI9bmV3IEVjKGYsZSxhLGIpLGIuYWx0S2V5PWMsdWModGhpcyxiKSl9O0oucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTsKdmFyIHpjPWZ1bmN0aW9uKGEsYixjKXthLm9hJiZGYyhhKTthLlM9YjthLm5hPWJjKGEuUywia2V5cHJlc3MiLGEsYyk7YS5DYT1iYyhhLlMsImtleWRvd24iLGEuYSxjLGEpO2Eub2E9YmMoYS5TLCJrZXl1cCIsYS5iLGMsYSl9LEZjPWZ1bmN0aW9uKGEpe2EubmEmJihrYyhhLm5hKSxrYyhhLkNhKSxrYyhhLm9hKSxhLm5hPW51bGwsYS5DYT1udWxsLGEub2E9bnVsbCk7YS5TPW51bGw7YS53PS0xO2EuRj0tMX07Si5wcm90b3R5cGUudT1mdW5jdGlvbigpe0ouaS51LmNhbGwodGhpcyk7RmModGhpcyl9O3ZhciBFYz1mdW5jdGlvbihhLGIsYyxkKXtHLmNhbGwodGhpcyxkKTt0aGlzLnR5cGU9ImtleSI7dGhpcy5jPWE7dGhpcy5yZXBlYXQ9Y307bihFYyxHKTt2YXIgR2M9eD8iTW96VXNlclNlbGVjdCI6eXx8YmI/IldlYmtpdFVzZXJTZWxlY3QiOm51bGwsSGM9ZnVuY3Rpb24oYSxiKXtiPWI/bnVsbDphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7aWYoR2Mpe3ZhciBjPSJub25lIjthLnN0eWxlJiYoYS5zdHlsZVtHY109Yyk7aWYoYil7YT0wO2Zvcih2YXIgZDtkPWJbYV07YSsrKWQuc3R5bGUmJihkLnN0eWxlW0djXT1jKX19ZWxzZSBpZih2fHxhYilpZihjPSJvbiIsYS5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyksYilmb3IoYT0wO2Q9YlthXTthKyspZC5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyl9O3ZhciBJYz1mdW5jdGlvbigpe307ZGEoSWMpO0ljLnByb3RvdHlwZS5hPTA7dmFyIEs9ZnVuY3Rpb24oYSl7SS5jYWxsKHRoaXMpO3RoaXMuaj1hfHx4YXx8KHhhPW5ldyB1Yik7dGhpcy5xYT1KYzt0aGlzLlk9bnVsbDt0aGlzLm09ITE7dGhpcy5hPW51bGw7dGhpcy5BPXZvaWQgMDt0aGlzLmc9dGhpcy5jPXRoaXMuYj1udWxsO3RoaXMuR2E9ITF9O24oSyxJKTtLLnByb3RvdHlwZS5PYT1JYy5SKCk7CnZhciBKYz1udWxsLEtjPWZ1bmN0aW9uKGEsYil7c3dpdGNoKGEpe2Nhc2UgMTpyZXR1cm4gYj8iZGlzYWJsZSI6ImVuYWJsZSI7Y2FzZSAyOnJldHVybiBiPyJoaWdobGlnaHQiOiJ1bmhpZ2hsaWdodCI7Y2FzZSA0OnJldHVybiBiPyJhY3RpdmF0ZSI6ImRlYWN0aXZhdGUiO2Nhc2UgODpyZXR1cm4gYj8ic2VsZWN0IjoidW5zZWxlY3QiO2Nhc2UgMTY6cmV0dXJuIGI/ImNoZWNrIjoidW5jaGVjayI7Y2FzZSAzMjpyZXR1cm4gYj8iZm9jdXMiOiJibHVyIjtjYXNlIDY0OnJldHVybiBiPyJvcGVuIjoiY2xvc2UifXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBzdGF0ZSIpO30sTGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuWXx8KGEuWT0iOiIrKGEuT2EuYSsrKS50b1N0cmluZygzNikpfSxNYz1mdW5jdGlvbihhLGIpe2lmKGEuYiYmYS5iLmcpe3ZhciBjPWEuYi5nLGQ9YS5ZO2QgaW4gYyYmZGVsZXRlIGNbZF07cWEoYS5iLmcsYixhKX1hLlk9Yn07Sy5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9Owp2YXIgTmM9ZnVuY3Rpb24oYSl7YT1hLmE7cShhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cmV0dXJuIGF9LE9jPWZ1bmN0aW9uKGEpe2EuQXx8KGEuQT1uZXcgb2MoYSkpO3JldHVybiBxKGEuQSl9O0sucHJvdG90eXBlLnJhPWZ1bmN0aW9uKGEpe2lmKHRoaXMuYiYmdGhpcy5iIT1hKXRocm93IEVycm9yKCJNZXRob2Qgbm90IHN1cHBvcnRlZCIpO0suaS5yYS5jYWxsKHRoaXMsYSl9O0sucHJvdG90eXBlLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPW5iKHRoaXMuai5hLCJESVYiKX07CnZhciBQYz1mdW5jdGlvbihhLGIpe2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiJiZhLnhhKGIpKXthLkdhPSEwO3ZhciBjPXFiKGIpO2EuaiYmYS5qLmE9PWN8fChhLmo9Yj9uZXcgdWIocWIoYikpOnhhfHwoeGE9bmV3IHViKSk7YS52YShiKTthLkQoKX1lbHNlIHRocm93IEVycm9yKCJJbnZhbGlkIGVsZW1lbnQgdG8gZGVjb3JhdGUiKTt9O2g9Sy5wcm90b3R5cGU7aC54YT1mdW5jdGlvbigpe3JldHVybiEwfTtoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hfTtoLkQ9ZnVuY3Rpb24oKXt0aGlzLm09ITA7UWModGhpcyxmdW5jdGlvbihhKXshYS5tJiZhLmYoKSYmYS5EKCl9KX07aC5QPWZ1bmN0aW9uKCl7UWModGhpcyxmdW5jdGlvbihhKXthLm0mJmEuUCgpfSk7dGhpcy5BJiZyYyh0aGlzLkEpO3RoaXMubT0hMX07CmgudT1mdW5jdGlvbigpe3RoaXMubSYmdGhpcy5QKCk7dGhpcy5BJiYodGhpcy5BLk4oKSxkZWxldGUgdGhpcy5BKTtRYyh0aGlzLGZ1bmN0aW9uKGEpe2EuTigpfSk7IXRoaXMuR2EmJnRoaXMuYSYmb2IodGhpcy5hKTt0aGlzLmI9dGhpcy5hPXRoaXMuZz10aGlzLmM9bnVsbDtLLmkudS5jYWxsKHRoaXMpfTtoLnNhPWZ1bmN0aW9uKGEsYil7dGhpcy50YShhLFJjKHRoaXMpLGIpfTsKaC50YT1mdW5jdGlvbihhLGIsYyl7cSghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLm0mJihjfHwhdGhpcy5tKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZigwPmJ8fGI+UmModGhpcykpdGhyb3cgRXJyb3IoIkNoaWxkIGNvbXBvbmVudCBpbmRleCBvdXQgb2YgYm91bmRzIik7dGhpcy5nJiZ0aGlzLmN8fCh0aGlzLmc9e30sdGhpcy5jPVtdKTtpZihhLmI9PXRoaXMpe3ZhciBkPUxjKGEpO3RoaXMuZ1tkXT1hO0hhKHRoaXMuYyxhKX1lbHNlIHFhKHRoaXMuZyxMYyhhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuYiYmYS5ZKXt2YXIgZT1hLmI7ZD1hLlk7ZS5nJiZkPyhlPWUuZyxkPShudWxsIT09ZSYmZCBpbiBlP2VbZF06dm9pZCAwKXx8bnVsbCk6ZD1udWxsfWlmKGQmJmEuYiE9dGhpcyl0aHJvdyBFcnJvcigiVW5hYmxlIHRvIHNldCBwYXJlbnQgY29tcG9uZW50Iik7CmEuYj10aGlzO0suaS5yYS5jYWxsKGEsdGhpcyk7TGEodGhpcy5jLGIsMCxhKTtpZihhLm0mJnRoaXMubSYmYS5iPT10aGlzKWM9dGhpcy5qYSgpLGI9Yy5jaGlsZE5vZGVzW2JdfHxudWxsLGIhPWEuZigpJiZjLmluc2VydEJlZm9yZShhLmYoKSxiKTtlbHNlIGlmKGMpe3RoaXMuYXx8dGhpcy5pYSgpO2M9TCh0aGlzLGIrMSk7Yj10aGlzLmphKCk7Yz1jP2MuYTpudWxsO2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTthLmF8fGEuaWEoKTtiP2IuaW5zZXJ0QmVmb3JlKGEuYSxjfHxudWxsKTphLmouYS5ib2R5LmFwcGVuZENoaWxkKGEuYSk7YS5iJiYhYS5iLm18fGEuRCgpfWVsc2UgdGhpcy5tJiYhYS5tJiZhLmEmJmEuYS5wYXJlbnROb2RlJiYxPT1hLmEucGFyZW50Tm9kZS5ub2RlVHlwZSYmYS5EKCl9O2guamE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hfTsKdmFyIFNjPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEucWEpe3ZhciBiPWEubT9hLmE6YS5qLmEuYm9keTthOnt2YXIgYz1xYihiKTtpZihjLmRlZmF1bHRWaWV3JiZjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihjPWMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpKSl7Yz1jLmRpcmVjdGlvbnx8Yy5nZXRQcm9wZXJ0eVZhbHVlKCJkaXJlY3Rpb24iKXx8IiI7YnJlYWsgYX1jPSIifWEucWE9InJ0bCI9PShjfHwoYi5jdXJyZW50U3R5bGU/Yi5jdXJyZW50U3R5bGUuZGlyZWN0aW9uOm51bGwpfHxiLnN0eWxlJiZiLnN0eWxlLmRpcmVjdGlvbil9cmV0dXJuIGEucWF9LFJjPWZ1bmN0aW9uKGEpe3JldHVybiBhLmM/YS5jLmxlbmd0aDowfSxMPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuYz9hLmNbYl18fG51bGw6bnVsbH0sUWM9ZnVuY3Rpb24oYSxiLGMpe2EuYyYmcihhLmMsYixjKX0sVGM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jJiZiP0RhKGEuYyxiKTotMX07dmFyIFZjPWZ1bmN0aW9uKGEsYil7aWYoIWEpdGhyb3cgRXJyb3IoIkludmFsaWQgY2xhc3MgbmFtZSAiK2EpO2lmKCFpYShiKSl0aHJvdyBFcnJvcigiSW52YWxpZCBkZWNvcmF0b3IgZnVuY3Rpb24gIitiKTtVY1thXT1ifSxXYz17fSxVYz17fTt2YXIgWGM9ZnVuY3Rpb24oYSl7dGhpcy5oPWF9O2RhKFhjKTt2YXIgWWM9ZnVuY3Rpb24oYSxiKXthJiYoYS50YWJJbmRleD1iPzA6LTEpfSwkYz1mdW5jdGlvbihhLGIsYyl7Yy5pZCYmTWMoYixjLmlkKTt2YXIgZD1hLmIoKSxlPSExLGY9RChjKTtmJiZyKGYsZnVuY3Rpb24oZyl7Zz09ZD9lPSEwOmcmJnRoaXMuZyhiLGcsZCl9LGEpO2V8fEViKGMsZCk7WmMoYixjKTtyZXR1cm4gY307WGMucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiLGMpe2I9PWMrIi1kaXNhYmxlZCI/YS5aKCExKTpiPT1jKyItaG9yaXpvbnRhbCI/YWQoYSwiaG9yaXpvbnRhbCIpOmI9PWMrIi12ZXJ0aWNhbCImJmFkKGEsInZlcnRpY2FsIil9Owp2YXIgWmM9ZnVuY3Rpb24oYSxiKXtpZihiKWZvcih2YXIgYz1iLmZpcnN0Q2hpbGQsZDtjJiZjLnBhcmVudE5vZGU9PWI7KXtkPWMubmV4dFNpYmxpbmc7aWYoMT09Yy5ub2RlVHlwZSl7YTp7dmFyIGU9YztxKGUpO2U9RChlKTtmb3IodmFyIGY9MCxnPWUubGVuZ3RoO2Y8ZztmKyspe3ZhciBrPWVbZl07aWYoaz1rIGluIFVjP1VjW2tdKCk6bnVsbCl7ZT1rO2JyZWFrIGF9fWU9bnVsbH1lJiYoZS5hPWMsYS5pc0VuYWJsZWQoKXx8ZS5aKCExKSxhLnNhKGUpLFBjKGUsYykpfWVsc2UgYy5ub2RlVmFsdWUmJiIiIT1NYShjLm5vZGVWYWx1ZSl8fGIucmVtb3ZlQ2hpbGQoYyk7Yz1kfX0sYmQ9ZnVuY3Rpb24oYSxiKXtiPWIuZigpO3EoYiwiVGhlIGNvbnRhaW5lciBET00gZWxlbWVudCBjYW5ub3QgYmUgbnVsbC4iKTtIYyhiLHgpO3YmJihiLmhpZGVGb2N1cz0hMCk7KGE9YS5oKSYmdmIoYixhKX07WGMucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKWGMucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5iKCksYz1bYiwiaG9yaXpvbnRhbCI9PWEuSD9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgTT1mdW5jdGlvbigpe30sY2Q7ZGEoTSk7dmFyIGRkPXtidXR0b246InByZXNzZWQiLGNoZWNrYm94OiJjaGVja2VkIixtZW51aXRlbToic2VsZWN0ZWQiLG1lbnVpdGVtY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtcmFkaW86ImNoZWNrZWQiLHJhZGlvOiJjaGVja2VkIix0YWI6InNlbGVjdGVkIix0cmVlaXRlbToic2VsZWN0ZWQifTtNLnByb3RvdHlwZS5oPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLmouYigiRElWIixlZCh0aGlzLGEpLmpvaW4oIiAiKSxhLmJhKX07dmFyIGdkPWZ1bmN0aW9uKGEsYixjKXtpZihhPWEuZj9hLmYoKTphKXt2YXIgZD1bYl07diYmIUEoIjciKSYmKGQ9ZmQoRChhKSxiKSxkLnB1c2goYikpOyhjP0ZiOkhiKShhLGQpfX07Ck0ucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiKXtiLmlkJiZNYyhhLGIuaWQpO2ImJmIuZmlyc3RDaGlsZD9oZChhLGIuZmlyc3RDaGlsZC5uZXh0U2libGluZz9KYShiLmNoaWxkTm9kZXMpOmIuZmlyc3RDaGlsZCk6YS5iYT1udWxsO3ZhciBjPTAsZD10aGlzLmEoKSxlPXRoaXMuYSgpLGY9ITEsZz0hMSxrPSExLHA9SmEoRChiKSk7cihwLGZ1bmN0aW9uKEIpe2Z8fEIhPWQ/Z3x8QiE9ZT9jfD1pZCh0aGlzLEIpOmc9ITA6KGY9ITAsZT09ZCYmKGc9ITApKTsxPT1pZCh0aGlzLEIpJiYoQWEoYiksc2IoYikmJnRiKGIpJiZyYihiLCExKSl9LHRoaXMpO2Eubz1jO2Z8fChwLnB1c2goZCksZT09ZCYmKGc9ITApKTtnfHxwLnB1c2goZSk7KGE9YS53YSkmJnAucHVzaC5hcHBseShwLGEpO2lmKHYmJiFBKCI3Iikpe3ZhciB3PWZkKHApOzA8dy5sZW5ndGgmJihwLnB1c2guYXBwbHkocCx3KSxrPSEwKX1mJiZnJiYhYSYmIWt8fENiKGIscC5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIGpkPWZ1bmN0aW9uKGEsYil7aWYoYT1hLmgoKSl7cShiLCJUaGUgZWxlbWVudCBwYXNzZWQgYXMgYSBmaXJzdCBwYXJhbWV0ZXIgY2Fubm90IGJlIG51bGwuIik7dmFyIGM9Yi5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDthIT1jJiZ2YihiLGEpfX0sa2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYztpZihhLnYmMzImJihjPWEuZigpKSl7aWYoIWImJmEubyYzMil7dHJ5e2MuYmx1cigpfWNhdGNoKGQpe31hLm8mMzImJmEuRmEobnVsbCl9KHNiKGMpJiZ0YihjKSkhPWImJnJiKGMsYil9fSxsZD1mdW5jdGlvbihhLGIsYyl7Y2R8fChjZD17MToiZGlzYWJsZWQiLDg6InNlbGVjdGVkIiwxNjoiY2hlY2tlZCIsNjQ6ImV4cGFuZGVkIn0pO3EoYSwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO2I9Y2RbYl07dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDtkJiYoZD1kZFtkXXx8YixiPSJjaGVja2VkIj09Ynx8InNlbGVjdGVkIj09CmI/ZDpiKTtiJiZ4YihhLGIsYyl9O00ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250cm9sIn07CnZhciBlZD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuYSgpLGQ9W2NdLGU9YS5hKCk7ZSE9YyYmZC5wdXNoKGUpO2M9Yi5vO2ZvcihlPVtdO2M7KXt2YXIgZj1jJi1jO2UucHVzaChtZChhLGYpKTtjJj1+Zn1kLnB1c2guYXBwbHkoZCxlKTsoYT1iLndhKSYmZC5wdXNoLmFwcGx5KGQsYSk7diYmIUEoIjciKSYmZC5wdXNoLmFwcGx5KGQsZmQoZCkpO3JldHVybiBkfSxmZD1mdW5jdGlvbihhLGIpe3ZhciBjPVtdO2ImJihhPUlhKGEsW2JdKSk7cihbXSxmdW5jdGlvbihkKXshRmEoZCxsYShHYSxhKSl8fGImJiFHYShkLGIpfHxjLnB1c2goZC5qb2luKCJfIikpfSk7cmV0dXJuIGN9LG1kPWZ1bmN0aW9uKGEsYil7YS5ifHxuZChhKTtyZXR1cm4gYS5iW2JdfSxpZD1mdW5jdGlvbihhLGIpe2Euanx8KGEuYnx8bmQoYSksYS5qPXNhKGEuYikpO2E9cGFyc2VJbnQoYS5qW2JdLDEwKTtyZXR1cm4gaXNOYU4oYSk/MDphfSxuZD1mdW5jdGlvbihhKXt2YXIgYj1hLmEoKSxjPSF0KGIucmVwbGFjZSgvXHhhMHxccy9nLAoiICIpLCIgIik7cShjLCJDb250cm9sUmVuZGVyZXIgaGFzIGFuIGludmFsaWQgY3NzIGNsYXNzOiAnIitiKyInIik7YS5iPXsxOmIrIi1kaXNhYmxlZCIsMjpiKyItaG92ZXIiLDQ6YisiLWFjdGl2ZSIsODpiKyItc2VsZWN0ZWQiLDE2OmIrIi1jaGVja2VkIiwzMjpiKyItZm9jdXNlZCIsNjQ6YisiLW9wZW4ifX07dmFyIE49ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO2lmKCFiKXtiPXRoaXMuY29uc3RydWN0b3I7Zm9yKHZhciBkO2I7KXtkPWJbamFdfHwoYltqYV09KytrYSk7aWYoZD1XY1tkXSlicmVhaztiPWIuaT9iLmkuY29uc3RydWN0b3I6bnVsbH1iPWQ/aWEoZC5SKT9kLlIoKTpuZXcgZDpudWxsfXRoaXMuQj1iO3RoaXMuYmE9dm9pZCAwIT09YT9hOm51bGx9O24oTixLKTtoPU4ucHJvdG90eXBlO2guYmE9bnVsbDtoLm89MDtoLnY9Mzk7aC5LPTA7aC5JYT0hMDtoLndhPW51bGw7aC55YT0hMDtoLmlhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CLmModGhpcyk7dGhpcy5hPWE7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmeGIoYSwiaGlkZGVuIiwhMCkpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hPXRoaXMuQi5nKHRoaXMsYSk7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5JYT0ibm9uZSIhPWEuc3R5bGUuZGlzcGxheX07CmguRD1mdW5jdGlvbigpe04uaS5ELmNhbGwodGhpcyk7dmFyIGE9TmModGhpcyk7cSh0aGlzKTtxKGEpO3RoaXMuaXNWaXNpYmxlKCl8fHhiKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fGxkKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy52JjgmJmxkKGEsOCwhISh0aGlzLm8mOCkpO3RoaXMudiYxNiYmbGQoYSwxNiwhISh0aGlzLm8mMTYpKTt0aGlzLnYmNjQmJmxkKGEsNjQsISEodGhpcy5vJjY0KSk7YT10aGlzLkI7U2ModGhpcykmJmdkKHRoaXMuZigpLGEuYSgpKyItcnRsIiwhMCk7dGhpcy5pc0VuYWJsZWQoKSYma2QodGhpcyx0aGlzLmlzVmlzaWJsZSgpKTtpZih0aGlzLnYmLTImJih0aGlzLnlhJiZvZCh0aGlzLCEwKSx0aGlzLnYmMzImJihhPXRoaXMuZigpKSkpe3ZhciBiPXRoaXMuV3x8KHRoaXMuVz1uZXcgSik7emMoYixhKTtIKEgoSChPYyh0aGlzKSxiLCJrZXkiLHRoaXMuZmEpLGEsImZvY3VzIix0aGlzLk5hKSxhLCJibHVyIiwKdGhpcy5GYSl9fTt2YXIgb2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYz1PYyhhKSxkPWEuZigpO2I/KEgoSChIKEgoYyxkLEYuTCxhLmthKSxkLFtGLk0sRi5hYV0sYS5sYSksZCwibW91c2VvdmVyIixhLkFhKSxkLCJtb3VzZW91dCIsYS56YSksYS5lYSE9Y2EmJkgoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fEgoYyxkLCJkYmxjbGljayIsYS5KYSksYS5nYXx8KGEuZ2E9bmV3IHBkKGEpLHpiKGEsbGEoQWIsYS5nYSkpKSkpOihxYyhxYyhxYyhxYyhjLGQsRi5MLGEua2EpLGQsW0YuTSxGLmFhXSxhLmxhKSxkLCJtb3VzZW92ZXIiLGEuQWEpLGQsIm1vdXNlb3V0IixhLnphKSxhLmVhIT1jYSYmcWMoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fHFjKGMsZCwiZGJsY2xpY2siLGEuSmEpLEFiKGEuZ2EpLGEuZ2E9bnVsbCkpfTsKTi5wcm90b3R5cGUuUD1mdW5jdGlvbigpe04uaS5QLmNhbGwodGhpcyk7dGhpcy5XJiZGYyh0aGlzLlcpO3RoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJmtkKHRoaXMsITEpfTtOLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7Ti5pLnUuY2FsbCh0aGlzKTt0aGlzLlcmJih0aGlzLlcuTigpLGRlbGV0ZSB0aGlzLlcpO2RlbGV0ZSB0aGlzLkI7dGhpcy5nYT10aGlzLndhPXRoaXMuYmE9bnVsbH07dmFyIGhkPWZ1bmN0aW9uKGEsYil7YS5iYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm8mMSl9OwpOLnByb3RvdHlwZS5aPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYjtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0VuYWJsZWQmJiFiLmlzRW5hYmxlZCgpfHwhTyh0aGlzLDEsIWEpfHwoYXx8KHFkKHRoaXMsITEpLFAodGhpcywhMSkpLHRoaXMuaXNWaXNpYmxlKCkmJmtkKHRoaXMsYSksUSh0aGlzLDEsIWEsITApKX07CnZhciBQPWZ1bmN0aW9uKGEsYil7TyhhLDIsYikmJlEoYSwyLGIpfSxxZD1mdW5jdGlvbihhLGIpe08oYSw0LGIpJiZRKGEsNCxiKX0scmQ9ZnVuY3Rpb24oYSxiKXtPKGEsOCxiKSYmUShhLDgsYil9LHNkPWZ1bmN0aW9uKGEsYil7TyhhLDY0LGIpJiZRKGEsNjQsYil9LFE9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIWQmJjE9PWIpYS5aKCFjKTtlbHNlIGlmKGEudiZiJiZjIT0hIShhLm8mYikpe3ZhciBlPWEuQjtpZihkPWEuZigpKShlPW1kKGUsYikpJiZnZChhLGUsYyksbGQoZCxiLGMpO2Eubz1jP2Eub3xiOmEubyZ+Yn19LHRkPWZ1bmN0aW9uKGEsYixjKXtpZihhLm0mJmEubyZiJiYhYyl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTshYyYmYS5vJmImJlEoYSxiLCExKTthLnY9Yz9hLnZ8YjphLnYmfmJ9LFI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hISgyNTUmYikmJiEhKGEudiZiKX0sTz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuISEoYS52JmIpJiYhIShhLm8mCmIpIT1jJiYoIShhLksmYil8fHVjKGEsS2MoYixjKSkpJiYhYS5VfTtoPU4ucHJvdG90eXBlO2guQWE9ZnVuY3Rpb24oYSl7KCFhLnJlbGF0ZWRUYXJnZXR8fCFwYih0aGlzLmYoKSxhLnJlbGF0ZWRUYXJnZXQpKSYmdWModGhpcywiZW50ZXIiKSYmdGhpcy5pc0VuYWJsZWQoKSYmUih0aGlzLDIpJiZQKHRoaXMsITApfTtoLnphPWZ1bmN0aW9uKGEpe2EucmVsYXRlZFRhcmdldCYmcGIodGhpcy5mKCksYS5yZWxhdGVkVGFyZ2V0KXx8IXVjKHRoaXMsImxlYXZlIil8fChSKHRoaXMsNCkmJnFkKHRoaXMsITEpLFIodGhpcywyKSYmUCh0aGlzLCExKSl9O2guZWE9Y2E7Cmgua2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSxPYihhKSYmISh5JiZ6JiZhLmN0cmxLZXkpKSl7Uih0aGlzLDQpJiZxZCh0aGlzLCEwKTt2YXIgYjtpZihiPXRoaXMuQil7dmFyIGM7Yj10aGlzLnYmMzImJihjPXRoaXMuZigpKT9zYihjKSYmdGIoYyk6ITF9YiYmdGhpcy5mKCkuZm9jdXMoKX0hT2IoYSl8fHkmJnomJmEuY3RybEtleXx8YS5nKCl9O2gubGE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSx0aGlzLm8mNCYmdWQodGhpcyxhKSYmUih0aGlzLDQpJiZxZCh0aGlzLCExKSl9O2guSmE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmdWQodGhpcyxhKX07CnZhciB1ZD1mdW5jdGlvbihhLGIpe2lmKFIoYSwxNikpe3ZhciBjPSEoYS5vJjE2KTtPKGEsMTYsYykmJlEoYSwxNixjKX1SKGEsOCkmJnJkKGEsITApO1IoYSw2NCkmJnNkKGEsIShhLm8mNjQpKTtjPW5ldyBFKCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuQT1iLkEpO3JldHVybiB1YyhhLGMpfTtOLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe1IodGhpcywzMikmJk8odGhpcywzMiwhMCkmJlEodGhpcywzMiwhMCl9O04ucHJvdG90eXBlLkZhPWZ1bmN0aW9uKCl7Uih0aGlzLDQpJiZxZCh0aGlzLCExKTtSKHRoaXMsMzIpJiZPKHRoaXMsMzIsITEpJiZRKHRoaXMsMzIsITEpfTsKTi5wcm90b3R5cGUuZmE9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJjEzPT1hLmMmJnVkKHRoaXMsYSk/KGEuZygpLGEuaigpLCEwKTohMX07aWYoIWlhKE4pKXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBjbGFzcyAiK04pO2lmKCFpYShNKSl0aHJvdyBFcnJvcigiSW52YWxpZCByZW5kZXJlciBjbGFzcyAiK00pO3ZhciB2ZD1OW2phXXx8KE5bamFdPSsra2EpO1djW3ZkXT1NO1ZjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIHBkPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9ITE7dGhpcy5jPW5ldyBvYyh0aGlzKTt6Yih0aGlzLGxhKEFiLHRoaXMuYykpO2E9TmModGhpcy5iKTtIKEgoSCh0aGlzLmMsYSxGLkwsdGhpcy5oKSxhLEYuTSx0aGlzLmopLGEsImNsaWNrIix0aGlzLmcpfTtuKHBkLEMpO3ZhciB3ZD0hdnx8OTw9TnVtYmVyKGliKTsKcGQucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXt0aGlzLmE9ITF9O3BkLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7dGhpcy5hPSEwfTt2YXIgeGQ9ZnVuY3Rpb24oYSxiKXtpZighd2QpcmV0dXJuIGEuYnV0dG9uPTAsYS50eXBlPWIsYTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudHMiKTtjLmluaXRNb3VzZUV2ZW50KGIsYS5idWJibGVzLGEuY2FuY2VsYWJsZSxhLnZpZXd8fG51bGwsYS5kZXRhaWwsYS5zY3JlZW5YLGEuc2NyZWVuWSxhLmNsaWVudFgsYS5jbGllbnRZLGEuY3RybEtleSxhLmFsdEtleSxhLnNoaWZ0S2V5LGEubWV0YUtleSwwLGEucmVsYXRlZFRhcmdldHx8bnVsbCk7cmV0dXJuIGN9OwpwZC5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXtpZih0aGlzLmEpdGhpcy5hPSExO2Vsc2V7dmFyIGI9YS5iLGM9Yi5idXR0b24sZD1iLnR5cGUsZT14ZChiLCJtb3VzZWRvd24iKTt0aGlzLmIua2EobmV3IEcoZSxhLmEpKTtlPXhkKGIsIm1vdXNldXAiKTt0aGlzLmIubGEobmV3IEcoZSxhLmEpKTt3ZHx8KGIuYnV0dG9uPWMsYi50eXBlPWQpfX07cGQucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt0aGlzLmI9bnVsbDtwZC5pLnUuY2FsbCh0aGlzKX07dmFyIFM9ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO3RoaXMuZGE9Ynx8WGMuUigpO3RoaXMuSD1hfHwidmVydGljYWwifTtuKFMsSyk7aD1TLnByb3RvdHlwZTtoLkRhPW51bGw7aC5jYT1udWxsO2guZGE9bnVsbDtoLkg9bnVsbDtoLlQ9ITA7aC5PPSEwO2gubD0tMTtoLnM9bnVsbDtoLlY9ITE7aC5JPW51bGw7dmFyIHlkPWZ1bmN0aW9uKGEpe3JldHVybiBhLkRhfHxhLmYoKX07aD1TLnByb3RvdHlwZTtoLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPXRoaXMuai5iKCJESVYiLHRoaXMuZGEuYyh0aGlzKS5qb2luKCIgIikpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKGEpe3JldHVybiJESVYiPT1hLnRhZ05hbWV9O2gudmE9ZnVuY3Rpb24oYSl7dGhpcy5hPSRjKHRoaXMuZGEsdGhpcyxhKTsibm9uZSI9PWEuc3R5bGUuZGlzcGxheSYmKHRoaXMuVD0hMSl9OwpoLkQ9ZnVuY3Rpb24oKXtTLmkuRC5jYWxsKHRoaXMpO1FjKHRoaXMsZnVuY3Rpb24oYil7Yi5tJiZ6ZCh0aGlzLGIpfSx0aGlzKTt2YXIgYT10aGlzLmYoKTtiZCh0aGlzLmRhLHRoaXMpO0FkKHRoaXMsdGhpcy5UKTtIKEgoSChIKEgoSChIKEgoT2ModGhpcyksdGhpcywiZW50ZXIiLHRoaXMuV2EpLHRoaXMsImhpZ2hsaWdodCIsdGhpcy5YYSksdGhpcywidW5oaWdobGlnaHQiLHRoaXMuY2IpLHRoaXMsIm9wZW4iLHRoaXMuWWEpLHRoaXMsImNsb3NlIix0aGlzLlVhKSxhLEYuTCx0aGlzLlNhKSxxYihhKSxbRi5NLEYuYWFdLHRoaXMuVmEpLGEsW0YuTCxGLk0sRi5hYSwibW91c2VvdmVyIiwibW91c2VvdXQiLCJjb250ZXh0bWVudSJdLHRoaXMuVGEpO0JkKHRoaXMpfTt2YXIgQmQ9ZnVuY3Rpb24oYSl7dmFyIGI9T2MoYSksYz15ZChhKTtIKEgoSChiLGMsImZvY3VzIixhLkhhKSxjLCJibHVyIixhLlFhKSxhLmNhfHwoYS5jYT1uZXcgSih5ZChhKSkpLCJrZXkiLGEuUmEpfTtoPVMucHJvdG90eXBlOwpoLlA9ZnVuY3Rpb24oKXtDZCh0aGlzLC0xKTt0aGlzLnMmJnNkKHRoaXMucywhMSk7dGhpcy5WPSExO1MuaS5QLmNhbGwodGhpcyl9O2gudT1mdW5jdGlvbigpe1MuaS51LmNhbGwodGhpcyk7dGhpcy5jYSYmKHRoaXMuY2EuTigpLHRoaXMuY2E9bnVsbCk7dGhpcy5kYT10aGlzLnM9dGhpcy5JPXRoaXMuRGE9bnVsbH07aC5XYT1mdW5jdGlvbigpe3JldHVybiEwfTsKaC5YYT1mdW5jdGlvbihhKXt2YXIgYj1UYyh0aGlzLGEudGFyZ2V0KTtpZigtMTxiJiZiIT10aGlzLmwpe3ZhciBjPUwodGhpcyx0aGlzLmwpO2MmJlAoYywhMSk7dGhpcy5sPWI7Yz1MKHRoaXMsdGhpcy5sKTt0aGlzLlYmJnFkKGMsITApO3RoaXMucyYmYyE9dGhpcy5zJiYoYy52JjY0P3NkKGMsITApOnNkKHRoaXMucywhMSkpfWI9dGhpcy5mKCk7cShiLCJUaGUgRE9NIGVsZW1lbnQgZm9yIHRoZSBjb250YWluZXIgY2Fubm90IGJlIG51bGwuIik7bnVsbCE9YS50YXJnZXQuZigpJiZ4YihiLCJhY3RpdmVkZXNjZW5kYW50IixhLnRhcmdldC5mKCkuaWQpfTtoLmNiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT1MKHRoaXMsdGhpcy5sKSYmKHRoaXMubD0tMSk7YT10aGlzLmYoKTtxKGEsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnJlbW92ZUF0dHJpYnV0ZSh3YigiYWN0aXZlZGVzY2VuZGFudCIpKX07CmguWWE9ZnVuY3Rpb24oYSl7KGE9YS50YXJnZXQpJiZhIT10aGlzLnMmJmEuYj09dGhpcyYmKHRoaXMucyYmc2QodGhpcy5zLCExKSx0aGlzLnM9YSl9O2guVWE9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMucyYmKHRoaXMucz1udWxsKTt2YXIgYj10aGlzLmYoKSxjPWEudGFyZ2V0LmYoKTtiJiZhLnRhcmdldC5vJjImJmMmJihhPSIiLGMmJihhPWMuaWQscShhLCJUaGUgYWN0aXZlIGVsZW1lbnQgc2hvdWxkIGhhdmUgYW4gaWQuIikpLHhiKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEpKX07aC5TYT1mdW5jdGlvbihhKXt0aGlzLk8mJih0aGlzLlY9ITApO3ZhciBiPXlkKHRoaXMpO2ImJnNiKGIpJiZ0YihiKT9iLmZvY3VzKCk6YS5nKCl9O2guVmE9ZnVuY3Rpb24oKXt0aGlzLlY9ITF9OwpoLlRhPWZ1bmN0aW9uKGEpe2E6e3ZhciBiPWEudGFyZ2V0O2lmKHRoaXMuSSlmb3IodmFyIGM9dGhpcy5mKCk7YiYmYiE9PWM7KXt2YXIgZD1iLmlkO2lmKGQgaW4gdGhpcy5JKXtiPXRoaXMuSVtkXTticmVhayBhfWI9Yi5wYXJlbnROb2RlfWI9bnVsbH1pZihiKXN3aXRjaChhLnR5cGUpe2Nhc2UgRi5MOmIua2EoYSk7YnJlYWs7Y2FzZSBGLk06Y2FzZSBGLmFhOmIubGEoYSk7YnJlYWs7Y2FzZSAibW91c2VvdmVyIjpiLkFhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3V0IjpiLnphKGEpO2JyZWFrO2Nhc2UgImNvbnRleHRtZW51IjpiLmVhKGEpfX07aC5IYT1mdW5jdGlvbigpe307aC5RYT1mdW5jdGlvbigpe0NkKHRoaXMsLTEpO3RoaXMuVj0hMTt0aGlzLnMmJnNkKHRoaXMucywhMSl9OwpoLlJhPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmlzRW5hYmxlZCgpJiZ0aGlzLmlzVmlzaWJsZSgpJiYoMCE9UmModGhpcyl8fHRoaXMuRGEpJiZEZCh0aGlzLGEpPyhhLmcoKSxhLmooKSwhMCk6ITF9Owp2YXIgRGQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1MKGEsYS5sKTtpZihjJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5mYSYmYy5mYShiKXx8YS5zJiZhLnMhPWMmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLnMuZmEmJmEucy5mYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuYyl7Y2FzZSAyNzp5ZChhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpFZChhKTticmVhaztjYXNlIDM1OkZkKGEpO2JyZWFrO2Nhc2UgMzg6aWYoInZlcnRpY2FsIj09YS5IKUdkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9IZChhKTpHZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoInZlcnRpY2FsIj09YS5IKUhkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9HZChhKTpIZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSx6ZD1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZigpO2M9Yy5pZHx8KGMuaWQ9TGMoYikpO2EuSXx8KGEuST17fSk7YS5JW2NdPWJ9O1MucHJvdG90eXBlLnNhPWZ1bmN0aW9uKGEsYil7Q2EoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtTLmkuc2EuY2FsbCh0aGlzLGEsYil9O1MucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEsYixjKXtDYShhLE4pO2EuS3w9MjthLkt8PTY0O3RkKGEsMzIsITEpO2EubSYmMCE9YS55YSYmb2QoYSwhMSk7YS55YT0hMTt2YXIgZD1hLmI9PXRoaXM/VGModGhpcyxhKTotMTtTLmkudGEuY2FsbCh0aGlzLGEsYixjKTthLm0mJnRoaXMubSYmemQodGhpcyxhKTthPWQ7LTE9PWEmJihhPVJjKHRoaXMpKTthPT10aGlzLmw/dGhpcy5sPU1hdGgubWluKFJjKHRoaXMpLTEsYik6YT50aGlzLmwmJmI8PXRoaXMubD90aGlzLmwrKzphPHRoaXMubCYmYj50aGlzLmwmJnRoaXMubC0tfTsKdmFyIGFkPWZ1bmN0aW9uKGEsYil7aWYoYS5mKCkpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5IPWJ9O1MucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O3ZhciBBZD1mdW5jdGlvbihhLGIpe2EuVD1iO3ZhciBjPWEuZigpO2MmJihjLnN0eWxlLmRpc3BsYXk9Yj8iIjoibm9uZSIsWWMoeWQoYSksYS5PJiZhLlQpKX07Uy5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT307Uy5wcm90b3R5cGUuWj1mdW5jdGlvbihhKXt0aGlzLk8hPWEmJnVjKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5PPSEwLFFjKHRoaXMsZnVuY3Rpb24oYil7Yi5MYT9kZWxldGUgYi5MYTpiLlooITApfSkpOihRYyh0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5aKCExKTpiLkxhPSEwfSksdGhpcy5WPXRoaXMuTz0hMSksWWMoeWQodGhpcyksYSYmdGhpcy5UKSl9Owp2YXIgQ2Q9ZnVuY3Rpb24oYSxiKXsoYj1MKGEsYikpP1AoYiwhMCk6LTE8YS5sJiZQKEwoYSxhLmwpLCExKX0sRWQ9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LFJjKGEpLTEpfSxGZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiAwPmI/Yy0xOmJ9LDApfSxIZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7cmV0dXJuKGIrMSklY30sYS5sKX0sR2Q9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe2ItLTtyZXR1cm4gMD5iP2MtMTpifSxhLmwpfSxJZD1mdW5jdGlvbihhLGIsYyl7Yz0wPmM/VGMoYSxhLnMpOmM7dmFyIGQ9UmMoYSk7Yz1iLmNhbGwoYSxjLGQpO2Zvcih2YXIgZT0wO2U8PWQ7KXt2YXIgZj1MKGEsYyksZztpZihnPWYpZz1mLmlzVmlzaWJsZSgpJiZmLmlzRW5hYmxlZCgpJiYhIShmLnYmMik7aWYoZyl7YS5FYShjKTticmVha31lKys7Yz1iLmNhbGwoYSxjLGQpfX07ClMucHJvdG90eXBlLkVhPWZ1bmN0aW9uKGEpe0NkKHRoaXMsYSl9O3ZhciBUPWZ1bmN0aW9uKCl7fTtuKFQsTSk7ZGEoVCk7VC5wcm90b3R5cGUuYT1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYiJ9O1QucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXtyZXR1cm4idGFiIn07VC5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYj1ULmkuYy5jYWxsKHRoaXMsYSk7KGE9YS5QYSkmJmImJihiLnRpdGxlPWF8fCIiKTtyZXR1cm4gYn07VC5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIpe2I9VC5pLmcuY2FsbCh0aGlzLGEsYik7dmFyIGM9Yi50aXRsZXx8IiI7YyYmKGEuUGE9Yyk7YS5vJjgmJihjPWEuYikmJmlhKGMuRykmJihRKGEsOCwhMSksYy5HKGEpKTtyZXR1cm4gYn07dmFyIEpkPWZ1bmN0aW9uKGEsYixjKXtOLmNhbGwodGhpcyxhLGJ8fFQuUigpLGMpO3RkKHRoaXMsOCwhMCk7dGhpcy5LfD05fTtuKEpkLE4pO1ZjKCJnb29nLXRhYiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEpkKG51bGwpfSk7dmFyIFU9ZnVuY3Rpb24oKXt0aGlzLmg9InRhYmxpc3QifTtuKFUsWGMpO2RhKFUpO1UucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWItYmFyIn07VS5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIsYyl7dGhpcy5qfHwodGhpcy5hfHxLZCh0aGlzKSx0aGlzLmo9c2EodGhpcy5hKSk7dmFyIGQ9dGhpcy5qW2JdO2Q/KGFkKGEsTGQoZCkpLGEuQj1kKTpVLmkuZy5jYWxsKHRoaXMsYSxiLGMpfTtVLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPVUuaS5jLmNhbGwodGhpcyxhKTt0aGlzLmF8fEtkKHRoaXMpO2IucHVzaCh0aGlzLmFbYS5CXSk7cmV0dXJuIGJ9O3ZhciBLZD1mdW5jdGlvbihhKXt2YXIgYj1hLmIoKTthLmE9e3RvcDpiKyItdG9wIixib3R0b206YisiLWJvdHRvbSIsc3RhcnQ6YisiLXN0YXJ0IixlbmQ6YisiLWVuZCJ9fTt2YXIgVj1mdW5jdGlvbihhLGIsYyl7YT1hfHwidG9wIjthZCh0aGlzLExkKGEpKTt0aGlzLkI9YTtTLmNhbGwodGhpcyx0aGlzLkgsYnx8VS5SKCksYyk7TWQodGhpcyl9O24oVixTKTtoPVYucHJvdG90eXBlO2guQz1udWxsO2guRD1mdW5jdGlvbigpe1YuaS5ELmNhbGwodGhpcyk7TWQodGhpcyl9O2gudT1mdW5jdGlvbigpe1YuaS51LmNhbGwodGhpcyk7dGhpcy5DPW51bGx9O2guRWE9ZnVuY3Rpb24oYSl7Vi5pLkVhLmNhbGwodGhpcyxhKTt0aGlzLkcoTCh0aGlzLGEpKX07aC5HPWZ1bmN0aW9uKGEpe2E/cmQoYSwhMCk6dGhpcy5DJiZyZCh0aGlzLkMsITEpfTsKdmFyIE5kPWZ1bmN0aW9uKGEsYil7aWYoYiYmYj09YS5DKXtmb3IodmFyIGM9VGMoYSxiKSxkPWMtMTtiPUwoYSxkKTtkLS0pe3ZhciBlPWI7aWYoZS5pc1Zpc2libGUoKSYmZS5pc0VuYWJsZWQoKSl7YS5HKGIpO3JldHVybn19Zm9yKGMrPTE7Yj1MKGEsYyk7YysrKWlmKGQ9YixkLmlzVmlzaWJsZSgpJiZkLmlzRW5hYmxlZCgpKXthLkcoYik7cmV0dXJufWEuRyhudWxsKX19O2g9Vi5wcm90b3R5cGU7aC5hYj1mdW5jdGlvbihhKXt0aGlzLkMmJnRoaXMuQyE9YS50YXJnZXQmJnJkKHRoaXMuQywhMSk7dGhpcy5DPWEudGFyZ2V0fTtoLmJiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT10aGlzLkMmJih0aGlzLkM9bnVsbCl9O2guWmE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guJGE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guSGE9ZnVuY3Rpb24oKXtMKHRoaXMsdGhpcy5sKXx8Q2QodGhpcyxUYyh0aGlzLHRoaXMuQ3x8TCh0aGlzLDApKSl9Owp2YXIgTWQ9ZnVuY3Rpb24oYSl7SChIKEgoSChPYyhhKSxhLCJzZWxlY3QiLGEuYWIpLGEsInVuc2VsZWN0IixhLmJiKSxhLCJkaXNhYmxlIixhLlphKSxhLCJoaWRlIixhLiRhKX0sTGQ9ZnVuY3Rpb24oYSl7cmV0dXJuInN0YXJ0Ij09YXx8ImVuZCI9PWE/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O1ZjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBWfSk7ZnVuY3Rpb24gT2QoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIFBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgZz1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIrZyk7Zm9yKHZhciBrPVtdLHA9YmEoYyksdz1wLm5leHQoKTshdy5kb25lO3c9cC5uZXh0KCkpe3c9dy52YWx1ZTt2YXIgQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKQi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO0IudGV4dENvbnRlbnQ9dztmLmFwcGVuZENoaWxkKEIpO2sucHVzaChCKX0iYm90dG9tIiE9ZyYmZS5hcHBlbmRDaGlsZChmKTtwPW51bGw7aWYoInRvcCI9PWd8fCJib3R0b20iPT1nKXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTsidG9wIj09ZyYmcCYmZS5hcHBlbmRDaGlsZChwKTtCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0IuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciByYT1bXTtjPWJhKGMpO2Zvcih3PWMubmV4dCgpOyF3LmRvbmU7dz1jLm5leHQoKSl3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHcuaWQ9ZS5pZCsiX2NvbnRlbnRfIityYS5sZW5ndGgsdy5zdHlsZS5kaXNwbGF5PSJub25lIixCLmFwcGVuZENoaWxkKHcpLHJhLnB1c2godyk7ZS5hcHBlbmRDaGlsZChCKTsiYm90dG9tIj09ZyYmKHAmJgplLmFwcGVuZENoaWxkKHApLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBYPW5ldyBWKGcpO1BjKFgsZik7dmFyIFk9LTE7ZGMoWCwic2VsZWN0IixmdW5jdGlvbihaKXtaPWsuaW5kZXhPZihaLnRhcmdldC5mKCkpO1ohPVkmJigwPD1ZJiZZPHJhLmxlbmd0aCYmKHJhW1ldLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFk9LTEpLDA8PVomJlo8cmEubGVuZ3RoJiYoWT1aLHJhW1ldLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksWC5HKEwoWCxZKSkpfSk7WC5HKEwoWCxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFope1guRyhMKFgsWikpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChPZChhKSl9LFFkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sVz1sOwpRZFswXWluIFd8fCJ1bmRlZmluZWQiPT10eXBlb2YgVy5leGVjU2NyaXB0fHxXLmV4ZWNTY3JpcHQoInZhciAiK1FkWzBdKTtmb3IodmFyIFJkO1FkLmxlbmd0aCYmKFJkPVFkLnNoaWZ0KCkpOylRZC5sZW5ndGh8fHZvaWQgMD09PVBkP1dbUmRdJiZXW1JkXSE9PU9iamVjdC5wcm90b3R5cGVbUmRdP1c9V1tSZF06Vz1XW1JkXT17fTpXW1JkXT1QZDt9KS5jYWxsKHRoaXMpOwovLyBjbGFuZy1mb3JtYXQgb24K", + "headers": [ + [ + "content-type", + "application/javascript" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + } + } + }, + "executionInfo": { + "elapsed": 16280, + "status": "ok", + "timestamp": 1600709624041, + "user": { + "displayName": "Evgeny Skvortsov", + "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhiQjODaOVLfYnUuWS9rB3LRntzJDM0hqElzsUkdQ=s64", + "userId": "11510585406840398626" + }, + "user_tz": 420 + }, + "id": "MwRieDl3eixo", + "outputId": "425818b9-5f12-4852-dcae-63a537d56b62" + }, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id22" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id22" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id22" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97c9d4e2-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id22\", \"tabNames\": [\"WritesCode\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_66d07c274f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id22" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97ca1bc8-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id22\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_f85c64aeda" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id22" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97cb301c-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_597c4d6345" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_1", + "outputarea_id22" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97cb7d42-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id22_content_1\");\n", + "//# sourceURL=js_c87c6e333b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_1", + "outputarea_id22" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97cbc3a6-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"97cb7d42-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_2b9b3c196b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_1", + "outputarea_id22" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97cc0514-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id22\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_65267049c9" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_1", + "outputarea_id22" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running WritesCode\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"97d56d16-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"97cb301c-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_a5a9b6e4ae" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_1", + "outputarea_id22" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97d7f644-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_d6dd8b9365" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_0", + "outputarea_id22" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97d8413a-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id22_content_0\");\n", + "//# sourceURL=js_bb4eb7f25b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_0", + "outputarea_id22" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97d88d7a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"97d8413a-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_1060e1b4b0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_0", + "outputarea_id22" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97d8ef18-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id22\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_086e90f1fc" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_0", + "outputarea_id22" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_0", + "outputarea_id22", + "outputarea_id23", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_0", + "outputarea_id22", + "outputarea_id23", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_0", + "outputarea_id22", + "outputarea_id23", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97dbd1c4-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id23\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_984e88d86c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_0", + "outputarea_id22", + "outputarea_id23", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97dc5d9c-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id23\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_3eec6eb691" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_0", + "outputarea_id22", + "outputarea_id23", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97ddb6ec-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_2115aa29d1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_0", + "id23_content_0", + "outputarea_id22", + "outputarea_id23", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97de0f98-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id23_content_0\");\n", + "//# sourceURL=js_4e6f7f858c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_0", + "id23_content_0", + "outputarea_id22", + "outputarea_id23", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97de74c4-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"97de0f98-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_5f573de4ab" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_0", + "id23_content_0", + "outputarea_id22", + "outputarea_id23", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97e0053c-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id23\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_35351f16fb" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_0", + "id23_content_0", + "outputarea_id22", + "outputarea_id23", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mWritesCode_sql\u001b[0m variable.\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " \"Alice\" AS name,\n", + " \"Product Manager\" AS role,\n", + " \"SEA\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Bob\" AS name,\n", + " \"Engineer\" AS role,\n", + " \"SEA\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Caroline\" AS name,\n", + " \"Engineer\" AS role,\n", + " \"LAX\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"David\" AS name,\n", + " \"Data Scientist\" AS role,\n", + " \"LAX\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Eve\" AS name,\n", + " \"Data Scientist\" AS role,\n", + " \"SEA\" AS office\n", + " \n", + ") )\n", + "SELECT * FROM (\n", + " \n", + " SELECT\n", + " Employee.name AS name\n", + " FROM\n", + " t_0_Employee AS Employee\n", + " WHERE\n", + " Employee.role = \"Engineer\"\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " Employee.name AS name\n", + " FROM\n", + " t_0_Employee AS Employee\n", + " WHERE\n", + " Employee.role = \"Data Scientist\"\n", + " \n", + ") ;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"97e1abee-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"97ddb6ec-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_443e7a3db8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_0", + "id23_content_0", + "outputarea_id22", + "outputarea_id23", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97e3043a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"97d7f644-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_68d56ee6e7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_0", + "outputarea_id22" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97e4991c-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_58c75b8d90" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_1", + "outputarea_id22" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97e4f7ae-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id22_content_1\");\n", + "//# sourceURL=js_0f6db1f79b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_1", + "outputarea_id22" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97e593d0-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"97e4f7ae-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_3efbe606c1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_1", + "outputarea_id22" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"97e5d0c0-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id22\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_290a7855dd" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_1", + "outputarea_id22" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"98781174-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"97e4991c-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_3d603ea891" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_1", + "outputarea_id22" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"987b87e6-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_04c7071a6b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_0", + "outputarea_id22" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"987c25c0-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id22_content_0\");\n", + "//# sourceURL=js_8d8fde2617" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_0", + "outputarea_id22" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"987c671a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"987c25c0-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_4865eee6f9" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_0", + "outputarea_id22" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"987cbcf6-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id22\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_90565dcc59" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_0", + "outputarea_id22" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"987ec4c4-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_f297d9aeea" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_0", + "id23_content_1", + "outputarea_id22", + "outputarea_id23", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"987f308a-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id23_content_1\");\n", + "//# sourceURL=js_5552eb60f7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_0", + "id23_content_1", + "outputarea_id22", + "outputarea_id23", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"987f95e8-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"987f308a-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_05e2fa629a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_0", + "id23_content_1", + "outputarea_id22", + "outputarea_id23", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"988014dc-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id23\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_80adf625c6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_0", + "id23_content_1", + "outputarea_id22", + "outputarea_id23", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mWritesCode\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
name
0Bob
1Caroline
2David
3Eve
\n", + "
" + ], + "text/plain": [ + " name\n", + "0 Bob\n", + "1 Caroline\n", + "2 David\n", + "3 Eve" + ] + }, + "metadata": { + "tags": [ + "id22_content_0", + "id23_content_1", + "outputarea_id22", + "outputarea_id23", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9884fe3e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"987ec4c4-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_c8a92f25f9" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_0", + "id23_content_1", + "outputarea_id22", + "outputarea_id23", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9886d416-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"987b87e6-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_3fe6d6b158" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id22_content_0", + "outputarea_id22" + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "%%logica WritesCode\n", + "\n", + "Employee(name: \"Alice\", role: \"Product Manager\", office: \"SEA\");\n", + "Employee(name: \"Bob\", role: \"Engineer\", office: \"SEA\");\n", + "Employee(name: \"Caroline\", role: \"Engineer\", office: \"LAX\");\n", + "Employee(name: \"David\", role: \"Data Scientist\", office: \"LAX\");\n", + "Employee(name: \"Eve\", role: \"Data Scientist\", office: \"SEA\");\n", + "\n", + "# Engineers and data scientists write code.\n", + "WritesCode(name:) :-\n", + " Employee(name:, role: \"Engineer\") |\n", + " Employee(name:, role: \"Data Scientist\");\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "NOZOU2vgmoCp" + }, + "source": [ + "### Negation\n", + "\n", + "Negation of a predicate is denoted `~`, while `!` is used to negate a boolean value.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 239, + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH0=", + "headers": [ + [ + "content-type", + "text/css" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgaCxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9ZnVuY3Rpb24oYSl7dmFyIGI9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmYVtTeW1ib2wuaXRlcmF0b3JdO3JldHVybiBiP2IuY2FsbChhKTp7bmV4dDphYShhKX19LGw9dGhpc3x8c2VsZixjYT1mdW5jdGlvbigpe30sZGE9ZnVuY3Rpb24oYSl7YS5CYT12b2lkIDA7YS5SPWZ1bmN0aW9uKCl7cmV0dXJuIGEuQmE/YS5CYTphLkJhPW5ldyBhfX0sZWE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7aWYoIm9iamVjdCI9PWIpaWYoYSl7aWYoYSBpbnN0YW5jZW9mIEFycmF5KXJldHVybiJhcnJheSI7aWYoYSBpbnN0YW5jZW9mIE9iamVjdClyZXR1cm4gYjt2YXIgYz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk7aWYoIltvYmplY3QgV2luZG93XSI9PWMpcmV0dXJuIm9iamVjdCI7CmlmKCJbb2JqZWN0IEFycmF5XSI9PWN8fCJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGgmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5zcGxpY2UmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoInNwbGljZSIpKXJldHVybiJhcnJheSI7aWYoIltvYmplY3QgRnVuY3Rpb25dIj09Y3x8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmNhbGwmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoImNhbGwiKSlyZXR1cm4iZnVuY3Rpb24ifWVsc2UgcmV0dXJuIm51bGwiO2Vsc2UgaWYoImZ1bmN0aW9uIj09YiYmInVuZGVmaW5lZCI9PXR5cGVvZiBhLmNhbGwpcmV0dXJuIm9iamVjdCI7cmV0dXJuIGJ9LGZhPWZ1bmN0aW9uKGEpe3JldHVybiJhcnJheSI9PWVhKGEpfSxoYT1mdW5jdGlvbihhKXt2YXIgYj1lYShhKTtyZXR1cm4iYXJyYXkiPT1ifHwib2JqZWN0Ij09CmImJiJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGh9LGlhPWZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PWVhKGEpfSxtPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBhO3JldHVybiJvYmplY3QiPT1iJiZudWxsIT1hfHwiZnVuY3Rpb24iPT1ifSxqYT0iY2xvc3VyZV91aWRfIisoMUU5Kk1hdGgucmFuZG9tKCk+Pj4wKSxrYT0wLGxhPWZ1bmN0aW9uKGEsYil7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe3ZhciBkPWMuc2xpY2UoKTtkLnB1c2guYXBwbHkoZCxhcmd1bWVudHMpO3JldHVybiBhLmFwcGx5KHRoaXMsZCl9fSxuPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe31jLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLmk9Yi5wcm90b3R5cGU7YS5wcm90b3R5cGU9bmV3IGM7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YX07dmFyIG1hLG5hPXtlYjoiYWN0aXZlZGVzY2VuZGFudCIsamI6ImF0b21pYyIsa2I6ImF1dG9jb21wbGV0ZSIsbWI6ImJ1c3kiLHBiOiJjaGVja2VkIixxYjoiY29saW5kZXgiLHZiOiJjb250cm9scyIseGI6ImRlc2NyaWJlZGJ5IixBYjoiZGlzYWJsZWQiLENiOiJkcm9wZWZmZWN0IixEYjoiZXhwYW5kZWQiLEViOiJmbG93dG8iLEdiOiJncmFiYmVkIixLYjoiaGFzcG9wdXAiLE1iOiJoaWRkZW4iLE9iOiJpbnZhbGlkIixQYjoibGFiZWwiLFFiOiJsYWJlbGxlZGJ5IixSYjoibGV2ZWwiLFdiOiJsaXZlIixrYzoibXVsdGlsaW5lIixsYzoibXVsdGlzZWxlY3RhYmxlIixwYzoib3JpZW50YXRpb24iLHFjOiJvd25zIixyYzoicG9zaW5zZXQiLHRjOiJwcmVzc2VkIix4YzoicmVhZG9ubHkiLHpjOiJyZWxldmFudCIsQWM6InJlcXVpcmVkIixFYzoicm93aW5kZXgiLEhjOiJzZWxlY3RlZCIsSmM6InNldHNpemUiLExjOiJzb3J0IixaYzoidmFsdWVtYXgiLCRjOiJ2YWx1ZW1pbiIsYWQ6InZhbHVlbm93IiwKYmQ6InZhbHVldGV4dCJ9O3ZhciBvYT1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkIGluIGEpYi5jYWxsKGMsYVtkXSxkLGEpfSxwYT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyBpbiBhKWlmKGFbY109PWIpcmV0dXJuITA7cmV0dXJuITF9LHFhPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsIT09YSYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfSxzYT1mdW5jdGlvbihhKXt2YXIgYj17fSxjO2ZvcihjIGluIGEpYlthW2NdXT1jO3JldHVybiBifSx0YT0iY29uc3RydWN0b3IgaGFzT3duUHJvcGVydHkgaXNQcm90b3R5cGVPZiBwcm9wZXJ0eUlzRW51bWVyYWJsZSB0b0xvY2FsZVN0cmluZyB0b1N0cmluZyB2YWx1ZU9mIi5zcGxpdCgiICIpLHVhPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8dGEubGVuZ3RoO2YrKyljPQp0YVtmXSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZCxjKSYmKGFbY109ZFtjXSl9fTt2YXIgdmE9e2ZiOiJhbGVydCIsZ2I6ImFsZXJ0ZGlhbG9nIixoYjoiYXBwbGljYXRpb24iLGliOiJhcnRpY2xlIixsYjoiYmFubmVyIixuYjoiYnV0dG9uIixvYjoiY2hlY2tib3giLHJiOiJjb2x1bW5oZWFkZXIiLHNiOiJjb21ib2JveCIsdGI6ImNvbXBsZW1lbnRhcnkiLHViOiJjb250ZW50aW5mbyIsd2I6ImRlZmluaXRpb24iLHliOiJkaWFsb2ciLHpiOiJkaXJlY3RvcnkiLEJiOiJkb2N1bWVudCIsRmI6ImZvcm0iLEhiOiJncmlkIixJYjoiZ3JpZGNlbGwiLEpiOiJncm91cCIsTGI6ImhlYWRpbmciLE5iOiJpbWciLFNiOiJsaW5rIixUYjoibGlzdCIsVWI6Imxpc3Rib3giLFZiOiJsaXN0aXRlbSIsWGI6ImxvZyIsWWI6Im1haW4iLFpiOiJtYXJxdWVlIiwkYjoibWF0aCIsYWM6Im1lbnUiLGJjOiJtZW51YmFyIixjYzoibWVudWl0ZW0iLGRjOiJtZW51aXRlbWNoZWNrYm94IixlYzoibWVudWl0ZW1yYWRpbyIsbWM6Im5hdmlnYXRpb24iLG5jOiJub3RlIixvYzoib3B0aW9uIiwKc2M6InByZXNlbnRhdGlvbiIsdWM6InByb2dyZXNzYmFyIix2YzoicmFkaW8iLHdjOiJyYWRpb2dyb3VwIix5YzoicmVnaW9uIixCYzoicm93IixDYzoicm93Z3JvdXAiLERjOiJyb3doZWFkZXIiLEZjOiJzY3JvbGxiYXIiLEdjOiJzZWFyY2giLEljOiJzZXBhcmF0b3IiLEtjOiJzbGlkZXIiLE1jOiJzcGluYnV0dG9uIixOYzoic3RhdHVzIixPYzoidGFiIixQYzoidGFibGlzdCIsUWM6InRhYnBhbmVsIixSYzoidGV4dGJveCIsU2M6InRleHRpbmZvIixUYzoidGltZXIiLFVjOiJ0b29sYmFyIixWYzoidG9vbHRpcCIsV2M6InRyZWUiLFhjOiJ0cmVlZ3JpZCIsWWM6InRyZWVpdGVtIn07dmFyIHdhPWZ1bmN0aW9uKGEpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsd2EpO2Vsc2V7dmFyIGI9RXJyb3IoKS5zdGFjaztiJiYodGhpcy5zdGFjaz1iKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSl9O24od2EsRXJyb3IpO3dhLnByb3RvdHlwZS5uYW1lPSJDdXN0b21FcnJvciI7dmFyIHhhO3ZhciB5YT1mdW5jdGlvbihhLGIpe2E9YS5zcGxpdCgiJXMiKTtmb3IodmFyIGM9IiIsZD1hLmxlbmd0aC0xLGU9MDtlPGQ7ZSsrKWMrPWFbZV0rKGU8Yi5sZW5ndGg/YltlXToiJXMiKTt3YS5jYWxsKHRoaXMsYythW2RdKX07bih5YSx3YSk7eWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjsKdmFyIHphPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSJBc3NlcnRpb24gZmFpbGVkIjtpZihjKXtlKz0iOiAiK2M7dmFyIGY9ZH1lbHNlIGEmJihlKz0iOiAiK2EsZj1iKTt0aHJvdyBuZXcgeWEoIiIrZSxmfHxbXSk7fSxxPWZ1bmN0aW9uKGEsYixjKXthfHx6YSgiIixudWxsLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX0sQWE9ZnVuY3Rpb24oYSxiLGMpe20oYSkmJjE9PWEubm9kZVR5cGV8fHphKCJFeHBlY3RlZCBFbGVtZW50IGJ1dCBnb3QgJXM6ICVzLiIsW2VhKGEpLGFdLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKX0sQ2E9ZnVuY3Rpb24oYSxiLGMsZCl7YSBpbnN0YW5jZW9mIGJ8fHphKCJFeHBlY3RlZCBpbnN0YW5jZW9mICVzIGJ1dCBnb3QgJXMuIixbQmEoYiksQmEoYSldLGMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpKX0sQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZgpGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTpudWxsPT09YT8ibnVsbCI6dHlwZW9mIGF9O3ZhciBEYT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3EobnVsbCE9YS5sZW5ndGgpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKCJzdHJpbmciPT09dHlwZW9mIGEpcmV0dXJuInN0cmluZyIhPT10eXBlb2YgYnx8MSE9Yi5sZW5ndGg/LTE6YS5pbmRleE9mKGIsMCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspaWYoYyBpbiBhJiZhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX0scj1BcnJheS5wcm90b3R5cGUuZm9yRWFjaD9mdW5jdGlvbihhLGIsYyl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsYyl9OmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9YS5sZW5ndGgsZT0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZj0wO2Y8ZDtmKyspZiBpbiBlJiZiLmNhbGwoYyxlW2ZdLGYsYSl9LEVhPUFycmF5LnByb3RvdHlwZS5maWx0ZXI/CmZ1bmN0aW9uKGEsYil7cShudWxsIT1hLmxlbmd0aCk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD1bXSxlPTAsZj0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZz0wO2c8YztnKyspaWYoZyBpbiBmKXt2YXIgaz1mW2ddO2IuY2FsbCh2b2lkIDAsayxnLGEpJiYoZFtlKytdPWspfXJldHVybiBkfSxGYT1BcnJheS5wcm90b3R5cGUuZXZlcnk/ZnVuY3Rpb24oYSxiKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmV2ZXJ5LmNhbGwoYSxiLHZvaWQgMCl9OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWEubGVuZ3RoLGQ9InN0cmluZyI9PT10eXBlb2YgYT9hLnNwbGl0KCIiKTphLGU9MDtlPGM7ZSsrKWlmKGUgaW4gZCYmIWIuY2FsbCh2b2lkIDAsZFtlXSxlLGEpKXJldHVybiExO3JldHVybiEwfSxHYT1mdW5jdGlvbihhLGIpe3JldHVybiAwPD0KRGEoYSxiKX0sSGE9ZnVuY3Rpb24oYSxiKXtiPURhKGEsYik7dmFyIGM7aWYoYz0wPD1iKXEobnVsbCE9YS5sZW5ndGgpLEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhLGIsMSk7cmV0dXJuIGN9LElhPWZ1bmN0aW9uKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGFyZ3VtZW50cyl9LEphPWZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDA8Yil7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX0sTGE9ZnVuY3Rpb24oYSxiLGMsZCl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShhLEthKGFyZ3VtZW50cywxKSl9LEthPWZ1bmN0aW9uKGEsYixjKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gMj49YXJndW1lbnRzLmxlbmd0aD9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsYixjKX07dmFyIE1hPVN0cmluZy5wcm90b3R5cGUudHJpbT9mdW5jdGlvbihhKXtyZXR1cm4gYS50cmltKCl9OmZ1bmN0aW9uKGEpe3JldHVybi9eW1xzXHhhMF0qKFtcc1xTXSo/KVtcc1x4YTBdKiQvLmV4ZWMoYSlbMV19LE5hPS8mL2csT2E9LzwvZyxQYT0vPi9nLFFhPS8iL2csUmE9LycvZyxTYT0vXHgwMC9nLFRhPS9bXHgwMCY8PiInXS8sdD1mdW5jdGlvbihhLGIpe3JldHVybi0xIT1hLmluZGV4T2YoYil9LFVhPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE8Yj8tMTphPmI/MTowfTt2YXIgdTthOnt2YXIgVmE9bC5uYXZpZ2F0b3I7aWYoVmEpe3ZhciBXYT1WYS51c2VyQWdlbnQ7aWYoV2Epe3U9V2E7YnJlYWsgYX19dT0iIn07LyoKCiBDb3B5cmlnaHQgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzLgogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKKi8KdmFyIFhhPWZ1bmN0aW9uKGEpe1RhLnRlc3QoYSkmJigtMSE9YS5pbmRleE9mKCImIikmJihhPWEucmVwbGFjZShOYSwiJmFtcDsiKSksLTEhPWEuaW5kZXhPZigiPCIpJiYoYT1hLnJlcGxhY2UoT2EsIiZsdDsiKSksLTEhPWEuaW5kZXhPZigiPiIpJiYoYT1hLnJlcGxhY2UoUGEsIiZndDsiKSksLTEhPWEuaW5kZXhPZignIicpJiYoYT1hLnJlcGxhY2UoUWEsIiZxdW90OyIpKSwtMSE9YS5pbmRleE9mKCInIikmJihhPWEucmVwbGFjZShSYSwiJiMzOTsiKSksLTEhPWEuaW5kZXhPZigiXHgwMCIpJiYoYT1hLnJlcGxhY2UoU2EsIiYjMDsiKSkpO3JldHVybiBhfTt2YXIgWWE9ZnVuY3Rpb24oYSl7WWFbIiAiXShhKTtyZXR1cm4gYX07WWFbIiAiXT1jYTt2YXIgJGE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1aYTtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsYSk/Y1thXTpjW2FdPWIoYSl9O3ZhciBhYj10KHUsIk9wZXJhIiksdj10KHUsIlRyaWRlbnQiKXx8dCh1LCJNU0lFIiksYmI9dCh1LCJFZGdlIikseD10KHUsIkdlY2tvIikmJiEodCh1LnRvTG93ZXJDYXNlKCksIndlYmtpdCIpJiYhdCh1LCJFZGdlIikpJiYhKHQodSwiVHJpZGVudCIpfHx0KHUsIk1TSUUiKSkmJiF0KHUsIkVkZ2UiKSx5PXQodS50b0xvd2VyQ2FzZSgpLCJ3ZWJraXQiKSYmIXQodSwiRWRnZSIpLHo9dCh1LCJNYWNpbnRvc2giKSxjYj1mdW5jdGlvbigpe3ZhciBhPWwuZG9jdW1lbnQ7cmV0dXJuIGE/YS5kb2N1bWVudE1vZGU6dm9pZCAwfSxkYjsKYTp7dmFyIGViPSIiLGZiPWZ1bmN0aW9uKCl7dmFyIGE9dTtpZih4KXJldHVybi9ydjooW15cKTtdKykoXCl8OykvLmV4ZWMoYSk7aWYoYmIpcmV0dXJuL0VkZ2VcLyhbXGRcLl0rKS8uZXhlYyhhKTtpZih2KXJldHVybi9cYig/Ok1TSUV8cnYpWzogXShbXlwpO10rKShcKXw7KS8uZXhlYyhhKTtpZih5KXJldHVybi9XZWJLaXRcLyhcUyspLy5leGVjKGEpO2lmKGFiKXJldHVybi8oPzpWZXJzaW9uKVsgXC9dPyhcUyspLy5leGVjKGEpfSgpO2ZiJiYoZWI9ZmI/ZmJbMV06IiIpO2lmKHYpe3ZhciBnYj1jYigpO2lmKG51bGwhPWdiJiZnYj5wYXJzZUZsb2F0KGViKSl7ZGI9U3RyaW5nKGdiKTticmVhayBhfX1kYj1lYn0KdmFyIGhiPWRiLFphPXt9LEE9ZnVuY3Rpb24oYSl7cmV0dXJuICRhKGEsZnVuY3Rpb24oKXtmb3IodmFyIGI9MCxjPU1hKFN0cmluZyhoYikpLnNwbGl0KCIuIiksZD1NYShTdHJpbmcoYSkpLnNwbGl0KCIuIiksZT1NYXRoLm1heChjLmxlbmd0aCxkLmxlbmd0aCksZj0wOzA9PWImJmY8ZTtmKyspe3ZhciBnPWNbZl18fCIiLGs9ZFtmXXx8IiI7ZG97Zz0vKFxkKikoXEQqKSguKikvLmV4ZWMoZyl8fFsiIiwiIiwiIiwiIl07az0vKFxkKikoXEQqKSguKikvLmV4ZWMoayl8fFsiIiwiIiwiIiwiIl07aWYoMD09Z1swXS5sZW5ndGgmJjA9PWtbMF0ubGVuZ3RoKWJyZWFrO2I9VWEoMD09Z1sxXS5sZW5ndGg/MDpwYXJzZUludChnWzFdLDEwKSwwPT1rWzFdLmxlbmd0aD8wOnBhcnNlSW50KGtbMV0sMTApKXx8VWEoMD09Z1syXS5sZW5ndGgsMD09a1syXS5sZW5ndGgpfHxVYShnWzJdLGtbMl0pO2c9Z1szXTtrPWtbM119d2hpbGUoMD09Yil9cmV0dXJuIDA8PWJ9KX0saWI7CmliPWwuZG9jdW1lbnQmJnY/Y2IoKTp2b2lkIDA7dmFyIGpiPSF2fHw5PD1OdW1iZXIoaWIpO3ZhciBsYj1mdW5jdGlvbihhLGIpe29hKGIsZnVuY3Rpb24oYyxkKXtjJiYib2JqZWN0Ij09dHlwZW9mIGMmJmMuZGQmJihjPWMuY2QoKSk7InN0eWxlIj09ZD9hLnN0eWxlLmNzc1RleHQ9YzoiY2xhc3MiPT1kP2EuY2xhc3NOYW1lPWM6ImZvciI9PWQ/YS5odG1sRm9yPWM6a2IuaGFzT3duUHJvcGVydHkoZCk/YS5zZXRBdHRyaWJ1dGUoa2JbZF0sYyk6MD09ZC5sYXN0SW5kZXhPZigiYXJpYS0iLDApfHwwPT1kLmxhc3RJbmRleE9mKCJkYXRhLSIsMCk/YS5zZXRBdHRyaWJ1dGUoZCxjKTphW2RdPWN9KX0sa2I9e2NlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjb2xzcGFuOiJjb2xTcGFuIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGhlaWdodDoiaGVpZ2h0IixtYXhsZW5ndGg6Im1heExlbmd0aCIsbm9uY2U6Im5vbmNlIixyb2xlOiJyb2xlIixyb3dzcGFuOiJyb3dTcGFuIix0eXBlOiJ0eXBlIix1c2VtYXA6InVzZU1hcCIsdmFsaWduOiJ2QWxpZ24iLAp3aWR0aDoid2lkdGgifSxtYj1mdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChrKXtrJiZiLmFwcGVuZENoaWxkKCJzdHJpbmciPT09dHlwZW9mIGs/YS5jcmVhdGVUZXh0Tm9kZShrKTprKX1mb3IodmFyIGU9MjtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXTtpZighaGEoZil8fG0oZikmJjA8Zi5ub2RlVHlwZSlkKGYpO2Vsc2V7YTp7aWYoZiYmIm51bWJlciI9PXR5cGVvZiBmLmxlbmd0aCl7aWYobShmKSl7dmFyIGc9ImZ1bmN0aW9uIj09dHlwZW9mIGYuaXRlbXx8InN0cmluZyI9PXR5cGVvZiBmLml0ZW07YnJlYWsgYX1pZihpYShmKSl7Zz0iZnVuY3Rpb24iPT10eXBlb2YgZi5pdGVtO2JyZWFrIGF9fWc9ITF9cihnP0phKGYpOmYsZCl9fX0sbmI9ZnVuY3Rpb24oYSxiKXtiPVN0cmluZyhiKTsiYXBwbGljYXRpb24veGh0bWwreG1sIj09PWEuY29udGVudFR5cGUmJihiPWIudG9Mb3dlckNhc2UoKSk7cmV0dXJuIGEuY3JlYXRlRWxlbWVudChiKX0sb2I9ZnVuY3Rpb24oYSl7YSYmCmEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpfSxwYj1mdW5jdGlvbihhLGIpe2lmKCFhfHwhYilyZXR1cm4hMTtpZihhLmNvbnRhaW5zJiYxPT1iLm5vZGVUeXBlKXJldHVybiBhPT1ifHxhLmNvbnRhaW5zKGIpO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbilyZXR1cm4gYT09Ynx8ISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNik7Zm9yKDtiJiZhIT1iOyliPWIucGFyZW50Tm9kZTtyZXR1cm4gYj09YX0scWI9ZnVuY3Rpb24oYSl7cShhLCJOb2RlIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4iKTtyZXR1cm4gOT09YS5ub2RlVHlwZT9hOmEub3duZXJEb2N1bWVudHx8YS5kb2N1bWVudH0scmI9ZnVuY3Rpb24oYSxiKXtiP2EudGFiSW5kZXg9MDooYS50YWJJbmRleD0tMSxhLnJlbW92ZUF0dHJpYnV0ZSgidGFiSW5kZXgiKSl9LHNiPWZ1bmN0aW9uKGEpe3JldHVybiB2JiYhQSgiOSIpPyhhPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKSwKbnVsbCE9YSYmYS5zcGVjaWZpZWQpOmEuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpfSx0Yj1mdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgYSYmMDw9YSYmMzI3Njg+YX0sdWI9ZnVuY3Rpb24oYSl7dGhpcy5hPWF8fGwuZG9jdW1lbnR8fGRvY3VtZW50fTt1Yi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBhP3RoaXMuYS5nZXRFbGVtZW50QnlJZChhKTphfTsKdWIucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuYSxlPWFyZ3VtZW50cyxmPVN0cmluZyhlWzBdKSxnPWVbMV07aWYoIWpiJiZnJiYoZy5uYW1lfHxnLnR5cGUpKXtmPVsiPCIsZl07Zy5uYW1lJiZmLnB1c2goJyBuYW1lPSInLFhhKGcubmFtZSksJyInKTtpZihnLnR5cGUpe2YucHVzaCgnIHR5cGU9IicsWGEoZy50eXBlKSwnIicpO3ZhciBrPXt9O3VhKGssZyk7ZGVsZXRlIGsudHlwZTtnPWt9Zi5wdXNoKCI+Iik7Zj1mLmpvaW4oIiIpfWY9bmIoZCxmKTtnJiYoInN0cmluZyI9PT10eXBlb2YgZz9mLmNsYXNzTmFtZT1nOmZhKGcpP2YuY2xhc3NOYW1lPWcuam9pbigiICIpOmxiKGYsZykpOzI8ZS5sZW5ndGgmJm1iKGQsZixlKTtyZXR1cm4gZn07dmFyIHZiPWZ1bmN0aW9uKGEsYil7Yj8ocShwYSh2YSxiKSwiTm8gc3VjaCBBUklBIHJvbGUgIitiKSxhLnNldEF0dHJpYnV0ZSgicm9sZSIsYikpOmEucmVtb3ZlQXR0cmlidXRlKCJyb2xlIil9LHhiPWZ1bmN0aW9uKGEsYixjKXtmYShjKSYmKGM9Yy5qb2luKCIgIikpO3ZhciBkPXdiKGIpOyIiPT09Y3x8dm9pZCAwPT1jPyhtYXx8KG1hPXthdG9taWM6ITEsYXV0b2NvbXBsZXRlOiJub25lIixkcm9wZWZmZWN0OiJub25lIixoYXNwb3B1cDohMSxsaXZlOiJvZmYiLG11bHRpbGluZTohMSxtdWx0aXNlbGVjdGFibGU6ITEsb3JpZW50YXRpb246InZlcnRpY2FsIixyZWFkb25seTohMSxyZWxldmFudDoiYWRkaXRpb25zIHRleHQiLHJlcXVpcmVkOiExLHNvcnQ6Im5vbmUiLGJ1c3k6ITEsZGlzYWJsZWQ6ITEsaGlkZGVuOiExLGludmFsaWQ6ImZhbHNlIn0pLGM9bWEsYiBpbiBjP2Euc2V0QXR0cmlidXRlKGQsY1tiXSk6YS5yZW1vdmVBdHRyaWJ1dGUoZCkpOmEuc2V0QXR0cmlidXRlKGQsCmMpfSx3Yj1mdW5jdGlvbihhKXtxKGEsIkFSSUEgYXR0cmlidXRlIGNhbm5vdCBiZSBlbXB0eS4iKTtxKHBhKG5hLGEpLCJObyBzdWNoIEFSSUEgYXR0cmlidXRlICIrYSk7cmV0dXJuImFyaWEtIithfTt2YXIgeWI9T2JqZWN0LmZyZWV6ZXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O3ZhciBDPWZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVTt0aGlzLko9dGhpcy5KfTtDLnByb3RvdHlwZS5VPSExO0MucHJvdG90eXBlLk49ZnVuY3Rpb24oKXt0aGlzLlV8fCh0aGlzLlU9ITAsdGhpcy51KCkpfTt2YXIgemI9ZnVuY3Rpb24oYSxiKXthLlU/YigpOihhLkp8fChhLko9W10pLGEuSi5wdXNoKGIpKX07Qy5wcm90b3R5cGUudT1mdW5jdGlvbigpe2lmKHRoaXMuSilmb3IoO3RoaXMuSi5sZW5ndGg7KXRoaXMuSi5zaGlmdCgpKCl9O3ZhciBBYj1mdW5jdGlvbihhKXthJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5OJiZhLk4oKX07dmFyIEJiPWZ1bmN0aW9uKGEpe3JldHVybiJzdHJpbmciPT10eXBlb2YgYS5jbGFzc05hbWU/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sRD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6QmIoYSkubWF0Y2goL1xTKy9nKXx8W119LENiPWZ1bmN0aW9uKGEsYil7InN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZT9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxEYj1mdW5jdGlvbihhLGIpe3JldHVybiBhLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5jb250YWlucyhiKTpHYShEKGEpLGIpfSxFYj1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFEYihhLGIpKXt2YXIgYz1CYihhKTtDYihhLGMrKDA8Yy5sZW5ndGg/IiAiK2I6YikpfX0sRmI9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClyKGIsCmZ1bmN0aW9uKGUpe0ViKGEsZSl9KTtlbHNle3ZhciBjPXt9O3IoRChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7cihiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPTA8Yi5sZW5ndGg/IiAiK2Q6ZDtDYihhLGIpfX0sR2I9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6RGIoYSxiKSYmQ2IoYSxFYShEKGEpLGZ1bmN0aW9uKGMpe3JldHVybiBjIT1ifSkuam9pbigiICIpKX0sSGI9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9yKGIsZnVuY3Rpb24oYyl7R2IoYSxjKX0pOkNiKGEsRWEoRChhKSxmdW5jdGlvbihjKXtyZXR1cm4hR2EoYixjKX0pLmpvaW4oIiAiKSl9O3ZhciBJYj0hdnx8OTw9TnVtYmVyKGliKSxKYj0hdnx8OTw9TnVtYmVyKGliKSxLYj12JiYhQSgiOSIpLExiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e2wuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsY2EsYiksbC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjYSxiKX1jYXRjaChjKXt9cmV0dXJuIGF9KCk7dmFyIEU9ZnVuY3Rpb24oYSxiKXt0aGlzLnR5cGU9YTt0aGlzLmE9dGhpcy50YXJnZXQ9Yjt0aGlzLmg9ITE7dGhpcy5LYT0hMH07RS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuaD0hMH07RS5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3RoaXMuS2E9ITF9O3ZhciBGPXtMOiJtb3VzZWRvd24iLE06Im1vdXNldXAiLGFhOiJtb3VzZWNhbmNlbCIsaGM6Im1vdXNlbW92ZSIsamM6Im1vdXNlb3ZlciIsaWM6Im1vdXNlb3V0IixmYzoibW91c2VlbnRlciIsZ2M6Im1vdXNlbGVhdmUifTt2YXIgRz1mdW5jdGlvbihhLGIpe0UuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy5hPXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5jPTA7dGhpcy5BPXRoaXMubWV0YUtleT10aGlzLnNoaWZ0S2V5PXRoaXMuYWx0S2V5PXRoaXMuY3RybEtleT0hMTt0aGlzLnBvaW50ZXJJZD0wO3RoaXMucG9pbnRlclR5cGU9IiI7dGhpcy5iPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMuYT1iO2lmKGI9YS5yZWxhdGVkVGFyZ2V0KXtpZih4KXthOnt0cnl7WWEoYi5ub2RlTmFtZSk7dmFyIGU9ITA7YnJlYWsgYX1jYXRjaChmKXt9ZT0KITF9ZXx8KGI9bnVsbCl9fWVsc2UibW91c2VvdmVyIj09Yz9iPWEuZnJvbUVsZW1lbnQ6Im1vdXNlb3V0Ij09YyYmKGI9YS50b0VsZW1lbnQpO3RoaXMucmVsYXRlZFRhcmdldD1iO2Q/KHRoaXMuY2xpZW50WD12b2lkIDAhPT1kLmNsaWVudFg/ZC5jbGllbnRYOmQucGFnZVgsdGhpcy5jbGllbnRZPXZvaWQgMCE9PWQuY2xpZW50WT9kLmNsaWVudFk6ZC5wYWdlWSx0aGlzLnNjcmVlblg9ZC5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1kLnNjcmVlbll8fDApOih0aGlzLmNsaWVudFg9dm9pZCAwIT09YS5jbGllbnRYP2EuY2xpZW50WDphLnBhZ2VYLHRoaXMuY2xpZW50WT12b2lkIDAhPT1hLmNsaWVudFk/YS5jbGllbnRZOmEucGFnZVksdGhpcy5zY3JlZW5YPWEuc2NyZWVuWHx8MCx0aGlzLnNjcmVlblk9YS5zY3JlZW5ZfHwwKTt0aGlzLmJ1dHRvbj1hLmJ1dHRvbjt0aGlzLmM9YS5rZXlDb2RlfHwwO3RoaXMua2V5PWEua2V5fHwiIjt0aGlzLmN0cmxLZXk9YS5jdHJsS2V5O3RoaXMuYWx0S2V5PQphLmFsdEtleTt0aGlzLnNoaWZ0S2V5PWEuc2hpZnRLZXk7dGhpcy5tZXRhS2V5PWEubWV0YUtleTt0aGlzLkE9ej9hLm1ldGFLZXk6YS5jdHJsS2V5O3RoaXMucG9pbnRlcklkPWEucG9pbnRlcklkfHwwO3RoaXMucG9pbnRlclR5cGU9InN0cmluZyI9PT10eXBlb2YgYS5wb2ludGVyVHlwZT9hLnBvaW50ZXJUeXBlOk1iW2EucG9pbnRlclR5cGVdfHwiIjt0aGlzLmI9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnRoaXMuZygpfX07bihHLEUpO3ZhciBOYj15YihbMSw0LDJdKSxNYj15Yih7MjoidG91Y2giLDM6InBlbiIsNDoibW91c2UifSksT2I9ZnVuY3Rpb24oYSl7cmV0dXJuIEliPzA9PWEuYi5idXR0b246ImNsaWNrIj09YS50eXBlPyEwOiEhKGEuYi5idXR0b24mTmJbMF0pfTtHLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7Ry5pLmouY2FsbCh0aGlzKTt0aGlzLmIuc3RvcFByb3BhZ2F0aW9uP3RoaXMuYi5zdG9wUHJvcGFnYXRpb24oKTp0aGlzLmIuY2FuY2VsQnViYmxlPSEwfTsKRy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe0cuaS5nLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5iO2lmKGEucHJldmVudERlZmF1bHQpYS5wcmV2ZW50RGVmYXVsdCgpO2Vsc2UgaWYoYS5yZXR1cm5WYWx1ZT0hMSxLYil0cnl7aWYoYS5jdHJsS2V5fHwxMTI8PWEua2V5Q29kZSYmMTIzPj1hLmtleUNvZGUpYS5rZXlDb2RlPS0xfWNhdGNoKGIpe319O3ZhciBQYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKDFFNipNYXRoLnJhbmRvbSgpfDApLFFiPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW1BiXSl9LFJiPTA7dmFyIFNiPWZ1bmN0aW9uKGEsYixjLGQsZSl7dGhpcy5saXN0ZW5lcj1hO3RoaXMuYT1udWxsO3RoaXMuc3JjPWI7dGhpcy50eXBlPWM7dGhpcy5jYXB0dXJlPSEhZDt0aGlzLm1hPWU7dGhpcy5rZXk9KytSYjt0aGlzLlg9dGhpcy5oYT0hMX0sVGI9ZnVuY3Rpb24oYSl7YS5YPSEwO2EubGlzdGVuZXI9bnVsbDthLmE9bnVsbDthLnNyYz1udWxsO2EubWE9bnVsbH07dmFyIFViPWZ1bmN0aW9uKGEpe3RoaXMuc3JjPWE7dGhpcy5hPXt9O3RoaXMuYj0wfTtVYi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS50b1N0cmluZygpO2E9dGhpcy5hW2ZdO2F8fChhPXRoaXMuYVtmXT1bXSx0aGlzLmIrKyk7dmFyIGc9VmIoYSxiLGQsZSk7LTE8Zz8oYj1hW2ddLGN8fChiLmhhPSExKSk6KGI9bmV3IFNiKGIsdGhpcy5zcmMsZiwhIWQsZSksYi5oYT1jLGEucHVzaChiKSk7cmV0dXJuIGJ9Owp2YXIgV2I9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLnR5cGU7YyBpbiBhLmEmJkhhKGEuYVtjXSxiKSYmKFRiKGIpLDA9PWEuYVtjXS5sZW5ndGgmJihkZWxldGUgYS5hW2NdLGEuYi0tKSl9LFhiPWZ1bmN0aW9uKGEsYixjLGQsZSl7YT1hLmFbYi50b1N0cmluZygpXTtiPS0xO2EmJihiPVZiKGEsYyxkLGUpKTtyZXR1cm4tMTxiP2FbYl06bnVsbH0sVmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuWCYmZi5saXN0ZW5lcj09YiYmZi5jYXB0dXJlPT0hIWMmJmYubWE9PWQpcmV0dXJuIGV9cmV0dXJuLTF9O3ZhciBZYj0iY2xvc3VyZV9sbV8iKygxRTYqTWF0aC5yYW5kb20oKXwwKSxaYj17fSwkYj0wLGJjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZCYmZC5vbmNlKXJldHVybiBhYyhhLGIsYyxkLGUpO2lmKGZhKGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyliYyhhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9Y2MoYyk7cmV0dXJuIFFiKGEpP2RjKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOmVjKGEsYixjLCExLGQsZSl9LGVjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGc9bShlKT8hIWUuY2FwdHVyZTohIWUsaz1mYyhhKTtrfHwoYVtZYl09az1uZXcgVWIoYSkpO2M9ay5hZGQoYixjLGQsZyxmKTtpZihjLmEpcmV0dXJuIGM7ZD1nYygpO2MuYT1kO2Quc3JjPWE7ZC5saXN0ZW5lcj1jO2lmKGEuYWRkRXZlbnRMaXN0ZW5lcilMYnx8KGU9Zyksdm9pZCAwPT09ZSYmKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksCmQsZSk7ZWxzZSBpZihhLmF0dGFjaEV2ZW50KWEuYXR0YWNoRXZlbnQoaGMoYi50b1N0cmluZygpKSxkKTtlbHNlIGlmKGEuYWRkTGlzdGVuZXImJmEucmVtb3ZlTGlzdGVuZXIpcSgiY2hhbmdlIj09PWIsIk1lZGlhUXVlcnlMaXN0IG9ubHkgaGFzIGEgY2hhbmdlIGV2ZW50IiksYS5hZGRMaXN0ZW5lcihkKTtlbHNlIHRocm93IEVycm9yKCJhZGRFdmVudExpc3RlbmVyIGFuZCBhdHRhY2hFdmVudCBhcmUgdW5hdmFpbGFibGUuIik7JGIrKztyZXR1cm4gY30sZ2M9ZnVuY3Rpb24oKXt2YXIgYT1pYyxiPUpiP2Z1bmN0aW9uKGMpe3JldHVybiBhLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKX06ZnVuY3Rpb24oYyl7Yz1hLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKTtpZighYylyZXR1cm4gY307cmV0dXJuIGJ9LGFjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZmEoYikpe2Zvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWFjKGEsYltmXSxjLGQsZSk7cmV0dXJuIG51bGx9Yz1jYyhjKTtyZXR1cm4gUWIoYSk/CmEuaC5hZGQoU3RyaW5nKGIpLGMsITAsbShkKT8hIWQuY2FwdHVyZTohIWQsZSk6ZWMoYSxiLGMsITAsZCxlKX0samM9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihmYShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylqYyhhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPWNjKGMpLFFiKGEpPyhhPWEuaCxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5hJiYoZj1hLmFbYl0sYz1WYihmLGMsZCxlKSwtMTxjJiYoVGIoZltjXSkscShudWxsIT1mLmxlbmd0aCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSwwPT1mLmxlbmd0aCYmKGRlbGV0ZSBhLmFbYl0sYS5iLS0pKSkpOmEmJihhPWZjKGEpKSYmKGM9WGIoYSxiLGMsZCxlKSkmJmtjKGMpfSxrYz1mdW5jdGlvbihhKXtpZigibnVtYmVyIiE9PXR5cGVvZiBhJiZhJiYhYS5YKXt2YXIgYj1hLnNyYztpZihRYihiKSlXYihiLmgsYSk7ZWxzZXt2YXIgYz1hLnR5cGUsZD1hLmE7Yi5yZW1vdmVFdmVudExpc3RlbmVyPwpiLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KGhjKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7JGItLTsoYz1mYyhiKSk/KFdiKGMsYSksMD09Yy5iJiYoYy5zcmM9bnVsbCxiW1liXT1udWxsKSk6VGIoYSl9fX0saGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gWmI/WmJbYV06WmJbYV09Im9uIithfSxtYz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMDtpZihhPWZjKGEpKWlmKGI9YS5hW2IudG9TdHJpbmcoKV0pZm9yKGI9Yi5jb25jYXQoKSxhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBmPWJbYV07ZiYmZi5jYXB0dXJlPT1jJiYhZi5YJiYoZj1sYyhmLGQpLGU9ZSYmITEhPT1mKX1yZXR1cm4gZX0sbGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5tYXx8YS5zcmM7YS5oYSYma2MoYSk7cmV0dXJuIGMuY2FsbChkLGIpfSxpYz1mdW5jdGlvbihhLApiKXtpZihhLlgpcmV0dXJuITA7aWYoIUpiKXtpZighYilhOntiPVsid2luZG93IiwiZXZlbnQiXTtmb3IodmFyIGM9bCxkPTA7ZDxiLmxlbmd0aDtkKyspaWYoYz1jW2JbZF1dLG51bGw9PWMpe2I9bnVsbDticmVhayBhfWI9Y31kPWI7Yj1uZXcgRyhkLHRoaXMpO2M9ITA7aWYoISgwPmQua2V5Q29kZXx8dm9pZCAwIT1kLnJldHVyblZhbHVlKSl7YTp7dmFyIGU9ITE7aWYoMD09ZC5rZXlDb2RlKXRyeXtkLmtleUNvZGU9LTE7YnJlYWsgYX1jYXRjaChnKXtlPSEwfWlmKGV8fHZvaWQgMD09ZC5yZXR1cm5WYWx1ZSlkLnJldHVyblZhbHVlPSEwfWQ9W107Zm9yKGU9Yi5hO2U7ZT1lLnBhcmVudE5vZGUpZC5wdXNoKGUpO2E9YS50eXBlO2ZvcihlPWQubGVuZ3RoLTE7IWIuaCYmMDw9ZTtlLS0pe2IuYT1kW2VdO3ZhciBmPW1jKGRbZV0sYSwhMCxiKTtjPWMmJmZ9Zm9yKGU9MDshYi5oJiZlPGQubGVuZ3RoO2UrKyliLmE9ZFtlXSxmPW1jKGRbZV0sYSwhMSxiKSxjPWMmJmZ9cmV0dXJuIGN9cmV0dXJuIGxjKGEsCm5ldyBHKGIsdGhpcykpfSxmYz1mdW5jdGlvbihhKXthPWFbWWJdO3JldHVybiBhIGluc3RhbmNlb2YgVWI/YTpudWxsfSxuYz0iX19jbG9zdXJlX2V2ZW50c19mbl8iKygxRTkqTWF0aC5yYW5kb20oKT4+PjApLGNjPWZ1bmN0aW9uKGEpe3EoYSwiTGlzdGVuZXIgY2FuIG5vdCBiZSBudWxsLiIpO2lmKGlhKGEpKXJldHVybiBhO3EoYS5oYW5kbGVFdmVudCwiQW4gb2JqZWN0IGxpc3RlbmVyIG11c3QgaGF2ZSBoYW5kbGVFdmVudCBtZXRob2QuIik7YVtuY118fChhW25jXT1mdW5jdGlvbihiKXtyZXR1cm4gYS5oYW5kbGVFdmVudChiKX0pO3JldHVybiBhW25jXX07dmFyIG9jPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9e319O24ob2MsQyk7CnZhciBwYz1bXSxIPWZ1bmN0aW9uKGEsYixjLGQpe2ZhKGMpfHwoYyYmKHBjWzBdPWMudG9TdHJpbmcoKSksYz1wYyk7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWJjKGIsY1tlXSxkfHxhLmhhbmRsZUV2ZW50LCExLGEuYnx8YSk7aWYoIWYpYnJlYWs7YS5hW2Yua2V5XT1mfXJldHVybiBhfSxxYz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoZmEoYykpZm9yKHZhciBnPTA7ZzxjLmxlbmd0aDtnKyspcWMoYSxiLGNbZ10sZCxlLGYpO2Vsc2UgZD1kfHxhLmhhbmRsZUV2ZW50LGU9bShlKT8hIWUuY2FwdHVyZTohIWUsZj1mfHxhLmJ8fGEsZD1jYyhkKSxlPSEhZSxjPVFiKGIpP1hiKGIuaCxTdHJpbmcoYyksZCxlLGYpOmI/KGI9ZmMoYikpP1hiKGIsYyxkLGUsZik6bnVsbDpudWxsLGMmJihrYyhjKSxkZWxldGUgYS5hW2Mua2V5XSk7cmV0dXJuIGF9LHJjPWZ1bmN0aW9uKGEpe29hKGEuYSxmdW5jdGlvbihiLGMpe3RoaXMuYS5oYXNPd25Qcm9wZXJ0eShjKSYma2MoYil9LAphKTthLmE9e319O29jLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7b2MuaS51LmNhbGwodGhpcyk7cmModGhpcyl9O29jLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJFdmVudEhhbmRsZXIuaGFuZGxlRXZlbnQgbm90IGltcGxlbWVudGVkIik7fTt2YXIgST1mdW5jdGlvbigpe0MuY2FsbCh0aGlzKTt0aGlzLmg9bmV3IFViKHRoaXMpO3RoaXMuTWE9dGhpczt0aGlzLnBhPW51bGx9O24oSSxDKTtJLnByb3RvdHlwZVtQYl09ITA7SS5wcm90b3R5cGUucmE9ZnVuY3Rpb24oYSl7dGhpcy5wYT1hfTtJLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjLGQpe2pjKHRoaXMsYSxiLGMsZCl9Owp2YXIgdWM9ZnVuY3Rpb24oYSxiKXtzYyhhKTt2YXIgYz1hLnBhO2lmKGMpe3ZhciBkPVtdO2Zvcih2YXIgZT0xO2M7Yz1jLnBhKWQucHVzaChjKSxxKDFFMz4rK2UsImluZmluaXRlIGxvb3AiKX1hPWEuTWE7Yz1iLnR5cGV8fGI7InN0cmluZyI9PT10eXBlb2YgYj9iPW5ldyBFKGIsYSk6YiBpbnN0YW5jZW9mIEU/Yi50YXJnZXQ9Yi50YXJnZXR8fGE6KGU9YixiPW5ldyBFKGMsYSksdWEoYixlKSk7ZT0hMDtpZihkKWZvcih2YXIgZj1kLmxlbmd0aC0xOyFiLmgmJjA8PWY7Zi0tKXt2YXIgZz1iLmE9ZFtmXTtlPXRjKGcsYywhMCxiKSYmZX1iLmh8fChnPWIuYT1hLGU9dGMoZyxjLCEwLGIpJiZlLGIuaHx8KGU9dGMoZyxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLmgmJmY8ZC5sZW5ndGg7ZisrKWc9Yi5hPWRbZl0sZT10YyhnLGMsITEsYikmJmU7cmV0dXJuIGV9OwpJLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7SS5pLnUuY2FsbCh0aGlzKTtpZih0aGlzLmgpe3ZhciBhPXRoaXMuaCxiPTAsYztmb3IoYyBpbiBhLmEpe2Zvcih2YXIgZD1hLmFbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixUYihkW2VdKTtkZWxldGUgYS5hW2NdO2EuYi0tfX10aGlzLnBhPW51bGx9O3ZhciBkYz1mdW5jdGlvbihhLGIsYyxkLGUpe3NjKGEpO3JldHVybiBhLmguYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LHRjPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5oLmFbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGc9YltmXTtpZihnJiYhZy5YJiZnLmNhcHR1cmU9PWMpe3ZhciBrPWcubGlzdGVuZXIscD1nLm1hfHxnLnNyYztnLmhhJiZXYihhLmgsZyk7ZT0hMSE9PWsuY2FsbChwLGQpJiZlfX1yZXR1cm4gZSYmMCE9ZC5LYX0sc2M9ZnVuY3Rpb24oYSl7cShhLmgsIkV2ZW50IHRhcmdldCBpcyBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgY2FsbCB0aGUgc3VwZXJjbGFzcyAoZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpIGNvbnN0cnVjdG9yPyIpfTt2YXIgeGM9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKHkmJiFBKCI1MjUiKSlyZXR1cm4hMDtpZih6JiZlKXJldHVybiB2YyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZigheCl7Im51bWJlciI9PT10eXBlb2YgYiYmKGI9d2MoYikpO3ZhciBnPTE3PT1ifHwxOD09Ynx8eiYmOTE9PWI7aWYoKCFjfHx6KSYmZ3x8eiYmMTY9PWImJihkfHxmKSlyZXR1cm4hMX1pZigoeXx8YmIpJiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1pZih2JiZkJiZiPT1hKXJldHVybiExO3N3aXRjaChhKXtjYXNlIDEzOnJldHVybiB4P2Z8fGU/ITE6IShjJiZkKTohMDtjYXNlIDI3OnJldHVybiEoeXx8YmJ8fHgpfXJldHVybiB4JiYoZHx8ZXx8Zik/ITE6dmMoYSl9LHZjPWZ1bmN0aW9uKGEpe2lmKDQ4PD1hJiY1Nz49YXx8Cjk2PD1hJiYxMDY+PWF8fDY1PD1hJiY5MD49YXx8KHl8fGJiKSYmMD09YSlyZXR1cm4hMDtzd2l0Y2goYSl7Y2FzZSAzMjpjYXNlIDQzOmNhc2UgNjM6Y2FzZSA2NDpjYXNlIDEwNzpjYXNlIDEwOTpjYXNlIDExMDpjYXNlIDExMTpjYXNlIDE4NjpjYXNlIDU5OmNhc2UgMTg5OmNhc2UgMTg3OmNhc2UgNjE6Y2FzZSAxODg6Y2FzZSAxOTA6Y2FzZSAxOTE6Y2FzZSAxOTI6Y2FzZSAyMjI6Y2FzZSAyMTk6Y2FzZSAyMjA6Y2FzZSAyMjE6Y2FzZSAxNjM6Y2FzZSA1ODpyZXR1cm4hMDtjYXNlIDE3MzpyZXR1cm4geDtkZWZhdWx0OnJldHVybiExfX0sd2M9ZnVuY3Rpb24oYSl7aWYoeClhPXljKGEpO2Vsc2UgaWYoeiYmeSlzd2l0Y2goYSl7Y2FzZSA5MzphPTkxfXJldHVybiBhfSx5Yz1mdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSA2MTpyZXR1cm4gMTg3O2Nhc2UgNTk6cmV0dXJuIDE4NjtjYXNlIDE3MzpyZXR1cm4gMTg5O2Nhc2UgMjI0OnJldHVybiA5MTtjYXNlIDA6cmV0dXJuIDIyNDsKZGVmYXVsdDpyZXR1cm4gYX19O3ZhciBKPWZ1bmN0aW9uKGEsYil7SS5jYWxsKHRoaXMpO2EmJnpjKHRoaXMsYSxiKX07bihKLEkpO2g9Si5wcm90b3R5cGU7aC5TPW51bGw7aC5uYT1udWxsO2guQ2E9bnVsbDtoLm9hPW51bGw7aC53PS0xO2guRj0tMTtoLnVhPSExOwp2YXIgQWM9ezM6MTMsMTI6MTQ0LDYzMjMyOjM4LDYzMjMzOjQwLDYzMjM0OjM3LDYzMjM1OjM5LDYzMjM2OjExMiw2MzIzNzoxMTMsNjMyMzg6MTE0LDYzMjM5OjExNSw2MzI0MDoxMTYsNjMyNDE6MTE3LDYzMjQyOjExOCw2MzI0MzoxMTksNjMyNDQ6MTIwLDYzMjQ1OjEyMSw2MzI0NjoxMjIsNjMyNDc6MTIzLDYzMjQ4OjQ0LDYzMjcyOjQ2LDYzMjczOjM2LDYzMjc1OjM1LDYzMjc2OjMzLDYzMjc3OjM0LDYzMjg5OjE0NCw2MzMwMjo0NX0sQmM9e1VwOjM4LERvd246NDAsTGVmdDozNyxSaWdodDozOSxFbnRlcjoxMyxGMToxMTIsRjI6MTEzLEYzOjExNCxGNDoxMTUsRjU6MTE2LEY2OjExNyxGNzoxMTgsRjg6MTE5LEY5OjEyMCxGMTA6MTIxLEYxMToxMjIsRjEyOjEyMywiVSswMDdGIjo0NixIb21lOjM2LEVuZDozNSxQYWdlVXA6MzMsUGFnZURvd246MzQsSW5zZXJ0OjQ1fSxDYz0heXx8QSgiNTI1IiksRGM9eiYmeDsKSi5wcm90b3R5cGUuYT1mdW5jdGlvbihhKXtpZih5fHxiYilpZigxNz09dGhpcy53JiYhYS5jdHJsS2V5fHwxOD09dGhpcy53JiYhYS5hbHRLZXl8fHomJjkxPT10aGlzLncmJiFhLm1ldGFLZXkpdGhpcy5GPXRoaXMudz0tMTstMT09dGhpcy53JiYoYS5jdHJsS2V5JiYxNyE9YS5jP3RoaXMudz0xNzphLmFsdEtleSYmMTghPWEuYz90aGlzLnc9MTg6YS5tZXRhS2V5JiY5MSE9YS5jJiYodGhpcy53PTkxKSk7Q2MmJiF4YyhhLmMsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGEuYWx0S2V5LGEubWV0YUtleSk/dGhpcy5oYW5kbGVFdmVudChhKToodGhpcy5GPXdjKGEuYyksRGMmJih0aGlzLnVhPWEuYWx0S2V5KSl9O0oucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dGhpcy5GPXRoaXMudz0tMTt0aGlzLnVhPWEuYWx0S2V5fTsKSi5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5iLGM9Yi5hbHRLZXk7aWYodiYmImtleXByZXNzIj09YS50eXBlKXt2YXIgZD10aGlzLkY7dmFyIGU9MTMhPWQmJjI3IT1kP2Iua2V5Q29kZTowfWVsc2UoeXx8YmIpJiYia2V5cHJlc3MiPT1hLnR5cGU/KGQ9dGhpcy5GLGU9MDw9Yi5jaGFyQ29kZSYmNjMyMzI+Yi5jaGFyQ29kZSYmdmMoZCk/Yi5jaGFyQ29kZTowKTphYiYmIXk/KGQ9dGhpcy5GLGU9dmMoZCk/Yi5rZXlDb2RlOjApOigia2V5cHJlc3MiPT1hLnR5cGU/KERjJiYoYz10aGlzLnVhKSxiLmtleUNvZGU9PWIuY2hhckNvZGU/MzI+Yi5rZXlDb2RlPyhkPWIua2V5Q29kZSxlPTApOihkPXRoaXMuRixlPWIuY2hhckNvZGUpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkseiYmNjM9PWUmJjIyND09ZCYmKGQ9MTkxKSk7dmFyIGY9ZD13YyhkKTtkPzYzMjMyPD0KZCYmZCBpbiBBYz9mPUFjW2RdOjI1PT1kJiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBCYyYmKGY9QmNbYi5rZXlJZGVudGlmaWVyXSk7eCYmQ2MmJiJrZXlwcmVzcyI9PWEudHlwZSYmIXhjKGYsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KXx8KGE9Zj09dGhpcy53LHRoaXMudz1mLGI9bmV3IEVjKGYsZSxhLGIpLGIuYWx0S2V5PWMsdWModGhpcyxiKSl9O0oucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTsKdmFyIHpjPWZ1bmN0aW9uKGEsYixjKXthLm9hJiZGYyhhKTthLlM9YjthLm5hPWJjKGEuUywia2V5cHJlc3MiLGEsYyk7YS5DYT1iYyhhLlMsImtleWRvd24iLGEuYSxjLGEpO2Eub2E9YmMoYS5TLCJrZXl1cCIsYS5iLGMsYSl9LEZjPWZ1bmN0aW9uKGEpe2EubmEmJihrYyhhLm5hKSxrYyhhLkNhKSxrYyhhLm9hKSxhLm5hPW51bGwsYS5DYT1udWxsLGEub2E9bnVsbCk7YS5TPW51bGw7YS53PS0xO2EuRj0tMX07Si5wcm90b3R5cGUudT1mdW5jdGlvbigpe0ouaS51LmNhbGwodGhpcyk7RmModGhpcyl9O3ZhciBFYz1mdW5jdGlvbihhLGIsYyxkKXtHLmNhbGwodGhpcyxkKTt0aGlzLnR5cGU9ImtleSI7dGhpcy5jPWE7dGhpcy5yZXBlYXQ9Y307bihFYyxHKTt2YXIgR2M9eD8iTW96VXNlclNlbGVjdCI6eXx8YmI/IldlYmtpdFVzZXJTZWxlY3QiOm51bGwsSGM9ZnVuY3Rpb24oYSxiKXtiPWI/bnVsbDphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7aWYoR2Mpe3ZhciBjPSJub25lIjthLnN0eWxlJiYoYS5zdHlsZVtHY109Yyk7aWYoYil7YT0wO2Zvcih2YXIgZDtkPWJbYV07YSsrKWQuc3R5bGUmJihkLnN0eWxlW0djXT1jKX19ZWxzZSBpZih2fHxhYilpZihjPSJvbiIsYS5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyksYilmb3IoYT0wO2Q9YlthXTthKyspZC5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyl9O3ZhciBJYz1mdW5jdGlvbigpe307ZGEoSWMpO0ljLnByb3RvdHlwZS5hPTA7dmFyIEs9ZnVuY3Rpb24oYSl7SS5jYWxsKHRoaXMpO3RoaXMuaj1hfHx4YXx8KHhhPW5ldyB1Yik7dGhpcy5xYT1KYzt0aGlzLlk9bnVsbDt0aGlzLm09ITE7dGhpcy5hPW51bGw7dGhpcy5BPXZvaWQgMDt0aGlzLmc9dGhpcy5jPXRoaXMuYj1udWxsO3RoaXMuR2E9ITF9O24oSyxJKTtLLnByb3RvdHlwZS5PYT1JYy5SKCk7CnZhciBKYz1udWxsLEtjPWZ1bmN0aW9uKGEsYil7c3dpdGNoKGEpe2Nhc2UgMTpyZXR1cm4gYj8iZGlzYWJsZSI6ImVuYWJsZSI7Y2FzZSAyOnJldHVybiBiPyJoaWdobGlnaHQiOiJ1bmhpZ2hsaWdodCI7Y2FzZSA0OnJldHVybiBiPyJhY3RpdmF0ZSI6ImRlYWN0aXZhdGUiO2Nhc2UgODpyZXR1cm4gYj8ic2VsZWN0IjoidW5zZWxlY3QiO2Nhc2UgMTY6cmV0dXJuIGI/ImNoZWNrIjoidW5jaGVjayI7Y2FzZSAzMjpyZXR1cm4gYj8iZm9jdXMiOiJibHVyIjtjYXNlIDY0OnJldHVybiBiPyJvcGVuIjoiY2xvc2UifXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBzdGF0ZSIpO30sTGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuWXx8KGEuWT0iOiIrKGEuT2EuYSsrKS50b1N0cmluZygzNikpfSxNYz1mdW5jdGlvbihhLGIpe2lmKGEuYiYmYS5iLmcpe3ZhciBjPWEuYi5nLGQ9YS5ZO2QgaW4gYyYmZGVsZXRlIGNbZF07cWEoYS5iLmcsYixhKX1hLlk9Yn07Sy5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9Owp2YXIgTmM9ZnVuY3Rpb24oYSl7YT1hLmE7cShhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cmV0dXJuIGF9LE9jPWZ1bmN0aW9uKGEpe2EuQXx8KGEuQT1uZXcgb2MoYSkpO3JldHVybiBxKGEuQSl9O0sucHJvdG90eXBlLnJhPWZ1bmN0aW9uKGEpe2lmKHRoaXMuYiYmdGhpcy5iIT1hKXRocm93IEVycm9yKCJNZXRob2Qgbm90IHN1cHBvcnRlZCIpO0suaS5yYS5jYWxsKHRoaXMsYSl9O0sucHJvdG90eXBlLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPW5iKHRoaXMuai5hLCJESVYiKX07CnZhciBQYz1mdW5jdGlvbihhLGIpe2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiJiZhLnhhKGIpKXthLkdhPSEwO3ZhciBjPXFiKGIpO2EuaiYmYS5qLmE9PWN8fChhLmo9Yj9uZXcgdWIocWIoYikpOnhhfHwoeGE9bmV3IHViKSk7YS52YShiKTthLkQoKX1lbHNlIHRocm93IEVycm9yKCJJbnZhbGlkIGVsZW1lbnQgdG8gZGVjb3JhdGUiKTt9O2g9Sy5wcm90b3R5cGU7aC54YT1mdW5jdGlvbigpe3JldHVybiEwfTtoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hfTtoLkQ9ZnVuY3Rpb24oKXt0aGlzLm09ITA7UWModGhpcyxmdW5jdGlvbihhKXshYS5tJiZhLmYoKSYmYS5EKCl9KX07aC5QPWZ1bmN0aW9uKCl7UWModGhpcyxmdW5jdGlvbihhKXthLm0mJmEuUCgpfSk7dGhpcy5BJiZyYyh0aGlzLkEpO3RoaXMubT0hMX07CmgudT1mdW5jdGlvbigpe3RoaXMubSYmdGhpcy5QKCk7dGhpcy5BJiYodGhpcy5BLk4oKSxkZWxldGUgdGhpcy5BKTtRYyh0aGlzLGZ1bmN0aW9uKGEpe2EuTigpfSk7IXRoaXMuR2EmJnRoaXMuYSYmb2IodGhpcy5hKTt0aGlzLmI9dGhpcy5hPXRoaXMuZz10aGlzLmM9bnVsbDtLLmkudS5jYWxsKHRoaXMpfTtoLnNhPWZ1bmN0aW9uKGEsYil7dGhpcy50YShhLFJjKHRoaXMpLGIpfTsKaC50YT1mdW5jdGlvbihhLGIsYyl7cSghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLm0mJihjfHwhdGhpcy5tKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZigwPmJ8fGI+UmModGhpcykpdGhyb3cgRXJyb3IoIkNoaWxkIGNvbXBvbmVudCBpbmRleCBvdXQgb2YgYm91bmRzIik7dGhpcy5nJiZ0aGlzLmN8fCh0aGlzLmc9e30sdGhpcy5jPVtdKTtpZihhLmI9PXRoaXMpe3ZhciBkPUxjKGEpO3RoaXMuZ1tkXT1hO0hhKHRoaXMuYyxhKX1lbHNlIHFhKHRoaXMuZyxMYyhhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuYiYmYS5ZKXt2YXIgZT1hLmI7ZD1hLlk7ZS5nJiZkPyhlPWUuZyxkPShudWxsIT09ZSYmZCBpbiBlP2VbZF06dm9pZCAwKXx8bnVsbCk6ZD1udWxsfWlmKGQmJmEuYiE9dGhpcyl0aHJvdyBFcnJvcigiVW5hYmxlIHRvIHNldCBwYXJlbnQgY29tcG9uZW50Iik7CmEuYj10aGlzO0suaS5yYS5jYWxsKGEsdGhpcyk7TGEodGhpcy5jLGIsMCxhKTtpZihhLm0mJnRoaXMubSYmYS5iPT10aGlzKWM9dGhpcy5qYSgpLGI9Yy5jaGlsZE5vZGVzW2JdfHxudWxsLGIhPWEuZigpJiZjLmluc2VydEJlZm9yZShhLmYoKSxiKTtlbHNlIGlmKGMpe3RoaXMuYXx8dGhpcy5pYSgpO2M9TCh0aGlzLGIrMSk7Yj10aGlzLmphKCk7Yz1jP2MuYTpudWxsO2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTthLmF8fGEuaWEoKTtiP2IuaW5zZXJ0QmVmb3JlKGEuYSxjfHxudWxsKTphLmouYS5ib2R5LmFwcGVuZENoaWxkKGEuYSk7YS5iJiYhYS5iLm18fGEuRCgpfWVsc2UgdGhpcy5tJiYhYS5tJiZhLmEmJmEuYS5wYXJlbnROb2RlJiYxPT1hLmEucGFyZW50Tm9kZS5ub2RlVHlwZSYmYS5EKCl9O2guamE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hfTsKdmFyIFNjPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEucWEpe3ZhciBiPWEubT9hLmE6YS5qLmEuYm9keTthOnt2YXIgYz1xYihiKTtpZihjLmRlZmF1bHRWaWV3JiZjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihjPWMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpKSl7Yz1jLmRpcmVjdGlvbnx8Yy5nZXRQcm9wZXJ0eVZhbHVlKCJkaXJlY3Rpb24iKXx8IiI7YnJlYWsgYX1jPSIifWEucWE9InJ0bCI9PShjfHwoYi5jdXJyZW50U3R5bGU/Yi5jdXJyZW50U3R5bGUuZGlyZWN0aW9uOm51bGwpfHxiLnN0eWxlJiZiLnN0eWxlLmRpcmVjdGlvbil9cmV0dXJuIGEucWF9LFJjPWZ1bmN0aW9uKGEpe3JldHVybiBhLmM/YS5jLmxlbmd0aDowfSxMPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuYz9hLmNbYl18fG51bGw6bnVsbH0sUWM9ZnVuY3Rpb24oYSxiLGMpe2EuYyYmcihhLmMsYixjKX0sVGM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jJiZiP0RhKGEuYyxiKTotMX07dmFyIFZjPWZ1bmN0aW9uKGEsYil7aWYoIWEpdGhyb3cgRXJyb3IoIkludmFsaWQgY2xhc3MgbmFtZSAiK2EpO2lmKCFpYShiKSl0aHJvdyBFcnJvcigiSW52YWxpZCBkZWNvcmF0b3IgZnVuY3Rpb24gIitiKTtVY1thXT1ifSxXYz17fSxVYz17fTt2YXIgWGM9ZnVuY3Rpb24oYSl7dGhpcy5oPWF9O2RhKFhjKTt2YXIgWWM9ZnVuY3Rpb24oYSxiKXthJiYoYS50YWJJbmRleD1iPzA6LTEpfSwkYz1mdW5jdGlvbihhLGIsYyl7Yy5pZCYmTWMoYixjLmlkKTt2YXIgZD1hLmIoKSxlPSExLGY9RChjKTtmJiZyKGYsZnVuY3Rpb24oZyl7Zz09ZD9lPSEwOmcmJnRoaXMuZyhiLGcsZCl9LGEpO2V8fEViKGMsZCk7WmMoYixjKTtyZXR1cm4gY307WGMucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiLGMpe2I9PWMrIi1kaXNhYmxlZCI/YS5aKCExKTpiPT1jKyItaG9yaXpvbnRhbCI/YWQoYSwiaG9yaXpvbnRhbCIpOmI9PWMrIi12ZXJ0aWNhbCImJmFkKGEsInZlcnRpY2FsIil9Owp2YXIgWmM9ZnVuY3Rpb24oYSxiKXtpZihiKWZvcih2YXIgYz1iLmZpcnN0Q2hpbGQsZDtjJiZjLnBhcmVudE5vZGU9PWI7KXtkPWMubmV4dFNpYmxpbmc7aWYoMT09Yy5ub2RlVHlwZSl7YTp7dmFyIGU9YztxKGUpO2U9RChlKTtmb3IodmFyIGY9MCxnPWUubGVuZ3RoO2Y8ZztmKyspe3ZhciBrPWVbZl07aWYoaz1rIGluIFVjP1VjW2tdKCk6bnVsbCl7ZT1rO2JyZWFrIGF9fWU9bnVsbH1lJiYoZS5hPWMsYS5pc0VuYWJsZWQoKXx8ZS5aKCExKSxhLnNhKGUpLFBjKGUsYykpfWVsc2UgYy5ub2RlVmFsdWUmJiIiIT1NYShjLm5vZGVWYWx1ZSl8fGIucmVtb3ZlQ2hpbGQoYyk7Yz1kfX0sYmQ9ZnVuY3Rpb24oYSxiKXtiPWIuZigpO3EoYiwiVGhlIGNvbnRhaW5lciBET00gZWxlbWVudCBjYW5ub3QgYmUgbnVsbC4iKTtIYyhiLHgpO3YmJihiLmhpZGVGb2N1cz0hMCk7KGE9YS5oKSYmdmIoYixhKX07WGMucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKWGMucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5iKCksYz1bYiwiaG9yaXpvbnRhbCI9PWEuSD9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgTT1mdW5jdGlvbigpe30sY2Q7ZGEoTSk7dmFyIGRkPXtidXR0b246InByZXNzZWQiLGNoZWNrYm94OiJjaGVja2VkIixtZW51aXRlbToic2VsZWN0ZWQiLG1lbnVpdGVtY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtcmFkaW86ImNoZWNrZWQiLHJhZGlvOiJjaGVja2VkIix0YWI6InNlbGVjdGVkIix0cmVlaXRlbToic2VsZWN0ZWQifTtNLnByb3RvdHlwZS5oPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLmouYigiRElWIixlZCh0aGlzLGEpLmpvaW4oIiAiKSxhLmJhKX07dmFyIGdkPWZ1bmN0aW9uKGEsYixjKXtpZihhPWEuZj9hLmYoKTphKXt2YXIgZD1bYl07diYmIUEoIjciKSYmKGQ9ZmQoRChhKSxiKSxkLnB1c2goYikpOyhjP0ZiOkhiKShhLGQpfX07Ck0ucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiKXtiLmlkJiZNYyhhLGIuaWQpO2ImJmIuZmlyc3RDaGlsZD9oZChhLGIuZmlyc3RDaGlsZC5uZXh0U2libGluZz9KYShiLmNoaWxkTm9kZXMpOmIuZmlyc3RDaGlsZCk6YS5iYT1udWxsO3ZhciBjPTAsZD10aGlzLmEoKSxlPXRoaXMuYSgpLGY9ITEsZz0hMSxrPSExLHA9SmEoRChiKSk7cihwLGZ1bmN0aW9uKEIpe2Z8fEIhPWQ/Z3x8QiE9ZT9jfD1pZCh0aGlzLEIpOmc9ITA6KGY9ITAsZT09ZCYmKGc9ITApKTsxPT1pZCh0aGlzLEIpJiYoQWEoYiksc2IoYikmJnRiKGIpJiZyYihiLCExKSl9LHRoaXMpO2Eubz1jO2Z8fChwLnB1c2goZCksZT09ZCYmKGc9ITApKTtnfHxwLnB1c2goZSk7KGE9YS53YSkmJnAucHVzaC5hcHBseShwLGEpO2lmKHYmJiFBKCI3Iikpe3ZhciB3PWZkKHApOzA8dy5sZW5ndGgmJihwLnB1c2guYXBwbHkocCx3KSxrPSEwKX1mJiZnJiYhYSYmIWt8fENiKGIscC5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIGpkPWZ1bmN0aW9uKGEsYil7aWYoYT1hLmgoKSl7cShiLCJUaGUgZWxlbWVudCBwYXNzZWQgYXMgYSBmaXJzdCBwYXJhbWV0ZXIgY2Fubm90IGJlIG51bGwuIik7dmFyIGM9Yi5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDthIT1jJiZ2YihiLGEpfX0sa2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYztpZihhLnYmMzImJihjPWEuZigpKSl7aWYoIWImJmEubyYzMil7dHJ5e2MuYmx1cigpfWNhdGNoKGQpe31hLm8mMzImJmEuRmEobnVsbCl9KHNiKGMpJiZ0YihjKSkhPWImJnJiKGMsYil9fSxsZD1mdW5jdGlvbihhLGIsYyl7Y2R8fChjZD17MToiZGlzYWJsZWQiLDg6InNlbGVjdGVkIiwxNjoiY2hlY2tlZCIsNjQ6ImV4cGFuZGVkIn0pO3EoYSwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO2I9Y2RbYl07dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDtkJiYoZD1kZFtkXXx8YixiPSJjaGVja2VkIj09Ynx8InNlbGVjdGVkIj09CmI/ZDpiKTtiJiZ4YihhLGIsYyl9O00ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250cm9sIn07CnZhciBlZD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuYSgpLGQ9W2NdLGU9YS5hKCk7ZSE9YyYmZC5wdXNoKGUpO2M9Yi5vO2ZvcihlPVtdO2M7KXt2YXIgZj1jJi1jO2UucHVzaChtZChhLGYpKTtjJj1+Zn1kLnB1c2guYXBwbHkoZCxlKTsoYT1iLndhKSYmZC5wdXNoLmFwcGx5KGQsYSk7diYmIUEoIjciKSYmZC5wdXNoLmFwcGx5KGQsZmQoZCkpO3JldHVybiBkfSxmZD1mdW5jdGlvbihhLGIpe3ZhciBjPVtdO2ImJihhPUlhKGEsW2JdKSk7cihbXSxmdW5jdGlvbihkKXshRmEoZCxsYShHYSxhKSl8fGImJiFHYShkLGIpfHxjLnB1c2goZC5qb2luKCJfIikpfSk7cmV0dXJuIGN9LG1kPWZ1bmN0aW9uKGEsYil7YS5ifHxuZChhKTtyZXR1cm4gYS5iW2JdfSxpZD1mdW5jdGlvbihhLGIpe2Euanx8KGEuYnx8bmQoYSksYS5qPXNhKGEuYikpO2E9cGFyc2VJbnQoYS5qW2JdLDEwKTtyZXR1cm4gaXNOYU4oYSk/MDphfSxuZD1mdW5jdGlvbihhKXt2YXIgYj1hLmEoKSxjPSF0KGIucmVwbGFjZSgvXHhhMHxccy9nLAoiICIpLCIgIik7cShjLCJDb250cm9sUmVuZGVyZXIgaGFzIGFuIGludmFsaWQgY3NzIGNsYXNzOiAnIitiKyInIik7YS5iPXsxOmIrIi1kaXNhYmxlZCIsMjpiKyItaG92ZXIiLDQ6YisiLWFjdGl2ZSIsODpiKyItc2VsZWN0ZWQiLDE2OmIrIi1jaGVja2VkIiwzMjpiKyItZm9jdXNlZCIsNjQ6YisiLW9wZW4ifX07dmFyIE49ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO2lmKCFiKXtiPXRoaXMuY29uc3RydWN0b3I7Zm9yKHZhciBkO2I7KXtkPWJbamFdfHwoYltqYV09KytrYSk7aWYoZD1XY1tkXSlicmVhaztiPWIuaT9iLmkuY29uc3RydWN0b3I6bnVsbH1iPWQ/aWEoZC5SKT9kLlIoKTpuZXcgZDpudWxsfXRoaXMuQj1iO3RoaXMuYmE9dm9pZCAwIT09YT9hOm51bGx9O24oTixLKTtoPU4ucHJvdG90eXBlO2guYmE9bnVsbDtoLm89MDtoLnY9Mzk7aC5LPTA7aC5JYT0hMDtoLndhPW51bGw7aC55YT0hMDtoLmlhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CLmModGhpcyk7dGhpcy5hPWE7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmeGIoYSwiaGlkZGVuIiwhMCkpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hPXRoaXMuQi5nKHRoaXMsYSk7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5JYT0ibm9uZSIhPWEuc3R5bGUuZGlzcGxheX07CmguRD1mdW5jdGlvbigpe04uaS5ELmNhbGwodGhpcyk7dmFyIGE9TmModGhpcyk7cSh0aGlzKTtxKGEpO3RoaXMuaXNWaXNpYmxlKCl8fHhiKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fGxkKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy52JjgmJmxkKGEsOCwhISh0aGlzLm8mOCkpO3RoaXMudiYxNiYmbGQoYSwxNiwhISh0aGlzLm8mMTYpKTt0aGlzLnYmNjQmJmxkKGEsNjQsISEodGhpcy5vJjY0KSk7YT10aGlzLkI7U2ModGhpcykmJmdkKHRoaXMuZigpLGEuYSgpKyItcnRsIiwhMCk7dGhpcy5pc0VuYWJsZWQoKSYma2QodGhpcyx0aGlzLmlzVmlzaWJsZSgpKTtpZih0aGlzLnYmLTImJih0aGlzLnlhJiZvZCh0aGlzLCEwKSx0aGlzLnYmMzImJihhPXRoaXMuZigpKSkpe3ZhciBiPXRoaXMuV3x8KHRoaXMuVz1uZXcgSik7emMoYixhKTtIKEgoSChPYyh0aGlzKSxiLCJrZXkiLHRoaXMuZmEpLGEsImZvY3VzIix0aGlzLk5hKSxhLCJibHVyIiwKdGhpcy5GYSl9fTt2YXIgb2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYz1PYyhhKSxkPWEuZigpO2I/KEgoSChIKEgoYyxkLEYuTCxhLmthKSxkLFtGLk0sRi5hYV0sYS5sYSksZCwibW91c2VvdmVyIixhLkFhKSxkLCJtb3VzZW91dCIsYS56YSksYS5lYSE9Y2EmJkgoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fEgoYyxkLCJkYmxjbGljayIsYS5KYSksYS5nYXx8KGEuZ2E9bmV3IHBkKGEpLHpiKGEsbGEoQWIsYS5nYSkpKSkpOihxYyhxYyhxYyhxYyhjLGQsRi5MLGEua2EpLGQsW0YuTSxGLmFhXSxhLmxhKSxkLCJtb3VzZW92ZXIiLGEuQWEpLGQsIm1vdXNlb3V0IixhLnphKSxhLmVhIT1jYSYmcWMoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fHFjKGMsZCwiZGJsY2xpY2siLGEuSmEpLEFiKGEuZ2EpLGEuZ2E9bnVsbCkpfTsKTi5wcm90b3R5cGUuUD1mdW5jdGlvbigpe04uaS5QLmNhbGwodGhpcyk7dGhpcy5XJiZGYyh0aGlzLlcpO3RoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJmtkKHRoaXMsITEpfTtOLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7Ti5pLnUuY2FsbCh0aGlzKTt0aGlzLlcmJih0aGlzLlcuTigpLGRlbGV0ZSB0aGlzLlcpO2RlbGV0ZSB0aGlzLkI7dGhpcy5nYT10aGlzLndhPXRoaXMuYmE9bnVsbH07dmFyIGhkPWZ1bmN0aW9uKGEsYil7YS5iYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm8mMSl9OwpOLnByb3RvdHlwZS5aPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYjtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0VuYWJsZWQmJiFiLmlzRW5hYmxlZCgpfHwhTyh0aGlzLDEsIWEpfHwoYXx8KHFkKHRoaXMsITEpLFAodGhpcywhMSkpLHRoaXMuaXNWaXNpYmxlKCkmJmtkKHRoaXMsYSksUSh0aGlzLDEsIWEsITApKX07CnZhciBQPWZ1bmN0aW9uKGEsYil7TyhhLDIsYikmJlEoYSwyLGIpfSxxZD1mdW5jdGlvbihhLGIpe08oYSw0LGIpJiZRKGEsNCxiKX0scmQ9ZnVuY3Rpb24oYSxiKXtPKGEsOCxiKSYmUShhLDgsYil9LHNkPWZ1bmN0aW9uKGEsYil7TyhhLDY0LGIpJiZRKGEsNjQsYil9LFE9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIWQmJjE9PWIpYS5aKCFjKTtlbHNlIGlmKGEudiZiJiZjIT0hIShhLm8mYikpe3ZhciBlPWEuQjtpZihkPWEuZigpKShlPW1kKGUsYikpJiZnZChhLGUsYyksbGQoZCxiLGMpO2Eubz1jP2Eub3xiOmEubyZ+Yn19LHRkPWZ1bmN0aW9uKGEsYixjKXtpZihhLm0mJmEubyZiJiYhYyl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTshYyYmYS5vJmImJlEoYSxiLCExKTthLnY9Yz9hLnZ8YjphLnYmfmJ9LFI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hISgyNTUmYikmJiEhKGEudiZiKX0sTz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuISEoYS52JmIpJiYhIShhLm8mCmIpIT1jJiYoIShhLksmYil8fHVjKGEsS2MoYixjKSkpJiYhYS5VfTtoPU4ucHJvdG90eXBlO2guQWE9ZnVuY3Rpb24oYSl7KCFhLnJlbGF0ZWRUYXJnZXR8fCFwYih0aGlzLmYoKSxhLnJlbGF0ZWRUYXJnZXQpKSYmdWModGhpcywiZW50ZXIiKSYmdGhpcy5pc0VuYWJsZWQoKSYmUih0aGlzLDIpJiZQKHRoaXMsITApfTtoLnphPWZ1bmN0aW9uKGEpe2EucmVsYXRlZFRhcmdldCYmcGIodGhpcy5mKCksYS5yZWxhdGVkVGFyZ2V0KXx8IXVjKHRoaXMsImxlYXZlIil8fChSKHRoaXMsNCkmJnFkKHRoaXMsITEpLFIodGhpcywyKSYmUCh0aGlzLCExKSl9O2guZWE9Y2E7Cmgua2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSxPYihhKSYmISh5JiZ6JiZhLmN0cmxLZXkpKSl7Uih0aGlzLDQpJiZxZCh0aGlzLCEwKTt2YXIgYjtpZihiPXRoaXMuQil7dmFyIGM7Yj10aGlzLnYmMzImJihjPXRoaXMuZigpKT9zYihjKSYmdGIoYyk6ITF9YiYmdGhpcy5mKCkuZm9jdXMoKX0hT2IoYSl8fHkmJnomJmEuY3RybEtleXx8YS5nKCl9O2gubGE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSx0aGlzLm8mNCYmdWQodGhpcyxhKSYmUih0aGlzLDQpJiZxZCh0aGlzLCExKSl9O2guSmE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmdWQodGhpcyxhKX07CnZhciB1ZD1mdW5jdGlvbihhLGIpe2lmKFIoYSwxNikpe3ZhciBjPSEoYS5vJjE2KTtPKGEsMTYsYykmJlEoYSwxNixjKX1SKGEsOCkmJnJkKGEsITApO1IoYSw2NCkmJnNkKGEsIShhLm8mNjQpKTtjPW5ldyBFKCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuQT1iLkEpO3JldHVybiB1YyhhLGMpfTtOLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe1IodGhpcywzMikmJk8odGhpcywzMiwhMCkmJlEodGhpcywzMiwhMCl9O04ucHJvdG90eXBlLkZhPWZ1bmN0aW9uKCl7Uih0aGlzLDQpJiZxZCh0aGlzLCExKTtSKHRoaXMsMzIpJiZPKHRoaXMsMzIsITEpJiZRKHRoaXMsMzIsITEpfTsKTi5wcm90b3R5cGUuZmE9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJjEzPT1hLmMmJnVkKHRoaXMsYSk/KGEuZygpLGEuaigpLCEwKTohMX07aWYoIWlhKE4pKXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBjbGFzcyAiK04pO2lmKCFpYShNKSl0aHJvdyBFcnJvcigiSW52YWxpZCByZW5kZXJlciBjbGFzcyAiK00pO3ZhciB2ZD1OW2phXXx8KE5bamFdPSsra2EpO1djW3ZkXT1NO1ZjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIHBkPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9ITE7dGhpcy5jPW5ldyBvYyh0aGlzKTt6Yih0aGlzLGxhKEFiLHRoaXMuYykpO2E9TmModGhpcy5iKTtIKEgoSCh0aGlzLmMsYSxGLkwsdGhpcy5oKSxhLEYuTSx0aGlzLmopLGEsImNsaWNrIix0aGlzLmcpfTtuKHBkLEMpO3ZhciB3ZD0hdnx8OTw9TnVtYmVyKGliKTsKcGQucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXt0aGlzLmE9ITF9O3BkLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7dGhpcy5hPSEwfTt2YXIgeGQ9ZnVuY3Rpb24oYSxiKXtpZighd2QpcmV0dXJuIGEuYnV0dG9uPTAsYS50eXBlPWIsYTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudHMiKTtjLmluaXRNb3VzZUV2ZW50KGIsYS5idWJibGVzLGEuY2FuY2VsYWJsZSxhLnZpZXd8fG51bGwsYS5kZXRhaWwsYS5zY3JlZW5YLGEuc2NyZWVuWSxhLmNsaWVudFgsYS5jbGllbnRZLGEuY3RybEtleSxhLmFsdEtleSxhLnNoaWZ0S2V5LGEubWV0YUtleSwwLGEucmVsYXRlZFRhcmdldHx8bnVsbCk7cmV0dXJuIGN9OwpwZC5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXtpZih0aGlzLmEpdGhpcy5hPSExO2Vsc2V7dmFyIGI9YS5iLGM9Yi5idXR0b24sZD1iLnR5cGUsZT14ZChiLCJtb3VzZWRvd24iKTt0aGlzLmIua2EobmV3IEcoZSxhLmEpKTtlPXhkKGIsIm1vdXNldXAiKTt0aGlzLmIubGEobmV3IEcoZSxhLmEpKTt3ZHx8KGIuYnV0dG9uPWMsYi50eXBlPWQpfX07cGQucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt0aGlzLmI9bnVsbDtwZC5pLnUuY2FsbCh0aGlzKX07dmFyIFM9ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO3RoaXMuZGE9Ynx8WGMuUigpO3RoaXMuSD1hfHwidmVydGljYWwifTtuKFMsSyk7aD1TLnByb3RvdHlwZTtoLkRhPW51bGw7aC5jYT1udWxsO2guZGE9bnVsbDtoLkg9bnVsbDtoLlQ9ITA7aC5PPSEwO2gubD0tMTtoLnM9bnVsbDtoLlY9ITE7aC5JPW51bGw7dmFyIHlkPWZ1bmN0aW9uKGEpe3JldHVybiBhLkRhfHxhLmYoKX07aD1TLnByb3RvdHlwZTtoLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPXRoaXMuai5iKCJESVYiLHRoaXMuZGEuYyh0aGlzKS5qb2luKCIgIikpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKGEpe3JldHVybiJESVYiPT1hLnRhZ05hbWV9O2gudmE9ZnVuY3Rpb24oYSl7dGhpcy5hPSRjKHRoaXMuZGEsdGhpcyxhKTsibm9uZSI9PWEuc3R5bGUuZGlzcGxheSYmKHRoaXMuVD0hMSl9OwpoLkQ9ZnVuY3Rpb24oKXtTLmkuRC5jYWxsKHRoaXMpO1FjKHRoaXMsZnVuY3Rpb24oYil7Yi5tJiZ6ZCh0aGlzLGIpfSx0aGlzKTt2YXIgYT10aGlzLmYoKTtiZCh0aGlzLmRhLHRoaXMpO0FkKHRoaXMsdGhpcy5UKTtIKEgoSChIKEgoSChIKEgoT2ModGhpcyksdGhpcywiZW50ZXIiLHRoaXMuV2EpLHRoaXMsImhpZ2hsaWdodCIsdGhpcy5YYSksdGhpcywidW5oaWdobGlnaHQiLHRoaXMuY2IpLHRoaXMsIm9wZW4iLHRoaXMuWWEpLHRoaXMsImNsb3NlIix0aGlzLlVhKSxhLEYuTCx0aGlzLlNhKSxxYihhKSxbRi5NLEYuYWFdLHRoaXMuVmEpLGEsW0YuTCxGLk0sRi5hYSwibW91c2VvdmVyIiwibW91c2VvdXQiLCJjb250ZXh0bWVudSJdLHRoaXMuVGEpO0JkKHRoaXMpfTt2YXIgQmQ9ZnVuY3Rpb24oYSl7dmFyIGI9T2MoYSksYz15ZChhKTtIKEgoSChiLGMsImZvY3VzIixhLkhhKSxjLCJibHVyIixhLlFhKSxhLmNhfHwoYS5jYT1uZXcgSih5ZChhKSkpLCJrZXkiLGEuUmEpfTtoPVMucHJvdG90eXBlOwpoLlA9ZnVuY3Rpb24oKXtDZCh0aGlzLC0xKTt0aGlzLnMmJnNkKHRoaXMucywhMSk7dGhpcy5WPSExO1MuaS5QLmNhbGwodGhpcyl9O2gudT1mdW5jdGlvbigpe1MuaS51LmNhbGwodGhpcyk7dGhpcy5jYSYmKHRoaXMuY2EuTigpLHRoaXMuY2E9bnVsbCk7dGhpcy5kYT10aGlzLnM9dGhpcy5JPXRoaXMuRGE9bnVsbH07aC5XYT1mdW5jdGlvbigpe3JldHVybiEwfTsKaC5YYT1mdW5jdGlvbihhKXt2YXIgYj1UYyh0aGlzLGEudGFyZ2V0KTtpZigtMTxiJiZiIT10aGlzLmwpe3ZhciBjPUwodGhpcyx0aGlzLmwpO2MmJlAoYywhMSk7dGhpcy5sPWI7Yz1MKHRoaXMsdGhpcy5sKTt0aGlzLlYmJnFkKGMsITApO3RoaXMucyYmYyE9dGhpcy5zJiYoYy52JjY0P3NkKGMsITApOnNkKHRoaXMucywhMSkpfWI9dGhpcy5mKCk7cShiLCJUaGUgRE9NIGVsZW1lbnQgZm9yIHRoZSBjb250YWluZXIgY2Fubm90IGJlIG51bGwuIik7bnVsbCE9YS50YXJnZXQuZigpJiZ4YihiLCJhY3RpdmVkZXNjZW5kYW50IixhLnRhcmdldC5mKCkuaWQpfTtoLmNiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT1MKHRoaXMsdGhpcy5sKSYmKHRoaXMubD0tMSk7YT10aGlzLmYoKTtxKGEsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnJlbW92ZUF0dHJpYnV0ZSh3YigiYWN0aXZlZGVzY2VuZGFudCIpKX07CmguWWE9ZnVuY3Rpb24oYSl7KGE9YS50YXJnZXQpJiZhIT10aGlzLnMmJmEuYj09dGhpcyYmKHRoaXMucyYmc2QodGhpcy5zLCExKSx0aGlzLnM9YSl9O2guVWE9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMucyYmKHRoaXMucz1udWxsKTt2YXIgYj10aGlzLmYoKSxjPWEudGFyZ2V0LmYoKTtiJiZhLnRhcmdldC5vJjImJmMmJihhPSIiLGMmJihhPWMuaWQscShhLCJUaGUgYWN0aXZlIGVsZW1lbnQgc2hvdWxkIGhhdmUgYW4gaWQuIikpLHhiKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEpKX07aC5TYT1mdW5jdGlvbihhKXt0aGlzLk8mJih0aGlzLlY9ITApO3ZhciBiPXlkKHRoaXMpO2ImJnNiKGIpJiZ0YihiKT9iLmZvY3VzKCk6YS5nKCl9O2guVmE9ZnVuY3Rpb24oKXt0aGlzLlY9ITF9OwpoLlRhPWZ1bmN0aW9uKGEpe2E6e3ZhciBiPWEudGFyZ2V0O2lmKHRoaXMuSSlmb3IodmFyIGM9dGhpcy5mKCk7YiYmYiE9PWM7KXt2YXIgZD1iLmlkO2lmKGQgaW4gdGhpcy5JKXtiPXRoaXMuSVtkXTticmVhayBhfWI9Yi5wYXJlbnROb2RlfWI9bnVsbH1pZihiKXN3aXRjaChhLnR5cGUpe2Nhc2UgRi5MOmIua2EoYSk7YnJlYWs7Y2FzZSBGLk06Y2FzZSBGLmFhOmIubGEoYSk7YnJlYWs7Y2FzZSAibW91c2VvdmVyIjpiLkFhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3V0IjpiLnphKGEpO2JyZWFrO2Nhc2UgImNvbnRleHRtZW51IjpiLmVhKGEpfX07aC5IYT1mdW5jdGlvbigpe307aC5RYT1mdW5jdGlvbigpe0NkKHRoaXMsLTEpO3RoaXMuVj0hMTt0aGlzLnMmJnNkKHRoaXMucywhMSl9OwpoLlJhPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmlzRW5hYmxlZCgpJiZ0aGlzLmlzVmlzaWJsZSgpJiYoMCE9UmModGhpcyl8fHRoaXMuRGEpJiZEZCh0aGlzLGEpPyhhLmcoKSxhLmooKSwhMCk6ITF9Owp2YXIgRGQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1MKGEsYS5sKTtpZihjJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5mYSYmYy5mYShiKXx8YS5zJiZhLnMhPWMmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLnMuZmEmJmEucy5mYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuYyl7Y2FzZSAyNzp5ZChhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpFZChhKTticmVhaztjYXNlIDM1OkZkKGEpO2JyZWFrO2Nhc2UgMzg6aWYoInZlcnRpY2FsIj09YS5IKUdkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9IZChhKTpHZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoInZlcnRpY2FsIj09YS5IKUhkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9HZChhKTpIZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSx6ZD1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZigpO2M9Yy5pZHx8KGMuaWQ9TGMoYikpO2EuSXx8KGEuST17fSk7YS5JW2NdPWJ9O1MucHJvdG90eXBlLnNhPWZ1bmN0aW9uKGEsYil7Q2EoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtTLmkuc2EuY2FsbCh0aGlzLGEsYil9O1MucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEsYixjKXtDYShhLE4pO2EuS3w9MjthLkt8PTY0O3RkKGEsMzIsITEpO2EubSYmMCE9YS55YSYmb2QoYSwhMSk7YS55YT0hMTt2YXIgZD1hLmI9PXRoaXM/VGModGhpcyxhKTotMTtTLmkudGEuY2FsbCh0aGlzLGEsYixjKTthLm0mJnRoaXMubSYmemQodGhpcyxhKTthPWQ7LTE9PWEmJihhPVJjKHRoaXMpKTthPT10aGlzLmw/dGhpcy5sPU1hdGgubWluKFJjKHRoaXMpLTEsYik6YT50aGlzLmwmJmI8PXRoaXMubD90aGlzLmwrKzphPHRoaXMubCYmYj50aGlzLmwmJnRoaXMubC0tfTsKdmFyIGFkPWZ1bmN0aW9uKGEsYil7aWYoYS5mKCkpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5IPWJ9O1MucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O3ZhciBBZD1mdW5jdGlvbihhLGIpe2EuVD1iO3ZhciBjPWEuZigpO2MmJihjLnN0eWxlLmRpc3BsYXk9Yj8iIjoibm9uZSIsWWMoeWQoYSksYS5PJiZhLlQpKX07Uy5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT307Uy5wcm90b3R5cGUuWj1mdW5jdGlvbihhKXt0aGlzLk8hPWEmJnVjKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5PPSEwLFFjKHRoaXMsZnVuY3Rpb24oYil7Yi5MYT9kZWxldGUgYi5MYTpiLlooITApfSkpOihRYyh0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5aKCExKTpiLkxhPSEwfSksdGhpcy5WPXRoaXMuTz0hMSksWWMoeWQodGhpcyksYSYmdGhpcy5UKSl9Owp2YXIgQ2Q9ZnVuY3Rpb24oYSxiKXsoYj1MKGEsYikpP1AoYiwhMCk6LTE8YS5sJiZQKEwoYSxhLmwpLCExKX0sRWQ9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LFJjKGEpLTEpfSxGZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiAwPmI/Yy0xOmJ9LDApfSxIZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7cmV0dXJuKGIrMSklY30sYS5sKX0sR2Q9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe2ItLTtyZXR1cm4gMD5iP2MtMTpifSxhLmwpfSxJZD1mdW5jdGlvbihhLGIsYyl7Yz0wPmM/VGMoYSxhLnMpOmM7dmFyIGQ9UmMoYSk7Yz1iLmNhbGwoYSxjLGQpO2Zvcih2YXIgZT0wO2U8PWQ7KXt2YXIgZj1MKGEsYyksZztpZihnPWYpZz1mLmlzVmlzaWJsZSgpJiZmLmlzRW5hYmxlZCgpJiYhIShmLnYmMik7aWYoZyl7YS5FYShjKTticmVha31lKys7Yz1iLmNhbGwoYSxjLGQpfX07ClMucHJvdG90eXBlLkVhPWZ1bmN0aW9uKGEpe0NkKHRoaXMsYSl9O3ZhciBUPWZ1bmN0aW9uKCl7fTtuKFQsTSk7ZGEoVCk7VC5wcm90b3R5cGUuYT1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYiJ9O1QucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXtyZXR1cm4idGFiIn07VC5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYj1ULmkuYy5jYWxsKHRoaXMsYSk7KGE9YS5QYSkmJmImJihiLnRpdGxlPWF8fCIiKTtyZXR1cm4gYn07VC5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIpe2I9VC5pLmcuY2FsbCh0aGlzLGEsYik7dmFyIGM9Yi50aXRsZXx8IiI7YyYmKGEuUGE9Yyk7YS5vJjgmJihjPWEuYikmJmlhKGMuRykmJihRKGEsOCwhMSksYy5HKGEpKTtyZXR1cm4gYn07dmFyIEpkPWZ1bmN0aW9uKGEsYixjKXtOLmNhbGwodGhpcyxhLGJ8fFQuUigpLGMpO3RkKHRoaXMsOCwhMCk7dGhpcy5LfD05fTtuKEpkLE4pO1ZjKCJnb29nLXRhYiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEpkKG51bGwpfSk7dmFyIFU9ZnVuY3Rpb24oKXt0aGlzLmg9InRhYmxpc3QifTtuKFUsWGMpO2RhKFUpO1UucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWItYmFyIn07VS5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIsYyl7dGhpcy5qfHwodGhpcy5hfHxLZCh0aGlzKSx0aGlzLmo9c2EodGhpcy5hKSk7dmFyIGQ9dGhpcy5qW2JdO2Q/KGFkKGEsTGQoZCkpLGEuQj1kKTpVLmkuZy5jYWxsKHRoaXMsYSxiLGMpfTtVLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPVUuaS5jLmNhbGwodGhpcyxhKTt0aGlzLmF8fEtkKHRoaXMpO2IucHVzaCh0aGlzLmFbYS5CXSk7cmV0dXJuIGJ9O3ZhciBLZD1mdW5jdGlvbihhKXt2YXIgYj1hLmIoKTthLmE9e3RvcDpiKyItdG9wIixib3R0b206YisiLWJvdHRvbSIsc3RhcnQ6YisiLXN0YXJ0IixlbmQ6YisiLWVuZCJ9fTt2YXIgVj1mdW5jdGlvbihhLGIsYyl7YT1hfHwidG9wIjthZCh0aGlzLExkKGEpKTt0aGlzLkI9YTtTLmNhbGwodGhpcyx0aGlzLkgsYnx8VS5SKCksYyk7TWQodGhpcyl9O24oVixTKTtoPVYucHJvdG90eXBlO2guQz1udWxsO2guRD1mdW5jdGlvbigpe1YuaS5ELmNhbGwodGhpcyk7TWQodGhpcyl9O2gudT1mdW5jdGlvbigpe1YuaS51LmNhbGwodGhpcyk7dGhpcy5DPW51bGx9O2guRWE9ZnVuY3Rpb24oYSl7Vi5pLkVhLmNhbGwodGhpcyxhKTt0aGlzLkcoTCh0aGlzLGEpKX07aC5HPWZ1bmN0aW9uKGEpe2E/cmQoYSwhMCk6dGhpcy5DJiZyZCh0aGlzLkMsITEpfTsKdmFyIE5kPWZ1bmN0aW9uKGEsYil7aWYoYiYmYj09YS5DKXtmb3IodmFyIGM9VGMoYSxiKSxkPWMtMTtiPUwoYSxkKTtkLS0pe3ZhciBlPWI7aWYoZS5pc1Zpc2libGUoKSYmZS5pc0VuYWJsZWQoKSl7YS5HKGIpO3JldHVybn19Zm9yKGMrPTE7Yj1MKGEsYyk7YysrKWlmKGQ9YixkLmlzVmlzaWJsZSgpJiZkLmlzRW5hYmxlZCgpKXthLkcoYik7cmV0dXJufWEuRyhudWxsKX19O2g9Vi5wcm90b3R5cGU7aC5hYj1mdW5jdGlvbihhKXt0aGlzLkMmJnRoaXMuQyE9YS50YXJnZXQmJnJkKHRoaXMuQywhMSk7dGhpcy5DPWEudGFyZ2V0fTtoLmJiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT10aGlzLkMmJih0aGlzLkM9bnVsbCl9O2guWmE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guJGE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guSGE9ZnVuY3Rpb24oKXtMKHRoaXMsdGhpcy5sKXx8Q2QodGhpcyxUYyh0aGlzLHRoaXMuQ3x8TCh0aGlzLDApKSl9Owp2YXIgTWQ9ZnVuY3Rpb24oYSl7SChIKEgoSChPYyhhKSxhLCJzZWxlY3QiLGEuYWIpLGEsInVuc2VsZWN0IixhLmJiKSxhLCJkaXNhYmxlIixhLlphKSxhLCJoaWRlIixhLiRhKX0sTGQ9ZnVuY3Rpb24oYSl7cmV0dXJuInN0YXJ0Ij09YXx8ImVuZCI9PWE/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O1ZjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBWfSk7ZnVuY3Rpb24gT2QoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIFBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgZz1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIrZyk7Zm9yKHZhciBrPVtdLHA9YmEoYyksdz1wLm5leHQoKTshdy5kb25lO3c9cC5uZXh0KCkpe3c9dy52YWx1ZTt2YXIgQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKQi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO0IudGV4dENvbnRlbnQ9dztmLmFwcGVuZENoaWxkKEIpO2sucHVzaChCKX0iYm90dG9tIiE9ZyYmZS5hcHBlbmRDaGlsZChmKTtwPW51bGw7aWYoInRvcCI9PWd8fCJib3R0b20iPT1nKXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTsidG9wIj09ZyYmcCYmZS5hcHBlbmRDaGlsZChwKTtCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0IuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciByYT1bXTtjPWJhKGMpO2Zvcih3PWMubmV4dCgpOyF3LmRvbmU7dz1jLm5leHQoKSl3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHcuaWQ9ZS5pZCsiX2NvbnRlbnRfIityYS5sZW5ndGgsdy5zdHlsZS5kaXNwbGF5PSJub25lIixCLmFwcGVuZENoaWxkKHcpLHJhLnB1c2godyk7ZS5hcHBlbmRDaGlsZChCKTsiYm90dG9tIj09ZyYmKHAmJgplLmFwcGVuZENoaWxkKHApLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBYPW5ldyBWKGcpO1BjKFgsZik7dmFyIFk9LTE7ZGMoWCwic2VsZWN0IixmdW5jdGlvbihaKXtaPWsuaW5kZXhPZihaLnRhcmdldC5mKCkpO1ohPVkmJigwPD1ZJiZZPHJhLmxlbmd0aCYmKHJhW1ldLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFk9LTEpLDA8PVomJlo8cmEubGVuZ3RoJiYoWT1aLHJhW1ldLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksWC5HKEwoWCxZKSkpfSk7WC5HKEwoWCxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFope1guRyhMKFgsWikpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChPZChhKSl9LFFkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sVz1sOwpRZFswXWluIFd8fCJ1bmRlZmluZWQiPT10eXBlb2YgVy5leGVjU2NyaXB0fHxXLmV4ZWNTY3JpcHQoInZhciAiK1FkWzBdKTtmb3IodmFyIFJkO1FkLmxlbmd0aCYmKFJkPVFkLnNoaWZ0KCkpOylRZC5sZW5ndGh8fHZvaWQgMD09PVBkP1dbUmRdJiZXW1JkXSE9PU9iamVjdC5wcm90b3R5cGVbUmRdP1c9V1tSZF06Vz1XW1JkXT17fTpXW1JkXT1QZDt9KS5jYWxsKHRoaXMpOwovLyBjbGFuZy1mb3JtYXQgb24K", + "headers": [ + [ + "content-type", + "application/javascript" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + } + } + }, + "executionInfo": { + "elapsed": 17869, + "status": "ok", + "timestamp": 1600709625637, + "user": { + "displayName": "Evgeny Skvortsov", + "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhiQjODaOVLfYnUuWS9rB3LRntzJDM0hqElzsUkdQ=s64", + "userId": "11510585406840398626" + }, + "user_tz": 420 + }, + "id": "JtMLLq0CnG-Y", + "outputId": "9baf1007-78fd-4364-c774-bd3bf319630a" + }, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id24" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id24" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id24" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"989406cc-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id24\", \"tabNames\": [\"OutsideOfCalifornia\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_8261de5361" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id24" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"98943eb2-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id24\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_2ff9a509fa" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id24" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"98958b64-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_2112b406ed" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_1", + "outputarea_id24" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9895d4ca-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id24_content_1\");\n", + "//# sourceURL=js_9aba7aff2a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_1", + "outputarea_id24" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"98961d5e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9895d4ca-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_3342da7071" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_1", + "outputarea_id24" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9896684a-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id24\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_e6e909f86a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_1", + "outputarea_id24" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running OutsideOfCalifornia\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"989a7fd4-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"98958b64-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_de891b95da" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_1", + "outputarea_id24" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"989bff80-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_370eaf1c0d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_0", + "outputarea_id24" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"989c4eea-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id24_content_0\");\n", + "//# sourceURL=js_ea1e08a2c7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_0", + "outputarea_id24" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"989c9616-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"989c4eea-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_d4729ff5c9" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_0", + "outputarea_id24" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"989cdf72-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id24\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_8fb83d37bc" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_0", + "outputarea_id24" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_0", + "outputarea_id24", + "outputarea_id25", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_0", + "outputarea_id24", + "outputarea_id25", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_0", + "outputarea_id24", + "outputarea_id25", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"989ead8e-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id25\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_8485de51eb" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_0", + "outputarea_id24", + "outputarea_id25", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"989efe74-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id25\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_921f749dd0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_0", + "outputarea_id24", + "outputarea_id25", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"98a03e38-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_3f556190fe" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_0", + "id25_content_0", + "outputarea_id24", + "outputarea_id25", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"98a09518-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id25_content_0\");\n", + "//# sourceURL=js_dd7a1ed8b8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_0", + "id25_content_0", + "outputarea_id24", + "outputarea_id25", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"98a0dc8a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"98a09518-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_a7b5d5c281" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_0", + "id25_content_0", + "outputarea_id24", + "outputarea_id25", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"98a127c6-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id25\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_6574c50d6a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_0", + "id25_content_0", + "outputarea_id24", + "outputarea_id25", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mOutsideOfCalifornia_sql\u001b[0m variable.\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " \"Alice\" AS name,\n", + " \"Product Manager\" AS role,\n", + " \"SEA\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Bob\" AS name,\n", + " \"Engineer\" AS role,\n", + " \"SEA\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Caroline\" AS name,\n", + " \"Engineer\" AS role,\n", + " \"LAX\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"David\" AS name,\n", + " \"Data Scientist\" AS role,\n", + " \"LAX\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Eve\" AS name,\n", + " \"Data Scientist\" AS role,\n", + " \"SEA\" AS office\n", + " \n", + ") )\n", + "SELECT\n", + " Employee.name AS name\n", + "FROM\n", + " t_0_Employee AS Employee\n", + "WHERE\n", + " ((SELECT\n", + " MIN(true) AS logica_value\n", + " FROM\n", + " t_0_Employee AS t_1_Employee\n", + " WHERE\n", + " t_1_Employee.office = \"LAX\" AND\n", + " Employee.name = t_1_Employee.name) IS NULL);\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"98a23774-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"98a03e38-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_27f839ded8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_0", + "id25_content_0", + "outputarea_id24", + "outputarea_id25", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"98a3713e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"989bff80-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_f79608fe76" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_0", + "outputarea_id24" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"98a4edde-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_f529d017e2" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_1", + "outputarea_id24" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"98a5374e-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id24_content_1\");\n", + "//# sourceURL=js_a97adcb4c0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_1", + "outputarea_id24" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"98a58500-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"98a5374e-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_e693619f01" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_1", + "outputarea_id24" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"98a5cbfa-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id24\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_aa2ef64c2b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_1", + "outputarea_id24" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9933cb9e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"98a4edde-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_2c84efd68f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_1", + "outputarea_id24" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9936c718-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_a66a3fbbd3" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_0", + "outputarea_id24" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"99370dea-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id24_content_0\");\n", + "//# sourceURL=js_4d66f0689b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_0", + "outputarea_id24" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"99374daa-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"99370dea-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_4bba9e52f7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_0", + "outputarea_id24" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"99378b94-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id24\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_292037cce4" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_0", + "outputarea_id24" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"99386672-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_c75e1edb2c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_0", + "id25_content_1", + "outputarea_id24", + "outputarea_id25", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9938aa9c-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id25_content_1\");\n", + "//# sourceURL=js_c8a464712d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_0", + "id25_content_1", + "outputarea_id24", + "outputarea_id25", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9938efc0-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9938aa9c-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_1afb7aab39" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_0", + "id25_content_1", + "outputarea_id24", + "outputarea_id25", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"99393c64-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id25\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_29fc146153" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_0", + "id25_content_1", + "outputarea_id24", + "outputarea_id25", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mOutsideOfCalifornia\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
name
0Alice
1Bob
2Eve
\n", + "
" + ], + "text/plain": [ + " name\n", + "0 Alice\n", + "1 Bob\n", + "2 Eve" + ] + }, + "metadata": { + "tags": [ + "id24_content_0", + "id25_content_1", + "outputarea_id24", + "outputarea_id25", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"993c14a2-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"99386672-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_799058ca02" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_0", + "id25_content_1", + "outputarea_id24", + "outputarea_id25", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"993d743c-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9936c718-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_542e57a277" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id24_content_0", + "outputarea_id24" + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "%%logica OutsideOfCalifornia\n", + "\n", + "Employee(name: \"Alice\", role: \"Product Manager\", office: \"SEA\");\n", + "Employee(name: \"Bob\", role: \"Engineer\", office: \"SEA\");\n", + "Employee(name: \"Caroline\", role: \"Engineer\", office: \"LAX\");\n", + "Employee(name: \"David\", role: \"Data Scientist\", office: \"LAX\");\n", + "Employee(name: \"Eve\", role: \"Data Scientist\", office: \"SEA\");\n", + "\n", + "InCalifornia(name:) :- Employee(name:, office:), office == \"LAX\";\n", + "\n", + "OutsideOfCalifornia(name:) :- Employee(name:), ~InCalifornia(name:);" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "8WxKw66keWqL" + }, + "source": [ + "### Aggregation\n", + "\n", + "To run an aggregation you use the keyword `distinct` in the head of the rule. An aggregated field uses\n", + "\n", + "```\n", + "? = \n", + "\n", + "```\n", + "syntax. Keywork `distinct` must be used to trigger aggregation (there is one exception though, see 'Functions' section).\n", + "\n", + "Here is an example of a simple aggregation counting employees per role." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 239, + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH0=", + "headers": [ + [ + "content-type", + "text/css" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgaCxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9ZnVuY3Rpb24oYSl7dmFyIGI9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmYVtTeW1ib2wuaXRlcmF0b3JdO3JldHVybiBiP2IuY2FsbChhKTp7bmV4dDphYShhKX19LGw9dGhpc3x8c2VsZixjYT1mdW5jdGlvbigpe30sZGE9ZnVuY3Rpb24oYSl7YS5CYT12b2lkIDA7YS5SPWZ1bmN0aW9uKCl7cmV0dXJuIGEuQmE/YS5CYTphLkJhPW5ldyBhfX0sZWE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7aWYoIm9iamVjdCI9PWIpaWYoYSl7aWYoYSBpbnN0YW5jZW9mIEFycmF5KXJldHVybiJhcnJheSI7aWYoYSBpbnN0YW5jZW9mIE9iamVjdClyZXR1cm4gYjt2YXIgYz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk7aWYoIltvYmplY3QgV2luZG93XSI9PWMpcmV0dXJuIm9iamVjdCI7CmlmKCJbb2JqZWN0IEFycmF5XSI9PWN8fCJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGgmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5zcGxpY2UmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoInNwbGljZSIpKXJldHVybiJhcnJheSI7aWYoIltvYmplY3QgRnVuY3Rpb25dIj09Y3x8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmNhbGwmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoImNhbGwiKSlyZXR1cm4iZnVuY3Rpb24ifWVsc2UgcmV0dXJuIm51bGwiO2Vsc2UgaWYoImZ1bmN0aW9uIj09YiYmInVuZGVmaW5lZCI9PXR5cGVvZiBhLmNhbGwpcmV0dXJuIm9iamVjdCI7cmV0dXJuIGJ9LGZhPWZ1bmN0aW9uKGEpe3JldHVybiJhcnJheSI9PWVhKGEpfSxoYT1mdW5jdGlvbihhKXt2YXIgYj1lYShhKTtyZXR1cm4iYXJyYXkiPT1ifHwib2JqZWN0Ij09CmImJiJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGh9LGlhPWZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PWVhKGEpfSxtPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBhO3JldHVybiJvYmplY3QiPT1iJiZudWxsIT1hfHwiZnVuY3Rpb24iPT1ifSxqYT0iY2xvc3VyZV91aWRfIisoMUU5Kk1hdGgucmFuZG9tKCk+Pj4wKSxrYT0wLGxhPWZ1bmN0aW9uKGEsYil7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe3ZhciBkPWMuc2xpY2UoKTtkLnB1c2guYXBwbHkoZCxhcmd1bWVudHMpO3JldHVybiBhLmFwcGx5KHRoaXMsZCl9fSxuPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe31jLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLmk9Yi5wcm90b3R5cGU7YS5wcm90b3R5cGU9bmV3IGM7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YX07dmFyIG1hLG5hPXtlYjoiYWN0aXZlZGVzY2VuZGFudCIsamI6ImF0b21pYyIsa2I6ImF1dG9jb21wbGV0ZSIsbWI6ImJ1c3kiLHBiOiJjaGVja2VkIixxYjoiY29saW5kZXgiLHZiOiJjb250cm9scyIseGI6ImRlc2NyaWJlZGJ5IixBYjoiZGlzYWJsZWQiLENiOiJkcm9wZWZmZWN0IixEYjoiZXhwYW5kZWQiLEViOiJmbG93dG8iLEdiOiJncmFiYmVkIixLYjoiaGFzcG9wdXAiLE1iOiJoaWRkZW4iLE9iOiJpbnZhbGlkIixQYjoibGFiZWwiLFFiOiJsYWJlbGxlZGJ5IixSYjoibGV2ZWwiLFdiOiJsaXZlIixrYzoibXVsdGlsaW5lIixsYzoibXVsdGlzZWxlY3RhYmxlIixwYzoib3JpZW50YXRpb24iLHFjOiJvd25zIixyYzoicG9zaW5zZXQiLHRjOiJwcmVzc2VkIix4YzoicmVhZG9ubHkiLHpjOiJyZWxldmFudCIsQWM6InJlcXVpcmVkIixFYzoicm93aW5kZXgiLEhjOiJzZWxlY3RlZCIsSmM6InNldHNpemUiLExjOiJzb3J0IixaYzoidmFsdWVtYXgiLCRjOiJ2YWx1ZW1pbiIsYWQ6InZhbHVlbm93IiwKYmQ6InZhbHVldGV4dCJ9O3ZhciBvYT1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkIGluIGEpYi5jYWxsKGMsYVtkXSxkLGEpfSxwYT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyBpbiBhKWlmKGFbY109PWIpcmV0dXJuITA7cmV0dXJuITF9LHFhPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsIT09YSYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfSxzYT1mdW5jdGlvbihhKXt2YXIgYj17fSxjO2ZvcihjIGluIGEpYlthW2NdXT1jO3JldHVybiBifSx0YT0iY29uc3RydWN0b3IgaGFzT3duUHJvcGVydHkgaXNQcm90b3R5cGVPZiBwcm9wZXJ0eUlzRW51bWVyYWJsZSB0b0xvY2FsZVN0cmluZyB0b1N0cmluZyB2YWx1ZU9mIi5zcGxpdCgiICIpLHVhPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8dGEubGVuZ3RoO2YrKyljPQp0YVtmXSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZCxjKSYmKGFbY109ZFtjXSl9fTt2YXIgdmE9e2ZiOiJhbGVydCIsZ2I6ImFsZXJ0ZGlhbG9nIixoYjoiYXBwbGljYXRpb24iLGliOiJhcnRpY2xlIixsYjoiYmFubmVyIixuYjoiYnV0dG9uIixvYjoiY2hlY2tib3giLHJiOiJjb2x1bW5oZWFkZXIiLHNiOiJjb21ib2JveCIsdGI6ImNvbXBsZW1lbnRhcnkiLHViOiJjb250ZW50aW5mbyIsd2I6ImRlZmluaXRpb24iLHliOiJkaWFsb2ciLHpiOiJkaXJlY3RvcnkiLEJiOiJkb2N1bWVudCIsRmI6ImZvcm0iLEhiOiJncmlkIixJYjoiZ3JpZGNlbGwiLEpiOiJncm91cCIsTGI6ImhlYWRpbmciLE5iOiJpbWciLFNiOiJsaW5rIixUYjoibGlzdCIsVWI6Imxpc3Rib3giLFZiOiJsaXN0aXRlbSIsWGI6ImxvZyIsWWI6Im1haW4iLFpiOiJtYXJxdWVlIiwkYjoibWF0aCIsYWM6Im1lbnUiLGJjOiJtZW51YmFyIixjYzoibWVudWl0ZW0iLGRjOiJtZW51aXRlbWNoZWNrYm94IixlYzoibWVudWl0ZW1yYWRpbyIsbWM6Im5hdmlnYXRpb24iLG5jOiJub3RlIixvYzoib3B0aW9uIiwKc2M6InByZXNlbnRhdGlvbiIsdWM6InByb2dyZXNzYmFyIix2YzoicmFkaW8iLHdjOiJyYWRpb2dyb3VwIix5YzoicmVnaW9uIixCYzoicm93IixDYzoicm93Z3JvdXAiLERjOiJyb3doZWFkZXIiLEZjOiJzY3JvbGxiYXIiLEdjOiJzZWFyY2giLEljOiJzZXBhcmF0b3IiLEtjOiJzbGlkZXIiLE1jOiJzcGluYnV0dG9uIixOYzoic3RhdHVzIixPYzoidGFiIixQYzoidGFibGlzdCIsUWM6InRhYnBhbmVsIixSYzoidGV4dGJveCIsU2M6InRleHRpbmZvIixUYzoidGltZXIiLFVjOiJ0b29sYmFyIixWYzoidG9vbHRpcCIsV2M6InRyZWUiLFhjOiJ0cmVlZ3JpZCIsWWM6InRyZWVpdGVtIn07dmFyIHdhPWZ1bmN0aW9uKGEpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsd2EpO2Vsc2V7dmFyIGI9RXJyb3IoKS5zdGFjaztiJiYodGhpcy5zdGFjaz1iKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSl9O24od2EsRXJyb3IpO3dhLnByb3RvdHlwZS5uYW1lPSJDdXN0b21FcnJvciI7dmFyIHhhO3ZhciB5YT1mdW5jdGlvbihhLGIpe2E9YS5zcGxpdCgiJXMiKTtmb3IodmFyIGM9IiIsZD1hLmxlbmd0aC0xLGU9MDtlPGQ7ZSsrKWMrPWFbZV0rKGU8Yi5sZW5ndGg/YltlXToiJXMiKTt3YS5jYWxsKHRoaXMsYythW2RdKX07bih5YSx3YSk7eWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjsKdmFyIHphPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSJBc3NlcnRpb24gZmFpbGVkIjtpZihjKXtlKz0iOiAiK2M7dmFyIGY9ZH1lbHNlIGEmJihlKz0iOiAiK2EsZj1iKTt0aHJvdyBuZXcgeWEoIiIrZSxmfHxbXSk7fSxxPWZ1bmN0aW9uKGEsYixjKXthfHx6YSgiIixudWxsLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX0sQWE9ZnVuY3Rpb24oYSxiLGMpe20oYSkmJjE9PWEubm9kZVR5cGV8fHphKCJFeHBlY3RlZCBFbGVtZW50IGJ1dCBnb3QgJXM6ICVzLiIsW2VhKGEpLGFdLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKX0sQ2E9ZnVuY3Rpb24oYSxiLGMsZCl7YSBpbnN0YW5jZW9mIGJ8fHphKCJFeHBlY3RlZCBpbnN0YW5jZW9mICVzIGJ1dCBnb3QgJXMuIixbQmEoYiksQmEoYSldLGMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpKX0sQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZgpGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTpudWxsPT09YT8ibnVsbCI6dHlwZW9mIGF9O3ZhciBEYT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3EobnVsbCE9YS5sZW5ndGgpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKCJzdHJpbmciPT09dHlwZW9mIGEpcmV0dXJuInN0cmluZyIhPT10eXBlb2YgYnx8MSE9Yi5sZW5ndGg/LTE6YS5pbmRleE9mKGIsMCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspaWYoYyBpbiBhJiZhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX0scj1BcnJheS5wcm90b3R5cGUuZm9yRWFjaD9mdW5jdGlvbihhLGIsYyl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsYyl9OmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9YS5sZW5ndGgsZT0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZj0wO2Y8ZDtmKyspZiBpbiBlJiZiLmNhbGwoYyxlW2ZdLGYsYSl9LEVhPUFycmF5LnByb3RvdHlwZS5maWx0ZXI/CmZ1bmN0aW9uKGEsYil7cShudWxsIT1hLmxlbmd0aCk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD1bXSxlPTAsZj0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZz0wO2c8YztnKyspaWYoZyBpbiBmKXt2YXIgaz1mW2ddO2IuY2FsbCh2b2lkIDAsayxnLGEpJiYoZFtlKytdPWspfXJldHVybiBkfSxGYT1BcnJheS5wcm90b3R5cGUuZXZlcnk/ZnVuY3Rpb24oYSxiKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmV2ZXJ5LmNhbGwoYSxiLHZvaWQgMCl9OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWEubGVuZ3RoLGQ9InN0cmluZyI9PT10eXBlb2YgYT9hLnNwbGl0KCIiKTphLGU9MDtlPGM7ZSsrKWlmKGUgaW4gZCYmIWIuY2FsbCh2b2lkIDAsZFtlXSxlLGEpKXJldHVybiExO3JldHVybiEwfSxHYT1mdW5jdGlvbihhLGIpe3JldHVybiAwPD0KRGEoYSxiKX0sSGE9ZnVuY3Rpb24oYSxiKXtiPURhKGEsYik7dmFyIGM7aWYoYz0wPD1iKXEobnVsbCE9YS5sZW5ndGgpLEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhLGIsMSk7cmV0dXJuIGN9LElhPWZ1bmN0aW9uKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGFyZ3VtZW50cyl9LEphPWZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDA8Yil7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX0sTGE9ZnVuY3Rpb24oYSxiLGMsZCl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShhLEthKGFyZ3VtZW50cywxKSl9LEthPWZ1bmN0aW9uKGEsYixjKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gMj49YXJndW1lbnRzLmxlbmd0aD9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsYixjKX07dmFyIE1hPVN0cmluZy5wcm90b3R5cGUudHJpbT9mdW5jdGlvbihhKXtyZXR1cm4gYS50cmltKCl9OmZ1bmN0aW9uKGEpe3JldHVybi9eW1xzXHhhMF0qKFtcc1xTXSo/KVtcc1x4YTBdKiQvLmV4ZWMoYSlbMV19LE5hPS8mL2csT2E9LzwvZyxQYT0vPi9nLFFhPS8iL2csUmE9LycvZyxTYT0vXHgwMC9nLFRhPS9bXHgwMCY8PiInXS8sdD1mdW5jdGlvbihhLGIpe3JldHVybi0xIT1hLmluZGV4T2YoYil9LFVhPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE8Yj8tMTphPmI/MTowfTt2YXIgdTthOnt2YXIgVmE9bC5uYXZpZ2F0b3I7aWYoVmEpe3ZhciBXYT1WYS51c2VyQWdlbnQ7aWYoV2Epe3U9V2E7YnJlYWsgYX19dT0iIn07LyoKCiBDb3B5cmlnaHQgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzLgogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKKi8KdmFyIFhhPWZ1bmN0aW9uKGEpe1RhLnRlc3QoYSkmJigtMSE9YS5pbmRleE9mKCImIikmJihhPWEucmVwbGFjZShOYSwiJmFtcDsiKSksLTEhPWEuaW5kZXhPZigiPCIpJiYoYT1hLnJlcGxhY2UoT2EsIiZsdDsiKSksLTEhPWEuaW5kZXhPZigiPiIpJiYoYT1hLnJlcGxhY2UoUGEsIiZndDsiKSksLTEhPWEuaW5kZXhPZignIicpJiYoYT1hLnJlcGxhY2UoUWEsIiZxdW90OyIpKSwtMSE9YS5pbmRleE9mKCInIikmJihhPWEucmVwbGFjZShSYSwiJiMzOTsiKSksLTEhPWEuaW5kZXhPZigiXHgwMCIpJiYoYT1hLnJlcGxhY2UoU2EsIiYjMDsiKSkpO3JldHVybiBhfTt2YXIgWWE9ZnVuY3Rpb24oYSl7WWFbIiAiXShhKTtyZXR1cm4gYX07WWFbIiAiXT1jYTt2YXIgJGE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1aYTtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsYSk/Y1thXTpjW2FdPWIoYSl9O3ZhciBhYj10KHUsIk9wZXJhIiksdj10KHUsIlRyaWRlbnQiKXx8dCh1LCJNU0lFIiksYmI9dCh1LCJFZGdlIikseD10KHUsIkdlY2tvIikmJiEodCh1LnRvTG93ZXJDYXNlKCksIndlYmtpdCIpJiYhdCh1LCJFZGdlIikpJiYhKHQodSwiVHJpZGVudCIpfHx0KHUsIk1TSUUiKSkmJiF0KHUsIkVkZ2UiKSx5PXQodS50b0xvd2VyQ2FzZSgpLCJ3ZWJraXQiKSYmIXQodSwiRWRnZSIpLHo9dCh1LCJNYWNpbnRvc2giKSxjYj1mdW5jdGlvbigpe3ZhciBhPWwuZG9jdW1lbnQ7cmV0dXJuIGE/YS5kb2N1bWVudE1vZGU6dm9pZCAwfSxkYjsKYTp7dmFyIGViPSIiLGZiPWZ1bmN0aW9uKCl7dmFyIGE9dTtpZih4KXJldHVybi9ydjooW15cKTtdKykoXCl8OykvLmV4ZWMoYSk7aWYoYmIpcmV0dXJuL0VkZ2VcLyhbXGRcLl0rKS8uZXhlYyhhKTtpZih2KXJldHVybi9cYig/Ok1TSUV8cnYpWzogXShbXlwpO10rKShcKXw7KS8uZXhlYyhhKTtpZih5KXJldHVybi9XZWJLaXRcLyhcUyspLy5leGVjKGEpO2lmKGFiKXJldHVybi8oPzpWZXJzaW9uKVsgXC9dPyhcUyspLy5leGVjKGEpfSgpO2ZiJiYoZWI9ZmI/ZmJbMV06IiIpO2lmKHYpe3ZhciBnYj1jYigpO2lmKG51bGwhPWdiJiZnYj5wYXJzZUZsb2F0KGViKSl7ZGI9U3RyaW5nKGdiKTticmVhayBhfX1kYj1lYn0KdmFyIGhiPWRiLFphPXt9LEE9ZnVuY3Rpb24oYSl7cmV0dXJuICRhKGEsZnVuY3Rpb24oKXtmb3IodmFyIGI9MCxjPU1hKFN0cmluZyhoYikpLnNwbGl0KCIuIiksZD1NYShTdHJpbmcoYSkpLnNwbGl0KCIuIiksZT1NYXRoLm1heChjLmxlbmd0aCxkLmxlbmd0aCksZj0wOzA9PWImJmY8ZTtmKyspe3ZhciBnPWNbZl18fCIiLGs9ZFtmXXx8IiI7ZG97Zz0vKFxkKikoXEQqKSguKikvLmV4ZWMoZyl8fFsiIiwiIiwiIiwiIl07az0vKFxkKikoXEQqKSguKikvLmV4ZWMoayl8fFsiIiwiIiwiIiwiIl07aWYoMD09Z1swXS5sZW5ndGgmJjA9PWtbMF0ubGVuZ3RoKWJyZWFrO2I9VWEoMD09Z1sxXS5sZW5ndGg/MDpwYXJzZUludChnWzFdLDEwKSwwPT1rWzFdLmxlbmd0aD8wOnBhcnNlSW50KGtbMV0sMTApKXx8VWEoMD09Z1syXS5sZW5ndGgsMD09a1syXS5sZW5ndGgpfHxVYShnWzJdLGtbMl0pO2c9Z1szXTtrPWtbM119d2hpbGUoMD09Yil9cmV0dXJuIDA8PWJ9KX0saWI7CmliPWwuZG9jdW1lbnQmJnY/Y2IoKTp2b2lkIDA7dmFyIGpiPSF2fHw5PD1OdW1iZXIoaWIpO3ZhciBsYj1mdW5jdGlvbihhLGIpe29hKGIsZnVuY3Rpb24oYyxkKXtjJiYib2JqZWN0Ij09dHlwZW9mIGMmJmMuZGQmJihjPWMuY2QoKSk7InN0eWxlIj09ZD9hLnN0eWxlLmNzc1RleHQ9YzoiY2xhc3MiPT1kP2EuY2xhc3NOYW1lPWM6ImZvciI9PWQ/YS5odG1sRm9yPWM6a2IuaGFzT3duUHJvcGVydHkoZCk/YS5zZXRBdHRyaWJ1dGUoa2JbZF0sYyk6MD09ZC5sYXN0SW5kZXhPZigiYXJpYS0iLDApfHwwPT1kLmxhc3RJbmRleE9mKCJkYXRhLSIsMCk/YS5zZXRBdHRyaWJ1dGUoZCxjKTphW2RdPWN9KX0sa2I9e2NlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjb2xzcGFuOiJjb2xTcGFuIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGhlaWdodDoiaGVpZ2h0IixtYXhsZW5ndGg6Im1heExlbmd0aCIsbm9uY2U6Im5vbmNlIixyb2xlOiJyb2xlIixyb3dzcGFuOiJyb3dTcGFuIix0eXBlOiJ0eXBlIix1c2VtYXA6InVzZU1hcCIsdmFsaWduOiJ2QWxpZ24iLAp3aWR0aDoid2lkdGgifSxtYj1mdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChrKXtrJiZiLmFwcGVuZENoaWxkKCJzdHJpbmciPT09dHlwZW9mIGs/YS5jcmVhdGVUZXh0Tm9kZShrKTprKX1mb3IodmFyIGU9MjtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXTtpZighaGEoZil8fG0oZikmJjA8Zi5ub2RlVHlwZSlkKGYpO2Vsc2V7YTp7aWYoZiYmIm51bWJlciI9PXR5cGVvZiBmLmxlbmd0aCl7aWYobShmKSl7dmFyIGc9ImZ1bmN0aW9uIj09dHlwZW9mIGYuaXRlbXx8InN0cmluZyI9PXR5cGVvZiBmLml0ZW07YnJlYWsgYX1pZihpYShmKSl7Zz0iZnVuY3Rpb24iPT10eXBlb2YgZi5pdGVtO2JyZWFrIGF9fWc9ITF9cihnP0phKGYpOmYsZCl9fX0sbmI9ZnVuY3Rpb24oYSxiKXtiPVN0cmluZyhiKTsiYXBwbGljYXRpb24veGh0bWwreG1sIj09PWEuY29udGVudFR5cGUmJihiPWIudG9Mb3dlckNhc2UoKSk7cmV0dXJuIGEuY3JlYXRlRWxlbWVudChiKX0sb2I9ZnVuY3Rpb24oYSl7YSYmCmEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpfSxwYj1mdW5jdGlvbihhLGIpe2lmKCFhfHwhYilyZXR1cm4hMTtpZihhLmNvbnRhaW5zJiYxPT1iLm5vZGVUeXBlKXJldHVybiBhPT1ifHxhLmNvbnRhaW5zKGIpO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbilyZXR1cm4gYT09Ynx8ISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNik7Zm9yKDtiJiZhIT1iOyliPWIucGFyZW50Tm9kZTtyZXR1cm4gYj09YX0scWI9ZnVuY3Rpb24oYSl7cShhLCJOb2RlIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4iKTtyZXR1cm4gOT09YS5ub2RlVHlwZT9hOmEub3duZXJEb2N1bWVudHx8YS5kb2N1bWVudH0scmI9ZnVuY3Rpb24oYSxiKXtiP2EudGFiSW5kZXg9MDooYS50YWJJbmRleD0tMSxhLnJlbW92ZUF0dHJpYnV0ZSgidGFiSW5kZXgiKSl9LHNiPWZ1bmN0aW9uKGEpe3JldHVybiB2JiYhQSgiOSIpPyhhPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKSwKbnVsbCE9YSYmYS5zcGVjaWZpZWQpOmEuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpfSx0Yj1mdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgYSYmMDw9YSYmMzI3Njg+YX0sdWI9ZnVuY3Rpb24oYSl7dGhpcy5hPWF8fGwuZG9jdW1lbnR8fGRvY3VtZW50fTt1Yi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBhP3RoaXMuYS5nZXRFbGVtZW50QnlJZChhKTphfTsKdWIucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuYSxlPWFyZ3VtZW50cyxmPVN0cmluZyhlWzBdKSxnPWVbMV07aWYoIWpiJiZnJiYoZy5uYW1lfHxnLnR5cGUpKXtmPVsiPCIsZl07Zy5uYW1lJiZmLnB1c2goJyBuYW1lPSInLFhhKGcubmFtZSksJyInKTtpZihnLnR5cGUpe2YucHVzaCgnIHR5cGU9IicsWGEoZy50eXBlKSwnIicpO3ZhciBrPXt9O3VhKGssZyk7ZGVsZXRlIGsudHlwZTtnPWt9Zi5wdXNoKCI+Iik7Zj1mLmpvaW4oIiIpfWY9bmIoZCxmKTtnJiYoInN0cmluZyI9PT10eXBlb2YgZz9mLmNsYXNzTmFtZT1nOmZhKGcpP2YuY2xhc3NOYW1lPWcuam9pbigiICIpOmxiKGYsZykpOzI8ZS5sZW5ndGgmJm1iKGQsZixlKTtyZXR1cm4gZn07dmFyIHZiPWZ1bmN0aW9uKGEsYil7Yj8ocShwYSh2YSxiKSwiTm8gc3VjaCBBUklBIHJvbGUgIitiKSxhLnNldEF0dHJpYnV0ZSgicm9sZSIsYikpOmEucmVtb3ZlQXR0cmlidXRlKCJyb2xlIil9LHhiPWZ1bmN0aW9uKGEsYixjKXtmYShjKSYmKGM9Yy5qb2luKCIgIikpO3ZhciBkPXdiKGIpOyIiPT09Y3x8dm9pZCAwPT1jPyhtYXx8KG1hPXthdG9taWM6ITEsYXV0b2NvbXBsZXRlOiJub25lIixkcm9wZWZmZWN0OiJub25lIixoYXNwb3B1cDohMSxsaXZlOiJvZmYiLG11bHRpbGluZTohMSxtdWx0aXNlbGVjdGFibGU6ITEsb3JpZW50YXRpb246InZlcnRpY2FsIixyZWFkb25seTohMSxyZWxldmFudDoiYWRkaXRpb25zIHRleHQiLHJlcXVpcmVkOiExLHNvcnQ6Im5vbmUiLGJ1c3k6ITEsZGlzYWJsZWQ6ITEsaGlkZGVuOiExLGludmFsaWQ6ImZhbHNlIn0pLGM9bWEsYiBpbiBjP2Euc2V0QXR0cmlidXRlKGQsY1tiXSk6YS5yZW1vdmVBdHRyaWJ1dGUoZCkpOmEuc2V0QXR0cmlidXRlKGQsCmMpfSx3Yj1mdW5jdGlvbihhKXtxKGEsIkFSSUEgYXR0cmlidXRlIGNhbm5vdCBiZSBlbXB0eS4iKTtxKHBhKG5hLGEpLCJObyBzdWNoIEFSSUEgYXR0cmlidXRlICIrYSk7cmV0dXJuImFyaWEtIithfTt2YXIgeWI9T2JqZWN0LmZyZWV6ZXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O3ZhciBDPWZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVTt0aGlzLko9dGhpcy5KfTtDLnByb3RvdHlwZS5VPSExO0MucHJvdG90eXBlLk49ZnVuY3Rpb24oKXt0aGlzLlV8fCh0aGlzLlU9ITAsdGhpcy51KCkpfTt2YXIgemI9ZnVuY3Rpb24oYSxiKXthLlU/YigpOihhLkp8fChhLko9W10pLGEuSi5wdXNoKGIpKX07Qy5wcm90b3R5cGUudT1mdW5jdGlvbigpe2lmKHRoaXMuSilmb3IoO3RoaXMuSi5sZW5ndGg7KXRoaXMuSi5zaGlmdCgpKCl9O3ZhciBBYj1mdW5jdGlvbihhKXthJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5OJiZhLk4oKX07dmFyIEJiPWZ1bmN0aW9uKGEpe3JldHVybiJzdHJpbmciPT10eXBlb2YgYS5jbGFzc05hbWU/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sRD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6QmIoYSkubWF0Y2goL1xTKy9nKXx8W119LENiPWZ1bmN0aW9uKGEsYil7InN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZT9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxEYj1mdW5jdGlvbihhLGIpe3JldHVybiBhLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5jb250YWlucyhiKTpHYShEKGEpLGIpfSxFYj1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFEYihhLGIpKXt2YXIgYz1CYihhKTtDYihhLGMrKDA8Yy5sZW5ndGg/IiAiK2I6YikpfX0sRmI9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClyKGIsCmZ1bmN0aW9uKGUpe0ViKGEsZSl9KTtlbHNle3ZhciBjPXt9O3IoRChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7cihiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPTA8Yi5sZW5ndGg/IiAiK2Q6ZDtDYihhLGIpfX0sR2I9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6RGIoYSxiKSYmQ2IoYSxFYShEKGEpLGZ1bmN0aW9uKGMpe3JldHVybiBjIT1ifSkuam9pbigiICIpKX0sSGI9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9yKGIsZnVuY3Rpb24oYyl7R2IoYSxjKX0pOkNiKGEsRWEoRChhKSxmdW5jdGlvbihjKXtyZXR1cm4hR2EoYixjKX0pLmpvaW4oIiAiKSl9O3ZhciBJYj0hdnx8OTw9TnVtYmVyKGliKSxKYj0hdnx8OTw9TnVtYmVyKGliKSxLYj12JiYhQSgiOSIpLExiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e2wuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsY2EsYiksbC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjYSxiKX1jYXRjaChjKXt9cmV0dXJuIGF9KCk7dmFyIEU9ZnVuY3Rpb24oYSxiKXt0aGlzLnR5cGU9YTt0aGlzLmE9dGhpcy50YXJnZXQ9Yjt0aGlzLmg9ITE7dGhpcy5LYT0hMH07RS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuaD0hMH07RS5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3RoaXMuS2E9ITF9O3ZhciBGPXtMOiJtb3VzZWRvd24iLE06Im1vdXNldXAiLGFhOiJtb3VzZWNhbmNlbCIsaGM6Im1vdXNlbW92ZSIsamM6Im1vdXNlb3ZlciIsaWM6Im1vdXNlb3V0IixmYzoibW91c2VlbnRlciIsZ2M6Im1vdXNlbGVhdmUifTt2YXIgRz1mdW5jdGlvbihhLGIpe0UuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy5hPXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5jPTA7dGhpcy5BPXRoaXMubWV0YUtleT10aGlzLnNoaWZ0S2V5PXRoaXMuYWx0S2V5PXRoaXMuY3RybEtleT0hMTt0aGlzLnBvaW50ZXJJZD0wO3RoaXMucG9pbnRlclR5cGU9IiI7dGhpcy5iPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMuYT1iO2lmKGI9YS5yZWxhdGVkVGFyZ2V0KXtpZih4KXthOnt0cnl7WWEoYi5ub2RlTmFtZSk7dmFyIGU9ITA7YnJlYWsgYX1jYXRjaChmKXt9ZT0KITF9ZXx8KGI9bnVsbCl9fWVsc2UibW91c2VvdmVyIj09Yz9iPWEuZnJvbUVsZW1lbnQ6Im1vdXNlb3V0Ij09YyYmKGI9YS50b0VsZW1lbnQpO3RoaXMucmVsYXRlZFRhcmdldD1iO2Q/KHRoaXMuY2xpZW50WD12b2lkIDAhPT1kLmNsaWVudFg/ZC5jbGllbnRYOmQucGFnZVgsdGhpcy5jbGllbnRZPXZvaWQgMCE9PWQuY2xpZW50WT9kLmNsaWVudFk6ZC5wYWdlWSx0aGlzLnNjcmVlblg9ZC5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1kLnNjcmVlbll8fDApOih0aGlzLmNsaWVudFg9dm9pZCAwIT09YS5jbGllbnRYP2EuY2xpZW50WDphLnBhZ2VYLHRoaXMuY2xpZW50WT12b2lkIDAhPT1hLmNsaWVudFk/YS5jbGllbnRZOmEucGFnZVksdGhpcy5zY3JlZW5YPWEuc2NyZWVuWHx8MCx0aGlzLnNjcmVlblk9YS5zY3JlZW5ZfHwwKTt0aGlzLmJ1dHRvbj1hLmJ1dHRvbjt0aGlzLmM9YS5rZXlDb2RlfHwwO3RoaXMua2V5PWEua2V5fHwiIjt0aGlzLmN0cmxLZXk9YS5jdHJsS2V5O3RoaXMuYWx0S2V5PQphLmFsdEtleTt0aGlzLnNoaWZ0S2V5PWEuc2hpZnRLZXk7dGhpcy5tZXRhS2V5PWEubWV0YUtleTt0aGlzLkE9ej9hLm1ldGFLZXk6YS5jdHJsS2V5O3RoaXMucG9pbnRlcklkPWEucG9pbnRlcklkfHwwO3RoaXMucG9pbnRlclR5cGU9InN0cmluZyI9PT10eXBlb2YgYS5wb2ludGVyVHlwZT9hLnBvaW50ZXJUeXBlOk1iW2EucG9pbnRlclR5cGVdfHwiIjt0aGlzLmI9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnRoaXMuZygpfX07bihHLEUpO3ZhciBOYj15YihbMSw0LDJdKSxNYj15Yih7MjoidG91Y2giLDM6InBlbiIsNDoibW91c2UifSksT2I9ZnVuY3Rpb24oYSl7cmV0dXJuIEliPzA9PWEuYi5idXR0b246ImNsaWNrIj09YS50eXBlPyEwOiEhKGEuYi5idXR0b24mTmJbMF0pfTtHLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7Ry5pLmouY2FsbCh0aGlzKTt0aGlzLmIuc3RvcFByb3BhZ2F0aW9uP3RoaXMuYi5zdG9wUHJvcGFnYXRpb24oKTp0aGlzLmIuY2FuY2VsQnViYmxlPSEwfTsKRy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe0cuaS5nLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5iO2lmKGEucHJldmVudERlZmF1bHQpYS5wcmV2ZW50RGVmYXVsdCgpO2Vsc2UgaWYoYS5yZXR1cm5WYWx1ZT0hMSxLYil0cnl7aWYoYS5jdHJsS2V5fHwxMTI8PWEua2V5Q29kZSYmMTIzPj1hLmtleUNvZGUpYS5rZXlDb2RlPS0xfWNhdGNoKGIpe319O3ZhciBQYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKDFFNipNYXRoLnJhbmRvbSgpfDApLFFiPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW1BiXSl9LFJiPTA7dmFyIFNiPWZ1bmN0aW9uKGEsYixjLGQsZSl7dGhpcy5saXN0ZW5lcj1hO3RoaXMuYT1udWxsO3RoaXMuc3JjPWI7dGhpcy50eXBlPWM7dGhpcy5jYXB0dXJlPSEhZDt0aGlzLm1hPWU7dGhpcy5rZXk9KytSYjt0aGlzLlg9dGhpcy5oYT0hMX0sVGI9ZnVuY3Rpb24oYSl7YS5YPSEwO2EubGlzdGVuZXI9bnVsbDthLmE9bnVsbDthLnNyYz1udWxsO2EubWE9bnVsbH07dmFyIFViPWZ1bmN0aW9uKGEpe3RoaXMuc3JjPWE7dGhpcy5hPXt9O3RoaXMuYj0wfTtVYi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS50b1N0cmluZygpO2E9dGhpcy5hW2ZdO2F8fChhPXRoaXMuYVtmXT1bXSx0aGlzLmIrKyk7dmFyIGc9VmIoYSxiLGQsZSk7LTE8Zz8oYj1hW2ddLGN8fChiLmhhPSExKSk6KGI9bmV3IFNiKGIsdGhpcy5zcmMsZiwhIWQsZSksYi5oYT1jLGEucHVzaChiKSk7cmV0dXJuIGJ9Owp2YXIgV2I9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLnR5cGU7YyBpbiBhLmEmJkhhKGEuYVtjXSxiKSYmKFRiKGIpLDA9PWEuYVtjXS5sZW5ndGgmJihkZWxldGUgYS5hW2NdLGEuYi0tKSl9LFhiPWZ1bmN0aW9uKGEsYixjLGQsZSl7YT1hLmFbYi50b1N0cmluZygpXTtiPS0xO2EmJihiPVZiKGEsYyxkLGUpKTtyZXR1cm4tMTxiP2FbYl06bnVsbH0sVmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuWCYmZi5saXN0ZW5lcj09YiYmZi5jYXB0dXJlPT0hIWMmJmYubWE9PWQpcmV0dXJuIGV9cmV0dXJuLTF9O3ZhciBZYj0iY2xvc3VyZV9sbV8iKygxRTYqTWF0aC5yYW5kb20oKXwwKSxaYj17fSwkYj0wLGJjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZCYmZC5vbmNlKXJldHVybiBhYyhhLGIsYyxkLGUpO2lmKGZhKGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyliYyhhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9Y2MoYyk7cmV0dXJuIFFiKGEpP2RjKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOmVjKGEsYixjLCExLGQsZSl9LGVjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGc9bShlKT8hIWUuY2FwdHVyZTohIWUsaz1mYyhhKTtrfHwoYVtZYl09az1uZXcgVWIoYSkpO2M9ay5hZGQoYixjLGQsZyxmKTtpZihjLmEpcmV0dXJuIGM7ZD1nYygpO2MuYT1kO2Quc3JjPWE7ZC5saXN0ZW5lcj1jO2lmKGEuYWRkRXZlbnRMaXN0ZW5lcilMYnx8KGU9Zyksdm9pZCAwPT09ZSYmKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksCmQsZSk7ZWxzZSBpZihhLmF0dGFjaEV2ZW50KWEuYXR0YWNoRXZlbnQoaGMoYi50b1N0cmluZygpKSxkKTtlbHNlIGlmKGEuYWRkTGlzdGVuZXImJmEucmVtb3ZlTGlzdGVuZXIpcSgiY2hhbmdlIj09PWIsIk1lZGlhUXVlcnlMaXN0IG9ubHkgaGFzIGEgY2hhbmdlIGV2ZW50IiksYS5hZGRMaXN0ZW5lcihkKTtlbHNlIHRocm93IEVycm9yKCJhZGRFdmVudExpc3RlbmVyIGFuZCBhdHRhY2hFdmVudCBhcmUgdW5hdmFpbGFibGUuIik7JGIrKztyZXR1cm4gY30sZ2M9ZnVuY3Rpb24oKXt2YXIgYT1pYyxiPUpiP2Z1bmN0aW9uKGMpe3JldHVybiBhLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKX06ZnVuY3Rpb24oYyl7Yz1hLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKTtpZighYylyZXR1cm4gY307cmV0dXJuIGJ9LGFjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZmEoYikpe2Zvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWFjKGEsYltmXSxjLGQsZSk7cmV0dXJuIG51bGx9Yz1jYyhjKTtyZXR1cm4gUWIoYSk/CmEuaC5hZGQoU3RyaW5nKGIpLGMsITAsbShkKT8hIWQuY2FwdHVyZTohIWQsZSk6ZWMoYSxiLGMsITAsZCxlKX0samM9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihmYShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylqYyhhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPWNjKGMpLFFiKGEpPyhhPWEuaCxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5hJiYoZj1hLmFbYl0sYz1WYihmLGMsZCxlKSwtMTxjJiYoVGIoZltjXSkscShudWxsIT1mLmxlbmd0aCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSwwPT1mLmxlbmd0aCYmKGRlbGV0ZSBhLmFbYl0sYS5iLS0pKSkpOmEmJihhPWZjKGEpKSYmKGM9WGIoYSxiLGMsZCxlKSkmJmtjKGMpfSxrYz1mdW5jdGlvbihhKXtpZigibnVtYmVyIiE9PXR5cGVvZiBhJiZhJiYhYS5YKXt2YXIgYj1hLnNyYztpZihRYihiKSlXYihiLmgsYSk7ZWxzZXt2YXIgYz1hLnR5cGUsZD1hLmE7Yi5yZW1vdmVFdmVudExpc3RlbmVyPwpiLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KGhjKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7JGItLTsoYz1mYyhiKSk/KFdiKGMsYSksMD09Yy5iJiYoYy5zcmM9bnVsbCxiW1liXT1udWxsKSk6VGIoYSl9fX0saGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gWmI/WmJbYV06WmJbYV09Im9uIithfSxtYz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMDtpZihhPWZjKGEpKWlmKGI9YS5hW2IudG9TdHJpbmcoKV0pZm9yKGI9Yi5jb25jYXQoKSxhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBmPWJbYV07ZiYmZi5jYXB0dXJlPT1jJiYhZi5YJiYoZj1sYyhmLGQpLGU9ZSYmITEhPT1mKX1yZXR1cm4gZX0sbGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5tYXx8YS5zcmM7YS5oYSYma2MoYSk7cmV0dXJuIGMuY2FsbChkLGIpfSxpYz1mdW5jdGlvbihhLApiKXtpZihhLlgpcmV0dXJuITA7aWYoIUpiKXtpZighYilhOntiPVsid2luZG93IiwiZXZlbnQiXTtmb3IodmFyIGM9bCxkPTA7ZDxiLmxlbmd0aDtkKyspaWYoYz1jW2JbZF1dLG51bGw9PWMpe2I9bnVsbDticmVhayBhfWI9Y31kPWI7Yj1uZXcgRyhkLHRoaXMpO2M9ITA7aWYoISgwPmQua2V5Q29kZXx8dm9pZCAwIT1kLnJldHVyblZhbHVlKSl7YTp7dmFyIGU9ITE7aWYoMD09ZC5rZXlDb2RlKXRyeXtkLmtleUNvZGU9LTE7YnJlYWsgYX1jYXRjaChnKXtlPSEwfWlmKGV8fHZvaWQgMD09ZC5yZXR1cm5WYWx1ZSlkLnJldHVyblZhbHVlPSEwfWQ9W107Zm9yKGU9Yi5hO2U7ZT1lLnBhcmVudE5vZGUpZC5wdXNoKGUpO2E9YS50eXBlO2ZvcihlPWQubGVuZ3RoLTE7IWIuaCYmMDw9ZTtlLS0pe2IuYT1kW2VdO3ZhciBmPW1jKGRbZV0sYSwhMCxiKTtjPWMmJmZ9Zm9yKGU9MDshYi5oJiZlPGQubGVuZ3RoO2UrKyliLmE9ZFtlXSxmPW1jKGRbZV0sYSwhMSxiKSxjPWMmJmZ9cmV0dXJuIGN9cmV0dXJuIGxjKGEsCm5ldyBHKGIsdGhpcykpfSxmYz1mdW5jdGlvbihhKXthPWFbWWJdO3JldHVybiBhIGluc3RhbmNlb2YgVWI/YTpudWxsfSxuYz0iX19jbG9zdXJlX2V2ZW50c19mbl8iKygxRTkqTWF0aC5yYW5kb20oKT4+PjApLGNjPWZ1bmN0aW9uKGEpe3EoYSwiTGlzdGVuZXIgY2FuIG5vdCBiZSBudWxsLiIpO2lmKGlhKGEpKXJldHVybiBhO3EoYS5oYW5kbGVFdmVudCwiQW4gb2JqZWN0IGxpc3RlbmVyIG11c3QgaGF2ZSBoYW5kbGVFdmVudCBtZXRob2QuIik7YVtuY118fChhW25jXT1mdW5jdGlvbihiKXtyZXR1cm4gYS5oYW5kbGVFdmVudChiKX0pO3JldHVybiBhW25jXX07dmFyIG9jPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9e319O24ob2MsQyk7CnZhciBwYz1bXSxIPWZ1bmN0aW9uKGEsYixjLGQpe2ZhKGMpfHwoYyYmKHBjWzBdPWMudG9TdHJpbmcoKSksYz1wYyk7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWJjKGIsY1tlXSxkfHxhLmhhbmRsZUV2ZW50LCExLGEuYnx8YSk7aWYoIWYpYnJlYWs7YS5hW2Yua2V5XT1mfXJldHVybiBhfSxxYz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoZmEoYykpZm9yKHZhciBnPTA7ZzxjLmxlbmd0aDtnKyspcWMoYSxiLGNbZ10sZCxlLGYpO2Vsc2UgZD1kfHxhLmhhbmRsZUV2ZW50LGU9bShlKT8hIWUuY2FwdHVyZTohIWUsZj1mfHxhLmJ8fGEsZD1jYyhkKSxlPSEhZSxjPVFiKGIpP1hiKGIuaCxTdHJpbmcoYyksZCxlLGYpOmI/KGI9ZmMoYikpP1hiKGIsYyxkLGUsZik6bnVsbDpudWxsLGMmJihrYyhjKSxkZWxldGUgYS5hW2Mua2V5XSk7cmV0dXJuIGF9LHJjPWZ1bmN0aW9uKGEpe29hKGEuYSxmdW5jdGlvbihiLGMpe3RoaXMuYS5oYXNPd25Qcm9wZXJ0eShjKSYma2MoYil9LAphKTthLmE9e319O29jLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7b2MuaS51LmNhbGwodGhpcyk7cmModGhpcyl9O29jLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJFdmVudEhhbmRsZXIuaGFuZGxlRXZlbnQgbm90IGltcGxlbWVudGVkIik7fTt2YXIgST1mdW5jdGlvbigpe0MuY2FsbCh0aGlzKTt0aGlzLmg9bmV3IFViKHRoaXMpO3RoaXMuTWE9dGhpczt0aGlzLnBhPW51bGx9O24oSSxDKTtJLnByb3RvdHlwZVtQYl09ITA7SS5wcm90b3R5cGUucmE9ZnVuY3Rpb24oYSl7dGhpcy5wYT1hfTtJLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjLGQpe2pjKHRoaXMsYSxiLGMsZCl9Owp2YXIgdWM9ZnVuY3Rpb24oYSxiKXtzYyhhKTt2YXIgYz1hLnBhO2lmKGMpe3ZhciBkPVtdO2Zvcih2YXIgZT0xO2M7Yz1jLnBhKWQucHVzaChjKSxxKDFFMz4rK2UsImluZmluaXRlIGxvb3AiKX1hPWEuTWE7Yz1iLnR5cGV8fGI7InN0cmluZyI9PT10eXBlb2YgYj9iPW5ldyBFKGIsYSk6YiBpbnN0YW5jZW9mIEU/Yi50YXJnZXQ9Yi50YXJnZXR8fGE6KGU9YixiPW5ldyBFKGMsYSksdWEoYixlKSk7ZT0hMDtpZihkKWZvcih2YXIgZj1kLmxlbmd0aC0xOyFiLmgmJjA8PWY7Zi0tKXt2YXIgZz1iLmE9ZFtmXTtlPXRjKGcsYywhMCxiKSYmZX1iLmh8fChnPWIuYT1hLGU9dGMoZyxjLCEwLGIpJiZlLGIuaHx8KGU9dGMoZyxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLmgmJmY8ZC5sZW5ndGg7ZisrKWc9Yi5hPWRbZl0sZT10YyhnLGMsITEsYikmJmU7cmV0dXJuIGV9OwpJLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7SS5pLnUuY2FsbCh0aGlzKTtpZih0aGlzLmgpe3ZhciBhPXRoaXMuaCxiPTAsYztmb3IoYyBpbiBhLmEpe2Zvcih2YXIgZD1hLmFbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixUYihkW2VdKTtkZWxldGUgYS5hW2NdO2EuYi0tfX10aGlzLnBhPW51bGx9O3ZhciBkYz1mdW5jdGlvbihhLGIsYyxkLGUpe3NjKGEpO3JldHVybiBhLmguYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LHRjPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5oLmFbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGc9YltmXTtpZihnJiYhZy5YJiZnLmNhcHR1cmU9PWMpe3ZhciBrPWcubGlzdGVuZXIscD1nLm1hfHxnLnNyYztnLmhhJiZXYihhLmgsZyk7ZT0hMSE9PWsuY2FsbChwLGQpJiZlfX1yZXR1cm4gZSYmMCE9ZC5LYX0sc2M9ZnVuY3Rpb24oYSl7cShhLmgsIkV2ZW50IHRhcmdldCBpcyBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgY2FsbCB0aGUgc3VwZXJjbGFzcyAoZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpIGNvbnN0cnVjdG9yPyIpfTt2YXIgeGM9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKHkmJiFBKCI1MjUiKSlyZXR1cm4hMDtpZih6JiZlKXJldHVybiB2YyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZigheCl7Im51bWJlciI9PT10eXBlb2YgYiYmKGI9d2MoYikpO3ZhciBnPTE3PT1ifHwxOD09Ynx8eiYmOTE9PWI7aWYoKCFjfHx6KSYmZ3x8eiYmMTY9PWImJihkfHxmKSlyZXR1cm4hMX1pZigoeXx8YmIpJiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1pZih2JiZkJiZiPT1hKXJldHVybiExO3N3aXRjaChhKXtjYXNlIDEzOnJldHVybiB4P2Z8fGU/ITE6IShjJiZkKTohMDtjYXNlIDI3OnJldHVybiEoeXx8YmJ8fHgpfXJldHVybiB4JiYoZHx8ZXx8Zik/ITE6dmMoYSl9LHZjPWZ1bmN0aW9uKGEpe2lmKDQ4PD1hJiY1Nz49YXx8Cjk2PD1hJiYxMDY+PWF8fDY1PD1hJiY5MD49YXx8KHl8fGJiKSYmMD09YSlyZXR1cm4hMDtzd2l0Y2goYSl7Y2FzZSAzMjpjYXNlIDQzOmNhc2UgNjM6Y2FzZSA2NDpjYXNlIDEwNzpjYXNlIDEwOTpjYXNlIDExMDpjYXNlIDExMTpjYXNlIDE4NjpjYXNlIDU5OmNhc2UgMTg5OmNhc2UgMTg3OmNhc2UgNjE6Y2FzZSAxODg6Y2FzZSAxOTA6Y2FzZSAxOTE6Y2FzZSAxOTI6Y2FzZSAyMjI6Y2FzZSAyMTk6Y2FzZSAyMjA6Y2FzZSAyMjE6Y2FzZSAxNjM6Y2FzZSA1ODpyZXR1cm4hMDtjYXNlIDE3MzpyZXR1cm4geDtkZWZhdWx0OnJldHVybiExfX0sd2M9ZnVuY3Rpb24oYSl7aWYoeClhPXljKGEpO2Vsc2UgaWYoeiYmeSlzd2l0Y2goYSl7Y2FzZSA5MzphPTkxfXJldHVybiBhfSx5Yz1mdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSA2MTpyZXR1cm4gMTg3O2Nhc2UgNTk6cmV0dXJuIDE4NjtjYXNlIDE3MzpyZXR1cm4gMTg5O2Nhc2UgMjI0OnJldHVybiA5MTtjYXNlIDA6cmV0dXJuIDIyNDsKZGVmYXVsdDpyZXR1cm4gYX19O3ZhciBKPWZ1bmN0aW9uKGEsYil7SS5jYWxsKHRoaXMpO2EmJnpjKHRoaXMsYSxiKX07bihKLEkpO2g9Si5wcm90b3R5cGU7aC5TPW51bGw7aC5uYT1udWxsO2guQ2E9bnVsbDtoLm9hPW51bGw7aC53PS0xO2guRj0tMTtoLnVhPSExOwp2YXIgQWM9ezM6MTMsMTI6MTQ0LDYzMjMyOjM4LDYzMjMzOjQwLDYzMjM0OjM3LDYzMjM1OjM5LDYzMjM2OjExMiw2MzIzNzoxMTMsNjMyMzg6MTE0LDYzMjM5OjExNSw2MzI0MDoxMTYsNjMyNDE6MTE3LDYzMjQyOjExOCw2MzI0MzoxMTksNjMyNDQ6MTIwLDYzMjQ1OjEyMSw2MzI0NjoxMjIsNjMyNDc6MTIzLDYzMjQ4OjQ0LDYzMjcyOjQ2LDYzMjczOjM2LDYzMjc1OjM1LDYzMjc2OjMzLDYzMjc3OjM0LDYzMjg5OjE0NCw2MzMwMjo0NX0sQmM9e1VwOjM4LERvd246NDAsTGVmdDozNyxSaWdodDozOSxFbnRlcjoxMyxGMToxMTIsRjI6MTEzLEYzOjExNCxGNDoxMTUsRjU6MTE2LEY2OjExNyxGNzoxMTgsRjg6MTE5LEY5OjEyMCxGMTA6MTIxLEYxMToxMjIsRjEyOjEyMywiVSswMDdGIjo0NixIb21lOjM2LEVuZDozNSxQYWdlVXA6MzMsUGFnZURvd246MzQsSW5zZXJ0OjQ1fSxDYz0heXx8QSgiNTI1IiksRGM9eiYmeDsKSi5wcm90b3R5cGUuYT1mdW5jdGlvbihhKXtpZih5fHxiYilpZigxNz09dGhpcy53JiYhYS5jdHJsS2V5fHwxOD09dGhpcy53JiYhYS5hbHRLZXl8fHomJjkxPT10aGlzLncmJiFhLm1ldGFLZXkpdGhpcy5GPXRoaXMudz0tMTstMT09dGhpcy53JiYoYS5jdHJsS2V5JiYxNyE9YS5jP3RoaXMudz0xNzphLmFsdEtleSYmMTghPWEuYz90aGlzLnc9MTg6YS5tZXRhS2V5JiY5MSE9YS5jJiYodGhpcy53PTkxKSk7Q2MmJiF4YyhhLmMsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGEuYWx0S2V5LGEubWV0YUtleSk/dGhpcy5oYW5kbGVFdmVudChhKToodGhpcy5GPXdjKGEuYyksRGMmJih0aGlzLnVhPWEuYWx0S2V5KSl9O0oucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dGhpcy5GPXRoaXMudz0tMTt0aGlzLnVhPWEuYWx0S2V5fTsKSi5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5iLGM9Yi5hbHRLZXk7aWYodiYmImtleXByZXNzIj09YS50eXBlKXt2YXIgZD10aGlzLkY7dmFyIGU9MTMhPWQmJjI3IT1kP2Iua2V5Q29kZTowfWVsc2UoeXx8YmIpJiYia2V5cHJlc3MiPT1hLnR5cGU/KGQ9dGhpcy5GLGU9MDw9Yi5jaGFyQ29kZSYmNjMyMzI+Yi5jaGFyQ29kZSYmdmMoZCk/Yi5jaGFyQ29kZTowKTphYiYmIXk/KGQ9dGhpcy5GLGU9dmMoZCk/Yi5rZXlDb2RlOjApOigia2V5cHJlc3MiPT1hLnR5cGU/KERjJiYoYz10aGlzLnVhKSxiLmtleUNvZGU9PWIuY2hhckNvZGU/MzI+Yi5rZXlDb2RlPyhkPWIua2V5Q29kZSxlPTApOihkPXRoaXMuRixlPWIuY2hhckNvZGUpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkseiYmNjM9PWUmJjIyND09ZCYmKGQ9MTkxKSk7dmFyIGY9ZD13YyhkKTtkPzYzMjMyPD0KZCYmZCBpbiBBYz9mPUFjW2RdOjI1PT1kJiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBCYyYmKGY9QmNbYi5rZXlJZGVudGlmaWVyXSk7eCYmQ2MmJiJrZXlwcmVzcyI9PWEudHlwZSYmIXhjKGYsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KXx8KGE9Zj09dGhpcy53LHRoaXMudz1mLGI9bmV3IEVjKGYsZSxhLGIpLGIuYWx0S2V5PWMsdWModGhpcyxiKSl9O0oucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTsKdmFyIHpjPWZ1bmN0aW9uKGEsYixjKXthLm9hJiZGYyhhKTthLlM9YjthLm5hPWJjKGEuUywia2V5cHJlc3MiLGEsYyk7YS5DYT1iYyhhLlMsImtleWRvd24iLGEuYSxjLGEpO2Eub2E9YmMoYS5TLCJrZXl1cCIsYS5iLGMsYSl9LEZjPWZ1bmN0aW9uKGEpe2EubmEmJihrYyhhLm5hKSxrYyhhLkNhKSxrYyhhLm9hKSxhLm5hPW51bGwsYS5DYT1udWxsLGEub2E9bnVsbCk7YS5TPW51bGw7YS53PS0xO2EuRj0tMX07Si5wcm90b3R5cGUudT1mdW5jdGlvbigpe0ouaS51LmNhbGwodGhpcyk7RmModGhpcyl9O3ZhciBFYz1mdW5jdGlvbihhLGIsYyxkKXtHLmNhbGwodGhpcyxkKTt0aGlzLnR5cGU9ImtleSI7dGhpcy5jPWE7dGhpcy5yZXBlYXQ9Y307bihFYyxHKTt2YXIgR2M9eD8iTW96VXNlclNlbGVjdCI6eXx8YmI/IldlYmtpdFVzZXJTZWxlY3QiOm51bGwsSGM9ZnVuY3Rpb24oYSxiKXtiPWI/bnVsbDphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7aWYoR2Mpe3ZhciBjPSJub25lIjthLnN0eWxlJiYoYS5zdHlsZVtHY109Yyk7aWYoYil7YT0wO2Zvcih2YXIgZDtkPWJbYV07YSsrKWQuc3R5bGUmJihkLnN0eWxlW0djXT1jKX19ZWxzZSBpZih2fHxhYilpZihjPSJvbiIsYS5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyksYilmb3IoYT0wO2Q9YlthXTthKyspZC5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyl9O3ZhciBJYz1mdW5jdGlvbigpe307ZGEoSWMpO0ljLnByb3RvdHlwZS5hPTA7dmFyIEs9ZnVuY3Rpb24oYSl7SS5jYWxsKHRoaXMpO3RoaXMuaj1hfHx4YXx8KHhhPW5ldyB1Yik7dGhpcy5xYT1KYzt0aGlzLlk9bnVsbDt0aGlzLm09ITE7dGhpcy5hPW51bGw7dGhpcy5BPXZvaWQgMDt0aGlzLmc9dGhpcy5jPXRoaXMuYj1udWxsO3RoaXMuR2E9ITF9O24oSyxJKTtLLnByb3RvdHlwZS5PYT1JYy5SKCk7CnZhciBKYz1udWxsLEtjPWZ1bmN0aW9uKGEsYil7c3dpdGNoKGEpe2Nhc2UgMTpyZXR1cm4gYj8iZGlzYWJsZSI6ImVuYWJsZSI7Y2FzZSAyOnJldHVybiBiPyJoaWdobGlnaHQiOiJ1bmhpZ2hsaWdodCI7Y2FzZSA0OnJldHVybiBiPyJhY3RpdmF0ZSI6ImRlYWN0aXZhdGUiO2Nhc2UgODpyZXR1cm4gYj8ic2VsZWN0IjoidW5zZWxlY3QiO2Nhc2UgMTY6cmV0dXJuIGI/ImNoZWNrIjoidW5jaGVjayI7Y2FzZSAzMjpyZXR1cm4gYj8iZm9jdXMiOiJibHVyIjtjYXNlIDY0OnJldHVybiBiPyJvcGVuIjoiY2xvc2UifXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBzdGF0ZSIpO30sTGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuWXx8KGEuWT0iOiIrKGEuT2EuYSsrKS50b1N0cmluZygzNikpfSxNYz1mdW5jdGlvbihhLGIpe2lmKGEuYiYmYS5iLmcpe3ZhciBjPWEuYi5nLGQ9YS5ZO2QgaW4gYyYmZGVsZXRlIGNbZF07cWEoYS5iLmcsYixhKX1hLlk9Yn07Sy5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9Owp2YXIgTmM9ZnVuY3Rpb24oYSl7YT1hLmE7cShhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cmV0dXJuIGF9LE9jPWZ1bmN0aW9uKGEpe2EuQXx8KGEuQT1uZXcgb2MoYSkpO3JldHVybiBxKGEuQSl9O0sucHJvdG90eXBlLnJhPWZ1bmN0aW9uKGEpe2lmKHRoaXMuYiYmdGhpcy5iIT1hKXRocm93IEVycm9yKCJNZXRob2Qgbm90IHN1cHBvcnRlZCIpO0suaS5yYS5jYWxsKHRoaXMsYSl9O0sucHJvdG90eXBlLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPW5iKHRoaXMuai5hLCJESVYiKX07CnZhciBQYz1mdW5jdGlvbihhLGIpe2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiJiZhLnhhKGIpKXthLkdhPSEwO3ZhciBjPXFiKGIpO2EuaiYmYS5qLmE9PWN8fChhLmo9Yj9uZXcgdWIocWIoYikpOnhhfHwoeGE9bmV3IHViKSk7YS52YShiKTthLkQoKX1lbHNlIHRocm93IEVycm9yKCJJbnZhbGlkIGVsZW1lbnQgdG8gZGVjb3JhdGUiKTt9O2g9Sy5wcm90b3R5cGU7aC54YT1mdW5jdGlvbigpe3JldHVybiEwfTtoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hfTtoLkQ9ZnVuY3Rpb24oKXt0aGlzLm09ITA7UWModGhpcyxmdW5jdGlvbihhKXshYS5tJiZhLmYoKSYmYS5EKCl9KX07aC5QPWZ1bmN0aW9uKCl7UWModGhpcyxmdW5jdGlvbihhKXthLm0mJmEuUCgpfSk7dGhpcy5BJiZyYyh0aGlzLkEpO3RoaXMubT0hMX07CmgudT1mdW5jdGlvbigpe3RoaXMubSYmdGhpcy5QKCk7dGhpcy5BJiYodGhpcy5BLk4oKSxkZWxldGUgdGhpcy5BKTtRYyh0aGlzLGZ1bmN0aW9uKGEpe2EuTigpfSk7IXRoaXMuR2EmJnRoaXMuYSYmb2IodGhpcy5hKTt0aGlzLmI9dGhpcy5hPXRoaXMuZz10aGlzLmM9bnVsbDtLLmkudS5jYWxsKHRoaXMpfTtoLnNhPWZ1bmN0aW9uKGEsYil7dGhpcy50YShhLFJjKHRoaXMpLGIpfTsKaC50YT1mdW5jdGlvbihhLGIsYyl7cSghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLm0mJihjfHwhdGhpcy5tKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZigwPmJ8fGI+UmModGhpcykpdGhyb3cgRXJyb3IoIkNoaWxkIGNvbXBvbmVudCBpbmRleCBvdXQgb2YgYm91bmRzIik7dGhpcy5nJiZ0aGlzLmN8fCh0aGlzLmc9e30sdGhpcy5jPVtdKTtpZihhLmI9PXRoaXMpe3ZhciBkPUxjKGEpO3RoaXMuZ1tkXT1hO0hhKHRoaXMuYyxhKX1lbHNlIHFhKHRoaXMuZyxMYyhhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuYiYmYS5ZKXt2YXIgZT1hLmI7ZD1hLlk7ZS5nJiZkPyhlPWUuZyxkPShudWxsIT09ZSYmZCBpbiBlP2VbZF06dm9pZCAwKXx8bnVsbCk6ZD1udWxsfWlmKGQmJmEuYiE9dGhpcyl0aHJvdyBFcnJvcigiVW5hYmxlIHRvIHNldCBwYXJlbnQgY29tcG9uZW50Iik7CmEuYj10aGlzO0suaS5yYS5jYWxsKGEsdGhpcyk7TGEodGhpcy5jLGIsMCxhKTtpZihhLm0mJnRoaXMubSYmYS5iPT10aGlzKWM9dGhpcy5qYSgpLGI9Yy5jaGlsZE5vZGVzW2JdfHxudWxsLGIhPWEuZigpJiZjLmluc2VydEJlZm9yZShhLmYoKSxiKTtlbHNlIGlmKGMpe3RoaXMuYXx8dGhpcy5pYSgpO2M9TCh0aGlzLGIrMSk7Yj10aGlzLmphKCk7Yz1jP2MuYTpudWxsO2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTthLmF8fGEuaWEoKTtiP2IuaW5zZXJ0QmVmb3JlKGEuYSxjfHxudWxsKTphLmouYS5ib2R5LmFwcGVuZENoaWxkKGEuYSk7YS5iJiYhYS5iLm18fGEuRCgpfWVsc2UgdGhpcy5tJiYhYS5tJiZhLmEmJmEuYS5wYXJlbnROb2RlJiYxPT1hLmEucGFyZW50Tm9kZS5ub2RlVHlwZSYmYS5EKCl9O2guamE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hfTsKdmFyIFNjPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEucWEpe3ZhciBiPWEubT9hLmE6YS5qLmEuYm9keTthOnt2YXIgYz1xYihiKTtpZihjLmRlZmF1bHRWaWV3JiZjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihjPWMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpKSl7Yz1jLmRpcmVjdGlvbnx8Yy5nZXRQcm9wZXJ0eVZhbHVlKCJkaXJlY3Rpb24iKXx8IiI7YnJlYWsgYX1jPSIifWEucWE9InJ0bCI9PShjfHwoYi5jdXJyZW50U3R5bGU/Yi5jdXJyZW50U3R5bGUuZGlyZWN0aW9uOm51bGwpfHxiLnN0eWxlJiZiLnN0eWxlLmRpcmVjdGlvbil9cmV0dXJuIGEucWF9LFJjPWZ1bmN0aW9uKGEpe3JldHVybiBhLmM/YS5jLmxlbmd0aDowfSxMPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuYz9hLmNbYl18fG51bGw6bnVsbH0sUWM9ZnVuY3Rpb24oYSxiLGMpe2EuYyYmcihhLmMsYixjKX0sVGM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jJiZiP0RhKGEuYyxiKTotMX07dmFyIFZjPWZ1bmN0aW9uKGEsYil7aWYoIWEpdGhyb3cgRXJyb3IoIkludmFsaWQgY2xhc3MgbmFtZSAiK2EpO2lmKCFpYShiKSl0aHJvdyBFcnJvcigiSW52YWxpZCBkZWNvcmF0b3IgZnVuY3Rpb24gIitiKTtVY1thXT1ifSxXYz17fSxVYz17fTt2YXIgWGM9ZnVuY3Rpb24oYSl7dGhpcy5oPWF9O2RhKFhjKTt2YXIgWWM9ZnVuY3Rpb24oYSxiKXthJiYoYS50YWJJbmRleD1iPzA6LTEpfSwkYz1mdW5jdGlvbihhLGIsYyl7Yy5pZCYmTWMoYixjLmlkKTt2YXIgZD1hLmIoKSxlPSExLGY9RChjKTtmJiZyKGYsZnVuY3Rpb24oZyl7Zz09ZD9lPSEwOmcmJnRoaXMuZyhiLGcsZCl9LGEpO2V8fEViKGMsZCk7WmMoYixjKTtyZXR1cm4gY307WGMucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiLGMpe2I9PWMrIi1kaXNhYmxlZCI/YS5aKCExKTpiPT1jKyItaG9yaXpvbnRhbCI/YWQoYSwiaG9yaXpvbnRhbCIpOmI9PWMrIi12ZXJ0aWNhbCImJmFkKGEsInZlcnRpY2FsIil9Owp2YXIgWmM9ZnVuY3Rpb24oYSxiKXtpZihiKWZvcih2YXIgYz1iLmZpcnN0Q2hpbGQsZDtjJiZjLnBhcmVudE5vZGU9PWI7KXtkPWMubmV4dFNpYmxpbmc7aWYoMT09Yy5ub2RlVHlwZSl7YTp7dmFyIGU9YztxKGUpO2U9RChlKTtmb3IodmFyIGY9MCxnPWUubGVuZ3RoO2Y8ZztmKyspe3ZhciBrPWVbZl07aWYoaz1rIGluIFVjP1VjW2tdKCk6bnVsbCl7ZT1rO2JyZWFrIGF9fWU9bnVsbH1lJiYoZS5hPWMsYS5pc0VuYWJsZWQoKXx8ZS5aKCExKSxhLnNhKGUpLFBjKGUsYykpfWVsc2UgYy5ub2RlVmFsdWUmJiIiIT1NYShjLm5vZGVWYWx1ZSl8fGIucmVtb3ZlQ2hpbGQoYyk7Yz1kfX0sYmQ9ZnVuY3Rpb24oYSxiKXtiPWIuZigpO3EoYiwiVGhlIGNvbnRhaW5lciBET00gZWxlbWVudCBjYW5ub3QgYmUgbnVsbC4iKTtIYyhiLHgpO3YmJihiLmhpZGVGb2N1cz0hMCk7KGE9YS5oKSYmdmIoYixhKX07WGMucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKWGMucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5iKCksYz1bYiwiaG9yaXpvbnRhbCI9PWEuSD9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgTT1mdW5jdGlvbigpe30sY2Q7ZGEoTSk7dmFyIGRkPXtidXR0b246InByZXNzZWQiLGNoZWNrYm94OiJjaGVja2VkIixtZW51aXRlbToic2VsZWN0ZWQiLG1lbnVpdGVtY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtcmFkaW86ImNoZWNrZWQiLHJhZGlvOiJjaGVja2VkIix0YWI6InNlbGVjdGVkIix0cmVlaXRlbToic2VsZWN0ZWQifTtNLnByb3RvdHlwZS5oPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLmouYigiRElWIixlZCh0aGlzLGEpLmpvaW4oIiAiKSxhLmJhKX07dmFyIGdkPWZ1bmN0aW9uKGEsYixjKXtpZihhPWEuZj9hLmYoKTphKXt2YXIgZD1bYl07diYmIUEoIjciKSYmKGQ9ZmQoRChhKSxiKSxkLnB1c2goYikpOyhjP0ZiOkhiKShhLGQpfX07Ck0ucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiKXtiLmlkJiZNYyhhLGIuaWQpO2ImJmIuZmlyc3RDaGlsZD9oZChhLGIuZmlyc3RDaGlsZC5uZXh0U2libGluZz9KYShiLmNoaWxkTm9kZXMpOmIuZmlyc3RDaGlsZCk6YS5iYT1udWxsO3ZhciBjPTAsZD10aGlzLmEoKSxlPXRoaXMuYSgpLGY9ITEsZz0hMSxrPSExLHA9SmEoRChiKSk7cihwLGZ1bmN0aW9uKEIpe2Z8fEIhPWQ/Z3x8QiE9ZT9jfD1pZCh0aGlzLEIpOmc9ITA6KGY9ITAsZT09ZCYmKGc9ITApKTsxPT1pZCh0aGlzLEIpJiYoQWEoYiksc2IoYikmJnRiKGIpJiZyYihiLCExKSl9LHRoaXMpO2Eubz1jO2Z8fChwLnB1c2goZCksZT09ZCYmKGc9ITApKTtnfHxwLnB1c2goZSk7KGE9YS53YSkmJnAucHVzaC5hcHBseShwLGEpO2lmKHYmJiFBKCI3Iikpe3ZhciB3PWZkKHApOzA8dy5sZW5ndGgmJihwLnB1c2guYXBwbHkocCx3KSxrPSEwKX1mJiZnJiYhYSYmIWt8fENiKGIscC5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIGpkPWZ1bmN0aW9uKGEsYil7aWYoYT1hLmgoKSl7cShiLCJUaGUgZWxlbWVudCBwYXNzZWQgYXMgYSBmaXJzdCBwYXJhbWV0ZXIgY2Fubm90IGJlIG51bGwuIik7dmFyIGM9Yi5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDthIT1jJiZ2YihiLGEpfX0sa2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYztpZihhLnYmMzImJihjPWEuZigpKSl7aWYoIWImJmEubyYzMil7dHJ5e2MuYmx1cigpfWNhdGNoKGQpe31hLm8mMzImJmEuRmEobnVsbCl9KHNiKGMpJiZ0YihjKSkhPWImJnJiKGMsYil9fSxsZD1mdW5jdGlvbihhLGIsYyl7Y2R8fChjZD17MToiZGlzYWJsZWQiLDg6InNlbGVjdGVkIiwxNjoiY2hlY2tlZCIsNjQ6ImV4cGFuZGVkIn0pO3EoYSwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO2I9Y2RbYl07dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDtkJiYoZD1kZFtkXXx8YixiPSJjaGVja2VkIj09Ynx8InNlbGVjdGVkIj09CmI/ZDpiKTtiJiZ4YihhLGIsYyl9O00ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250cm9sIn07CnZhciBlZD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuYSgpLGQ9W2NdLGU9YS5hKCk7ZSE9YyYmZC5wdXNoKGUpO2M9Yi5vO2ZvcihlPVtdO2M7KXt2YXIgZj1jJi1jO2UucHVzaChtZChhLGYpKTtjJj1+Zn1kLnB1c2guYXBwbHkoZCxlKTsoYT1iLndhKSYmZC5wdXNoLmFwcGx5KGQsYSk7diYmIUEoIjciKSYmZC5wdXNoLmFwcGx5KGQsZmQoZCkpO3JldHVybiBkfSxmZD1mdW5jdGlvbihhLGIpe3ZhciBjPVtdO2ImJihhPUlhKGEsW2JdKSk7cihbXSxmdW5jdGlvbihkKXshRmEoZCxsYShHYSxhKSl8fGImJiFHYShkLGIpfHxjLnB1c2goZC5qb2luKCJfIikpfSk7cmV0dXJuIGN9LG1kPWZ1bmN0aW9uKGEsYil7YS5ifHxuZChhKTtyZXR1cm4gYS5iW2JdfSxpZD1mdW5jdGlvbihhLGIpe2Euanx8KGEuYnx8bmQoYSksYS5qPXNhKGEuYikpO2E9cGFyc2VJbnQoYS5qW2JdLDEwKTtyZXR1cm4gaXNOYU4oYSk/MDphfSxuZD1mdW5jdGlvbihhKXt2YXIgYj1hLmEoKSxjPSF0KGIucmVwbGFjZSgvXHhhMHxccy9nLAoiICIpLCIgIik7cShjLCJDb250cm9sUmVuZGVyZXIgaGFzIGFuIGludmFsaWQgY3NzIGNsYXNzOiAnIitiKyInIik7YS5iPXsxOmIrIi1kaXNhYmxlZCIsMjpiKyItaG92ZXIiLDQ6YisiLWFjdGl2ZSIsODpiKyItc2VsZWN0ZWQiLDE2OmIrIi1jaGVja2VkIiwzMjpiKyItZm9jdXNlZCIsNjQ6YisiLW9wZW4ifX07dmFyIE49ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO2lmKCFiKXtiPXRoaXMuY29uc3RydWN0b3I7Zm9yKHZhciBkO2I7KXtkPWJbamFdfHwoYltqYV09KytrYSk7aWYoZD1XY1tkXSlicmVhaztiPWIuaT9iLmkuY29uc3RydWN0b3I6bnVsbH1iPWQ/aWEoZC5SKT9kLlIoKTpuZXcgZDpudWxsfXRoaXMuQj1iO3RoaXMuYmE9dm9pZCAwIT09YT9hOm51bGx9O24oTixLKTtoPU4ucHJvdG90eXBlO2guYmE9bnVsbDtoLm89MDtoLnY9Mzk7aC5LPTA7aC5JYT0hMDtoLndhPW51bGw7aC55YT0hMDtoLmlhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CLmModGhpcyk7dGhpcy5hPWE7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmeGIoYSwiaGlkZGVuIiwhMCkpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hPXRoaXMuQi5nKHRoaXMsYSk7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5JYT0ibm9uZSIhPWEuc3R5bGUuZGlzcGxheX07CmguRD1mdW5jdGlvbigpe04uaS5ELmNhbGwodGhpcyk7dmFyIGE9TmModGhpcyk7cSh0aGlzKTtxKGEpO3RoaXMuaXNWaXNpYmxlKCl8fHhiKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fGxkKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy52JjgmJmxkKGEsOCwhISh0aGlzLm8mOCkpO3RoaXMudiYxNiYmbGQoYSwxNiwhISh0aGlzLm8mMTYpKTt0aGlzLnYmNjQmJmxkKGEsNjQsISEodGhpcy5vJjY0KSk7YT10aGlzLkI7U2ModGhpcykmJmdkKHRoaXMuZigpLGEuYSgpKyItcnRsIiwhMCk7dGhpcy5pc0VuYWJsZWQoKSYma2QodGhpcyx0aGlzLmlzVmlzaWJsZSgpKTtpZih0aGlzLnYmLTImJih0aGlzLnlhJiZvZCh0aGlzLCEwKSx0aGlzLnYmMzImJihhPXRoaXMuZigpKSkpe3ZhciBiPXRoaXMuV3x8KHRoaXMuVz1uZXcgSik7emMoYixhKTtIKEgoSChPYyh0aGlzKSxiLCJrZXkiLHRoaXMuZmEpLGEsImZvY3VzIix0aGlzLk5hKSxhLCJibHVyIiwKdGhpcy5GYSl9fTt2YXIgb2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYz1PYyhhKSxkPWEuZigpO2I/KEgoSChIKEgoYyxkLEYuTCxhLmthKSxkLFtGLk0sRi5hYV0sYS5sYSksZCwibW91c2VvdmVyIixhLkFhKSxkLCJtb3VzZW91dCIsYS56YSksYS5lYSE9Y2EmJkgoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fEgoYyxkLCJkYmxjbGljayIsYS5KYSksYS5nYXx8KGEuZ2E9bmV3IHBkKGEpLHpiKGEsbGEoQWIsYS5nYSkpKSkpOihxYyhxYyhxYyhxYyhjLGQsRi5MLGEua2EpLGQsW0YuTSxGLmFhXSxhLmxhKSxkLCJtb3VzZW92ZXIiLGEuQWEpLGQsIm1vdXNlb3V0IixhLnphKSxhLmVhIT1jYSYmcWMoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fHFjKGMsZCwiZGJsY2xpY2siLGEuSmEpLEFiKGEuZ2EpLGEuZ2E9bnVsbCkpfTsKTi5wcm90b3R5cGUuUD1mdW5jdGlvbigpe04uaS5QLmNhbGwodGhpcyk7dGhpcy5XJiZGYyh0aGlzLlcpO3RoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJmtkKHRoaXMsITEpfTtOLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7Ti5pLnUuY2FsbCh0aGlzKTt0aGlzLlcmJih0aGlzLlcuTigpLGRlbGV0ZSB0aGlzLlcpO2RlbGV0ZSB0aGlzLkI7dGhpcy5nYT10aGlzLndhPXRoaXMuYmE9bnVsbH07dmFyIGhkPWZ1bmN0aW9uKGEsYil7YS5iYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm8mMSl9OwpOLnByb3RvdHlwZS5aPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYjtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0VuYWJsZWQmJiFiLmlzRW5hYmxlZCgpfHwhTyh0aGlzLDEsIWEpfHwoYXx8KHFkKHRoaXMsITEpLFAodGhpcywhMSkpLHRoaXMuaXNWaXNpYmxlKCkmJmtkKHRoaXMsYSksUSh0aGlzLDEsIWEsITApKX07CnZhciBQPWZ1bmN0aW9uKGEsYil7TyhhLDIsYikmJlEoYSwyLGIpfSxxZD1mdW5jdGlvbihhLGIpe08oYSw0LGIpJiZRKGEsNCxiKX0scmQ9ZnVuY3Rpb24oYSxiKXtPKGEsOCxiKSYmUShhLDgsYil9LHNkPWZ1bmN0aW9uKGEsYil7TyhhLDY0LGIpJiZRKGEsNjQsYil9LFE9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIWQmJjE9PWIpYS5aKCFjKTtlbHNlIGlmKGEudiZiJiZjIT0hIShhLm8mYikpe3ZhciBlPWEuQjtpZihkPWEuZigpKShlPW1kKGUsYikpJiZnZChhLGUsYyksbGQoZCxiLGMpO2Eubz1jP2Eub3xiOmEubyZ+Yn19LHRkPWZ1bmN0aW9uKGEsYixjKXtpZihhLm0mJmEubyZiJiYhYyl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTshYyYmYS5vJmImJlEoYSxiLCExKTthLnY9Yz9hLnZ8YjphLnYmfmJ9LFI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hISgyNTUmYikmJiEhKGEudiZiKX0sTz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuISEoYS52JmIpJiYhIShhLm8mCmIpIT1jJiYoIShhLksmYil8fHVjKGEsS2MoYixjKSkpJiYhYS5VfTtoPU4ucHJvdG90eXBlO2guQWE9ZnVuY3Rpb24oYSl7KCFhLnJlbGF0ZWRUYXJnZXR8fCFwYih0aGlzLmYoKSxhLnJlbGF0ZWRUYXJnZXQpKSYmdWModGhpcywiZW50ZXIiKSYmdGhpcy5pc0VuYWJsZWQoKSYmUih0aGlzLDIpJiZQKHRoaXMsITApfTtoLnphPWZ1bmN0aW9uKGEpe2EucmVsYXRlZFRhcmdldCYmcGIodGhpcy5mKCksYS5yZWxhdGVkVGFyZ2V0KXx8IXVjKHRoaXMsImxlYXZlIil8fChSKHRoaXMsNCkmJnFkKHRoaXMsITEpLFIodGhpcywyKSYmUCh0aGlzLCExKSl9O2guZWE9Y2E7Cmgua2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSxPYihhKSYmISh5JiZ6JiZhLmN0cmxLZXkpKSl7Uih0aGlzLDQpJiZxZCh0aGlzLCEwKTt2YXIgYjtpZihiPXRoaXMuQil7dmFyIGM7Yj10aGlzLnYmMzImJihjPXRoaXMuZigpKT9zYihjKSYmdGIoYyk6ITF9YiYmdGhpcy5mKCkuZm9jdXMoKX0hT2IoYSl8fHkmJnomJmEuY3RybEtleXx8YS5nKCl9O2gubGE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSx0aGlzLm8mNCYmdWQodGhpcyxhKSYmUih0aGlzLDQpJiZxZCh0aGlzLCExKSl9O2guSmE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmdWQodGhpcyxhKX07CnZhciB1ZD1mdW5jdGlvbihhLGIpe2lmKFIoYSwxNikpe3ZhciBjPSEoYS5vJjE2KTtPKGEsMTYsYykmJlEoYSwxNixjKX1SKGEsOCkmJnJkKGEsITApO1IoYSw2NCkmJnNkKGEsIShhLm8mNjQpKTtjPW5ldyBFKCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuQT1iLkEpO3JldHVybiB1YyhhLGMpfTtOLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe1IodGhpcywzMikmJk8odGhpcywzMiwhMCkmJlEodGhpcywzMiwhMCl9O04ucHJvdG90eXBlLkZhPWZ1bmN0aW9uKCl7Uih0aGlzLDQpJiZxZCh0aGlzLCExKTtSKHRoaXMsMzIpJiZPKHRoaXMsMzIsITEpJiZRKHRoaXMsMzIsITEpfTsKTi5wcm90b3R5cGUuZmE9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJjEzPT1hLmMmJnVkKHRoaXMsYSk/KGEuZygpLGEuaigpLCEwKTohMX07aWYoIWlhKE4pKXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBjbGFzcyAiK04pO2lmKCFpYShNKSl0aHJvdyBFcnJvcigiSW52YWxpZCByZW5kZXJlciBjbGFzcyAiK00pO3ZhciB2ZD1OW2phXXx8KE5bamFdPSsra2EpO1djW3ZkXT1NO1ZjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIHBkPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9ITE7dGhpcy5jPW5ldyBvYyh0aGlzKTt6Yih0aGlzLGxhKEFiLHRoaXMuYykpO2E9TmModGhpcy5iKTtIKEgoSCh0aGlzLmMsYSxGLkwsdGhpcy5oKSxhLEYuTSx0aGlzLmopLGEsImNsaWNrIix0aGlzLmcpfTtuKHBkLEMpO3ZhciB3ZD0hdnx8OTw9TnVtYmVyKGliKTsKcGQucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXt0aGlzLmE9ITF9O3BkLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7dGhpcy5hPSEwfTt2YXIgeGQ9ZnVuY3Rpb24oYSxiKXtpZighd2QpcmV0dXJuIGEuYnV0dG9uPTAsYS50eXBlPWIsYTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudHMiKTtjLmluaXRNb3VzZUV2ZW50KGIsYS5idWJibGVzLGEuY2FuY2VsYWJsZSxhLnZpZXd8fG51bGwsYS5kZXRhaWwsYS5zY3JlZW5YLGEuc2NyZWVuWSxhLmNsaWVudFgsYS5jbGllbnRZLGEuY3RybEtleSxhLmFsdEtleSxhLnNoaWZ0S2V5LGEubWV0YUtleSwwLGEucmVsYXRlZFRhcmdldHx8bnVsbCk7cmV0dXJuIGN9OwpwZC5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXtpZih0aGlzLmEpdGhpcy5hPSExO2Vsc2V7dmFyIGI9YS5iLGM9Yi5idXR0b24sZD1iLnR5cGUsZT14ZChiLCJtb3VzZWRvd24iKTt0aGlzLmIua2EobmV3IEcoZSxhLmEpKTtlPXhkKGIsIm1vdXNldXAiKTt0aGlzLmIubGEobmV3IEcoZSxhLmEpKTt3ZHx8KGIuYnV0dG9uPWMsYi50eXBlPWQpfX07cGQucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt0aGlzLmI9bnVsbDtwZC5pLnUuY2FsbCh0aGlzKX07dmFyIFM9ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO3RoaXMuZGE9Ynx8WGMuUigpO3RoaXMuSD1hfHwidmVydGljYWwifTtuKFMsSyk7aD1TLnByb3RvdHlwZTtoLkRhPW51bGw7aC5jYT1udWxsO2guZGE9bnVsbDtoLkg9bnVsbDtoLlQ9ITA7aC5PPSEwO2gubD0tMTtoLnM9bnVsbDtoLlY9ITE7aC5JPW51bGw7dmFyIHlkPWZ1bmN0aW9uKGEpe3JldHVybiBhLkRhfHxhLmYoKX07aD1TLnByb3RvdHlwZTtoLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPXRoaXMuai5iKCJESVYiLHRoaXMuZGEuYyh0aGlzKS5qb2luKCIgIikpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKGEpe3JldHVybiJESVYiPT1hLnRhZ05hbWV9O2gudmE9ZnVuY3Rpb24oYSl7dGhpcy5hPSRjKHRoaXMuZGEsdGhpcyxhKTsibm9uZSI9PWEuc3R5bGUuZGlzcGxheSYmKHRoaXMuVD0hMSl9OwpoLkQ9ZnVuY3Rpb24oKXtTLmkuRC5jYWxsKHRoaXMpO1FjKHRoaXMsZnVuY3Rpb24oYil7Yi5tJiZ6ZCh0aGlzLGIpfSx0aGlzKTt2YXIgYT10aGlzLmYoKTtiZCh0aGlzLmRhLHRoaXMpO0FkKHRoaXMsdGhpcy5UKTtIKEgoSChIKEgoSChIKEgoT2ModGhpcyksdGhpcywiZW50ZXIiLHRoaXMuV2EpLHRoaXMsImhpZ2hsaWdodCIsdGhpcy5YYSksdGhpcywidW5oaWdobGlnaHQiLHRoaXMuY2IpLHRoaXMsIm9wZW4iLHRoaXMuWWEpLHRoaXMsImNsb3NlIix0aGlzLlVhKSxhLEYuTCx0aGlzLlNhKSxxYihhKSxbRi5NLEYuYWFdLHRoaXMuVmEpLGEsW0YuTCxGLk0sRi5hYSwibW91c2VvdmVyIiwibW91c2VvdXQiLCJjb250ZXh0bWVudSJdLHRoaXMuVGEpO0JkKHRoaXMpfTt2YXIgQmQ9ZnVuY3Rpb24oYSl7dmFyIGI9T2MoYSksYz15ZChhKTtIKEgoSChiLGMsImZvY3VzIixhLkhhKSxjLCJibHVyIixhLlFhKSxhLmNhfHwoYS5jYT1uZXcgSih5ZChhKSkpLCJrZXkiLGEuUmEpfTtoPVMucHJvdG90eXBlOwpoLlA9ZnVuY3Rpb24oKXtDZCh0aGlzLC0xKTt0aGlzLnMmJnNkKHRoaXMucywhMSk7dGhpcy5WPSExO1MuaS5QLmNhbGwodGhpcyl9O2gudT1mdW5jdGlvbigpe1MuaS51LmNhbGwodGhpcyk7dGhpcy5jYSYmKHRoaXMuY2EuTigpLHRoaXMuY2E9bnVsbCk7dGhpcy5kYT10aGlzLnM9dGhpcy5JPXRoaXMuRGE9bnVsbH07aC5XYT1mdW5jdGlvbigpe3JldHVybiEwfTsKaC5YYT1mdW5jdGlvbihhKXt2YXIgYj1UYyh0aGlzLGEudGFyZ2V0KTtpZigtMTxiJiZiIT10aGlzLmwpe3ZhciBjPUwodGhpcyx0aGlzLmwpO2MmJlAoYywhMSk7dGhpcy5sPWI7Yz1MKHRoaXMsdGhpcy5sKTt0aGlzLlYmJnFkKGMsITApO3RoaXMucyYmYyE9dGhpcy5zJiYoYy52JjY0P3NkKGMsITApOnNkKHRoaXMucywhMSkpfWI9dGhpcy5mKCk7cShiLCJUaGUgRE9NIGVsZW1lbnQgZm9yIHRoZSBjb250YWluZXIgY2Fubm90IGJlIG51bGwuIik7bnVsbCE9YS50YXJnZXQuZigpJiZ4YihiLCJhY3RpdmVkZXNjZW5kYW50IixhLnRhcmdldC5mKCkuaWQpfTtoLmNiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT1MKHRoaXMsdGhpcy5sKSYmKHRoaXMubD0tMSk7YT10aGlzLmYoKTtxKGEsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnJlbW92ZUF0dHJpYnV0ZSh3YigiYWN0aXZlZGVzY2VuZGFudCIpKX07CmguWWE9ZnVuY3Rpb24oYSl7KGE9YS50YXJnZXQpJiZhIT10aGlzLnMmJmEuYj09dGhpcyYmKHRoaXMucyYmc2QodGhpcy5zLCExKSx0aGlzLnM9YSl9O2guVWE9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMucyYmKHRoaXMucz1udWxsKTt2YXIgYj10aGlzLmYoKSxjPWEudGFyZ2V0LmYoKTtiJiZhLnRhcmdldC5vJjImJmMmJihhPSIiLGMmJihhPWMuaWQscShhLCJUaGUgYWN0aXZlIGVsZW1lbnQgc2hvdWxkIGhhdmUgYW4gaWQuIikpLHhiKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEpKX07aC5TYT1mdW5jdGlvbihhKXt0aGlzLk8mJih0aGlzLlY9ITApO3ZhciBiPXlkKHRoaXMpO2ImJnNiKGIpJiZ0YihiKT9iLmZvY3VzKCk6YS5nKCl9O2guVmE9ZnVuY3Rpb24oKXt0aGlzLlY9ITF9OwpoLlRhPWZ1bmN0aW9uKGEpe2E6e3ZhciBiPWEudGFyZ2V0O2lmKHRoaXMuSSlmb3IodmFyIGM9dGhpcy5mKCk7YiYmYiE9PWM7KXt2YXIgZD1iLmlkO2lmKGQgaW4gdGhpcy5JKXtiPXRoaXMuSVtkXTticmVhayBhfWI9Yi5wYXJlbnROb2RlfWI9bnVsbH1pZihiKXN3aXRjaChhLnR5cGUpe2Nhc2UgRi5MOmIua2EoYSk7YnJlYWs7Y2FzZSBGLk06Y2FzZSBGLmFhOmIubGEoYSk7YnJlYWs7Y2FzZSAibW91c2VvdmVyIjpiLkFhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3V0IjpiLnphKGEpO2JyZWFrO2Nhc2UgImNvbnRleHRtZW51IjpiLmVhKGEpfX07aC5IYT1mdW5jdGlvbigpe307aC5RYT1mdW5jdGlvbigpe0NkKHRoaXMsLTEpO3RoaXMuVj0hMTt0aGlzLnMmJnNkKHRoaXMucywhMSl9OwpoLlJhPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmlzRW5hYmxlZCgpJiZ0aGlzLmlzVmlzaWJsZSgpJiYoMCE9UmModGhpcyl8fHRoaXMuRGEpJiZEZCh0aGlzLGEpPyhhLmcoKSxhLmooKSwhMCk6ITF9Owp2YXIgRGQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1MKGEsYS5sKTtpZihjJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5mYSYmYy5mYShiKXx8YS5zJiZhLnMhPWMmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLnMuZmEmJmEucy5mYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuYyl7Y2FzZSAyNzp5ZChhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpFZChhKTticmVhaztjYXNlIDM1OkZkKGEpO2JyZWFrO2Nhc2UgMzg6aWYoInZlcnRpY2FsIj09YS5IKUdkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9IZChhKTpHZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoInZlcnRpY2FsIj09YS5IKUhkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9HZChhKTpIZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSx6ZD1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZigpO2M9Yy5pZHx8KGMuaWQ9TGMoYikpO2EuSXx8KGEuST17fSk7YS5JW2NdPWJ9O1MucHJvdG90eXBlLnNhPWZ1bmN0aW9uKGEsYil7Q2EoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtTLmkuc2EuY2FsbCh0aGlzLGEsYil9O1MucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEsYixjKXtDYShhLE4pO2EuS3w9MjthLkt8PTY0O3RkKGEsMzIsITEpO2EubSYmMCE9YS55YSYmb2QoYSwhMSk7YS55YT0hMTt2YXIgZD1hLmI9PXRoaXM/VGModGhpcyxhKTotMTtTLmkudGEuY2FsbCh0aGlzLGEsYixjKTthLm0mJnRoaXMubSYmemQodGhpcyxhKTthPWQ7LTE9PWEmJihhPVJjKHRoaXMpKTthPT10aGlzLmw/dGhpcy5sPU1hdGgubWluKFJjKHRoaXMpLTEsYik6YT50aGlzLmwmJmI8PXRoaXMubD90aGlzLmwrKzphPHRoaXMubCYmYj50aGlzLmwmJnRoaXMubC0tfTsKdmFyIGFkPWZ1bmN0aW9uKGEsYil7aWYoYS5mKCkpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5IPWJ9O1MucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O3ZhciBBZD1mdW5jdGlvbihhLGIpe2EuVD1iO3ZhciBjPWEuZigpO2MmJihjLnN0eWxlLmRpc3BsYXk9Yj8iIjoibm9uZSIsWWMoeWQoYSksYS5PJiZhLlQpKX07Uy5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT307Uy5wcm90b3R5cGUuWj1mdW5jdGlvbihhKXt0aGlzLk8hPWEmJnVjKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5PPSEwLFFjKHRoaXMsZnVuY3Rpb24oYil7Yi5MYT9kZWxldGUgYi5MYTpiLlooITApfSkpOihRYyh0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5aKCExKTpiLkxhPSEwfSksdGhpcy5WPXRoaXMuTz0hMSksWWMoeWQodGhpcyksYSYmdGhpcy5UKSl9Owp2YXIgQ2Q9ZnVuY3Rpb24oYSxiKXsoYj1MKGEsYikpP1AoYiwhMCk6LTE8YS5sJiZQKEwoYSxhLmwpLCExKX0sRWQ9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LFJjKGEpLTEpfSxGZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiAwPmI/Yy0xOmJ9LDApfSxIZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7cmV0dXJuKGIrMSklY30sYS5sKX0sR2Q9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe2ItLTtyZXR1cm4gMD5iP2MtMTpifSxhLmwpfSxJZD1mdW5jdGlvbihhLGIsYyl7Yz0wPmM/VGMoYSxhLnMpOmM7dmFyIGQ9UmMoYSk7Yz1iLmNhbGwoYSxjLGQpO2Zvcih2YXIgZT0wO2U8PWQ7KXt2YXIgZj1MKGEsYyksZztpZihnPWYpZz1mLmlzVmlzaWJsZSgpJiZmLmlzRW5hYmxlZCgpJiYhIShmLnYmMik7aWYoZyl7YS5FYShjKTticmVha31lKys7Yz1iLmNhbGwoYSxjLGQpfX07ClMucHJvdG90eXBlLkVhPWZ1bmN0aW9uKGEpe0NkKHRoaXMsYSl9O3ZhciBUPWZ1bmN0aW9uKCl7fTtuKFQsTSk7ZGEoVCk7VC5wcm90b3R5cGUuYT1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYiJ9O1QucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXtyZXR1cm4idGFiIn07VC5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYj1ULmkuYy5jYWxsKHRoaXMsYSk7KGE9YS5QYSkmJmImJihiLnRpdGxlPWF8fCIiKTtyZXR1cm4gYn07VC5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIpe2I9VC5pLmcuY2FsbCh0aGlzLGEsYik7dmFyIGM9Yi50aXRsZXx8IiI7YyYmKGEuUGE9Yyk7YS5vJjgmJihjPWEuYikmJmlhKGMuRykmJihRKGEsOCwhMSksYy5HKGEpKTtyZXR1cm4gYn07dmFyIEpkPWZ1bmN0aW9uKGEsYixjKXtOLmNhbGwodGhpcyxhLGJ8fFQuUigpLGMpO3RkKHRoaXMsOCwhMCk7dGhpcy5LfD05fTtuKEpkLE4pO1ZjKCJnb29nLXRhYiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEpkKG51bGwpfSk7dmFyIFU9ZnVuY3Rpb24oKXt0aGlzLmg9InRhYmxpc3QifTtuKFUsWGMpO2RhKFUpO1UucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWItYmFyIn07VS5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIsYyl7dGhpcy5qfHwodGhpcy5hfHxLZCh0aGlzKSx0aGlzLmo9c2EodGhpcy5hKSk7dmFyIGQ9dGhpcy5qW2JdO2Q/KGFkKGEsTGQoZCkpLGEuQj1kKTpVLmkuZy5jYWxsKHRoaXMsYSxiLGMpfTtVLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPVUuaS5jLmNhbGwodGhpcyxhKTt0aGlzLmF8fEtkKHRoaXMpO2IucHVzaCh0aGlzLmFbYS5CXSk7cmV0dXJuIGJ9O3ZhciBLZD1mdW5jdGlvbihhKXt2YXIgYj1hLmIoKTthLmE9e3RvcDpiKyItdG9wIixib3R0b206YisiLWJvdHRvbSIsc3RhcnQ6YisiLXN0YXJ0IixlbmQ6YisiLWVuZCJ9fTt2YXIgVj1mdW5jdGlvbihhLGIsYyl7YT1hfHwidG9wIjthZCh0aGlzLExkKGEpKTt0aGlzLkI9YTtTLmNhbGwodGhpcyx0aGlzLkgsYnx8VS5SKCksYyk7TWQodGhpcyl9O24oVixTKTtoPVYucHJvdG90eXBlO2guQz1udWxsO2guRD1mdW5jdGlvbigpe1YuaS5ELmNhbGwodGhpcyk7TWQodGhpcyl9O2gudT1mdW5jdGlvbigpe1YuaS51LmNhbGwodGhpcyk7dGhpcy5DPW51bGx9O2guRWE9ZnVuY3Rpb24oYSl7Vi5pLkVhLmNhbGwodGhpcyxhKTt0aGlzLkcoTCh0aGlzLGEpKX07aC5HPWZ1bmN0aW9uKGEpe2E/cmQoYSwhMCk6dGhpcy5DJiZyZCh0aGlzLkMsITEpfTsKdmFyIE5kPWZ1bmN0aW9uKGEsYil7aWYoYiYmYj09YS5DKXtmb3IodmFyIGM9VGMoYSxiKSxkPWMtMTtiPUwoYSxkKTtkLS0pe3ZhciBlPWI7aWYoZS5pc1Zpc2libGUoKSYmZS5pc0VuYWJsZWQoKSl7YS5HKGIpO3JldHVybn19Zm9yKGMrPTE7Yj1MKGEsYyk7YysrKWlmKGQ9YixkLmlzVmlzaWJsZSgpJiZkLmlzRW5hYmxlZCgpKXthLkcoYik7cmV0dXJufWEuRyhudWxsKX19O2g9Vi5wcm90b3R5cGU7aC5hYj1mdW5jdGlvbihhKXt0aGlzLkMmJnRoaXMuQyE9YS50YXJnZXQmJnJkKHRoaXMuQywhMSk7dGhpcy5DPWEudGFyZ2V0fTtoLmJiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT10aGlzLkMmJih0aGlzLkM9bnVsbCl9O2guWmE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guJGE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guSGE9ZnVuY3Rpb24oKXtMKHRoaXMsdGhpcy5sKXx8Q2QodGhpcyxUYyh0aGlzLHRoaXMuQ3x8TCh0aGlzLDApKSl9Owp2YXIgTWQ9ZnVuY3Rpb24oYSl7SChIKEgoSChPYyhhKSxhLCJzZWxlY3QiLGEuYWIpLGEsInVuc2VsZWN0IixhLmJiKSxhLCJkaXNhYmxlIixhLlphKSxhLCJoaWRlIixhLiRhKX0sTGQ9ZnVuY3Rpb24oYSl7cmV0dXJuInN0YXJ0Ij09YXx8ImVuZCI9PWE/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O1ZjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBWfSk7ZnVuY3Rpb24gT2QoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIFBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgZz1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIrZyk7Zm9yKHZhciBrPVtdLHA9YmEoYyksdz1wLm5leHQoKTshdy5kb25lO3c9cC5uZXh0KCkpe3c9dy52YWx1ZTt2YXIgQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKQi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO0IudGV4dENvbnRlbnQ9dztmLmFwcGVuZENoaWxkKEIpO2sucHVzaChCKX0iYm90dG9tIiE9ZyYmZS5hcHBlbmRDaGlsZChmKTtwPW51bGw7aWYoInRvcCI9PWd8fCJib3R0b20iPT1nKXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTsidG9wIj09ZyYmcCYmZS5hcHBlbmRDaGlsZChwKTtCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0IuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciByYT1bXTtjPWJhKGMpO2Zvcih3PWMubmV4dCgpOyF3LmRvbmU7dz1jLm5leHQoKSl3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHcuaWQ9ZS5pZCsiX2NvbnRlbnRfIityYS5sZW5ndGgsdy5zdHlsZS5kaXNwbGF5PSJub25lIixCLmFwcGVuZENoaWxkKHcpLHJhLnB1c2godyk7ZS5hcHBlbmRDaGlsZChCKTsiYm90dG9tIj09ZyYmKHAmJgplLmFwcGVuZENoaWxkKHApLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBYPW5ldyBWKGcpO1BjKFgsZik7dmFyIFk9LTE7ZGMoWCwic2VsZWN0IixmdW5jdGlvbihaKXtaPWsuaW5kZXhPZihaLnRhcmdldC5mKCkpO1ohPVkmJigwPD1ZJiZZPHJhLmxlbmd0aCYmKHJhW1ldLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFk9LTEpLDA8PVomJlo8cmEubGVuZ3RoJiYoWT1aLHJhW1ldLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksWC5HKEwoWCxZKSkpfSk7WC5HKEwoWCxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFope1guRyhMKFgsWikpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChPZChhKSl9LFFkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sVz1sOwpRZFswXWluIFd8fCJ1bmRlZmluZWQiPT10eXBlb2YgVy5leGVjU2NyaXB0fHxXLmV4ZWNTY3JpcHQoInZhciAiK1FkWzBdKTtmb3IodmFyIFJkO1FkLmxlbmd0aCYmKFJkPVFkLnNoaWZ0KCkpOylRZC5sZW5ndGh8fHZvaWQgMD09PVBkP1dbUmRdJiZXW1JkXSE9PU9iamVjdC5wcm90b3R5cGVbUmRdP1c9V1tSZF06Vz1XW1JkXT17fTpXW1JkXT1QZDt9KS5jYWxsKHRoaXMpOwovLyBjbGFuZy1mb3JtYXQgb24K", + "headers": [ + [ + "content-type", + "application/javascript" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + } + } + }, + "executionInfo": { + "elapsed": 18856, + "status": "ok", + "timestamp": 1600709626650, + "user": { + "displayName": "Evgeny Skvortsov", + "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhiQjODaOVLfYnUuWS9rB3LRntzJDM0hqElzsUkdQ=s64", + "userId": "11510585406840398626" + }, + "user_tz": 420 + }, + "id": "x0dixQKTo1t9", + "outputId": "a328e418-72a5-4b2f-fd29-8007d975b072" + }, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id26" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id26" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id26" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"994a10a2-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id26\", \"tabNames\": [\"ByRoleCount\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_e3c0ae1b4f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id26" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"994a7632-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id26\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_660a193397" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id26" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"994c218a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_6f2a0f8d94" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_1", + "outputarea_id26" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"994c5bd2-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id26_content_1\");\n", + "//# sourceURL=js_2978395605" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_1", + "outputarea_id26" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"994ce0e8-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"994c5bd2-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_16db2d9eb3" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_1", + "outputarea_id26" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"994d22b0-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id26\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_fc1dbe948c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_1", + "outputarea_id26" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running ByRoleCount\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"9950f278-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"994c218a-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_20794cae99" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_1", + "outputarea_id26" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"99529ce0-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_f89a540c03" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_0", + "outputarea_id26" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9952f8de-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id26_content_0\");\n", + "//# sourceURL=js_95efb20c09" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_0", + "outputarea_id26" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9953430c-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9952f8de-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_e32a40a84a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_0", + "outputarea_id26" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9953941a-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id26\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_e9a506c126" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_0", + "outputarea_id26" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_0", + "outputarea_id26", + "outputarea_id27", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_0", + "outputarea_id26", + "outputarea_id27", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_0", + "outputarea_id26", + "outputarea_id27", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"995562fe-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id27\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_32cccbfb4b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_0", + "outputarea_id26", + "outputarea_id27", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9955b40c-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id27\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_f6804aa5da" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_0", + "outputarea_id26", + "outputarea_id27", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9956faba-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_ddee605ec5" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_0", + "id27_content_0", + "outputarea_id26", + "outputarea_id27", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9957550a-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id27_content_0\");\n", + "//# sourceURL=js_1542af53a2" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_0", + "id27_content_0", + "outputarea_id26", + "outputarea_id27", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9957a794-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9957550a-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_be169d97ee" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_0", + "id27_content_0", + "outputarea_id26", + "outputarea_id27", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9957e8ee-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id27\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_5ca4968b14" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_0", + "id27_content_0", + "outputarea_id26", + "outputarea_id27", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mByRoleCount_sql\u001b[0m variable.\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " \"Alice\" AS name,\n", + " \"Product Manager\" AS role,\n", + " \"SEA\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Bob\" AS name,\n", + " \"Engineer\" AS role,\n", + " \"SEA\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Caroline\" AS name,\n", + " \"Engineer\" AS role,\n", + " \"LAX\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"David\" AS name,\n", + " \"Data Scientist\" AS role,\n", + " \"LAX\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Eve\" AS name,\n", + " \"Data Scientist\" AS role,\n", + " \"SEA\" AS office\n", + " \n", + ") )\n", + "SELECT\n", + " Employee.role AS role,\n", + " SUM(1) AS count\n", + "FROM\n", + " t_0_Employee AS Employee\n", + "GROUP BY role;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"99591250-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9956faba-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_6e589edd2a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_0", + "id27_content_0", + "outputarea_id26", + "outputarea_id27", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"995a544e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"99529ce0-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_8141d2f426" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_0", + "outputarea_id26" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"995c0302-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_181e889b14" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_1", + "outputarea_id26" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"995c64c8-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id26_content_1\");\n", + "//# sourceURL=js_f8675027b8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_1", + "outputarea_id26" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"995cb5ea-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"995c64c8-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_c8b848f7ca" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_1", + "outputarea_id26" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"995d1210-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id26\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_ecf69faa53" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_1", + "outputarea_id26" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9a12ad32-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"995c0302-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_02433bf6ef" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_1", + "outputarea_id26" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9a145e0c-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b6efb2524c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_0", + "outputarea_id26" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9a14ad3a-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id26_content_0\");\n", + "//# sourceURL=js_168e4549f5" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_0", + "outputarea_id26" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9a150adc-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9a14ad3a-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_71f93ffad0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_0", + "outputarea_id26" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9a155d34-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id26\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_765d9f8db7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_0", + "outputarea_id26" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9a169d8e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_8fcf3638aa" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_0", + "id27_content_1", + "outputarea_id26", + "outputarea_id27", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9a16f842-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id27_content_1\");\n", + "//# sourceURL=js_ff62163dfa" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_0", + "id27_content_1", + "outputarea_id26", + "outputarea_id27", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9a173d66-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9a16f842-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_22a0ecf502" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_0", + "id27_content_1", + "outputarea_id26", + "outputarea_id27", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9a17a24c-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id27\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_ddf0f6fa78" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_0", + "id27_content_1", + "outputarea_id26", + "outputarea_id27", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mByRoleCount\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
rolecount
0Product Manager1
1Engineer2
2Data Scientist2
\n", + "
" + ], + "text/plain": [ + " role count\n", + "0 Product Manager 1\n", + "1 Engineer 2\n", + "2 Data Scientist 2" + ] + }, + "metadata": { + "tags": [ + "id26_content_0", + "id27_content_1", + "outputarea_id26", + "outputarea_id27", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9a1b46cc-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9a169d8e-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_74b3c769ee" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_0", + "id27_content_1", + "outputarea_id26", + "outputarea_id27", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9a1c95cc-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9a145e0c-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_d4937fc2bb" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id26_content_0", + "outputarea_id26" + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "%%logica ByRoleCount\n", + "\n", + "Employee(name: \"Alice\", role: \"Product Manager\", office: \"SEA\");\n", + "Employee(name: \"Bob\", role: \"Engineer\", office: \"SEA\");\n", + "Employee(name: \"Caroline\", role: \"Engineer\", office: \"LAX\");\n", + "Employee(name: \"David\", role: \"Data Scientist\", office: \"LAX\");\n", + "Employee(name: \"Eve\", role: \"Data Scientist\", office: \"SEA\");\n", + "\n", + "ByRoleCount(role:, count? += 1) distinct :- Employee(role:);" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "CNzHg4u4tHfO" + }, + "source": [ + "If no aggregated columns are specified then keyword `distinct` naturally leads to making a predicate to be a list\n", + "of distinct rows.\n", + "\n", + "Logica implements native `+`, `List`, `Set` and `Count` aggregators. You can also call any StandardSQL aggregation (converting it to camelcase)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 208, + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH0=", + "headers": [ + [ + "content-type", + "text/css" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgaCxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9ZnVuY3Rpb24oYSl7dmFyIGI9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmYVtTeW1ib2wuaXRlcmF0b3JdO3JldHVybiBiP2IuY2FsbChhKTp7bmV4dDphYShhKX19LGw9dGhpc3x8c2VsZixjYT1mdW5jdGlvbigpe30sZGE9ZnVuY3Rpb24oYSl7YS5CYT12b2lkIDA7YS5SPWZ1bmN0aW9uKCl7cmV0dXJuIGEuQmE/YS5CYTphLkJhPW5ldyBhfX0sZWE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7aWYoIm9iamVjdCI9PWIpaWYoYSl7aWYoYSBpbnN0YW5jZW9mIEFycmF5KXJldHVybiJhcnJheSI7aWYoYSBpbnN0YW5jZW9mIE9iamVjdClyZXR1cm4gYjt2YXIgYz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk7aWYoIltvYmplY3QgV2luZG93XSI9PWMpcmV0dXJuIm9iamVjdCI7CmlmKCJbb2JqZWN0IEFycmF5XSI9PWN8fCJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGgmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5zcGxpY2UmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoInNwbGljZSIpKXJldHVybiJhcnJheSI7aWYoIltvYmplY3QgRnVuY3Rpb25dIj09Y3x8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmNhbGwmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoImNhbGwiKSlyZXR1cm4iZnVuY3Rpb24ifWVsc2UgcmV0dXJuIm51bGwiO2Vsc2UgaWYoImZ1bmN0aW9uIj09YiYmInVuZGVmaW5lZCI9PXR5cGVvZiBhLmNhbGwpcmV0dXJuIm9iamVjdCI7cmV0dXJuIGJ9LGZhPWZ1bmN0aW9uKGEpe3JldHVybiJhcnJheSI9PWVhKGEpfSxoYT1mdW5jdGlvbihhKXt2YXIgYj1lYShhKTtyZXR1cm4iYXJyYXkiPT1ifHwib2JqZWN0Ij09CmImJiJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGh9LGlhPWZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PWVhKGEpfSxtPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBhO3JldHVybiJvYmplY3QiPT1iJiZudWxsIT1hfHwiZnVuY3Rpb24iPT1ifSxqYT0iY2xvc3VyZV91aWRfIisoMUU5Kk1hdGgucmFuZG9tKCk+Pj4wKSxrYT0wLGxhPWZ1bmN0aW9uKGEsYil7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe3ZhciBkPWMuc2xpY2UoKTtkLnB1c2guYXBwbHkoZCxhcmd1bWVudHMpO3JldHVybiBhLmFwcGx5KHRoaXMsZCl9fSxuPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe31jLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLmk9Yi5wcm90b3R5cGU7YS5wcm90b3R5cGU9bmV3IGM7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YX07dmFyIG1hLG5hPXtlYjoiYWN0aXZlZGVzY2VuZGFudCIsamI6ImF0b21pYyIsa2I6ImF1dG9jb21wbGV0ZSIsbWI6ImJ1c3kiLHBiOiJjaGVja2VkIixxYjoiY29saW5kZXgiLHZiOiJjb250cm9scyIseGI6ImRlc2NyaWJlZGJ5IixBYjoiZGlzYWJsZWQiLENiOiJkcm9wZWZmZWN0IixEYjoiZXhwYW5kZWQiLEViOiJmbG93dG8iLEdiOiJncmFiYmVkIixLYjoiaGFzcG9wdXAiLE1iOiJoaWRkZW4iLE9iOiJpbnZhbGlkIixQYjoibGFiZWwiLFFiOiJsYWJlbGxlZGJ5IixSYjoibGV2ZWwiLFdiOiJsaXZlIixrYzoibXVsdGlsaW5lIixsYzoibXVsdGlzZWxlY3RhYmxlIixwYzoib3JpZW50YXRpb24iLHFjOiJvd25zIixyYzoicG9zaW5zZXQiLHRjOiJwcmVzc2VkIix4YzoicmVhZG9ubHkiLHpjOiJyZWxldmFudCIsQWM6InJlcXVpcmVkIixFYzoicm93aW5kZXgiLEhjOiJzZWxlY3RlZCIsSmM6InNldHNpemUiLExjOiJzb3J0IixaYzoidmFsdWVtYXgiLCRjOiJ2YWx1ZW1pbiIsYWQ6InZhbHVlbm93IiwKYmQ6InZhbHVldGV4dCJ9O3ZhciBvYT1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkIGluIGEpYi5jYWxsKGMsYVtkXSxkLGEpfSxwYT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyBpbiBhKWlmKGFbY109PWIpcmV0dXJuITA7cmV0dXJuITF9LHFhPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsIT09YSYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfSxzYT1mdW5jdGlvbihhKXt2YXIgYj17fSxjO2ZvcihjIGluIGEpYlthW2NdXT1jO3JldHVybiBifSx0YT0iY29uc3RydWN0b3IgaGFzT3duUHJvcGVydHkgaXNQcm90b3R5cGVPZiBwcm9wZXJ0eUlzRW51bWVyYWJsZSB0b0xvY2FsZVN0cmluZyB0b1N0cmluZyB2YWx1ZU9mIi5zcGxpdCgiICIpLHVhPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8dGEubGVuZ3RoO2YrKyljPQp0YVtmXSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZCxjKSYmKGFbY109ZFtjXSl9fTt2YXIgdmE9e2ZiOiJhbGVydCIsZ2I6ImFsZXJ0ZGlhbG9nIixoYjoiYXBwbGljYXRpb24iLGliOiJhcnRpY2xlIixsYjoiYmFubmVyIixuYjoiYnV0dG9uIixvYjoiY2hlY2tib3giLHJiOiJjb2x1bW5oZWFkZXIiLHNiOiJjb21ib2JveCIsdGI6ImNvbXBsZW1lbnRhcnkiLHViOiJjb250ZW50aW5mbyIsd2I6ImRlZmluaXRpb24iLHliOiJkaWFsb2ciLHpiOiJkaXJlY3RvcnkiLEJiOiJkb2N1bWVudCIsRmI6ImZvcm0iLEhiOiJncmlkIixJYjoiZ3JpZGNlbGwiLEpiOiJncm91cCIsTGI6ImhlYWRpbmciLE5iOiJpbWciLFNiOiJsaW5rIixUYjoibGlzdCIsVWI6Imxpc3Rib3giLFZiOiJsaXN0aXRlbSIsWGI6ImxvZyIsWWI6Im1haW4iLFpiOiJtYXJxdWVlIiwkYjoibWF0aCIsYWM6Im1lbnUiLGJjOiJtZW51YmFyIixjYzoibWVudWl0ZW0iLGRjOiJtZW51aXRlbWNoZWNrYm94IixlYzoibWVudWl0ZW1yYWRpbyIsbWM6Im5hdmlnYXRpb24iLG5jOiJub3RlIixvYzoib3B0aW9uIiwKc2M6InByZXNlbnRhdGlvbiIsdWM6InByb2dyZXNzYmFyIix2YzoicmFkaW8iLHdjOiJyYWRpb2dyb3VwIix5YzoicmVnaW9uIixCYzoicm93IixDYzoicm93Z3JvdXAiLERjOiJyb3doZWFkZXIiLEZjOiJzY3JvbGxiYXIiLEdjOiJzZWFyY2giLEljOiJzZXBhcmF0b3IiLEtjOiJzbGlkZXIiLE1jOiJzcGluYnV0dG9uIixOYzoic3RhdHVzIixPYzoidGFiIixQYzoidGFibGlzdCIsUWM6InRhYnBhbmVsIixSYzoidGV4dGJveCIsU2M6InRleHRpbmZvIixUYzoidGltZXIiLFVjOiJ0b29sYmFyIixWYzoidG9vbHRpcCIsV2M6InRyZWUiLFhjOiJ0cmVlZ3JpZCIsWWM6InRyZWVpdGVtIn07dmFyIHdhPWZ1bmN0aW9uKGEpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsd2EpO2Vsc2V7dmFyIGI9RXJyb3IoKS5zdGFjaztiJiYodGhpcy5zdGFjaz1iKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSl9O24od2EsRXJyb3IpO3dhLnByb3RvdHlwZS5uYW1lPSJDdXN0b21FcnJvciI7dmFyIHhhO3ZhciB5YT1mdW5jdGlvbihhLGIpe2E9YS5zcGxpdCgiJXMiKTtmb3IodmFyIGM9IiIsZD1hLmxlbmd0aC0xLGU9MDtlPGQ7ZSsrKWMrPWFbZV0rKGU8Yi5sZW5ndGg/YltlXToiJXMiKTt3YS5jYWxsKHRoaXMsYythW2RdKX07bih5YSx3YSk7eWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjsKdmFyIHphPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSJBc3NlcnRpb24gZmFpbGVkIjtpZihjKXtlKz0iOiAiK2M7dmFyIGY9ZH1lbHNlIGEmJihlKz0iOiAiK2EsZj1iKTt0aHJvdyBuZXcgeWEoIiIrZSxmfHxbXSk7fSxxPWZ1bmN0aW9uKGEsYixjKXthfHx6YSgiIixudWxsLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX0sQWE9ZnVuY3Rpb24oYSxiLGMpe20oYSkmJjE9PWEubm9kZVR5cGV8fHphKCJFeHBlY3RlZCBFbGVtZW50IGJ1dCBnb3QgJXM6ICVzLiIsW2VhKGEpLGFdLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKX0sQ2E9ZnVuY3Rpb24oYSxiLGMsZCl7YSBpbnN0YW5jZW9mIGJ8fHphKCJFeHBlY3RlZCBpbnN0YW5jZW9mICVzIGJ1dCBnb3QgJXMuIixbQmEoYiksQmEoYSldLGMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpKX0sQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZgpGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTpudWxsPT09YT8ibnVsbCI6dHlwZW9mIGF9O3ZhciBEYT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3EobnVsbCE9YS5sZW5ndGgpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKCJzdHJpbmciPT09dHlwZW9mIGEpcmV0dXJuInN0cmluZyIhPT10eXBlb2YgYnx8MSE9Yi5sZW5ndGg/LTE6YS5pbmRleE9mKGIsMCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspaWYoYyBpbiBhJiZhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX0scj1BcnJheS5wcm90b3R5cGUuZm9yRWFjaD9mdW5jdGlvbihhLGIsYyl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsYyl9OmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9YS5sZW5ndGgsZT0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZj0wO2Y8ZDtmKyspZiBpbiBlJiZiLmNhbGwoYyxlW2ZdLGYsYSl9LEVhPUFycmF5LnByb3RvdHlwZS5maWx0ZXI/CmZ1bmN0aW9uKGEsYil7cShudWxsIT1hLmxlbmd0aCk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD1bXSxlPTAsZj0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZz0wO2c8YztnKyspaWYoZyBpbiBmKXt2YXIgaz1mW2ddO2IuY2FsbCh2b2lkIDAsayxnLGEpJiYoZFtlKytdPWspfXJldHVybiBkfSxGYT1BcnJheS5wcm90b3R5cGUuZXZlcnk/ZnVuY3Rpb24oYSxiKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmV2ZXJ5LmNhbGwoYSxiLHZvaWQgMCl9OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWEubGVuZ3RoLGQ9InN0cmluZyI9PT10eXBlb2YgYT9hLnNwbGl0KCIiKTphLGU9MDtlPGM7ZSsrKWlmKGUgaW4gZCYmIWIuY2FsbCh2b2lkIDAsZFtlXSxlLGEpKXJldHVybiExO3JldHVybiEwfSxHYT1mdW5jdGlvbihhLGIpe3JldHVybiAwPD0KRGEoYSxiKX0sSGE9ZnVuY3Rpb24oYSxiKXtiPURhKGEsYik7dmFyIGM7aWYoYz0wPD1iKXEobnVsbCE9YS5sZW5ndGgpLEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhLGIsMSk7cmV0dXJuIGN9LElhPWZ1bmN0aW9uKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGFyZ3VtZW50cyl9LEphPWZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDA8Yil7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX0sTGE9ZnVuY3Rpb24oYSxiLGMsZCl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShhLEthKGFyZ3VtZW50cywxKSl9LEthPWZ1bmN0aW9uKGEsYixjKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gMj49YXJndW1lbnRzLmxlbmd0aD9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsYixjKX07dmFyIE1hPVN0cmluZy5wcm90b3R5cGUudHJpbT9mdW5jdGlvbihhKXtyZXR1cm4gYS50cmltKCl9OmZ1bmN0aW9uKGEpe3JldHVybi9eW1xzXHhhMF0qKFtcc1xTXSo/KVtcc1x4YTBdKiQvLmV4ZWMoYSlbMV19LE5hPS8mL2csT2E9LzwvZyxQYT0vPi9nLFFhPS8iL2csUmE9LycvZyxTYT0vXHgwMC9nLFRhPS9bXHgwMCY8PiInXS8sdD1mdW5jdGlvbihhLGIpe3JldHVybi0xIT1hLmluZGV4T2YoYil9LFVhPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE8Yj8tMTphPmI/MTowfTt2YXIgdTthOnt2YXIgVmE9bC5uYXZpZ2F0b3I7aWYoVmEpe3ZhciBXYT1WYS51c2VyQWdlbnQ7aWYoV2Epe3U9V2E7YnJlYWsgYX19dT0iIn07LyoKCiBDb3B5cmlnaHQgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzLgogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKKi8KdmFyIFhhPWZ1bmN0aW9uKGEpe1RhLnRlc3QoYSkmJigtMSE9YS5pbmRleE9mKCImIikmJihhPWEucmVwbGFjZShOYSwiJmFtcDsiKSksLTEhPWEuaW5kZXhPZigiPCIpJiYoYT1hLnJlcGxhY2UoT2EsIiZsdDsiKSksLTEhPWEuaW5kZXhPZigiPiIpJiYoYT1hLnJlcGxhY2UoUGEsIiZndDsiKSksLTEhPWEuaW5kZXhPZignIicpJiYoYT1hLnJlcGxhY2UoUWEsIiZxdW90OyIpKSwtMSE9YS5pbmRleE9mKCInIikmJihhPWEucmVwbGFjZShSYSwiJiMzOTsiKSksLTEhPWEuaW5kZXhPZigiXHgwMCIpJiYoYT1hLnJlcGxhY2UoU2EsIiYjMDsiKSkpO3JldHVybiBhfTt2YXIgWWE9ZnVuY3Rpb24oYSl7WWFbIiAiXShhKTtyZXR1cm4gYX07WWFbIiAiXT1jYTt2YXIgJGE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1aYTtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsYSk/Y1thXTpjW2FdPWIoYSl9O3ZhciBhYj10KHUsIk9wZXJhIiksdj10KHUsIlRyaWRlbnQiKXx8dCh1LCJNU0lFIiksYmI9dCh1LCJFZGdlIikseD10KHUsIkdlY2tvIikmJiEodCh1LnRvTG93ZXJDYXNlKCksIndlYmtpdCIpJiYhdCh1LCJFZGdlIikpJiYhKHQodSwiVHJpZGVudCIpfHx0KHUsIk1TSUUiKSkmJiF0KHUsIkVkZ2UiKSx5PXQodS50b0xvd2VyQ2FzZSgpLCJ3ZWJraXQiKSYmIXQodSwiRWRnZSIpLHo9dCh1LCJNYWNpbnRvc2giKSxjYj1mdW5jdGlvbigpe3ZhciBhPWwuZG9jdW1lbnQ7cmV0dXJuIGE/YS5kb2N1bWVudE1vZGU6dm9pZCAwfSxkYjsKYTp7dmFyIGViPSIiLGZiPWZ1bmN0aW9uKCl7dmFyIGE9dTtpZih4KXJldHVybi9ydjooW15cKTtdKykoXCl8OykvLmV4ZWMoYSk7aWYoYmIpcmV0dXJuL0VkZ2VcLyhbXGRcLl0rKS8uZXhlYyhhKTtpZih2KXJldHVybi9cYig/Ok1TSUV8cnYpWzogXShbXlwpO10rKShcKXw7KS8uZXhlYyhhKTtpZih5KXJldHVybi9XZWJLaXRcLyhcUyspLy5leGVjKGEpO2lmKGFiKXJldHVybi8oPzpWZXJzaW9uKVsgXC9dPyhcUyspLy5leGVjKGEpfSgpO2ZiJiYoZWI9ZmI/ZmJbMV06IiIpO2lmKHYpe3ZhciBnYj1jYigpO2lmKG51bGwhPWdiJiZnYj5wYXJzZUZsb2F0KGViKSl7ZGI9U3RyaW5nKGdiKTticmVhayBhfX1kYj1lYn0KdmFyIGhiPWRiLFphPXt9LEE9ZnVuY3Rpb24oYSl7cmV0dXJuICRhKGEsZnVuY3Rpb24oKXtmb3IodmFyIGI9MCxjPU1hKFN0cmluZyhoYikpLnNwbGl0KCIuIiksZD1NYShTdHJpbmcoYSkpLnNwbGl0KCIuIiksZT1NYXRoLm1heChjLmxlbmd0aCxkLmxlbmd0aCksZj0wOzA9PWImJmY8ZTtmKyspe3ZhciBnPWNbZl18fCIiLGs9ZFtmXXx8IiI7ZG97Zz0vKFxkKikoXEQqKSguKikvLmV4ZWMoZyl8fFsiIiwiIiwiIiwiIl07az0vKFxkKikoXEQqKSguKikvLmV4ZWMoayl8fFsiIiwiIiwiIiwiIl07aWYoMD09Z1swXS5sZW5ndGgmJjA9PWtbMF0ubGVuZ3RoKWJyZWFrO2I9VWEoMD09Z1sxXS5sZW5ndGg/MDpwYXJzZUludChnWzFdLDEwKSwwPT1rWzFdLmxlbmd0aD8wOnBhcnNlSW50KGtbMV0sMTApKXx8VWEoMD09Z1syXS5sZW5ndGgsMD09a1syXS5sZW5ndGgpfHxVYShnWzJdLGtbMl0pO2c9Z1szXTtrPWtbM119d2hpbGUoMD09Yil9cmV0dXJuIDA8PWJ9KX0saWI7CmliPWwuZG9jdW1lbnQmJnY/Y2IoKTp2b2lkIDA7dmFyIGpiPSF2fHw5PD1OdW1iZXIoaWIpO3ZhciBsYj1mdW5jdGlvbihhLGIpe29hKGIsZnVuY3Rpb24oYyxkKXtjJiYib2JqZWN0Ij09dHlwZW9mIGMmJmMuZGQmJihjPWMuY2QoKSk7InN0eWxlIj09ZD9hLnN0eWxlLmNzc1RleHQ9YzoiY2xhc3MiPT1kP2EuY2xhc3NOYW1lPWM6ImZvciI9PWQ/YS5odG1sRm9yPWM6a2IuaGFzT3duUHJvcGVydHkoZCk/YS5zZXRBdHRyaWJ1dGUoa2JbZF0sYyk6MD09ZC5sYXN0SW5kZXhPZigiYXJpYS0iLDApfHwwPT1kLmxhc3RJbmRleE9mKCJkYXRhLSIsMCk/YS5zZXRBdHRyaWJ1dGUoZCxjKTphW2RdPWN9KX0sa2I9e2NlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjb2xzcGFuOiJjb2xTcGFuIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGhlaWdodDoiaGVpZ2h0IixtYXhsZW5ndGg6Im1heExlbmd0aCIsbm9uY2U6Im5vbmNlIixyb2xlOiJyb2xlIixyb3dzcGFuOiJyb3dTcGFuIix0eXBlOiJ0eXBlIix1c2VtYXA6InVzZU1hcCIsdmFsaWduOiJ2QWxpZ24iLAp3aWR0aDoid2lkdGgifSxtYj1mdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChrKXtrJiZiLmFwcGVuZENoaWxkKCJzdHJpbmciPT09dHlwZW9mIGs/YS5jcmVhdGVUZXh0Tm9kZShrKTprKX1mb3IodmFyIGU9MjtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXTtpZighaGEoZil8fG0oZikmJjA8Zi5ub2RlVHlwZSlkKGYpO2Vsc2V7YTp7aWYoZiYmIm51bWJlciI9PXR5cGVvZiBmLmxlbmd0aCl7aWYobShmKSl7dmFyIGc9ImZ1bmN0aW9uIj09dHlwZW9mIGYuaXRlbXx8InN0cmluZyI9PXR5cGVvZiBmLml0ZW07YnJlYWsgYX1pZihpYShmKSl7Zz0iZnVuY3Rpb24iPT10eXBlb2YgZi5pdGVtO2JyZWFrIGF9fWc9ITF9cihnP0phKGYpOmYsZCl9fX0sbmI9ZnVuY3Rpb24oYSxiKXtiPVN0cmluZyhiKTsiYXBwbGljYXRpb24veGh0bWwreG1sIj09PWEuY29udGVudFR5cGUmJihiPWIudG9Mb3dlckNhc2UoKSk7cmV0dXJuIGEuY3JlYXRlRWxlbWVudChiKX0sb2I9ZnVuY3Rpb24oYSl7YSYmCmEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpfSxwYj1mdW5jdGlvbihhLGIpe2lmKCFhfHwhYilyZXR1cm4hMTtpZihhLmNvbnRhaW5zJiYxPT1iLm5vZGVUeXBlKXJldHVybiBhPT1ifHxhLmNvbnRhaW5zKGIpO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbilyZXR1cm4gYT09Ynx8ISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNik7Zm9yKDtiJiZhIT1iOyliPWIucGFyZW50Tm9kZTtyZXR1cm4gYj09YX0scWI9ZnVuY3Rpb24oYSl7cShhLCJOb2RlIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4iKTtyZXR1cm4gOT09YS5ub2RlVHlwZT9hOmEub3duZXJEb2N1bWVudHx8YS5kb2N1bWVudH0scmI9ZnVuY3Rpb24oYSxiKXtiP2EudGFiSW5kZXg9MDooYS50YWJJbmRleD0tMSxhLnJlbW92ZUF0dHJpYnV0ZSgidGFiSW5kZXgiKSl9LHNiPWZ1bmN0aW9uKGEpe3JldHVybiB2JiYhQSgiOSIpPyhhPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKSwKbnVsbCE9YSYmYS5zcGVjaWZpZWQpOmEuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpfSx0Yj1mdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgYSYmMDw9YSYmMzI3Njg+YX0sdWI9ZnVuY3Rpb24oYSl7dGhpcy5hPWF8fGwuZG9jdW1lbnR8fGRvY3VtZW50fTt1Yi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBhP3RoaXMuYS5nZXRFbGVtZW50QnlJZChhKTphfTsKdWIucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuYSxlPWFyZ3VtZW50cyxmPVN0cmluZyhlWzBdKSxnPWVbMV07aWYoIWpiJiZnJiYoZy5uYW1lfHxnLnR5cGUpKXtmPVsiPCIsZl07Zy5uYW1lJiZmLnB1c2goJyBuYW1lPSInLFhhKGcubmFtZSksJyInKTtpZihnLnR5cGUpe2YucHVzaCgnIHR5cGU9IicsWGEoZy50eXBlKSwnIicpO3ZhciBrPXt9O3VhKGssZyk7ZGVsZXRlIGsudHlwZTtnPWt9Zi5wdXNoKCI+Iik7Zj1mLmpvaW4oIiIpfWY9bmIoZCxmKTtnJiYoInN0cmluZyI9PT10eXBlb2YgZz9mLmNsYXNzTmFtZT1nOmZhKGcpP2YuY2xhc3NOYW1lPWcuam9pbigiICIpOmxiKGYsZykpOzI8ZS5sZW5ndGgmJm1iKGQsZixlKTtyZXR1cm4gZn07dmFyIHZiPWZ1bmN0aW9uKGEsYil7Yj8ocShwYSh2YSxiKSwiTm8gc3VjaCBBUklBIHJvbGUgIitiKSxhLnNldEF0dHJpYnV0ZSgicm9sZSIsYikpOmEucmVtb3ZlQXR0cmlidXRlKCJyb2xlIil9LHhiPWZ1bmN0aW9uKGEsYixjKXtmYShjKSYmKGM9Yy5qb2luKCIgIikpO3ZhciBkPXdiKGIpOyIiPT09Y3x8dm9pZCAwPT1jPyhtYXx8KG1hPXthdG9taWM6ITEsYXV0b2NvbXBsZXRlOiJub25lIixkcm9wZWZmZWN0OiJub25lIixoYXNwb3B1cDohMSxsaXZlOiJvZmYiLG11bHRpbGluZTohMSxtdWx0aXNlbGVjdGFibGU6ITEsb3JpZW50YXRpb246InZlcnRpY2FsIixyZWFkb25seTohMSxyZWxldmFudDoiYWRkaXRpb25zIHRleHQiLHJlcXVpcmVkOiExLHNvcnQ6Im5vbmUiLGJ1c3k6ITEsZGlzYWJsZWQ6ITEsaGlkZGVuOiExLGludmFsaWQ6ImZhbHNlIn0pLGM9bWEsYiBpbiBjP2Euc2V0QXR0cmlidXRlKGQsY1tiXSk6YS5yZW1vdmVBdHRyaWJ1dGUoZCkpOmEuc2V0QXR0cmlidXRlKGQsCmMpfSx3Yj1mdW5jdGlvbihhKXtxKGEsIkFSSUEgYXR0cmlidXRlIGNhbm5vdCBiZSBlbXB0eS4iKTtxKHBhKG5hLGEpLCJObyBzdWNoIEFSSUEgYXR0cmlidXRlICIrYSk7cmV0dXJuImFyaWEtIithfTt2YXIgeWI9T2JqZWN0LmZyZWV6ZXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O3ZhciBDPWZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVTt0aGlzLko9dGhpcy5KfTtDLnByb3RvdHlwZS5VPSExO0MucHJvdG90eXBlLk49ZnVuY3Rpb24oKXt0aGlzLlV8fCh0aGlzLlU9ITAsdGhpcy51KCkpfTt2YXIgemI9ZnVuY3Rpb24oYSxiKXthLlU/YigpOihhLkp8fChhLko9W10pLGEuSi5wdXNoKGIpKX07Qy5wcm90b3R5cGUudT1mdW5jdGlvbigpe2lmKHRoaXMuSilmb3IoO3RoaXMuSi5sZW5ndGg7KXRoaXMuSi5zaGlmdCgpKCl9O3ZhciBBYj1mdW5jdGlvbihhKXthJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5OJiZhLk4oKX07dmFyIEJiPWZ1bmN0aW9uKGEpe3JldHVybiJzdHJpbmciPT10eXBlb2YgYS5jbGFzc05hbWU/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sRD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6QmIoYSkubWF0Y2goL1xTKy9nKXx8W119LENiPWZ1bmN0aW9uKGEsYil7InN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZT9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxEYj1mdW5jdGlvbihhLGIpe3JldHVybiBhLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5jb250YWlucyhiKTpHYShEKGEpLGIpfSxFYj1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFEYihhLGIpKXt2YXIgYz1CYihhKTtDYihhLGMrKDA8Yy5sZW5ndGg/IiAiK2I6YikpfX0sRmI9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClyKGIsCmZ1bmN0aW9uKGUpe0ViKGEsZSl9KTtlbHNle3ZhciBjPXt9O3IoRChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7cihiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPTA8Yi5sZW5ndGg/IiAiK2Q6ZDtDYihhLGIpfX0sR2I9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6RGIoYSxiKSYmQ2IoYSxFYShEKGEpLGZ1bmN0aW9uKGMpe3JldHVybiBjIT1ifSkuam9pbigiICIpKX0sSGI9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9yKGIsZnVuY3Rpb24oYyl7R2IoYSxjKX0pOkNiKGEsRWEoRChhKSxmdW5jdGlvbihjKXtyZXR1cm4hR2EoYixjKX0pLmpvaW4oIiAiKSl9O3ZhciBJYj0hdnx8OTw9TnVtYmVyKGliKSxKYj0hdnx8OTw9TnVtYmVyKGliKSxLYj12JiYhQSgiOSIpLExiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e2wuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsY2EsYiksbC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjYSxiKX1jYXRjaChjKXt9cmV0dXJuIGF9KCk7dmFyIEU9ZnVuY3Rpb24oYSxiKXt0aGlzLnR5cGU9YTt0aGlzLmE9dGhpcy50YXJnZXQ9Yjt0aGlzLmg9ITE7dGhpcy5LYT0hMH07RS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuaD0hMH07RS5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3RoaXMuS2E9ITF9O3ZhciBGPXtMOiJtb3VzZWRvd24iLE06Im1vdXNldXAiLGFhOiJtb3VzZWNhbmNlbCIsaGM6Im1vdXNlbW92ZSIsamM6Im1vdXNlb3ZlciIsaWM6Im1vdXNlb3V0IixmYzoibW91c2VlbnRlciIsZ2M6Im1vdXNlbGVhdmUifTt2YXIgRz1mdW5jdGlvbihhLGIpe0UuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy5hPXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5jPTA7dGhpcy5BPXRoaXMubWV0YUtleT10aGlzLnNoaWZ0S2V5PXRoaXMuYWx0S2V5PXRoaXMuY3RybEtleT0hMTt0aGlzLnBvaW50ZXJJZD0wO3RoaXMucG9pbnRlclR5cGU9IiI7dGhpcy5iPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMuYT1iO2lmKGI9YS5yZWxhdGVkVGFyZ2V0KXtpZih4KXthOnt0cnl7WWEoYi5ub2RlTmFtZSk7dmFyIGU9ITA7YnJlYWsgYX1jYXRjaChmKXt9ZT0KITF9ZXx8KGI9bnVsbCl9fWVsc2UibW91c2VvdmVyIj09Yz9iPWEuZnJvbUVsZW1lbnQ6Im1vdXNlb3V0Ij09YyYmKGI9YS50b0VsZW1lbnQpO3RoaXMucmVsYXRlZFRhcmdldD1iO2Q/KHRoaXMuY2xpZW50WD12b2lkIDAhPT1kLmNsaWVudFg/ZC5jbGllbnRYOmQucGFnZVgsdGhpcy5jbGllbnRZPXZvaWQgMCE9PWQuY2xpZW50WT9kLmNsaWVudFk6ZC5wYWdlWSx0aGlzLnNjcmVlblg9ZC5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1kLnNjcmVlbll8fDApOih0aGlzLmNsaWVudFg9dm9pZCAwIT09YS5jbGllbnRYP2EuY2xpZW50WDphLnBhZ2VYLHRoaXMuY2xpZW50WT12b2lkIDAhPT1hLmNsaWVudFk/YS5jbGllbnRZOmEucGFnZVksdGhpcy5zY3JlZW5YPWEuc2NyZWVuWHx8MCx0aGlzLnNjcmVlblk9YS5zY3JlZW5ZfHwwKTt0aGlzLmJ1dHRvbj1hLmJ1dHRvbjt0aGlzLmM9YS5rZXlDb2RlfHwwO3RoaXMua2V5PWEua2V5fHwiIjt0aGlzLmN0cmxLZXk9YS5jdHJsS2V5O3RoaXMuYWx0S2V5PQphLmFsdEtleTt0aGlzLnNoaWZ0S2V5PWEuc2hpZnRLZXk7dGhpcy5tZXRhS2V5PWEubWV0YUtleTt0aGlzLkE9ej9hLm1ldGFLZXk6YS5jdHJsS2V5O3RoaXMucG9pbnRlcklkPWEucG9pbnRlcklkfHwwO3RoaXMucG9pbnRlclR5cGU9InN0cmluZyI9PT10eXBlb2YgYS5wb2ludGVyVHlwZT9hLnBvaW50ZXJUeXBlOk1iW2EucG9pbnRlclR5cGVdfHwiIjt0aGlzLmI9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnRoaXMuZygpfX07bihHLEUpO3ZhciBOYj15YihbMSw0LDJdKSxNYj15Yih7MjoidG91Y2giLDM6InBlbiIsNDoibW91c2UifSksT2I9ZnVuY3Rpb24oYSl7cmV0dXJuIEliPzA9PWEuYi5idXR0b246ImNsaWNrIj09YS50eXBlPyEwOiEhKGEuYi5idXR0b24mTmJbMF0pfTtHLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7Ry5pLmouY2FsbCh0aGlzKTt0aGlzLmIuc3RvcFByb3BhZ2F0aW9uP3RoaXMuYi5zdG9wUHJvcGFnYXRpb24oKTp0aGlzLmIuY2FuY2VsQnViYmxlPSEwfTsKRy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe0cuaS5nLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5iO2lmKGEucHJldmVudERlZmF1bHQpYS5wcmV2ZW50RGVmYXVsdCgpO2Vsc2UgaWYoYS5yZXR1cm5WYWx1ZT0hMSxLYil0cnl7aWYoYS5jdHJsS2V5fHwxMTI8PWEua2V5Q29kZSYmMTIzPj1hLmtleUNvZGUpYS5rZXlDb2RlPS0xfWNhdGNoKGIpe319O3ZhciBQYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKDFFNipNYXRoLnJhbmRvbSgpfDApLFFiPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW1BiXSl9LFJiPTA7dmFyIFNiPWZ1bmN0aW9uKGEsYixjLGQsZSl7dGhpcy5saXN0ZW5lcj1hO3RoaXMuYT1udWxsO3RoaXMuc3JjPWI7dGhpcy50eXBlPWM7dGhpcy5jYXB0dXJlPSEhZDt0aGlzLm1hPWU7dGhpcy5rZXk9KytSYjt0aGlzLlg9dGhpcy5oYT0hMX0sVGI9ZnVuY3Rpb24oYSl7YS5YPSEwO2EubGlzdGVuZXI9bnVsbDthLmE9bnVsbDthLnNyYz1udWxsO2EubWE9bnVsbH07dmFyIFViPWZ1bmN0aW9uKGEpe3RoaXMuc3JjPWE7dGhpcy5hPXt9O3RoaXMuYj0wfTtVYi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS50b1N0cmluZygpO2E9dGhpcy5hW2ZdO2F8fChhPXRoaXMuYVtmXT1bXSx0aGlzLmIrKyk7dmFyIGc9VmIoYSxiLGQsZSk7LTE8Zz8oYj1hW2ddLGN8fChiLmhhPSExKSk6KGI9bmV3IFNiKGIsdGhpcy5zcmMsZiwhIWQsZSksYi5oYT1jLGEucHVzaChiKSk7cmV0dXJuIGJ9Owp2YXIgV2I9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLnR5cGU7YyBpbiBhLmEmJkhhKGEuYVtjXSxiKSYmKFRiKGIpLDA9PWEuYVtjXS5sZW5ndGgmJihkZWxldGUgYS5hW2NdLGEuYi0tKSl9LFhiPWZ1bmN0aW9uKGEsYixjLGQsZSl7YT1hLmFbYi50b1N0cmluZygpXTtiPS0xO2EmJihiPVZiKGEsYyxkLGUpKTtyZXR1cm4tMTxiP2FbYl06bnVsbH0sVmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuWCYmZi5saXN0ZW5lcj09YiYmZi5jYXB0dXJlPT0hIWMmJmYubWE9PWQpcmV0dXJuIGV9cmV0dXJuLTF9O3ZhciBZYj0iY2xvc3VyZV9sbV8iKygxRTYqTWF0aC5yYW5kb20oKXwwKSxaYj17fSwkYj0wLGJjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZCYmZC5vbmNlKXJldHVybiBhYyhhLGIsYyxkLGUpO2lmKGZhKGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyliYyhhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9Y2MoYyk7cmV0dXJuIFFiKGEpP2RjKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOmVjKGEsYixjLCExLGQsZSl9LGVjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGc9bShlKT8hIWUuY2FwdHVyZTohIWUsaz1mYyhhKTtrfHwoYVtZYl09az1uZXcgVWIoYSkpO2M9ay5hZGQoYixjLGQsZyxmKTtpZihjLmEpcmV0dXJuIGM7ZD1nYygpO2MuYT1kO2Quc3JjPWE7ZC5saXN0ZW5lcj1jO2lmKGEuYWRkRXZlbnRMaXN0ZW5lcilMYnx8KGU9Zyksdm9pZCAwPT09ZSYmKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksCmQsZSk7ZWxzZSBpZihhLmF0dGFjaEV2ZW50KWEuYXR0YWNoRXZlbnQoaGMoYi50b1N0cmluZygpKSxkKTtlbHNlIGlmKGEuYWRkTGlzdGVuZXImJmEucmVtb3ZlTGlzdGVuZXIpcSgiY2hhbmdlIj09PWIsIk1lZGlhUXVlcnlMaXN0IG9ubHkgaGFzIGEgY2hhbmdlIGV2ZW50IiksYS5hZGRMaXN0ZW5lcihkKTtlbHNlIHRocm93IEVycm9yKCJhZGRFdmVudExpc3RlbmVyIGFuZCBhdHRhY2hFdmVudCBhcmUgdW5hdmFpbGFibGUuIik7JGIrKztyZXR1cm4gY30sZ2M9ZnVuY3Rpb24oKXt2YXIgYT1pYyxiPUpiP2Z1bmN0aW9uKGMpe3JldHVybiBhLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKX06ZnVuY3Rpb24oYyl7Yz1hLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKTtpZighYylyZXR1cm4gY307cmV0dXJuIGJ9LGFjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZmEoYikpe2Zvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWFjKGEsYltmXSxjLGQsZSk7cmV0dXJuIG51bGx9Yz1jYyhjKTtyZXR1cm4gUWIoYSk/CmEuaC5hZGQoU3RyaW5nKGIpLGMsITAsbShkKT8hIWQuY2FwdHVyZTohIWQsZSk6ZWMoYSxiLGMsITAsZCxlKX0samM9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihmYShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylqYyhhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPWNjKGMpLFFiKGEpPyhhPWEuaCxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5hJiYoZj1hLmFbYl0sYz1WYihmLGMsZCxlKSwtMTxjJiYoVGIoZltjXSkscShudWxsIT1mLmxlbmd0aCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSwwPT1mLmxlbmd0aCYmKGRlbGV0ZSBhLmFbYl0sYS5iLS0pKSkpOmEmJihhPWZjKGEpKSYmKGM9WGIoYSxiLGMsZCxlKSkmJmtjKGMpfSxrYz1mdW5jdGlvbihhKXtpZigibnVtYmVyIiE9PXR5cGVvZiBhJiZhJiYhYS5YKXt2YXIgYj1hLnNyYztpZihRYihiKSlXYihiLmgsYSk7ZWxzZXt2YXIgYz1hLnR5cGUsZD1hLmE7Yi5yZW1vdmVFdmVudExpc3RlbmVyPwpiLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KGhjKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7JGItLTsoYz1mYyhiKSk/KFdiKGMsYSksMD09Yy5iJiYoYy5zcmM9bnVsbCxiW1liXT1udWxsKSk6VGIoYSl9fX0saGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gWmI/WmJbYV06WmJbYV09Im9uIithfSxtYz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMDtpZihhPWZjKGEpKWlmKGI9YS5hW2IudG9TdHJpbmcoKV0pZm9yKGI9Yi5jb25jYXQoKSxhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBmPWJbYV07ZiYmZi5jYXB0dXJlPT1jJiYhZi5YJiYoZj1sYyhmLGQpLGU9ZSYmITEhPT1mKX1yZXR1cm4gZX0sbGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5tYXx8YS5zcmM7YS5oYSYma2MoYSk7cmV0dXJuIGMuY2FsbChkLGIpfSxpYz1mdW5jdGlvbihhLApiKXtpZihhLlgpcmV0dXJuITA7aWYoIUpiKXtpZighYilhOntiPVsid2luZG93IiwiZXZlbnQiXTtmb3IodmFyIGM9bCxkPTA7ZDxiLmxlbmd0aDtkKyspaWYoYz1jW2JbZF1dLG51bGw9PWMpe2I9bnVsbDticmVhayBhfWI9Y31kPWI7Yj1uZXcgRyhkLHRoaXMpO2M9ITA7aWYoISgwPmQua2V5Q29kZXx8dm9pZCAwIT1kLnJldHVyblZhbHVlKSl7YTp7dmFyIGU9ITE7aWYoMD09ZC5rZXlDb2RlKXRyeXtkLmtleUNvZGU9LTE7YnJlYWsgYX1jYXRjaChnKXtlPSEwfWlmKGV8fHZvaWQgMD09ZC5yZXR1cm5WYWx1ZSlkLnJldHVyblZhbHVlPSEwfWQ9W107Zm9yKGU9Yi5hO2U7ZT1lLnBhcmVudE5vZGUpZC5wdXNoKGUpO2E9YS50eXBlO2ZvcihlPWQubGVuZ3RoLTE7IWIuaCYmMDw9ZTtlLS0pe2IuYT1kW2VdO3ZhciBmPW1jKGRbZV0sYSwhMCxiKTtjPWMmJmZ9Zm9yKGU9MDshYi5oJiZlPGQubGVuZ3RoO2UrKyliLmE9ZFtlXSxmPW1jKGRbZV0sYSwhMSxiKSxjPWMmJmZ9cmV0dXJuIGN9cmV0dXJuIGxjKGEsCm5ldyBHKGIsdGhpcykpfSxmYz1mdW5jdGlvbihhKXthPWFbWWJdO3JldHVybiBhIGluc3RhbmNlb2YgVWI/YTpudWxsfSxuYz0iX19jbG9zdXJlX2V2ZW50c19mbl8iKygxRTkqTWF0aC5yYW5kb20oKT4+PjApLGNjPWZ1bmN0aW9uKGEpe3EoYSwiTGlzdGVuZXIgY2FuIG5vdCBiZSBudWxsLiIpO2lmKGlhKGEpKXJldHVybiBhO3EoYS5oYW5kbGVFdmVudCwiQW4gb2JqZWN0IGxpc3RlbmVyIG11c3QgaGF2ZSBoYW5kbGVFdmVudCBtZXRob2QuIik7YVtuY118fChhW25jXT1mdW5jdGlvbihiKXtyZXR1cm4gYS5oYW5kbGVFdmVudChiKX0pO3JldHVybiBhW25jXX07dmFyIG9jPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9e319O24ob2MsQyk7CnZhciBwYz1bXSxIPWZ1bmN0aW9uKGEsYixjLGQpe2ZhKGMpfHwoYyYmKHBjWzBdPWMudG9TdHJpbmcoKSksYz1wYyk7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWJjKGIsY1tlXSxkfHxhLmhhbmRsZUV2ZW50LCExLGEuYnx8YSk7aWYoIWYpYnJlYWs7YS5hW2Yua2V5XT1mfXJldHVybiBhfSxxYz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoZmEoYykpZm9yKHZhciBnPTA7ZzxjLmxlbmd0aDtnKyspcWMoYSxiLGNbZ10sZCxlLGYpO2Vsc2UgZD1kfHxhLmhhbmRsZUV2ZW50LGU9bShlKT8hIWUuY2FwdHVyZTohIWUsZj1mfHxhLmJ8fGEsZD1jYyhkKSxlPSEhZSxjPVFiKGIpP1hiKGIuaCxTdHJpbmcoYyksZCxlLGYpOmI/KGI9ZmMoYikpP1hiKGIsYyxkLGUsZik6bnVsbDpudWxsLGMmJihrYyhjKSxkZWxldGUgYS5hW2Mua2V5XSk7cmV0dXJuIGF9LHJjPWZ1bmN0aW9uKGEpe29hKGEuYSxmdW5jdGlvbihiLGMpe3RoaXMuYS5oYXNPd25Qcm9wZXJ0eShjKSYma2MoYil9LAphKTthLmE9e319O29jLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7b2MuaS51LmNhbGwodGhpcyk7cmModGhpcyl9O29jLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJFdmVudEhhbmRsZXIuaGFuZGxlRXZlbnQgbm90IGltcGxlbWVudGVkIik7fTt2YXIgST1mdW5jdGlvbigpe0MuY2FsbCh0aGlzKTt0aGlzLmg9bmV3IFViKHRoaXMpO3RoaXMuTWE9dGhpczt0aGlzLnBhPW51bGx9O24oSSxDKTtJLnByb3RvdHlwZVtQYl09ITA7SS5wcm90b3R5cGUucmE9ZnVuY3Rpb24oYSl7dGhpcy5wYT1hfTtJLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjLGQpe2pjKHRoaXMsYSxiLGMsZCl9Owp2YXIgdWM9ZnVuY3Rpb24oYSxiKXtzYyhhKTt2YXIgYz1hLnBhO2lmKGMpe3ZhciBkPVtdO2Zvcih2YXIgZT0xO2M7Yz1jLnBhKWQucHVzaChjKSxxKDFFMz4rK2UsImluZmluaXRlIGxvb3AiKX1hPWEuTWE7Yz1iLnR5cGV8fGI7InN0cmluZyI9PT10eXBlb2YgYj9iPW5ldyBFKGIsYSk6YiBpbnN0YW5jZW9mIEU/Yi50YXJnZXQ9Yi50YXJnZXR8fGE6KGU9YixiPW5ldyBFKGMsYSksdWEoYixlKSk7ZT0hMDtpZihkKWZvcih2YXIgZj1kLmxlbmd0aC0xOyFiLmgmJjA8PWY7Zi0tKXt2YXIgZz1iLmE9ZFtmXTtlPXRjKGcsYywhMCxiKSYmZX1iLmh8fChnPWIuYT1hLGU9dGMoZyxjLCEwLGIpJiZlLGIuaHx8KGU9dGMoZyxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLmgmJmY8ZC5sZW5ndGg7ZisrKWc9Yi5hPWRbZl0sZT10YyhnLGMsITEsYikmJmU7cmV0dXJuIGV9OwpJLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7SS5pLnUuY2FsbCh0aGlzKTtpZih0aGlzLmgpe3ZhciBhPXRoaXMuaCxiPTAsYztmb3IoYyBpbiBhLmEpe2Zvcih2YXIgZD1hLmFbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixUYihkW2VdKTtkZWxldGUgYS5hW2NdO2EuYi0tfX10aGlzLnBhPW51bGx9O3ZhciBkYz1mdW5jdGlvbihhLGIsYyxkLGUpe3NjKGEpO3JldHVybiBhLmguYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LHRjPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5oLmFbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGc9YltmXTtpZihnJiYhZy5YJiZnLmNhcHR1cmU9PWMpe3ZhciBrPWcubGlzdGVuZXIscD1nLm1hfHxnLnNyYztnLmhhJiZXYihhLmgsZyk7ZT0hMSE9PWsuY2FsbChwLGQpJiZlfX1yZXR1cm4gZSYmMCE9ZC5LYX0sc2M9ZnVuY3Rpb24oYSl7cShhLmgsIkV2ZW50IHRhcmdldCBpcyBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgY2FsbCB0aGUgc3VwZXJjbGFzcyAoZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpIGNvbnN0cnVjdG9yPyIpfTt2YXIgeGM9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKHkmJiFBKCI1MjUiKSlyZXR1cm4hMDtpZih6JiZlKXJldHVybiB2YyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZigheCl7Im51bWJlciI9PT10eXBlb2YgYiYmKGI9d2MoYikpO3ZhciBnPTE3PT1ifHwxOD09Ynx8eiYmOTE9PWI7aWYoKCFjfHx6KSYmZ3x8eiYmMTY9PWImJihkfHxmKSlyZXR1cm4hMX1pZigoeXx8YmIpJiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1pZih2JiZkJiZiPT1hKXJldHVybiExO3N3aXRjaChhKXtjYXNlIDEzOnJldHVybiB4P2Z8fGU/ITE6IShjJiZkKTohMDtjYXNlIDI3OnJldHVybiEoeXx8YmJ8fHgpfXJldHVybiB4JiYoZHx8ZXx8Zik/ITE6dmMoYSl9LHZjPWZ1bmN0aW9uKGEpe2lmKDQ4PD1hJiY1Nz49YXx8Cjk2PD1hJiYxMDY+PWF8fDY1PD1hJiY5MD49YXx8KHl8fGJiKSYmMD09YSlyZXR1cm4hMDtzd2l0Y2goYSl7Y2FzZSAzMjpjYXNlIDQzOmNhc2UgNjM6Y2FzZSA2NDpjYXNlIDEwNzpjYXNlIDEwOTpjYXNlIDExMDpjYXNlIDExMTpjYXNlIDE4NjpjYXNlIDU5OmNhc2UgMTg5OmNhc2UgMTg3OmNhc2UgNjE6Y2FzZSAxODg6Y2FzZSAxOTA6Y2FzZSAxOTE6Y2FzZSAxOTI6Y2FzZSAyMjI6Y2FzZSAyMTk6Y2FzZSAyMjA6Y2FzZSAyMjE6Y2FzZSAxNjM6Y2FzZSA1ODpyZXR1cm4hMDtjYXNlIDE3MzpyZXR1cm4geDtkZWZhdWx0OnJldHVybiExfX0sd2M9ZnVuY3Rpb24oYSl7aWYoeClhPXljKGEpO2Vsc2UgaWYoeiYmeSlzd2l0Y2goYSl7Y2FzZSA5MzphPTkxfXJldHVybiBhfSx5Yz1mdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSA2MTpyZXR1cm4gMTg3O2Nhc2UgNTk6cmV0dXJuIDE4NjtjYXNlIDE3MzpyZXR1cm4gMTg5O2Nhc2UgMjI0OnJldHVybiA5MTtjYXNlIDA6cmV0dXJuIDIyNDsKZGVmYXVsdDpyZXR1cm4gYX19O3ZhciBKPWZ1bmN0aW9uKGEsYil7SS5jYWxsKHRoaXMpO2EmJnpjKHRoaXMsYSxiKX07bihKLEkpO2g9Si5wcm90b3R5cGU7aC5TPW51bGw7aC5uYT1udWxsO2guQ2E9bnVsbDtoLm9hPW51bGw7aC53PS0xO2guRj0tMTtoLnVhPSExOwp2YXIgQWM9ezM6MTMsMTI6MTQ0LDYzMjMyOjM4LDYzMjMzOjQwLDYzMjM0OjM3LDYzMjM1OjM5LDYzMjM2OjExMiw2MzIzNzoxMTMsNjMyMzg6MTE0LDYzMjM5OjExNSw2MzI0MDoxMTYsNjMyNDE6MTE3LDYzMjQyOjExOCw2MzI0MzoxMTksNjMyNDQ6MTIwLDYzMjQ1OjEyMSw2MzI0NjoxMjIsNjMyNDc6MTIzLDYzMjQ4OjQ0LDYzMjcyOjQ2LDYzMjczOjM2LDYzMjc1OjM1LDYzMjc2OjMzLDYzMjc3OjM0LDYzMjg5OjE0NCw2MzMwMjo0NX0sQmM9e1VwOjM4LERvd246NDAsTGVmdDozNyxSaWdodDozOSxFbnRlcjoxMyxGMToxMTIsRjI6MTEzLEYzOjExNCxGNDoxMTUsRjU6MTE2LEY2OjExNyxGNzoxMTgsRjg6MTE5LEY5OjEyMCxGMTA6MTIxLEYxMToxMjIsRjEyOjEyMywiVSswMDdGIjo0NixIb21lOjM2LEVuZDozNSxQYWdlVXA6MzMsUGFnZURvd246MzQsSW5zZXJ0OjQ1fSxDYz0heXx8QSgiNTI1IiksRGM9eiYmeDsKSi5wcm90b3R5cGUuYT1mdW5jdGlvbihhKXtpZih5fHxiYilpZigxNz09dGhpcy53JiYhYS5jdHJsS2V5fHwxOD09dGhpcy53JiYhYS5hbHRLZXl8fHomJjkxPT10aGlzLncmJiFhLm1ldGFLZXkpdGhpcy5GPXRoaXMudz0tMTstMT09dGhpcy53JiYoYS5jdHJsS2V5JiYxNyE9YS5jP3RoaXMudz0xNzphLmFsdEtleSYmMTghPWEuYz90aGlzLnc9MTg6YS5tZXRhS2V5JiY5MSE9YS5jJiYodGhpcy53PTkxKSk7Q2MmJiF4YyhhLmMsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGEuYWx0S2V5LGEubWV0YUtleSk/dGhpcy5oYW5kbGVFdmVudChhKToodGhpcy5GPXdjKGEuYyksRGMmJih0aGlzLnVhPWEuYWx0S2V5KSl9O0oucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dGhpcy5GPXRoaXMudz0tMTt0aGlzLnVhPWEuYWx0S2V5fTsKSi5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5iLGM9Yi5hbHRLZXk7aWYodiYmImtleXByZXNzIj09YS50eXBlKXt2YXIgZD10aGlzLkY7dmFyIGU9MTMhPWQmJjI3IT1kP2Iua2V5Q29kZTowfWVsc2UoeXx8YmIpJiYia2V5cHJlc3MiPT1hLnR5cGU/KGQ9dGhpcy5GLGU9MDw9Yi5jaGFyQ29kZSYmNjMyMzI+Yi5jaGFyQ29kZSYmdmMoZCk/Yi5jaGFyQ29kZTowKTphYiYmIXk/KGQ9dGhpcy5GLGU9dmMoZCk/Yi5rZXlDb2RlOjApOigia2V5cHJlc3MiPT1hLnR5cGU/KERjJiYoYz10aGlzLnVhKSxiLmtleUNvZGU9PWIuY2hhckNvZGU/MzI+Yi5rZXlDb2RlPyhkPWIua2V5Q29kZSxlPTApOihkPXRoaXMuRixlPWIuY2hhckNvZGUpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkseiYmNjM9PWUmJjIyND09ZCYmKGQ9MTkxKSk7dmFyIGY9ZD13YyhkKTtkPzYzMjMyPD0KZCYmZCBpbiBBYz9mPUFjW2RdOjI1PT1kJiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBCYyYmKGY9QmNbYi5rZXlJZGVudGlmaWVyXSk7eCYmQ2MmJiJrZXlwcmVzcyI9PWEudHlwZSYmIXhjKGYsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KXx8KGE9Zj09dGhpcy53LHRoaXMudz1mLGI9bmV3IEVjKGYsZSxhLGIpLGIuYWx0S2V5PWMsdWModGhpcyxiKSl9O0oucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTsKdmFyIHpjPWZ1bmN0aW9uKGEsYixjKXthLm9hJiZGYyhhKTthLlM9YjthLm5hPWJjKGEuUywia2V5cHJlc3MiLGEsYyk7YS5DYT1iYyhhLlMsImtleWRvd24iLGEuYSxjLGEpO2Eub2E9YmMoYS5TLCJrZXl1cCIsYS5iLGMsYSl9LEZjPWZ1bmN0aW9uKGEpe2EubmEmJihrYyhhLm5hKSxrYyhhLkNhKSxrYyhhLm9hKSxhLm5hPW51bGwsYS5DYT1udWxsLGEub2E9bnVsbCk7YS5TPW51bGw7YS53PS0xO2EuRj0tMX07Si5wcm90b3R5cGUudT1mdW5jdGlvbigpe0ouaS51LmNhbGwodGhpcyk7RmModGhpcyl9O3ZhciBFYz1mdW5jdGlvbihhLGIsYyxkKXtHLmNhbGwodGhpcyxkKTt0aGlzLnR5cGU9ImtleSI7dGhpcy5jPWE7dGhpcy5yZXBlYXQ9Y307bihFYyxHKTt2YXIgR2M9eD8iTW96VXNlclNlbGVjdCI6eXx8YmI/IldlYmtpdFVzZXJTZWxlY3QiOm51bGwsSGM9ZnVuY3Rpb24oYSxiKXtiPWI/bnVsbDphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7aWYoR2Mpe3ZhciBjPSJub25lIjthLnN0eWxlJiYoYS5zdHlsZVtHY109Yyk7aWYoYil7YT0wO2Zvcih2YXIgZDtkPWJbYV07YSsrKWQuc3R5bGUmJihkLnN0eWxlW0djXT1jKX19ZWxzZSBpZih2fHxhYilpZihjPSJvbiIsYS5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyksYilmb3IoYT0wO2Q9YlthXTthKyspZC5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyl9O3ZhciBJYz1mdW5jdGlvbigpe307ZGEoSWMpO0ljLnByb3RvdHlwZS5hPTA7dmFyIEs9ZnVuY3Rpb24oYSl7SS5jYWxsKHRoaXMpO3RoaXMuaj1hfHx4YXx8KHhhPW5ldyB1Yik7dGhpcy5xYT1KYzt0aGlzLlk9bnVsbDt0aGlzLm09ITE7dGhpcy5hPW51bGw7dGhpcy5BPXZvaWQgMDt0aGlzLmc9dGhpcy5jPXRoaXMuYj1udWxsO3RoaXMuR2E9ITF9O24oSyxJKTtLLnByb3RvdHlwZS5PYT1JYy5SKCk7CnZhciBKYz1udWxsLEtjPWZ1bmN0aW9uKGEsYil7c3dpdGNoKGEpe2Nhc2UgMTpyZXR1cm4gYj8iZGlzYWJsZSI6ImVuYWJsZSI7Y2FzZSAyOnJldHVybiBiPyJoaWdobGlnaHQiOiJ1bmhpZ2hsaWdodCI7Y2FzZSA0OnJldHVybiBiPyJhY3RpdmF0ZSI6ImRlYWN0aXZhdGUiO2Nhc2UgODpyZXR1cm4gYj8ic2VsZWN0IjoidW5zZWxlY3QiO2Nhc2UgMTY6cmV0dXJuIGI/ImNoZWNrIjoidW5jaGVjayI7Y2FzZSAzMjpyZXR1cm4gYj8iZm9jdXMiOiJibHVyIjtjYXNlIDY0OnJldHVybiBiPyJvcGVuIjoiY2xvc2UifXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBzdGF0ZSIpO30sTGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuWXx8KGEuWT0iOiIrKGEuT2EuYSsrKS50b1N0cmluZygzNikpfSxNYz1mdW5jdGlvbihhLGIpe2lmKGEuYiYmYS5iLmcpe3ZhciBjPWEuYi5nLGQ9YS5ZO2QgaW4gYyYmZGVsZXRlIGNbZF07cWEoYS5iLmcsYixhKX1hLlk9Yn07Sy5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9Owp2YXIgTmM9ZnVuY3Rpb24oYSl7YT1hLmE7cShhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cmV0dXJuIGF9LE9jPWZ1bmN0aW9uKGEpe2EuQXx8KGEuQT1uZXcgb2MoYSkpO3JldHVybiBxKGEuQSl9O0sucHJvdG90eXBlLnJhPWZ1bmN0aW9uKGEpe2lmKHRoaXMuYiYmdGhpcy5iIT1hKXRocm93IEVycm9yKCJNZXRob2Qgbm90IHN1cHBvcnRlZCIpO0suaS5yYS5jYWxsKHRoaXMsYSl9O0sucHJvdG90eXBlLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPW5iKHRoaXMuai5hLCJESVYiKX07CnZhciBQYz1mdW5jdGlvbihhLGIpe2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiJiZhLnhhKGIpKXthLkdhPSEwO3ZhciBjPXFiKGIpO2EuaiYmYS5qLmE9PWN8fChhLmo9Yj9uZXcgdWIocWIoYikpOnhhfHwoeGE9bmV3IHViKSk7YS52YShiKTthLkQoKX1lbHNlIHRocm93IEVycm9yKCJJbnZhbGlkIGVsZW1lbnQgdG8gZGVjb3JhdGUiKTt9O2g9Sy5wcm90b3R5cGU7aC54YT1mdW5jdGlvbigpe3JldHVybiEwfTtoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hfTtoLkQ9ZnVuY3Rpb24oKXt0aGlzLm09ITA7UWModGhpcyxmdW5jdGlvbihhKXshYS5tJiZhLmYoKSYmYS5EKCl9KX07aC5QPWZ1bmN0aW9uKCl7UWModGhpcyxmdW5jdGlvbihhKXthLm0mJmEuUCgpfSk7dGhpcy5BJiZyYyh0aGlzLkEpO3RoaXMubT0hMX07CmgudT1mdW5jdGlvbigpe3RoaXMubSYmdGhpcy5QKCk7dGhpcy5BJiYodGhpcy5BLk4oKSxkZWxldGUgdGhpcy5BKTtRYyh0aGlzLGZ1bmN0aW9uKGEpe2EuTigpfSk7IXRoaXMuR2EmJnRoaXMuYSYmb2IodGhpcy5hKTt0aGlzLmI9dGhpcy5hPXRoaXMuZz10aGlzLmM9bnVsbDtLLmkudS5jYWxsKHRoaXMpfTtoLnNhPWZ1bmN0aW9uKGEsYil7dGhpcy50YShhLFJjKHRoaXMpLGIpfTsKaC50YT1mdW5jdGlvbihhLGIsYyl7cSghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLm0mJihjfHwhdGhpcy5tKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZigwPmJ8fGI+UmModGhpcykpdGhyb3cgRXJyb3IoIkNoaWxkIGNvbXBvbmVudCBpbmRleCBvdXQgb2YgYm91bmRzIik7dGhpcy5nJiZ0aGlzLmN8fCh0aGlzLmc9e30sdGhpcy5jPVtdKTtpZihhLmI9PXRoaXMpe3ZhciBkPUxjKGEpO3RoaXMuZ1tkXT1hO0hhKHRoaXMuYyxhKX1lbHNlIHFhKHRoaXMuZyxMYyhhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuYiYmYS5ZKXt2YXIgZT1hLmI7ZD1hLlk7ZS5nJiZkPyhlPWUuZyxkPShudWxsIT09ZSYmZCBpbiBlP2VbZF06dm9pZCAwKXx8bnVsbCk6ZD1udWxsfWlmKGQmJmEuYiE9dGhpcyl0aHJvdyBFcnJvcigiVW5hYmxlIHRvIHNldCBwYXJlbnQgY29tcG9uZW50Iik7CmEuYj10aGlzO0suaS5yYS5jYWxsKGEsdGhpcyk7TGEodGhpcy5jLGIsMCxhKTtpZihhLm0mJnRoaXMubSYmYS5iPT10aGlzKWM9dGhpcy5qYSgpLGI9Yy5jaGlsZE5vZGVzW2JdfHxudWxsLGIhPWEuZigpJiZjLmluc2VydEJlZm9yZShhLmYoKSxiKTtlbHNlIGlmKGMpe3RoaXMuYXx8dGhpcy5pYSgpO2M9TCh0aGlzLGIrMSk7Yj10aGlzLmphKCk7Yz1jP2MuYTpudWxsO2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTthLmF8fGEuaWEoKTtiP2IuaW5zZXJ0QmVmb3JlKGEuYSxjfHxudWxsKTphLmouYS5ib2R5LmFwcGVuZENoaWxkKGEuYSk7YS5iJiYhYS5iLm18fGEuRCgpfWVsc2UgdGhpcy5tJiYhYS5tJiZhLmEmJmEuYS5wYXJlbnROb2RlJiYxPT1hLmEucGFyZW50Tm9kZS5ub2RlVHlwZSYmYS5EKCl9O2guamE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hfTsKdmFyIFNjPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEucWEpe3ZhciBiPWEubT9hLmE6YS5qLmEuYm9keTthOnt2YXIgYz1xYihiKTtpZihjLmRlZmF1bHRWaWV3JiZjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihjPWMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpKSl7Yz1jLmRpcmVjdGlvbnx8Yy5nZXRQcm9wZXJ0eVZhbHVlKCJkaXJlY3Rpb24iKXx8IiI7YnJlYWsgYX1jPSIifWEucWE9InJ0bCI9PShjfHwoYi5jdXJyZW50U3R5bGU/Yi5jdXJyZW50U3R5bGUuZGlyZWN0aW9uOm51bGwpfHxiLnN0eWxlJiZiLnN0eWxlLmRpcmVjdGlvbil9cmV0dXJuIGEucWF9LFJjPWZ1bmN0aW9uKGEpe3JldHVybiBhLmM/YS5jLmxlbmd0aDowfSxMPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuYz9hLmNbYl18fG51bGw6bnVsbH0sUWM9ZnVuY3Rpb24oYSxiLGMpe2EuYyYmcihhLmMsYixjKX0sVGM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jJiZiP0RhKGEuYyxiKTotMX07dmFyIFZjPWZ1bmN0aW9uKGEsYil7aWYoIWEpdGhyb3cgRXJyb3IoIkludmFsaWQgY2xhc3MgbmFtZSAiK2EpO2lmKCFpYShiKSl0aHJvdyBFcnJvcigiSW52YWxpZCBkZWNvcmF0b3IgZnVuY3Rpb24gIitiKTtVY1thXT1ifSxXYz17fSxVYz17fTt2YXIgWGM9ZnVuY3Rpb24oYSl7dGhpcy5oPWF9O2RhKFhjKTt2YXIgWWM9ZnVuY3Rpb24oYSxiKXthJiYoYS50YWJJbmRleD1iPzA6LTEpfSwkYz1mdW5jdGlvbihhLGIsYyl7Yy5pZCYmTWMoYixjLmlkKTt2YXIgZD1hLmIoKSxlPSExLGY9RChjKTtmJiZyKGYsZnVuY3Rpb24oZyl7Zz09ZD9lPSEwOmcmJnRoaXMuZyhiLGcsZCl9LGEpO2V8fEViKGMsZCk7WmMoYixjKTtyZXR1cm4gY307WGMucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiLGMpe2I9PWMrIi1kaXNhYmxlZCI/YS5aKCExKTpiPT1jKyItaG9yaXpvbnRhbCI/YWQoYSwiaG9yaXpvbnRhbCIpOmI9PWMrIi12ZXJ0aWNhbCImJmFkKGEsInZlcnRpY2FsIil9Owp2YXIgWmM9ZnVuY3Rpb24oYSxiKXtpZihiKWZvcih2YXIgYz1iLmZpcnN0Q2hpbGQsZDtjJiZjLnBhcmVudE5vZGU9PWI7KXtkPWMubmV4dFNpYmxpbmc7aWYoMT09Yy5ub2RlVHlwZSl7YTp7dmFyIGU9YztxKGUpO2U9RChlKTtmb3IodmFyIGY9MCxnPWUubGVuZ3RoO2Y8ZztmKyspe3ZhciBrPWVbZl07aWYoaz1rIGluIFVjP1VjW2tdKCk6bnVsbCl7ZT1rO2JyZWFrIGF9fWU9bnVsbH1lJiYoZS5hPWMsYS5pc0VuYWJsZWQoKXx8ZS5aKCExKSxhLnNhKGUpLFBjKGUsYykpfWVsc2UgYy5ub2RlVmFsdWUmJiIiIT1NYShjLm5vZGVWYWx1ZSl8fGIucmVtb3ZlQ2hpbGQoYyk7Yz1kfX0sYmQ9ZnVuY3Rpb24oYSxiKXtiPWIuZigpO3EoYiwiVGhlIGNvbnRhaW5lciBET00gZWxlbWVudCBjYW5ub3QgYmUgbnVsbC4iKTtIYyhiLHgpO3YmJihiLmhpZGVGb2N1cz0hMCk7KGE9YS5oKSYmdmIoYixhKX07WGMucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKWGMucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5iKCksYz1bYiwiaG9yaXpvbnRhbCI9PWEuSD9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgTT1mdW5jdGlvbigpe30sY2Q7ZGEoTSk7dmFyIGRkPXtidXR0b246InByZXNzZWQiLGNoZWNrYm94OiJjaGVja2VkIixtZW51aXRlbToic2VsZWN0ZWQiLG1lbnVpdGVtY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtcmFkaW86ImNoZWNrZWQiLHJhZGlvOiJjaGVja2VkIix0YWI6InNlbGVjdGVkIix0cmVlaXRlbToic2VsZWN0ZWQifTtNLnByb3RvdHlwZS5oPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLmouYigiRElWIixlZCh0aGlzLGEpLmpvaW4oIiAiKSxhLmJhKX07dmFyIGdkPWZ1bmN0aW9uKGEsYixjKXtpZihhPWEuZj9hLmYoKTphKXt2YXIgZD1bYl07diYmIUEoIjciKSYmKGQ9ZmQoRChhKSxiKSxkLnB1c2goYikpOyhjP0ZiOkhiKShhLGQpfX07Ck0ucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiKXtiLmlkJiZNYyhhLGIuaWQpO2ImJmIuZmlyc3RDaGlsZD9oZChhLGIuZmlyc3RDaGlsZC5uZXh0U2libGluZz9KYShiLmNoaWxkTm9kZXMpOmIuZmlyc3RDaGlsZCk6YS5iYT1udWxsO3ZhciBjPTAsZD10aGlzLmEoKSxlPXRoaXMuYSgpLGY9ITEsZz0hMSxrPSExLHA9SmEoRChiKSk7cihwLGZ1bmN0aW9uKEIpe2Z8fEIhPWQ/Z3x8QiE9ZT9jfD1pZCh0aGlzLEIpOmc9ITA6KGY9ITAsZT09ZCYmKGc9ITApKTsxPT1pZCh0aGlzLEIpJiYoQWEoYiksc2IoYikmJnRiKGIpJiZyYihiLCExKSl9LHRoaXMpO2Eubz1jO2Z8fChwLnB1c2goZCksZT09ZCYmKGc9ITApKTtnfHxwLnB1c2goZSk7KGE9YS53YSkmJnAucHVzaC5hcHBseShwLGEpO2lmKHYmJiFBKCI3Iikpe3ZhciB3PWZkKHApOzA8dy5sZW5ndGgmJihwLnB1c2guYXBwbHkocCx3KSxrPSEwKX1mJiZnJiYhYSYmIWt8fENiKGIscC5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIGpkPWZ1bmN0aW9uKGEsYil7aWYoYT1hLmgoKSl7cShiLCJUaGUgZWxlbWVudCBwYXNzZWQgYXMgYSBmaXJzdCBwYXJhbWV0ZXIgY2Fubm90IGJlIG51bGwuIik7dmFyIGM9Yi5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDthIT1jJiZ2YihiLGEpfX0sa2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYztpZihhLnYmMzImJihjPWEuZigpKSl7aWYoIWImJmEubyYzMil7dHJ5e2MuYmx1cigpfWNhdGNoKGQpe31hLm8mMzImJmEuRmEobnVsbCl9KHNiKGMpJiZ0YihjKSkhPWImJnJiKGMsYil9fSxsZD1mdW5jdGlvbihhLGIsYyl7Y2R8fChjZD17MToiZGlzYWJsZWQiLDg6InNlbGVjdGVkIiwxNjoiY2hlY2tlZCIsNjQ6ImV4cGFuZGVkIn0pO3EoYSwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO2I9Y2RbYl07dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDtkJiYoZD1kZFtkXXx8YixiPSJjaGVja2VkIj09Ynx8InNlbGVjdGVkIj09CmI/ZDpiKTtiJiZ4YihhLGIsYyl9O00ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250cm9sIn07CnZhciBlZD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuYSgpLGQ9W2NdLGU9YS5hKCk7ZSE9YyYmZC5wdXNoKGUpO2M9Yi5vO2ZvcihlPVtdO2M7KXt2YXIgZj1jJi1jO2UucHVzaChtZChhLGYpKTtjJj1+Zn1kLnB1c2guYXBwbHkoZCxlKTsoYT1iLndhKSYmZC5wdXNoLmFwcGx5KGQsYSk7diYmIUEoIjciKSYmZC5wdXNoLmFwcGx5KGQsZmQoZCkpO3JldHVybiBkfSxmZD1mdW5jdGlvbihhLGIpe3ZhciBjPVtdO2ImJihhPUlhKGEsW2JdKSk7cihbXSxmdW5jdGlvbihkKXshRmEoZCxsYShHYSxhKSl8fGImJiFHYShkLGIpfHxjLnB1c2goZC5qb2luKCJfIikpfSk7cmV0dXJuIGN9LG1kPWZ1bmN0aW9uKGEsYil7YS5ifHxuZChhKTtyZXR1cm4gYS5iW2JdfSxpZD1mdW5jdGlvbihhLGIpe2Euanx8KGEuYnx8bmQoYSksYS5qPXNhKGEuYikpO2E9cGFyc2VJbnQoYS5qW2JdLDEwKTtyZXR1cm4gaXNOYU4oYSk/MDphfSxuZD1mdW5jdGlvbihhKXt2YXIgYj1hLmEoKSxjPSF0KGIucmVwbGFjZSgvXHhhMHxccy9nLAoiICIpLCIgIik7cShjLCJDb250cm9sUmVuZGVyZXIgaGFzIGFuIGludmFsaWQgY3NzIGNsYXNzOiAnIitiKyInIik7YS5iPXsxOmIrIi1kaXNhYmxlZCIsMjpiKyItaG92ZXIiLDQ6YisiLWFjdGl2ZSIsODpiKyItc2VsZWN0ZWQiLDE2OmIrIi1jaGVja2VkIiwzMjpiKyItZm9jdXNlZCIsNjQ6YisiLW9wZW4ifX07dmFyIE49ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO2lmKCFiKXtiPXRoaXMuY29uc3RydWN0b3I7Zm9yKHZhciBkO2I7KXtkPWJbamFdfHwoYltqYV09KytrYSk7aWYoZD1XY1tkXSlicmVhaztiPWIuaT9iLmkuY29uc3RydWN0b3I6bnVsbH1iPWQ/aWEoZC5SKT9kLlIoKTpuZXcgZDpudWxsfXRoaXMuQj1iO3RoaXMuYmE9dm9pZCAwIT09YT9hOm51bGx9O24oTixLKTtoPU4ucHJvdG90eXBlO2guYmE9bnVsbDtoLm89MDtoLnY9Mzk7aC5LPTA7aC5JYT0hMDtoLndhPW51bGw7aC55YT0hMDtoLmlhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CLmModGhpcyk7dGhpcy5hPWE7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmeGIoYSwiaGlkZGVuIiwhMCkpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hPXRoaXMuQi5nKHRoaXMsYSk7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5JYT0ibm9uZSIhPWEuc3R5bGUuZGlzcGxheX07CmguRD1mdW5jdGlvbigpe04uaS5ELmNhbGwodGhpcyk7dmFyIGE9TmModGhpcyk7cSh0aGlzKTtxKGEpO3RoaXMuaXNWaXNpYmxlKCl8fHhiKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fGxkKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy52JjgmJmxkKGEsOCwhISh0aGlzLm8mOCkpO3RoaXMudiYxNiYmbGQoYSwxNiwhISh0aGlzLm8mMTYpKTt0aGlzLnYmNjQmJmxkKGEsNjQsISEodGhpcy5vJjY0KSk7YT10aGlzLkI7U2ModGhpcykmJmdkKHRoaXMuZigpLGEuYSgpKyItcnRsIiwhMCk7dGhpcy5pc0VuYWJsZWQoKSYma2QodGhpcyx0aGlzLmlzVmlzaWJsZSgpKTtpZih0aGlzLnYmLTImJih0aGlzLnlhJiZvZCh0aGlzLCEwKSx0aGlzLnYmMzImJihhPXRoaXMuZigpKSkpe3ZhciBiPXRoaXMuV3x8KHRoaXMuVz1uZXcgSik7emMoYixhKTtIKEgoSChPYyh0aGlzKSxiLCJrZXkiLHRoaXMuZmEpLGEsImZvY3VzIix0aGlzLk5hKSxhLCJibHVyIiwKdGhpcy5GYSl9fTt2YXIgb2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYz1PYyhhKSxkPWEuZigpO2I/KEgoSChIKEgoYyxkLEYuTCxhLmthKSxkLFtGLk0sRi5hYV0sYS5sYSksZCwibW91c2VvdmVyIixhLkFhKSxkLCJtb3VzZW91dCIsYS56YSksYS5lYSE9Y2EmJkgoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fEgoYyxkLCJkYmxjbGljayIsYS5KYSksYS5nYXx8KGEuZ2E9bmV3IHBkKGEpLHpiKGEsbGEoQWIsYS5nYSkpKSkpOihxYyhxYyhxYyhxYyhjLGQsRi5MLGEua2EpLGQsW0YuTSxGLmFhXSxhLmxhKSxkLCJtb3VzZW92ZXIiLGEuQWEpLGQsIm1vdXNlb3V0IixhLnphKSxhLmVhIT1jYSYmcWMoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fHFjKGMsZCwiZGJsY2xpY2siLGEuSmEpLEFiKGEuZ2EpLGEuZ2E9bnVsbCkpfTsKTi5wcm90b3R5cGUuUD1mdW5jdGlvbigpe04uaS5QLmNhbGwodGhpcyk7dGhpcy5XJiZGYyh0aGlzLlcpO3RoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJmtkKHRoaXMsITEpfTtOLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7Ti5pLnUuY2FsbCh0aGlzKTt0aGlzLlcmJih0aGlzLlcuTigpLGRlbGV0ZSB0aGlzLlcpO2RlbGV0ZSB0aGlzLkI7dGhpcy5nYT10aGlzLndhPXRoaXMuYmE9bnVsbH07dmFyIGhkPWZ1bmN0aW9uKGEsYil7YS5iYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm8mMSl9OwpOLnByb3RvdHlwZS5aPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYjtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0VuYWJsZWQmJiFiLmlzRW5hYmxlZCgpfHwhTyh0aGlzLDEsIWEpfHwoYXx8KHFkKHRoaXMsITEpLFAodGhpcywhMSkpLHRoaXMuaXNWaXNpYmxlKCkmJmtkKHRoaXMsYSksUSh0aGlzLDEsIWEsITApKX07CnZhciBQPWZ1bmN0aW9uKGEsYil7TyhhLDIsYikmJlEoYSwyLGIpfSxxZD1mdW5jdGlvbihhLGIpe08oYSw0LGIpJiZRKGEsNCxiKX0scmQ9ZnVuY3Rpb24oYSxiKXtPKGEsOCxiKSYmUShhLDgsYil9LHNkPWZ1bmN0aW9uKGEsYil7TyhhLDY0LGIpJiZRKGEsNjQsYil9LFE9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIWQmJjE9PWIpYS5aKCFjKTtlbHNlIGlmKGEudiZiJiZjIT0hIShhLm8mYikpe3ZhciBlPWEuQjtpZihkPWEuZigpKShlPW1kKGUsYikpJiZnZChhLGUsYyksbGQoZCxiLGMpO2Eubz1jP2Eub3xiOmEubyZ+Yn19LHRkPWZ1bmN0aW9uKGEsYixjKXtpZihhLm0mJmEubyZiJiYhYyl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTshYyYmYS5vJmImJlEoYSxiLCExKTthLnY9Yz9hLnZ8YjphLnYmfmJ9LFI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hISgyNTUmYikmJiEhKGEudiZiKX0sTz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuISEoYS52JmIpJiYhIShhLm8mCmIpIT1jJiYoIShhLksmYil8fHVjKGEsS2MoYixjKSkpJiYhYS5VfTtoPU4ucHJvdG90eXBlO2guQWE9ZnVuY3Rpb24oYSl7KCFhLnJlbGF0ZWRUYXJnZXR8fCFwYih0aGlzLmYoKSxhLnJlbGF0ZWRUYXJnZXQpKSYmdWModGhpcywiZW50ZXIiKSYmdGhpcy5pc0VuYWJsZWQoKSYmUih0aGlzLDIpJiZQKHRoaXMsITApfTtoLnphPWZ1bmN0aW9uKGEpe2EucmVsYXRlZFRhcmdldCYmcGIodGhpcy5mKCksYS5yZWxhdGVkVGFyZ2V0KXx8IXVjKHRoaXMsImxlYXZlIil8fChSKHRoaXMsNCkmJnFkKHRoaXMsITEpLFIodGhpcywyKSYmUCh0aGlzLCExKSl9O2guZWE9Y2E7Cmgua2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSxPYihhKSYmISh5JiZ6JiZhLmN0cmxLZXkpKSl7Uih0aGlzLDQpJiZxZCh0aGlzLCEwKTt2YXIgYjtpZihiPXRoaXMuQil7dmFyIGM7Yj10aGlzLnYmMzImJihjPXRoaXMuZigpKT9zYihjKSYmdGIoYyk6ITF9YiYmdGhpcy5mKCkuZm9jdXMoKX0hT2IoYSl8fHkmJnomJmEuY3RybEtleXx8YS5nKCl9O2gubGE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSx0aGlzLm8mNCYmdWQodGhpcyxhKSYmUih0aGlzLDQpJiZxZCh0aGlzLCExKSl9O2guSmE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmdWQodGhpcyxhKX07CnZhciB1ZD1mdW5jdGlvbihhLGIpe2lmKFIoYSwxNikpe3ZhciBjPSEoYS5vJjE2KTtPKGEsMTYsYykmJlEoYSwxNixjKX1SKGEsOCkmJnJkKGEsITApO1IoYSw2NCkmJnNkKGEsIShhLm8mNjQpKTtjPW5ldyBFKCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuQT1iLkEpO3JldHVybiB1YyhhLGMpfTtOLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe1IodGhpcywzMikmJk8odGhpcywzMiwhMCkmJlEodGhpcywzMiwhMCl9O04ucHJvdG90eXBlLkZhPWZ1bmN0aW9uKCl7Uih0aGlzLDQpJiZxZCh0aGlzLCExKTtSKHRoaXMsMzIpJiZPKHRoaXMsMzIsITEpJiZRKHRoaXMsMzIsITEpfTsKTi5wcm90b3R5cGUuZmE9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJjEzPT1hLmMmJnVkKHRoaXMsYSk/KGEuZygpLGEuaigpLCEwKTohMX07aWYoIWlhKE4pKXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBjbGFzcyAiK04pO2lmKCFpYShNKSl0aHJvdyBFcnJvcigiSW52YWxpZCByZW5kZXJlciBjbGFzcyAiK00pO3ZhciB2ZD1OW2phXXx8KE5bamFdPSsra2EpO1djW3ZkXT1NO1ZjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIHBkPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9ITE7dGhpcy5jPW5ldyBvYyh0aGlzKTt6Yih0aGlzLGxhKEFiLHRoaXMuYykpO2E9TmModGhpcy5iKTtIKEgoSCh0aGlzLmMsYSxGLkwsdGhpcy5oKSxhLEYuTSx0aGlzLmopLGEsImNsaWNrIix0aGlzLmcpfTtuKHBkLEMpO3ZhciB3ZD0hdnx8OTw9TnVtYmVyKGliKTsKcGQucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXt0aGlzLmE9ITF9O3BkLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7dGhpcy5hPSEwfTt2YXIgeGQ9ZnVuY3Rpb24oYSxiKXtpZighd2QpcmV0dXJuIGEuYnV0dG9uPTAsYS50eXBlPWIsYTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudHMiKTtjLmluaXRNb3VzZUV2ZW50KGIsYS5idWJibGVzLGEuY2FuY2VsYWJsZSxhLnZpZXd8fG51bGwsYS5kZXRhaWwsYS5zY3JlZW5YLGEuc2NyZWVuWSxhLmNsaWVudFgsYS5jbGllbnRZLGEuY3RybEtleSxhLmFsdEtleSxhLnNoaWZ0S2V5LGEubWV0YUtleSwwLGEucmVsYXRlZFRhcmdldHx8bnVsbCk7cmV0dXJuIGN9OwpwZC5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXtpZih0aGlzLmEpdGhpcy5hPSExO2Vsc2V7dmFyIGI9YS5iLGM9Yi5idXR0b24sZD1iLnR5cGUsZT14ZChiLCJtb3VzZWRvd24iKTt0aGlzLmIua2EobmV3IEcoZSxhLmEpKTtlPXhkKGIsIm1vdXNldXAiKTt0aGlzLmIubGEobmV3IEcoZSxhLmEpKTt3ZHx8KGIuYnV0dG9uPWMsYi50eXBlPWQpfX07cGQucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt0aGlzLmI9bnVsbDtwZC5pLnUuY2FsbCh0aGlzKX07dmFyIFM9ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO3RoaXMuZGE9Ynx8WGMuUigpO3RoaXMuSD1hfHwidmVydGljYWwifTtuKFMsSyk7aD1TLnByb3RvdHlwZTtoLkRhPW51bGw7aC5jYT1udWxsO2guZGE9bnVsbDtoLkg9bnVsbDtoLlQ9ITA7aC5PPSEwO2gubD0tMTtoLnM9bnVsbDtoLlY9ITE7aC5JPW51bGw7dmFyIHlkPWZ1bmN0aW9uKGEpe3JldHVybiBhLkRhfHxhLmYoKX07aD1TLnByb3RvdHlwZTtoLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPXRoaXMuai5iKCJESVYiLHRoaXMuZGEuYyh0aGlzKS5qb2luKCIgIikpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKGEpe3JldHVybiJESVYiPT1hLnRhZ05hbWV9O2gudmE9ZnVuY3Rpb24oYSl7dGhpcy5hPSRjKHRoaXMuZGEsdGhpcyxhKTsibm9uZSI9PWEuc3R5bGUuZGlzcGxheSYmKHRoaXMuVD0hMSl9OwpoLkQ9ZnVuY3Rpb24oKXtTLmkuRC5jYWxsKHRoaXMpO1FjKHRoaXMsZnVuY3Rpb24oYil7Yi5tJiZ6ZCh0aGlzLGIpfSx0aGlzKTt2YXIgYT10aGlzLmYoKTtiZCh0aGlzLmRhLHRoaXMpO0FkKHRoaXMsdGhpcy5UKTtIKEgoSChIKEgoSChIKEgoT2ModGhpcyksdGhpcywiZW50ZXIiLHRoaXMuV2EpLHRoaXMsImhpZ2hsaWdodCIsdGhpcy5YYSksdGhpcywidW5oaWdobGlnaHQiLHRoaXMuY2IpLHRoaXMsIm9wZW4iLHRoaXMuWWEpLHRoaXMsImNsb3NlIix0aGlzLlVhKSxhLEYuTCx0aGlzLlNhKSxxYihhKSxbRi5NLEYuYWFdLHRoaXMuVmEpLGEsW0YuTCxGLk0sRi5hYSwibW91c2VvdmVyIiwibW91c2VvdXQiLCJjb250ZXh0bWVudSJdLHRoaXMuVGEpO0JkKHRoaXMpfTt2YXIgQmQ9ZnVuY3Rpb24oYSl7dmFyIGI9T2MoYSksYz15ZChhKTtIKEgoSChiLGMsImZvY3VzIixhLkhhKSxjLCJibHVyIixhLlFhKSxhLmNhfHwoYS5jYT1uZXcgSih5ZChhKSkpLCJrZXkiLGEuUmEpfTtoPVMucHJvdG90eXBlOwpoLlA9ZnVuY3Rpb24oKXtDZCh0aGlzLC0xKTt0aGlzLnMmJnNkKHRoaXMucywhMSk7dGhpcy5WPSExO1MuaS5QLmNhbGwodGhpcyl9O2gudT1mdW5jdGlvbigpe1MuaS51LmNhbGwodGhpcyk7dGhpcy5jYSYmKHRoaXMuY2EuTigpLHRoaXMuY2E9bnVsbCk7dGhpcy5kYT10aGlzLnM9dGhpcy5JPXRoaXMuRGE9bnVsbH07aC5XYT1mdW5jdGlvbigpe3JldHVybiEwfTsKaC5YYT1mdW5jdGlvbihhKXt2YXIgYj1UYyh0aGlzLGEudGFyZ2V0KTtpZigtMTxiJiZiIT10aGlzLmwpe3ZhciBjPUwodGhpcyx0aGlzLmwpO2MmJlAoYywhMSk7dGhpcy5sPWI7Yz1MKHRoaXMsdGhpcy5sKTt0aGlzLlYmJnFkKGMsITApO3RoaXMucyYmYyE9dGhpcy5zJiYoYy52JjY0P3NkKGMsITApOnNkKHRoaXMucywhMSkpfWI9dGhpcy5mKCk7cShiLCJUaGUgRE9NIGVsZW1lbnQgZm9yIHRoZSBjb250YWluZXIgY2Fubm90IGJlIG51bGwuIik7bnVsbCE9YS50YXJnZXQuZigpJiZ4YihiLCJhY3RpdmVkZXNjZW5kYW50IixhLnRhcmdldC5mKCkuaWQpfTtoLmNiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT1MKHRoaXMsdGhpcy5sKSYmKHRoaXMubD0tMSk7YT10aGlzLmYoKTtxKGEsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnJlbW92ZUF0dHJpYnV0ZSh3YigiYWN0aXZlZGVzY2VuZGFudCIpKX07CmguWWE9ZnVuY3Rpb24oYSl7KGE9YS50YXJnZXQpJiZhIT10aGlzLnMmJmEuYj09dGhpcyYmKHRoaXMucyYmc2QodGhpcy5zLCExKSx0aGlzLnM9YSl9O2guVWE9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMucyYmKHRoaXMucz1udWxsKTt2YXIgYj10aGlzLmYoKSxjPWEudGFyZ2V0LmYoKTtiJiZhLnRhcmdldC5vJjImJmMmJihhPSIiLGMmJihhPWMuaWQscShhLCJUaGUgYWN0aXZlIGVsZW1lbnQgc2hvdWxkIGhhdmUgYW4gaWQuIikpLHhiKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEpKX07aC5TYT1mdW5jdGlvbihhKXt0aGlzLk8mJih0aGlzLlY9ITApO3ZhciBiPXlkKHRoaXMpO2ImJnNiKGIpJiZ0YihiKT9iLmZvY3VzKCk6YS5nKCl9O2guVmE9ZnVuY3Rpb24oKXt0aGlzLlY9ITF9OwpoLlRhPWZ1bmN0aW9uKGEpe2E6e3ZhciBiPWEudGFyZ2V0O2lmKHRoaXMuSSlmb3IodmFyIGM9dGhpcy5mKCk7YiYmYiE9PWM7KXt2YXIgZD1iLmlkO2lmKGQgaW4gdGhpcy5JKXtiPXRoaXMuSVtkXTticmVhayBhfWI9Yi5wYXJlbnROb2RlfWI9bnVsbH1pZihiKXN3aXRjaChhLnR5cGUpe2Nhc2UgRi5MOmIua2EoYSk7YnJlYWs7Y2FzZSBGLk06Y2FzZSBGLmFhOmIubGEoYSk7YnJlYWs7Y2FzZSAibW91c2VvdmVyIjpiLkFhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3V0IjpiLnphKGEpO2JyZWFrO2Nhc2UgImNvbnRleHRtZW51IjpiLmVhKGEpfX07aC5IYT1mdW5jdGlvbigpe307aC5RYT1mdW5jdGlvbigpe0NkKHRoaXMsLTEpO3RoaXMuVj0hMTt0aGlzLnMmJnNkKHRoaXMucywhMSl9OwpoLlJhPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmlzRW5hYmxlZCgpJiZ0aGlzLmlzVmlzaWJsZSgpJiYoMCE9UmModGhpcyl8fHRoaXMuRGEpJiZEZCh0aGlzLGEpPyhhLmcoKSxhLmooKSwhMCk6ITF9Owp2YXIgRGQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1MKGEsYS5sKTtpZihjJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5mYSYmYy5mYShiKXx8YS5zJiZhLnMhPWMmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLnMuZmEmJmEucy5mYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuYyl7Y2FzZSAyNzp5ZChhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpFZChhKTticmVhaztjYXNlIDM1OkZkKGEpO2JyZWFrO2Nhc2UgMzg6aWYoInZlcnRpY2FsIj09YS5IKUdkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9IZChhKTpHZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoInZlcnRpY2FsIj09YS5IKUhkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9HZChhKTpIZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSx6ZD1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZigpO2M9Yy5pZHx8KGMuaWQ9TGMoYikpO2EuSXx8KGEuST17fSk7YS5JW2NdPWJ9O1MucHJvdG90eXBlLnNhPWZ1bmN0aW9uKGEsYil7Q2EoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtTLmkuc2EuY2FsbCh0aGlzLGEsYil9O1MucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEsYixjKXtDYShhLE4pO2EuS3w9MjthLkt8PTY0O3RkKGEsMzIsITEpO2EubSYmMCE9YS55YSYmb2QoYSwhMSk7YS55YT0hMTt2YXIgZD1hLmI9PXRoaXM/VGModGhpcyxhKTotMTtTLmkudGEuY2FsbCh0aGlzLGEsYixjKTthLm0mJnRoaXMubSYmemQodGhpcyxhKTthPWQ7LTE9PWEmJihhPVJjKHRoaXMpKTthPT10aGlzLmw/dGhpcy5sPU1hdGgubWluKFJjKHRoaXMpLTEsYik6YT50aGlzLmwmJmI8PXRoaXMubD90aGlzLmwrKzphPHRoaXMubCYmYj50aGlzLmwmJnRoaXMubC0tfTsKdmFyIGFkPWZ1bmN0aW9uKGEsYil7aWYoYS5mKCkpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5IPWJ9O1MucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O3ZhciBBZD1mdW5jdGlvbihhLGIpe2EuVD1iO3ZhciBjPWEuZigpO2MmJihjLnN0eWxlLmRpc3BsYXk9Yj8iIjoibm9uZSIsWWMoeWQoYSksYS5PJiZhLlQpKX07Uy5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT307Uy5wcm90b3R5cGUuWj1mdW5jdGlvbihhKXt0aGlzLk8hPWEmJnVjKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5PPSEwLFFjKHRoaXMsZnVuY3Rpb24oYil7Yi5MYT9kZWxldGUgYi5MYTpiLlooITApfSkpOihRYyh0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5aKCExKTpiLkxhPSEwfSksdGhpcy5WPXRoaXMuTz0hMSksWWMoeWQodGhpcyksYSYmdGhpcy5UKSl9Owp2YXIgQ2Q9ZnVuY3Rpb24oYSxiKXsoYj1MKGEsYikpP1AoYiwhMCk6LTE8YS5sJiZQKEwoYSxhLmwpLCExKX0sRWQ9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LFJjKGEpLTEpfSxGZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiAwPmI/Yy0xOmJ9LDApfSxIZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7cmV0dXJuKGIrMSklY30sYS5sKX0sR2Q9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe2ItLTtyZXR1cm4gMD5iP2MtMTpifSxhLmwpfSxJZD1mdW5jdGlvbihhLGIsYyl7Yz0wPmM/VGMoYSxhLnMpOmM7dmFyIGQ9UmMoYSk7Yz1iLmNhbGwoYSxjLGQpO2Zvcih2YXIgZT0wO2U8PWQ7KXt2YXIgZj1MKGEsYyksZztpZihnPWYpZz1mLmlzVmlzaWJsZSgpJiZmLmlzRW5hYmxlZCgpJiYhIShmLnYmMik7aWYoZyl7YS5FYShjKTticmVha31lKys7Yz1iLmNhbGwoYSxjLGQpfX07ClMucHJvdG90eXBlLkVhPWZ1bmN0aW9uKGEpe0NkKHRoaXMsYSl9O3ZhciBUPWZ1bmN0aW9uKCl7fTtuKFQsTSk7ZGEoVCk7VC5wcm90b3R5cGUuYT1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYiJ9O1QucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXtyZXR1cm4idGFiIn07VC5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYj1ULmkuYy5jYWxsKHRoaXMsYSk7KGE9YS5QYSkmJmImJihiLnRpdGxlPWF8fCIiKTtyZXR1cm4gYn07VC5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIpe2I9VC5pLmcuY2FsbCh0aGlzLGEsYik7dmFyIGM9Yi50aXRsZXx8IiI7YyYmKGEuUGE9Yyk7YS5vJjgmJihjPWEuYikmJmlhKGMuRykmJihRKGEsOCwhMSksYy5HKGEpKTtyZXR1cm4gYn07dmFyIEpkPWZ1bmN0aW9uKGEsYixjKXtOLmNhbGwodGhpcyxhLGJ8fFQuUigpLGMpO3RkKHRoaXMsOCwhMCk7dGhpcy5LfD05fTtuKEpkLE4pO1ZjKCJnb29nLXRhYiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEpkKG51bGwpfSk7dmFyIFU9ZnVuY3Rpb24oKXt0aGlzLmg9InRhYmxpc3QifTtuKFUsWGMpO2RhKFUpO1UucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWItYmFyIn07VS5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIsYyl7dGhpcy5qfHwodGhpcy5hfHxLZCh0aGlzKSx0aGlzLmo9c2EodGhpcy5hKSk7dmFyIGQ9dGhpcy5qW2JdO2Q/KGFkKGEsTGQoZCkpLGEuQj1kKTpVLmkuZy5jYWxsKHRoaXMsYSxiLGMpfTtVLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPVUuaS5jLmNhbGwodGhpcyxhKTt0aGlzLmF8fEtkKHRoaXMpO2IucHVzaCh0aGlzLmFbYS5CXSk7cmV0dXJuIGJ9O3ZhciBLZD1mdW5jdGlvbihhKXt2YXIgYj1hLmIoKTthLmE9e3RvcDpiKyItdG9wIixib3R0b206YisiLWJvdHRvbSIsc3RhcnQ6YisiLXN0YXJ0IixlbmQ6YisiLWVuZCJ9fTt2YXIgVj1mdW5jdGlvbihhLGIsYyl7YT1hfHwidG9wIjthZCh0aGlzLExkKGEpKTt0aGlzLkI9YTtTLmNhbGwodGhpcyx0aGlzLkgsYnx8VS5SKCksYyk7TWQodGhpcyl9O24oVixTKTtoPVYucHJvdG90eXBlO2guQz1udWxsO2guRD1mdW5jdGlvbigpe1YuaS5ELmNhbGwodGhpcyk7TWQodGhpcyl9O2gudT1mdW5jdGlvbigpe1YuaS51LmNhbGwodGhpcyk7dGhpcy5DPW51bGx9O2guRWE9ZnVuY3Rpb24oYSl7Vi5pLkVhLmNhbGwodGhpcyxhKTt0aGlzLkcoTCh0aGlzLGEpKX07aC5HPWZ1bmN0aW9uKGEpe2E/cmQoYSwhMCk6dGhpcy5DJiZyZCh0aGlzLkMsITEpfTsKdmFyIE5kPWZ1bmN0aW9uKGEsYil7aWYoYiYmYj09YS5DKXtmb3IodmFyIGM9VGMoYSxiKSxkPWMtMTtiPUwoYSxkKTtkLS0pe3ZhciBlPWI7aWYoZS5pc1Zpc2libGUoKSYmZS5pc0VuYWJsZWQoKSl7YS5HKGIpO3JldHVybn19Zm9yKGMrPTE7Yj1MKGEsYyk7YysrKWlmKGQ9YixkLmlzVmlzaWJsZSgpJiZkLmlzRW5hYmxlZCgpKXthLkcoYik7cmV0dXJufWEuRyhudWxsKX19O2g9Vi5wcm90b3R5cGU7aC5hYj1mdW5jdGlvbihhKXt0aGlzLkMmJnRoaXMuQyE9YS50YXJnZXQmJnJkKHRoaXMuQywhMSk7dGhpcy5DPWEudGFyZ2V0fTtoLmJiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT10aGlzLkMmJih0aGlzLkM9bnVsbCl9O2guWmE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guJGE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guSGE9ZnVuY3Rpb24oKXtMKHRoaXMsdGhpcy5sKXx8Q2QodGhpcyxUYyh0aGlzLHRoaXMuQ3x8TCh0aGlzLDApKSl9Owp2YXIgTWQ9ZnVuY3Rpb24oYSl7SChIKEgoSChPYyhhKSxhLCJzZWxlY3QiLGEuYWIpLGEsInVuc2VsZWN0IixhLmJiKSxhLCJkaXNhYmxlIixhLlphKSxhLCJoaWRlIixhLiRhKX0sTGQ9ZnVuY3Rpb24oYSl7cmV0dXJuInN0YXJ0Ij09YXx8ImVuZCI9PWE/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O1ZjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBWfSk7ZnVuY3Rpb24gT2QoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIFBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgZz1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIrZyk7Zm9yKHZhciBrPVtdLHA9YmEoYyksdz1wLm5leHQoKTshdy5kb25lO3c9cC5uZXh0KCkpe3c9dy52YWx1ZTt2YXIgQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKQi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO0IudGV4dENvbnRlbnQ9dztmLmFwcGVuZENoaWxkKEIpO2sucHVzaChCKX0iYm90dG9tIiE9ZyYmZS5hcHBlbmRDaGlsZChmKTtwPW51bGw7aWYoInRvcCI9PWd8fCJib3R0b20iPT1nKXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTsidG9wIj09ZyYmcCYmZS5hcHBlbmRDaGlsZChwKTtCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0IuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciByYT1bXTtjPWJhKGMpO2Zvcih3PWMubmV4dCgpOyF3LmRvbmU7dz1jLm5leHQoKSl3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHcuaWQ9ZS5pZCsiX2NvbnRlbnRfIityYS5sZW5ndGgsdy5zdHlsZS5kaXNwbGF5PSJub25lIixCLmFwcGVuZENoaWxkKHcpLHJhLnB1c2godyk7ZS5hcHBlbmRDaGlsZChCKTsiYm90dG9tIj09ZyYmKHAmJgplLmFwcGVuZENoaWxkKHApLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBYPW5ldyBWKGcpO1BjKFgsZik7dmFyIFk9LTE7ZGMoWCwic2VsZWN0IixmdW5jdGlvbihaKXtaPWsuaW5kZXhPZihaLnRhcmdldC5mKCkpO1ohPVkmJigwPD1ZJiZZPHJhLmxlbmd0aCYmKHJhW1ldLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFk9LTEpLDA8PVomJlo8cmEubGVuZ3RoJiYoWT1aLHJhW1ldLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksWC5HKEwoWCxZKSkpfSk7WC5HKEwoWCxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFope1guRyhMKFgsWikpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChPZChhKSl9LFFkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sVz1sOwpRZFswXWluIFd8fCJ1bmRlZmluZWQiPT10eXBlb2YgVy5leGVjU2NyaXB0fHxXLmV4ZWNTY3JpcHQoInZhciAiK1FkWzBdKTtmb3IodmFyIFJkO1FkLmxlbmd0aCYmKFJkPVFkLnNoaWZ0KCkpOylRZC5sZW5ndGh8fHZvaWQgMD09PVBkP1dbUmRdJiZXW1JkXSE9PU9iamVjdC5wcm90b3R5cGVbUmRdP1c9V1tSZF06Vz1XW1JkXT17fTpXW1JkXT1QZDt9KS5jYWxsKHRoaXMpOwovLyBjbGFuZy1mb3JtYXQgb24K", + "headers": [ + [ + "content-type", + "application/javascript" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + } + } + }, + "executionInfo": { + "elapsed": 22974, + "status": "ok", + "timestamp": 1600709630823, + "user": { + "displayName": "Evgeny Skvortsov", + "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhiQjODaOVLfYnUuWS9rB3LRntzJDM0hqElzsUkdQ=s64", + "userId": "11510585406840398626" + }, + "user_tz": 420 + }, + "id": "PviQQX34tMVJ", + "outputId": "c768c070-e946-4b60-c7f2-d75ecc8b008d" + }, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9a2c2622-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id28\", \"tabNames\": [\"OfficeColumn\", \"Offices\", \"EmployeesPerOffice\", \"EmployeesOfOffice\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_85f9b5dad4" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9a2c9af8-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id28\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_924a8c3550" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9a2e790e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_83a76c91bc" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9a2ee4d4-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id28_content_4\");\n", + "//# sourceURL=js_f7b507b9de" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9a2f2f52-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9a2ee4d4-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_5f880aa956" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9a2f90aa-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id28\"].setSelectedTabIndex(4);\n", + "//# sourceURL=js_bf2b9f1875" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running OfficeColumn\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"9a31e7d8-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9a2e790e-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_c682a9ab2b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9a346ca6-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_cb995e8332" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_0", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9a34ae1e-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id28_content_0\");\n", + "//# sourceURL=js_11fa6e124a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_0", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9a34e456-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9a34ae1e-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_09cec4e3f8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_0", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9a35211e-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id28\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_292605acf9" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_0", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_0", + "outputarea_id28", + "outputarea_id29", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_0", + "outputarea_id28", + "outputarea_id29", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_0", + "outputarea_id28", + "outputarea_id29", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9a36a110-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id29\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_9f5bf051ae" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_0", + "outputarea_id28", + "outputarea_id29", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9a370b82-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id29\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_08aa05822f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_0", + "outputarea_id28", + "outputarea_id29", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9a380866-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_e522fd5d55" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_0", + "id29_content_0", + "outputarea_id28", + "outputarea_id29", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9a386126-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id29_content_0\");\n", + "//# sourceURL=js_846e994ca1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_0", + "id29_content_0", + "outputarea_id28", + "outputarea_id29", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9a389a4c-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9a386126-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_254e5b4a55" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_0", + "id29_content_0", + "outputarea_id28", + "outputarea_id29", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9a390fe0-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id29\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_8a6d4c140f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_0", + "id29_content_0", + "outputarea_id28", + "outputarea_id29", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mOfficeColumn_sql\u001b[0m variable.\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " \"Alice\" AS name,\n", + " \"Product Manager\" AS role,\n", + " \"SEA\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Bob\" AS name,\n", + " \"Engineer\" AS role,\n", + " \"SEA\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Caroline\" AS name,\n", + " \"Engineer\" AS role,\n", + " \"LAX\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"David\" AS name,\n", + " \"Data Scientist\" AS role,\n", + " \"LAX\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Eve\" AS name,\n", + " \"Data Scientist\" AS role,\n", + " \"SEA\" AS office\n", + " \n", + ") )\n", + "SELECT\n", + " Employee.office AS office\n", + "FROM\n", + " t_0_Employee AS Employee;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"9a39d84e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9a380866-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_62aa117c2b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_0", + "id29_content_0", + "outputarea_id28", + "outputarea_id29", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9a3ac736-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9a346ca6-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_0f706536ff" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_0", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9a3c37d8-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_3f50fc4bab" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9a3c7c8e-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id28_content_4\");\n", + "//# sourceURL=js_fa82bbb272" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9a3ce8f4-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9a3c7c8e-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_24989c213b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9a3df26c-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id28\"].setSelectedTabIndex(4);\n", + "//# sourceURL=js_23f5356b83" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9ab52ad0-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9a3c37d8-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_ad947f6e53" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9ab6ee6a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_3094c058dc" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_0", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9ab76368-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id28_content_0\");\n", + "//# sourceURL=js_23e5786bf9" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_0", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9ab7d4f6-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9ab76368-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_24f16c5a9d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_0", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9ab83a22-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id28\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_a2abcbb8a5" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_0", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9abb6148-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_88c694f148" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_0", + "id29_content_1", + "outputarea_id28", + "outputarea_id29", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9abbcd4a-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id29_content_1\");\n", + "//# sourceURL=js_914a47274d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_0", + "id29_content_1", + "outputarea_id28", + "outputarea_id29", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9abc40e0-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9abbcd4a-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_b66bb5c336" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_0", + "id29_content_1", + "outputarea_id28", + "outputarea_id29", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9abc9a22-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id29\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_6cf78aac24" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_0", + "id29_content_1", + "outputarea_id28", + "outputarea_id29", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mOfficeColumn\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
office
0SEA
1SEA
2LAX
3LAX
4SEA
\n", + "
" + ], + "text/plain": [ + " office\n", + "0 SEA\n", + "1 SEA\n", + "2 LAX\n", + "3 LAX\n", + "4 SEA" + ] + }, + "metadata": { + "tags": [ + "id28_content_0", + "id29_content_1", + "outputarea_id28", + "outputarea_id29", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9abf5154-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9abb6148-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_2264724c72" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_0", + "id29_content_1", + "outputarea_id28", + "outputarea_id29", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9ac0b67a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9ab6ee6a-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_55c08e0b7e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_0", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9ac269f2-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_c12b530781" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9ac2c104-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id28_content_4\");\n", + "//# sourceURL=js_f1659e2ff1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9ac35e70-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9ac2c104-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_f0556f33e0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9ac3ac5e-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id28\"].setSelectedTabIndex(4);\n", + "//# sourceURL=js_d8cdf85044" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running Offices\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"9ac63604-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9ac269f2-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_87c5ba290f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9ac7ee04-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_91e929377d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_1", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9ac8491c-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id28_content_1\");\n", + "//# sourceURL=js_42eec27819" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_1", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9ac89cdc-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9ac8491c-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_0ad7450c41" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_1", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9ac8f0a6-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id28\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_bf5a3322ce" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_1", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_1", + "outputarea_id28", + "outputarea_id30", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_1", + "outputarea_id28", + "outputarea_id30", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_1", + "outputarea_id28", + "outputarea_id30", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9acac61a-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id30\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_b238ea920e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_1", + "outputarea_id28", + "outputarea_id30", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9acb1444-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id30\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_a4071604ad" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_1", + "outputarea_id28", + "outputarea_id30", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9acc7ee2-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_e8b8104504" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_1", + "id30_content_0", + "outputarea_id28", + "outputarea_id30", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9accd932-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id30_content_0\");\n", + "//# sourceURL=js_3ef332aa43" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_1", + "id30_content_0", + "outputarea_id28", + "outputarea_id30", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9acd330a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9accd932-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_3c7b9076b8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_1", + "id30_content_0", + "outputarea_id28", + "outputarea_id30", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9acd7982-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id30\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_45e428af99" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_1", + "id30_content_0", + "outputarea_id28", + "outputarea_id30", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mOffices_sql\u001b[0m variable.\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " \"Alice\" AS name,\n", + " \"Product Manager\" AS role,\n", + " \"SEA\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Bob\" AS name,\n", + " \"Engineer\" AS role,\n", + " \"SEA\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Caroline\" AS name,\n", + " \"Engineer\" AS role,\n", + " \"LAX\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"David\" AS name,\n", + " \"Data Scientist\" AS role,\n", + " \"LAX\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Eve\" AS name,\n", + " \"Data Scientist\" AS role,\n", + " \"SEA\" AS office\n", + " \n", + ") )\n", + "SELECT\n", + " Employee.office AS office\n", + "FROM\n", + " t_0_Employee AS Employee\n", + "GROUP BY office;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"9aceb068-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9acc7ee2-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_57479d2b09" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_1", + "id30_content_0", + "outputarea_id28", + "outputarea_id30", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9ad01dae-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9ac7ee04-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_b9f1b793d1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_1", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9ad2011e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_9fbd148ad5" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9ad28bca-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id28_content_4\");\n", + "//# sourceURL=js_e1fd961477" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9ad2fdda-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9ad28bca-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_c339925b31" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9ad362b6-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id28\"].setSelectedTabIndex(4);\n", + "//# sourceURL=js_38c14c0675" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9b57b674-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9ad2011e-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_85ff8f1a0d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9b5a33c2-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_9158712f97" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_1", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9b5a92c2-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id28_content_1\");\n", + "//# sourceURL=js_80b34b111f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_1", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9b5ae542-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9b5a92c2-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_ccac46c4c1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_1", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9b5b4b18-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id28\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_517db41bca" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_1", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9b5c8ae6-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_9ae5e388d6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_1", + "id30_content_1", + "outputarea_id28", + "outputarea_id30", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9b5cf4a4-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id30_content_1\");\n", + "//# sourceURL=js_c122921964" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_1", + "id30_content_1", + "outputarea_id28", + "outputarea_id30", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9b5d4b7a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9b5cf4a4-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_cde2112692" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_1", + "id30_content_1", + "outputarea_id28", + "outputarea_id30", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9b5da5b6-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id30\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_82456cc3c0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_1", + "id30_content_1", + "outputarea_id28", + "outputarea_id30", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mOffices\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
office
0SEA
1LAX
\n", + "
" + ], + "text/plain": [ + " office\n", + "0 SEA\n", + "1 LAX" + ] + }, + "metadata": { + "tags": [ + "id28_content_1", + "id30_content_1", + "outputarea_id28", + "outputarea_id30", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9b6111e2-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9b5c8ae6-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_9a369f01d5" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_1", + "id30_content_1", + "outputarea_id28", + "outputarea_id30", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9b62936e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9b5a33c2-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_b444a9eedc" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_1", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9b644f88-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_3608bfeedb" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9b64ac30-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id28_content_4\");\n", + "//# sourceURL=js_4f25d72e99" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9b650432-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9b64ac30-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_8dcd982064" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9b6555ea-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id28\"].setSelectedTabIndex(4);\n", + "//# sourceURL=js_87b4b1cd76" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running EmployeesPerOffice\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"9b686df2-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9b644f88-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_fb04c37bf9" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9b6a4032-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_0f557f7f81" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_2", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9b6aa018-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id28_content_2\");\n", + "//# sourceURL=js_a1a27e9b08" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_2", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9b6ae7b2-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9b6aa018-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_cc27715543" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_2", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9b6b5454-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id28\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_aa85ec09ba" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_2", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_2", + "outputarea_id28", + "outputarea_id31", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_2", + "outputarea_id28", + "outputarea_id31", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_2", + "outputarea_id28", + "outputarea_id31", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9b6d5038-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id31\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_ae4bc8d3bf" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_2", + "outputarea_id28", + "outputarea_id31", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9b6daf74-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id31\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_1001fd6e29" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_2", + "outputarea_id28", + "outputarea_id31", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9b6f2386-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_e660586e14" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_2", + "id31_content_0", + "outputarea_id28", + "outputarea_id31", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9b6f7fa2-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id31_content_0\");\n", + "//# sourceURL=js_7d6bfb6948" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_2", + "id31_content_0", + "outputarea_id28", + "outputarea_id31", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9b6fc340-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9b6f7fa2-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_c07b7087ba" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_2", + "id31_content_0", + "outputarea_id28", + "outputarea_id31", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9b700648-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id31\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_2069cd72b5" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_2", + "id31_content_0", + "outputarea_id28", + "outputarea_id31", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mEmployeesPerOffice_sql\u001b[0m variable.\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " \"Alice\" AS name,\n", + " \"Product Manager\" AS role,\n", + " \"SEA\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Bob\" AS name,\n", + " \"Engineer\" AS role,\n", + " \"SEA\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Caroline\" AS name,\n", + " \"Engineer\" AS role,\n", + " \"LAX\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"David\" AS name,\n", + " \"Data Scientist\" AS role,\n", + " \"LAX\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Eve\" AS name,\n", + " \"Data Scientist\" AS role,\n", + " \"SEA\" AS office\n", + " \n", + ") )\n", + "SELECT\n", + " Employee.office AS office,\n", + " SUM(1) AS num_employees,\n", + " APPROX_COUNT_DISTINCT(Employee.role) AS role_count\n", + "FROM\n", + " t_0_Employee AS Employee\n", + "GROUP BY office;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"9b720614-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9b6f2386-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_fe7c034927" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_2", + "id31_content_0", + "outputarea_id28", + "outputarea_id31", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9b73fe06-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9b6a4032-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_ac59c7ba0c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_2", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9b756854-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_70abeb4ff0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9b75b6ce-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id28_content_4\");\n", + "//# sourceURL=js_c783bd4799" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9b75fba2-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9b75b6ce-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_355c8aa301" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9b764422-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id28\"].setSelectedTabIndex(4);\n", + "//# sourceURL=js_4d004a189f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9bef1df2-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9b756854-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_1eab2ce3d9" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9bf35cbe-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_99fc1d59c0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_2", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9bf3ea94-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id28_content_2\");\n", + "//# sourceURL=js_57f4c9d5d4" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_2", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9bf46fd2-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9bf3ea94-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_05aba64d5f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_2", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9bf51522-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id28\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_643494fd40" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_2", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9bf72a88-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_7a4575bf22" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_2", + "id31_content_1", + "outputarea_id28", + "outputarea_id31", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9bf7b2e6-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id31_content_1\");\n", + "//# sourceURL=js_9725ac12ea" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_2", + "id31_content_1", + "outputarea_id28", + "outputarea_id31", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9bf82578-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9bf7b2e6-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_474e0f8dbe" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_2", + "id31_content_1", + "outputarea_id28", + "outputarea_id31", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9bf894b8-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id31\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_ab339e5cf0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_2", + "id31_content_1", + "outputarea_id28", + "outputarea_id31", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mEmployeesPerOffice\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
officenum_employeesrole_count
0SEA33
1LAX22
\n", + "
" + ], + "text/plain": [ + " office num_employees role_count\n", + "0 SEA 3 3\n", + "1 LAX 2 2" + ] + }, + "metadata": { + "tags": [ + "id28_content_2", + "id31_content_1", + "outputarea_id28", + "outputarea_id31", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9bfba888-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9bf72a88-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_894b3419f4" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_2", + "id31_content_1", + "outputarea_id28", + "outputarea_id31", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9bfcfa6c-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9bf35cbe-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_83bc572a93" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_2", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9bfe9d4a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_8dccb56fcb" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9bfef844-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id28_content_4\");\n", + "//# sourceURL=js_a244aa5d3b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9bff4286-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9bfef844-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_7c07722328" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9bff984e-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id28\"].setSelectedTabIndex(4);\n", + "//# sourceURL=js_b92d16f902" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running EmployeesOfOffice\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"9c0271f4-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9bfe9d4a-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_f91fb19049" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9c041270-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_1d27851018" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_3", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9c04673e-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id28_content_3\");\n", + "//# sourceURL=js_a46a3cc4ba" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_3", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9c04afdc-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9c04673e-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_5894b95a33" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_3", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9c0501da-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id28\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_ade3206816" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_3", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_3", + "outputarea_id28", + "outputarea_id32", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_3", + "outputarea_id28", + "outputarea_id32", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_3", + "outputarea_id28", + "outputarea_id32", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9c06ca92-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id32\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_3ddabbbaa0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_3", + "outputarea_id28", + "outputarea_id32", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9c076236-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id32\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_ededfd0ea4" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_3", + "outputarea_id28", + "outputarea_id32", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9c08aae2-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_27c6642893" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_3", + "id32_content_0", + "outputarea_id28", + "outputarea_id32", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9c08f948-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id32_content_0\");\n", + "//# sourceURL=js_8721cc5359" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_3", + "id32_content_0", + "outputarea_id28", + "outputarea_id32", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9c094042-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9c08f948-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_08d5e174a6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_3", + "id32_content_0", + "outputarea_id28", + "outputarea_id32", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9c098890-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id32\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_9d9addc38d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_3", + "id32_content_0", + "outputarea_id28", + "outputarea_id32", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mEmployeesOfOffice_sql\u001b[0m variable.\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " \"Alice\" AS name,\n", + " \"Product Manager\" AS role,\n", + " \"SEA\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Bob\" AS name,\n", + " \"Engineer\" AS role,\n", + " \"SEA\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Caroline\" AS name,\n", + " \"Engineer\" AS role,\n", + " \"LAX\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"David\" AS name,\n", + " \"Data Scientist\" AS role,\n", + " \"LAX\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Eve\" AS name,\n", + " \"Data Scientist\" AS role,\n", + " \"SEA\" AS office\n", + " \n", + ") )\n", + "SELECT\n", + " Employee.office AS office,\n", + " ARRAY_AGG(Employee.name) AS employees\n", + "FROM\n", + " t_0_Employee AS Employee\n", + "GROUP BY office;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"9c0a917c-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9c08aae2-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_0df1d75c98" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_3", + "id32_content_0", + "outputarea_id28", + "outputarea_id32", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9c0c008e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9c041270-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_346bf6b6ed" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_3", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9c0ebbc6-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_f9413f7a7a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9c0f5388-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id28_content_4\");\n", + "//# sourceURL=js_505227f56f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9c0fc98a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9c0f5388-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_a7ff52911f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9c101764-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id28\"].setSelectedTabIndex(4);\n", + "//# sourceURL=js_883e814c73" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9c85c900-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9c0ebbc6-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_9d4aa97b57" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_4", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9c8a2946-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_e3f88ef48d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_3", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9c8ac4fa-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id28_content_3\");\n", + "//# sourceURL=js_b16e043a1b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_3", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9c8b523a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9c8ac4fa-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_6e56017e18" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_3", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9c8bb540-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id28\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_0757692a1f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_3", + "outputarea_id28" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9c8d16d8-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_726312da6b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_3", + "id32_content_1", + "outputarea_id28", + "outputarea_id32", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9c8dd190-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id32_content_1\");\n", + "//# sourceURL=js_e29cfb4a82" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_3", + "id32_content_1", + "outputarea_id28", + "outputarea_id32", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9c8e40da-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9c8dd190-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_545a716f7b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_3", + "id32_content_1", + "outputarea_id28", + "outputarea_id32", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9c8eabe2-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id32\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_ee499761d8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_3", + "id32_content_1", + "outputarea_id28", + "outputarea_id32", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mEmployeesOfOffice\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
officeemployees
0SEA[Alice, Bob, Eve]
1LAX[Caroline, David]
\n", + "
" + ], + "text/plain": [ + " office employees\n", + "0 SEA [Alice, Bob, Eve]\n", + "1 LAX [Caroline, David]" + ] + }, + "metadata": { + "tags": [ + "id28_content_3", + "id32_content_1", + "outputarea_id28", + "outputarea_id32", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9c92420c-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9c8d16d8-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_a83e1fd77e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_3", + "id32_content_1", + "outputarea_id28", + "outputarea_id32", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"9c93a7e6-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9c8a2946-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_816c84fd16" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id28_content_3", + "outputarea_id28" + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "%%logica OfficeColumn,Offices,EmployeesPerOffice,EmployeesOfOffice\n", + "\n", + "Employee(name: \"Alice\", role: \"Product Manager\", office: \"SEA\");\n", + "Employee(name: \"Bob\", role: \"Engineer\", office: \"SEA\");\n", + "Employee(name: \"Caroline\", role: \"Engineer\", office: \"LAX\");\n", + "Employee(name: \"David\", role: \"Data Scientist\", office: \"LAX\");\n", + "Employee(name: \"Eve\", role: \"Data Scientist\", office: \"SEA\");\n", + "\n", + "OfficeColumn(office:) :- Employee(office:);\n", + "\n", + "Offices(office:) distinct :- Employee(office:);\n", + "\n", + "EmployeesPerOffice(office:,\n", + " num_employees? += 1,\n", + " role_count? Count=role) distinct :-\n", + " Employee(name: unused_name, office:, role:);\n", + " \n", + "EmployeesOfOffice(office:, employees? List= name) distinct :-\n", + " Employee(name:, office:);\n", + " \n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Cqv6UMREL7ev" + }, + "source": [ + "#### Intra-record aggregation\n", + "\n", + "Syntax for intra-record aggregation is\n", + "```\n", + "combine = [ :- ]\n", + "```\n", + "\n", + "There is also a short-hand syntax provided for storing result of the aggregation in a variable. This syntax is considered more readable and is recommended:\n", + "\n", + "```\n", + " =( [ :- body ])\n", + "```\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 239, + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH0=", + "headers": [ + [ + "content-type", + "text/css" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgaCxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9ZnVuY3Rpb24oYSl7dmFyIGI9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmYVtTeW1ib2wuaXRlcmF0b3JdO3JldHVybiBiP2IuY2FsbChhKTp7bmV4dDphYShhKX19LGw9dGhpc3x8c2VsZixjYT1mdW5jdGlvbigpe30sZGE9ZnVuY3Rpb24oYSl7YS5CYT12b2lkIDA7YS5SPWZ1bmN0aW9uKCl7cmV0dXJuIGEuQmE/YS5CYTphLkJhPW5ldyBhfX0sZWE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7aWYoIm9iamVjdCI9PWIpaWYoYSl7aWYoYSBpbnN0YW5jZW9mIEFycmF5KXJldHVybiJhcnJheSI7aWYoYSBpbnN0YW5jZW9mIE9iamVjdClyZXR1cm4gYjt2YXIgYz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk7aWYoIltvYmplY3QgV2luZG93XSI9PWMpcmV0dXJuIm9iamVjdCI7CmlmKCJbb2JqZWN0IEFycmF5XSI9PWN8fCJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGgmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5zcGxpY2UmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoInNwbGljZSIpKXJldHVybiJhcnJheSI7aWYoIltvYmplY3QgRnVuY3Rpb25dIj09Y3x8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmNhbGwmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoImNhbGwiKSlyZXR1cm4iZnVuY3Rpb24ifWVsc2UgcmV0dXJuIm51bGwiO2Vsc2UgaWYoImZ1bmN0aW9uIj09YiYmInVuZGVmaW5lZCI9PXR5cGVvZiBhLmNhbGwpcmV0dXJuIm9iamVjdCI7cmV0dXJuIGJ9LGZhPWZ1bmN0aW9uKGEpe3JldHVybiJhcnJheSI9PWVhKGEpfSxoYT1mdW5jdGlvbihhKXt2YXIgYj1lYShhKTtyZXR1cm4iYXJyYXkiPT1ifHwib2JqZWN0Ij09CmImJiJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGh9LGlhPWZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PWVhKGEpfSxtPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBhO3JldHVybiJvYmplY3QiPT1iJiZudWxsIT1hfHwiZnVuY3Rpb24iPT1ifSxqYT0iY2xvc3VyZV91aWRfIisoMUU5Kk1hdGgucmFuZG9tKCk+Pj4wKSxrYT0wLGxhPWZ1bmN0aW9uKGEsYil7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe3ZhciBkPWMuc2xpY2UoKTtkLnB1c2guYXBwbHkoZCxhcmd1bWVudHMpO3JldHVybiBhLmFwcGx5KHRoaXMsZCl9fSxuPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe31jLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLmk9Yi5wcm90b3R5cGU7YS5wcm90b3R5cGU9bmV3IGM7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YX07dmFyIG1hLG5hPXtlYjoiYWN0aXZlZGVzY2VuZGFudCIsamI6ImF0b21pYyIsa2I6ImF1dG9jb21wbGV0ZSIsbWI6ImJ1c3kiLHBiOiJjaGVja2VkIixxYjoiY29saW5kZXgiLHZiOiJjb250cm9scyIseGI6ImRlc2NyaWJlZGJ5IixBYjoiZGlzYWJsZWQiLENiOiJkcm9wZWZmZWN0IixEYjoiZXhwYW5kZWQiLEViOiJmbG93dG8iLEdiOiJncmFiYmVkIixLYjoiaGFzcG9wdXAiLE1iOiJoaWRkZW4iLE9iOiJpbnZhbGlkIixQYjoibGFiZWwiLFFiOiJsYWJlbGxlZGJ5IixSYjoibGV2ZWwiLFdiOiJsaXZlIixrYzoibXVsdGlsaW5lIixsYzoibXVsdGlzZWxlY3RhYmxlIixwYzoib3JpZW50YXRpb24iLHFjOiJvd25zIixyYzoicG9zaW5zZXQiLHRjOiJwcmVzc2VkIix4YzoicmVhZG9ubHkiLHpjOiJyZWxldmFudCIsQWM6InJlcXVpcmVkIixFYzoicm93aW5kZXgiLEhjOiJzZWxlY3RlZCIsSmM6InNldHNpemUiLExjOiJzb3J0IixaYzoidmFsdWVtYXgiLCRjOiJ2YWx1ZW1pbiIsYWQ6InZhbHVlbm93IiwKYmQ6InZhbHVldGV4dCJ9O3ZhciBvYT1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkIGluIGEpYi5jYWxsKGMsYVtkXSxkLGEpfSxwYT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyBpbiBhKWlmKGFbY109PWIpcmV0dXJuITA7cmV0dXJuITF9LHFhPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsIT09YSYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfSxzYT1mdW5jdGlvbihhKXt2YXIgYj17fSxjO2ZvcihjIGluIGEpYlthW2NdXT1jO3JldHVybiBifSx0YT0iY29uc3RydWN0b3IgaGFzT3duUHJvcGVydHkgaXNQcm90b3R5cGVPZiBwcm9wZXJ0eUlzRW51bWVyYWJsZSB0b0xvY2FsZVN0cmluZyB0b1N0cmluZyB2YWx1ZU9mIi5zcGxpdCgiICIpLHVhPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8dGEubGVuZ3RoO2YrKyljPQp0YVtmXSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZCxjKSYmKGFbY109ZFtjXSl9fTt2YXIgdmE9e2ZiOiJhbGVydCIsZ2I6ImFsZXJ0ZGlhbG9nIixoYjoiYXBwbGljYXRpb24iLGliOiJhcnRpY2xlIixsYjoiYmFubmVyIixuYjoiYnV0dG9uIixvYjoiY2hlY2tib3giLHJiOiJjb2x1bW5oZWFkZXIiLHNiOiJjb21ib2JveCIsdGI6ImNvbXBsZW1lbnRhcnkiLHViOiJjb250ZW50aW5mbyIsd2I6ImRlZmluaXRpb24iLHliOiJkaWFsb2ciLHpiOiJkaXJlY3RvcnkiLEJiOiJkb2N1bWVudCIsRmI6ImZvcm0iLEhiOiJncmlkIixJYjoiZ3JpZGNlbGwiLEpiOiJncm91cCIsTGI6ImhlYWRpbmciLE5iOiJpbWciLFNiOiJsaW5rIixUYjoibGlzdCIsVWI6Imxpc3Rib3giLFZiOiJsaXN0aXRlbSIsWGI6ImxvZyIsWWI6Im1haW4iLFpiOiJtYXJxdWVlIiwkYjoibWF0aCIsYWM6Im1lbnUiLGJjOiJtZW51YmFyIixjYzoibWVudWl0ZW0iLGRjOiJtZW51aXRlbWNoZWNrYm94IixlYzoibWVudWl0ZW1yYWRpbyIsbWM6Im5hdmlnYXRpb24iLG5jOiJub3RlIixvYzoib3B0aW9uIiwKc2M6InByZXNlbnRhdGlvbiIsdWM6InByb2dyZXNzYmFyIix2YzoicmFkaW8iLHdjOiJyYWRpb2dyb3VwIix5YzoicmVnaW9uIixCYzoicm93IixDYzoicm93Z3JvdXAiLERjOiJyb3doZWFkZXIiLEZjOiJzY3JvbGxiYXIiLEdjOiJzZWFyY2giLEljOiJzZXBhcmF0b3IiLEtjOiJzbGlkZXIiLE1jOiJzcGluYnV0dG9uIixOYzoic3RhdHVzIixPYzoidGFiIixQYzoidGFibGlzdCIsUWM6InRhYnBhbmVsIixSYzoidGV4dGJveCIsU2M6InRleHRpbmZvIixUYzoidGltZXIiLFVjOiJ0b29sYmFyIixWYzoidG9vbHRpcCIsV2M6InRyZWUiLFhjOiJ0cmVlZ3JpZCIsWWM6InRyZWVpdGVtIn07dmFyIHdhPWZ1bmN0aW9uKGEpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsd2EpO2Vsc2V7dmFyIGI9RXJyb3IoKS5zdGFjaztiJiYodGhpcy5zdGFjaz1iKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSl9O24od2EsRXJyb3IpO3dhLnByb3RvdHlwZS5uYW1lPSJDdXN0b21FcnJvciI7dmFyIHhhO3ZhciB5YT1mdW5jdGlvbihhLGIpe2E9YS5zcGxpdCgiJXMiKTtmb3IodmFyIGM9IiIsZD1hLmxlbmd0aC0xLGU9MDtlPGQ7ZSsrKWMrPWFbZV0rKGU8Yi5sZW5ndGg/YltlXToiJXMiKTt3YS5jYWxsKHRoaXMsYythW2RdKX07bih5YSx3YSk7eWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjsKdmFyIHphPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSJBc3NlcnRpb24gZmFpbGVkIjtpZihjKXtlKz0iOiAiK2M7dmFyIGY9ZH1lbHNlIGEmJihlKz0iOiAiK2EsZj1iKTt0aHJvdyBuZXcgeWEoIiIrZSxmfHxbXSk7fSxxPWZ1bmN0aW9uKGEsYixjKXthfHx6YSgiIixudWxsLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX0sQWE9ZnVuY3Rpb24oYSxiLGMpe20oYSkmJjE9PWEubm9kZVR5cGV8fHphKCJFeHBlY3RlZCBFbGVtZW50IGJ1dCBnb3QgJXM6ICVzLiIsW2VhKGEpLGFdLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKX0sQ2E9ZnVuY3Rpb24oYSxiLGMsZCl7YSBpbnN0YW5jZW9mIGJ8fHphKCJFeHBlY3RlZCBpbnN0YW5jZW9mICVzIGJ1dCBnb3QgJXMuIixbQmEoYiksQmEoYSldLGMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpKX0sQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZgpGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTpudWxsPT09YT8ibnVsbCI6dHlwZW9mIGF9O3ZhciBEYT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3EobnVsbCE9YS5sZW5ndGgpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKCJzdHJpbmciPT09dHlwZW9mIGEpcmV0dXJuInN0cmluZyIhPT10eXBlb2YgYnx8MSE9Yi5sZW5ndGg/LTE6YS5pbmRleE9mKGIsMCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspaWYoYyBpbiBhJiZhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX0scj1BcnJheS5wcm90b3R5cGUuZm9yRWFjaD9mdW5jdGlvbihhLGIsYyl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsYyl9OmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9YS5sZW5ndGgsZT0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZj0wO2Y8ZDtmKyspZiBpbiBlJiZiLmNhbGwoYyxlW2ZdLGYsYSl9LEVhPUFycmF5LnByb3RvdHlwZS5maWx0ZXI/CmZ1bmN0aW9uKGEsYil7cShudWxsIT1hLmxlbmd0aCk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD1bXSxlPTAsZj0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZz0wO2c8YztnKyspaWYoZyBpbiBmKXt2YXIgaz1mW2ddO2IuY2FsbCh2b2lkIDAsayxnLGEpJiYoZFtlKytdPWspfXJldHVybiBkfSxGYT1BcnJheS5wcm90b3R5cGUuZXZlcnk/ZnVuY3Rpb24oYSxiKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmV2ZXJ5LmNhbGwoYSxiLHZvaWQgMCl9OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWEubGVuZ3RoLGQ9InN0cmluZyI9PT10eXBlb2YgYT9hLnNwbGl0KCIiKTphLGU9MDtlPGM7ZSsrKWlmKGUgaW4gZCYmIWIuY2FsbCh2b2lkIDAsZFtlXSxlLGEpKXJldHVybiExO3JldHVybiEwfSxHYT1mdW5jdGlvbihhLGIpe3JldHVybiAwPD0KRGEoYSxiKX0sSGE9ZnVuY3Rpb24oYSxiKXtiPURhKGEsYik7dmFyIGM7aWYoYz0wPD1iKXEobnVsbCE9YS5sZW5ndGgpLEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhLGIsMSk7cmV0dXJuIGN9LElhPWZ1bmN0aW9uKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGFyZ3VtZW50cyl9LEphPWZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDA8Yil7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX0sTGE9ZnVuY3Rpb24oYSxiLGMsZCl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShhLEthKGFyZ3VtZW50cywxKSl9LEthPWZ1bmN0aW9uKGEsYixjKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gMj49YXJndW1lbnRzLmxlbmd0aD9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsYixjKX07dmFyIE1hPVN0cmluZy5wcm90b3R5cGUudHJpbT9mdW5jdGlvbihhKXtyZXR1cm4gYS50cmltKCl9OmZ1bmN0aW9uKGEpe3JldHVybi9eW1xzXHhhMF0qKFtcc1xTXSo/KVtcc1x4YTBdKiQvLmV4ZWMoYSlbMV19LE5hPS8mL2csT2E9LzwvZyxQYT0vPi9nLFFhPS8iL2csUmE9LycvZyxTYT0vXHgwMC9nLFRhPS9bXHgwMCY8PiInXS8sdD1mdW5jdGlvbihhLGIpe3JldHVybi0xIT1hLmluZGV4T2YoYil9LFVhPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE8Yj8tMTphPmI/MTowfTt2YXIgdTthOnt2YXIgVmE9bC5uYXZpZ2F0b3I7aWYoVmEpe3ZhciBXYT1WYS51c2VyQWdlbnQ7aWYoV2Epe3U9V2E7YnJlYWsgYX19dT0iIn07LyoKCiBDb3B5cmlnaHQgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzLgogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKKi8KdmFyIFhhPWZ1bmN0aW9uKGEpe1RhLnRlc3QoYSkmJigtMSE9YS5pbmRleE9mKCImIikmJihhPWEucmVwbGFjZShOYSwiJmFtcDsiKSksLTEhPWEuaW5kZXhPZigiPCIpJiYoYT1hLnJlcGxhY2UoT2EsIiZsdDsiKSksLTEhPWEuaW5kZXhPZigiPiIpJiYoYT1hLnJlcGxhY2UoUGEsIiZndDsiKSksLTEhPWEuaW5kZXhPZignIicpJiYoYT1hLnJlcGxhY2UoUWEsIiZxdW90OyIpKSwtMSE9YS5pbmRleE9mKCInIikmJihhPWEucmVwbGFjZShSYSwiJiMzOTsiKSksLTEhPWEuaW5kZXhPZigiXHgwMCIpJiYoYT1hLnJlcGxhY2UoU2EsIiYjMDsiKSkpO3JldHVybiBhfTt2YXIgWWE9ZnVuY3Rpb24oYSl7WWFbIiAiXShhKTtyZXR1cm4gYX07WWFbIiAiXT1jYTt2YXIgJGE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1aYTtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsYSk/Y1thXTpjW2FdPWIoYSl9O3ZhciBhYj10KHUsIk9wZXJhIiksdj10KHUsIlRyaWRlbnQiKXx8dCh1LCJNU0lFIiksYmI9dCh1LCJFZGdlIikseD10KHUsIkdlY2tvIikmJiEodCh1LnRvTG93ZXJDYXNlKCksIndlYmtpdCIpJiYhdCh1LCJFZGdlIikpJiYhKHQodSwiVHJpZGVudCIpfHx0KHUsIk1TSUUiKSkmJiF0KHUsIkVkZ2UiKSx5PXQodS50b0xvd2VyQ2FzZSgpLCJ3ZWJraXQiKSYmIXQodSwiRWRnZSIpLHo9dCh1LCJNYWNpbnRvc2giKSxjYj1mdW5jdGlvbigpe3ZhciBhPWwuZG9jdW1lbnQ7cmV0dXJuIGE/YS5kb2N1bWVudE1vZGU6dm9pZCAwfSxkYjsKYTp7dmFyIGViPSIiLGZiPWZ1bmN0aW9uKCl7dmFyIGE9dTtpZih4KXJldHVybi9ydjooW15cKTtdKykoXCl8OykvLmV4ZWMoYSk7aWYoYmIpcmV0dXJuL0VkZ2VcLyhbXGRcLl0rKS8uZXhlYyhhKTtpZih2KXJldHVybi9cYig/Ok1TSUV8cnYpWzogXShbXlwpO10rKShcKXw7KS8uZXhlYyhhKTtpZih5KXJldHVybi9XZWJLaXRcLyhcUyspLy5leGVjKGEpO2lmKGFiKXJldHVybi8oPzpWZXJzaW9uKVsgXC9dPyhcUyspLy5leGVjKGEpfSgpO2ZiJiYoZWI9ZmI/ZmJbMV06IiIpO2lmKHYpe3ZhciBnYj1jYigpO2lmKG51bGwhPWdiJiZnYj5wYXJzZUZsb2F0KGViKSl7ZGI9U3RyaW5nKGdiKTticmVhayBhfX1kYj1lYn0KdmFyIGhiPWRiLFphPXt9LEE9ZnVuY3Rpb24oYSl7cmV0dXJuICRhKGEsZnVuY3Rpb24oKXtmb3IodmFyIGI9MCxjPU1hKFN0cmluZyhoYikpLnNwbGl0KCIuIiksZD1NYShTdHJpbmcoYSkpLnNwbGl0KCIuIiksZT1NYXRoLm1heChjLmxlbmd0aCxkLmxlbmd0aCksZj0wOzA9PWImJmY8ZTtmKyspe3ZhciBnPWNbZl18fCIiLGs9ZFtmXXx8IiI7ZG97Zz0vKFxkKikoXEQqKSguKikvLmV4ZWMoZyl8fFsiIiwiIiwiIiwiIl07az0vKFxkKikoXEQqKSguKikvLmV4ZWMoayl8fFsiIiwiIiwiIiwiIl07aWYoMD09Z1swXS5sZW5ndGgmJjA9PWtbMF0ubGVuZ3RoKWJyZWFrO2I9VWEoMD09Z1sxXS5sZW5ndGg/MDpwYXJzZUludChnWzFdLDEwKSwwPT1rWzFdLmxlbmd0aD8wOnBhcnNlSW50KGtbMV0sMTApKXx8VWEoMD09Z1syXS5sZW5ndGgsMD09a1syXS5sZW5ndGgpfHxVYShnWzJdLGtbMl0pO2c9Z1szXTtrPWtbM119d2hpbGUoMD09Yil9cmV0dXJuIDA8PWJ9KX0saWI7CmliPWwuZG9jdW1lbnQmJnY/Y2IoKTp2b2lkIDA7dmFyIGpiPSF2fHw5PD1OdW1iZXIoaWIpO3ZhciBsYj1mdW5jdGlvbihhLGIpe29hKGIsZnVuY3Rpb24oYyxkKXtjJiYib2JqZWN0Ij09dHlwZW9mIGMmJmMuZGQmJihjPWMuY2QoKSk7InN0eWxlIj09ZD9hLnN0eWxlLmNzc1RleHQ9YzoiY2xhc3MiPT1kP2EuY2xhc3NOYW1lPWM6ImZvciI9PWQ/YS5odG1sRm9yPWM6a2IuaGFzT3duUHJvcGVydHkoZCk/YS5zZXRBdHRyaWJ1dGUoa2JbZF0sYyk6MD09ZC5sYXN0SW5kZXhPZigiYXJpYS0iLDApfHwwPT1kLmxhc3RJbmRleE9mKCJkYXRhLSIsMCk/YS5zZXRBdHRyaWJ1dGUoZCxjKTphW2RdPWN9KX0sa2I9e2NlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjb2xzcGFuOiJjb2xTcGFuIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGhlaWdodDoiaGVpZ2h0IixtYXhsZW5ndGg6Im1heExlbmd0aCIsbm9uY2U6Im5vbmNlIixyb2xlOiJyb2xlIixyb3dzcGFuOiJyb3dTcGFuIix0eXBlOiJ0eXBlIix1c2VtYXA6InVzZU1hcCIsdmFsaWduOiJ2QWxpZ24iLAp3aWR0aDoid2lkdGgifSxtYj1mdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChrKXtrJiZiLmFwcGVuZENoaWxkKCJzdHJpbmciPT09dHlwZW9mIGs/YS5jcmVhdGVUZXh0Tm9kZShrKTprKX1mb3IodmFyIGU9MjtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXTtpZighaGEoZil8fG0oZikmJjA8Zi5ub2RlVHlwZSlkKGYpO2Vsc2V7YTp7aWYoZiYmIm51bWJlciI9PXR5cGVvZiBmLmxlbmd0aCl7aWYobShmKSl7dmFyIGc9ImZ1bmN0aW9uIj09dHlwZW9mIGYuaXRlbXx8InN0cmluZyI9PXR5cGVvZiBmLml0ZW07YnJlYWsgYX1pZihpYShmKSl7Zz0iZnVuY3Rpb24iPT10eXBlb2YgZi5pdGVtO2JyZWFrIGF9fWc9ITF9cihnP0phKGYpOmYsZCl9fX0sbmI9ZnVuY3Rpb24oYSxiKXtiPVN0cmluZyhiKTsiYXBwbGljYXRpb24veGh0bWwreG1sIj09PWEuY29udGVudFR5cGUmJihiPWIudG9Mb3dlckNhc2UoKSk7cmV0dXJuIGEuY3JlYXRlRWxlbWVudChiKX0sb2I9ZnVuY3Rpb24oYSl7YSYmCmEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpfSxwYj1mdW5jdGlvbihhLGIpe2lmKCFhfHwhYilyZXR1cm4hMTtpZihhLmNvbnRhaW5zJiYxPT1iLm5vZGVUeXBlKXJldHVybiBhPT1ifHxhLmNvbnRhaW5zKGIpO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbilyZXR1cm4gYT09Ynx8ISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNik7Zm9yKDtiJiZhIT1iOyliPWIucGFyZW50Tm9kZTtyZXR1cm4gYj09YX0scWI9ZnVuY3Rpb24oYSl7cShhLCJOb2RlIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4iKTtyZXR1cm4gOT09YS5ub2RlVHlwZT9hOmEub3duZXJEb2N1bWVudHx8YS5kb2N1bWVudH0scmI9ZnVuY3Rpb24oYSxiKXtiP2EudGFiSW5kZXg9MDooYS50YWJJbmRleD0tMSxhLnJlbW92ZUF0dHJpYnV0ZSgidGFiSW5kZXgiKSl9LHNiPWZ1bmN0aW9uKGEpe3JldHVybiB2JiYhQSgiOSIpPyhhPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKSwKbnVsbCE9YSYmYS5zcGVjaWZpZWQpOmEuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpfSx0Yj1mdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgYSYmMDw9YSYmMzI3Njg+YX0sdWI9ZnVuY3Rpb24oYSl7dGhpcy5hPWF8fGwuZG9jdW1lbnR8fGRvY3VtZW50fTt1Yi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBhP3RoaXMuYS5nZXRFbGVtZW50QnlJZChhKTphfTsKdWIucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuYSxlPWFyZ3VtZW50cyxmPVN0cmluZyhlWzBdKSxnPWVbMV07aWYoIWpiJiZnJiYoZy5uYW1lfHxnLnR5cGUpKXtmPVsiPCIsZl07Zy5uYW1lJiZmLnB1c2goJyBuYW1lPSInLFhhKGcubmFtZSksJyInKTtpZihnLnR5cGUpe2YucHVzaCgnIHR5cGU9IicsWGEoZy50eXBlKSwnIicpO3ZhciBrPXt9O3VhKGssZyk7ZGVsZXRlIGsudHlwZTtnPWt9Zi5wdXNoKCI+Iik7Zj1mLmpvaW4oIiIpfWY9bmIoZCxmKTtnJiYoInN0cmluZyI9PT10eXBlb2YgZz9mLmNsYXNzTmFtZT1nOmZhKGcpP2YuY2xhc3NOYW1lPWcuam9pbigiICIpOmxiKGYsZykpOzI8ZS5sZW5ndGgmJm1iKGQsZixlKTtyZXR1cm4gZn07dmFyIHZiPWZ1bmN0aW9uKGEsYil7Yj8ocShwYSh2YSxiKSwiTm8gc3VjaCBBUklBIHJvbGUgIitiKSxhLnNldEF0dHJpYnV0ZSgicm9sZSIsYikpOmEucmVtb3ZlQXR0cmlidXRlKCJyb2xlIil9LHhiPWZ1bmN0aW9uKGEsYixjKXtmYShjKSYmKGM9Yy5qb2luKCIgIikpO3ZhciBkPXdiKGIpOyIiPT09Y3x8dm9pZCAwPT1jPyhtYXx8KG1hPXthdG9taWM6ITEsYXV0b2NvbXBsZXRlOiJub25lIixkcm9wZWZmZWN0OiJub25lIixoYXNwb3B1cDohMSxsaXZlOiJvZmYiLG11bHRpbGluZTohMSxtdWx0aXNlbGVjdGFibGU6ITEsb3JpZW50YXRpb246InZlcnRpY2FsIixyZWFkb25seTohMSxyZWxldmFudDoiYWRkaXRpb25zIHRleHQiLHJlcXVpcmVkOiExLHNvcnQ6Im5vbmUiLGJ1c3k6ITEsZGlzYWJsZWQ6ITEsaGlkZGVuOiExLGludmFsaWQ6ImZhbHNlIn0pLGM9bWEsYiBpbiBjP2Euc2V0QXR0cmlidXRlKGQsY1tiXSk6YS5yZW1vdmVBdHRyaWJ1dGUoZCkpOmEuc2V0QXR0cmlidXRlKGQsCmMpfSx3Yj1mdW5jdGlvbihhKXtxKGEsIkFSSUEgYXR0cmlidXRlIGNhbm5vdCBiZSBlbXB0eS4iKTtxKHBhKG5hLGEpLCJObyBzdWNoIEFSSUEgYXR0cmlidXRlICIrYSk7cmV0dXJuImFyaWEtIithfTt2YXIgeWI9T2JqZWN0LmZyZWV6ZXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O3ZhciBDPWZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVTt0aGlzLko9dGhpcy5KfTtDLnByb3RvdHlwZS5VPSExO0MucHJvdG90eXBlLk49ZnVuY3Rpb24oKXt0aGlzLlV8fCh0aGlzLlU9ITAsdGhpcy51KCkpfTt2YXIgemI9ZnVuY3Rpb24oYSxiKXthLlU/YigpOihhLkp8fChhLko9W10pLGEuSi5wdXNoKGIpKX07Qy5wcm90b3R5cGUudT1mdW5jdGlvbigpe2lmKHRoaXMuSilmb3IoO3RoaXMuSi5sZW5ndGg7KXRoaXMuSi5zaGlmdCgpKCl9O3ZhciBBYj1mdW5jdGlvbihhKXthJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5OJiZhLk4oKX07dmFyIEJiPWZ1bmN0aW9uKGEpe3JldHVybiJzdHJpbmciPT10eXBlb2YgYS5jbGFzc05hbWU/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sRD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6QmIoYSkubWF0Y2goL1xTKy9nKXx8W119LENiPWZ1bmN0aW9uKGEsYil7InN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZT9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxEYj1mdW5jdGlvbihhLGIpe3JldHVybiBhLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5jb250YWlucyhiKTpHYShEKGEpLGIpfSxFYj1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFEYihhLGIpKXt2YXIgYz1CYihhKTtDYihhLGMrKDA8Yy5sZW5ndGg/IiAiK2I6YikpfX0sRmI9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClyKGIsCmZ1bmN0aW9uKGUpe0ViKGEsZSl9KTtlbHNle3ZhciBjPXt9O3IoRChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7cihiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPTA8Yi5sZW5ndGg/IiAiK2Q6ZDtDYihhLGIpfX0sR2I9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6RGIoYSxiKSYmQ2IoYSxFYShEKGEpLGZ1bmN0aW9uKGMpe3JldHVybiBjIT1ifSkuam9pbigiICIpKX0sSGI9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9yKGIsZnVuY3Rpb24oYyl7R2IoYSxjKX0pOkNiKGEsRWEoRChhKSxmdW5jdGlvbihjKXtyZXR1cm4hR2EoYixjKX0pLmpvaW4oIiAiKSl9O3ZhciBJYj0hdnx8OTw9TnVtYmVyKGliKSxKYj0hdnx8OTw9TnVtYmVyKGliKSxLYj12JiYhQSgiOSIpLExiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e2wuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsY2EsYiksbC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjYSxiKX1jYXRjaChjKXt9cmV0dXJuIGF9KCk7dmFyIEU9ZnVuY3Rpb24oYSxiKXt0aGlzLnR5cGU9YTt0aGlzLmE9dGhpcy50YXJnZXQ9Yjt0aGlzLmg9ITE7dGhpcy5LYT0hMH07RS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuaD0hMH07RS5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3RoaXMuS2E9ITF9O3ZhciBGPXtMOiJtb3VzZWRvd24iLE06Im1vdXNldXAiLGFhOiJtb3VzZWNhbmNlbCIsaGM6Im1vdXNlbW92ZSIsamM6Im1vdXNlb3ZlciIsaWM6Im1vdXNlb3V0IixmYzoibW91c2VlbnRlciIsZ2M6Im1vdXNlbGVhdmUifTt2YXIgRz1mdW5jdGlvbihhLGIpe0UuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy5hPXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5jPTA7dGhpcy5BPXRoaXMubWV0YUtleT10aGlzLnNoaWZ0S2V5PXRoaXMuYWx0S2V5PXRoaXMuY3RybEtleT0hMTt0aGlzLnBvaW50ZXJJZD0wO3RoaXMucG9pbnRlclR5cGU9IiI7dGhpcy5iPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMuYT1iO2lmKGI9YS5yZWxhdGVkVGFyZ2V0KXtpZih4KXthOnt0cnl7WWEoYi5ub2RlTmFtZSk7dmFyIGU9ITA7YnJlYWsgYX1jYXRjaChmKXt9ZT0KITF9ZXx8KGI9bnVsbCl9fWVsc2UibW91c2VvdmVyIj09Yz9iPWEuZnJvbUVsZW1lbnQ6Im1vdXNlb3V0Ij09YyYmKGI9YS50b0VsZW1lbnQpO3RoaXMucmVsYXRlZFRhcmdldD1iO2Q/KHRoaXMuY2xpZW50WD12b2lkIDAhPT1kLmNsaWVudFg/ZC5jbGllbnRYOmQucGFnZVgsdGhpcy5jbGllbnRZPXZvaWQgMCE9PWQuY2xpZW50WT9kLmNsaWVudFk6ZC5wYWdlWSx0aGlzLnNjcmVlblg9ZC5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1kLnNjcmVlbll8fDApOih0aGlzLmNsaWVudFg9dm9pZCAwIT09YS5jbGllbnRYP2EuY2xpZW50WDphLnBhZ2VYLHRoaXMuY2xpZW50WT12b2lkIDAhPT1hLmNsaWVudFk/YS5jbGllbnRZOmEucGFnZVksdGhpcy5zY3JlZW5YPWEuc2NyZWVuWHx8MCx0aGlzLnNjcmVlblk9YS5zY3JlZW5ZfHwwKTt0aGlzLmJ1dHRvbj1hLmJ1dHRvbjt0aGlzLmM9YS5rZXlDb2RlfHwwO3RoaXMua2V5PWEua2V5fHwiIjt0aGlzLmN0cmxLZXk9YS5jdHJsS2V5O3RoaXMuYWx0S2V5PQphLmFsdEtleTt0aGlzLnNoaWZ0S2V5PWEuc2hpZnRLZXk7dGhpcy5tZXRhS2V5PWEubWV0YUtleTt0aGlzLkE9ej9hLm1ldGFLZXk6YS5jdHJsS2V5O3RoaXMucG9pbnRlcklkPWEucG9pbnRlcklkfHwwO3RoaXMucG9pbnRlclR5cGU9InN0cmluZyI9PT10eXBlb2YgYS5wb2ludGVyVHlwZT9hLnBvaW50ZXJUeXBlOk1iW2EucG9pbnRlclR5cGVdfHwiIjt0aGlzLmI9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnRoaXMuZygpfX07bihHLEUpO3ZhciBOYj15YihbMSw0LDJdKSxNYj15Yih7MjoidG91Y2giLDM6InBlbiIsNDoibW91c2UifSksT2I9ZnVuY3Rpb24oYSl7cmV0dXJuIEliPzA9PWEuYi5idXR0b246ImNsaWNrIj09YS50eXBlPyEwOiEhKGEuYi5idXR0b24mTmJbMF0pfTtHLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7Ry5pLmouY2FsbCh0aGlzKTt0aGlzLmIuc3RvcFByb3BhZ2F0aW9uP3RoaXMuYi5zdG9wUHJvcGFnYXRpb24oKTp0aGlzLmIuY2FuY2VsQnViYmxlPSEwfTsKRy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe0cuaS5nLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5iO2lmKGEucHJldmVudERlZmF1bHQpYS5wcmV2ZW50RGVmYXVsdCgpO2Vsc2UgaWYoYS5yZXR1cm5WYWx1ZT0hMSxLYil0cnl7aWYoYS5jdHJsS2V5fHwxMTI8PWEua2V5Q29kZSYmMTIzPj1hLmtleUNvZGUpYS5rZXlDb2RlPS0xfWNhdGNoKGIpe319O3ZhciBQYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKDFFNipNYXRoLnJhbmRvbSgpfDApLFFiPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW1BiXSl9LFJiPTA7dmFyIFNiPWZ1bmN0aW9uKGEsYixjLGQsZSl7dGhpcy5saXN0ZW5lcj1hO3RoaXMuYT1udWxsO3RoaXMuc3JjPWI7dGhpcy50eXBlPWM7dGhpcy5jYXB0dXJlPSEhZDt0aGlzLm1hPWU7dGhpcy5rZXk9KytSYjt0aGlzLlg9dGhpcy5oYT0hMX0sVGI9ZnVuY3Rpb24oYSl7YS5YPSEwO2EubGlzdGVuZXI9bnVsbDthLmE9bnVsbDthLnNyYz1udWxsO2EubWE9bnVsbH07dmFyIFViPWZ1bmN0aW9uKGEpe3RoaXMuc3JjPWE7dGhpcy5hPXt9O3RoaXMuYj0wfTtVYi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS50b1N0cmluZygpO2E9dGhpcy5hW2ZdO2F8fChhPXRoaXMuYVtmXT1bXSx0aGlzLmIrKyk7dmFyIGc9VmIoYSxiLGQsZSk7LTE8Zz8oYj1hW2ddLGN8fChiLmhhPSExKSk6KGI9bmV3IFNiKGIsdGhpcy5zcmMsZiwhIWQsZSksYi5oYT1jLGEucHVzaChiKSk7cmV0dXJuIGJ9Owp2YXIgV2I9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLnR5cGU7YyBpbiBhLmEmJkhhKGEuYVtjXSxiKSYmKFRiKGIpLDA9PWEuYVtjXS5sZW5ndGgmJihkZWxldGUgYS5hW2NdLGEuYi0tKSl9LFhiPWZ1bmN0aW9uKGEsYixjLGQsZSl7YT1hLmFbYi50b1N0cmluZygpXTtiPS0xO2EmJihiPVZiKGEsYyxkLGUpKTtyZXR1cm4tMTxiP2FbYl06bnVsbH0sVmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuWCYmZi5saXN0ZW5lcj09YiYmZi5jYXB0dXJlPT0hIWMmJmYubWE9PWQpcmV0dXJuIGV9cmV0dXJuLTF9O3ZhciBZYj0iY2xvc3VyZV9sbV8iKygxRTYqTWF0aC5yYW5kb20oKXwwKSxaYj17fSwkYj0wLGJjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZCYmZC5vbmNlKXJldHVybiBhYyhhLGIsYyxkLGUpO2lmKGZhKGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyliYyhhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9Y2MoYyk7cmV0dXJuIFFiKGEpP2RjKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOmVjKGEsYixjLCExLGQsZSl9LGVjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGc9bShlKT8hIWUuY2FwdHVyZTohIWUsaz1mYyhhKTtrfHwoYVtZYl09az1uZXcgVWIoYSkpO2M9ay5hZGQoYixjLGQsZyxmKTtpZihjLmEpcmV0dXJuIGM7ZD1nYygpO2MuYT1kO2Quc3JjPWE7ZC5saXN0ZW5lcj1jO2lmKGEuYWRkRXZlbnRMaXN0ZW5lcilMYnx8KGU9Zyksdm9pZCAwPT09ZSYmKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksCmQsZSk7ZWxzZSBpZihhLmF0dGFjaEV2ZW50KWEuYXR0YWNoRXZlbnQoaGMoYi50b1N0cmluZygpKSxkKTtlbHNlIGlmKGEuYWRkTGlzdGVuZXImJmEucmVtb3ZlTGlzdGVuZXIpcSgiY2hhbmdlIj09PWIsIk1lZGlhUXVlcnlMaXN0IG9ubHkgaGFzIGEgY2hhbmdlIGV2ZW50IiksYS5hZGRMaXN0ZW5lcihkKTtlbHNlIHRocm93IEVycm9yKCJhZGRFdmVudExpc3RlbmVyIGFuZCBhdHRhY2hFdmVudCBhcmUgdW5hdmFpbGFibGUuIik7JGIrKztyZXR1cm4gY30sZ2M9ZnVuY3Rpb24oKXt2YXIgYT1pYyxiPUpiP2Z1bmN0aW9uKGMpe3JldHVybiBhLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKX06ZnVuY3Rpb24oYyl7Yz1hLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKTtpZighYylyZXR1cm4gY307cmV0dXJuIGJ9LGFjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZmEoYikpe2Zvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWFjKGEsYltmXSxjLGQsZSk7cmV0dXJuIG51bGx9Yz1jYyhjKTtyZXR1cm4gUWIoYSk/CmEuaC5hZGQoU3RyaW5nKGIpLGMsITAsbShkKT8hIWQuY2FwdHVyZTohIWQsZSk6ZWMoYSxiLGMsITAsZCxlKX0samM9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihmYShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylqYyhhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPWNjKGMpLFFiKGEpPyhhPWEuaCxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5hJiYoZj1hLmFbYl0sYz1WYihmLGMsZCxlKSwtMTxjJiYoVGIoZltjXSkscShudWxsIT1mLmxlbmd0aCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSwwPT1mLmxlbmd0aCYmKGRlbGV0ZSBhLmFbYl0sYS5iLS0pKSkpOmEmJihhPWZjKGEpKSYmKGM9WGIoYSxiLGMsZCxlKSkmJmtjKGMpfSxrYz1mdW5jdGlvbihhKXtpZigibnVtYmVyIiE9PXR5cGVvZiBhJiZhJiYhYS5YKXt2YXIgYj1hLnNyYztpZihRYihiKSlXYihiLmgsYSk7ZWxzZXt2YXIgYz1hLnR5cGUsZD1hLmE7Yi5yZW1vdmVFdmVudExpc3RlbmVyPwpiLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KGhjKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7JGItLTsoYz1mYyhiKSk/KFdiKGMsYSksMD09Yy5iJiYoYy5zcmM9bnVsbCxiW1liXT1udWxsKSk6VGIoYSl9fX0saGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gWmI/WmJbYV06WmJbYV09Im9uIithfSxtYz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMDtpZihhPWZjKGEpKWlmKGI9YS5hW2IudG9TdHJpbmcoKV0pZm9yKGI9Yi5jb25jYXQoKSxhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBmPWJbYV07ZiYmZi5jYXB0dXJlPT1jJiYhZi5YJiYoZj1sYyhmLGQpLGU9ZSYmITEhPT1mKX1yZXR1cm4gZX0sbGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5tYXx8YS5zcmM7YS5oYSYma2MoYSk7cmV0dXJuIGMuY2FsbChkLGIpfSxpYz1mdW5jdGlvbihhLApiKXtpZihhLlgpcmV0dXJuITA7aWYoIUpiKXtpZighYilhOntiPVsid2luZG93IiwiZXZlbnQiXTtmb3IodmFyIGM9bCxkPTA7ZDxiLmxlbmd0aDtkKyspaWYoYz1jW2JbZF1dLG51bGw9PWMpe2I9bnVsbDticmVhayBhfWI9Y31kPWI7Yj1uZXcgRyhkLHRoaXMpO2M9ITA7aWYoISgwPmQua2V5Q29kZXx8dm9pZCAwIT1kLnJldHVyblZhbHVlKSl7YTp7dmFyIGU9ITE7aWYoMD09ZC5rZXlDb2RlKXRyeXtkLmtleUNvZGU9LTE7YnJlYWsgYX1jYXRjaChnKXtlPSEwfWlmKGV8fHZvaWQgMD09ZC5yZXR1cm5WYWx1ZSlkLnJldHVyblZhbHVlPSEwfWQ9W107Zm9yKGU9Yi5hO2U7ZT1lLnBhcmVudE5vZGUpZC5wdXNoKGUpO2E9YS50eXBlO2ZvcihlPWQubGVuZ3RoLTE7IWIuaCYmMDw9ZTtlLS0pe2IuYT1kW2VdO3ZhciBmPW1jKGRbZV0sYSwhMCxiKTtjPWMmJmZ9Zm9yKGU9MDshYi5oJiZlPGQubGVuZ3RoO2UrKyliLmE9ZFtlXSxmPW1jKGRbZV0sYSwhMSxiKSxjPWMmJmZ9cmV0dXJuIGN9cmV0dXJuIGxjKGEsCm5ldyBHKGIsdGhpcykpfSxmYz1mdW5jdGlvbihhKXthPWFbWWJdO3JldHVybiBhIGluc3RhbmNlb2YgVWI/YTpudWxsfSxuYz0iX19jbG9zdXJlX2V2ZW50c19mbl8iKygxRTkqTWF0aC5yYW5kb20oKT4+PjApLGNjPWZ1bmN0aW9uKGEpe3EoYSwiTGlzdGVuZXIgY2FuIG5vdCBiZSBudWxsLiIpO2lmKGlhKGEpKXJldHVybiBhO3EoYS5oYW5kbGVFdmVudCwiQW4gb2JqZWN0IGxpc3RlbmVyIG11c3QgaGF2ZSBoYW5kbGVFdmVudCBtZXRob2QuIik7YVtuY118fChhW25jXT1mdW5jdGlvbihiKXtyZXR1cm4gYS5oYW5kbGVFdmVudChiKX0pO3JldHVybiBhW25jXX07dmFyIG9jPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9e319O24ob2MsQyk7CnZhciBwYz1bXSxIPWZ1bmN0aW9uKGEsYixjLGQpe2ZhKGMpfHwoYyYmKHBjWzBdPWMudG9TdHJpbmcoKSksYz1wYyk7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWJjKGIsY1tlXSxkfHxhLmhhbmRsZUV2ZW50LCExLGEuYnx8YSk7aWYoIWYpYnJlYWs7YS5hW2Yua2V5XT1mfXJldHVybiBhfSxxYz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoZmEoYykpZm9yKHZhciBnPTA7ZzxjLmxlbmd0aDtnKyspcWMoYSxiLGNbZ10sZCxlLGYpO2Vsc2UgZD1kfHxhLmhhbmRsZUV2ZW50LGU9bShlKT8hIWUuY2FwdHVyZTohIWUsZj1mfHxhLmJ8fGEsZD1jYyhkKSxlPSEhZSxjPVFiKGIpP1hiKGIuaCxTdHJpbmcoYyksZCxlLGYpOmI/KGI9ZmMoYikpP1hiKGIsYyxkLGUsZik6bnVsbDpudWxsLGMmJihrYyhjKSxkZWxldGUgYS5hW2Mua2V5XSk7cmV0dXJuIGF9LHJjPWZ1bmN0aW9uKGEpe29hKGEuYSxmdW5jdGlvbihiLGMpe3RoaXMuYS5oYXNPd25Qcm9wZXJ0eShjKSYma2MoYil9LAphKTthLmE9e319O29jLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7b2MuaS51LmNhbGwodGhpcyk7cmModGhpcyl9O29jLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJFdmVudEhhbmRsZXIuaGFuZGxlRXZlbnQgbm90IGltcGxlbWVudGVkIik7fTt2YXIgST1mdW5jdGlvbigpe0MuY2FsbCh0aGlzKTt0aGlzLmg9bmV3IFViKHRoaXMpO3RoaXMuTWE9dGhpczt0aGlzLnBhPW51bGx9O24oSSxDKTtJLnByb3RvdHlwZVtQYl09ITA7SS5wcm90b3R5cGUucmE9ZnVuY3Rpb24oYSl7dGhpcy5wYT1hfTtJLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjLGQpe2pjKHRoaXMsYSxiLGMsZCl9Owp2YXIgdWM9ZnVuY3Rpb24oYSxiKXtzYyhhKTt2YXIgYz1hLnBhO2lmKGMpe3ZhciBkPVtdO2Zvcih2YXIgZT0xO2M7Yz1jLnBhKWQucHVzaChjKSxxKDFFMz4rK2UsImluZmluaXRlIGxvb3AiKX1hPWEuTWE7Yz1iLnR5cGV8fGI7InN0cmluZyI9PT10eXBlb2YgYj9iPW5ldyBFKGIsYSk6YiBpbnN0YW5jZW9mIEU/Yi50YXJnZXQ9Yi50YXJnZXR8fGE6KGU9YixiPW5ldyBFKGMsYSksdWEoYixlKSk7ZT0hMDtpZihkKWZvcih2YXIgZj1kLmxlbmd0aC0xOyFiLmgmJjA8PWY7Zi0tKXt2YXIgZz1iLmE9ZFtmXTtlPXRjKGcsYywhMCxiKSYmZX1iLmh8fChnPWIuYT1hLGU9dGMoZyxjLCEwLGIpJiZlLGIuaHx8KGU9dGMoZyxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLmgmJmY8ZC5sZW5ndGg7ZisrKWc9Yi5hPWRbZl0sZT10YyhnLGMsITEsYikmJmU7cmV0dXJuIGV9OwpJLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7SS5pLnUuY2FsbCh0aGlzKTtpZih0aGlzLmgpe3ZhciBhPXRoaXMuaCxiPTAsYztmb3IoYyBpbiBhLmEpe2Zvcih2YXIgZD1hLmFbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixUYihkW2VdKTtkZWxldGUgYS5hW2NdO2EuYi0tfX10aGlzLnBhPW51bGx9O3ZhciBkYz1mdW5jdGlvbihhLGIsYyxkLGUpe3NjKGEpO3JldHVybiBhLmguYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LHRjPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5oLmFbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGc9YltmXTtpZihnJiYhZy5YJiZnLmNhcHR1cmU9PWMpe3ZhciBrPWcubGlzdGVuZXIscD1nLm1hfHxnLnNyYztnLmhhJiZXYihhLmgsZyk7ZT0hMSE9PWsuY2FsbChwLGQpJiZlfX1yZXR1cm4gZSYmMCE9ZC5LYX0sc2M9ZnVuY3Rpb24oYSl7cShhLmgsIkV2ZW50IHRhcmdldCBpcyBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgY2FsbCB0aGUgc3VwZXJjbGFzcyAoZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpIGNvbnN0cnVjdG9yPyIpfTt2YXIgeGM9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKHkmJiFBKCI1MjUiKSlyZXR1cm4hMDtpZih6JiZlKXJldHVybiB2YyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZigheCl7Im51bWJlciI9PT10eXBlb2YgYiYmKGI9d2MoYikpO3ZhciBnPTE3PT1ifHwxOD09Ynx8eiYmOTE9PWI7aWYoKCFjfHx6KSYmZ3x8eiYmMTY9PWImJihkfHxmKSlyZXR1cm4hMX1pZigoeXx8YmIpJiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1pZih2JiZkJiZiPT1hKXJldHVybiExO3N3aXRjaChhKXtjYXNlIDEzOnJldHVybiB4P2Z8fGU/ITE6IShjJiZkKTohMDtjYXNlIDI3OnJldHVybiEoeXx8YmJ8fHgpfXJldHVybiB4JiYoZHx8ZXx8Zik/ITE6dmMoYSl9LHZjPWZ1bmN0aW9uKGEpe2lmKDQ4PD1hJiY1Nz49YXx8Cjk2PD1hJiYxMDY+PWF8fDY1PD1hJiY5MD49YXx8KHl8fGJiKSYmMD09YSlyZXR1cm4hMDtzd2l0Y2goYSl7Y2FzZSAzMjpjYXNlIDQzOmNhc2UgNjM6Y2FzZSA2NDpjYXNlIDEwNzpjYXNlIDEwOTpjYXNlIDExMDpjYXNlIDExMTpjYXNlIDE4NjpjYXNlIDU5OmNhc2UgMTg5OmNhc2UgMTg3OmNhc2UgNjE6Y2FzZSAxODg6Y2FzZSAxOTA6Y2FzZSAxOTE6Y2FzZSAxOTI6Y2FzZSAyMjI6Y2FzZSAyMTk6Y2FzZSAyMjA6Y2FzZSAyMjE6Y2FzZSAxNjM6Y2FzZSA1ODpyZXR1cm4hMDtjYXNlIDE3MzpyZXR1cm4geDtkZWZhdWx0OnJldHVybiExfX0sd2M9ZnVuY3Rpb24oYSl7aWYoeClhPXljKGEpO2Vsc2UgaWYoeiYmeSlzd2l0Y2goYSl7Y2FzZSA5MzphPTkxfXJldHVybiBhfSx5Yz1mdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSA2MTpyZXR1cm4gMTg3O2Nhc2UgNTk6cmV0dXJuIDE4NjtjYXNlIDE3MzpyZXR1cm4gMTg5O2Nhc2UgMjI0OnJldHVybiA5MTtjYXNlIDA6cmV0dXJuIDIyNDsKZGVmYXVsdDpyZXR1cm4gYX19O3ZhciBKPWZ1bmN0aW9uKGEsYil7SS5jYWxsKHRoaXMpO2EmJnpjKHRoaXMsYSxiKX07bihKLEkpO2g9Si5wcm90b3R5cGU7aC5TPW51bGw7aC5uYT1udWxsO2guQ2E9bnVsbDtoLm9hPW51bGw7aC53PS0xO2guRj0tMTtoLnVhPSExOwp2YXIgQWM9ezM6MTMsMTI6MTQ0LDYzMjMyOjM4LDYzMjMzOjQwLDYzMjM0OjM3LDYzMjM1OjM5LDYzMjM2OjExMiw2MzIzNzoxMTMsNjMyMzg6MTE0LDYzMjM5OjExNSw2MzI0MDoxMTYsNjMyNDE6MTE3LDYzMjQyOjExOCw2MzI0MzoxMTksNjMyNDQ6MTIwLDYzMjQ1OjEyMSw2MzI0NjoxMjIsNjMyNDc6MTIzLDYzMjQ4OjQ0LDYzMjcyOjQ2LDYzMjczOjM2LDYzMjc1OjM1LDYzMjc2OjMzLDYzMjc3OjM0LDYzMjg5OjE0NCw2MzMwMjo0NX0sQmM9e1VwOjM4LERvd246NDAsTGVmdDozNyxSaWdodDozOSxFbnRlcjoxMyxGMToxMTIsRjI6MTEzLEYzOjExNCxGNDoxMTUsRjU6MTE2LEY2OjExNyxGNzoxMTgsRjg6MTE5LEY5OjEyMCxGMTA6MTIxLEYxMToxMjIsRjEyOjEyMywiVSswMDdGIjo0NixIb21lOjM2LEVuZDozNSxQYWdlVXA6MzMsUGFnZURvd246MzQsSW5zZXJ0OjQ1fSxDYz0heXx8QSgiNTI1IiksRGM9eiYmeDsKSi5wcm90b3R5cGUuYT1mdW5jdGlvbihhKXtpZih5fHxiYilpZigxNz09dGhpcy53JiYhYS5jdHJsS2V5fHwxOD09dGhpcy53JiYhYS5hbHRLZXl8fHomJjkxPT10aGlzLncmJiFhLm1ldGFLZXkpdGhpcy5GPXRoaXMudz0tMTstMT09dGhpcy53JiYoYS5jdHJsS2V5JiYxNyE9YS5jP3RoaXMudz0xNzphLmFsdEtleSYmMTghPWEuYz90aGlzLnc9MTg6YS5tZXRhS2V5JiY5MSE9YS5jJiYodGhpcy53PTkxKSk7Q2MmJiF4YyhhLmMsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGEuYWx0S2V5LGEubWV0YUtleSk/dGhpcy5oYW5kbGVFdmVudChhKToodGhpcy5GPXdjKGEuYyksRGMmJih0aGlzLnVhPWEuYWx0S2V5KSl9O0oucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dGhpcy5GPXRoaXMudz0tMTt0aGlzLnVhPWEuYWx0S2V5fTsKSi5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5iLGM9Yi5hbHRLZXk7aWYodiYmImtleXByZXNzIj09YS50eXBlKXt2YXIgZD10aGlzLkY7dmFyIGU9MTMhPWQmJjI3IT1kP2Iua2V5Q29kZTowfWVsc2UoeXx8YmIpJiYia2V5cHJlc3MiPT1hLnR5cGU/KGQ9dGhpcy5GLGU9MDw9Yi5jaGFyQ29kZSYmNjMyMzI+Yi5jaGFyQ29kZSYmdmMoZCk/Yi5jaGFyQ29kZTowKTphYiYmIXk/KGQ9dGhpcy5GLGU9dmMoZCk/Yi5rZXlDb2RlOjApOigia2V5cHJlc3MiPT1hLnR5cGU/KERjJiYoYz10aGlzLnVhKSxiLmtleUNvZGU9PWIuY2hhckNvZGU/MzI+Yi5rZXlDb2RlPyhkPWIua2V5Q29kZSxlPTApOihkPXRoaXMuRixlPWIuY2hhckNvZGUpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkseiYmNjM9PWUmJjIyND09ZCYmKGQ9MTkxKSk7dmFyIGY9ZD13YyhkKTtkPzYzMjMyPD0KZCYmZCBpbiBBYz9mPUFjW2RdOjI1PT1kJiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBCYyYmKGY9QmNbYi5rZXlJZGVudGlmaWVyXSk7eCYmQ2MmJiJrZXlwcmVzcyI9PWEudHlwZSYmIXhjKGYsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KXx8KGE9Zj09dGhpcy53LHRoaXMudz1mLGI9bmV3IEVjKGYsZSxhLGIpLGIuYWx0S2V5PWMsdWModGhpcyxiKSl9O0oucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTsKdmFyIHpjPWZ1bmN0aW9uKGEsYixjKXthLm9hJiZGYyhhKTthLlM9YjthLm5hPWJjKGEuUywia2V5cHJlc3MiLGEsYyk7YS5DYT1iYyhhLlMsImtleWRvd24iLGEuYSxjLGEpO2Eub2E9YmMoYS5TLCJrZXl1cCIsYS5iLGMsYSl9LEZjPWZ1bmN0aW9uKGEpe2EubmEmJihrYyhhLm5hKSxrYyhhLkNhKSxrYyhhLm9hKSxhLm5hPW51bGwsYS5DYT1udWxsLGEub2E9bnVsbCk7YS5TPW51bGw7YS53PS0xO2EuRj0tMX07Si5wcm90b3R5cGUudT1mdW5jdGlvbigpe0ouaS51LmNhbGwodGhpcyk7RmModGhpcyl9O3ZhciBFYz1mdW5jdGlvbihhLGIsYyxkKXtHLmNhbGwodGhpcyxkKTt0aGlzLnR5cGU9ImtleSI7dGhpcy5jPWE7dGhpcy5yZXBlYXQ9Y307bihFYyxHKTt2YXIgR2M9eD8iTW96VXNlclNlbGVjdCI6eXx8YmI/IldlYmtpdFVzZXJTZWxlY3QiOm51bGwsSGM9ZnVuY3Rpb24oYSxiKXtiPWI/bnVsbDphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7aWYoR2Mpe3ZhciBjPSJub25lIjthLnN0eWxlJiYoYS5zdHlsZVtHY109Yyk7aWYoYil7YT0wO2Zvcih2YXIgZDtkPWJbYV07YSsrKWQuc3R5bGUmJihkLnN0eWxlW0djXT1jKX19ZWxzZSBpZih2fHxhYilpZihjPSJvbiIsYS5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyksYilmb3IoYT0wO2Q9YlthXTthKyspZC5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyl9O3ZhciBJYz1mdW5jdGlvbigpe307ZGEoSWMpO0ljLnByb3RvdHlwZS5hPTA7dmFyIEs9ZnVuY3Rpb24oYSl7SS5jYWxsKHRoaXMpO3RoaXMuaj1hfHx4YXx8KHhhPW5ldyB1Yik7dGhpcy5xYT1KYzt0aGlzLlk9bnVsbDt0aGlzLm09ITE7dGhpcy5hPW51bGw7dGhpcy5BPXZvaWQgMDt0aGlzLmc9dGhpcy5jPXRoaXMuYj1udWxsO3RoaXMuR2E9ITF9O24oSyxJKTtLLnByb3RvdHlwZS5PYT1JYy5SKCk7CnZhciBKYz1udWxsLEtjPWZ1bmN0aW9uKGEsYil7c3dpdGNoKGEpe2Nhc2UgMTpyZXR1cm4gYj8iZGlzYWJsZSI6ImVuYWJsZSI7Y2FzZSAyOnJldHVybiBiPyJoaWdobGlnaHQiOiJ1bmhpZ2hsaWdodCI7Y2FzZSA0OnJldHVybiBiPyJhY3RpdmF0ZSI6ImRlYWN0aXZhdGUiO2Nhc2UgODpyZXR1cm4gYj8ic2VsZWN0IjoidW5zZWxlY3QiO2Nhc2UgMTY6cmV0dXJuIGI/ImNoZWNrIjoidW5jaGVjayI7Y2FzZSAzMjpyZXR1cm4gYj8iZm9jdXMiOiJibHVyIjtjYXNlIDY0OnJldHVybiBiPyJvcGVuIjoiY2xvc2UifXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBzdGF0ZSIpO30sTGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuWXx8KGEuWT0iOiIrKGEuT2EuYSsrKS50b1N0cmluZygzNikpfSxNYz1mdW5jdGlvbihhLGIpe2lmKGEuYiYmYS5iLmcpe3ZhciBjPWEuYi5nLGQ9YS5ZO2QgaW4gYyYmZGVsZXRlIGNbZF07cWEoYS5iLmcsYixhKX1hLlk9Yn07Sy5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9Owp2YXIgTmM9ZnVuY3Rpb24oYSl7YT1hLmE7cShhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cmV0dXJuIGF9LE9jPWZ1bmN0aW9uKGEpe2EuQXx8KGEuQT1uZXcgb2MoYSkpO3JldHVybiBxKGEuQSl9O0sucHJvdG90eXBlLnJhPWZ1bmN0aW9uKGEpe2lmKHRoaXMuYiYmdGhpcy5iIT1hKXRocm93IEVycm9yKCJNZXRob2Qgbm90IHN1cHBvcnRlZCIpO0suaS5yYS5jYWxsKHRoaXMsYSl9O0sucHJvdG90eXBlLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPW5iKHRoaXMuai5hLCJESVYiKX07CnZhciBQYz1mdW5jdGlvbihhLGIpe2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiJiZhLnhhKGIpKXthLkdhPSEwO3ZhciBjPXFiKGIpO2EuaiYmYS5qLmE9PWN8fChhLmo9Yj9uZXcgdWIocWIoYikpOnhhfHwoeGE9bmV3IHViKSk7YS52YShiKTthLkQoKX1lbHNlIHRocm93IEVycm9yKCJJbnZhbGlkIGVsZW1lbnQgdG8gZGVjb3JhdGUiKTt9O2g9Sy5wcm90b3R5cGU7aC54YT1mdW5jdGlvbigpe3JldHVybiEwfTtoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hfTtoLkQ9ZnVuY3Rpb24oKXt0aGlzLm09ITA7UWModGhpcyxmdW5jdGlvbihhKXshYS5tJiZhLmYoKSYmYS5EKCl9KX07aC5QPWZ1bmN0aW9uKCl7UWModGhpcyxmdW5jdGlvbihhKXthLm0mJmEuUCgpfSk7dGhpcy5BJiZyYyh0aGlzLkEpO3RoaXMubT0hMX07CmgudT1mdW5jdGlvbigpe3RoaXMubSYmdGhpcy5QKCk7dGhpcy5BJiYodGhpcy5BLk4oKSxkZWxldGUgdGhpcy5BKTtRYyh0aGlzLGZ1bmN0aW9uKGEpe2EuTigpfSk7IXRoaXMuR2EmJnRoaXMuYSYmb2IodGhpcy5hKTt0aGlzLmI9dGhpcy5hPXRoaXMuZz10aGlzLmM9bnVsbDtLLmkudS5jYWxsKHRoaXMpfTtoLnNhPWZ1bmN0aW9uKGEsYil7dGhpcy50YShhLFJjKHRoaXMpLGIpfTsKaC50YT1mdW5jdGlvbihhLGIsYyl7cSghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLm0mJihjfHwhdGhpcy5tKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZigwPmJ8fGI+UmModGhpcykpdGhyb3cgRXJyb3IoIkNoaWxkIGNvbXBvbmVudCBpbmRleCBvdXQgb2YgYm91bmRzIik7dGhpcy5nJiZ0aGlzLmN8fCh0aGlzLmc9e30sdGhpcy5jPVtdKTtpZihhLmI9PXRoaXMpe3ZhciBkPUxjKGEpO3RoaXMuZ1tkXT1hO0hhKHRoaXMuYyxhKX1lbHNlIHFhKHRoaXMuZyxMYyhhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuYiYmYS5ZKXt2YXIgZT1hLmI7ZD1hLlk7ZS5nJiZkPyhlPWUuZyxkPShudWxsIT09ZSYmZCBpbiBlP2VbZF06dm9pZCAwKXx8bnVsbCk6ZD1udWxsfWlmKGQmJmEuYiE9dGhpcyl0aHJvdyBFcnJvcigiVW5hYmxlIHRvIHNldCBwYXJlbnQgY29tcG9uZW50Iik7CmEuYj10aGlzO0suaS5yYS5jYWxsKGEsdGhpcyk7TGEodGhpcy5jLGIsMCxhKTtpZihhLm0mJnRoaXMubSYmYS5iPT10aGlzKWM9dGhpcy5qYSgpLGI9Yy5jaGlsZE5vZGVzW2JdfHxudWxsLGIhPWEuZigpJiZjLmluc2VydEJlZm9yZShhLmYoKSxiKTtlbHNlIGlmKGMpe3RoaXMuYXx8dGhpcy5pYSgpO2M9TCh0aGlzLGIrMSk7Yj10aGlzLmphKCk7Yz1jP2MuYTpudWxsO2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTthLmF8fGEuaWEoKTtiP2IuaW5zZXJ0QmVmb3JlKGEuYSxjfHxudWxsKTphLmouYS5ib2R5LmFwcGVuZENoaWxkKGEuYSk7YS5iJiYhYS5iLm18fGEuRCgpfWVsc2UgdGhpcy5tJiYhYS5tJiZhLmEmJmEuYS5wYXJlbnROb2RlJiYxPT1hLmEucGFyZW50Tm9kZS5ub2RlVHlwZSYmYS5EKCl9O2guamE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hfTsKdmFyIFNjPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEucWEpe3ZhciBiPWEubT9hLmE6YS5qLmEuYm9keTthOnt2YXIgYz1xYihiKTtpZihjLmRlZmF1bHRWaWV3JiZjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihjPWMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpKSl7Yz1jLmRpcmVjdGlvbnx8Yy5nZXRQcm9wZXJ0eVZhbHVlKCJkaXJlY3Rpb24iKXx8IiI7YnJlYWsgYX1jPSIifWEucWE9InJ0bCI9PShjfHwoYi5jdXJyZW50U3R5bGU/Yi5jdXJyZW50U3R5bGUuZGlyZWN0aW9uOm51bGwpfHxiLnN0eWxlJiZiLnN0eWxlLmRpcmVjdGlvbil9cmV0dXJuIGEucWF9LFJjPWZ1bmN0aW9uKGEpe3JldHVybiBhLmM/YS5jLmxlbmd0aDowfSxMPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuYz9hLmNbYl18fG51bGw6bnVsbH0sUWM9ZnVuY3Rpb24oYSxiLGMpe2EuYyYmcihhLmMsYixjKX0sVGM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jJiZiP0RhKGEuYyxiKTotMX07dmFyIFZjPWZ1bmN0aW9uKGEsYil7aWYoIWEpdGhyb3cgRXJyb3IoIkludmFsaWQgY2xhc3MgbmFtZSAiK2EpO2lmKCFpYShiKSl0aHJvdyBFcnJvcigiSW52YWxpZCBkZWNvcmF0b3IgZnVuY3Rpb24gIitiKTtVY1thXT1ifSxXYz17fSxVYz17fTt2YXIgWGM9ZnVuY3Rpb24oYSl7dGhpcy5oPWF9O2RhKFhjKTt2YXIgWWM9ZnVuY3Rpb24oYSxiKXthJiYoYS50YWJJbmRleD1iPzA6LTEpfSwkYz1mdW5jdGlvbihhLGIsYyl7Yy5pZCYmTWMoYixjLmlkKTt2YXIgZD1hLmIoKSxlPSExLGY9RChjKTtmJiZyKGYsZnVuY3Rpb24oZyl7Zz09ZD9lPSEwOmcmJnRoaXMuZyhiLGcsZCl9LGEpO2V8fEViKGMsZCk7WmMoYixjKTtyZXR1cm4gY307WGMucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiLGMpe2I9PWMrIi1kaXNhYmxlZCI/YS5aKCExKTpiPT1jKyItaG9yaXpvbnRhbCI/YWQoYSwiaG9yaXpvbnRhbCIpOmI9PWMrIi12ZXJ0aWNhbCImJmFkKGEsInZlcnRpY2FsIil9Owp2YXIgWmM9ZnVuY3Rpb24oYSxiKXtpZihiKWZvcih2YXIgYz1iLmZpcnN0Q2hpbGQsZDtjJiZjLnBhcmVudE5vZGU9PWI7KXtkPWMubmV4dFNpYmxpbmc7aWYoMT09Yy5ub2RlVHlwZSl7YTp7dmFyIGU9YztxKGUpO2U9RChlKTtmb3IodmFyIGY9MCxnPWUubGVuZ3RoO2Y8ZztmKyspe3ZhciBrPWVbZl07aWYoaz1rIGluIFVjP1VjW2tdKCk6bnVsbCl7ZT1rO2JyZWFrIGF9fWU9bnVsbH1lJiYoZS5hPWMsYS5pc0VuYWJsZWQoKXx8ZS5aKCExKSxhLnNhKGUpLFBjKGUsYykpfWVsc2UgYy5ub2RlVmFsdWUmJiIiIT1NYShjLm5vZGVWYWx1ZSl8fGIucmVtb3ZlQ2hpbGQoYyk7Yz1kfX0sYmQ9ZnVuY3Rpb24oYSxiKXtiPWIuZigpO3EoYiwiVGhlIGNvbnRhaW5lciBET00gZWxlbWVudCBjYW5ub3QgYmUgbnVsbC4iKTtIYyhiLHgpO3YmJihiLmhpZGVGb2N1cz0hMCk7KGE9YS5oKSYmdmIoYixhKX07WGMucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKWGMucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5iKCksYz1bYiwiaG9yaXpvbnRhbCI9PWEuSD9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgTT1mdW5jdGlvbigpe30sY2Q7ZGEoTSk7dmFyIGRkPXtidXR0b246InByZXNzZWQiLGNoZWNrYm94OiJjaGVja2VkIixtZW51aXRlbToic2VsZWN0ZWQiLG1lbnVpdGVtY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtcmFkaW86ImNoZWNrZWQiLHJhZGlvOiJjaGVja2VkIix0YWI6InNlbGVjdGVkIix0cmVlaXRlbToic2VsZWN0ZWQifTtNLnByb3RvdHlwZS5oPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLmouYigiRElWIixlZCh0aGlzLGEpLmpvaW4oIiAiKSxhLmJhKX07dmFyIGdkPWZ1bmN0aW9uKGEsYixjKXtpZihhPWEuZj9hLmYoKTphKXt2YXIgZD1bYl07diYmIUEoIjciKSYmKGQ9ZmQoRChhKSxiKSxkLnB1c2goYikpOyhjP0ZiOkhiKShhLGQpfX07Ck0ucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiKXtiLmlkJiZNYyhhLGIuaWQpO2ImJmIuZmlyc3RDaGlsZD9oZChhLGIuZmlyc3RDaGlsZC5uZXh0U2libGluZz9KYShiLmNoaWxkTm9kZXMpOmIuZmlyc3RDaGlsZCk6YS5iYT1udWxsO3ZhciBjPTAsZD10aGlzLmEoKSxlPXRoaXMuYSgpLGY9ITEsZz0hMSxrPSExLHA9SmEoRChiKSk7cihwLGZ1bmN0aW9uKEIpe2Z8fEIhPWQ/Z3x8QiE9ZT9jfD1pZCh0aGlzLEIpOmc9ITA6KGY9ITAsZT09ZCYmKGc9ITApKTsxPT1pZCh0aGlzLEIpJiYoQWEoYiksc2IoYikmJnRiKGIpJiZyYihiLCExKSl9LHRoaXMpO2Eubz1jO2Z8fChwLnB1c2goZCksZT09ZCYmKGc9ITApKTtnfHxwLnB1c2goZSk7KGE9YS53YSkmJnAucHVzaC5hcHBseShwLGEpO2lmKHYmJiFBKCI3Iikpe3ZhciB3PWZkKHApOzA8dy5sZW5ndGgmJihwLnB1c2guYXBwbHkocCx3KSxrPSEwKX1mJiZnJiYhYSYmIWt8fENiKGIscC5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIGpkPWZ1bmN0aW9uKGEsYil7aWYoYT1hLmgoKSl7cShiLCJUaGUgZWxlbWVudCBwYXNzZWQgYXMgYSBmaXJzdCBwYXJhbWV0ZXIgY2Fubm90IGJlIG51bGwuIik7dmFyIGM9Yi5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDthIT1jJiZ2YihiLGEpfX0sa2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYztpZihhLnYmMzImJihjPWEuZigpKSl7aWYoIWImJmEubyYzMil7dHJ5e2MuYmx1cigpfWNhdGNoKGQpe31hLm8mMzImJmEuRmEobnVsbCl9KHNiKGMpJiZ0YihjKSkhPWImJnJiKGMsYil9fSxsZD1mdW5jdGlvbihhLGIsYyl7Y2R8fChjZD17MToiZGlzYWJsZWQiLDg6InNlbGVjdGVkIiwxNjoiY2hlY2tlZCIsNjQ6ImV4cGFuZGVkIn0pO3EoYSwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO2I9Y2RbYl07dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDtkJiYoZD1kZFtkXXx8YixiPSJjaGVja2VkIj09Ynx8InNlbGVjdGVkIj09CmI/ZDpiKTtiJiZ4YihhLGIsYyl9O00ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250cm9sIn07CnZhciBlZD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuYSgpLGQ9W2NdLGU9YS5hKCk7ZSE9YyYmZC5wdXNoKGUpO2M9Yi5vO2ZvcihlPVtdO2M7KXt2YXIgZj1jJi1jO2UucHVzaChtZChhLGYpKTtjJj1+Zn1kLnB1c2guYXBwbHkoZCxlKTsoYT1iLndhKSYmZC5wdXNoLmFwcGx5KGQsYSk7diYmIUEoIjciKSYmZC5wdXNoLmFwcGx5KGQsZmQoZCkpO3JldHVybiBkfSxmZD1mdW5jdGlvbihhLGIpe3ZhciBjPVtdO2ImJihhPUlhKGEsW2JdKSk7cihbXSxmdW5jdGlvbihkKXshRmEoZCxsYShHYSxhKSl8fGImJiFHYShkLGIpfHxjLnB1c2goZC5qb2luKCJfIikpfSk7cmV0dXJuIGN9LG1kPWZ1bmN0aW9uKGEsYil7YS5ifHxuZChhKTtyZXR1cm4gYS5iW2JdfSxpZD1mdW5jdGlvbihhLGIpe2Euanx8KGEuYnx8bmQoYSksYS5qPXNhKGEuYikpO2E9cGFyc2VJbnQoYS5qW2JdLDEwKTtyZXR1cm4gaXNOYU4oYSk/MDphfSxuZD1mdW5jdGlvbihhKXt2YXIgYj1hLmEoKSxjPSF0KGIucmVwbGFjZSgvXHhhMHxccy9nLAoiICIpLCIgIik7cShjLCJDb250cm9sUmVuZGVyZXIgaGFzIGFuIGludmFsaWQgY3NzIGNsYXNzOiAnIitiKyInIik7YS5iPXsxOmIrIi1kaXNhYmxlZCIsMjpiKyItaG92ZXIiLDQ6YisiLWFjdGl2ZSIsODpiKyItc2VsZWN0ZWQiLDE2OmIrIi1jaGVja2VkIiwzMjpiKyItZm9jdXNlZCIsNjQ6YisiLW9wZW4ifX07dmFyIE49ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO2lmKCFiKXtiPXRoaXMuY29uc3RydWN0b3I7Zm9yKHZhciBkO2I7KXtkPWJbamFdfHwoYltqYV09KytrYSk7aWYoZD1XY1tkXSlicmVhaztiPWIuaT9iLmkuY29uc3RydWN0b3I6bnVsbH1iPWQ/aWEoZC5SKT9kLlIoKTpuZXcgZDpudWxsfXRoaXMuQj1iO3RoaXMuYmE9dm9pZCAwIT09YT9hOm51bGx9O24oTixLKTtoPU4ucHJvdG90eXBlO2guYmE9bnVsbDtoLm89MDtoLnY9Mzk7aC5LPTA7aC5JYT0hMDtoLndhPW51bGw7aC55YT0hMDtoLmlhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CLmModGhpcyk7dGhpcy5hPWE7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmeGIoYSwiaGlkZGVuIiwhMCkpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hPXRoaXMuQi5nKHRoaXMsYSk7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5JYT0ibm9uZSIhPWEuc3R5bGUuZGlzcGxheX07CmguRD1mdW5jdGlvbigpe04uaS5ELmNhbGwodGhpcyk7dmFyIGE9TmModGhpcyk7cSh0aGlzKTtxKGEpO3RoaXMuaXNWaXNpYmxlKCl8fHhiKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fGxkKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy52JjgmJmxkKGEsOCwhISh0aGlzLm8mOCkpO3RoaXMudiYxNiYmbGQoYSwxNiwhISh0aGlzLm8mMTYpKTt0aGlzLnYmNjQmJmxkKGEsNjQsISEodGhpcy5vJjY0KSk7YT10aGlzLkI7U2ModGhpcykmJmdkKHRoaXMuZigpLGEuYSgpKyItcnRsIiwhMCk7dGhpcy5pc0VuYWJsZWQoKSYma2QodGhpcyx0aGlzLmlzVmlzaWJsZSgpKTtpZih0aGlzLnYmLTImJih0aGlzLnlhJiZvZCh0aGlzLCEwKSx0aGlzLnYmMzImJihhPXRoaXMuZigpKSkpe3ZhciBiPXRoaXMuV3x8KHRoaXMuVz1uZXcgSik7emMoYixhKTtIKEgoSChPYyh0aGlzKSxiLCJrZXkiLHRoaXMuZmEpLGEsImZvY3VzIix0aGlzLk5hKSxhLCJibHVyIiwKdGhpcy5GYSl9fTt2YXIgb2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYz1PYyhhKSxkPWEuZigpO2I/KEgoSChIKEgoYyxkLEYuTCxhLmthKSxkLFtGLk0sRi5hYV0sYS5sYSksZCwibW91c2VvdmVyIixhLkFhKSxkLCJtb3VzZW91dCIsYS56YSksYS5lYSE9Y2EmJkgoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fEgoYyxkLCJkYmxjbGljayIsYS5KYSksYS5nYXx8KGEuZ2E9bmV3IHBkKGEpLHpiKGEsbGEoQWIsYS5nYSkpKSkpOihxYyhxYyhxYyhxYyhjLGQsRi5MLGEua2EpLGQsW0YuTSxGLmFhXSxhLmxhKSxkLCJtb3VzZW92ZXIiLGEuQWEpLGQsIm1vdXNlb3V0IixhLnphKSxhLmVhIT1jYSYmcWMoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fHFjKGMsZCwiZGJsY2xpY2siLGEuSmEpLEFiKGEuZ2EpLGEuZ2E9bnVsbCkpfTsKTi5wcm90b3R5cGUuUD1mdW5jdGlvbigpe04uaS5QLmNhbGwodGhpcyk7dGhpcy5XJiZGYyh0aGlzLlcpO3RoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJmtkKHRoaXMsITEpfTtOLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7Ti5pLnUuY2FsbCh0aGlzKTt0aGlzLlcmJih0aGlzLlcuTigpLGRlbGV0ZSB0aGlzLlcpO2RlbGV0ZSB0aGlzLkI7dGhpcy5nYT10aGlzLndhPXRoaXMuYmE9bnVsbH07dmFyIGhkPWZ1bmN0aW9uKGEsYil7YS5iYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm8mMSl9OwpOLnByb3RvdHlwZS5aPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYjtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0VuYWJsZWQmJiFiLmlzRW5hYmxlZCgpfHwhTyh0aGlzLDEsIWEpfHwoYXx8KHFkKHRoaXMsITEpLFAodGhpcywhMSkpLHRoaXMuaXNWaXNpYmxlKCkmJmtkKHRoaXMsYSksUSh0aGlzLDEsIWEsITApKX07CnZhciBQPWZ1bmN0aW9uKGEsYil7TyhhLDIsYikmJlEoYSwyLGIpfSxxZD1mdW5jdGlvbihhLGIpe08oYSw0LGIpJiZRKGEsNCxiKX0scmQ9ZnVuY3Rpb24oYSxiKXtPKGEsOCxiKSYmUShhLDgsYil9LHNkPWZ1bmN0aW9uKGEsYil7TyhhLDY0LGIpJiZRKGEsNjQsYil9LFE9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIWQmJjE9PWIpYS5aKCFjKTtlbHNlIGlmKGEudiZiJiZjIT0hIShhLm8mYikpe3ZhciBlPWEuQjtpZihkPWEuZigpKShlPW1kKGUsYikpJiZnZChhLGUsYyksbGQoZCxiLGMpO2Eubz1jP2Eub3xiOmEubyZ+Yn19LHRkPWZ1bmN0aW9uKGEsYixjKXtpZihhLm0mJmEubyZiJiYhYyl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTshYyYmYS5vJmImJlEoYSxiLCExKTthLnY9Yz9hLnZ8YjphLnYmfmJ9LFI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hISgyNTUmYikmJiEhKGEudiZiKX0sTz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuISEoYS52JmIpJiYhIShhLm8mCmIpIT1jJiYoIShhLksmYil8fHVjKGEsS2MoYixjKSkpJiYhYS5VfTtoPU4ucHJvdG90eXBlO2guQWE9ZnVuY3Rpb24oYSl7KCFhLnJlbGF0ZWRUYXJnZXR8fCFwYih0aGlzLmYoKSxhLnJlbGF0ZWRUYXJnZXQpKSYmdWModGhpcywiZW50ZXIiKSYmdGhpcy5pc0VuYWJsZWQoKSYmUih0aGlzLDIpJiZQKHRoaXMsITApfTtoLnphPWZ1bmN0aW9uKGEpe2EucmVsYXRlZFRhcmdldCYmcGIodGhpcy5mKCksYS5yZWxhdGVkVGFyZ2V0KXx8IXVjKHRoaXMsImxlYXZlIil8fChSKHRoaXMsNCkmJnFkKHRoaXMsITEpLFIodGhpcywyKSYmUCh0aGlzLCExKSl9O2guZWE9Y2E7Cmgua2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSxPYihhKSYmISh5JiZ6JiZhLmN0cmxLZXkpKSl7Uih0aGlzLDQpJiZxZCh0aGlzLCEwKTt2YXIgYjtpZihiPXRoaXMuQil7dmFyIGM7Yj10aGlzLnYmMzImJihjPXRoaXMuZigpKT9zYihjKSYmdGIoYyk6ITF9YiYmdGhpcy5mKCkuZm9jdXMoKX0hT2IoYSl8fHkmJnomJmEuY3RybEtleXx8YS5nKCl9O2gubGE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSx0aGlzLm8mNCYmdWQodGhpcyxhKSYmUih0aGlzLDQpJiZxZCh0aGlzLCExKSl9O2guSmE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmdWQodGhpcyxhKX07CnZhciB1ZD1mdW5jdGlvbihhLGIpe2lmKFIoYSwxNikpe3ZhciBjPSEoYS5vJjE2KTtPKGEsMTYsYykmJlEoYSwxNixjKX1SKGEsOCkmJnJkKGEsITApO1IoYSw2NCkmJnNkKGEsIShhLm8mNjQpKTtjPW5ldyBFKCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuQT1iLkEpO3JldHVybiB1YyhhLGMpfTtOLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe1IodGhpcywzMikmJk8odGhpcywzMiwhMCkmJlEodGhpcywzMiwhMCl9O04ucHJvdG90eXBlLkZhPWZ1bmN0aW9uKCl7Uih0aGlzLDQpJiZxZCh0aGlzLCExKTtSKHRoaXMsMzIpJiZPKHRoaXMsMzIsITEpJiZRKHRoaXMsMzIsITEpfTsKTi5wcm90b3R5cGUuZmE9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJjEzPT1hLmMmJnVkKHRoaXMsYSk/KGEuZygpLGEuaigpLCEwKTohMX07aWYoIWlhKE4pKXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBjbGFzcyAiK04pO2lmKCFpYShNKSl0aHJvdyBFcnJvcigiSW52YWxpZCByZW5kZXJlciBjbGFzcyAiK00pO3ZhciB2ZD1OW2phXXx8KE5bamFdPSsra2EpO1djW3ZkXT1NO1ZjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIHBkPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9ITE7dGhpcy5jPW5ldyBvYyh0aGlzKTt6Yih0aGlzLGxhKEFiLHRoaXMuYykpO2E9TmModGhpcy5iKTtIKEgoSCh0aGlzLmMsYSxGLkwsdGhpcy5oKSxhLEYuTSx0aGlzLmopLGEsImNsaWNrIix0aGlzLmcpfTtuKHBkLEMpO3ZhciB3ZD0hdnx8OTw9TnVtYmVyKGliKTsKcGQucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXt0aGlzLmE9ITF9O3BkLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7dGhpcy5hPSEwfTt2YXIgeGQ9ZnVuY3Rpb24oYSxiKXtpZighd2QpcmV0dXJuIGEuYnV0dG9uPTAsYS50eXBlPWIsYTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudHMiKTtjLmluaXRNb3VzZUV2ZW50KGIsYS5idWJibGVzLGEuY2FuY2VsYWJsZSxhLnZpZXd8fG51bGwsYS5kZXRhaWwsYS5zY3JlZW5YLGEuc2NyZWVuWSxhLmNsaWVudFgsYS5jbGllbnRZLGEuY3RybEtleSxhLmFsdEtleSxhLnNoaWZ0S2V5LGEubWV0YUtleSwwLGEucmVsYXRlZFRhcmdldHx8bnVsbCk7cmV0dXJuIGN9OwpwZC5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXtpZih0aGlzLmEpdGhpcy5hPSExO2Vsc2V7dmFyIGI9YS5iLGM9Yi5idXR0b24sZD1iLnR5cGUsZT14ZChiLCJtb3VzZWRvd24iKTt0aGlzLmIua2EobmV3IEcoZSxhLmEpKTtlPXhkKGIsIm1vdXNldXAiKTt0aGlzLmIubGEobmV3IEcoZSxhLmEpKTt3ZHx8KGIuYnV0dG9uPWMsYi50eXBlPWQpfX07cGQucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt0aGlzLmI9bnVsbDtwZC5pLnUuY2FsbCh0aGlzKX07dmFyIFM9ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO3RoaXMuZGE9Ynx8WGMuUigpO3RoaXMuSD1hfHwidmVydGljYWwifTtuKFMsSyk7aD1TLnByb3RvdHlwZTtoLkRhPW51bGw7aC5jYT1udWxsO2guZGE9bnVsbDtoLkg9bnVsbDtoLlQ9ITA7aC5PPSEwO2gubD0tMTtoLnM9bnVsbDtoLlY9ITE7aC5JPW51bGw7dmFyIHlkPWZ1bmN0aW9uKGEpe3JldHVybiBhLkRhfHxhLmYoKX07aD1TLnByb3RvdHlwZTtoLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPXRoaXMuai5iKCJESVYiLHRoaXMuZGEuYyh0aGlzKS5qb2luKCIgIikpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKGEpe3JldHVybiJESVYiPT1hLnRhZ05hbWV9O2gudmE9ZnVuY3Rpb24oYSl7dGhpcy5hPSRjKHRoaXMuZGEsdGhpcyxhKTsibm9uZSI9PWEuc3R5bGUuZGlzcGxheSYmKHRoaXMuVD0hMSl9OwpoLkQ9ZnVuY3Rpb24oKXtTLmkuRC5jYWxsKHRoaXMpO1FjKHRoaXMsZnVuY3Rpb24oYil7Yi5tJiZ6ZCh0aGlzLGIpfSx0aGlzKTt2YXIgYT10aGlzLmYoKTtiZCh0aGlzLmRhLHRoaXMpO0FkKHRoaXMsdGhpcy5UKTtIKEgoSChIKEgoSChIKEgoT2ModGhpcyksdGhpcywiZW50ZXIiLHRoaXMuV2EpLHRoaXMsImhpZ2hsaWdodCIsdGhpcy5YYSksdGhpcywidW5oaWdobGlnaHQiLHRoaXMuY2IpLHRoaXMsIm9wZW4iLHRoaXMuWWEpLHRoaXMsImNsb3NlIix0aGlzLlVhKSxhLEYuTCx0aGlzLlNhKSxxYihhKSxbRi5NLEYuYWFdLHRoaXMuVmEpLGEsW0YuTCxGLk0sRi5hYSwibW91c2VvdmVyIiwibW91c2VvdXQiLCJjb250ZXh0bWVudSJdLHRoaXMuVGEpO0JkKHRoaXMpfTt2YXIgQmQ9ZnVuY3Rpb24oYSl7dmFyIGI9T2MoYSksYz15ZChhKTtIKEgoSChiLGMsImZvY3VzIixhLkhhKSxjLCJibHVyIixhLlFhKSxhLmNhfHwoYS5jYT1uZXcgSih5ZChhKSkpLCJrZXkiLGEuUmEpfTtoPVMucHJvdG90eXBlOwpoLlA9ZnVuY3Rpb24oKXtDZCh0aGlzLC0xKTt0aGlzLnMmJnNkKHRoaXMucywhMSk7dGhpcy5WPSExO1MuaS5QLmNhbGwodGhpcyl9O2gudT1mdW5jdGlvbigpe1MuaS51LmNhbGwodGhpcyk7dGhpcy5jYSYmKHRoaXMuY2EuTigpLHRoaXMuY2E9bnVsbCk7dGhpcy5kYT10aGlzLnM9dGhpcy5JPXRoaXMuRGE9bnVsbH07aC5XYT1mdW5jdGlvbigpe3JldHVybiEwfTsKaC5YYT1mdW5jdGlvbihhKXt2YXIgYj1UYyh0aGlzLGEudGFyZ2V0KTtpZigtMTxiJiZiIT10aGlzLmwpe3ZhciBjPUwodGhpcyx0aGlzLmwpO2MmJlAoYywhMSk7dGhpcy5sPWI7Yz1MKHRoaXMsdGhpcy5sKTt0aGlzLlYmJnFkKGMsITApO3RoaXMucyYmYyE9dGhpcy5zJiYoYy52JjY0P3NkKGMsITApOnNkKHRoaXMucywhMSkpfWI9dGhpcy5mKCk7cShiLCJUaGUgRE9NIGVsZW1lbnQgZm9yIHRoZSBjb250YWluZXIgY2Fubm90IGJlIG51bGwuIik7bnVsbCE9YS50YXJnZXQuZigpJiZ4YihiLCJhY3RpdmVkZXNjZW5kYW50IixhLnRhcmdldC5mKCkuaWQpfTtoLmNiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT1MKHRoaXMsdGhpcy5sKSYmKHRoaXMubD0tMSk7YT10aGlzLmYoKTtxKGEsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnJlbW92ZUF0dHJpYnV0ZSh3YigiYWN0aXZlZGVzY2VuZGFudCIpKX07CmguWWE9ZnVuY3Rpb24oYSl7KGE9YS50YXJnZXQpJiZhIT10aGlzLnMmJmEuYj09dGhpcyYmKHRoaXMucyYmc2QodGhpcy5zLCExKSx0aGlzLnM9YSl9O2guVWE9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMucyYmKHRoaXMucz1udWxsKTt2YXIgYj10aGlzLmYoKSxjPWEudGFyZ2V0LmYoKTtiJiZhLnRhcmdldC5vJjImJmMmJihhPSIiLGMmJihhPWMuaWQscShhLCJUaGUgYWN0aXZlIGVsZW1lbnQgc2hvdWxkIGhhdmUgYW4gaWQuIikpLHhiKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEpKX07aC5TYT1mdW5jdGlvbihhKXt0aGlzLk8mJih0aGlzLlY9ITApO3ZhciBiPXlkKHRoaXMpO2ImJnNiKGIpJiZ0YihiKT9iLmZvY3VzKCk6YS5nKCl9O2guVmE9ZnVuY3Rpb24oKXt0aGlzLlY9ITF9OwpoLlRhPWZ1bmN0aW9uKGEpe2E6e3ZhciBiPWEudGFyZ2V0O2lmKHRoaXMuSSlmb3IodmFyIGM9dGhpcy5mKCk7YiYmYiE9PWM7KXt2YXIgZD1iLmlkO2lmKGQgaW4gdGhpcy5JKXtiPXRoaXMuSVtkXTticmVhayBhfWI9Yi5wYXJlbnROb2RlfWI9bnVsbH1pZihiKXN3aXRjaChhLnR5cGUpe2Nhc2UgRi5MOmIua2EoYSk7YnJlYWs7Y2FzZSBGLk06Y2FzZSBGLmFhOmIubGEoYSk7YnJlYWs7Y2FzZSAibW91c2VvdmVyIjpiLkFhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3V0IjpiLnphKGEpO2JyZWFrO2Nhc2UgImNvbnRleHRtZW51IjpiLmVhKGEpfX07aC5IYT1mdW5jdGlvbigpe307aC5RYT1mdW5jdGlvbigpe0NkKHRoaXMsLTEpO3RoaXMuVj0hMTt0aGlzLnMmJnNkKHRoaXMucywhMSl9OwpoLlJhPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmlzRW5hYmxlZCgpJiZ0aGlzLmlzVmlzaWJsZSgpJiYoMCE9UmModGhpcyl8fHRoaXMuRGEpJiZEZCh0aGlzLGEpPyhhLmcoKSxhLmooKSwhMCk6ITF9Owp2YXIgRGQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1MKGEsYS5sKTtpZihjJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5mYSYmYy5mYShiKXx8YS5zJiZhLnMhPWMmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLnMuZmEmJmEucy5mYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuYyl7Y2FzZSAyNzp5ZChhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpFZChhKTticmVhaztjYXNlIDM1OkZkKGEpO2JyZWFrO2Nhc2UgMzg6aWYoInZlcnRpY2FsIj09YS5IKUdkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9IZChhKTpHZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoInZlcnRpY2FsIj09YS5IKUhkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9HZChhKTpIZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSx6ZD1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZigpO2M9Yy5pZHx8KGMuaWQ9TGMoYikpO2EuSXx8KGEuST17fSk7YS5JW2NdPWJ9O1MucHJvdG90eXBlLnNhPWZ1bmN0aW9uKGEsYil7Q2EoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtTLmkuc2EuY2FsbCh0aGlzLGEsYil9O1MucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEsYixjKXtDYShhLE4pO2EuS3w9MjthLkt8PTY0O3RkKGEsMzIsITEpO2EubSYmMCE9YS55YSYmb2QoYSwhMSk7YS55YT0hMTt2YXIgZD1hLmI9PXRoaXM/VGModGhpcyxhKTotMTtTLmkudGEuY2FsbCh0aGlzLGEsYixjKTthLm0mJnRoaXMubSYmemQodGhpcyxhKTthPWQ7LTE9PWEmJihhPVJjKHRoaXMpKTthPT10aGlzLmw/dGhpcy5sPU1hdGgubWluKFJjKHRoaXMpLTEsYik6YT50aGlzLmwmJmI8PXRoaXMubD90aGlzLmwrKzphPHRoaXMubCYmYj50aGlzLmwmJnRoaXMubC0tfTsKdmFyIGFkPWZ1bmN0aW9uKGEsYil7aWYoYS5mKCkpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5IPWJ9O1MucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O3ZhciBBZD1mdW5jdGlvbihhLGIpe2EuVD1iO3ZhciBjPWEuZigpO2MmJihjLnN0eWxlLmRpc3BsYXk9Yj8iIjoibm9uZSIsWWMoeWQoYSksYS5PJiZhLlQpKX07Uy5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT307Uy5wcm90b3R5cGUuWj1mdW5jdGlvbihhKXt0aGlzLk8hPWEmJnVjKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5PPSEwLFFjKHRoaXMsZnVuY3Rpb24oYil7Yi5MYT9kZWxldGUgYi5MYTpiLlooITApfSkpOihRYyh0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5aKCExKTpiLkxhPSEwfSksdGhpcy5WPXRoaXMuTz0hMSksWWMoeWQodGhpcyksYSYmdGhpcy5UKSl9Owp2YXIgQ2Q9ZnVuY3Rpb24oYSxiKXsoYj1MKGEsYikpP1AoYiwhMCk6LTE8YS5sJiZQKEwoYSxhLmwpLCExKX0sRWQ9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LFJjKGEpLTEpfSxGZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiAwPmI/Yy0xOmJ9LDApfSxIZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7cmV0dXJuKGIrMSklY30sYS5sKX0sR2Q9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe2ItLTtyZXR1cm4gMD5iP2MtMTpifSxhLmwpfSxJZD1mdW5jdGlvbihhLGIsYyl7Yz0wPmM/VGMoYSxhLnMpOmM7dmFyIGQ9UmMoYSk7Yz1iLmNhbGwoYSxjLGQpO2Zvcih2YXIgZT0wO2U8PWQ7KXt2YXIgZj1MKGEsYyksZztpZihnPWYpZz1mLmlzVmlzaWJsZSgpJiZmLmlzRW5hYmxlZCgpJiYhIShmLnYmMik7aWYoZyl7YS5FYShjKTticmVha31lKys7Yz1iLmNhbGwoYSxjLGQpfX07ClMucHJvdG90eXBlLkVhPWZ1bmN0aW9uKGEpe0NkKHRoaXMsYSl9O3ZhciBUPWZ1bmN0aW9uKCl7fTtuKFQsTSk7ZGEoVCk7VC5wcm90b3R5cGUuYT1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYiJ9O1QucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXtyZXR1cm4idGFiIn07VC5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYj1ULmkuYy5jYWxsKHRoaXMsYSk7KGE9YS5QYSkmJmImJihiLnRpdGxlPWF8fCIiKTtyZXR1cm4gYn07VC5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIpe2I9VC5pLmcuY2FsbCh0aGlzLGEsYik7dmFyIGM9Yi50aXRsZXx8IiI7YyYmKGEuUGE9Yyk7YS5vJjgmJihjPWEuYikmJmlhKGMuRykmJihRKGEsOCwhMSksYy5HKGEpKTtyZXR1cm4gYn07dmFyIEpkPWZ1bmN0aW9uKGEsYixjKXtOLmNhbGwodGhpcyxhLGJ8fFQuUigpLGMpO3RkKHRoaXMsOCwhMCk7dGhpcy5LfD05fTtuKEpkLE4pO1ZjKCJnb29nLXRhYiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEpkKG51bGwpfSk7dmFyIFU9ZnVuY3Rpb24oKXt0aGlzLmg9InRhYmxpc3QifTtuKFUsWGMpO2RhKFUpO1UucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWItYmFyIn07VS5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIsYyl7dGhpcy5qfHwodGhpcy5hfHxLZCh0aGlzKSx0aGlzLmo9c2EodGhpcy5hKSk7dmFyIGQ9dGhpcy5qW2JdO2Q/KGFkKGEsTGQoZCkpLGEuQj1kKTpVLmkuZy5jYWxsKHRoaXMsYSxiLGMpfTtVLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPVUuaS5jLmNhbGwodGhpcyxhKTt0aGlzLmF8fEtkKHRoaXMpO2IucHVzaCh0aGlzLmFbYS5CXSk7cmV0dXJuIGJ9O3ZhciBLZD1mdW5jdGlvbihhKXt2YXIgYj1hLmIoKTthLmE9e3RvcDpiKyItdG9wIixib3R0b206YisiLWJvdHRvbSIsc3RhcnQ6YisiLXN0YXJ0IixlbmQ6YisiLWVuZCJ9fTt2YXIgVj1mdW5jdGlvbihhLGIsYyl7YT1hfHwidG9wIjthZCh0aGlzLExkKGEpKTt0aGlzLkI9YTtTLmNhbGwodGhpcyx0aGlzLkgsYnx8VS5SKCksYyk7TWQodGhpcyl9O24oVixTKTtoPVYucHJvdG90eXBlO2guQz1udWxsO2guRD1mdW5jdGlvbigpe1YuaS5ELmNhbGwodGhpcyk7TWQodGhpcyl9O2gudT1mdW5jdGlvbigpe1YuaS51LmNhbGwodGhpcyk7dGhpcy5DPW51bGx9O2guRWE9ZnVuY3Rpb24oYSl7Vi5pLkVhLmNhbGwodGhpcyxhKTt0aGlzLkcoTCh0aGlzLGEpKX07aC5HPWZ1bmN0aW9uKGEpe2E/cmQoYSwhMCk6dGhpcy5DJiZyZCh0aGlzLkMsITEpfTsKdmFyIE5kPWZ1bmN0aW9uKGEsYil7aWYoYiYmYj09YS5DKXtmb3IodmFyIGM9VGMoYSxiKSxkPWMtMTtiPUwoYSxkKTtkLS0pe3ZhciBlPWI7aWYoZS5pc1Zpc2libGUoKSYmZS5pc0VuYWJsZWQoKSl7YS5HKGIpO3JldHVybn19Zm9yKGMrPTE7Yj1MKGEsYyk7YysrKWlmKGQ9YixkLmlzVmlzaWJsZSgpJiZkLmlzRW5hYmxlZCgpKXthLkcoYik7cmV0dXJufWEuRyhudWxsKX19O2g9Vi5wcm90b3R5cGU7aC5hYj1mdW5jdGlvbihhKXt0aGlzLkMmJnRoaXMuQyE9YS50YXJnZXQmJnJkKHRoaXMuQywhMSk7dGhpcy5DPWEudGFyZ2V0fTtoLmJiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT10aGlzLkMmJih0aGlzLkM9bnVsbCl9O2guWmE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guJGE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guSGE9ZnVuY3Rpb24oKXtMKHRoaXMsdGhpcy5sKXx8Q2QodGhpcyxUYyh0aGlzLHRoaXMuQ3x8TCh0aGlzLDApKSl9Owp2YXIgTWQ9ZnVuY3Rpb24oYSl7SChIKEgoSChPYyhhKSxhLCJzZWxlY3QiLGEuYWIpLGEsInVuc2VsZWN0IixhLmJiKSxhLCJkaXNhYmxlIixhLlphKSxhLCJoaWRlIixhLiRhKX0sTGQ9ZnVuY3Rpb24oYSl7cmV0dXJuInN0YXJ0Ij09YXx8ImVuZCI9PWE/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O1ZjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBWfSk7ZnVuY3Rpb24gT2QoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIFBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgZz1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIrZyk7Zm9yKHZhciBrPVtdLHA9YmEoYyksdz1wLm5leHQoKTshdy5kb25lO3c9cC5uZXh0KCkpe3c9dy52YWx1ZTt2YXIgQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKQi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO0IudGV4dENvbnRlbnQ9dztmLmFwcGVuZENoaWxkKEIpO2sucHVzaChCKX0iYm90dG9tIiE9ZyYmZS5hcHBlbmRDaGlsZChmKTtwPW51bGw7aWYoInRvcCI9PWd8fCJib3R0b20iPT1nKXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTsidG9wIj09ZyYmcCYmZS5hcHBlbmRDaGlsZChwKTtCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0IuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciByYT1bXTtjPWJhKGMpO2Zvcih3PWMubmV4dCgpOyF3LmRvbmU7dz1jLm5leHQoKSl3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHcuaWQ9ZS5pZCsiX2NvbnRlbnRfIityYS5sZW5ndGgsdy5zdHlsZS5kaXNwbGF5PSJub25lIixCLmFwcGVuZENoaWxkKHcpLHJhLnB1c2godyk7ZS5hcHBlbmRDaGlsZChCKTsiYm90dG9tIj09ZyYmKHAmJgplLmFwcGVuZENoaWxkKHApLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBYPW5ldyBWKGcpO1BjKFgsZik7dmFyIFk9LTE7ZGMoWCwic2VsZWN0IixmdW5jdGlvbihaKXtaPWsuaW5kZXhPZihaLnRhcmdldC5mKCkpO1ohPVkmJigwPD1ZJiZZPHJhLmxlbmd0aCYmKHJhW1ldLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFk9LTEpLDA8PVomJlo8cmEubGVuZ3RoJiYoWT1aLHJhW1ldLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksWC5HKEwoWCxZKSkpfSk7WC5HKEwoWCxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFope1guRyhMKFgsWikpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChPZChhKSl9LFFkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sVz1sOwpRZFswXWluIFd8fCJ1bmRlZmluZWQiPT10eXBlb2YgVy5leGVjU2NyaXB0fHxXLmV4ZWNTY3JpcHQoInZhciAiK1FkWzBdKTtmb3IodmFyIFJkO1FkLmxlbmd0aCYmKFJkPVFkLnNoaWZ0KCkpOylRZC5sZW5ndGh8fHZvaWQgMD09PVBkP1dbUmRdJiZXW1JkXSE9PU9iamVjdC5wcm90b3R5cGVbUmRdP1c9V1tSZF06Vz1XW1JkXT17fTpXW1JkXT1QZDt9KS5jYWxsKHRoaXMpOwovLyBjbGFuZy1mb3JtYXQgb24K", + "headers": [ + [ + "content-type", + "application/javascript" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + } + } + }, + "executionInfo": { + "elapsed": 1861, + "status": "ok", + "timestamp": 1600709731732, + "user": { + "displayName": "Evgeny Skvortsov", + "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhiQjODaOVLfYnUuWS9rB3LRntzJDM0hqElzsUkdQ=s64", + "userId": "11510585406840398626" + }, + "user_tz": 420 + }, + "id": "4w444SJlMLm5", + "outputId": "a5e05b9f-f227-4e31-d175-d51dbaa9b6dc" + }, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id59" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id59" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id59" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"d7f6b90e-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id59\", \"tabNames\": [\"AnonymizedStas\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_ef76275580" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id59" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"d7f7053a-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id59\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_8c8787c00a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id59" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"d7f8610a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_d5d19b8af3" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_1", + "outputarea_id59" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"d7f8b056-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id59_content_1\");\n", + "//# sourceURL=js_a6e2c87fd2" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_1", + "outputarea_id59" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"d7f8eeae-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"d7f8b056-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_cfd46f7ab7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_1", + "outputarea_id59" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"d7f93b3e-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id59\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_6c93bb39ff" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_1", + "outputarea_id59" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running AnonymizedStas\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"d7fdaf34-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"d7f8610a-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_3ea88f0183" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_1", + "outputarea_id59" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"d8005da6-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_33ee4af935" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_0", + "outputarea_id59" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"d800c0fc-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id59_content_0\");\n", + "//# sourceURL=js_65100dac52" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_0", + "outputarea_id59" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"d8011b38-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"d800c0fc-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_97a910daea" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_0", + "outputarea_id59" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"d80160d4-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id59\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_848b817ac5" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_0", + "outputarea_id59" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_0", + "outputarea_id59", + "outputarea_id60", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_0", + "outputarea_id59", + "outputarea_id60", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_0", + "outputarea_id59", + "outputarea_id60", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"d8039b4c-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id60\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_ceb4b122f3" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_0", + "outputarea_id59", + "outputarea_id60", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"d803e00c-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id60\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_839d30b6cc" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_0", + "outputarea_id59", + "outputarea_id60", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"d805ece4-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_09f0f3e2a1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_0", + "id60_content_0", + "outputarea_id59", + "outputarea_id60", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"d806fd3c-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id60_content_0\");\n", + "//# sourceURL=js_6a2495d986" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_0", + "id60_content_0", + "outputarea_id59", + "outputarea_id60", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"d80769fc-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"d806fd3c-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_51814e4132" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_0", + "id60_content_0", + "outputarea_id59", + "outputarea_id60", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"d807e328-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id60\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_0ebd6be866" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_0", + "id60_content_0", + "outputarea_id59", + "outputarea_id60", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mAnonymizedStas_sql\u001b[0m variable.\n", + "WITH t_0_AnonymizedCodeContribution AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " [110, 220, 405] AS cl_lengths,\n", + " \"ads\" AS org\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " [30, 51, 95] AS cl_lengths,\n", + " \"ads\" AS org\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " [10, 20, 1000] AS cl_lengths,\n", + " \"games\" AS org\n", + " \n", + ") )\n", + "SELECT\n", + " (SELECT\n", + " ARRAY_AGG(CASE WHEN (x_6 < 50) THEN \"S\" WHEN (x_6 < 100) THEN \"M\" WHEN (x_6 < 500) THEN \"L\" ELSE \"XL\" END) AS logica_value\n", + "FROM\n", + " UNNEST(AnonymizedCodeContribution.cl_lengths) as x_6) AS cl_sizes,\n", + " (SELECT\n", + " MAX(x_10) AS logica_value\n", + "FROM\n", + " UNNEST(AnonymizedCodeContribution.cl_lengths) as x_10) AS largest_cl\n", + "FROM\n", + " t_0_AnonymizedCodeContribution AS AnonymizedCodeContribution;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"d8092544-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"d805ece4-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_394fab3295" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_0", + "id60_content_0", + "outputarea_id59", + "outputarea_id60", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"d80a854c-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"d8005da6-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_c5227cb224" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_0", + "outputarea_id59" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"d80c413e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b628ea4bc5" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_1", + "outputarea_id59" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"d80c9288-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id59_content_1\");\n", + "//# sourceURL=js_c3ac634476" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_1", + "outputarea_id59" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"d80cdd92-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"d80c9288-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_74e1057e4a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_1", + "outputarea_id59" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"d80d5042-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id59\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_cb3f2e94c7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_1", + "outputarea_id59" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"d8ca7ab4-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"d80c413e-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_a2c5c3ddf2" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_1", + "outputarea_id59" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"d8cdd592-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_d79d02f5e8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_0", + "outputarea_id59" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"d8ce5e54-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id59_content_0\");\n", + "//# sourceURL=js_41b3060f30" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_0", + "outputarea_id59" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"d8cee518-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"d8ce5e54-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_1811116294" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_0", + "outputarea_id59" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"d8cf6ccc-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id59\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_f81cd940a2" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_0", + "outputarea_id59" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"d8d18ffc-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_ee690827a1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_0", + "id60_content_1", + "outputarea_id59", + "outputarea_id60", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"d8d1f5c8-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id60_content_1\");\n", + "//# sourceURL=js_8dfb3b9622" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_0", + "id60_content_1", + "outputarea_id59", + "outputarea_id60", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"d8d2433e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"d8d1f5c8-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_c35a7b38be" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_0", + "id60_content_1", + "outputarea_id59", + "outputarea_id60", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"d8d29c8a-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id60\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_e6a4dab4cd" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_0", + "id60_content_1", + "outputarea_id59", + "outputarea_id60", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mAnonymizedStas\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cl_sizeslargest_cl
0[L, L, L]405
1[S, M, M]95
2[S, S, XL]1000
\n", + "
" + ], + "text/plain": [ + " cl_sizes largest_cl\n", + "0 [L, L, L] 405\n", + "1 [S, M, M] 95\n", + "2 [S, S, XL] 1000" + ] + }, + "metadata": { + "tags": [ + "id59_content_0", + "id60_content_1", + "outputarea_id59", + "outputarea_id60", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"d8d70874-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"d8d18ffc-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_547991ad3e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_0", + "id60_content_1", + "outputarea_id59", + "outputarea_id60", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"d8d94a12-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"d8cdd592-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_01c75feb5d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id59_content_0", + "outputarea_id59" + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "%%logica AnonymizedStas\n", + "\n", + "AnonymizedCodeContribution(cl_lengths: [110, 220, 405], org: \"ads\");\n", + "AnonymizedCodeContribution(cl_lengths: [30, 51, 95], org: \"ads\");\n", + "AnonymizedCodeContribution(cl_lengths: [10, 20, 1000], org: \"games\");\n", + "\n", + "ClSize(l) = (\n", + " if l < 50 then\n", + " \"S\"\n", + " else if l < 100 then\n", + " \"M\"\n", + " else if l < 500 then\n", + " \"L\"\n", + " else \"XL\"\n", + ");\n", + "\n", + "AnonymizedStas(cl_sizes:, largest_cl:) :-\n", + " cl_sizes List= (ClSize(l) :- l in cl_lengths),\n", + " largest_cl Max= (l :- l in cl_lengths),\n", + " AnonymizedCodeContribution(cl_lengths:);\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "XjZr5xAZfs_d" + }, + "source": [ + "#### Custom aggregation functions\n", + "\n", + "You can naturally define a custom aggregation as a function of a single positional argument.\n", + "Here is an example of defining a harmonic mean aggregation." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 208, + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH0=", + "headers": [ + [ + "content-type", + "text/css" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgaCxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9ZnVuY3Rpb24oYSl7dmFyIGI9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmYVtTeW1ib2wuaXRlcmF0b3JdO3JldHVybiBiP2IuY2FsbChhKTp7bmV4dDphYShhKX19LGw9dGhpc3x8c2VsZixjYT1mdW5jdGlvbigpe30sZGE9ZnVuY3Rpb24oYSl7YS5CYT12b2lkIDA7YS5SPWZ1bmN0aW9uKCl7cmV0dXJuIGEuQmE/YS5CYTphLkJhPW5ldyBhfX0sZWE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7aWYoIm9iamVjdCI9PWIpaWYoYSl7aWYoYSBpbnN0YW5jZW9mIEFycmF5KXJldHVybiJhcnJheSI7aWYoYSBpbnN0YW5jZW9mIE9iamVjdClyZXR1cm4gYjt2YXIgYz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk7aWYoIltvYmplY3QgV2luZG93XSI9PWMpcmV0dXJuIm9iamVjdCI7CmlmKCJbb2JqZWN0IEFycmF5XSI9PWN8fCJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGgmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5zcGxpY2UmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoInNwbGljZSIpKXJldHVybiJhcnJheSI7aWYoIltvYmplY3QgRnVuY3Rpb25dIj09Y3x8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmNhbGwmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoImNhbGwiKSlyZXR1cm4iZnVuY3Rpb24ifWVsc2UgcmV0dXJuIm51bGwiO2Vsc2UgaWYoImZ1bmN0aW9uIj09YiYmInVuZGVmaW5lZCI9PXR5cGVvZiBhLmNhbGwpcmV0dXJuIm9iamVjdCI7cmV0dXJuIGJ9LGZhPWZ1bmN0aW9uKGEpe3JldHVybiJhcnJheSI9PWVhKGEpfSxoYT1mdW5jdGlvbihhKXt2YXIgYj1lYShhKTtyZXR1cm4iYXJyYXkiPT1ifHwib2JqZWN0Ij09CmImJiJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGh9LGlhPWZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PWVhKGEpfSxtPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBhO3JldHVybiJvYmplY3QiPT1iJiZudWxsIT1hfHwiZnVuY3Rpb24iPT1ifSxqYT0iY2xvc3VyZV91aWRfIisoMUU5Kk1hdGgucmFuZG9tKCk+Pj4wKSxrYT0wLGxhPWZ1bmN0aW9uKGEsYil7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe3ZhciBkPWMuc2xpY2UoKTtkLnB1c2guYXBwbHkoZCxhcmd1bWVudHMpO3JldHVybiBhLmFwcGx5KHRoaXMsZCl9fSxuPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe31jLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLmk9Yi5wcm90b3R5cGU7YS5wcm90b3R5cGU9bmV3IGM7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YX07dmFyIG1hLG5hPXtlYjoiYWN0aXZlZGVzY2VuZGFudCIsamI6ImF0b21pYyIsa2I6ImF1dG9jb21wbGV0ZSIsbWI6ImJ1c3kiLHBiOiJjaGVja2VkIixxYjoiY29saW5kZXgiLHZiOiJjb250cm9scyIseGI6ImRlc2NyaWJlZGJ5IixBYjoiZGlzYWJsZWQiLENiOiJkcm9wZWZmZWN0IixEYjoiZXhwYW5kZWQiLEViOiJmbG93dG8iLEdiOiJncmFiYmVkIixLYjoiaGFzcG9wdXAiLE1iOiJoaWRkZW4iLE9iOiJpbnZhbGlkIixQYjoibGFiZWwiLFFiOiJsYWJlbGxlZGJ5IixSYjoibGV2ZWwiLFdiOiJsaXZlIixrYzoibXVsdGlsaW5lIixsYzoibXVsdGlzZWxlY3RhYmxlIixwYzoib3JpZW50YXRpb24iLHFjOiJvd25zIixyYzoicG9zaW5zZXQiLHRjOiJwcmVzc2VkIix4YzoicmVhZG9ubHkiLHpjOiJyZWxldmFudCIsQWM6InJlcXVpcmVkIixFYzoicm93aW5kZXgiLEhjOiJzZWxlY3RlZCIsSmM6InNldHNpemUiLExjOiJzb3J0IixaYzoidmFsdWVtYXgiLCRjOiJ2YWx1ZW1pbiIsYWQ6InZhbHVlbm93IiwKYmQ6InZhbHVldGV4dCJ9O3ZhciBvYT1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkIGluIGEpYi5jYWxsKGMsYVtkXSxkLGEpfSxwYT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyBpbiBhKWlmKGFbY109PWIpcmV0dXJuITA7cmV0dXJuITF9LHFhPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsIT09YSYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfSxzYT1mdW5jdGlvbihhKXt2YXIgYj17fSxjO2ZvcihjIGluIGEpYlthW2NdXT1jO3JldHVybiBifSx0YT0iY29uc3RydWN0b3IgaGFzT3duUHJvcGVydHkgaXNQcm90b3R5cGVPZiBwcm9wZXJ0eUlzRW51bWVyYWJsZSB0b0xvY2FsZVN0cmluZyB0b1N0cmluZyB2YWx1ZU9mIi5zcGxpdCgiICIpLHVhPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8dGEubGVuZ3RoO2YrKyljPQp0YVtmXSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZCxjKSYmKGFbY109ZFtjXSl9fTt2YXIgdmE9e2ZiOiJhbGVydCIsZ2I6ImFsZXJ0ZGlhbG9nIixoYjoiYXBwbGljYXRpb24iLGliOiJhcnRpY2xlIixsYjoiYmFubmVyIixuYjoiYnV0dG9uIixvYjoiY2hlY2tib3giLHJiOiJjb2x1bW5oZWFkZXIiLHNiOiJjb21ib2JveCIsdGI6ImNvbXBsZW1lbnRhcnkiLHViOiJjb250ZW50aW5mbyIsd2I6ImRlZmluaXRpb24iLHliOiJkaWFsb2ciLHpiOiJkaXJlY3RvcnkiLEJiOiJkb2N1bWVudCIsRmI6ImZvcm0iLEhiOiJncmlkIixJYjoiZ3JpZGNlbGwiLEpiOiJncm91cCIsTGI6ImhlYWRpbmciLE5iOiJpbWciLFNiOiJsaW5rIixUYjoibGlzdCIsVWI6Imxpc3Rib3giLFZiOiJsaXN0aXRlbSIsWGI6ImxvZyIsWWI6Im1haW4iLFpiOiJtYXJxdWVlIiwkYjoibWF0aCIsYWM6Im1lbnUiLGJjOiJtZW51YmFyIixjYzoibWVudWl0ZW0iLGRjOiJtZW51aXRlbWNoZWNrYm94IixlYzoibWVudWl0ZW1yYWRpbyIsbWM6Im5hdmlnYXRpb24iLG5jOiJub3RlIixvYzoib3B0aW9uIiwKc2M6InByZXNlbnRhdGlvbiIsdWM6InByb2dyZXNzYmFyIix2YzoicmFkaW8iLHdjOiJyYWRpb2dyb3VwIix5YzoicmVnaW9uIixCYzoicm93IixDYzoicm93Z3JvdXAiLERjOiJyb3doZWFkZXIiLEZjOiJzY3JvbGxiYXIiLEdjOiJzZWFyY2giLEljOiJzZXBhcmF0b3IiLEtjOiJzbGlkZXIiLE1jOiJzcGluYnV0dG9uIixOYzoic3RhdHVzIixPYzoidGFiIixQYzoidGFibGlzdCIsUWM6InRhYnBhbmVsIixSYzoidGV4dGJveCIsU2M6InRleHRpbmZvIixUYzoidGltZXIiLFVjOiJ0b29sYmFyIixWYzoidG9vbHRpcCIsV2M6InRyZWUiLFhjOiJ0cmVlZ3JpZCIsWWM6InRyZWVpdGVtIn07dmFyIHdhPWZ1bmN0aW9uKGEpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsd2EpO2Vsc2V7dmFyIGI9RXJyb3IoKS5zdGFjaztiJiYodGhpcy5zdGFjaz1iKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSl9O24od2EsRXJyb3IpO3dhLnByb3RvdHlwZS5uYW1lPSJDdXN0b21FcnJvciI7dmFyIHhhO3ZhciB5YT1mdW5jdGlvbihhLGIpe2E9YS5zcGxpdCgiJXMiKTtmb3IodmFyIGM9IiIsZD1hLmxlbmd0aC0xLGU9MDtlPGQ7ZSsrKWMrPWFbZV0rKGU8Yi5sZW5ndGg/YltlXToiJXMiKTt3YS5jYWxsKHRoaXMsYythW2RdKX07bih5YSx3YSk7eWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjsKdmFyIHphPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSJBc3NlcnRpb24gZmFpbGVkIjtpZihjKXtlKz0iOiAiK2M7dmFyIGY9ZH1lbHNlIGEmJihlKz0iOiAiK2EsZj1iKTt0aHJvdyBuZXcgeWEoIiIrZSxmfHxbXSk7fSxxPWZ1bmN0aW9uKGEsYixjKXthfHx6YSgiIixudWxsLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX0sQWE9ZnVuY3Rpb24oYSxiLGMpe20oYSkmJjE9PWEubm9kZVR5cGV8fHphKCJFeHBlY3RlZCBFbGVtZW50IGJ1dCBnb3QgJXM6ICVzLiIsW2VhKGEpLGFdLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKX0sQ2E9ZnVuY3Rpb24oYSxiLGMsZCl7YSBpbnN0YW5jZW9mIGJ8fHphKCJFeHBlY3RlZCBpbnN0YW5jZW9mICVzIGJ1dCBnb3QgJXMuIixbQmEoYiksQmEoYSldLGMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpKX0sQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZgpGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTpudWxsPT09YT8ibnVsbCI6dHlwZW9mIGF9O3ZhciBEYT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3EobnVsbCE9YS5sZW5ndGgpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKCJzdHJpbmciPT09dHlwZW9mIGEpcmV0dXJuInN0cmluZyIhPT10eXBlb2YgYnx8MSE9Yi5sZW5ndGg/LTE6YS5pbmRleE9mKGIsMCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspaWYoYyBpbiBhJiZhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX0scj1BcnJheS5wcm90b3R5cGUuZm9yRWFjaD9mdW5jdGlvbihhLGIsYyl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsYyl9OmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9YS5sZW5ndGgsZT0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZj0wO2Y8ZDtmKyspZiBpbiBlJiZiLmNhbGwoYyxlW2ZdLGYsYSl9LEVhPUFycmF5LnByb3RvdHlwZS5maWx0ZXI/CmZ1bmN0aW9uKGEsYil7cShudWxsIT1hLmxlbmd0aCk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD1bXSxlPTAsZj0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZz0wO2c8YztnKyspaWYoZyBpbiBmKXt2YXIgaz1mW2ddO2IuY2FsbCh2b2lkIDAsayxnLGEpJiYoZFtlKytdPWspfXJldHVybiBkfSxGYT1BcnJheS5wcm90b3R5cGUuZXZlcnk/ZnVuY3Rpb24oYSxiKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmV2ZXJ5LmNhbGwoYSxiLHZvaWQgMCl9OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWEubGVuZ3RoLGQ9InN0cmluZyI9PT10eXBlb2YgYT9hLnNwbGl0KCIiKTphLGU9MDtlPGM7ZSsrKWlmKGUgaW4gZCYmIWIuY2FsbCh2b2lkIDAsZFtlXSxlLGEpKXJldHVybiExO3JldHVybiEwfSxHYT1mdW5jdGlvbihhLGIpe3JldHVybiAwPD0KRGEoYSxiKX0sSGE9ZnVuY3Rpb24oYSxiKXtiPURhKGEsYik7dmFyIGM7aWYoYz0wPD1iKXEobnVsbCE9YS5sZW5ndGgpLEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhLGIsMSk7cmV0dXJuIGN9LElhPWZ1bmN0aW9uKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGFyZ3VtZW50cyl9LEphPWZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDA8Yil7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX0sTGE9ZnVuY3Rpb24oYSxiLGMsZCl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShhLEthKGFyZ3VtZW50cywxKSl9LEthPWZ1bmN0aW9uKGEsYixjKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gMj49YXJndW1lbnRzLmxlbmd0aD9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsYixjKX07dmFyIE1hPVN0cmluZy5wcm90b3R5cGUudHJpbT9mdW5jdGlvbihhKXtyZXR1cm4gYS50cmltKCl9OmZ1bmN0aW9uKGEpe3JldHVybi9eW1xzXHhhMF0qKFtcc1xTXSo/KVtcc1x4YTBdKiQvLmV4ZWMoYSlbMV19LE5hPS8mL2csT2E9LzwvZyxQYT0vPi9nLFFhPS8iL2csUmE9LycvZyxTYT0vXHgwMC9nLFRhPS9bXHgwMCY8PiInXS8sdD1mdW5jdGlvbihhLGIpe3JldHVybi0xIT1hLmluZGV4T2YoYil9LFVhPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE8Yj8tMTphPmI/MTowfTt2YXIgdTthOnt2YXIgVmE9bC5uYXZpZ2F0b3I7aWYoVmEpe3ZhciBXYT1WYS51c2VyQWdlbnQ7aWYoV2Epe3U9V2E7YnJlYWsgYX19dT0iIn07LyoKCiBDb3B5cmlnaHQgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzLgogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKKi8KdmFyIFhhPWZ1bmN0aW9uKGEpe1RhLnRlc3QoYSkmJigtMSE9YS5pbmRleE9mKCImIikmJihhPWEucmVwbGFjZShOYSwiJmFtcDsiKSksLTEhPWEuaW5kZXhPZigiPCIpJiYoYT1hLnJlcGxhY2UoT2EsIiZsdDsiKSksLTEhPWEuaW5kZXhPZigiPiIpJiYoYT1hLnJlcGxhY2UoUGEsIiZndDsiKSksLTEhPWEuaW5kZXhPZignIicpJiYoYT1hLnJlcGxhY2UoUWEsIiZxdW90OyIpKSwtMSE9YS5pbmRleE9mKCInIikmJihhPWEucmVwbGFjZShSYSwiJiMzOTsiKSksLTEhPWEuaW5kZXhPZigiXHgwMCIpJiYoYT1hLnJlcGxhY2UoU2EsIiYjMDsiKSkpO3JldHVybiBhfTt2YXIgWWE9ZnVuY3Rpb24oYSl7WWFbIiAiXShhKTtyZXR1cm4gYX07WWFbIiAiXT1jYTt2YXIgJGE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1aYTtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsYSk/Y1thXTpjW2FdPWIoYSl9O3ZhciBhYj10KHUsIk9wZXJhIiksdj10KHUsIlRyaWRlbnQiKXx8dCh1LCJNU0lFIiksYmI9dCh1LCJFZGdlIikseD10KHUsIkdlY2tvIikmJiEodCh1LnRvTG93ZXJDYXNlKCksIndlYmtpdCIpJiYhdCh1LCJFZGdlIikpJiYhKHQodSwiVHJpZGVudCIpfHx0KHUsIk1TSUUiKSkmJiF0KHUsIkVkZ2UiKSx5PXQodS50b0xvd2VyQ2FzZSgpLCJ3ZWJraXQiKSYmIXQodSwiRWRnZSIpLHo9dCh1LCJNYWNpbnRvc2giKSxjYj1mdW5jdGlvbigpe3ZhciBhPWwuZG9jdW1lbnQ7cmV0dXJuIGE/YS5kb2N1bWVudE1vZGU6dm9pZCAwfSxkYjsKYTp7dmFyIGViPSIiLGZiPWZ1bmN0aW9uKCl7dmFyIGE9dTtpZih4KXJldHVybi9ydjooW15cKTtdKykoXCl8OykvLmV4ZWMoYSk7aWYoYmIpcmV0dXJuL0VkZ2VcLyhbXGRcLl0rKS8uZXhlYyhhKTtpZih2KXJldHVybi9cYig/Ok1TSUV8cnYpWzogXShbXlwpO10rKShcKXw7KS8uZXhlYyhhKTtpZih5KXJldHVybi9XZWJLaXRcLyhcUyspLy5leGVjKGEpO2lmKGFiKXJldHVybi8oPzpWZXJzaW9uKVsgXC9dPyhcUyspLy5leGVjKGEpfSgpO2ZiJiYoZWI9ZmI/ZmJbMV06IiIpO2lmKHYpe3ZhciBnYj1jYigpO2lmKG51bGwhPWdiJiZnYj5wYXJzZUZsb2F0KGViKSl7ZGI9U3RyaW5nKGdiKTticmVhayBhfX1kYj1lYn0KdmFyIGhiPWRiLFphPXt9LEE9ZnVuY3Rpb24oYSl7cmV0dXJuICRhKGEsZnVuY3Rpb24oKXtmb3IodmFyIGI9MCxjPU1hKFN0cmluZyhoYikpLnNwbGl0KCIuIiksZD1NYShTdHJpbmcoYSkpLnNwbGl0KCIuIiksZT1NYXRoLm1heChjLmxlbmd0aCxkLmxlbmd0aCksZj0wOzA9PWImJmY8ZTtmKyspe3ZhciBnPWNbZl18fCIiLGs9ZFtmXXx8IiI7ZG97Zz0vKFxkKikoXEQqKSguKikvLmV4ZWMoZyl8fFsiIiwiIiwiIiwiIl07az0vKFxkKikoXEQqKSguKikvLmV4ZWMoayl8fFsiIiwiIiwiIiwiIl07aWYoMD09Z1swXS5sZW5ndGgmJjA9PWtbMF0ubGVuZ3RoKWJyZWFrO2I9VWEoMD09Z1sxXS5sZW5ndGg/MDpwYXJzZUludChnWzFdLDEwKSwwPT1rWzFdLmxlbmd0aD8wOnBhcnNlSW50KGtbMV0sMTApKXx8VWEoMD09Z1syXS5sZW5ndGgsMD09a1syXS5sZW5ndGgpfHxVYShnWzJdLGtbMl0pO2c9Z1szXTtrPWtbM119d2hpbGUoMD09Yil9cmV0dXJuIDA8PWJ9KX0saWI7CmliPWwuZG9jdW1lbnQmJnY/Y2IoKTp2b2lkIDA7dmFyIGpiPSF2fHw5PD1OdW1iZXIoaWIpO3ZhciBsYj1mdW5jdGlvbihhLGIpe29hKGIsZnVuY3Rpb24oYyxkKXtjJiYib2JqZWN0Ij09dHlwZW9mIGMmJmMuZGQmJihjPWMuY2QoKSk7InN0eWxlIj09ZD9hLnN0eWxlLmNzc1RleHQ9YzoiY2xhc3MiPT1kP2EuY2xhc3NOYW1lPWM6ImZvciI9PWQ/YS5odG1sRm9yPWM6a2IuaGFzT3duUHJvcGVydHkoZCk/YS5zZXRBdHRyaWJ1dGUoa2JbZF0sYyk6MD09ZC5sYXN0SW5kZXhPZigiYXJpYS0iLDApfHwwPT1kLmxhc3RJbmRleE9mKCJkYXRhLSIsMCk/YS5zZXRBdHRyaWJ1dGUoZCxjKTphW2RdPWN9KX0sa2I9e2NlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjb2xzcGFuOiJjb2xTcGFuIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGhlaWdodDoiaGVpZ2h0IixtYXhsZW5ndGg6Im1heExlbmd0aCIsbm9uY2U6Im5vbmNlIixyb2xlOiJyb2xlIixyb3dzcGFuOiJyb3dTcGFuIix0eXBlOiJ0eXBlIix1c2VtYXA6InVzZU1hcCIsdmFsaWduOiJ2QWxpZ24iLAp3aWR0aDoid2lkdGgifSxtYj1mdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChrKXtrJiZiLmFwcGVuZENoaWxkKCJzdHJpbmciPT09dHlwZW9mIGs/YS5jcmVhdGVUZXh0Tm9kZShrKTprKX1mb3IodmFyIGU9MjtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXTtpZighaGEoZil8fG0oZikmJjA8Zi5ub2RlVHlwZSlkKGYpO2Vsc2V7YTp7aWYoZiYmIm51bWJlciI9PXR5cGVvZiBmLmxlbmd0aCl7aWYobShmKSl7dmFyIGc9ImZ1bmN0aW9uIj09dHlwZW9mIGYuaXRlbXx8InN0cmluZyI9PXR5cGVvZiBmLml0ZW07YnJlYWsgYX1pZihpYShmKSl7Zz0iZnVuY3Rpb24iPT10eXBlb2YgZi5pdGVtO2JyZWFrIGF9fWc9ITF9cihnP0phKGYpOmYsZCl9fX0sbmI9ZnVuY3Rpb24oYSxiKXtiPVN0cmluZyhiKTsiYXBwbGljYXRpb24veGh0bWwreG1sIj09PWEuY29udGVudFR5cGUmJihiPWIudG9Mb3dlckNhc2UoKSk7cmV0dXJuIGEuY3JlYXRlRWxlbWVudChiKX0sb2I9ZnVuY3Rpb24oYSl7YSYmCmEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpfSxwYj1mdW5jdGlvbihhLGIpe2lmKCFhfHwhYilyZXR1cm4hMTtpZihhLmNvbnRhaW5zJiYxPT1iLm5vZGVUeXBlKXJldHVybiBhPT1ifHxhLmNvbnRhaW5zKGIpO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbilyZXR1cm4gYT09Ynx8ISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNik7Zm9yKDtiJiZhIT1iOyliPWIucGFyZW50Tm9kZTtyZXR1cm4gYj09YX0scWI9ZnVuY3Rpb24oYSl7cShhLCJOb2RlIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4iKTtyZXR1cm4gOT09YS5ub2RlVHlwZT9hOmEub3duZXJEb2N1bWVudHx8YS5kb2N1bWVudH0scmI9ZnVuY3Rpb24oYSxiKXtiP2EudGFiSW5kZXg9MDooYS50YWJJbmRleD0tMSxhLnJlbW92ZUF0dHJpYnV0ZSgidGFiSW5kZXgiKSl9LHNiPWZ1bmN0aW9uKGEpe3JldHVybiB2JiYhQSgiOSIpPyhhPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKSwKbnVsbCE9YSYmYS5zcGVjaWZpZWQpOmEuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpfSx0Yj1mdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgYSYmMDw9YSYmMzI3Njg+YX0sdWI9ZnVuY3Rpb24oYSl7dGhpcy5hPWF8fGwuZG9jdW1lbnR8fGRvY3VtZW50fTt1Yi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBhP3RoaXMuYS5nZXRFbGVtZW50QnlJZChhKTphfTsKdWIucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuYSxlPWFyZ3VtZW50cyxmPVN0cmluZyhlWzBdKSxnPWVbMV07aWYoIWpiJiZnJiYoZy5uYW1lfHxnLnR5cGUpKXtmPVsiPCIsZl07Zy5uYW1lJiZmLnB1c2goJyBuYW1lPSInLFhhKGcubmFtZSksJyInKTtpZihnLnR5cGUpe2YucHVzaCgnIHR5cGU9IicsWGEoZy50eXBlKSwnIicpO3ZhciBrPXt9O3VhKGssZyk7ZGVsZXRlIGsudHlwZTtnPWt9Zi5wdXNoKCI+Iik7Zj1mLmpvaW4oIiIpfWY9bmIoZCxmKTtnJiYoInN0cmluZyI9PT10eXBlb2YgZz9mLmNsYXNzTmFtZT1nOmZhKGcpP2YuY2xhc3NOYW1lPWcuam9pbigiICIpOmxiKGYsZykpOzI8ZS5sZW5ndGgmJm1iKGQsZixlKTtyZXR1cm4gZn07dmFyIHZiPWZ1bmN0aW9uKGEsYil7Yj8ocShwYSh2YSxiKSwiTm8gc3VjaCBBUklBIHJvbGUgIitiKSxhLnNldEF0dHJpYnV0ZSgicm9sZSIsYikpOmEucmVtb3ZlQXR0cmlidXRlKCJyb2xlIil9LHhiPWZ1bmN0aW9uKGEsYixjKXtmYShjKSYmKGM9Yy5qb2luKCIgIikpO3ZhciBkPXdiKGIpOyIiPT09Y3x8dm9pZCAwPT1jPyhtYXx8KG1hPXthdG9taWM6ITEsYXV0b2NvbXBsZXRlOiJub25lIixkcm9wZWZmZWN0OiJub25lIixoYXNwb3B1cDohMSxsaXZlOiJvZmYiLG11bHRpbGluZTohMSxtdWx0aXNlbGVjdGFibGU6ITEsb3JpZW50YXRpb246InZlcnRpY2FsIixyZWFkb25seTohMSxyZWxldmFudDoiYWRkaXRpb25zIHRleHQiLHJlcXVpcmVkOiExLHNvcnQ6Im5vbmUiLGJ1c3k6ITEsZGlzYWJsZWQ6ITEsaGlkZGVuOiExLGludmFsaWQ6ImZhbHNlIn0pLGM9bWEsYiBpbiBjP2Euc2V0QXR0cmlidXRlKGQsY1tiXSk6YS5yZW1vdmVBdHRyaWJ1dGUoZCkpOmEuc2V0QXR0cmlidXRlKGQsCmMpfSx3Yj1mdW5jdGlvbihhKXtxKGEsIkFSSUEgYXR0cmlidXRlIGNhbm5vdCBiZSBlbXB0eS4iKTtxKHBhKG5hLGEpLCJObyBzdWNoIEFSSUEgYXR0cmlidXRlICIrYSk7cmV0dXJuImFyaWEtIithfTt2YXIgeWI9T2JqZWN0LmZyZWV6ZXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O3ZhciBDPWZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVTt0aGlzLko9dGhpcy5KfTtDLnByb3RvdHlwZS5VPSExO0MucHJvdG90eXBlLk49ZnVuY3Rpb24oKXt0aGlzLlV8fCh0aGlzLlU9ITAsdGhpcy51KCkpfTt2YXIgemI9ZnVuY3Rpb24oYSxiKXthLlU/YigpOihhLkp8fChhLko9W10pLGEuSi5wdXNoKGIpKX07Qy5wcm90b3R5cGUudT1mdW5jdGlvbigpe2lmKHRoaXMuSilmb3IoO3RoaXMuSi5sZW5ndGg7KXRoaXMuSi5zaGlmdCgpKCl9O3ZhciBBYj1mdW5jdGlvbihhKXthJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5OJiZhLk4oKX07dmFyIEJiPWZ1bmN0aW9uKGEpe3JldHVybiJzdHJpbmciPT10eXBlb2YgYS5jbGFzc05hbWU/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sRD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6QmIoYSkubWF0Y2goL1xTKy9nKXx8W119LENiPWZ1bmN0aW9uKGEsYil7InN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZT9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxEYj1mdW5jdGlvbihhLGIpe3JldHVybiBhLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5jb250YWlucyhiKTpHYShEKGEpLGIpfSxFYj1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFEYihhLGIpKXt2YXIgYz1CYihhKTtDYihhLGMrKDA8Yy5sZW5ndGg/IiAiK2I6YikpfX0sRmI9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClyKGIsCmZ1bmN0aW9uKGUpe0ViKGEsZSl9KTtlbHNle3ZhciBjPXt9O3IoRChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7cihiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPTA8Yi5sZW5ndGg/IiAiK2Q6ZDtDYihhLGIpfX0sR2I9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6RGIoYSxiKSYmQ2IoYSxFYShEKGEpLGZ1bmN0aW9uKGMpe3JldHVybiBjIT1ifSkuam9pbigiICIpKX0sSGI9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9yKGIsZnVuY3Rpb24oYyl7R2IoYSxjKX0pOkNiKGEsRWEoRChhKSxmdW5jdGlvbihjKXtyZXR1cm4hR2EoYixjKX0pLmpvaW4oIiAiKSl9O3ZhciBJYj0hdnx8OTw9TnVtYmVyKGliKSxKYj0hdnx8OTw9TnVtYmVyKGliKSxLYj12JiYhQSgiOSIpLExiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e2wuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsY2EsYiksbC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjYSxiKX1jYXRjaChjKXt9cmV0dXJuIGF9KCk7dmFyIEU9ZnVuY3Rpb24oYSxiKXt0aGlzLnR5cGU9YTt0aGlzLmE9dGhpcy50YXJnZXQ9Yjt0aGlzLmg9ITE7dGhpcy5LYT0hMH07RS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuaD0hMH07RS5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3RoaXMuS2E9ITF9O3ZhciBGPXtMOiJtb3VzZWRvd24iLE06Im1vdXNldXAiLGFhOiJtb3VzZWNhbmNlbCIsaGM6Im1vdXNlbW92ZSIsamM6Im1vdXNlb3ZlciIsaWM6Im1vdXNlb3V0IixmYzoibW91c2VlbnRlciIsZ2M6Im1vdXNlbGVhdmUifTt2YXIgRz1mdW5jdGlvbihhLGIpe0UuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy5hPXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5jPTA7dGhpcy5BPXRoaXMubWV0YUtleT10aGlzLnNoaWZ0S2V5PXRoaXMuYWx0S2V5PXRoaXMuY3RybEtleT0hMTt0aGlzLnBvaW50ZXJJZD0wO3RoaXMucG9pbnRlclR5cGU9IiI7dGhpcy5iPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMuYT1iO2lmKGI9YS5yZWxhdGVkVGFyZ2V0KXtpZih4KXthOnt0cnl7WWEoYi5ub2RlTmFtZSk7dmFyIGU9ITA7YnJlYWsgYX1jYXRjaChmKXt9ZT0KITF9ZXx8KGI9bnVsbCl9fWVsc2UibW91c2VvdmVyIj09Yz9iPWEuZnJvbUVsZW1lbnQ6Im1vdXNlb3V0Ij09YyYmKGI9YS50b0VsZW1lbnQpO3RoaXMucmVsYXRlZFRhcmdldD1iO2Q/KHRoaXMuY2xpZW50WD12b2lkIDAhPT1kLmNsaWVudFg/ZC5jbGllbnRYOmQucGFnZVgsdGhpcy5jbGllbnRZPXZvaWQgMCE9PWQuY2xpZW50WT9kLmNsaWVudFk6ZC5wYWdlWSx0aGlzLnNjcmVlblg9ZC5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1kLnNjcmVlbll8fDApOih0aGlzLmNsaWVudFg9dm9pZCAwIT09YS5jbGllbnRYP2EuY2xpZW50WDphLnBhZ2VYLHRoaXMuY2xpZW50WT12b2lkIDAhPT1hLmNsaWVudFk/YS5jbGllbnRZOmEucGFnZVksdGhpcy5zY3JlZW5YPWEuc2NyZWVuWHx8MCx0aGlzLnNjcmVlblk9YS5zY3JlZW5ZfHwwKTt0aGlzLmJ1dHRvbj1hLmJ1dHRvbjt0aGlzLmM9YS5rZXlDb2RlfHwwO3RoaXMua2V5PWEua2V5fHwiIjt0aGlzLmN0cmxLZXk9YS5jdHJsS2V5O3RoaXMuYWx0S2V5PQphLmFsdEtleTt0aGlzLnNoaWZ0S2V5PWEuc2hpZnRLZXk7dGhpcy5tZXRhS2V5PWEubWV0YUtleTt0aGlzLkE9ej9hLm1ldGFLZXk6YS5jdHJsS2V5O3RoaXMucG9pbnRlcklkPWEucG9pbnRlcklkfHwwO3RoaXMucG9pbnRlclR5cGU9InN0cmluZyI9PT10eXBlb2YgYS5wb2ludGVyVHlwZT9hLnBvaW50ZXJUeXBlOk1iW2EucG9pbnRlclR5cGVdfHwiIjt0aGlzLmI9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnRoaXMuZygpfX07bihHLEUpO3ZhciBOYj15YihbMSw0LDJdKSxNYj15Yih7MjoidG91Y2giLDM6InBlbiIsNDoibW91c2UifSksT2I9ZnVuY3Rpb24oYSl7cmV0dXJuIEliPzA9PWEuYi5idXR0b246ImNsaWNrIj09YS50eXBlPyEwOiEhKGEuYi5idXR0b24mTmJbMF0pfTtHLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7Ry5pLmouY2FsbCh0aGlzKTt0aGlzLmIuc3RvcFByb3BhZ2F0aW9uP3RoaXMuYi5zdG9wUHJvcGFnYXRpb24oKTp0aGlzLmIuY2FuY2VsQnViYmxlPSEwfTsKRy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe0cuaS5nLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5iO2lmKGEucHJldmVudERlZmF1bHQpYS5wcmV2ZW50RGVmYXVsdCgpO2Vsc2UgaWYoYS5yZXR1cm5WYWx1ZT0hMSxLYil0cnl7aWYoYS5jdHJsS2V5fHwxMTI8PWEua2V5Q29kZSYmMTIzPj1hLmtleUNvZGUpYS5rZXlDb2RlPS0xfWNhdGNoKGIpe319O3ZhciBQYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKDFFNipNYXRoLnJhbmRvbSgpfDApLFFiPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW1BiXSl9LFJiPTA7dmFyIFNiPWZ1bmN0aW9uKGEsYixjLGQsZSl7dGhpcy5saXN0ZW5lcj1hO3RoaXMuYT1udWxsO3RoaXMuc3JjPWI7dGhpcy50eXBlPWM7dGhpcy5jYXB0dXJlPSEhZDt0aGlzLm1hPWU7dGhpcy5rZXk9KytSYjt0aGlzLlg9dGhpcy5oYT0hMX0sVGI9ZnVuY3Rpb24oYSl7YS5YPSEwO2EubGlzdGVuZXI9bnVsbDthLmE9bnVsbDthLnNyYz1udWxsO2EubWE9bnVsbH07dmFyIFViPWZ1bmN0aW9uKGEpe3RoaXMuc3JjPWE7dGhpcy5hPXt9O3RoaXMuYj0wfTtVYi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS50b1N0cmluZygpO2E9dGhpcy5hW2ZdO2F8fChhPXRoaXMuYVtmXT1bXSx0aGlzLmIrKyk7dmFyIGc9VmIoYSxiLGQsZSk7LTE8Zz8oYj1hW2ddLGN8fChiLmhhPSExKSk6KGI9bmV3IFNiKGIsdGhpcy5zcmMsZiwhIWQsZSksYi5oYT1jLGEucHVzaChiKSk7cmV0dXJuIGJ9Owp2YXIgV2I9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLnR5cGU7YyBpbiBhLmEmJkhhKGEuYVtjXSxiKSYmKFRiKGIpLDA9PWEuYVtjXS5sZW5ndGgmJihkZWxldGUgYS5hW2NdLGEuYi0tKSl9LFhiPWZ1bmN0aW9uKGEsYixjLGQsZSl7YT1hLmFbYi50b1N0cmluZygpXTtiPS0xO2EmJihiPVZiKGEsYyxkLGUpKTtyZXR1cm4tMTxiP2FbYl06bnVsbH0sVmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuWCYmZi5saXN0ZW5lcj09YiYmZi5jYXB0dXJlPT0hIWMmJmYubWE9PWQpcmV0dXJuIGV9cmV0dXJuLTF9O3ZhciBZYj0iY2xvc3VyZV9sbV8iKygxRTYqTWF0aC5yYW5kb20oKXwwKSxaYj17fSwkYj0wLGJjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZCYmZC5vbmNlKXJldHVybiBhYyhhLGIsYyxkLGUpO2lmKGZhKGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyliYyhhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9Y2MoYyk7cmV0dXJuIFFiKGEpP2RjKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOmVjKGEsYixjLCExLGQsZSl9LGVjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGc9bShlKT8hIWUuY2FwdHVyZTohIWUsaz1mYyhhKTtrfHwoYVtZYl09az1uZXcgVWIoYSkpO2M9ay5hZGQoYixjLGQsZyxmKTtpZihjLmEpcmV0dXJuIGM7ZD1nYygpO2MuYT1kO2Quc3JjPWE7ZC5saXN0ZW5lcj1jO2lmKGEuYWRkRXZlbnRMaXN0ZW5lcilMYnx8KGU9Zyksdm9pZCAwPT09ZSYmKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksCmQsZSk7ZWxzZSBpZihhLmF0dGFjaEV2ZW50KWEuYXR0YWNoRXZlbnQoaGMoYi50b1N0cmluZygpKSxkKTtlbHNlIGlmKGEuYWRkTGlzdGVuZXImJmEucmVtb3ZlTGlzdGVuZXIpcSgiY2hhbmdlIj09PWIsIk1lZGlhUXVlcnlMaXN0IG9ubHkgaGFzIGEgY2hhbmdlIGV2ZW50IiksYS5hZGRMaXN0ZW5lcihkKTtlbHNlIHRocm93IEVycm9yKCJhZGRFdmVudExpc3RlbmVyIGFuZCBhdHRhY2hFdmVudCBhcmUgdW5hdmFpbGFibGUuIik7JGIrKztyZXR1cm4gY30sZ2M9ZnVuY3Rpb24oKXt2YXIgYT1pYyxiPUpiP2Z1bmN0aW9uKGMpe3JldHVybiBhLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKX06ZnVuY3Rpb24oYyl7Yz1hLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKTtpZighYylyZXR1cm4gY307cmV0dXJuIGJ9LGFjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZmEoYikpe2Zvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWFjKGEsYltmXSxjLGQsZSk7cmV0dXJuIG51bGx9Yz1jYyhjKTtyZXR1cm4gUWIoYSk/CmEuaC5hZGQoU3RyaW5nKGIpLGMsITAsbShkKT8hIWQuY2FwdHVyZTohIWQsZSk6ZWMoYSxiLGMsITAsZCxlKX0samM9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihmYShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylqYyhhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPWNjKGMpLFFiKGEpPyhhPWEuaCxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5hJiYoZj1hLmFbYl0sYz1WYihmLGMsZCxlKSwtMTxjJiYoVGIoZltjXSkscShudWxsIT1mLmxlbmd0aCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSwwPT1mLmxlbmd0aCYmKGRlbGV0ZSBhLmFbYl0sYS5iLS0pKSkpOmEmJihhPWZjKGEpKSYmKGM9WGIoYSxiLGMsZCxlKSkmJmtjKGMpfSxrYz1mdW5jdGlvbihhKXtpZigibnVtYmVyIiE9PXR5cGVvZiBhJiZhJiYhYS5YKXt2YXIgYj1hLnNyYztpZihRYihiKSlXYihiLmgsYSk7ZWxzZXt2YXIgYz1hLnR5cGUsZD1hLmE7Yi5yZW1vdmVFdmVudExpc3RlbmVyPwpiLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KGhjKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7JGItLTsoYz1mYyhiKSk/KFdiKGMsYSksMD09Yy5iJiYoYy5zcmM9bnVsbCxiW1liXT1udWxsKSk6VGIoYSl9fX0saGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gWmI/WmJbYV06WmJbYV09Im9uIithfSxtYz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMDtpZihhPWZjKGEpKWlmKGI9YS5hW2IudG9TdHJpbmcoKV0pZm9yKGI9Yi5jb25jYXQoKSxhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBmPWJbYV07ZiYmZi5jYXB0dXJlPT1jJiYhZi5YJiYoZj1sYyhmLGQpLGU9ZSYmITEhPT1mKX1yZXR1cm4gZX0sbGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5tYXx8YS5zcmM7YS5oYSYma2MoYSk7cmV0dXJuIGMuY2FsbChkLGIpfSxpYz1mdW5jdGlvbihhLApiKXtpZihhLlgpcmV0dXJuITA7aWYoIUpiKXtpZighYilhOntiPVsid2luZG93IiwiZXZlbnQiXTtmb3IodmFyIGM9bCxkPTA7ZDxiLmxlbmd0aDtkKyspaWYoYz1jW2JbZF1dLG51bGw9PWMpe2I9bnVsbDticmVhayBhfWI9Y31kPWI7Yj1uZXcgRyhkLHRoaXMpO2M9ITA7aWYoISgwPmQua2V5Q29kZXx8dm9pZCAwIT1kLnJldHVyblZhbHVlKSl7YTp7dmFyIGU9ITE7aWYoMD09ZC5rZXlDb2RlKXRyeXtkLmtleUNvZGU9LTE7YnJlYWsgYX1jYXRjaChnKXtlPSEwfWlmKGV8fHZvaWQgMD09ZC5yZXR1cm5WYWx1ZSlkLnJldHVyblZhbHVlPSEwfWQ9W107Zm9yKGU9Yi5hO2U7ZT1lLnBhcmVudE5vZGUpZC5wdXNoKGUpO2E9YS50eXBlO2ZvcihlPWQubGVuZ3RoLTE7IWIuaCYmMDw9ZTtlLS0pe2IuYT1kW2VdO3ZhciBmPW1jKGRbZV0sYSwhMCxiKTtjPWMmJmZ9Zm9yKGU9MDshYi5oJiZlPGQubGVuZ3RoO2UrKyliLmE9ZFtlXSxmPW1jKGRbZV0sYSwhMSxiKSxjPWMmJmZ9cmV0dXJuIGN9cmV0dXJuIGxjKGEsCm5ldyBHKGIsdGhpcykpfSxmYz1mdW5jdGlvbihhKXthPWFbWWJdO3JldHVybiBhIGluc3RhbmNlb2YgVWI/YTpudWxsfSxuYz0iX19jbG9zdXJlX2V2ZW50c19mbl8iKygxRTkqTWF0aC5yYW5kb20oKT4+PjApLGNjPWZ1bmN0aW9uKGEpe3EoYSwiTGlzdGVuZXIgY2FuIG5vdCBiZSBudWxsLiIpO2lmKGlhKGEpKXJldHVybiBhO3EoYS5oYW5kbGVFdmVudCwiQW4gb2JqZWN0IGxpc3RlbmVyIG11c3QgaGF2ZSBoYW5kbGVFdmVudCBtZXRob2QuIik7YVtuY118fChhW25jXT1mdW5jdGlvbihiKXtyZXR1cm4gYS5oYW5kbGVFdmVudChiKX0pO3JldHVybiBhW25jXX07dmFyIG9jPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9e319O24ob2MsQyk7CnZhciBwYz1bXSxIPWZ1bmN0aW9uKGEsYixjLGQpe2ZhKGMpfHwoYyYmKHBjWzBdPWMudG9TdHJpbmcoKSksYz1wYyk7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWJjKGIsY1tlXSxkfHxhLmhhbmRsZUV2ZW50LCExLGEuYnx8YSk7aWYoIWYpYnJlYWs7YS5hW2Yua2V5XT1mfXJldHVybiBhfSxxYz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoZmEoYykpZm9yKHZhciBnPTA7ZzxjLmxlbmd0aDtnKyspcWMoYSxiLGNbZ10sZCxlLGYpO2Vsc2UgZD1kfHxhLmhhbmRsZUV2ZW50LGU9bShlKT8hIWUuY2FwdHVyZTohIWUsZj1mfHxhLmJ8fGEsZD1jYyhkKSxlPSEhZSxjPVFiKGIpP1hiKGIuaCxTdHJpbmcoYyksZCxlLGYpOmI/KGI9ZmMoYikpP1hiKGIsYyxkLGUsZik6bnVsbDpudWxsLGMmJihrYyhjKSxkZWxldGUgYS5hW2Mua2V5XSk7cmV0dXJuIGF9LHJjPWZ1bmN0aW9uKGEpe29hKGEuYSxmdW5jdGlvbihiLGMpe3RoaXMuYS5oYXNPd25Qcm9wZXJ0eShjKSYma2MoYil9LAphKTthLmE9e319O29jLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7b2MuaS51LmNhbGwodGhpcyk7cmModGhpcyl9O29jLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJFdmVudEhhbmRsZXIuaGFuZGxlRXZlbnQgbm90IGltcGxlbWVudGVkIik7fTt2YXIgST1mdW5jdGlvbigpe0MuY2FsbCh0aGlzKTt0aGlzLmg9bmV3IFViKHRoaXMpO3RoaXMuTWE9dGhpczt0aGlzLnBhPW51bGx9O24oSSxDKTtJLnByb3RvdHlwZVtQYl09ITA7SS5wcm90b3R5cGUucmE9ZnVuY3Rpb24oYSl7dGhpcy5wYT1hfTtJLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjLGQpe2pjKHRoaXMsYSxiLGMsZCl9Owp2YXIgdWM9ZnVuY3Rpb24oYSxiKXtzYyhhKTt2YXIgYz1hLnBhO2lmKGMpe3ZhciBkPVtdO2Zvcih2YXIgZT0xO2M7Yz1jLnBhKWQucHVzaChjKSxxKDFFMz4rK2UsImluZmluaXRlIGxvb3AiKX1hPWEuTWE7Yz1iLnR5cGV8fGI7InN0cmluZyI9PT10eXBlb2YgYj9iPW5ldyBFKGIsYSk6YiBpbnN0YW5jZW9mIEU/Yi50YXJnZXQ9Yi50YXJnZXR8fGE6KGU9YixiPW5ldyBFKGMsYSksdWEoYixlKSk7ZT0hMDtpZihkKWZvcih2YXIgZj1kLmxlbmd0aC0xOyFiLmgmJjA8PWY7Zi0tKXt2YXIgZz1iLmE9ZFtmXTtlPXRjKGcsYywhMCxiKSYmZX1iLmh8fChnPWIuYT1hLGU9dGMoZyxjLCEwLGIpJiZlLGIuaHx8KGU9dGMoZyxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLmgmJmY8ZC5sZW5ndGg7ZisrKWc9Yi5hPWRbZl0sZT10YyhnLGMsITEsYikmJmU7cmV0dXJuIGV9OwpJLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7SS5pLnUuY2FsbCh0aGlzKTtpZih0aGlzLmgpe3ZhciBhPXRoaXMuaCxiPTAsYztmb3IoYyBpbiBhLmEpe2Zvcih2YXIgZD1hLmFbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixUYihkW2VdKTtkZWxldGUgYS5hW2NdO2EuYi0tfX10aGlzLnBhPW51bGx9O3ZhciBkYz1mdW5jdGlvbihhLGIsYyxkLGUpe3NjKGEpO3JldHVybiBhLmguYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LHRjPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5oLmFbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGc9YltmXTtpZihnJiYhZy5YJiZnLmNhcHR1cmU9PWMpe3ZhciBrPWcubGlzdGVuZXIscD1nLm1hfHxnLnNyYztnLmhhJiZXYihhLmgsZyk7ZT0hMSE9PWsuY2FsbChwLGQpJiZlfX1yZXR1cm4gZSYmMCE9ZC5LYX0sc2M9ZnVuY3Rpb24oYSl7cShhLmgsIkV2ZW50IHRhcmdldCBpcyBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgY2FsbCB0aGUgc3VwZXJjbGFzcyAoZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpIGNvbnN0cnVjdG9yPyIpfTt2YXIgeGM9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKHkmJiFBKCI1MjUiKSlyZXR1cm4hMDtpZih6JiZlKXJldHVybiB2YyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZigheCl7Im51bWJlciI9PT10eXBlb2YgYiYmKGI9d2MoYikpO3ZhciBnPTE3PT1ifHwxOD09Ynx8eiYmOTE9PWI7aWYoKCFjfHx6KSYmZ3x8eiYmMTY9PWImJihkfHxmKSlyZXR1cm4hMX1pZigoeXx8YmIpJiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1pZih2JiZkJiZiPT1hKXJldHVybiExO3N3aXRjaChhKXtjYXNlIDEzOnJldHVybiB4P2Z8fGU/ITE6IShjJiZkKTohMDtjYXNlIDI3OnJldHVybiEoeXx8YmJ8fHgpfXJldHVybiB4JiYoZHx8ZXx8Zik/ITE6dmMoYSl9LHZjPWZ1bmN0aW9uKGEpe2lmKDQ4PD1hJiY1Nz49YXx8Cjk2PD1hJiYxMDY+PWF8fDY1PD1hJiY5MD49YXx8KHl8fGJiKSYmMD09YSlyZXR1cm4hMDtzd2l0Y2goYSl7Y2FzZSAzMjpjYXNlIDQzOmNhc2UgNjM6Y2FzZSA2NDpjYXNlIDEwNzpjYXNlIDEwOTpjYXNlIDExMDpjYXNlIDExMTpjYXNlIDE4NjpjYXNlIDU5OmNhc2UgMTg5OmNhc2UgMTg3OmNhc2UgNjE6Y2FzZSAxODg6Y2FzZSAxOTA6Y2FzZSAxOTE6Y2FzZSAxOTI6Y2FzZSAyMjI6Y2FzZSAyMTk6Y2FzZSAyMjA6Y2FzZSAyMjE6Y2FzZSAxNjM6Y2FzZSA1ODpyZXR1cm4hMDtjYXNlIDE3MzpyZXR1cm4geDtkZWZhdWx0OnJldHVybiExfX0sd2M9ZnVuY3Rpb24oYSl7aWYoeClhPXljKGEpO2Vsc2UgaWYoeiYmeSlzd2l0Y2goYSl7Y2FzZSA5MzphPTkxfXJldHVybiBhfSx5Yz1mdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSA2MTpyZXR1cm4gMTg3O2Nhc2UgNTk6cmV0dXJuIDE4NjtjYXNlIDE3MzpyZXR1cm4gMTg5O2Nhc2UgMjI0OnJldHVybiA5MTtjYXNlIDA6cmV0dXJuIDIyNDsKZGVmYXVsdDpyZXR1cm4gYX19O3ZhciBKPWZ1bmN0aW9uKGEsYil7SS5jYWxsKHRoaXMpO2EmJnpjKHRoaXMsYSxiKX07bihKLEkpO2g9Si5wcm90b3R5cGU7aC5TPW51bGw7aC5uYT1udWxsO2guQ2E9bnVsbDtoLm9hPW51bGw7aC53PS0xO2guRj0tMTtoLnVhPSExOwp2YXIgQWM9ezM6MTMsMTI6MTQ0LDYzMjMyOjM4LDYzMjMzOjQwLDYzMjM0OjM3LDYzMjM1OjM5LDYzMjM2OjExMiw2MzIzNzoxMTMsNjMyMzg6MTE0LDYzMjM5OjExNSw2MzI0MDoxMTYsNjMyNDE6MTE3LDYzMjQyOjExOCw2MzI0MzoxMTksNjMyNDQ6MTIwLDYzMjQ1OjEyMSw2MzI0NjoxMjIsNjMyNDc6MTIzLDYzMjQ4OjQ0LDYzMjcyOjQ2LDYzMjczOjM2LDYzMjc1OjM1LDYzMjc2OjMzLDYzMjc3OjM0LDYzMjg5OjE0NCw2MzMwMjo0NX0sQmM9e1VwOjM4LERvd246NDAsTGVmdDozNyxSaWdodDozOSxFbnRlcjoxMyxGMToxMTIsRjI6MTEzLEYzOjExNCxGNDoxMTUsRjU6MTE2LEY2OjExNyxGNzoxMTgsRjg6MTE5LEY5OjEyMCxGMTA6MTIxLEYxMToxMjIsRjEyOjEyMywiVSswMDdGIjo0NixIb21lOjM2LEVuZDozNSxQYWdlVXA6MzMsUGFnZURvd246MzQsSW5zZXJ0OjQ1fSxDYz0heXx8QSgiNTI1IiksRGM9eiYmeDsKSi5wcm90b3R5cGUuYT1mdW5jdGlvbihhKXtpZih5fHxiYilpZigxNz09dGhpcy53JiYhYS5jdHJsS2V5fHwxOD09dGhpcy53JiYhYS5hbHRLZXl8fHomJjkxPT10aGlzLncmJiFhLm1ldGFLZXkpdGhpcy5GPXRoaXMudz0tMTstMT09dGhpcy53JiYoYS5jdHJsS2V5JiYxNyE9YS5jP3RoaXMudz0xNzphLmFsdEtleSYmMTghPWEuYz90aGlzLnc9MTg6YS5tZXRhS2V5JiY5MSE9YS5jJiYodGhpcy53PTkxKSk7Q2MmJiF4YyhhLmMsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGEuYWx0S2V5LGEubWV0YUtleSk/dGhpcy5oYW5kbGVFdmVudChhKToodGhpcy5GPXdjKGEuYyksRGMmJih0aGlzLnVhPWEuYWx0S2V5KSl9O0oucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dGhpcy5GPXRoaXMudz0tMTt0aGlzLnVhPWEuYWx0S2V5fTsKSi5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5iLGM9Yi5hbHRLZXk7aWYodiYmImtleXByZXNzIj09YS50eXBlKXt2YXIgZD10aGlzLkY7dmFyIGU9MTMhPWQmJjI3IT1kP2Iua2V5Q29kZTowfWVsc2UoeXx8YmIpJiYia2V5cHJlc3MiPT1hLnR5cGU/KGQ9dGhpcy5GLGU9MDw9Yi5jaGFyQ29kZSYmNjMyMzI+Yi5jaGFyQ29kZSYmdmMoZCk/Yi5jaGFyQ29kZTowKTphYiYmIXk/KGQ9dGhpcy5GLGU9dmMoZCk/Yi5rZXlDb2RlOjApOigia2V5cHJlc3MiPT1hLnR5cGU/KERjJiYoYz10aGlzLnVhKSxiLmtleUNvZGU9PWIuY2hhckNvZGU/MzI+Yi5rZXlDb2RlPyhkPWIua2V5Q29kZSxlPTApOihkPXRoaXMuRixlPWIuY2hhckNvZGUpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkseiYmNjM9PWUmJjIyND09ZCYmKGQ9MTkxKSk7dmFyIGY9ZD13YyhkKTtkPzYzMjMyPD0KZCYmZCBpbiBBYz9mPUFjW2RdOjI1PT1kJiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBCYyYmKGY9QmNbYi5rZXlJZGVudGlmaWVyXSk7eCYmQ2MmJiJrZXlwcmVzcyI9PWEudHlwZSYmIXhjKGYsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KXx8KGE9Zj09dGhpcy53LHRoaXMudz1mLGI9bmV3IEVjKGYsZSxhLGIpLGIuYWx0S2V5PWMsdWModGhpcyxiKSl9O0oucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTsKdmFyIHpjPWZ1bmN0aW9uKGEsYixjKXthLm9hJiZGYyhhKTthLlM9YjthLm5hPWJjKGEuUywia2V5cHJlc3MiLGEsYyk7YS5DYT1iYyhhLlMsImtleWRvd24iLGEuYSxjLGEpO2Eub2E9YmMoYS5TLCJrZXl1cCIsYS5iLGMsYSl9LEZjPWZ1bmN0aW9uKGEpe2EubmEmJihrYyhhLm5hKSxrYyhhLkNhKSxrYyhhLm9hKSxhLm5hPW51bGwsYS5DYT1udWxsLGEub2E9bnVsbCk7YS5TPW51bGw7YS53PS0xO2EuRj0tMX07Si5wcm90b3R5cGUudT1mdW5jdGlvbigpe0ouaS51LmNhbGwodGhpcyk7RmModGhpcyl9O3ZhciBFYz1mdW5jdGlvbihhLGIsYyxkKXtHLmNhbGwodGhpcyxkKTt0aGlzLnR5cGU9ImtleSI7dGhpcy5jPWE7dGhpcy5yZXBlYXQ9Y307bihFYyxHKTt2YXIgR2M9eD8iTW96VXNlclNlbGVjdCI6eXx8YmI/IldlYmtpdFVzZXJTZWxlY3QiOm51bGwsSGM9ZnVuY3Rpb24oYSxiKXtiPWI/bnVsbDphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7aWYoR2Mpe3ZhciBjPSJub25lIjthLnN0eWxlJiYoYS5zdHlsZVtHY109Yyk7aWYoYil7YT0wO2Zvcih2YXIgZDtkPWJbYV07YSsrKWQuc3R5bGUmJihkLnN0eWxlW0djXT1jKX19ZWxzZSBpZih2fHxhYilpZihjPSJvbiIsYS5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyksYilmb3IoYT0wO2Q9YlthXTthKyspZC5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyl9O3ZhciBJYz1mdW5jdGlvbigpe307ZGEoSWMpO0ljLnByb3RvdHlwZS5hPTA7dmFyIEs9ZnVuY3Rpb24oYSl7SS5jYWxsKHRoaXMpO3RoaXMuaj1hfHx4YXx8KHhhPW5ldyB1Yik7dGhpcy5xYT1KYzt0aGlzLlk9bnVsbDt0aGlzLm09ITE7dGhpcy5hPW51bGw7dGhpcy5BPXZvaWQgMDt0aGlzLmc9dGhpcy5jPXRoaXMuYj1udWxsO3RoaXMuR2E9ITF9O24oSyxJKTtLLnByb3RvdHlwZS5PYT1JYy5SKCk7CnZhciBKYz1udWxsLEtjPWZ1bmN0aW9uKGEsYil7c3dpdGNoKGEpe2Nhc2UgMTpyZXR1cm4gYj8iZGlzYWJsZSI6ImVuYWJsZSI7Y2FzZSAyOnJldHVybiBiPyJoaWdobGlnaHQiOiJ1bmhpZ2hsaWdodCI7Y2FzZSA0OnJldHVybiBiPyJhY3RpdmF0ZSI6ImRlYWN0aXZhdGUiO2Nhc2UgODpyZXR1cm4gYj8ic2VsZWN0IjoidW5zZWxlY3QiO2Nhc2UgMTY6cmV0dXJuIGI/ImNoZWNrIjoidW5jaGVjayI7Y2FzZSAzMjpyZXR1cm4gYj8iZm9jdXMiOiJibHVyIjtjYXNlIDY0OnJldHVybiBiPyJvcGVuIjoiY2xvc2UifXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBzdGF0ZSIpO30sTGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuWXx8KGEuWT0iOiIrKGEuT2EuYSsrKS50b1N0cmluZygzNikpfSxNYz1mdW5jdGlvbihhLGIpe2lmKGEuYiYmYS5iLmcpe3ZhciBjPWEuYi5nLGQ9YS5ZO2QgaW4gYyYmZGVsZXRlIGNbZF07cWEoYS5iLmcsYixhKX1hLlk9Yn07Sy5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9Owp2YXIgTmM9ZnVuY3Rpb24oYSl7YT1hLmE7cShhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cmV0dXJuIGF9LE9jPWZ1bmN0aW9uKGEpe2EuQXx8KGEuQT1uZXcgb2MoYSkpO3JldHVybiBxKGEuQSl9O0sucHJvdG90eXBlLnJhPWZ1bmN0aW9uKGEpe2lmKHRoaXMuYiYmdGhpcy5iIT1hKXRocm93IEVycm9yKCJNZXRob2Qgbm90IHN1cHBvcnRlZCIpO0suaS5yYS5jYWxsKHRoaXMsYSl9O0sucHJvdG90eXBlLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPW5iKHRoaXMuai5hLCJESVYiKX07CnZhciBQYz1mdW5jdGlvbihhLGIpe2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiJiZhLnhhKGIpKXthLkdhPSEwO3ZhciBjPXFiKGIpO2EuaiYmYS5qLmE9PWN8fChhLmo9Yj9uZXcgdWIocWIoYikpOnhhfHwoeGE9bmV3IHViKSk7YS52YShiKTthLkQoKX1lbHNlIHRocm93IEVycm9yKCJJbnZhbGlkIGVsZW1lbnQgdG8gZGVjb3JhdGUiKTt9O2g9Sy5wcm90b3R5cGU7aC54YT1mdW5jdGlvbigpe3JldHVybiEwfTtoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hfTtoLkQ9ZnVuY3Rpb24oKXt0aGlzLm09ITA7UWModGhpcyxmdW5jdGlvbihhKXshYS5tJiZhLmYoKSYmYS5EKCl9KX07aC5QPWZ1bmN0aW9uKCl7UWModGhpcyxmdW5jdGlvbihhKXthLm0mJmEuUCgpfSk7dGhpcy5BJiZyYyh0aGlzLkEpO3RoaXMubT0hMX07CmgudT1mdW5jdGlvbigpe3RoaXMubSYmdGhpcy5QKCk7dGhpcy5BJiYodGhpcy5BLk4oKSxkZWxldGUgdGhpcy5BKTtRYyh0aGlzLGZ1bmN0aW9uKGEpe2EuTigpfSk7IXRoaXMuR2EmJnRoaXMuYSYmb2IodGhpcy5hKTt0aGlzLmI9dGhpcy5hPXRoaXMuZz10aGlzLmM9bnVsbDtLLmkudS5jYWxsKHRoaXMpfTtoLnNhPWZ1bmN0aW9uKGEsYil7dGhpcy50YShhLFJjKHRoaXMpLGIpfTsKaC50YT1mdW5jdGlvbihhLGIsYyl7cSghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLm0mJihjfHwhdGhpcy5tKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZigwPmJ8fGI+UmModGhpcykpdGhyb3cgRXJyb3IoIkNoaWxkIGNvbXBvbmVudCBpbmRleCBvdXQgb2YgYm91bmRzIik7dGhpcy5nJiZ0aGlzLmN8fCh0aGlzLmc9e30sdGhpcy5jPVtdKTtpZihhLmI9PXRoaXMpe3ZhciBkPUxjKGEpO3RoaXMuZ1tkXT1hO0hhKHRoaXMuYyxhKX1lbHNlIHFhKHRoaXMuZyxMYyhhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuYiYmYS5ZKXt2YXIgZT1hLmI7ZD1hLlk7ZS5nJiZkPyhlPWUuZyxkPShudWxsIT09ZSYmZCBpbiBlP2VbZF06dm9pZCAwKXx8bnVsbCk6ZD1udWxsfWlmKGQmJmEuYiE9dGhpcyl0aHJvdyBFcnJvcigiVW5hYmxlIHRvIHNldCBwYXJlbnQgY29tcG9uZW50Iik7CmEuYj10aGlzO0suaS5yYS5jYWxsKGEsdGhpcyk7TGEodGhpcy5jLGIsMCxhKTtpZihhLm0mJnRoaXMubSYmYS5iPT10aGlzKWM9dGhpcy5qYSgpLGI9Yy5jaGlsZE5vZGVzW2JdfHxudWxsLGIhPWEuZigpJiZjLmluc2VydEJlZm9yZShhLmYoKSxiKTtlbHNlIGlmKGMpe3RoaXMuYXx8dGhpcy5pYSgpO2M9TCh0aGlzLGIrMSk7Yj10aGlzLmphKCk7Yz1jP2MuYTpudWxsO2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTthLmF8fGEuaWEoKTtiP2IuaW5zZXJ0QmVmb3JlKGEuYSxjfHxudWxsKTphLmouYS5ib2R5LmFwcGVuZENoaWxkKGEuYSk7YS5iJiYhYS5iLm18fGEuRCgpfWVsc2UgdGhpcy5tJiYhYS5tJiZhLmEmJmEuYS5wYXJlbnROb2RlJiYxPT1hLmEucGFyZW50Tm9kZS5ub2RlVHlwZSYmYS5EKCl9O2guamE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hfTsKdmFyIFNjPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEucWEpe3ZhciBiPWEubT9hLmE6YS5qLmEuYm9keTthOnt2YXIgYz1xYihiKTtpZihjLmRlZmF1bHRWaWV3JiZjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihjPWMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpKSl7Yz1jLmRpcmVjdGlvbnx8Yy5nZXRQcm9wZXJ0eVZhbHVlKCJkaXJlY3Rpb24iKXx8IiI7YnJlYWsgYX1jPSIifWEucWE9InJ0bCI9PShjfHwoYi5jdXJyZW50U3R5bGU/Yi5jdXJyZW50U3R5bGUuZGlyZWN0aW9uOm51bGwpfHxiLnN0eWxlJiZiLnN0eWxlLmRpcmVjdGlvbil9cmV0dXJuIGEucWF9LFJjPWZ1bmN0aW9uKGEpe3JldHVybiBhLmM/YS5jLmxlbmd0aDowfSxMPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuYz9hLmNbYl18fG51bGw6bnVsbH0sUWM9ZnVuY3Rpb24oYSxiLGMpe2EuYyYmcihhLmMsYixjKX0sVGM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jJiZiP0RhKGEuYyxiKTotMX07dmFyIFZjPWZ1bmN0aW9uKGEsYil7aWYoIWEpdGhyb3cgRXJyb3IoIkludmFsaWQgY2xhc3MgbmFtZSAiK2EpO2lmKCFpYShiKSl0aHJvdyBFcnJvcigiSW52YWxpZCBkZWNvcmF0b3IgZnVuY3Rpb24gIitiKTtVY1thXT1ifSxXYz17fSxVYz17fTt2YXIgWGM9ZnVuY3Rpb24oYSl7dGhpcy5oPWF9O2RhKFhjKTt2YXIgWWM9ZnVuY3Rpb24oYSxiKXthJiYoYS50YWJJbmRleD1iPzA6LTEpfSwkYz1mdW5jdGlvbihhLGIsYyl7Yy5pZCYmTWMoYixjLmlkKTt2YXIgZD1hLmIoKSxlPSExLGY9RChjKTtmJiZyKGYsZnVuY3Rpb24oZyl7Zz09ZD9lPSEwOmcmJnRoaXMuZyhiLGcsZCl9LGEpO2V8fEViKGMsZCk7WmMoYixjKTtyZXR1cm4gY307WGMucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiLGMpe2I9PWMrIi1kaXNhYmxlZCI/YS5aKCExKTpiPT1jKyItaG9yaXpvbnRhbCI/YWQoYSwiaG9yaXpvbnRhbCIpOmI9PWMrIi12ZXJ0aWNhbCImJmFkKGEsInZlcnRpY2FsIil9Owp2YXIgWmM9ZnVuY3Rpb24oYSxiKXtpZihiKWZvcih2YXIgYz1iLmZpcnN0Q2hpbGQsZDtjJiZjLnBhcmVudE5vZGU9PWI7KXtkPWMubmV4dFNpYmxpbmc7aWYoMT09Yy5ub2RlVHlwZSl7YTp7dmFyIGU9YztxKGUpO2U9RChlKTtmb3IodmFyIGY9MCxnPWUubGVuZ3RoO2Y8ZztmKyspe3ZhciBrPWVbZl07aWYoaz1rIGluIFVjP1VjW2tdKCk6bnVsbCl7ZT1rO2JyZWFrIGF9fWU9bnVsbH1lJiYoZS5hPWMsYS5pc0VuYWJsZWQoKXx8ZS5aKCExKSxhLnNhKGUpLFBjKGUsYykpfWVsc2UgYy5ub2RlVmFsdWUmJiIiIT1NYShjLm5vZGVWYWx1ZSl8fGIucmVtb3ZlQ2hpbGQoYyk7Yz1kfX0sYmQ9ZnVuY3Rpb24oYSxiKXtiPWIuZigpO3EoYiwiVGhlIGNvbnRhaW5lciBET00gZWxlbWVudCBjYW5ub3QgYmUgbnVsbC4iKTtIYyhiLHgpO3YmJihiLmhpZGVGb2N1cz0hMCk7KGE9YS5oKSYmdmIoYixhKX07WGMucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKWGMucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5iKCksYz1bYiwiaG9yaXpvbnRhbCI9PWEuSD9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgTT1mdW5jdGlvbigpe30sY2Q7ZGEoTSk7dmFyIGRkPXtidXR0b246InByZXNzZWQiLGNoZWNrYm94OiJjaGVja2VkIixtZW51aXRlbToic2VsZWN0ZWQiLG1lbnVpdGVtY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtcmFkaW86ImNoZWNrZWQiLHJhZGlvOiJjaGVja2VkIix0YWI6InNlbGVjdGVkIix0cmVlaXRlbToic2VsZWN0ZWQifTtNLnByb3RvdHlwZS5oPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLmouYigiRElWIixlZCh0aGlzLGEpLmpvaW4oIiAiKSxhLmJhKX07dmFyIGdkPWZ1bmN0aW9uKGEsYixjKXtpZihhPWEuZj9hLmYoKTphKXt2YXIgZD1bYl07diYmIUEoIjciKSYmKGQ9ZmQoRChhKSxiKSxkLnB1c2goYikpOyhjP0ZiOkhiKShhLGQpfX07Ck0ucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiKXtiLmlkJiZNYyhhLGIuaWQpO2ImJmIuZmlyc3RDaGlsZD9oZChhLGIuZmlyc3RDaGlsZC5uZXh0U2libGluZz9KYShiLmNoaWxkTm9kZXMpOmIuZmlyc3RDaGlsZCk6YS5iYT1udWxsO3ZhciBjPTAsZD10aGlzLmEoKSxlPXRoaXMuYSgpLGY9ITEsZz0hMSxrPSExLHA9SmEoRChiKSk7cihwLGZ1bmN0aW9uKEIpe2Z8fEIhPWQ/Z3x8QiE9ZT9jfD1pZCh0aGlzLEIpOmc9ITA6KGY9ITAsZT09ZCYmKGc9ITApKTsxPT1pZCh0aGlzLEIpJiYoQWEoYiksc2IoYikmJnRiKGIpJiZyYihiLCExKSl9LHRoaXMpO2Eubz1jO2Z8fChwLnB1c2goZCksZT09ZCYmKGc9ITApKTtnfHxwLnB1c2goZSk7KGE9YS53YSkmJnAucHVzaC5hcHBseShwLGEpO2lmKHYmJiFBKCI3Iikpe3ZhciB3PWZkKHApOzA8dy5sZW5ndGgmJihwLnB1c2guYXBwbHkocCx3KSxrPSEwKX1mJiZnJiYhYSYmIWt8fENiKGIscC5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIGpkPWZ1bmN0aW9uKGEsYil7aWYoYT1hLmgoKSl7cShiLCJUaGUgZWxlbWVudCBwYXNzZWQgYXMgYSBmaXJzdCBwYXJhbWV0ZXIgY2Fubm90IGJlIG51bGwuIik7dmFyIGM9Yi5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDthIT1jJiZ2YihiLGEpfX0sa2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYztpZihhLnYmMzImJihjPWEuZigpKSl7aWYoIWImJmEubyYzMil7dHJ5e2MuYmx1cigpfWNhdGNoKGQpe31hLm8mMzImJmEuRmEobnVsbCl9KHNiKGMpJiZ0YihjKSkhPWImJnJiKGMsYil9fSxsZD1mdW5jdGlvbihhLGIsYyl7Y2R8fChjZD17MToiZGlzYWJsZWQiLDg6InNlbGVjdGVkIiwxNjoiY2hlY2tlZCIsNjQ6ImV4cGFuZGVkIn0pO3EoYSwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO2I9Y2RbYl07dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDtkJiYoZD1kZFtkXXx8YixiPSJjaGVja2VkIj09Ynx8InNlbGVjdGVkIj09CmI/ZDpiKTtiJiZ4YihhLGIsYyl9O00ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250cm9sIn07CnZhciBlZD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuYSgpLGQ9W2NdLGU9YS5hKCk7ZSE9YyYmZC5wdXNoKGUpO2M9Yi5vO2ZvcihlPVtdO2M7KXt2YXIgZj1jJi1jO2UucHVzaChtZChhLGYpKTtjJj1+Zn1kLnB1c2guYXBwbHkoZCxlKTsoYT1iLndhKSYmZC5wdXNoLmFwcGx5KGQsYSk7diYmIUEoIjciKSYmZC5wdXNoLmFwcGx5KGQsZmQoZCkpO3JldHVybiBkfSxmZD1mdW5jdGlvbihhLGIpe3ZhciBjPVtdO2ImJihhPUlhKGEsW2JdKSk7cihbXSxmdW5jdGlvbihkKXshRmEoZCxsYShHYSxhKSl8fGImJiFHYShkLGIpfHxjLnB1c2goZC5qb2luKCJfIikpfSk7cmV0dXJuIGN9LG1kPWZ1bmN0aW9uKGEsYil7YS5ifHxuZChhKTtyZXR1cm4gYS5iW2JdfSxpZD1mdW5jdGlvbihhLGIpe2Euanx8KGEuYnx8bmQoYSksYS5qPXNhKGEuYikpO2E9cGFyc2VJbnQoYS5qW2JdLDEwKTtyZXR1cm4gaXNOYU4oYSk/MDphfSxuZD1mdW5jdGlvbihhKXt2YXIgYj1hLmEoKSxjPSF0KGIucmVwbGFjZSgvXHhhMHxccy9nLAoiICIpLCIgIik7cShjLCJDb250cm9sUmVuZGVyZXIgaGFzIGFuIGludmFsaWQgY3NzIGNsYXNzOiAnIitiKyInIik7YS5iPXsxOmIrIi1kaXNhYmxlZCIsMjpiKyItaG92ZXIiLDQ6YisiLWFjdGl2ZSIsODpiKyItc2VsZWN0ZWQiLDE2OmIrIi1jaGVja2VkIiwzMjpiKyItZm9jdXNlZCIsNjQ6YisiLW9wZW4ifX07dmFyIE49ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO2lmKCFiKXtiPXRoaXMuY29uc3RydWN0b3I7Zm9yKHZhciBkO2I7KXtkPWJbamFdfHwoYltqYV09KytrYSk7aWYoZD1XY1tkXSlicmVhaztiPWIuaT9iLmkuY29uc3RydWN0b3I6bnVsbH1iPWQ/aWEoZC5SKT9kLlIoKTpuZXcgZDpudWxsfXRoaXMuQj1iO3RoaXMuYmE9dm9pZCAwIT09YT9hOm51bGx9O24oTixLKTtoPU4ucHJvdG90eXBlO2guYmE9bnVsbDtoLm89MDtoLnY9Mzk7aC5LPTA7aC5JYT0hMDtoLndhPW51bGw7aC55YT0hMDtoLmlhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CLmModGhpcyk7dGhpcy5hPWE7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmeGIoYSwiaGlkZGVuIiwhMCkpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hPXRoaXMuQi5nKHRoaXMsYSk7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5JYT0ibm9uZSIhPWEuc3R5bGUuZGlzcGxheX07CmguRD1mdW5jdGlvbigpe04uaS5ELmNhbGwodGhpcyk7dmFyIGE9TmModGhpcyk7cSh0aGlzKTtxKGEpO3RoaXMuaXNWaXNpYmxlKCl8fHhiKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fGxkKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy52JjgmJmxkKGEsOCwhISh0aGlzLm8mOCkpO3RoaXMudiYxNiYmbGQoYSwxNiwhISh0aGlzLm8mMTYpKTt0aGlzLnYmNjQmJmxkKGEsNjQsISEodGhpcy5vJjY0KSk7YT10aGlzLkI7U2ModGhpcykmJmdkKHRoaXMuZigpLGEuYSgpKyItcnRsIiwhMCk7dGhpcy5pc0VuYWJsZWQoKSYma2QodGhpcyx0aGlzLmlzVmlzaWJsZSgpKTtpZih0aGlzLnYmLTImJih0aGlzLnlhJiZvZCh0aGlzLCEwKSx0aGlzLnYmMzImJihhPXRoaXMuZigpKSkpe3ZhciBiPXRoaXMuV3x8KHRoaXMuVz1uZXcgSik7emMoYixhKTtIKEgoSChPYyh0aGlzKSxiLCJrZXkiLHRoaXMuZmEpLGEsImZvY3VzIix0aGlzLk5hKSxhLCJibHVyIiwKdGhpcy5GYSl9fTt2YXIgb2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYz1PYyhhKSxkPWEuZigpO2I/KEgoSChIKEgoYyxkLEYuTCxhLmthKSxkLFtGLk0sRi5hYV0sYS5sYSksZCwibW91c2VvdmVyIixhLkFhKSxkLCJtb3VzZW91dCIsYS56YSksYS5lYSE9Y2EmJkgoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fEgoYyxkLCJkYmxjbGljayIsYS5KYSksYS5nYXx8KGEuZ2E9bmV3IHBkKGEpLHpiKGEsbGEoQWIsYS5nYSkpKSkpOihxYyhxYyhxYyhxYyhjLGQsRi5MLGEua2EpLGQsW0YuTSxGLmFhXSxhLmxhKSxkLCJtb3VzZW92ZXIiLGEuQWEpLGQsIm1vdXNlb3V0IixhLnphKSxhLmVhIT1jYSYmcWMoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fHFjKGMsZCwiZGJsY2xpY2siLGEuSmEpLEFiKGEuZ2EpLGEuZ2E9bnVsbCkpfTsKTi5wcm90b3R5cGUuUD1mdW5jdGlvbigpe04uaS5QLmNhbGwodGhpcyk7dGhpcy5XJiZGYyh0aGlzLlcpO3RoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJmtkKHRoaXMsITEpfTtOLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7Ti5pLnUuY2FsbCh0aGlzKTt0aGlzLlcmJih0aGlzLlcuTigpLGRlbGV0ZSB0aGlzLlcpO2RlbGV0ZSB0aGlzLkI7dGhpcy5nYT10aGlzLndhPXRoaXMuYmE9bnVsbH07dmFyIGhkPWZ1bmN0aW9uKGEsYil7YS5iYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm8mMSl9OwpOLnByb3RvdHlwZS5aPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYjtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0VuYWJsZWQmJiFiLmlzRW5hYmxlZCgpfHwhTyh0aGlzLDEsIWEpfHwoYXx8KHFkKHRoaXMsITEpLFAodGhpcywhMSkpLHRoaXMuaXNWaXNpYmxlKCkmJmtkKHRoaXMsYSksUSh0aGlzLDEsIWEsITApKX07CnZhciBQPWZ1bmN0aW9uKGEsYil7TyhhLDIsYikmJlEoYSwyLGIpfSxxZD1mdW5jdGlvbihhLGIpe08oYSw0LGIpJiZRKGEsNCxiKX0scmQ9ZnVuY3Rpb24oYSxiKXtPKGEsOCxiKSYmUShhLDgsYil9LHNkPWZ1bmN0aW9uKGEsYil7TyhhLDY0LGIpJiZRKGEsNjQsYil9LFE9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIWQmJjE9PWIpYS5aKCFjKTtlbHNlIGlmKGEudiZiJiZjIT0hIShhLm8mYikpe3ZhciBlPWEuQjtpZihkPWEuZigpKShlPW1kKGUsYikpJiZnZChhLGUsYyksbGQoZCxiLGMpO2Eubz1jP2Eub3xiOmEubyZ+Yn19LHRkPWZ1bmN0aW9uKGEsYixjKXtpZihhLm0mJmEubyZiJiYhYyl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTshYyYmYS5vJmImJlEoYSxiLCExKTthLnY9Yz9hLnZ8YjphLnYmfmJ9LFI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hISgyNTUmYikmJiEhKGEudiZiKX0sTz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuISEoYS52JmIpJiYhIShhLm8mCmIpIT1jJiYoIShhLksmYil8fHVjKGEsS2MoYixjKSkpJiYhYS5VfTtoPU4ucHJvdG90eXBlO2guQWE9ZnVuY3Rpb24oYSl7KCFhLnJlbGF0ZWRUYXJnZXR8fCFwYih0aGlzLmYoKSxhLnJlbGF0ZWRUYXJnZXQpKSYmdWModGhpcywiZW50ZXIiKSYmdGhpcy5pc0VuYWJsZWQoKSYmUih0aGlzLDIpJiZQKHRoaXMsITApfTtoLnphPWZ1bmN0aW9uKGEpe2EucmVsYXRlZFRhcmdldCYmcGIodGhpcy5mKCksYS5yZWxhdGVkVGFyZ2V0KXx8IXVjKHRoaXMsImxlYXZlIil8fChSKHRoaXMsNCkmJnFkKHRoaXMsITEpLFIodGhpcywyKSYmUCh0aGlzLCExKSl9O2guZWE9Y2E7Cmgua2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSxPYihhKSYmISh5JiZ6JiZhLmN0cmxLZXkpKSl7Uih0aGlzLDQpJiZxZCh0aGlzLCEwKTt2YXIgYjtpZihiPXRoaXMuQil7dmFyIGM7Yj10aGlzLnYmMzImJihjPXRoaXMuZigpKT9zYihjKSYmdGIoYyk6ITF9YiYmdGhpcy5mKCkuZm9jdXMoKX0hT2IoYSl8fHkmJnomJmEuY3RybEtleXx8YS5nKCl9O2gubGE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSx0aGlzLm8mNCYmdWQodGhpcyxhKSYmUih0aGlzLDQpJiZxZCh0aGlzLCExKSl9O2guSmE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmdWQodGhpcyxhKX07CnZhciB1ZD1mdW5jdGlvbihhLGIpe2lmKFIoYSwxNikpe3ZhciBjPSEoYS5vJjE2KTtPKGEsMTYsYykmJlEoYSwxNixjKX1SKGEsOCkmJnJkKGEsITApO1IoYSw2NCkmJnNkKGEsIShhLm8mNjQpKTtjPW5ldyBFKCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuQT1iLkEpO3JldHVybiB1YyhhLGMpfTtOLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe1IodGhpcywzMikmJk8odGhpcywzMiwhMCkmJlEodGhpcywzMiwhMCl9O04ucHJvdG90eXBlLkZhPWZ1bmN0aW9uKCl7Uih0aGlzLDQpJiZxZCh0aGlzLCExKTtSKHRoaXMsMzIpJiZPKHRoaXMsMzIsITEpJiZRKHRoaXMsMzIsITEpfTsKTi5wcm90b3R5cGUuZmE9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJjEzPT1hLmMmJnVkKHRoaXMsYSk/KGEuZygpLGEuaigpLCEwKTohMX07aWYoIWlhKE4pKXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBjbGFzcyAiK04pO2lmKCFpYShNKSl0aHJvdyBFcnJvcigiSW52YWxpZCByZW5kZXJlciBjbGFzcyAiK00pO3ZhciB2ZD1OW2phXXx8KE5bamFdPSsra2EpO1djW3ZkXT1NO1ZjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIHBkPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9ITE7dGhpcy5jPW5ldyBvYyh0aGlzKTt6Yih0aGlzLGxhKEFiLHRoaXMuYykpO2E9TmModGhpcy5iKTtIKEgoSCh0aGlzLmMsYSxGLkwsdGhpcy5oKSxhLEYuTSx0aGlzLmopLGEsImNsaWNrIix0aGlzLmcpfTtuKHBkLEMpO3ZhciB3ZD0hdnx8OTw9TnVtYmVyKGliKTsKcGQucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXt0aGlzLmE9ITF9O3BkLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7dGhpcy5hPSEwfTt2YXIgeGQ9ZnVuY3Rpb24oYSxiKXtpZighd2QpcmV0dXJuIGEuYnV0dG9uPTAsYS50eXBlPWIsYTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudHMiKTtjLmluaXRNb3VzZUV2ZW50KGIsYS5idWJibGVzLGEuY2FuY2VsYWJsZSxhLnZpZXd8fG51bGwsYS5kZXRhaWwsYS5zY3JlZW5YLGEuc2NyZWVuWSxhLmNsaWVudFgsYS5jbGllbnRZLGEuY3RybEtleSxhLmFsdEtleSxhLnNoaWZ0S2V5LGEubWV0YUtleSwwLGEucmVsYXRlZFRhcmdldHx8bnVsbCk7cmV0dXJuIGN9OwpwZC5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXtpZih0aGlzLmEpdGhpcy5hPSExO2Vsc2V7dmFyIGI9YS5iLGM9Yi5idXR0b24sZD1iLnR5cGUsZT14ZChiLCJtb3VzZWRvd24iKTt0aGlzLmIua2EobmV3IEcoZSxhLmEpKTtlPXhkKGIsIm1vdXNldXAiKTt0aGlzLmIubGEobmV3IEcoZSxhLmEpKTt3ZHx8KGIuYnV0dG9uPWMsYi50eXBlPWQpfX07cGQucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt0aGlzLmI9bnVsbDtwZC5pLnUuY2FsbCh0aGlzKX07dmFyIFM9ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO3RoaXMuZGE9Ynx8WGMuUigpO3RoaXMuSD1hfHwidmVydGljYWwifTtuKFMsSyk7aD1TLnByb3RvdHlwZTtoLkRhPW51bGw7aC5jYT1udWxsO2guZGE9bnVsbDtoLkg9bnVsbDtoLlQ9ITA7aC5PPSEwO2gubD0tMTtoLnM9bnVsbDtoLlY9ITE7aC5JPW51bGw7dmFyIHlkPWZ1bmN0aW9uKGEpe3JldHVybiBhLkRhfHxhLmYoKX07aD1TLnByb3RvdHlwZTtoLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPXRoaXMuai5iKCJESVYiLHRoaXMuZGEuYyh0aGlzKS5qb2luKCIgIikpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKGEpe3JldHVybiJESVYiPT1hLnRhZ05hbWV9O2gudmE9ZnVuY3Rpb24oYSl7dGhpcy5hPSRjKHRoaXMuZGEsdGhpcyxhKTsibm9uZSI9PWEuc3R5bGUuZGlzcGxheSYmKHRoaXMuVD0hMSl9OwpoLkQ9ZnVuY3Rpb24oKXtTLmkuRC5jYWxsKHRoaXMpO1FjKHRoaXMsZnVuY3Rpb24oYil7Yi5tJiZ6ZCh0aGlzLGIpfSx0aGlzKTt2YXIgYT10aGlzLmYoKTtiZCh0aGlzLmRhLHRoaXMpO0FkKHRoaXMsdGhpcy5UKTtIKEgoSChIKEgoSChIKEgoT2ModGhpcyksdGhpcywiZW50ZXIiLHRoaXMuV2EpLHRoaXMsImhpZ2hsaWdodCIsdGhpcy5YYSksdGhpcywidW5oaWdobGlnaHQiLHRoaXMuY2IpLHRoaXMsIm9wZW4iLHRoaXMuWWEpLHRoaXMsImNsb3NlIix0aGlzLlVhKSxhLEYuTCx0aGlzLlNhKSxxYihhKSxbRi5NLEYuYWFdLHRoaXMuVmEpLGEsW0YuTCxGLk0sRi5hYSwibW91c2VvdmVyIiwibW91c2VvdXQiLCJjb250ZXh0bWVudSJdLHRoaXMuVGEpO0JkKHRoaXMpfTt2YXIgQmQ9ZnVuY3Rpb24oYSl7dmFyIGI9T2MoYSksYz15ZChhKTtIKEgoSChiLGMsImZvY3VzIixhLkhhKSxjLCJibHVyIixhLlFhKSxhLmNhfHwoYS5jYT1uZXcgSih5ZChhKSkpLCJrZXkiLGEuUmEpfTtoPVMucHJvdG90eXBlOwpoLlA9ZnVuY3Rpb24oKXtDZCh0aGlzLC0xKTt0aGlzLnMmJnNkKHRoaXMucywhMSk7dGhpcy5WPSExO1MuaS5QLmNhbGwodGhpcyl9O2gudT1mdW5jdGlvbigpe1MuaS51LmNhbGwodGhpcyk7dGhpcy5jYSYmKHRoaXMuY2EuTigpLHRoaXMuY2E9bnVsbCk7dGhpcy5kYT10aGlzLnM9dGhpcy5JPXRoaXMuRGE9bnVsbH07aC5XYT1mdW5jdGlvbigpe3JldHVybiEwfTsKaC5YYT1mdW5jdGlvbihhKXt2YXIgYj1UYyh0aGlzLGEudGFyZ2V0KTtpZigtMTxiJiZiIT10aGlzLmwpe3ZhciBjPUwodGhpcyx0aGlzLmwpO2MmJlAoYywhMSk7dGhpcy5sPWI7Yz1MKHRoaXMsdGhpcy5sKTt0aGlzLlYmJnFkKGMsITApO3RoaXMucyYmYyE9dGhpcy5zJiYoYy52JjY0P3NkKGMsITApOnNkKHRoaXMucywhMSkpfWI9dGhpcy5mKCk7cShiLCJUaGUgRE9NIGVsZW1lbnQgZm9yIHRoZSBjb250YWluZXIgY2Fubm90IGJlIG51bGwuIik7bnVsbCE9YS50YXJnZXQuZigpJiZ4YihiLCJhY3RpdmVkZXNjZW5kYW50IixhLnRhcmdldC5mKCkuaWQpfTtoLmNiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT1MKHRoaXMsdGhpcy5sKSYmKHRoaXMubD0tMSk7YT10aGlzLmYoKTtxKGEsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnJlbW92ZUF0dHJpYnV0ZSh3YigiYWN0aXZlZGVzY2VuZGFudCIpKX07CmguWWE9ZnVuY3Rpb24oYSl7KGE9YS50YXJnZXQpJiZhIT10aGlzLnMmJmEuYj09dGhpcyYmKHRoaXMucyYmc2QodGhpcy5zLCExKSx0aGlzLnM9YSl9O2guVWE9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMucyYmKHRoaXMucz1udWxsKTt2YXIgYj10aGlzLmYoKSxjPWEudGFyZ2V0LmYoKTtiJiZhLnRhcmdldC5vJjImJmMmJihhPSIiLGMmJihhPWMuaWQscShhLCJUaGUgYWN0aXZlIGVsZW1lbnQgc2hvdWxkIGhhdmUgYW4gaWQuIikpLHhiKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEpKX07aC5TYT1mdW5jdGlvbihhKXt0aGlzLk8mJih0aGlzLlY9ITApO3ZhciBiPXlkKHRoaXMpO2ImJnNiKGIpJiZ0YihiKT9iLmZvY3VzKCk6YS5nKCl9O2guVmE9ZnVuY3Rpb24oKXt0aGlzLlY9ITF9OwpoLlRhPWZ1bmN0aW9uKGEpe2E6e3ZhciBiPWEudGFyZ2V0O2lmKHRoaXMuSSlmb3IodmFyIGM9dGhpcy5mKCk7YiYmYiE9PWM7KXt2YXIgZD1iLmlkO2lmKGQgaW4gdGhpcy5JKXtiPXRoaXMuSVtkXTticmVhayBhfWI9Yi5wYXJlbnROb2RlfWI9bnVsbH1pZihiKXN3aXRjaChhLnR5cGUpe2Nhc2UgRi5MOmIua2EoYSk7YnJlYWs7Y2FzZSBGLk06Y2FzZSBGLmFhOmIubGEoYSk7YnJlYWs7Y2FzZSAibW91c2VvdmVyIjpiLkFhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3V0IjpiLnphKGEpO2JyZWFrO2Nhc2UgImNvbnRleHRtZW51IjpiLmVhKGEpfX07aC5IYT1mdW5jdGlvbigpe307aC5RYT1mdW5jdGlvbigpe0NkKHRoaXMsLTEpO3RoaXMuVj0hMTt0aGlzLnMmJnNkKHRoaXMucywhMSl9OwpoLlJhPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmlzRW5hYmxlZCgpJiZ0aGlzLmlzVmlzaWJsZSgpJiYoMCE9UmModGhpcyl8fHRoaXMuRGEpJiZEZCh0aGlzLGEpPyhhLmcoKSxhLmooKSwhMCk6ITF9Owp2YXIgRGQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1MKGEsYS5sKTtpZihjJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5mYSYmYy5mYShiKXx8YS5zJiZhLnMhPWMmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLnMuZmEmJmEucy5mYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuYyl7Y2FzZSAyNzp5ZChhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpFZChhKTticmVhaztjYXNlIDM1OkZkKGEpO2JyZWFrO2Nhc2UgMzg6aWYoInZlcnRpY2FsIj09YS5IKUdkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9IZChhKTpHZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoInZlcnRpY2FsIj09YS5IKUhkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9HZChhKTpIZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSx6ZD1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZigpO2M9Yy5pZHx8KGMuaWQ9TGMoYikpO2EuSXx8KGEuST17fSk7YS5JW2NdPWJ9O1MucHJvdG90eXBlLnNhPWZ1bmN0aW9uKGEsYil7Q2EoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtTLmkuc2EuY2FsbCh0aGlzLGEsYil9O1MucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEsYixjKXtDYShhLE4pO2EuS3w9MjthLkt8PTY0O3RkKGEsMzIsITEpO2EubSYmMCE9YS55YSYmb2QoYSwhMSk7YS55YT0hMTt2YXIgZD1hLmI9PXRoaXM/VGModGhpcyxhKTotMTtTLmkudGEuY2FsbCh0aGlzLGEsYixjKTthLm0mJnRoaXMubSYmemQodGhpcyxhKTthPWQ7LTE9PWEmJihhPVJjKHRoaXMpKTthPT10aGlzLmw/dGhpcy5sPU1hdGgubWluKFJjKHRoaXMpLTEsYik6YT50aGlzLmwmJmI8PXRoaXMubD90aGlzLmwrKzphPHRoaXMubCYmYj50aGlzLmwmJnRoaXMubC0tfTsKdmFyIGFkPWZ1bmN0aW9uKGEsYil7aWYoYS5mKCkpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5IPWJ9O1MucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O3ZhciBBZD1mdW5jdGlvbihhLGIpe2EuVD1iO3ZhciBjPWEuZigpO2MmJihjLnN0eWxlLmRpc3BsYXk9Yj8iIjoibm9uZSIsWWMoeWQoYSksYS5PJiZhLlQpKX07Uy5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT307Uy5wcm90b3R5cGUuWj1mdW5jdGlvbihhKXt0aGlzLk8hPWEmJnVjKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5PPSEwLFFjKHRoaXMsZnVuY3Rpb24oYil7Yi5MYT9kZWxldGUgYi5MYTpiLlooITApfSkpOihRYyh0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5aKCExKTpiLkxhPSEwfSksdGhpcy5WPXRoaXMuTz0hMSksWWMoeWQodGhpcyksYSYmdGhpcy5UKSl9Owp2YXIgQ2Q9ZnVuY3Rpb24oYSxiKXsoYj1MKGEsYikpP1AoYiwhMCk6LTE8YS5sJiZQKEwoYSxhLmwpLCExKX0sRWQ9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LFJjKGEpLTEpfSxGZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiAwPmI/Yy0xOmJ9LDApfSxIZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7cmV0dXJuKGIrMSklY30sYS5sKX0sR2Q9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe2ItLTtyZXR1cm4gMD5iP2MtMTpifSxhLmwpfSxJZD1mdW5jdGlvbihhLGIsYyl7Yz0wPmM/VGMoYSxhLnMpOmM7dmFyIGQ9UmMoYSk7Yz1iLmNhbGwoYSxjLGQpO2Zvcih2YXIgZT0wO2U8PWQ7KXt2YXIgZj1MKGEsYyksZztpZihnPWYpZz1mLmlzVmlzaWJsZSgpJiZmLmlzRW5hYmxlZCgpJiYhIShmLnYmMik7aWYoZyl7YS5FYShjKTticmVha31lKys7Yz1iLmNhbGwoYSxjLGQpfX07ClMucHJvdG90eXBlLkVhPWZ1bmN0aW9uKGEpe0NkKHRoaXMsYSl9O3ZhciBUPWZ1bmN0aW9uKCl7fTtuKFQsTSk7ZGEoVCk7VC5wcm90b3R5cGUuYT1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYiJ9O1QucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXtyZXR1cm4idGFiIn07VC5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYj1ULmkuYy5jYWxsKHRoaXMsYSk7KGE9YS5QYSkmJmImJihiLnRpdGxlPWF8fCIiKTtyZXR1cm4gYn07VC5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIpe2I9VC5pLmcuY2FsbCh0aGlzLGEsYik7dmFyIGM9Yi50aXRsZXx8IiI7YyYmKGEuUGE9Yyk7YS5vJjgmJihjPWEuYikmJmlhKGMuRykmJihRKGEsOCwhMSksYy5HKGEpKTtyZXR1cm4gYn07dmFyIEpkPWZ1bmN0aW9uKGEsYixjKXtOLmNhbGwodGhpcyxhLGJ8fFQuUigpLGMpO3RkKHRoaXMsOCwhMCk7dGhpcy5LfD05fTtuKEpkLE4pO1ZjKCJnb29nLXRhYiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEpkKG51bGwpfSk7dmFyIFU9ZnVuY3Rpb24oKXt0aGlzLmg9InRhYmxpc3QifTtuKFUsWGMpO2RhKFUpO1UucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWItYmFyIn07VS5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIsYyl7dGhpcy5qfHwodGhpcy5hfHxLZCh0aGlzKSx0aGlzLmo9c2EodGhpcy5hKSk7dmFyIGQ9dGhpcy5qW2JdO2Q/KGFkKGEsTGQoZCkpLGEuQj1kKTpVLmkuZy5jYWxsKHRoaXMsYSxiLGMpfTtVLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPVUuaS5jLmNhbGwodGhpcyxhKTt0aGlzLmF8fEtkKHRoaXMpO2IucHVzaCh0aGlzLmFbYS5CXSk7cmV0dXJuIGJ9O3ZhciBLZD1mdW5jdGlvbihhKXt2YXIgYj1hLmIoKTthLmE9e3RvcDpiKyItdG9wIixib3R0b206YisiLWJvdHRvbSIsc3RhcnQ6YisiLXN0YXJ0IixlbmQ6YisiLWVuZCJ9fTt2YXIgVj1mdW5jdGlvbihhLGIsYyl7YT1hfHwidG9wIjthZCh0aGlzLExkKGEpKTt0aGlzLkI9YTtTLmNhbGwodGhpcyx0aGlzLkgsYnx8VS5SKCksYyk7TWQodGhpcyl9O24oVixTKTtoPVYucHJvdG90eXBlO2guQz1udWxsO2guRD1mdW5jdGlvbigpe1YuaS5ELmNhbGwodGhpcyk7TWQodGhpcyl9O2gudT1mdW5jdGlvbigpe1YuaS51LmNhbGwodGhpcyk7dGhpcy5DPW51bGx9O2guRWE9ZnVuY3Rpb24oYSl7Vi5pLkVhLmNhbGwodGhpcyxhKTt0aGlzLkcoTCh0aGlzLGEpKX07aC5HPWZ1bmN0aW9uKGEpe2E/cmQoYSwhMCk6dGhpcy5DJiZyZCh0aGlzLkMsITEpfTsKdmFyIE5kPWZ1bmN0aW9uKGEsYil7aWYoYiYmYj09YS5DKXtmb3IodmFyIGM9VGMoYSxiKSxkPWMtMTtiPUwoYSxkKTtkLS0pe3ZhciBlPWI7aWYoZS5pc1Zpc2libGUoKSYmZS5pc0VuYWJsZWQoKSl7YS5HKGIpO3JldHVybn19Zm9yKGMrPTE7Yj1MKGEsYyk7YysrKWlmKGQ9YixkLmlzVmlzaWJsZSgpJiZkLmlzRW5hYmxlZCgpKXthLkcoYik7cmV0dXJufWEuRyhudWxsKX19O2g9Vi5wcm90b3R5cGU7aC5hYj1mdW5jdGlvbihhKXt0aGlzLkMmJnRoaXMuQyE9YS50YXJnZXQmJnJkKHRoaXMuQywhMSk7dGhpcy5DPWEudGFyZ2V0fTtoLmJiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT10aGlzLkMmJih0aGlzLkM9bnVsbCl9O2guWmE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guJGE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guSGE9ZnVuY3Rpb24oKXtMKHRoaXMsdGhpcy5sKXx8Q2QodGhpcyxUYyh0aGlzLHRoaXMuQ3x8TCh0aGlzLDApKSl9Owp2YXIgTWQ9ZnVuY3Rpb24oYSl7SChIKEgoSChPYyhhKSxhLCJzZWxlY3QiLGEuYWIpLGEsInVuc2VsZWN0IixhLmJiKSxhLCJkaXNhYmxlIixhLlphKSxhLCJoaWRlIixhLiRhKX0sTGQ9ZnVuY3Rpb24oYSl7cmV0dXJuInN0YXJ0Ij09YXx8ImVuZCI9PWE/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O1ZjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBWfSk7ZnVuY3Rpb24gT2QoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIFBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgZz1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIrZyk7Zm9yKHZhciBrPVtdLHA9YmEoYyksdz1wLm5leHQoKTshdy5kb25lO3c9cC5uZXh0KCkpe3c9dy52YWx1ZTt2YXIgQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKQi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO0IudGV4dENvbnRlbnQ9dztmLmFwcGVuZENoaWxkKEIpO2sucHVzaChCKX0iYm90dG9tIiE9ZyYmZS5hcHBlbmRDaGlsZChmKTtwPW51bGw7aWYoInRvcCI9PWd8fCJib3R0b20iPT1nKXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTsidG9wIj09ZyYmcCYmZS5hcHBlbmRDaGlsZChwKTtCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0IuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciByYT1bXTtjPWJhKGMpO2Zvcih3PWMubmV4dCgpOyF3LmRvbmU7dz1jLm5leHQoKSl3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHcuaWQ9ZS5pZCsiX2NvbnRlbnRfIityYS5sZW5ndGgsdy5zdHlsZS5kaXNwbGF5PSJub25lIixCLmFwcGVuZENoaWxkKHcpLHJhLnB1c2godyk7ZS5hcHBlbmRDaGlsZChCKTsiYm90dG9tIj09ZyYmKHAmJgplLmFwcGVuZENoaWxkKHApLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBYPW5ldyBWKGcpO1BjKFgsZik7dmFyIFk9LTE7ZGMoWCwic2VsZWN0IixmdW5jdGlvbihaKXtaPWsuaW5kZXhPZihaLnRhcmdldC5mKCkpO1ohPVkmJigwPD1ZJiZZPHJhLmxlbmd0aCYmKHJhW1ldLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFk9LTEpLDA8PVomJlo8cmEubGVuZ3RoJiYoWT1aLHJhW1ldLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksWC5HKEwoWCxZKSkpfSk7WC5HKEwoWCxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFope1guRyhMKFgsWikpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChPZChhKSl9LFFkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sVz1sOwpRZFswXWluIFd8fCJ1bmRlZmluZWQiPT10eXBlb2YgVy5leGVjU2NyaXB0fHxXLmV4ZWNTY3JpcHQoInZhciAiK1FkWzBdKTtmb3IodmFyIFJkO1FkLmxlbmd0aCYmKFJkPVFkLnNoaWZ0KCkpOylRZC5sZW5ndGh8fHZvaWQgMD09PVBkP1dbUmRdJiZXW1JkXSE9PU9iamVjdC5wcm90b3R5cGVbUmRdP1c9V1tSZF06Vz1XW1JkXT17fTpXW1JkXT1QZDt9KS5jYWxsKHRoaXMpOwovLyBjbGFuZy1mb3JtYXQgb24K", + "headers": [ + [ + "content-type", + "application/javascript" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + } + } + }, + "executionInfo": { + "elapsed": 1666, + "status": "ok", + "timestamp": 1600709741092, + "user": { + "displayName": "Evgeny Skvortsov", + "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhiQjODaOVLfYnUuWS9rB3LRntzJDM0hqElzsUkdQ=s64", + "userId": "11510585406840398626" + }, + "user_tz": 420 + }, + "id": "Q5T6DTA_fqwR", + "outputId": "7d7a88dc-cf80-40e3-9fab-9a5c194fc2c9" + }, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id61" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id61" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id61" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"dda87c34-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id61\", \"tabNames\": [\"OrgStats\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_2df8080d57" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id61" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"dda8ec6e-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id61\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_df50c115fa" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id61" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"ddaa8786-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_e6b55cd2eb" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_1", + "outputarea_id61" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"ddaacdcc-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id61_content_1\");\n", + "//# sourceURL=js_220c4ac515" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_1", + "outputarea_id61" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"ddab29ca-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ddaacdcc-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_ff74144bb6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_1", + "outputarea_id61" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"ddab6f66-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id61\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_1d4ec7c4c3" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_1", + "outputarea_id61" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running OrgStats\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"ddaeed1c-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ddaa8786-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_8f001a182f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_1", + "outputarea_id61" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"ddb14b3e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_128c776b4a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_0", + "outputarea_id61" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"ddb1c4ba-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id61_content_0\");\n", + "//# sourceURL=js_a95d06798d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_0", + "outputarea_id61" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"ddb3c788-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ddb1c4ba-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_fbd6d68ad6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_0", + "outputarea_id61" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"ddb40414-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id61\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_fef48a9c01" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_0", + "outputarea_id61" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_0", + "outputarea_id61", + "outputarea_id62", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_0", + "outputarea_id61", + "outputarea_id62", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_0", + "outputarea_id61", + "outputarea_id62", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"ddb56930-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id62\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_ee577f93c2" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_0", + "outputarea_id61", + "outputarea_id62", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"ddb5c9f2-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id62\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_009d4959b7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_0", + "outputarea_id61", + "outputarea_id62", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"ddb6e76a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_328a047e61" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_0", + "id62_content_0", + "outputarea_id61", + "outputarea_id62", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"ddb74de0-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id62_content_0\");\n", + "//# sourceURL=js_1ea4c85ce9" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_0", + "id62_content_0", + "outputarea_id61", + "outputarea_id62", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"ddb78990-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ddb74de0-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_2e67e52426" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_0", + "id62_content_0", + "outputarea_id61", + "outputarea_id62", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"ddb7f75e-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id62\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_065aa9ae80" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_0", + "id62_content_0", + "outputarea_id61", + "outputarea_id62", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mOrgStats_sql\u001b[0m variable.\n", + "WITH t_0_AnonymizedCodeContribution AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " [110, 220, 405] AS cl_lengths,\n", + " \"ads\" AS org\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " [30, 51, 95] AS cl_lengths,\n", + " \"ads\" AS org\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " [10, 20, 1000] AS cl_lengths,\n", + " \"games\" AS org\n", + " \n", + ") )\n", + "SELECT\n", + " AnonymizedCodeContribution.org AS org,\n", + " AVG(x_5) AS mean_cl_size,\n", + " ((SUM(1)) / (SUM(((1) / (x_5))))) AS harmonic_mean_cl_size\n", + "FROM\n", + " t_0_AnonymizedCodeContribution AS AnonymizedCodeContribution, UNNEST(AnonymizedCodeContribution.cl_lengths) as x_5\n", + "GROUP BY org;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"ddb8d8cc-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ddb6e76a-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_c54e8ead64" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_0", + "id62_content_0", + "outputarea_id61", + "outputarea_id62", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"ddb9ffe0-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ddb14b3e-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_77baf94f92" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_0", + "outputarea_id61" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"ddbb88c4-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_bf959bb361" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_1", + "outputarea_id61" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"ddbbcbc2-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id61_content_1\");\n", + "//# sourceURL=js_d67d842093" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_1", + "outputarea_id61" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"ddbc3404-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ddbbcbc2-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_680297fa76" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_1", + "outputarea_id61" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"ddbc7310-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id61\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_c819084e6f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_1", + "outputarea_id61" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"de686f6c-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ddbb88c4-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_e4010041c4" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_1", + "outputarea_id61" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"de6a5426-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_8d3f77a117" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_0", + "outputarea_id61" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"de6ab5d8-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id61_content_0\");\n", + "//# sourceURL=js_8111b56073" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_0", + "outputarea_id61" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"de6b0c9a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"de6ab5d8-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_a336fd762b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_0", + "outputarea_id61" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"de6b5358-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id61\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_d921ecad8f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_0", + "outputarea_id61" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"de6cff3c-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_c5f3e405e8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_0", + "id62_content_1", + "outputarea_id61", + "outputarea_id62", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"de6d8a42-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id62_content_1\");\n", + "//# sourceURL=js_9c47c53377" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_0", + "id62_content_1", + "outputarea_id61", + "outputarea_id62", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"de6df932-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"de6d8a42-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_62490b48eb" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_0", + "id62_content_1", + "outputarea_id61", + "outputarea_id62", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"de6e725e-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id62\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_36235fa99f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_0", + "id62_content_1", + "outputarea_id61", + "outputarea_id62", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mOrgStats\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
orgmean_cl_sizeharmonic_mean_cl_size
0ads151.83333375.402468
1games343.33333319.867550
\n", + "
" + ], + "text/plain": [ + " org mean_cl_size harmonic_mean_cl_size\n", + "0 ads 151.833333 75.402468\n", + "1 games 343.333333 19.867550" + ] + }, + "metadata": { + "tags": [ + "id61_content_0", + "id62_content_1", + "outputarea_id61", + "outputarea_id62", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"de730af8-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"de6cff3c-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_7b3b08331d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_0", + "id62_content_1", + "outputarea_id61", + "outputarea_id62", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"de744c24-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"de6a5426-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_13203165e1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id61_content_0", + "outputarea_id61" + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "%%logica OrgStats\n", + "\n", + "AnonymizedCodeContribution(cl_lengths: [110, 220, 405], org: \"ads\");\n", + "AnonymizedCodeContribution(cl_lengths: [30, 51, 95], org: \"ads\");\n", + "AnonymizedCodeContribution(cl_lengths: [10, 20, 1000], org: \"games\");\n", + "\n", + "HarmonicMean(x) = Sum(1) / Sum(1 / x);\n", + "\n", + "OrgStats(\n", + " org:,\n", + " mean_cl_size? Avg= cl_size,\n", + " harmonic_mean_cl_size? HarmonicMean= cl_size) distinct :-\n", + " AnonymizedCodeContribution(cl_lengths:, org:),\n", + " cl_size in cl_lengths;\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "08a0mLwQBCpb" + }, + "source": [ + "### Inifinite predicates\n", + "\n", + "Predicates defined above all had a finite number of records.\n", + "\n", + "Here we define and use an infinite predicate IsEngineer that mathematically is the set of all possible records with role equal to \"Eng\"." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 208, + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH0=", + "headers": [ + [ + "content-type", + "text/css" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgaCxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9ZnVuY3Rpb24oYSl7dmFyIGI9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmYVtTeW1ib2wuaXRlcmF0b3JdO3JldHVybiBiP2IuY2FsbChhKTp7bmV4dDphYShhKX19LGw9dGhpc3x8c2VsZixjYT1mdW5jdGlvbigpe30sZGE9ZnVuY3Rpb24oYSl7YS5CYT12b2lkIDA7YS5SPWZ1bmN0aW9uKCl7cmV0dXJuIGEuQmE/YS5CYTphLkJhPW5ldyBhfX0sZWE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7aWYoIm9iamVjdCI9PWIpaWYoYSl7aWYoYSBpbnN0YW5jZW9mIEFycmF5KXJldHVybiJhcnJheSI7aWYoYSBpbnN0YW5jZW9mIE9iamVjdClyZXR1cm4gYjt2YXIgYz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk7aWYoIltvYmplY3QgV2luZG93XSI9PWMpcmV0dXJuIm9iamVjdCI7CmlmKCJbb2JqZWN0IEFycmF5XSI9PWN8fCJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGgmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5zcGxpY2UmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoInNwbGljZSIpKXJldHVybiJhcnJheSI7aWYoIltvYmplY3QgRnVuY3Rpb25dIj09Y3x8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmNhbGwmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoImNhbGwiKSlyZXR1cm4iZnVuY3Rpb24ifWVsc2UgcmV0dXJuIm51bGwiO2Vsc2UgaWYoImZ1bmN0aW9uIj09YiYmInVuZGVmaW5lZCI9PXR5cGVvZiBhLmNhbGwpcmV0dXJuIm9iamVjdCI7cmV0dXJuIGJ9LGZhPWZ1bmN0aW9uKGEpe3JldHVybiJhcnJheSI9PWVhKGEpfSxoYT1mdW5jdGlvbihhKXt2YXIgYj1lYShhKTtyZXR1cm4iYXJyYXkiPT1ifHwib2JqZWN0Ij09CmImJiJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGh9LGlhPWZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PWVhKGEpfSxtPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBhO3JldHVybiJvYmplY3QiPT1iJiZudWxsIT1hfHwiZnVuY3Rpb24iPT1ifSxqYT0iY2xvc3VyZV91aWRfIisoMUU5Kk1hdGgucmFuZG9tKCk+Pj4wKSxrYT0wLGxhPWZ1bmN0aW9uKGEsYil7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe3ZhciBkPWMuc2xpY2UoKTtkLnB1c2guYXBwbHkoZCxhcmd1bWVudHMpO3JldHVybiBhLmFwcGx5KHRoaXMsZCl9fSxuPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe31jLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLmk9Yi5wcm90b3R5cGU7YS5wcm90b3R5cGU9bmV3IGM7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YX07dmFyIG1hLG5hPXtlYjoiYWN0aXZlZGVzY2VuZGFudCIsamI6ImF0b21pYyIsa2I6ImF1dG9jb21wbGV0ZSIsbWI6ImJ1c3kiLHBiOiJjaGVja2VkIixxYjoiY29saW5kZXgiLHZiOiJjb250cm9scyIseGI6ImRlc2NyaWJlZGJ5IixBYjoiZGlzYWJsZWQiLENiOiJkcm9wZWZmZWN0IixEYjoiZXhwYW5kZWQiLEViOiJmbG93dG8iLEdiOiJncmFiYmVkIixLYjoiaGFzcG9wdXAiLE1iOiJoaWRkZW4iLE9iOiJpbnZhbGlkIixQYjoibGFiZWwiLFFiOiJsYWJlbGxlZGJ5IixSYjoibGV2ZWwiLFdiOiJsaXZlIixrYzoibXVsdGlsaW5lIixsYzoibXVsdGlzZWxlY3RhYmxlIixwYzoib3JpZW50YXRpb24iLHFjOiJvd25zIixyYzoicG9zaW5zZXQiLHRjOiJwcmVzc2VkIix4YzoicmVhZG9ubHkiLHpjOiJyZWxldmFudCIsQWM6InJlcXVpcmVkIixFYzoicm93aW5kZXgiLEhjOiJzZWxlY3RlZCIsSmM6InNldHNpemUiLExjOiJzb3J0IixaYzoidmFsdWVtYXgiLCRjOiJ2YWx1ZW1pbiIsYWQ6InZhbHVlbm93IiwKYmQ6InZhbHVldGV4dCJ9O3ZhciBvYT1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkIGluIGEpYi5jYWxsKGMsYVtkXSxkLGEpfSxwYT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyBpbiBhKWlmKGFbY109PWIpcmV0dXJuITA7cmV0dXJuITF9LHFhPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsIT09YSYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfSxzYT1mdW5jdGlvbihhKXt2YXIgYj17fSxjO2ZvcihjIGluIGEpYlthW2NdXT1jO3JldHVybiBifSx0YT0iY29uc3RydWN0b3IgaGFzT3duUHJvcGVydHkgaXNQcm90b3R5cGVPZiBwcm9wZXJ0eUlzRW51bWVyYWJsZSB0b0xvY2FsZVN0cmluZyB0b1N0cmluZyB2YWx1ZU9mIi5zcGxpdCgiICIpLHVhPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8dGEubGVuZ3RoO2YrKyljPQp0YVtmXSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZCxjKSYmKGFbY109ZFtjXSl9fTt2YXIgdmE9e2ZiOiJhbGVydCIsZ2I6ImFsZXJ0ZGlhbG9nIixoYjoiYXBwbGljYXRpb24iLGliOiJhcnRpY2xlIixsYjoiYmFubmVyIixuYjoiYnV0dG9uIixvYjoiY2hlY2tib3giLHJiOiJjb2x1bW5oZWFkZXIiLHNiOiJjb21ib2JveCIsdGI6ImNvbXBsZW1lbnRhcnkiLHViOiJjb250ZW50aW5mbyIsd2I6ImRlZmluaXRpb24iLHliOiJkaWFsb2ciLHpiOiJkaXJlY3RvcnkiLEJiOiJkb2N1bWVudCIsRmI6ImZvcm0iLEhiOiJncmlkIixJYjoiZ3JpZGNlbGwiLEpiOiJncm91cCIsTGI6ImhlYWRpbmciLE5iOiJpbWciLFNiOiJsaW5rIixUYjoibGlzdCIsVWI6Imxpc3Rib3giLFZiOiJsaXN0aXRlbSIsWGI6ImxvZyIsWWI6Im1haW4iLFpiOiJtYXJxdWVlIiwkYjoibWF0aCIsYWM6Im1lbnUiLGJjOiJtZW51YmFyIixjYzoibWVudWl0ZW0iLGRjOiJtZW51aXRlbWNoZWNrYm94IixlYzoibWVudWl0ZW1yYWRpbyIsbWM6Im5hdmlnYXRpb24iLG5jOiJub3RlIixvYzoib3B0aW9uIiwKc2M6InByZXNlbnRhdGlvbiIsdWM6InByb2dyZXNzYmFyIix2YzoicmFkaW8iLHdjOiJyYWRpb2dyb3VwIix5YzoicmVnaW9uIixCYzoicm93IixDYzoicm93Z3JvdXAiLERjOiJyb3doZWFkZXIiLEZjOiJzY3JvbGxiYXIiLEdjOiJzZWFyY2giLEljOiJzZXBhcmF0b3IiLEtjOiJzbGlkZXIiLE1jOiJzcGluYnV0dG9uIixOYzoic3RhdHVzIixPYzoidGFiIixQYzoidGFibGlzdCIsUWM6InRhYnBhbmVsIixSYzoidGV4dGJveCIsU2M6InRleHRpbmZvIixUYzoidGltZXIiLFVjOiJ0b29sYmFyIixWYzoidG9vbHRpcCIsV2M6InRyZWUiLFhjOiJ0cmVlZ3JpZCIsWWM6InRyZWVpdGVtIn07dmFyIHdhPWZ1bmN0aW9uKGEpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsd2EpO2Vsc2V7dmFyIGI9RXJyb3IoKS5zdGFjaztiJiYodGhpcy5zdGFjaz1iKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSl9O24od2EsRXJyb3IpO3dhLnByb3RvdHlwZS5uYW1lPSJDdXN0b21FcnJvciI7dmFyIHhhO3ZhciB5YT1mdW5jdGlvbihhLGIpe2E9YS5zcGxpdCgiJXMiKTtmb3IodmFyIGM9IiIsZD1hLmxlbmd0aC0xLGU9MDtlPGQ7ZSsrKWMrPWFbZV0rKGU8Yi5sZW5ndGg/YltlXToiJXMiKTt3YS5jYWxsKHRoaXMsYythW2RdKX07bih5YSx3YSk7eWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjsKdmFyIHphPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSJBc3NlcnRpb24gZmFpbGVkIjtpZihjKXtlKz0iOiAiK2M7dmFyIGY9ZH1lbHNlIGEmJihlKz0iOiAiK2EsZj1iKTt0aHJvdyBuZXcgeWEoIiIrZSxmfHxbXSk7fSxxPWZ1bmN0aW9uKGEsYixjKXthfHx6YSgiIixudWxsLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX0sQWE9ZnVuY3Rpb24oYSxiLGMpe20oYSkmJjE9PWEubm9kZVR5cGV8fHphKCJFeHBlY3RlZCBFbGVtZW50IGJ1dCBnb3QgJXM6ICVzLiIsW2VhKGEpLGFdLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKX0sQ2E9ZnVuY3Rpb24oYSxiLGMsZCl7YSBpbnN0YW5jZW9mIGJ8fHphKCJFeHBlY3RlZCBpbnN0YW5jZW9mICVzIGJ1dCBnb3QgJXMuIixbQmEoYiksQmEoYSldLGMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpKX0sQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZgpGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTpudWxsPT09YT8ibnVsbCI6dHlwZW9mIGF9O3ZhciBEYT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3EobnVsbCE9YS5sZW5ndGgpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKCJzdHJpbmciPT09dHlwZW9mIGEpcmV0dXJuInN0cmluZyIhPT10eXBlb2YgYnx8MSE9Yi5sZW5ndGg/LTE6YS5pbmRleE9mKGIsMCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspaWYoYyBpbiBhJiZhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX0scj1BcnJheS5wcm90b3R5cGUuZm9yRWFjaD9mdW5jdGlvbihhLGIsYyl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsYyl9OmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9YS5sZW5ndGgsZT0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZj0wO2Y8ZDtmKyspZiBpbiBlJiZiLmNhbGwoYyxlW2ZdLGYsYSl9LEVhPUFycmF5LnByb3RvdHlwZS5maWx0ZXI/CmZ1bmN0aW9uKGEsYil7cShudWxsIT1hLmxlbmd0aCk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD1bXSxlPTAsZj0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZz0wO2c8YztnKyspaWYoZyBpbiBmKXt2YXIgaz1mW2ddO2IuY2FsbCh2b2lkIDAsayxnLGEpJiYoZFtlKytdPWspfXJldHVybiBkfSxGYT1BcnJheS5wcm90b3R5cGUuZXZlcnk/ZnVuY3Rpb24oYSxiKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmV2ZXJ5LmNhbGwoYSxiLHZvaWQgMCl9OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWEubGVuZ3RoLGQ9InN0cmluZyI9PT10eXBlb2YgYT9hLnNwbGl0KCIiKTphLGU9MDtlPGM7ZSsrKWlmKGUgaW4gZCYmIWIuY2FsbCh2b2lkIDAsZFtlXSxlLGEpKXJldHVybiExO3JldHVybiEwfSxHYT1mdW5jdGlvbihhLGIpe3JldHVybiAwPD0KRGEoYSxiKX0sSGE9ZnVuY3Rpb24oYSxiKXtiPURhKGEsYik7dmFyIGM7aWYoYz0wPD1iKXEobnVsbCE9YS5sZW5ndGgpLEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhLGIsMSk7cmV0dXJuIGN9LElhPWZ1bmN0aW9uKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGFyZ3VtZW50cyl9LEphPWZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDA8Yil7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX0sTGE9ZnVuY3Rpb24oYSxiLGMsZCl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShhLEthKGFyZ3VtZW50cywxKSl9LEthPWZ1bmN0aW9uKGEsYixjKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gMj49YXJndW1lbnRzLmxlbmd0aD9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsYixjKX07dmFyIE1hPVN0cmluZy5wcm90b3R5cGUudHJpbT9mdW5jdGlvbihhKXtyZXR1cm4gYS50cmltKCl9OmZ1bmN0aW9uKGEpe3JldHVybi9eW1xzXHhhMF0qKFtcc1xTXSo/KVtcc1x4YTBdKiQvLmV4ZWMoYSlbMV19LE5hPS8mL2csT2E9LzwvZyxQYT0vPi9nLFFhPS8iL2csUmE9LycvZyxTYT0vXHgwMC9nLFRhPS9bXHgwMCY8PiInXS8sdD1mdW5jdGlvbihhLGIpe3JldHVybi0xIT1hLmluZGV4T2YoYil9LFVhPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE8Yj8tMTphPmI/MTowfTt2YXIgdTthOnt2YXIgVmE9bC5uYXZpZ2F0b3I7aWYoVmEpe3ZhciBXYT1WYS51c2VyQWdlbnQ7aWYoV2Epe3U9V2E7YnJlYWsgYX19dT0iIn07LyoKCiBDb3B5cmlnaHQgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzLgogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKKi8KdmFyIFhhPWZ1bmN0aW9uKGEpe1RhLnRlc3QoYSkmJigtMSE9YS5pbmRleE9mKCImIikmJihhPWEucmVwbGFjZShOYSwiJmFtcDsiKSksLTEhPWEuaW5kZXhPZigiPCIpJiYoYT1hLnJlcGxhY2UoT2EsIiZsdDsiKSksLTEhPWEuaW5kZXhPZigiPiIpJiYoYT1hLnJlcGxhY2UoUGEsIiZndDsiKSksLTEhPWEuaW5kZXhPZignIicpJiYoYT1hLnJlcGxhY2UoUWEsIiZxdW90OyIpKSwtMSE9YS5pbmRleE9mKCInIikmJihhPWEucmVwbGFjZShSYSwiJiMzOTsiKSksLTEhPWEuaW5kZXhPZigiXHgwMCIpJiYoYT1hLnJlcGxhY2UoU2EsIiYjMDsiKSkpO3JldHVybiBhfTt2YXIgWWE9ZnVuY3Rpb24oYSl7WWFbIiAiXShhKTtyZXR1cm4gYX07WWFbIiAiXT1jYTt2YXIgJGE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1aYTtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsYSk/Y1thXTpjW2FdPWIoYSl9O3ZhciBhYj10KHUsIk9wZXJhIiksdj10KHUsIlRyaWRlbnQiKXx8dCh1LCJNU0lFIiksYmI9dCh1LCJFZGdlIikseD10KHUsIkdlY2tvIikmJiEodCh1LnRvTG93ZXJDYXNlKCksIndlYmtpdCIpJiYhdCh1LCJFZGdlIikpJiYhKHQodSwiVHJpZGVudCIpfHx0KHUsIk1TSUUiKSkmJiF0KHUsIkVkZ2UiKSx5PXQodS50b0xvd2VyQ2FzZSgpLCJ3ZWJraXQiKSYmIXQodSwiRWRnZSIpLHo9dCh1LCJNYWNpbnRvc2giKSxjYj1mdW5jdGlvbigpe3ZhciBhPWwuZG9jdW1lbnQ7cmV0dXJuIGE/YS5kb2N1bWVudE1vZGU6dm9pZCAwfSxkYjsKYTp7dmFyIGViPSIiLGZiPWZ1bmN0aW9uKCl7dmFyIGE9dTtpZih4KXJldHVybi9ydjooW15cKTtdKykoXCl8OykvLmV4ZWMoYSk7aWYoYmIpcmV0dXJuL0VkZ2VcLyhbXGRcLl0rKS8uZXhlYyhhKTtpZih2KXJldHVybi9cYig/Ok1TSUV8cnYpWzogXShbXlwpO10rKShcKXw7KS8uZXhlYyhhKTtpZih5KXJldHVybi9XZWJLaXRcLyhcUyspLy5leGVjKGEpO2lmKGFiKXJldHVybi8oPzpWZXJzaW9uKVsgXC9dPyhcUyspLy5leGVjKGEpfSgpO2ZiJiYoZWI9ZmI/ZmJbMV06IiIpO2lmKHYpe3ZhciBnYj1jYigpO2lmKG51bGwhPWdiJiZnYj5wYXJzZUZsb2F0KGViKSl7ZGI9U3RyaW5nKGdiKTticmVhayBhfX1kYj1lYn0KdmFyIGhiPWRiLFphPXt9LEE9ZnVuY3Rpb24oYSl7cmV0dXJuICRhKGEsZnVuY3Rpb24oKXtmb3IodmFyIGI9MCxjPU1hKFN0cmluZyhoYikpLnNwbGl0KCIuIiksZD1NYShTdHJpbmcoYSkpLnNwbGl0KCIuIiksZT1NYXRoLm1heChjLmxlbmd0aCxkLmxlbmd0aCksZj0wOzA9PWImJmY8ZTtmKyspe3ZhciBnPWNbZl18fCIiLGs9ZFtmXXx8IiI7ZG97Zz0vKFxkKikoXEQqKSguKikvLmV4ZWMoZyl8fFsiIiwiIiwiIiwiIl07az0vKFxkKikoXEQqKSguKikvLmV4ZWMoayl8fFsiIiwiIiwiIiwiIl07aWYoMD09Z1swXS5sZW5ndGgmJjA9PWtbMF0ubGVuZ3RoKWJyZWFrO2I9VWEoMD09Z1sxXS5sZW5ndGg/MDpwYXJzZUludChnWzFdLDEwKSwwPT1rWzFdLmxlbmd0aD8wOnBhcnNlSW50KGtbMV0sMTApKXx8VWEoMD09Z1syXS5sZW5ndGgsMD09a1syXS5sZW5ndGgpfHxVYShnWzJdLGtbMl0pO2c9Z1szXTtrPWtbM119d2hpbGUoMD09Yil9cmV0dXJuIDA8PWJ9KX0saWI7CmliPWwuZG9jdW1lbnQmJnY/Y2IoKTp2b2lkIDA7dmFyIGpiPSF2fHw5PD1OdW1iZXIoaWIpO3ZhciBsYj1mdW5jdGlvbihhLGIpe29hKGIsZnVuY3Rpb24oYyxkKXtjJiYib2JqZWN0Ij09dHlwZW9mIGMmJmMuZGQmJihjPWMuY2QoKSk7InN0eWxlIj09ZD9hLnN0eWxlLmNzc1RleHQ9YzoiY2xhc3MiPT1kP2EuY2xhc3NOYW1lPWM6ImZvciI9PWQ/YS5odG1sRm9yPWM6a2IuaGFzT3duUHJvcGVydHkoZCk/YS5zZXRBdHRyaWJ1dGUoa2JbZF0sYyk6MD09ZC5sYXN0SW5kZXhPZigiYXJpYS0iLDApfHwwPT1kLmxhc3RJbmRleE9mKCJkYXRhLSIsMCk/YS5zZXRBdHRyaWJ1dGUoZCxjKTphW2RdPWN9KX0sa2I9e2NlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjb2xzcGFuOiJjb2xTcGFuIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGhlaWdodDoiaGVpZ2h0IixtYXhsZW5ndGg6Im1heExlbmd0aCIsbm9uY2U6Im5vbmNlIixyb2xlOiJyb2xlIixyb3dzcGFuOiJyb3dTcGFuIix0eXBlOiJ0eXBlIix1c2VtYXA6InVzZU1hcCIsdmFsaWduOiJ2QWxpZ24iLAp3aWR0aDoid2lkdGgifSxtYj1mdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChrKXtrJiZiLmFwcGVuZENoaWxkKCJzdHJpbmciPT09dHlwZW9mIGs/YS5jcmVhdGVUZXh0Tm9kZShrKTprKX1mb3IodmFyIGU9MjtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXTtpZighaGEoZil8fG0oZikmJjA8Zi5ub2RlVHlwZSlkKGYpO2Vsc2V7YTp7aWYoZiYmIm51bWJlciI9PXR5cGVvZiBmLmxlbmd0aCl7aWYobShmKSl7dmFyIGc9ImZ1bmN0aW9uIj09dHlwZW9mIGYuaXRlbXx8InN0cmluZyI9PXR5cGVvZiBmLml0ZW07YnJlYWsgYX1pZihpYShmKSl7Zz0iZnVuY3Rpb24iPT10eXBlb2YgZi5pdGVtO2JyZWFrIGF9fWc9ITF9cihnP0phKGYpOmYsZCl9fX0sbmI9ZnVuY3Rpb24oYSxiKXtiPVN0cmluZyhiKTsiYXBwbGljYXRpb24veGh0bWwreG1sIj09PWEuY29udGVudFR5cGUmJihiPWIudG9Mb3dlckNhc2UoKSk7cmV0dXJuIGEuY3JlYXRlRWxlbWVudChiKX0sb2I9ZnVuY3Rpb24oYSl7YSYmCmEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpfSxwYj1mdW5jdGlvbihhLGIpe2lmKCFhfHwhYilyZXR1cm4hMTtpZihhLmNvbnRhaW5zJiYxPT1iLm5vZGVUeXBlKXJldHVybiBhPT1ifHxhLmNvbnRhaW5zKGIpO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbilyZXR1cm4gYT09Ynx8ISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNik7Zm9yKDtiJiZhIT1iOyliPWIucGFyZW50Tm9kZTtyZXR1cm4gYj09YX0scWI9ZnVuY3Rpb24oYSl7cShhLCJOb2RlIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4iKTtyZXR1cm4gOT09YS5ub2RlVHlwZT9hOmEub3duZXJEb2N1bWVudHx8YS5kb2N1bWVudH0scmI9ZnVuY3Rpb24oYSxiKXtiP2EudGFiSW5kZXg9MDooYS50YWJJbmRleD0tMSxhLnJlbW92ZUF0dHJpYnV0ZSgidGFiSW5kZXgiKSl9LHNiPWZ1bmN0aW9uKGEpe3JldHVybiB2JiYhQSgiOSIpPyhhPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKSwKbnVsbCE9YSYmYS5zcGVjaWZpZWQpOmEuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpfSx0Yj1mdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgYSYmMDw9YSYmMzI3Njg+YX0sdWI9ZnVuY3Rpb24oYSl7dGhpcy5hPWF8fGwuZG9jdW1lbnR8fGRvY3VtZW50fTt1Yi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBhP3RoaXMuYS5nZXRFbGVtZW50QnlJZChhKTphfTsKdWIucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuYSxlPWFyZ3VtZW50cyxmPVN0cmluZyhlWzBdKSxnPWVbMV07aWYoIWpiJiZnJiYoZy5uYW1lfHxnLnR5cGUpKXtmPVsiPCIsZl07Zy5uYW1lJiZmLnB1c2goJyBuYW1lPSInLFhhKGcubmFtZSksJyInKTtpZihnLnR5cGUpe2YucHVzaCgnIHR5cGU9IicsWGEoZy50eXBlKSwnIicpO3ZhciBrPXt9O3VhKGssZyk7ZGVsZXRlIGsudHlwZTtnPWt9Zi5wdXNoKCI+Iik7Zj1mLmpvaW4oIiIpfWY9bmIoZCxmKTtnJiYoInN0cmluZyI9PT10eXBlb2YgZz9mLmNsYXNzTmFtZT1nOmZhKGcpP2YuY2xhc3NOYW1lPWcuam9pbigiICIpOmxiKGYsZykpOzI8ZS5sZW5ndGgmJm1iKGQsZixlKTtyZXR1cm4gZn07dmFyIHZiPWZ1bmN0aW9uKGEsYil7Yj8ocShwYSh2YSxiKSwiTm8gc3VjaCBBUklBIHJvbGUgIitiKSxhLnNldEF0dHJpYnV0ZSgicm9sZSIsYikpOmEucmVtb3ZlQXR0cmlidXRlKCJyb2xlIil9LHhiPWZ1bmN0aW9uKGEsYixjKXtmYShjKSYmKGM9Yy5qb2luKCIgIikpO3ZhciBkPXdiKGIpOyIiPT09Y3x8dm9pZCAwPT1jPyhtYXx8KG1hPXthdG9taWM6ITEsYXV0b2NvbXBsZXRlOiJub25lIixkcm9wZWZmZWN0OiJub25lIixoYXNwb3B1cDohMSxsaXZlOiJvZmYiLG11bHRpbGluZTohMSxtdWx0aXNlbGVjdGFibGU6ITEsb3JpZW50YXRpb246InZlcnRpY2FsIixyZWFkb25seTohMSxyZWxldmFudDoiYWRkaXRpb25zIHRleHQiLHJlcXVpcmVkOiExLHNvcnQ6Im5vbmUiLGJ1c3k6ITEsZGlzYWJsZWQ6ITEsaGlkZGVuOiExLGludmFsaWQ6ImZhbHNlIn0pLGM9bWEsYiBpbiBjP2Euc2V0QXR0cmlidXRlKGQsY1tiXSk6YS5yZW1vdmVBdHRyaWJ1dGUoZCkpOmEuc2V0QXR0cmlidXRlKGQsCmMpfSx3Yj1mdW5jdGlvbihhKXtxKGEsIkFSSUEgYXR0cmlidXRlIGNhbm5vdCBiZSBlbXB0eS4iKTtxKHBhKG5hLGEpLCJObyBzdWNoIEFSSUEgYXR0cmlidXRlICIrYSk7cmV0dXJuImFyaWEtIithfTt2YXIgeWI9T2JqZWN0LmZyZWV6ZXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O3ZhciBDPWZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVTt0aGlzLko9dGhpcy5KfTtDLnByb3RvdHlwZS5VPSExO0MucHJvdG90eXBlLk49ZnVuY3Rpb24oKXt0aGlzLlV8fCh0aGlzLlU9ITAsdGhpcy51KCkpfTt2YXIgemI9ZnVuY3Rpb24oYSxiKXthLlU/YigpOihhLkp8fChhLko9W10pLGEuSi5wdXNoKGIpKX07Qy5wcm90b3R5cGUudT1mdW5jdGlvbigpe2lmKHRoaXMuSilmb3IoO3RoaXMuSi5sZW5ndGg7KXRoaXMuSi5zaGlmdCgpKCl9O3ZhciBBYj1mdW5jdGlvbihhKXthJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5OJiZhLk4oKX07dmFyIEJiPWZ1bmN0aW9uKGEpe3JldHVybiJzdHJpbmciPT10eXBlb2YgYS5jbGFzc05hbWU/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sRD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6QmIoYSkubWF0Y2goL1xTKy9nKXx8W119LENiPWZ1bmN0aW9uKGEsYil7InN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZT9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxEYj1mdW5jdGlvbihhLGIpe3JldHVybiBhLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5jb250YWlucyhiKTpHYShEKGEpLGIpfSxFYj1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFEYihhLGIpKXt2YXIgYz1CYihhKTtDYihhLGMrKDA8Yy5sZW5ndGg/IiAiK2I6YikpfX0sRmI9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClyKGIsCmZ1bmN0aW9uKGUpe0ViKGEsZSl9KTtlbHNle3ZhciBjPXt9O3IoRChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7cihiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPTA8Yi5sZW5ndGg/IiAiK2Q6ZDtDYihhLGIpfX0sR2I9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6RGIoYSxiKSYmQ2IoYSxFYShEKGEpLGZ1bmN0aW9uKGMpe3JldHVybiBjIT1ifSkuam9pbigiICIpKX0sSGI9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9yKGIsZnVuY3Rpb24oYyl7R2IoYSxjKX0pOkNiKGEsRWEoRChhKSxmdW5jdGlvbihjKXtyZXR1cm4hR2EoYixjKX0pLmpvaW4oIiAiKSl9O3ZhciBJYj0hdnx8OTw9TnVtYmVyKGliKSxKYj0hdnx8OTw9TnVtYmVyKGliKSxLYj12JiYhQSgiOSIpLExiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e2wuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsY2EsYiksbC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjYSxiKX1jYXRjaChjKXt9cmV0dXJuIGF9KCk7dmFyIEU9ZnVuY3Rpb24oYSxiKXt0aGlzLnR5cGU9YTt0aGlzLmE9dGhpcy50YXJnZXQ9Yjt0aGlzLmg9ITE7dGhpcy5LYT0hMH07RS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuaD0hMH07RS5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3RoaXMuS2E9ITF9O3ZhciBGPXtMOiJtb3VzZWRvd24iLE06Im1vdXNldXAiLGFhOiJtb3VzZWNhbmNlbCIsaGM6Im1vdXNlbW92ZSIsamM6Im1vdXNlb3ZlciIsaWM6Im1vdXNlb3V0IixmYzoibW91c2VlbnRlciIsZ2M6Im1vdXNlbGVhdmUifTt2YXIgRz1mdW5jdGlvbihhLGIpe0UuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy5hPXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5jPTA7dGhpcy5BPXRoaXMubWV0YUtleT10aGlzLnNoaWZ0S2V5PXRoaXMuYWx0S2V5PXRoaXMuY3RybEtleT0hMTt0aGlzLnBvaW50ZXJJZD0wO3RoaXMucG9pbnRlclR5cGU9IiI7dGhpcy5iPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMuYT1iO2lmKGI9YS5yZWxhdGVkVGFyZ2V0KXtpZih4KXthOnt0cnl7WWEoYi5ub2RlTmFtZSk7dmFyIGU9ITA7YnJlYWsgYX1jYXRjaChmKXt9ZT0KITF9ZXx8KGI9bnVsbCl9fWVsc2UibW91c2VvdmVyIj09Yz9iPWEuZnJvbUVsZW1lbnQ6Im1vdXNlb3V0Ij09YyYmKGI9YS50b0VsZW1lbnQpO3RoaXMucmVsYXRlZFRhcmdldD1iO2Q/KHRoaXMuY2xpZW50WD12b2lkIDAhPT1kLmNsaWVudFg/ZC5jbGllbnRYOmQucGFnZVgsdGhpcy5jbGllbnRZPXZvaWQgMCE9PWQuY2xpZW50WT9kLmNsaWVudFk6ZC5wYWdlWSx0aGlzLnNjcmVlblg9ZC5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1kLnNjcmVlbll8fDApOih0aGlzLmNsaWVudFg9dm9pZCAwIT09YS5jbGllbnRYP2EuY2xpZW50WDphLnBhZ2VYLHRoaXMuY2xpZW50WT12b2lkIDAhPT1hLmNsaWVudFk/YS5jbGllbnRZOmEucGFnZVksdGhpcy5zY3JlZW5YPWEuc2NyZWVuWHx8MCx0aGlzLnNjcmVlblk9YS5zY3JlZW5ZfHwwKTt0aGlzLmJ1dHRvbj1hLmJ1dHRvbjt0aGlzLmM9YS5rZXlDb2RlfHwwO3RoaXMua2V5PWEua2V5fHwiIjt0aGlzLmN0cmxLZXk9YS5jdHJsS2V5O3RoaXMuYWx0S2V5PQphLmFsdEtleTt0aGlzLnNoaWZ0S2V5PWEuc2hpZnRLZXk7dGhpcy5tZXRhS2V5PWEubWV0YUtleTt0aGlzLkE9ej9hLm1ldGFLZXk6YS5jdHJsS2V5O3RoaXMucG9pbnRlcklkPWEucG9pbnRlcklkfHwwO3RoaXMucG9pbnRlclR5cGU9InN0cmluZyI9PT10eXBlb2YgYS5wb2ludGVyVHlwZT9hLnBvaW50ZXJUeXBlOk1iW2EucG9pbnRlclR5cGVdfHwiIjt0aGlzLmI9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnRoaXMuZygpfX07bihHLEUpO3ZhciBOYj15YihbMSw0LDJdKSxNYj15Yih7MjoidG91Y2giLDM6InBlbiIsNDoibW91c2UifSksT2I9ZnVuY3Rpb24oYSl7cmV0dXJuIEliPzA9PWEuYi5idXR0b246ImNsaWNrIj09YS50eXBlPyEwOiEhKGEuYi5idXR0b24mTmJbMF0pfTtHLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7Ry5pLmouY2FsbCh0aGlzKTt0aGlzLmIuc3RvcFByb3BhZ2F0aW9uP3RoaXMuYi5zdG9wUHJvcGFnYXRpb24oKTp0aGlzLmIuY2FuY2VsQnViYmxlPSEwfTsKRy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe0cuaS5nLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5iO2lmKGEucHJldmVudERlZmF1bHQpYS5wcmV2ZW50RGVmYXVsdCgpO2Vsc2UgaWYoYS5yZXR1cm5WYWx1ZT0hMSxLYil0cnl7aWYoYS5jdHJsS2V5fHwxMTI8PWEua2V5Q29kZSYmMTIzPj1hLmtleUNvZGUpYS5rZXlDb2RlPS0xfWNhdGNoKGIpe319O3ZhciBQYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKDFFNipNYXRoLnJhbmRvbSgpfDApLFFiPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW1BiXSl9LFJiPTA7dmFyIFNiPWZ1bmN0aW9uKGEsYixjLGQsZSl7dGhpcy5saXN0ZW5lcj1hO3RoaXMuYT1udWxsO3RoaXMuc3JjPWI7dGhpcy50eXBlPWM7dGhpcy5jYXB0dXJlPSEhZDt0aGlzLm1hPWU7dGhpcy5rZXk9KytSYjt0aGlzLlg9dGhpcy5oYT0hMX0sVGI9ZnVuY3Rpb24oYSl7YS5YPSEwO2EubGlzdGVuZXI9bnVsbDthLmE9bnVsbDthLnNyYz1udWxsO2EubWE9bnVsbH07dmFyIFViPWZ1bmN0aW9uKGEpe3RoaXMuc3JjPWE7dGhpcy5hPXt9O3RoaXMuYj0wfTtVYi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS50b1N0cmluZygpO2E9dGhpcy5hW2ZdO2F8fChhPXRoaXMuYVtmXT1bXSx0aGlzLmIrKyk7dmFyIGc9VmIoYSxiLGQsZSk7LTE8Zz8oYj1hW2ddLGN8fChiLmhhPSExKSk6KGI9bmV3IFNiKGIsdGhpcy5zcmMsZiwhIWQsZSksYi5oYT1jLGEucHVzaChiKSk7cmV0dXJuIGJ9Owp2YXIgV2I9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLnR5cGU7YyBpbiBhLmEmJkhhKGEuYVtjXSxiKSYmKFRiKGIpLDA9PWEuYVtjXS5sZW5ndGgmJihkZWxldGUgYS5hW2NdLGEuYi0tKSl9LFhiPWZ1bmN0aW9uKGEsYixjLGQsZSl7YT1hLmFbYi50b1N0cmluZygpXTtiPS0xO2EmJihiPVZiKGEsYyxkLGUpKTtyZXR1cm4tMTxiP2FbYl06bnVsbH0sVmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuWCYmZi5saXN0ZW5lcj09YiYmZi5jYXB0dXJlPT0hIWMmJmYubWE9PWQpcmV0dXJuIGV9cmV0dXJuLTF9O3ZhciBZYj0iY2xvc3VyZV9sbV8iKygxRTYqTWF0aC5yYW5kb20oKXwwKSxaYj17fSwkYj0wLGJjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZCYmZC5vbmNlKXJldHVybiBhYyhhLGIsYyxkLGUpO2lmKGZhKGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyliYyhhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9Y2MoYyk7cmV0dXJuIFFiKGEpP2RjKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOmVjKGEsYixjLCExLGQsZSl9LGVjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGc9bShlKT8hIWUuY2FwdHVyZTohIWUsaz1mYyhhKTtrfHwoYVtZYl09az1uZXcgVWIoYSkpO2M9ay5hZGQoYixjLGQsZyxmKTtpZihjLmEpcmV0dXJuIGM7ZD1nYygpO2MuYT1kO2Quc3JjPWE7ZC5saXN0ZW5lcj1jO2lmKGEuYWRkRXZlbnRMaXN0ZW5lcilMYnx8KGU9Zyksdm9pZCAwPT09ZSYmKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksCmQsZSk7ZWxzZSBpZihhLmF0dGFjaEV2ZW50KWEuYXR0YWNoRXZlbnQoaGMoYi50b1N0cmluZygpKSxkKTtlbHNlIGlmKGEuYWRkTGlzdGVuZXImJmEucmVtb3ZlTGlzdGVuZXIpcSgiY2hhbmdlIj09PWIsIk1lZGlhUXVlcnlMaXN0IG9ubHkgaGFzIGEgY2hhbmdlIGV2ZW50IiksYS5hZGRMaXN0ZW5lcihkKTtlbHNlIHRocm93IEVycm9yKCJhZGRFdmVudExpc3RlbmVyIGFuZCBhdHRhY2hFdmVudCBhcmUgdW5hdmFpbGFibGUuIik7JGIrKztyZXR1cm4gY30sZ2M9ZnVuY3Rpb24oKXt2YXIgYT1pYyxiPUpiP2Z1bmN0aW9uKGMpe3JldHVybiBhLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKX06ZnVuY3Rpb24oYyl7Yz1hLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKTtpZighYylyZXR1cm4gY307cmV0dXJuIGJ9LGFjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZmEoYikpe2Zvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWFjKGEsYltmXSxjLGQsZSk7cmV0dXJuIG51bGx9Yz1jYyhjKTtyZXR1cm4gUWIoYSk/CmEuaC5hZGQoU3RyaW5nKGIpLGMsITAsbShkKT8hIWQuY2FwdHVyZTohIWQsZSk6ZWMoYSxiLGMsITAsZCxlKX0samM9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihmYShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylqYyhhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPWNjKGMpLFFiKGEpPyhhPWEuaCxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5hJiYoZj1hLmFbYl0sYz1WYihmLGMsZCxlKSwtMTxjJiYoVGIoZltjXSkscShudWxsIT1mLmxlbmd0aCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSwwPT1mLmxlbmd0aCYmKGRlbGV0ZSBhLmFbYl0sYS5iLS0pKSkpOmEmJihhPWZjKGEpKSYmKGM9WGIoYSxiLGMsZCxlKSkmJmtjKGMpfSxrYz1mdW5jdGlvbihhKXtpZigibnVtYmVyIiE9PXR5cGVvZiBhJiZhJiYhYS5YKXt2YXIgYj1hLnNyYztpZihRYihiKSlXYihiLmgsYSk7ZWxzZXt2YXIgYz1hLnR5cGUsZD1hLmE7Yi5yZW1vdmVFdmVudExpc3RlbmVyPwpiLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KGhjKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7JGItLTsoYz1mYyhiKSk/KFdiKGMsYSksMD09Yy5iJiYoYy5zcmM9bnVsbCxiW1liXT1udWxsKSk6VGIoYSl9fX0saGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gWmI/WmJbYV06WmJbYV09Im9uIithfSxtYz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMDtpZihhPWZjKGEpKWlmKGI9YS5hW2IudG9TdHJpbmcoKV0pZm9yKGI9Yi5jb25jYXQoKSxhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBmPWJbYV07ZiYmZi5jYXB0dXJlPT1jJiYhZi5YJiYoZj1sYyhmLGQpLGU9ZSYmITEhPT1mKX1yZXR1cm4gZX0sbGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5tYXx8YS5zcmM7YS5oYSYma2MoYSk7cmV0dXJuIGMuY2FsbChkLGIpfSxpYz1mdW5jdGlvbihhLApiKXtpZihhLlgpcmV0dXJuITA7aWYoIUpiKXtpZighYilhOntiPVsid2luZG93IiwiZXZlbnQiXTtmb3IodmFyIGM9bCxkPTA7ZDxiLmxlbmd0aDtkKyspaWYoYz1jW2JbZF1dLG51bGw9PWMpe2I9bnVsbDticmVhayBhfWI9Y31kPWI7Yj1uZXcgRyhkLHRoaXMpO2M9ITA7aWYoISgwPmQua2V5Q29kZXx8dm9pZCAwIT1kLnJldHVyblZhbHVlKSl7YTp7dmFyIGU9ITE7aWYoMD09ZC5rZXlDb2RlKXRyeXtkLmtleUNvZGU9LTE7YnJlYWsgYX1jYXRjaChnKXtlPSEwfWlmKGV8fHZvaWQgMD09ZC5yZXR1cm5WYWx1ZSlkLnJldHVyblZhbHVlPSEwfWQ9W107Zm9yKGU9Yi5hO2U7ZT1lLnBhcmVudE5vZGUpZC5wdXNoKGUpO2E9YS50eXBlO2ZvcihlPWQubGVuZ3RoLTE7IWIuaCYmMDw9ZTtlLS0pe2IuYT1kW2VdO3ZhciBmPW1jKGRbZV0sYSwhMCxiKTtjPWMmJmZ9Zm9yKGU9MDshYi5oJiZlPGQubGVuZ3RoO2UrKyliLmE9ZFtlXSxmPW1jKGRbZV0sYSwhMSxiKSxjPWMmJmZ9cmV0dXJuIGN9cmV0dXJuIGxjKGEsCm5ldyBHKGIsdGhpcykpfSxmYz1mdW5jdGlvbihhKXthPWFbWWJdO3JldHVybiBhIGluc3RhbmNlb2YgVWI/YTpudWxsfSxuYz0iX19jbG9zdXJlX2V2ZW50c19mbl8iKygxRTkqTWF0aC5yYW5kb20oKT4+PjApLGNjPWZ1bmN0aW9uKGEpe3EoYSwiTGlzdGVuZXIgY2FuIG5vdCBiZSBudWxsLiIpO2lmKGlhKGEpKXJldHVybiBhO3EoYS5oYW5kbGVFdmVudCwiQW4gb2JqZWN0IGxpc3RlbmVyIG11c3QgaGF2ZSBoYW5kbGVFdmVudCBtZXRob2QuIik7YVtuY118fChhW25jXT1mdW5jdGlvbihiKXtyZXR1cm4gYS5oYW5kbGVFdmVudChiKX0pO3JldHVybiBhW25jXX07dmFyIG9jPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9e319O24ob2MsQyk7CnZhciBwYz1bXSxIPWZ1bmN0aW9uKGEsYixjLGQpe2ZhKGMpfHwoYyYmKHBjWzBdPWMudG9TdHJpbmcoKSksYz1wYyk7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWJjKGIsY1tlXSxkfHxhLmhhbmRsZUV2ZW50LCExLGEuYnx8YSk7aWYoIWYpYnJlYWs7YS5hW2Yua2V5XT1mfXJldHVybiBhfSxxYz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoZmEoYykpZm9yKHZhciBnPTA7ZzxjLmxlbmd0aDtnKyspcWMoYSxiLGNbZ10sZCxlLGYpO2Vsc2UgZD1kfHxhLmhhbmRsZUV2ZW50LGU9bShlKT8hIWUuY2FwdHVyZTohIWUsZj1mfHxhLmJ8fGEsZD1jYyhkKSxlPSEhZSxjPVFiKGIpP1hiKGIuaCxTdHJpbmcoYyksZCxlLGYpOmI/KGI9ZmMoYikpP1hiKGIsYyxkLGUsZik6bnVsbDpudWxsLGMmJihrYyhjKSxkZWxldGUgYS5hW2Mua2V5XSk7cmV0dXJuIGF9LHJjPWZ1bmN0aW9uKGEpe29hKGEuYSxmdW5jdGlvbihiLGMpe3RoaXMuYS5oYXNPd25Qcm9wZXJ0eShjKSYma2MoYil9LAphKTthLmE9e319O29jLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7b2MuaS51LmNhbGwodGhpcyk7cmModGhpcyl9O29jLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJFdmVudEhhbmRsZXIuaGFuZGxlRXZlbnQgbm90IGltcGxlbWVudGVkIik7fTt2YXIgST1mdW5jdGlvbigpe0MuY2FsbCh0aGlzKTt0aGlzLmg9bmV3IFViKHRoaXMpO3RoaXMuTWE9dGhpczt0aGlzLnBhPW51bGx9O24oSSxDKTtJLnByb3RvdHlwZVtQYl09ITA7SS5wcm90b3R5cGUucmE9ZnVuY3Rpb24oYSl7dGhpcy5wYT1hfTtJLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjLGQpe2pjKHRoaXMsYSxiLGMsZCl9Owp2YXIgdWM9ZnVuY3Rpb24oYSxiKXtzYyhhKTt2YXIgYz1hLnBhO2lmKGMpe3ZhciBkPVtdO2Zvcih2YXIgZT0xO2M7Yz1jLnBhKWQucHVzaChjKSxxKDFFMz4rK2UsImluZmluaXRlIGxvb3AiKX1hPWEuTWE7Yz1iLnR5cGV8fGI7InN0cmluZyI9PT10eXBlb2YgYj9iPW5ldyBFKGIsYSk6YiBpbnN0YW5jZW9mIEU/Yi50YXJnZXQ9Yi50YXJnZXR8fGE6KGU9YixiPW5ldyBFKGMsYSksdWEoYixlKSk7ZT0hMDtpZihkKWZvcih2YXIgZj1kLmxlbmd0aC0xOyFiLmgmJjA8PWY7Zi0tKXt2YXIgZz1iLmE9ZFtmXTtlPXRjKGcsYywhMCxiKSYmZX1iLmh8fChnPWIuYT1hLGU9dGMoZyxjLCEwLGIpJiZlLGIuaHx8KGU9dGMoZyxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLmgmJmY8ZC5sZW5ndGg7ZisrKWc9Yi5hPWRbZl0sZT10YyhnLGMsITEsYikmJmU7cmV0dXJuIGV9OwpJLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7SS5pLnUuY2FsbCh0aGlzKTtpZih0aGlzLmgpe3ZhciBhPXRoaXMuaCxiPTAsYztmb3IoYyBpbiBhLmEpe2Zvcih2YXIgZD1hLmFbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixUYihkW2VdKTtkZWxldGUgYS5hW2NdO2EuYi0tfX10aGlzLnBhPW51bGx9O3ZhciBkYz1mdW5jdGlvbihhLGIsYyxkLGUpe3NjKGEpO3JldHVybiBhLmguYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LHRjPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5oLmFbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGc9YltmXTtpZihnJiYhZy5YJiZnLmNhcHR1cmU9PWMpe3ZhciBrPWcubGlzdGVuZXIscD1nLm1hfHxnLnNyYztnLmhhJiZXYihhLmgsZyk7ZT0hMSE9PWsuY2FsbChwLGQpJiZlfX1yZXR1cm4gZSYmMCE9ZC5LYX0sc2M9ZnVuY3Rpb24oYSl7cShhLmgsIkV2ZW50IHRhcmdldCBpcyBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgY2FsbCB0aGUgc3VwZXJjbGFzcyAoZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpIGNvbnN0cnVjdG9yPyIpfTt2YXIgeGM9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKHkmJiFBKCI1MjUiKSlyZXR1cm4hMDtpZih6JiZlKXJldHVybiB2YyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZigheCl7Im51bWJlciI9PT10eXBlb2YgYiYmKGI9d2MoYikpO3ZhciBnPTE3PT1ifHwxOD09Ynx8eiYmOTE9PWI7aWYoKCFjfHx6KSYmZ3x8eiYmMTY9PWImJihkfHxmKSlyZXR1cm4hMX1pZigoeXx8YmIpJiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1pZih2JiZkJiZiPT1hKXJldHVybiExO3N3aXRjaChhKXtjYXNlIDEzOnJldHVybiB4P2Z8fGU/ITE6IShjJiZkKTohMDtjYXNlIDI3OnJldHVybiEoeXx8YmJ8fHgpfXJldHVybiB4JiYoZHx8ZXx8Zik/ITE6dmMoYSl9LHZjPWZ1bmN0aW9uKGEpe2lmKDQ4PD1hJiY1Nz49YXx8Cjk2PD1hJiYxMDY+PWF8fDY1PD1hJiY5MD49YXx8KHl8fGJiKSYmMD09YSlyZXR1cm4hMDtzd2l0Y2goYSl7Y2FzZSAzMjpjYXNlIDQzOmNhc2UgNjM6Y2FzZSA2NDpjYXNlIDEwNzpjYXNlIDEwOTpjYXNlIDExMDpjYXNlIDExMTpjYXNlIDE4NjpjYXNlIDU5OmNhc2UgMTg5OmNhc2UgMTg3OmNhc2UgNjE6Y2FzZSAxODg6Y2FzZSAxOTA6Y2FzZSAxOTE6Y2FzZSAxOTI6Y2FzZSAyMjI6Y2FzZSAyMTk6Y2FzZSAyMjA6Y2FzZSAyMjE6Y2FzZSAxNjM6Y2FzZSA1ODpyZXR1cm4hMDtjYXNlIDE3MzpyZXR1cm4geDtkZWZhdWx0OnJldHVybiExfX0sd2M9ZnVuY3Rpb24oYSl7aWYoeClhPXljKGEpO2Vsc2UgaWYoeiYmeSlzd2l0Y2goYSl7Y2FzZSA5MzphPTkxfXJldHVybiBhfSx5Yz1mdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSA2MTpyZXR1cm4gMTg3O2Nhc2UgNTk6cmV0dXJuIDE4NjtjYXNlIDE3MzpyZXR1cm4gMTg5O2Nhc2UgMjI0OnJldHVybiA5MTtjYXNlIDA6cmV0dXJuIDIyNDsKZGVmYXVsdDpyZXR1cm4gYX19O3ZhciBKPWZ1bmN0aW9uKGEsYil7SS5jYWxsKHRoaXMpO2EmJnpjKHRoaXMsYSxiKX07bihKLEkpO2g9Si5wcm90b3R5cGU7aC5TPW51bGw7aC5uYT1udWxsO2guQ2E9bnVsbDtoLm9hPW51bGw7aC53PS0xO2guRj0tMTtoLnVhPSExOwp2YXIgQWM9ezM6MTMsMTI6MTQ0LDYzMjMyOjM4LDYzMjMzOjQwLDYzMjM0OjM3LDYzMjM1OjM5LDYzMjM2OjExMiw2MzIzNzoxMTMsNjMyMzg6MTE0LDYzMjM5OjExNSw2MzI0MDoxMTYsNjMyNDE6MTE3LDYzMjQyOjExOCw2MzI0MzoxMTksNjMyNDQ6MTIwLDYzMjQ1OjEyMSw2MzI0NjoxMjIsNjMyNDc6MTIzLDYzMjQ4OjQ0LDYzMjcyOjQ2LDYzMjczOjM2LDYzMjc1OjM1LDYzMjc2OjMzLDYzMjc3OjM0LDYzMjg5OjE0NCw2MzMwMjo0NX0sQmM9e1VwOjM4LERvd246NDAsTGVmdDozNyxSaWdodDozOSxFbnRlcjoxMyxGMToxMTIsRjI6MTEzLEYzOjExNCxGNDoxMTUsRjU6MTE2LEY2OjExNyxGNzoxMTgsRjg6MTE5LEY5OjEyMCxGMTA6MTIxLEYxMToxMjIsRjEyOjEyMywiVSswMDdGIjo0NixIb21lOjM2LEVuZDozNSxQYWdlVXA6MzMsUGFnZURvd246MzQsSW5zZXJ0OjQ1fSxDYz0heXx8QSgiNTI1IiksRGM9eiYmeDsKSi5wcm90b3R5cGUuYT1mdW5jdGlvbihhKXtpZih5fHxiYilpZigxNz09dGhpcy53JiYhYS5jdHJsS2V5fHwxOD09dGhpcy53JiYhYS5hbHRLZXl8fHomJjkxPT10aGlzLncmJiFhLm1ldGFLZXkpdGhpcy5GPXRoaXMudz0tMTstMT09dGhpcy53JiYoYS5jdHJsS2V5JiYxNyE9YS5jP3RoaXMudz0xNzphLmFsdEtleSYmMTghPWEuYz90aGlzLnc9MTg6YS5tZXRhS2V5JiY5MSE9YS5jJiYodGhpcy53PTkxKSk7Q2MmJiF4YyhhLmMsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGEuYWx0S2V5LGEubWV0YUtleSk/dGhpcy5oYW5kbGVFdmVudChhKToodGhpcy5GPXdjKGEuYyksRGMmJih0aGlzLnVhPWEuYWx0S2V5KSl9O0oucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dGhpcy5GPXRoaXMudz0tMTt0aGlzLnVhPWEuYWx0S2V5fTsKSi5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5iLGM9Yi5hbHRLZXk7aWYodiYmImtleXByZXNzIj09YS50eXBlKXt2YXIgZD10aGlzLkY7dmFyIGU9MTMhPWQmJjI3IT1kP2Iua2V5Q29kZTowfWVsc2UoeXx8YmIpJiYia2V5cHJlc3MiPT1hLnR5cGU/KGQ9dGhpcy5GLGU9MDw9Yi5jaGFyQ29kZSYmNjMyMzI+Yi5jaGFyQ29kZSYmdmMoZCk/Yi5jaGFyQ29kZTowKTphYiYmIXk/KGQ9dGhpcy5GLGU9dmMoZCk/Yi5rZXlDb2RlOjApOigia2V5cHJlc3MiPT1hLnR5cGU/KERjJiYoYz10aGlzLnVhKSxiLmtleUNvZGU9PWIuY2hhckNvZGU/MzI+Yi5rZXlDb2RlPyhkPWIua2V5Q29kZSxlPTApOihkPXRoaXMuRixlPWIuY2hhckNvZGUpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkseiYmNjM9PWUmJjIyND09ZCYmKGQ9MTkxKSk7dmFyIGY9ZD13YyhkKTtkPzYzMjMyPD0KZCYmZCBpbiBBYz9mPUFjW2RdOjI1PT1kJiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBCYyYmKGY9QmNbYi5rZXlJZGVudGlmaWVyXSk7eCYmQ2MmJiJrZXlwcmVzcyI9PWEudHlwZSYmIXhjKGYsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KXx8KGE9Zj09dGhpcy53LHRoaXMudz1mLGI9bmV3IEVjKGYsZSxhLGIpLGIuYWx0S2V5PWMsdWModGhpcyxiKSl9O0oucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTsKdmFyIHpjPWZ1bmN0aW9uKGEsYixjKXthLm9hJiZGYyhhKTthLlM9YjthLm5hPWJjKGEuUywia2V5cHJlc3MiLGEsYyk7YS5DYT1iYyhhLlMsImtleWRvd24iLGEuYSxjLGEpO2Eub2E9YmMoYS5TLCJrZXl1cCIsYS5iLGMsYSl9LEZjPWZ1bmN0aW9uKGEpe2EubmEmJihrYyhhLm5hKSxrYyhhLkNhKSxrYyhhLm9hKSxhLm5hPW51bGwsYS5DYT1udWxsLGEub2E9bnVsbCk7YS5TPW51bGw7YS53PS0xO2EuRj0tMX07Si5wcm90b3R5cGUudT1mdW5jdGlvbigpe0ouaS51LmNhbGwodGhpcyk7RmModGhpcyl9O3ZhciBFYz1mdW5jdGlvbihhLGIsYyxkKXtHLmNhbGwodGhpcyxkKTt0aGlzLnR5cGU9ImtleSI7dGhpcy5jPWE7dGhpcy5yZXBlYXQ9Y307bihFYyxHKTt2YXIgR2M9eD8iTW96VXNlclNlbGVjdCI6eXx8YmI/IldlYmtpdFVzZXJTZWxlY3QiOm51bGwsSGM9ZnVuY3Rpb24oYSxiKXtiPWI/bnVsbDphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7aWYoR2Mpe3ZhciBjPSJub25lIjthLnN0eWxlJiYoYS5zdHlsZVtHY109Yyk7aWYoYil7YT0wO2Zvcih2YXIgZDtkPWJbYV07YSsrKWQuc3R5bGUmJihkLnN0eWxlW0djXT1jKX19ZWxzZSBpZih2fHxhYilpZihjPSJvbiIsYS5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyksYilmb3IoYT0wO2Q9YlthXTthKyspZC5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyl9O3ZhciBJYz1mdW5jdGlvbigpe307ZGEoSWMpO0ljLnByb3RvdHlwZS5hPTA7dmFyIEs9ZnVuY3Rpb24oYSl7SS5jYWxsKHRoaXMpO3RoaXMuaj1hfHx4YXx8KHhhPW5ldyB1Yik7dGhpcy5xYT1KYzt0aGlzLlk9bnVsbDt0aGlzLm09ITE7dGhpcy5hPW51bGw7dGhpcy5BPXZvaWQgMDt0aGlzLmc9dGhpcy5jPXRoaXMuYj1udWxsO3RoaXMuR2E9ITF9O24oSyxJKTtLLnByb3RvdHlwZS5PYT1JYy5SKCk7CnZhciBKYz1udWxsLEtjPWZ1bmN0aW9uKGEsYil7c3dpdGNoKGEpe2Nhc2UgMTpyZXR1cm4gYj8iZGlzYWJsZSI6ImVuYWJsZSI7Y2FzZSAyOnJldHVybiBiPyJoaWdobGlnaHQiOiJ1bmhpZ2hsaWdodCI7Y2FzZSA0OnJldHVybiBiPyJhY3RpdmF0ZSI6ImRlYWN0aXZhdGUiO2Nhc2UgODpyZXR1cm4gYj8ic2VsZWN0IjoidW5zZWxlY3QiO2Nhc2UgMTY6cmV0dXJuIGI/ImNoZWNrIjoidW5jaGVjayI7Y2FzZSAzMjpyZXR1cm4gYj8iZm9jdXMiOiJibHVyIjtjYXNlIDY0OnJldHVybiBiPyJvcGVuIjoiY2xvc2UifXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBzdGF0ZSIpO30sTGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuWXx8KGEuWT0iOiIrKGEuT2EuYSsrKS50b1N0cmluZygzNikpfSxNYz1mdW5jdGlvbihhLGIpe2lmKGEuYiYmYS5iLmcpe3ZhciBjPWEuYi5nLGQ9YS5ZO2QgaW4gYyYmZGVsZXRlIGNbZF07cWEoYS5iLmcsYixhKX1hLlk9Yn07Sy5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9Owp2YXIgTmM9ZnVuY3Rpb24oYSl7YT1hLmE7cShhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cmV0dXJuIGF9LE9jPWZ1bmN0aW9uKGEpe2EuQXx8KGEuQT1uZXcgb2MoYSkpO3JldHVybiBxKGEuQSl9O0sucHJvdG90eXBlLnJhPWZ1bmN0aW9uKGEpe2lmKHRoaXMuYiYmdGhpcy5iIT1hKXRocm93IEVycm9yKCJNZXRob2Qgbm90IHN1cHBvcnRlZCIpO0suaS5yYS5jYWxsKHRoaXMsYSl9O0sucHJvdG90eXBlLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPW5iKHRoaXMuai5hLCJESVYiKX07CnZhciBQYz1mdW5jdGlvbihhLGIpe2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiJiZhLnhhKGIpKXthLkdhPSEwO3ZhciBjPXFiKGIpO2EuaiYmYS5qLmE9PWN8fChhLmo9Yj9uZXcgdWIocWIoYikpOnhhfHwoeGE9bmV3IHViKSk7YS52YShiKTthLkQoKX1lbHNlIHRocm93IEVycm9yKCJJbnZhbGlkIGVsZW1lbnQgdG8gZGVjb3JhdGUiKTt9O2g9Sy5wcm90b3R5cGU7aC54YT1mdW5jdGlvbigpe3JldHVybiEwfTtoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hfTtoLkQ9ZnVuY3Rpb24oKXt0aGlzLm09ITA7UWModGhpcyxmdW5jdGlvbihhKXshYS5tJiZhLmYoKSYmYS5EKCl9KX07aC5QPWZ1bmN0aW9uKCl7UWModGhpcyxmdW5jdGlvbihhKXthLm0mJmEuUCgpfSk7dGhpcy5BJiZyYyh0aGlzLkEpO3RoaXMubT0hMX07CmgudT1mdW5jdGlvbigpe3RoaXMubSYmdGhpcy5QKCk7dGhpcy5BJiYodGhpcy5BLk4oKSxkZWxldGUgdGhpcy5BKTtRYyh0aGlzLGZ1bmN0aW9uKGEpe2EuTigpfSk7IXRoaXMuR2EmJnRoaXMuYSYmb2IodGhpcy5hKTt0aGlzLmI9dGhpcy5hPXRoaXMuZz10aGlzLmM9bnVsbDtLLmkudS5jYWxsKHRoaXMpfTtoLnNhPWZ1bmN0aW9uKGEsYil7dGhpcy50YShhLFJjKHRoaXMpLGIpfTsKaC50YT1mdW5jdGlvbihhLGIsYyl7cSghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLm0mJihjfHwhdGhpcy5tKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZigwPmJ8fGI+UmModGhpcykpdGhyb3cgRXJyb3IoIkNoaWxkIGNvbXBvbmVudCBpbmRleCBvdXQgb2YgYm91bmRzIik7dGhpcy5nJiZ0aGlzLmN8fCh0aGlzLmc9e30sdGhpcy5jPVtdKTtpZihhLmI9PXRoaXMpe3ZhciBkPUxjKGEpO3RoaXMuZ1tkXT1hO0hhKHRoaXMuYyxhKX1lbHNlIHFhKHRoaXMuZyxMYyhhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuYiYmYS5ZKXt2YXIgZT1hLmI7ZD1hLlk7ZS5nJiZkPyhlPWUuZyxkPShudWxsIT09ZSYmZCBpbiBlP2VbZF06dm9pZCAwKXx8bnVsbCk6ZD1udWxsfWlmKGQmJmEuYiE9dGhpcyl0aHJvdyBFcnJvcigiVW5hYmxlIHRvIHNldCBwYXJlbnQgY29tcG9uZW50Iik7CmEuYj10aGlzO0suaS5yYS5jYWxsKGEsdGhpcyk7TGEodGhpcy5jLGIsMCxhKTtpZihhLm0mJnRoaXMubSYmYS5iPT10aGlzKWM9dGhpcy5qYSgpLGI9Yy5jaGlsZE5vZGVzW2JdfHxudWxsLGIhPWEuZigpJiZjLmluc2VydEJlZm9yZShhLmYoKSxiKTtlbHNlIGlmKGMpe3RoaXMuYXx8dGhpcy5pYSgpO2M9TCh0aGlzLGIrMSk7Yj10aGlzLmphKCk7Yz1jP2MuYTpudWxsO2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTthLmF8fGEuaWEoKTtiP2IuaW5zZXJ0QmVmb3JlKGEuYSxjfHxudWxsKTphLmouYS5ib2R5LmFwcGVuZENoaWxkKGEuYSk7YS5iJiYhYS5iLm18fGEuRCgpfWVsc2UgdGhpcy5tJiYhYS5tJiZhLmEmJmEuYS5wYXJlbnROb2RlJiYxPT1hLmEucGFyZW50Tm9kZS5ub2RlVHlwZSYmYS5EKCl9O2guamE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hfTsKdmFyIFNjPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEucWEpe3ZhciBiPWEubT9hLmE6YS5qLmEuYm9keTthOnt2YXIgYz1xYihiKTtpZihjLmRlZmF1bHRWaWV3JiZjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihjPWMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpKSl7Yz1jLmRpcmVjdGlvbnx8Yy5nZXRQcm9wZXJ0eVZhbHVlKCJkaXJlY3Rpb24iKXx8IiI7YnJlYWsgYX1jPSIifWEucWE9InJ0bCI9PShjfHwoYi5jdXJyZW50U3R5bGU/Yi5jdXJyZW50U3R5bGUuZGlyZWN0aW9uOm51bGwpfHxiLnN0eWxlJiZiLnN0eWxlLmRpcmVjdGlvbil9cmV0dXJuIGEucWF9LFJjPWZ1bmN0aW9uKGEpe3JldHVybiBhLmM/YS5jLmxlbmd0aDowfSxMPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuYz9hLmNbYl18fG51bGw6bnVsbH0sUWM9ZnVuY3Rpb24oYSxiLGMpe2EuYyYmcihhLmMsYixjKX0sVGM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jJiZiP0RhKGEuYyxiKTotMX07dmFyIFZjPWZ1bmN0aW9uKGEsYil7aWYoIWEpdGhyb3cgRXJyb3IoIkludmFsaWQgY2xhc3MgbmFtZSAiK2EpO2lmKCFpYShiKSl0aHJvdyBFcnJvcigiSW52YWxpZCBkZWNvcmF0b3IgZnVuY3Rpb24gIitiKTtVY1thXT1ifSxXYz17fSxVYz17fTt2YXIgWGM9ZnVuY3Rpb24oYSl7dGhpcy5oPWF9O2RhKFhjKTt2YXIgWWM9ZnVuY3Rpb24oYSxiKXthJiYoYS50YWJJbmRleD1iPzA6LTEpfSwkYz1mdW5jdGlvbihhLGIsYyl7Yy5pZCYmTWMoYixjLmlkKTt2YXIgZD1hLmIoKSxlPSExLGY9RChjKTtmJiZyKGYsZnVuY3Rpb24oZyl7Zz09ZD9lPSEwOmcmJnRoaXMuZyhiLGcsZCl9LGEpO2V8fEViKGMsZCk7WmMoYixjKTtyZXR1cm4gY307WGMucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiLGMpe2I9PWMrIi1kaXNhYmxlZCI/YS5aKCExKTpiPT1jKyItaG9yaXpvbnRhbCI/YWQoYSwiaG9yaXpvbnRhbCIpOmI9PWMrIi12ZXJ0aWNhbCImJmFkKGEsInZlcnRpY2FsIil9Owp2YXIgWmM9ZnVuY3Rpb24oYSxiKXtpZihiKWZvcih2YXIgYz1iLmZpcnN0Q2hpbGQsZDtjJiZjLnBhcmVudE5vZGU9PWI7KXtkPWMubmV4dFNpYmxpbmc7aWYoMT09Yy5ub2RlVHlwZSl7YTp7dmFyIGU9YztxKGUpO2U9RChlKTtmb3IodmFyIGY9MCxnPWUubGVuZ3RoO2Y8ZztmKyspe3ZhciBrPWVbZl07aWYoaz1rIGluIFVjP1VjW2tdKCk6bnVsbCl7ZT1rO2JyZWFrIGF9fWU9bnVsbH1lJiYoZS5hPWMsYS5pc0VuYWJsZWQoKXx8ZS5aKCExKSxhLnNhKGUpLFBjKGUsYykpfWVsc2UgYy5ub2RlVmFsdWUmJiIiIT1NYShjLm5vZGVWYWx1ZSl8fGIucmVtb3ZlQ2hpbGQoYyk7Yz1kfX0sYmQ9ZnVuY3Rpb24oYSxiKXtiPWIuZigpO3EoYiwiVGhlIGNvbnRhaW5lciBET00gZWxlbWVudCBjYW5ub3QgYmUgbnVsbC4iKTtIYyhiLHgpO3YmJihiLmhpZGVGb2N1cz0hMCk7KGE9YS5oKSYmdmIoYixhKX07WGMucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKWGMucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5iKCksYz1bYiwiaG9yaXpvbnRhbCI9PWEuSD9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgTT1mdW5jdGlvbigpe30sY2Q7ZGEoTSk7dmFyIGRkPXtidXR0b246InByZXNzZWQiLGNoZWNrYm94OiJjaGVja2VkIixtZW51aXRlbToic2VsZWN0ZWQiLG1lbnVpdGVtY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtcmFkaW86ImNoZWNrZWQiLHJhZGlvOiJjaGVja2VkIix0YWI6InNlbGVjdGVkIix0cmVlaXRlbToic2VsZWN0ZWQifTtNLnByb3RvdHlwZS5oPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLmouYigiRElWIixlZCh0aGlzLGEpLmpvaW4oIiAiKSxhLmJhKX07dmFyIGdkPWZ1bmN0aW9uKGEsYixjKXtpZihhPWEuZj9hLmYoKTphKXt2YXIgZD1bYl07diYmIUEoIjciKSYmKGQ9ZmQoRChhKSxiKSxkLnB1c2goYikpOyhjP0ZiOkhiKShhLGQpfX07Ck0ucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiKXtiLmlkJiZNYyhhLGIuaWQpO2ImJmIuZmlyc3RDaGlsZD9oZChhLGIuZmlyc3RDaGlsZC5uZXh0U2libGluZz9KYShiLmNoaWxkTm9kZXMpOmIuZmlyc3RDaGlsZCk6YS5iYT1udWxsO3ZhciBjPTAsZD10aGlzLmEoKSxlPXRoaXMuYSgpLGY9ITEsZz0hMSxrPSExLHA9SmEoRChiKSk7cihwLGZ1bmN0aW9uKEIpe2Z8fEIhPWQ/Z3x8QiE9ZT9jfD1pZCh0aGlzLEIpOmc9ITA6KGY9ITAsZT09ZCYmKGc9ITApKTsxPT1pZCh0aGlzLEIpJiYoQWEoYiksc2IoYikmJnRiKGIpJiZyYihiLCExKSl9LHRoaXMpO2Eubz1jO2Z8fChwLnB1c2goZCksZT09ZCYmKGc9ITApKTtnfHxwLnB1c2goZSk7KGE9YS53YSkmJnAucHVzaC5hcHBseShwLGEpO2lmKHYmJiFBKCI3Iikpe3ZhciB3PWZkKHApOzA8dy5sZW5ndGgmJihwLnB1c2guYXBwbHkocCx3KSxrPSEwKX1mJiZnJiYhYSYmIWt8fENiKGIscC5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIGpkPWZ1bmN0aW9uKGEsYil7aWYoYT1hLmgoKSl7cShiLCJUaGUgZWxlbWVudCBwYXNzZWQgYXMgYSBmaXJzdCBwYXJhbWV0ZXIgY2Fubm90IGJlIG51bGwuIik7dmFyIGM9Yi5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDthIT1jJiZ2YihiLGEpfX0sa2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYztpZihhLnYmMzImJihjPWEuZigpKSl7aWYoIWImJmEubyYzMil7dHJ5e2MuYmx1cigpfWNhdGNoKGQpe31hLm8mMzImJmEuRmEobnVsbCl9KHNiKGMpJiZ0YihjKSkhPWImJnJiKGMsYil9fSxsZD1mdW5jdGlvbihhLGIsYyl7Y2R8fChjZD17MToiZGlzYWJsZWQiLDg6InNlbGVjdGVkIiwxNjoiY2hlY2tlZCIsNjQ6ImV4cGFuZGVkIn0pO3EoYSwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO2I9Y2RbYl07dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDtkJiYoZD1kZFtkXXx8YixiPSJjaGVja2VkIj09Ynx8InNlbGVjdGVkIj09CmI/ZDpiKTtiJiZ4YihhLGIsYyl9O00ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250cm9sIn07CnZhciBlZD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuYSgpLGQ9W2NdLGU9YS5hKCk7ZSE9YyYmZC5wdXNoKGUpO2M9Yi5vO2ZvcihlPVtdO2M7KXt2YXIgZj1jJi1jO2UucHVzaChtZChhLGYpKTtjJj1+Zn1kLnB1c2guYXBwbHkoZCxlKTsoYT1iLndhKSYmZC5wdXNoLmFwcGx5KGQsYSk7diYmIUEoIjciKSYmZC5wdXNoLmFwcGx5KGQsZmQoZCkpO3JldHVybiBkfSxmZD1mdW5jdGlvbihhLGIpe3ZhciBjPVtdO2ImJihhPUlhKGEsW2JdKSk7cihbXSxmdW5jdGlvbihkKXshRmEoZCxsYShHYSxhKSl8fGImJiFHYShkLGIpfHxjLnB1c2goZC5qb2luKCJfIikpfSk7cmV0dXJuIGN9LG1kPWZ1bmN0aW9uKGEsYil7YS5ifHxuZChhKTtyZXR1cm4gYS5iW2JdfSxpZD1mdW5jdGlvbihhLGIpe2Euanx8KGEuYnx8bmQoYSksYS5qPXNhKGEuYikpO2E9cGFyc2VJbnQoYS5qW2JdLDEwKTtyZXR1cm4gaXNOYU4oYSk/MDphfSxuZD1mdW5jdGlvbihhKXt2YXIgYj1hLmEoKSxjPSF0KGIucmVwbGFjZSgvXHhhMHxccy9nLAoiICIpLCIgIik7cShjLCJDb250cm9sUmVuZGVyZXIgaGFzIGFuIGludmFsaWQgY3NzIGNsYXNzOiAnIitiKyInIik7YS5iPXsxOmIrIi1kaXNhYmxlZCIsMjpiKyItaG92ZXIiLDQ6YisiLWFjdGl2ZSIsODpiKyItc2VsZWN0ZWQiLDE2OmIrIi1jaGVja2VkIiwzMjpiKyItZm9jdXNlZCIsNjQ6YisiLW9wZW4ifX07dmFyIE49ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO2lmKCFiKXtiPXRoaXMuY29uc3RydWN0b3I7Zm9yKHZhciBkO2I7KXtkPWJbamFdfHwoYltqYV09KytrYSk7aWYoZD1XY1tkXSlicmVhaztiPWIuaT9iLmkuY29uc3RydWN0b3I6bnVsbH1iPWQ/aWEoZC5SKT9kLlIoKTpuZXcgZDpudWxsfXRoaXMuQj1iO3RoaXMuYmE9dm9pZCAwIT09YT9hOm51bGx9O24oTixLKTtoPU4ucHJvdG90eXBlO2guYmE9bnVsbDtoLm89MDtoLnY9Mzk7aC5LPTA7aC5JYT0hMDtoLndhPW51bGw7aC55YT0hMDtoLmlhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CLmModGhpcyk7dGhpcy5hPWE7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmeGIoYSwiaGlkZGVuIiwhMCkpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hPXRoaXMuQi5nKHRoaXMsYSk7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5JYT0ibm9uZSIhPWEuc3R5bGUuZGlzcGxheX07CmguRD1mdW5jdGlvbigpe04uaS5ELmNhbGwodGhpcyk7dmFyIGE9TmModGhpcyk7cSh0aGlzKTtxKGEpO3RoaXMuaXNWaXNpYmxlKCl8fHhiKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fGxkKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy52JjgmJmxkKGEsOCwhISh0aGlzLm8mOCkpO3RoaXMudiYxNiYmbGQoYSwxNiwhISh0aGlzLm8mMTYpKTt0aGlzLnYmNjQmJmxkKGEsNjQsISEodGhpcy5vJjY0KSk7YT10aGlzLkI7U2ModGhpcykmJmdkKHRoaXMuZigpLGEuYSgpKyItcnRsIiwhMCk7dGhpcy5pc0VuYWJsZWQoKSYma2QodGhpcyx0aGlzLmlzVmlzaWJsZSgpKTtpZih0aGlzLnYmLTImJih0aGlzLnlhJiZvZCh0aGlzLCEwKSx0aGlzLnYmMzImJihhPXRoaXMuZigpKSkpe3ZhciBiPXRoaXMuV3x8KHRoaXMuVz1uZXcgSik7emMoYixhKTtIKEgoSChPYyh0aGlzKSxiLCJrZXkiLHRoaXMuZmEpLGEsImZvY3VzIix0aGlzLk5hKSxhLCJibHVyIiwKdGhpcy5GYSl9fTt2YXIgb2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYz1PYyhhKSxkPWEuZigpO2I/KEgoSChIKEgoYyxkLEYuTCxhLmthKSxkLFtGLk0sRi5hYV0sYS5sYSksZCwibW91c2VvdmVyIixhLkFhKSxkLCJtb3VzZW91dCIsYS56YSksYS5lYSE9Y2EmJkgoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fEgoYyxkLCJkYmxjbGljayIsYS5KYSksYS5nYXx8KGEuZ2E9bmV3IHBkKGEpLHpiKGEsbGEoQWIsYS5nYSkpKSkpOihxYyhxYyhxYyhxYyhjLGQsRi5MLGEua2EpLGQsW0YuTSxGLmFhXSxhLmxhKSxkLCJtb3VzZW92ZXIiLGEuQWEpLGQsIm1vdXNlb3V0IixhLnphKSxhLmVhIT1jYSYmcWMoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fHFjKGMsZCwiZGJsY2xpY2siLGEuSmEpLEFiKGEuZ2EpLGEuZ2E9bnVsbCkpfTsKTi5wcm90b3R5cGUuUD1mdW5jdGlvbigpe04uaS5QLmNhbGwodGhpcyk7dGhpcy5XJiZGYyh0aGlzLlcpO3RoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJmtkKHRoaXMsITEpfTtOLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7Ti5pLnUuY2FsbCh0aGlzKTt0aGlzLlcmJih0aGlzLlcuTigpLGRlbGV0ZSB0aGlzLlcpO2RlbGV0ZSB0aGlzLkI7dGhpcy5nYT10aGlzLndhPXRoaXMuYmE9bnVsbH07dmFyIGhkPWZ1bmN0aW9uKGEsYil7YS5iYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm8mMSl9OwpOLnByb3RvdHlwZS5aPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYjtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0VuYWJsZWQmJiFiLmlzRW5hYmxlZCgpfHwhTyh0aGlzLDEsIWEpfHwoYXx8KHFkKHRoaXMsITEpLFAodGhpcywhMSkpLHRoaXMuaXNWaXNpYmxlKCkmJmtkKHRoaXMsYSksUSh0aGlzLDEsIWEsITApKX07CnZhciBQPWZ1bmN0aW9uKGEsYil7TyhhLDIsYikmJlEoYSwyLGIpfSxxZD1mdW5jdGlvbihhLGIpe08oYSw0LGIpJiZRKGEsNCxiKX0scmQ9ZnVuY3Rpb24oYSxiKXtPKGEsOCxiKSYmUShhLDgsYil9LHNkPWZ1bmN0aW9uKGEsYil7TyhhLDY0LGIpJiZRKGEsNjQsYil9LFE9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIWQmJjE9PWIpYS5aKCFjKTtlbHNlIGlmKGEudiZiJiZjIT0hIShhLm8mYikpe3ZhciBlPWEuQjtpZihkPWEuZigpKShlPW1kKGUsYikpJiZnZChhLGUsYyksbGQoZCxiLGMpO2Eubz1jP2Eub3xiOmEubyZ+Yn19LHRkPWZ1bmN0aW9uKGEsYixjKXtpZihhLm0mJmEubyZiJiYhYyl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTshYyYmYS5vJmImJlEoYSxiLCExKTthLnY9Yz9hLnZ8YjphLnYmfmJ9LFI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hISgyNTUmYikmJiEhKGEudiZiKX0sTz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuISEoYS52JmIpJiYhIShhLm8mCmIpIT1jJiYoIShhLksmYil8fHVjKGEsS2MoYixjKSkpJiYhYS5VfTtoPU4ucHJvdG90eXBlO2guQWE9ZnVuY3Rpb24oYSl7KCFhLnJlbGF0ZWRUYXJnZXR8fCFwYih0aGlzLmYoKSxhLnJlbGF0ZWRUYXJnZXQpKSYmdWModGhpcywiZW50ZXIiKSYmdGhpcy5pc0VuYWJsZWQoKSYmUih0aGlzLDIpJiZQKHRoaXMsITApfTtoLnphPWZ1bmN0aW9uKGEpe2EucmVsYXRlZFRhcmdldCYmcGIodGhpcy5mKCksYS5yZWxhdGVkVGFyZ2V0KXx8IXVjKHRoaXMsImxlYXZlIil8fChSKHRoaXMsNCkmJnFkKHRoaXMsITEpLFIodGhpcywyKSYmUCh0aGlzLCExKSl9O2guZWE9Y2E7Cmgua2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSxPYihhKSYmISh5JiZ6JiZhLmN0cmxLZXkpKSl7Uih0aGlzLDQpJiZxZCh0aGlzLCEwKTt2YXIgYjtpZihiPXRoaXMuQil7dmFyIGM7Yj10aGlzLnYmMzImJihjPXRoaXMuZigpKT9zYihjKSYmdGIoYyk6ITF9YiYmdGhpcy5mKCkuZm9jdXMoKX0hT2IoYSl8fHkmJnomJmEuY3RybEtleXx8YS5nKCl9O2gubGE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSx0aGlzLm8mNCYmdWQodGhpcyxhKSYmUih0aGlzLDQpJiZxZCh0aGlzLCExKSl9O2guSmE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmdWQodGhpcyxhKX07CnZhciB1ZD1mdW5jdGlvbihhLGIpe2lmKFIoYSwxNikpe3ZhciBjPSEoYS5vJjE2KTtPKGEsMTYsYykmJlEoYSwxNixjKX1SKGEsOCkmJnJkKGEsITApO1IoYSw2NCkmJnNkKGEsIShhLm8mNjQpKTtjPW5ldyBFKCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuQT1iLkEpO3JldHVybiB1YyhhLGMpfTtOLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe1IodGhpcywzMikmJk8odGhpcywzMiwhMCkmJlEodGhpcywzMiwhMCl9O04ucHJvdG90eXBlLkZhPWZ1bmN0aW9uKCl7Uih0aGlzLDQpJiZxZCh0aGlzLCExKTtSKHRoaXMsMzIpJiZPKHRoaXMsMzIsITEpJiZRKHRoaXMsMzIsITEpfTsKTi5wcm90b3R5cGUuZmE9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJjEzPT1hLmMmJnVkKHRoaXMsYSk/KGEuZygpLGEuaigpLCEwKTohMX07aWYoIWlhKE4pKXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBjbGFzcyAiK04pO2lmKCFpYShNKSl0aHJvdyBFcnJvcigiSW52YWxpZCByZW5kZXJlciBjbGFzcyAiK00pO3ZhciB2ZD1OW2phXXx8KE5bamFdPSsra2EpO1djW3ZkXT1NO1ZjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIHBkPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9ITE7dGhpcy5jPW5ldyBvYyh0aGlzKTt6Yih0aGlzLGxhKEFiLHRoaXMuYykpO2E9TmModGhpcy5iKTtIKEgoSCh0aGlzLmMsYSxGLkwsdGhpcy5oKSxhLEYuTSx0aGlzLmopLGEsImNsaWNrIix0aGlzLmcpfTtuKHBkLEMpO3ZhciB3ZD0hdnx8OTw9TnVtYmVyKGliKTsKcGQucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXt0aGlzLmE9ITF9O3BkLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7dGhpcy5hPSEwfTt2YXIgeGQ9ZnVuY3Rpb24oYSxiKXtpZighd2QpcmV0dXJuIGEuYnV0dG9uPTAsYS50eXBlPWIsYTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudHMiKTtjLmluaXRNb3VzZUV2ZW50KGIsYS5idWJibGVzLGEuY2FuY2VsYWJsZSxhLnZpZXd8fG51bGwsYS5kZXRhaWwsYS5zY3JlZW5YLGEuc2NyZWVuWSxhLmNsaWVudFgsYS5jbGllbnRZLGEuY3RybEtleSxhLmFsdEtleSxhLnNoaWZ0S2V5LGEubWV0YUtleSwwLGEucmVsYXRlZFRhcmdldHx8bnVsbCk7cmV0dXJuIGN9OwpwZC5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXtpZih0aGlzLmEpdGhpcy5hPSExO2Vsc2V7dmFyIGI9YS5iLGM9Yi5idXR0b24sZD1iLnR5cGUsZT14ZChiLCJtb3VzZWRvd24iKTt0aGlzLmIua2EobmV3IEcoZSxhLmEpKTtlPXhkKGIsIm1vdXNldXAiKTt0aGlzLmIubGEobmV3IEcoZSxhLmEpKTt3ZHx8KGIuYnV0dG9uPWMsYi50eXBlPWQpfX07cGQucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt0aGlzLmI9bnVsbDtwZC5pLnUuY2FsbCh0aGlzKX07dmFyIFM9ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO3RoaXMuZGE9Ynx8WGMuUigpO3RoaXMuSD1hfHwidmVydGljYWwifTtuKFMsSyk7aD1TLnByb3RvdHlwZTtoLkRhPW51bGw7aC5jYT1udWxsO2guZGE9bnVsbDtoLkg9bnVsbDtoLlQ9ITA7aC5PPSEwO2gubD0tMTtoLnM9bnVsbDtoLlY9ITE7aC5JPW51bGw7dmFyIHlkPWZ1bmN0aW9uKGEpe3JldHVybiBhLkRhfHxhLmYoKX07aD1TLnByb3RvdHlwZTtoLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPXRoaXMuai5iKCJESVYiLHRoaXMuZGEuYyh0aGlzKS5qb2luKCIgIikpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKGEpe3JldHVybiJESVYiPT1hLnRhZ05hbWV9O2gudmE9ZnVuY3Rpb24oYSl7dGhpcy5hPSRjKHRoaXMuZGEsdGhpcyxhKTsibm9uZSI9PWEuc3R5bGUuZGlzcGxheSYmKHRoaXMuVD0hMSl9OwpoLkQ9ZnVuY3Rpb24oKXtTLmkuRC5jYWxsKHRoaXMpO1FjKHRoaXMsZnVuY3Rpb24oYil7Yi5tJiZ6ZCh0aGlzLGIpfSx0aGlzKTt2YXIgYT10aGlzLmYoKTtiZCh0aGlzLmRhLHRoaXMpO0FkKHRoaXMsdGhpcy5UKTtIKEgoSChIKEgoSChIKEgoT2ModGhpcyksdGhpcywiZW50ZXIiLHRoaXMuV2EpLHRoaXMsImhpZ2hsaWdodCIsdGhpcy5YYSksdGhpcywidW5oaWdobGlnaHQiLHRoaXMuY2IpLHRoaXMsIm9wZW4iLHRoaXMuWWEpLHRoaXMsImNsb3NlIix0aGlzLlVhKSxhLEYuTCx0aGlzLlNhKSxxYihhKSxbRi5NLEYuYWFdLHRoaXMuVmEpLGEsW0YuTCxGLk0sRi5hYSwibW91c2VvdmVyIiwibW91c2VvdXQiLCJjb250ZXh0bWVudSJdLHRoaXMuVGEpO0JkKHRoaXMpfTt2YXIgQmQ9ZnVuY3Rpb24oYSl7dmFyIGI9T2MoYSksYz15ZChhKTtIKEgoSChiLGMsImZvY3VzIixhLkhhKSxjLCJibHVyIixhLlFhKSxhLmNhfHwoYS5jYT1uZXcgSih5ZChhKSkpLCJrZXkiLGEuUmEpfTtoPVMucHJvdG90eXBlOwpoLlA9ZnVuY3Rpb24oKXtDZCh0aGlzLC0xKTt0aGlzLnMmJnNkKHRoaXMucywhMSk7dGhpcy5WPSExO1MuaS5QLmNhbGwodGhpcyl9O2gudT1mdW5jdGlvbigpe1MuaS51LmNhbGwodGhpcyk7dGhpcy5jYSYmKHRoaXMuY2EuTigpLHRoaXMuY2E9bnVsbCk7dGhpcy5kYT10aGlzLnM9dGhpcy5JPXRoaXMuRGE9bnVsbH07aC5XYT1mdW5jdGlvbigpe3JldHVybiEwfTsKaC5YYT1mdW5jdGlvbihhKXt2YXIgYj1UYyh0aGlzLGEudGFyZ2V0KTtpZigtMTxiJiZiIT10aGlzLmwpe3ZhciBjPUwodGhpcyx0aGlzLmwpO2MmJlAoYywhMSk7dGhpcy5sPWI7Yz1MKHRoaXMsdGhpcy5sKTt0aGlzLlYmJnFkKGMsITApO3RoaXMucyYmYyE9dGhpcy5zJiYoYy52JjY0P3NkKGMsITApOnNkKHRoaXMucywhMSkpfWI9dGhpcy5mKCk7cShiLCJUaGUgRE9NIGVsZW1lbnQgZm9yIHRoZSBjb250YWluZXIgY2Fubm90IGJlIG51bGwuIik7bnVsbCE9YS50YXJnZXQuZigpJiZ4YihiLCJhY3RpdmVkZXNjZW5kYW50IixhLnRhcmdldC5mKCkuaWQpfTtoLmNiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT1MKHRoaXMsdGhpcy5sKSYmKHRoaXMubD0tMSk7YT10aGlzLmYoKTtxKGEsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnJlbW92ZUF0dHJpYnV0ZSh3YigiYWN0aXZlZGVzY2VuZGFudCIpKX07CmguWWE9ZnVuY3Rpb24oYSl7KGE9YS50YXJnZXQpJiZhIT10aGlzLnMmJmEuYj09dGhpcyYmKHRoaXMucyYmc2QodGhpcy5zLCExKSx0aGlzLnM9YSl9O2guVWE9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMucyYmKHRoaXMucz1udWxsKTt2YXIgYj10aGlzLmYoKSxjPWEudGFyZ2V0LmYoKTtiJiZhLnRhcmdldC5vJjImJmMmJihhPSIiLGMmJihhPWMuaWQscShhLCJUaGUgYWN0aXZlIGVsZW1lbnQgc2hvdWxkIGhhdmUgYW4gaWQuIikpLHhiKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEpKX07aC5TYT1mdW5jdGlvbihhKXt0aGlzLk8mJih0aGlzLlY9ITApO3ZhciBiPXlkKHRoaXMpO2ImJnNiKGIpJiZ0YihiKT9iLmZvY3VzKCk6YS5nKCl9O2guVmE9ZnVuY3Rpb24oKXt0aGlzLlY9ITF9OwpoLlRhPWZ1bmN0aW9uKGEpe2E6e3ZhciBiPWEudGFyZ2V0O2lmKHRoaXMuSSlmb3IodmFyIGM9dGhpcy5mKCk7YiYmYiE9PWM7KXt2YXIgZD1iLmlkO2lmKGQgaW4gdGhpcy5JKXtiPXRoaXMuSVtkXTticmVhayBhfWI9Yi5wYXJlbnROb2RlfWI9bnVsbH1pZihiKXN3aXRjaChhLnR5cGUpe2Nhc2UgRi5MOmIua2EoYSk7YnJlYWs7Y2FzZSBGLk06Y2FzZSBGLmFhOmIubGEoYSk7YnJlYWs7Y2FzZSAibW91c2VvdmVyIjpiLkFhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3V0IjpiLnphKGEpO2JyZWFrO2Nhc2UgImNvbnRleHRtZW51IjpiLmVhKGEpfX07aC5IYT1mdW5jdGlvbigpe307aC5RYT1mdW5jdGlvbigpe0NkKHRoaXMsLTEpO3RoaXMuVj0hMTt0aGlzLnMmJnNkKHRoaXMucywhMSl9OwpoLlJhPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmlzRW5hYmxlZCgpJiZ0aGlzLmlzVmlzaWJsZSgpJiYoMCE9UmModGhpcyl8fHRoaXMuRGEpJiZEZCh0aGlzLGEpPyhhLmcoKSxhLmooKSwhMCk6ITF9Owp2YXIgRGQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1MKGEsYS5sKTtpZihjJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5mYSYmYy5mYShiKXx8YS5zJiZhLnMhPWMmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLnMuZmEmJmEucy5mYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuYyl7Y2FzZSAyNzp5ZChhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpFZChhKTticmVhaztjYXNlIDM1OkZkKGEpO2JyZWFrO2Nhc2UgMzg6aWYoInZlcnRpY2FsIj09YS5IKUdkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9IZChhKTpHZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoInZlcnRpY2FsIj09YS5IKUhkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9HZChhKTpIZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSx6ZD1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZigpO2M9Yy5pZHx8KGMuaWQ9TGMoYikpO2EuSXx8KGEuST17fSk7YS5JW2NdPWJ9O1MucHJvdG90eXBlLnNhPWZ1bmN0aW9uKGEsYil7Q2EoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtTLmkuc2EuY2FsbCh0aGlzLGEsYil9O1MucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEsYixjKXtDYShhLE4pO2EuS3w9MjthLkt8PTY0O3RkKGEsMzIsITEpO2EubSYmMCE9YS55YSYmb2QoYSwhMSk7YS55YT0hMTt2YXIgZD1hLmI9PXRoaXM/VGModGhpcyxhKTotMTtTLmkudGEuY2FsbCh0aGlzLGEsYixjKTthLm0mJnRoaXMubSYmemQodGhpcyxhKTthPWQ7LTE9PWEmJihhPVJjKHRoaXMpKTthPT10aGlzLmw/dGhpcy5sPU1hdGgubWluKFJjKHRoaXMpLTEsYik6YT50aGlzLmwmJmI8PXRoaXMubD90aGlzLmwrKzphPHRoaXMubCYmYj50aGlzLmwmJnRoaXMubC0tfTsKdmFyIGFkPWZ1bmN0aW9uKGEsYil7aWYoYS5mKCkpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5IPWJ9O1MucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O3ZhciBBZD1mdW5jdGlvbihhLGIpe2EuVD1iO3ZhciBjPWEuZigpO2MmJihjLnN0eWxlLmRpc3BsYXk9Yj8iIjoibm9uZSIsWWMoeWQoYSksYS5PJiZhLlQpKX07Uy5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT307Uy5wcm90b3R5cGUuWj1mdW5jdGlvbihhKXt0aGlzLk8hPWEmJnVjKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5PPSEwLFFjKHRoaXMsZnVuY3Rpb24oYil7Yi5MYT9kZWxldGUgYi5MYTpiLlooITApfSkpOihRYyh0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5aKCExKTpiLkxhPSEwfSksdGhpcy5WPXRoaXMuTz0hMSksWWMoeWQodGhpcyksYSYmdGhpcy5UKSl9Owp2YXIgQ2Q9ZnVuY3Rpb24oYSxiKXsoYj1MKGEsYikpP1AoYiwhMCk6LTE8YS5sJiZQKEwoYSxhLmwpLCExKX0sRWQ9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LFJjKGEpLTEpfSxGZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiAwPmI/Yy0xOmJ9LDApfSxIZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7cmV0dXJuKGIrMSklY30sYS5sKX0sR2Q9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe2ItLTtyZXR1cm4gMD5iP2MtMTpifSxhLmwpfSxJZD1mdW5jdGlvbihhLGIsYyl7Yz0wPmM/VGMoYSxhLnMpOmM7dmFyIGQ9UmMoYSk7Yz1iLmNhbGwoYSxjLGQpO2Zvcih2YXIgZT0wO2U8PWQ7KXt2YXIgZj1MKGEsYyksZztpZihnPWYpZz1mLmlzVmlzaWJsZSgpJiZmLmlzRW5hYmxlZCgpJiYhIShmLnYmMik7aWYoZyl7YS5FYShjKTticmVha31lKys7Yz1iLmNhbGwoYSxjLGQpfX07ClMucHJvdG90eXBlLkVhPWZ1bmN0aW9uKGEpe0NkKHRoaXMsYSl9O3ZhciBUPWZ1bmN0aW9uKCl7fTtuKFQsTSk7ZGEoVCk7VC5wcm90b3R5cGUuYT1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYiJ9O1QucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXtyZXR1cm4idGFiIn07VC5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYj1ULmkuYy5jYWxsKHRoaXMsYSk7KGE9YS5QYSkmJmImJihiLnRpdGxlPWF8fCIiKTtyZXR1cm4gYn07VC5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIpe2I9VC5pLmcuY2FsbCh0aGlzLGEsYik7dmFyIGM9Yi50aXRsZXx8IiI7YyYmKGEuUGE9Yyk7YS5vJjgmJihjPWEuYikmJmlhKGMuRykmJihRKGEsOCwhMSksYy5HKGEpKTtyZXR1cm4gYn07dmFyIEpkPWZ1bmN0aW9uKGEsYixjKXtOLmNhbGwodGhpcyxhLGJ8fFQuUigpLGMpO3RkKHRoaXMsOCwhMCk7dGhpcy5LfD05fTtuKEpkLE4pO1ZjKCJnb29nLXRhYiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEpkKG51bGwpfSk7dmFyIFU9ZnVuY3Rpb24oKXt0aGlzLmg9InRhYmxpc3QifTtuKFUsWGMpO2RhKFUpO1UucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWItYmFyIn07VS5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIsYyl7dGhpcy5qfHwodGhpcy5hfHxLZCh0aGlzKSx0aGlzLmo9c2EodGhpcy5hKSk7dmFyIGQ9dGhpcy5qW2JdO2Q/KGFkKGEsTGQoZCkpLGEuQj1kKTpVLmkuZy5jYWxsKHRoaXMsYSxiLGMpfTtVLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPVUuaS5jLmNhbGwodGhpcyxhKTt0aGlzLmF8fEtkKHRoaXMpO2IucHVzaCh0aGlzLmFbYS5CXSk7cmV0dXJuIGJ9O3ZhciBLZD1mdW5jdGlvbihhKXt2YXIgYj1hLmIoKTthLmE9e3RvcDpiKyItdG9wIixib3R0b206YisiLWJvdHRvbSIsc3RhcnQ6YisiLXN0YXJ0IixlbmQ6YisiLWVuZCJ9fTt2YXIgVj1mdW5jdGlvbihhLGIsYyl7YT1hfHwidG9wIjthZCh0aGlzLExkKGEpKTt0aGlzLkI9YTtTLmNhbGwodGhpcyx0aGlzLkgsYnx8VS5SKCksYyk7TWQodGhpcyl9O24oVixTKTtoPVYucHJvdG90eXBlO2guQz1udWxsO2guRD1mdW5jdGlvbigpe1YuaS5ELmNhbGwodGhpcyk7TWQodGhpcyl9O2gudT1mdW5jdGlvbigpe1YuaS51LmNhbGwodGhpcyk7dGhpcy5DPW51bGx9O2guRWE9ZnVuY3Rpb24oYSl7Vi5pLkVhLmNhbGwodGhpcyxhKTt0aGlzLkcoTCh0aGlzLGEpKX07aC5HPWZ1bmN0aW9uKGEpe2E/cmQoYSwhMCk6dGhpcy5DJiZyZCh0aGlzLkMsITEpfTsKdmFyIE5kPWZ1bmN0aW9uKGEsYil7aWYoYiYmYj09YS5DKXtmb3IodmFyIGM9VGMoYSxiKSxkPWMtMTtiPUwoYSxkKTtkLS0pe3ZhciBlPWI7aWYoZS5pc1Zpc2libGUoKSYmZS5pc0VuYWJsZWQoKSl7YS5HKGIpO3JldHVybn19Zm9yKGMrPTE7Yj1MKGEsYyk7YysrKWlmKGQ9YixkLmlzVmlzaWJsZSgpJiZkLmlzRW5hYmxlZCgpKXthLkcoYik7cmV0dXJufWEuRyhudWxsKX19O2g9Vi5wcm90b3R5cGU7aC5hYj1mdW5jdGlvbihhKXt0aGlzLkMmJnRoaXMuQyE9YS50YXJnZXQmJnJkKHRoaXMuQywhMSk7dGhpcy5DPWEudGFyZ2V0fTtoLmJiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT10aGlzLkMmJih0aGlzLkM9bnVsbCl9O2guWmE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guJGE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guSGE9ZnVuY3Rpb24oKXtMKHRoaXMsdGhpcy5sKXx8Q2QodGhpcyxUYyh0aGlzLHRoaXMuQ3x8TCh0aGlzLDApKSl9Owp2YXIgTWQ9ZnVuY3Rpb24oYSl7SChIKEgoSChPYyhhKSxhLCJzZWxlY3QiLGEuYWIpLGEsInVuc2VsZWN0IixhLmJiKSxhLCJkaXNhYmxlIixhLlphKSxhLCJoaWRlIixhLiRhKX0sTGQ9ZnVuY3Rpb24oYSl7cmV0dXJuInN0YXJ0Ij09YXx8ImVuZCI9PWE/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O1ZjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBWfSk7ZnVuY3Rpb24gT2QoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIFBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgZz1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIrZyk7Zm9yKHZhciBrPVtdLHA9YmEoYyksdz1wLm5leHQoKTshdy5kb25lO3c9cC5uZXh0KCkpe3c9dy52YWx1ZTt2YXIgQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKQi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO0IudGV4dENvbnRlbnQ9dztmLmFwcGVuZENoaWxkKEIpO2sucHVzaChCKX0iYm90dG9tIiE9ZyYmZS5hcHBlbmRDaGlsZChmKTtwPW51bGw7aWYoInRvcCI9PWd8fCJib3R0b20iPT1nKXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTsidG9wIj09ZyYmcCYmZS5hcHBlbmRDaGlsZChwKTtCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0IuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciByYT1bXTtjPWJhKGMpO2Zvcih3PWMubmV4dCgpOyF3LmRvbmU7dz1jLm5leHQoKSl3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHcuaWQ9ZS5pZCsiX2NvbnRlbnRfIityYS5sZW5ndGgsdy5zdHlsZS5kaXNwbGF5PSJub25lIixCLmFwcGVuZENoaWxkKHcpLHJhLnB1c2godyk7ZS5hcHBlbmRDaGlsZChCKTsiYm90dG9tIj09ZyYmKHAmJgplLmFwcGVuZENoaWxkKHApLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBYPW5ldyBWKGcpO1BjKFgsZik7dmFyIFk9LTE7ZGMoWCwic2VsZWN0IixmdW5jdGlvbihaKXtaPWsuaW5kZXhPZihaLnRhcmdldC5mKCkpO1ohPVkmJigwPD1ZJiZZPHJhLmxlbmd0aCYmKHJhW1ldLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFk9LTEpLDA8PVomJlo8cmEubGVuZ3RoJiYoWT1aLHJhW1ldLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksWC5HKEwoWCxZKSkpfSk7WC5HKEwoWCxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFope1guRyhMKFgsWikpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChPZChhKSl9LFFkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sVz1sOwpRZFswXWluIFd8fCJ1bmRlZmluZWQiPT10eXBlb2YgVy5leGVjU2NyaXB0fHxXLmV4ZWNTY3JpcHQoInZhciAiK1FkWzBdKTtmb3IodmFyIFJkO1FkLmxlbmd0aCYmKFJkPVFkLnNoaWZ0KCkpOylRZC5sZW5ndGh8fHZvaWQgMD09PVBkP1dbUmRdJiZXW1JkXSE9PU9iamVjdC5wcm90b3R5cGVbUmRdP1c9V1tSZF06Vz1XW1JkXT17fTpXW1JkXT1QZDt9KS5jYWxsKHRoaXMpOwovLyBjbGFuZy1mb3JtYXQgb24K", + "headers": [ + [ + "content-type", + "application/javascript" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + } + } + }, + "executionInfo": { + "elapsed": 1311, + "status": "ok", + "timestamp": 1600709833476, + "user": { + "displayName": "Evgeny Skvortsov", + "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhiQjODaOVLfYnUuWS9rB3LRntzJDM0hqElzsUkdQ=s64", + "userId": "11510585406840398626" + }, + "user_tz": 420 + }, + "id": "1f5WYb9kRe0O", + "outputId": "8b30b9e7-4fc2-444d-c07e-760f070a6dc2" + }, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id63" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id63" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id63" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"14f0da88-fc31-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id63\", \"tabNames\": [\"Engineers\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_cbb8f5bf71" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id63" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"14f11cc8-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id63\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_e1f4a38c6c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id63" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"14f29a8a-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_4f6af16f89" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_1", + "outputarea_id63" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"14f2ebc0-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id63_content_1\");\n", + "//# sourceURL=js_9d3e61612b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_1", + "outputarea_id63" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"14f337ce-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"14f2ebc0-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_62ef5f9528" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_1", + "outputarea_id63" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"14f3a5e2-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id63\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_554da1b00e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_1", + "outputarea_id63" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running Engineers\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"14f6ef18-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"14f29a8a-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_183f589db4" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_1", + "outputarea_id63" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"14f85768-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_3b03b996ad" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_0", + "outputarea_id63" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"14f8ada8-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id63_content_0\");\n", + "//# sourceURL=js_48f29a1b2a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_0", + "outputarea_id63" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"14f8f63c-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"14f8ada8-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_87abf36f42" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_0", + "outputarea_id63" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"14f93a5c-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id63\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_22241dfb4b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_0", + "outputarea_id63" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_0", + "outputarea_id63", + "outputarea_id64", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_0", + "outputarea_id63", + "outputarea_id64", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_0", + "outputarea_id63", + "outputarea_id64", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"14fabada-fc31-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id64\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_14f4ca6898" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_0", + "outputarea_id63", + "outputarea_id64", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"14faffe0-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id64\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_3422a6fad7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_0", + "outputarea_id63", + "outputarea_id64", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"14fc2b2c-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_181c82872c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_0", + "id64_content_0", + "outputarea_id63", + "outputarea_id64", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"14fc708c-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id64_content_0\");\n", + "//# sourceURL=js_eaecf1dc4a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_0", + "id64_content_0", + "outputarea_id63", + "outputarea_id64", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"14fcb61e-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"14fc708c-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_995174188f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_0", + "id64_content_0", + "outputarea_id63", + "outputarea_id64", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"14fcf7e6-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id64\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_ca78991ba1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_0", + "id64_content_0", + "outputarea_id63", + "outputarea_id64", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mEngineers_sql\u001b[0m variable.\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " \"Alice\" AS name,\n", + " \"Product Manager\" AS role,\n", + " \"SEA\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Bob\" AS name,\n", + " \"Engineer\" AS role,\n", + " \"SEA\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Caroline\" AS name,\n", + " \"Engineer\" AS role,\n", + " \"LAX\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"David\" AS name,\n", + " \"Data Scientist\" AS role,\n", + " \"LAX\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Eve\" AS name,\n", + " \"Data Scientist\" AS role,\n", + " \"SEA\" AS office\n", + " \n", + ") )\n", + "SELECT\n", + " Employee.*\n", + "FROM\n", + " t_0_Employee AS Employee\n", + "WHERE\n", + " Employee.role = \"Engineer\";\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"14fdf7e0-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"14fc2b2c-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_c42926be7a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_0", + "id64_content_0", + "outputarea_id63", + "outputarea_id64", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"14ff1846-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"14f85768-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_6aa1a03043" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_0", + "outputarea_id63" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"15008a3c-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_7d51229ad0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_1", + "outputarea_id63" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1500d654-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id63_content_1\");\n", + "//# sourceURL=js_3eb44f33fa" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_1", + "outputarea_id63" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"15011a6a-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1500d654-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_d5346e0afc" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_1", + "outputarea_id63" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1501648e-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id63\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_489250d34d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_1", + "outputarea_id63" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1575d9f4-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"15008a3c-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_21ff2e0582" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_1", + "outputarea_id63" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"15790854-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b81d904004" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_0", + "outputarea_id63" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"15799576-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id63_content_0\");\n", + "//# sourceURL=js_ee77d4fea1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_0", + "outputarea_id63" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"157a0a92-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"15799576-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_6de87ec70c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_0", + "outputarea_id63" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"157a7d1a-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id63\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_17b6d18144" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_0", + "outputarea_id63" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"157c0798-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_0b1c01dac9" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_0", + "id64_content_1", + "outputarea_id63", + "outputarea_id64", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"157c5720-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id64_content_1\");\n", + "//# sourceURL=js_40f24373b4" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_0", + "id64_content_1", + "outputarea_id63", + "outputarea_id64", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"157c9e4c-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"157c5720-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_0cb4fdcd8a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_0", + "id64_content_1", + "outputarea_id63", + "outputarea_id64", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"157ce870-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id64\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_3003d2223b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_0", + "id64_content_1", + "outputarea_id63", + "outputarea_id64", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mEngineers\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nameroleoffice
0BobEngineerSEA
1CarolineEngineerLAX
\n", + "
" + ], + "text/plain": [ + " name role office\n", + "0 Bob Engineer SEA\n", + "1 Caroline Engineer LAX" + ] + }, + "metadata": { + "tags": [ + "id63_content_0", + "id64_content_1", + "outputarea_id63", + "outputarea_id64", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"15804358-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"157c0798-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_90608fd80a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_0", + "id64_content_1", + "outputarea_id63", + "outputarea_id64", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1581c494-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"15790854-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_bb902391a1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id63_content_0", + "outputarea_id63" + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "%%logica Engineers\n", + "\n", + "Employee(name: \"Alice\", role: \"Product Manager\", office: \"SEA\");\n", + "Employee(name: \"Bob\", role: \"Engineer\", office: \"SEA\");\n", + "Employee(name: \"Caroline\", role: \"Engineer\", office: \"LAX\");\n", + "Employee(name: \"David\", role: \"Data Scientist\", office: \"LAX\");\n", + "Employee(name: \"Eve\", role: \"Data Scientist\", office: \"SEA\");\n", + "\n", + "IsEngineer(record) :- record.role == \"Engineer\";\n", + " \n", + "Engineers(..r) :- Employee(..r), IsEngineer(r);" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "8-T2QJ84SNXT" + }, + "source": [ + "If you tried to render IsEngineer you would get an error:\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "AZgQyWZwc709" + }, + "source": [ + "![variable_error.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA3oAAAAcCAYAAAA3Fs2iAAAbmUlEQVR4Xu2dB/jX0xfHT5Ikm0h2iZLIJrJCpYzsPbPK3iOrjKhk71FCZWUXIlFIdpRdZGWGpEX/53V///Pr9ukz7nf81te5z9Pze/p+P+Pe9z33nPM+59z7rTVv3rx5Ys0QMAQMAUPAEDAEDAFDwBAwBAwBQ6BkEKhlRK9k5tIGYggYAoaAIWAIGAKGgCFgCBgChoBDwIieCYIhYAgYAoaAIWAIGAKGgCFgCBgCJYaAEb0Sm1AbjiFgCBgChoAhYAgYAoaAIWAIGAJG9EwGDAFDwBAwBAwBQ8AQMAQMAUPAECgxBIzoldiE2nAMAUPAEDAEDAFDwBAwBAwBQ8AQMKJnMmAIGAKGgCFgCBgChoAhYAgYAoZAiSFgRK/EJtSGYwgYAoaAIWAIGAKGgCFgCBgChoARPZMBQ8AQMAQMAUPAEDAEDAFDwBAwBEoMASN6JTahNhxDwBAwBAwBQ8AQMAQMAUPAEDAEjOiZDBgChoAhYAgYAoaAIWAIGAKGgCFQYggY0SuxCbXhGAKGgCFgCBgChoAhYAgYAoaAIZAT0WvXrp189tlnDrX33ntPll566f8kgpMnT5addtrJjX3TTTeVhx9+uCRw0HG98sorstpqq5XEmGwQ6Qh07txZdt11VznxxBNLHqp8x3rPPffIkCFD5LnnnovF6IsvvpBddtml/DtbP8UXpQsvvFAGDRokPXv2lEMOOaT4L0h44iabbCKXXXaZ7L777qnvHDVqlBx//PHy8ccfV1rfSv1F+a7X++67TwYMGCAvvvhilUK0xRZbyM8//+z6cM0118i+++5bpf2pKS//6KOP5Oyzz3a+5j///COffvqpLLrootWu+8VY8+pzjRkzRlZZZZVqN8Zoh6rKR9xoo43kqquukt12263KMHrggQfkoosucu9fddVV5dVXX62yvuT64pyJHkb28MMPz/U9Ig0bikyduvB9EyeKNGuW+/OqwR3XXXedsEBzJXpRx1CHssYaa8jLL79cZSOrqkVcZQPO48XPP/+8nH766YIxKoV24403SosWLcoDF6UwpqQx5DvWLKKn77P1U3HSU2yiBxm49NJLEzvct29fgWiEEj0IHuQCZ8RacRDId72GEr3K0uVbb721nHnmmUb0AsUC/7JBgwZywQUXSJ06daptQqEYa55AQK9evRyBWGaZZQIRyu0yyBG67Nhjj83txpirq8rGVQeip3AQ9L3pppuM6MVKE0SPiFaXLgt+3by5SN26BQtgVTygUKJHlG/99dcv7/piiy0m66yzTlUMxb2zqhZxlQ04jxdXlnOQR9fslgpCwIheBQGbw2OLTfR+/fVX+eGHH1wPPvnkE+eI33zzzbLmmmu6z4jY4niFEr0chmKXVjACRvQqGOAKfvwOO+wgJ5xwghx44IEV/Kb/xuON6BV3no3opeEJ0TvpJJHu3ZOvGj5cpFMnkVGjyq6dMEGkUSORMWPK/tK22kqkXTuRadNEBg4UmT1b5IwzRHr0KPt+wACRnj1FpkwRadxY5MorRTp3nv/OmTNF6tUTGTKk7NqRI0Xq1xfp31+kY8ecJKJQoofAbL755rHvJNJDlIcysNq1a0vbtm2lR48estRSS7nr44wZpbUHHHCAHH300c556dChg1xxxRVy1113yY8//igo0N69e8viiy/unvHXX3+5qNkLL7wgK6ywgruP0qhcSs9whI444gh3DyUWENXrr79eyE5qe/TRR4Xo7Pfffy+rr766K8ugryGN7Fm9evXkSuYx0rp16+bKHc4//3zBEXzttddk6tSpsuKKK8r+++8vJ598siyyyCLOodtmm21c5pX+asO5mz59utx+++2ZXRk6dKhzBqOtWbNm8uyzzxZlrDzkq6++cnNGafTvv/8ua6+9tpxyyikLlCx8+OGHThbIKhLxbNmypfTr18+NmzZv3jwhIwHuv/32m8PomGOOkUMPPbS8nxjRN9980/2f+YiWbk6aNMl9zruaN2/u8HviiSfKo1gqf3vuuadQ0jB37lw56qij5CTWbUCjjzyTOTrooIPK7yBS9vTTT8vw4cNd2U7avOpNV199tYwfP146duzonHXWzmabbSb333+/uyRrrKwPsAL7unXruuwma2/ZZZd19yvR43PGyjXHHXfcQhHSrEAJpR6sP9YJcwJefnVE1rzqeKdNmyZ///23NGzYUGrVqhWA9vxLRo8e7d5JWRlR0oceekhmzJjh+nLeeee5C/v37+/+sW5Yr+DH96wlbegucPv666+d7thxxx2d3GpDPu6++273DMrAWat77713+ffIJ3NFX9AL6A/Ks/icUmKwOOecc+TLL790ugLMH3nkkQop3Xz33Xdl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)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5H9clFNVcw3o" + }, + "source": [ + "\n", + "Infinite predicates can only be used as parts of other predicates and play role of filters, or auxiliary functions. Here is an example of using an infinite predicate for computing a string describing an employee." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 301, + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH0=", + "headers": [ + [ + "content-type", + "text/css" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgaCxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9ZnVuY3Rpb24oYSl7dmFyIGI9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmYVtTeW1ib2wuaXRlcmF0b3JdO3JldHVybiBiP2IuY2FsbChhKTp7bmV4dDphYShhKX19LGw9dGhpc3x8c2VsZixjYT1mdW5jdGlvbigpe30sZGE9ZnVuY3Rpb24oYSl7YS5CYT12b2lkIDA7YS5SPWZ1bmN0aW9uKCl7cmV0dXJuIGEuQmE/YS5CYTphLkJhPW5ldyBhfX0sZWE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7aWYoIm9iamVjdCI9PWIpaWYoYSl7aWYoYSBpbnN0YW5jZW9mIEFycmF5KXJldHVybiJhcnJheSI7aWYoYSBpbnN0YW5jZW9mIE9iamVjdClyZXR1cm4gYjt2YXIgYz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk7aWYoIltvYmplY3QgV2luZG93XSI9PWMpcmV0dXJuIm9iamVjdCI7CmlmKCJbb2JqZWN0IEFycmF5XSI9PWN8fCJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGgmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5zcGxpY2UmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoInNwbGljZSIpKXJldHVybiJhcnJheSI7aWYoIltvYmplY3QgRnVuY3Rpb25dIj09Y3x8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmNhbGwmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoImNhbGwiKSlyZXR1cm4iZnVuY3Rpb24ifWVsc2UgcmV0dXJuIm51bGwiO2Vsc2UgaWYoImZ1bmN0aW9uIj09YiYmInVuZGVmaW5lZCI9PXR5cGVvZiBhLmNhbGwpcmV0dXJuIm9iamVjdCI7cmV0dXJuIGJ9LGZhPWZ1bmN0aW9uKGEpe3JldHVybiJhcnJheSI9PWVhKGEpfSxoYT1mdW5jdGlvbihhKXt2YXIgYj1lYShhKTtyZXR1cm4iYXJyYXkiPT1ifHwib2JqZWN0Ij09CmImJiJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGh9LGlhPWZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PWVhKGEpfSxtPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBhO3JldHVybiJvYmplY3QiPT1iJiZudWxsIT1hfHwiZnVuY3Rpb24iPT1ifSxqYT0iY2xvc3VyZV91aWRfIisoMUU5Kk1hdGgucmFuZG9tKCk+Pj4wKSxrYT0wLGxhPWZ1bmN0aW9uKGEsYil7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe3ZhciBkPWMuc2xpY2UoKTtkLnB1c2guYXBwbHkoZCxhcmd1bWVudHMpO3JldHVybiBhLmFwcGx5KHRoaXMsZCl9fSxuPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe31jLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLmk9Yi5wcm90b3R5cGU7YS5wcm90b3R5cGU9bmV3IGM7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YX07dmFyIG1hLG5hPXtlYjoiYWN0aXZlZGVzY2VuZGFudCIsamI6ImF0b21pYyIsa2I6ImF1dG9jb21wbGV0ZSIsbWI6ImJ1c3kiLHBiOiJjaGVja2VkIixxYjoiY29saW5kZXgiLHZiOiJjb250cm9scyIseGI6ImRlc2NyaWJlZGJ5IixBYjoiZGlzYWJsZWQiLENiOiJkcm9wZWZmZWN0IixEYjoiZXhwYW5kZWQiLEViOiJmbG93dG8iLEdiOiJncmFiYmVkIixLYjoiaGFzcG9wdXAiLE1iOiJoaWRkZW4iLE9iOiJpbnZhbGlkIixQYjoibGFiZWwiLFFiOiJsYWJlbGxlZGJ5IixSYjoibGV2ZWwiLFdiOiJsaXZlIixrYzoibXVsdGlsaW5lIixsYzoibXVsdGlzZWxlY3RhYmxlIixwYzoib3JpZW50YXRpb24iLHFjOiJvd25zIixyYzoicG9zaW5zZXQiLHRjOiJwcmVzc2VkIix4YzoicmVhZG9ubHkiLHpjOiJyZWxldmFudCIsQWM6InJlcXVpcmVkIixFYzoicm93aW5kZXgiLEhjOiJzZWxlY3RlZCIsSmM6InNldHNpemUiLExjOiJzb3J0IixaYzoidmFsdWVtYXgiLCRjOiJ2YWx1ZW1pbiIsYWQ6InZhbHVlbm93IiwKYmQ6InZhbHVldGV4dCJ9O3ZhciBvYT1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkIGluIGEpYi5jYWxsKGMsYVtkXSxkLGEpfSxwYT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyBpbiBhKWlmKGFbY109PWIpcmV0dXJuITA7cmV0dXJuITF9LHFhPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsIT09YSYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfSxzYT1mdW5jdGlvbihhKXt2YXIgYj17fSxjO2ZvcihjIGluIGEpYlthW2NdXT1jO3JldHVybiBifSx0YT0iY29uc3RydWN0b3IgaGFzT3duUHJvcGVydHkgaXNQcm90b3R5cGVPZiBwcm9wZXJ0eUlzRW51bWVyYWJsZSB0b0xvY2FsZVN0cmluZyB0b1N0cmluZyB2YWx1ZU9mIi5zcGxpdCgiICIpLHVhPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8dGEubGVuZ3RoO2YrKyljPQp0YVtmXSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZCxjKSYmKGFbY109ZFtjXSl9fTt2YXIgdmE9e2ZiOiJhbGVydCIsZ2I6ImFsZXJ0ZGlhbG9nIixoYjoiYXBwbGljYXRpb24iLGliOiJhcnRpY2xlIixsYjoiYmFubmVyIixuYjoiYnV0dG9uIixvYjoiY2hlY2tib3giLHJiOiJjb2x1bW5oZWFkZXIiLHNiOiJjb21ib2JveCIsdGI6ImNvbXBsZW1lbnRhcnkiLHViOiJjb250ZW50aW5mbyIsd2I6ImRlZmluaXRpb24iLHliOiJkaWFsb2ciLHpiOiJkaXJlY3RvcnkiLEJiOiJkb2N1bWVudCIsRmI6ImZvcm0iLEhiOiJncmlkIixJYjoiZ3JpZGNlbGwiLEpiOiJncm91cCIsTGI6ImhlYWRpbmciLE5iOiJpbWciLFNiOiJsaW5rIixUYjoibGlzdCIsVWI6Imxpc3Rib3giLFZiOiJsaXN0aXRlbSIsWGI6ImxvZyIsWWI6Im1haW4iLFpiOiJtYXJxdWVlIiwkYjoibWF0aCIsYWM6Im1lbnUiLGJjOiJtZW51YmFyIixjYzoibWVudWl0ZW0iLGRjOiJtZW51aXRlbWNoZWNrYm94IixlYzoibWVudWl0ZW1yYWRpbyIsbWM6Im5hdmlnYXRpb24iLG5jOiJub3RlIixvYzoib3B0aW9uIiwKc2M6InByZXNlbnRhdGlvbiIsdWM6InByb2dyZXNzYmFyIix2YzoicmFkaW8iLHdjOiJyYWRpb2dyb3VwIix5YzoicmVnaW9uIixCYzoicm93IixDYzoicm93Z3JvdXAiLERjOiJyb3doZWFkZXIiLEZjOiJzY3JvbGxiYXIiLEdjOiJzZWFyY2giLEljOiJzZXBhcmF0b3IiLEtjOiJzbGlkZXIiLE1jOiJzcGluYnV0dG9uIixOYzoic3RhdHVzIixPYzoidGFiIixQYzoidGFibGlzdCIsUWM6InRhYnBhbmVsIixSYzoidGV4dGJveCIsU2M6InRleHRpbmZvIixUYzoidGltZXIiLFVjOiJ0b29sYmFyIixWYzoidG9vbHRpcCIsV2M6InRyZWUiLFhjOiJ0cmVlZ3JpZCIsWWM6InRyZWVpdGVtIn07dmFyIHdhPWZ1bmN0aW9uKGEpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsd2EpO2Vsc2V7dmFyIGI9RXJyb3IoKS5zdGFjaztiJiYodGhpcy5zdGFjaz1iKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSl9O24od2EsRXJyb3IpO3dhLnByb3RvdHlwZS5uYW1lPSJDdXN0b21FcnJvciI7dmFyIHhhO3ZhciB5YT1mdW5jdGlvbihhLGIpe2E9YS5zcGxpdCgiJXMiKTtmb3IodmFyIGM9IiIsZD1hLmxlbmd0aC0xLGU9MDtlPGQ7ZSsrKWMrPWFbZV0rKGU8Yi5sZW5ndGg/YltlXToiJXMiKTt3YS5jYWxsKHRoaXMsYythW2RdKX07bih5YSx3YSk7eWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjsKdmFyIHphPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSJBc3NlcnRpb24gZmFpbGVkIjtpZihjKXtlKz0iOiAiK2M7dmFyIGY9ZH1lbHNlIGEmJihlKz0iOiAiK2EsZj1iKTt0aHJvdyBuZXcgeWEoIiIrZSxmfHxbXSk7fSxxPWZ1bmN0aW9uKGEsYixjKXthfHx6YSgiIixudWxsLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX0sQWE9ZnVuY3Rpb24oYSxiLGMpe20oYSkmJjE9PWEubm9kZVR5cGV8fHphKCJFeHBlY3RlZCBFbGVtZW50IGJ1dCBnb3QgJXM6ICVzLiIsW2VhKGEpLGFdLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKX0sQ2E9ZnVuY3Rpb24oYSxiLGMsZCl7YSBpbnN0YW5jZW9mIGJ8fHphKCJFeHBlY3RlZCBpbnN0YW5jZW9mICVzIGJ1dCBnb3QgJXMuIixbQmEoYiksQmEoYSldLGMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpKX0sQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZgpGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTpudWxsPT09YT8ibnVsbCI6dHlwZW9mIGF9O3ZhciBEYT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3EobnVsbCE9YS5sZW5ndGgpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKCJzdHJpbmciPT09dHlwZW9mIGEpcmV0dXJuInN0cmluZyIhPT10eXBlb2YgYnx8MSE9Yi5sZW5ndGg/LTE6YS5pbmRleE9mKGIsMCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspaWYoYyBpbiBhJiZhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX0scj1BcnJheS5wcm90b3R5cGUuZm9yRWFjaD9mdW5jdGlvbihhLGIsYyl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsYyl9OmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9YS5sZW5ndGgsZT0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZj0wO2Y8ZDtmKyspZiBpbiBlJiZiLmNhbGwoYyxlW2ZdLGYsYSl9LEVhPUFycmF5LnByb3RvdHlwZS5maWx0ZXI/CmZ1bmN0aW9uKGEsYil7cShudWxsIT1hLmxlbmd0aCk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD1bXSxlPTAsZj0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZz0wO2c8YztnKyspaWYoZyBpbiBmKXt2YXIgaz1mW2ddO2IuY2FsbCh2b2lkIDAsayxnLGEpJiYoZFtlKytdPWspfXJldHVybiBkfSxGYT1BcnJheS5wcm90b3R5cGUuZXZlcnk/ZnVuY3Rpb24oYSxiKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmV2ZXJ5LmNhbGwoYSxiLHZvaWQgMCl9OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWEubGVuZ3RoLGQ9InN0cmluZyI9PT10eXBlb2YgYT9hLnNwbGl0KCIiKTphLGU9MDtlPGM7ZSsrKWlmKGUgaW4gZCYmIWIuY2FsbCh2b2lkIDAsZFtlXSxlLGEpKXJldHVybiExO3JldHVybiEwfSxHYT1mdW5jdGlvbihhLGIpe3JldHVybiAwPD0KRGEoYSxiKX0sSGE9ZnVuY3Rpb24oYSxiKXtiPURhKGEsYik7dmFyIGM7aWYoYz0wPD1iKXEobnVsbCE9YS5sZW5ndGgpLEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhLGIsMSk7cmV0dXJuIGN9LElhPWZ1bmN0aW9uKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGFyZ3VtZW50cyl9LEphPWZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDA8Yil7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX0sTGE9ZnVuY3Rpb24oYSxiLGMsZCl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShhLEthKGFyZ3VtZW50cywxKSl9LEthPWZ1bmN0aW9uKGEsYixjKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gMj49YXJndW1lbnRzLmxlbmd0aD9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsYixjKX07dmFyIE1hPVN0cmluZy5wcm90b3R5cGUudHJpbT9mdW5jdGlvbihhKXtyZXR1cm4gYS50cmltKCl9OmZ1bmN0aW9uKGEpe3JldHVybi9eW1xzXHhhMF0qKFtcc1xTXSo/KVtcc1x4YTBdKiQvLmV4ZWMoYSlbMV19LE5hPS8mL2csT2E9LzwvZyxQYT0vPi9nLFFhPS8iL2csUmE9LycvZyxTYT0vXHgwMC9nLFRhPS9bXHgwMCY8PiInXS8sdD1mdW5jdGlvbihhLGIpe3JldHVybi0xIT1hLmluZGV4T2YoYil9LFVhPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE8Yj8tMTphPmI/MTowfTt2YXIgdTthOnt2YXIgVmE9bC5uYXZpZ2F0b3I7aWYoVmEpe3ZhciBXYT1WYS51c2VyQWdlbnQ7aWYoV2Epe3U9V2E7YnJlYWsgYX19dT0iIn07LyoKCiBDb3B5cmlnaHQgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzLgogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKKi8KdmFyIFhhPWZ1bmN0aW9uKGEpe1RhLnRlc3QoYSkmJigtMSE9YS5pbmRleE9mKCImIikmJihhPWEucmVwbGFjZShOYSwiJmFtcDsiKSksLTEhPWEuaW5kZXhPZigiPCIpJiYoYT1hLnJlcGxhY2UoT2EsIiZsdDsiKSksLTEhPWEuaW5kZXhPZigiPiIpJiYoYT1hLnJlcGxhY2UoUGEsIiZndDsiKSksLTEhPWEuaW5kZXhPZignIicpJiYoYT1hLnJlcGxhY2UoUWEsIiZxdW90OyIpKSwtMSE9YS5pbmRleE9mKCInIikmJihhPWEucmVwbGFjZShSYSwiJiMzOTsiKSksLTEhPWEuaW5kZXhPZigiXHgwMCIpJiYoYT1hLnJlcGxhY2UoU2EsIiYjMDsiKSkpO3JldHVybiBhfTt2YXIgWWE9ZnVuY3Rpb24oYSl7WWFbIiAiXShhKTtyZXR1cm4gYX07WWFbIiAiXT1jYTt2YXIgJGE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1aYTtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsYSk/Y1thXTpjW2FdPWIoYSl9O3ZhciBhYj10KHUsIk9wZXJhIiksdj10KHUsIlRyaWRlbnQiKXx8dCh1LCJNU0lFIiksYmI9dCh1LCJFZGdlIikseD10KHUsIkdlY2tvIikmJiEodCh1LnRvTG93ZXJDYXNlKCksIndlYmtpdCIpJiYhdCh1LCJFZGdlIikpJiYhKHQodSwiVHJpZGVudCIpfHx0KHUsIk1TSUUiKSkmJiF0KHUsIkVkZ2UiKSx5PXQodS50b0xvd2VyQ2FzZSgpLCJ3ZWJraXQiKSYmIXQodSwiRWRnZSIpLHo9dCh1LCJNYWNpbnRvc2giKSxjYj1mdW5jdGlvbigpe3ZhciBhPWwuZG9jdW1lbnQ7cmV0dXJuIGE/YS5kb2N1bWVudE1vZGU6dm9pZCAwfSxkYjsKYTp7dmFyIGViPSIiLGZiPWZ1bmN0aW9uKCl7dmFyIGE9dTtpZih4KXJldHVybi9ydjooW15cKTtdKykoXCl8OykvLmV4ZWMoYSk7aWYoYmIpcmV0dXJuL0VkZ2VcLyhbXGRcLl0rKS8uZXhlYyhhKTtpZih2KXJldHVybi9cYig/Ok1TSUV8cnYpWzogXShbXlwpO10rKShcKXw7KS8uZXhlYyhhKTtpZih5KXJldHVybi9XZWJLaXRcLyhcUyspLy5leGVjKGEpO2lmKGFiKXJldHVybi8oPzpWZXJzaW9uKVsgXC9dPyhcUyspLy5leGVjKGEpfSgpO2ZiJiYoZWI9ZmI/ZmJbMV06IiIpO2lmKHYpe3ZhciBnYj1jYigpO2lmKG51bGwhPWdiJiZnYj5wYXJzZUZsb2F0KGViKSl7ZGI9U3RyaW5nKGdiKTticmVhayBhfX1kYj1lYn0KdmFyIGhiPWRiLFphPXt9LEE9ZnVuY3Rpb24oYSl7cmV0dXJuICRhKGEsZnVuY3Rpb24oKXtmb3IodmFyIGI9MCxjPU1hKFN0cmluZyhoYikpLnNwbGl0KCIuIiksZD1NYShTdHJpbmcoYSkpLnNwbGl0KCIuIiksZT1NYXRoLm1heChjLmxlbmd0aCxkLmxlbmd0aCksZj0wOzA9PWImJmY8ZTtmKyspe3ZhciBnPWNbZl18fCIiLGs9ZFtmXXx8IiI7ZG97Zz0vKFxkKikoXEQqKSguKikvLmV4ZWMoZyl8fFsiIiwiIiwiIiwiIl07az0vKFxkKikoXEQqKSguKikvLmV4ZWMoayl8fFsiIiwiIiwiIiwiIl07aWYoMD09Z1swXS5sZW5ndGgmJjA9PWtbMF0ubGVuZ3RoKWJyZWFrO2I9VWEoMD09Z1sxXS5sZW5ndGg/MDpwYXJzZUludChnWzFdLDEwKSwwPT1rWzFdLmxlbmd0aD8wOnBhcnNlSW50KGtbMV0sMTApKXx8VWEoMD09Z1syXS5sZW5ndGgsMD09a1syXS5sZW5ndGgpfHxVYShnWzJdLGtbMl0pO2c9Z1szXTtrPWtbM119d2hpbGUoMD09Yil9cmV0dXJuIDA8PWJ9KX0saWI7CmliPWwuZG9jdW1lbnQmJnY/Y2IoKTp2b2lkIDA7dmFyIGpiPSF2fHw5PD1OdW1iZXIoaWIpO3ZhciBsYj1mdW5jdGlvbihhLGIpe29hKGIsZnVuY3Rpb24oYyxkKXtjJiYib2JqZWN0Ij09dHlwZW9mIGMmJmMuZGQmJihjPWMuY2QoKSk7InN0eWxlIj09ZD9hLnN0eWxlLmNzc1RleHQ9YzoiY2xhc3MiPT1kP2EuY2xhc3NOYW1lPWM6ImZvciI9PWQ/YS5odG1sRm9yPWM6a2IuaGFzT3duUHJvcGVydHkoZCk/YS5zZXRBdHRyaWJ1dGUoa2JbZF0sYyk6MD09ZC5sYXN0SW5kZXhPZigiYXJpYS0iLDApfHwwPT1kLmxhc3RJbmRleE9mKCJkYXRhLSIsMCk/YS5zZXRBdHRyaWJ1dGUoZCxjKTphW2RdPWN9KX0sa2I9e2NlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjb2xzcGFuOiJjb2xTcGFuIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGhlaWdodDoiaGVpZ2h0IixtYXhsZW5ndGg6Im1heExlbmd0aCIsbm9uY2U6Im5vbmNlIixyb2xlOiJyb2xlIixyb3dzcGFuOiJyb3dTcGFuIix0eXBlOiJ0eXBlIix1c2VtYXA6InVzZU1hcCIsdmFsaWduOiJ2QWxpZ24iLAp3aWR0aDoid2lkdGgifSxtYj1mdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChrKXtrJiZiLmFwcGVuZENoaWxkKCJzdHJpbmciPT09dHlwZW9mIGs/YS5jcmVhdGVUZXh0Tm9kZShrKTprKX1mb3IodmFyIGU9MjtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXTtpZighaGEoZil8fG0oZikmJjA8Zi5ub2RlVHlwZSlkKGYpO2Vsc2V7YTp7aWYoZiYmIm51bWJlciI9PXR5cGVvZiBmLmxlbmd0aCl7aWYobShmKSl7dmFyIGc9ImZ1bmN0aW9uIj09dHlwZW9mIGYuaXRlbXx8InN0cmluZyI9PXR5cGVvZiBmLml0ZW07YnJlYWsgYX1pZihpYShmKSl7Zz0iZnVuY3Rpb24iPT10eXBlb2YgZi5pdGVtO2JyZWFrIGF9fWc9ITF9cihnP0phKGYpOmYsZCl9fX0sbmI9ZnVuY3Rpb24oYSxiKXtiPVN0cmluZyhiKTsiYXBwbGljYXRpb24veGh0bWwreG1sIj09PWEuY29udGVudFR5cGUmJihiPWIudG9Mb3dlckNhc2UoKSk7cmV0dXJuIGEuY3JlYXRlRWxlbWVudChiKX0sb2I9ZnVuY3Rpb24oYSl7YSYmCmEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpfSxwYj1mdW5jdGlvbihhLGIpe2lmKCFhfHwhYilyZXR1cm4hMTtpZihhLmNvbnRhaW5zJiYxPT1iLm5vZGVUeXBlKXJldHVybiBhPT1ifHxhLmNvbnRhaW5zKGIpO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbilyZXR1cm4gYT09Ynx8ISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNik7Zm9yKDtiJiZhIT1iOyliPWIucGFyZW50Tm9kZTtyZXR1cm4gYj09YX0scWI9ZnVuY3Rpb24oYSl7cShhLCJOb2RlIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4iKTtyZXR1cm4gOT09YS5ub2RlVHlwZT9hOmEub3duZXJEb2N1bWVudHx8YS5kb2N1bWVudH0scmI9ZnVuY3Rpb24oYSxiKXtiP2EudGFiSW5kZXg9MDooYS50YWJJbmRleD0tMSxhLnJlbW92ZUF0dHJpYnV0ZSgidGFiSW5kZXgiKSl9LHNiPWZ1bmN0aW9uKGEpe3JldHVybiB2JiYhQSgiOSIpPyhhPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKSwKbnVsbCE9YSYmYS5zcGVjaWZpZWQpOmEuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpfSx0Yj1mdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgYSYmMDw9YSYmMzI3Njg+YX0sdWI9ZnVuY3Rpb24oYSl7dGhpcy5hPWF8fGwuZG9jdW1lbnR8fGRvY3VtZW50fTt1Yi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBhP3RoaXMuYS5nZXRFbGVtZW50QnlJZChhKTphfTsKdWIucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuYSxlPWFyZ3VtZW50cyxmPVN0cmluZyhlWzBdKSxnPWVbMV07aWYoIWpiJiZnJiYoZy5uYW1lfHxnLnR5cGUpKXtmPVsiPCIsZl07Zy5uYW1lJiZmLnB1c2goJyBuYW1lPSInLFhhKGcubmFtZSksJyInKTtpZihnLnR5cGUpe2YucHVzaCgnIHR5cGU9IicsWGEoZy50eXBlKSwnIicpO3ZhciBrPXt9O3VhKGssZyk7ZGVsZXRlIGsudHlwZTtnPWt9Zi5wdXNoKCI+Iik7Zj1mLmpvaW4oIiIpfWY9bmIoZCxmKTtnJiYoInN0cmluZyI9PT10eXBlb2YgZz9mLmNsYXNzTmFtZT1nOmZhKGcpP2YuY2xhc3NOYW1lPWcuam9pbigiICIpOmxiKGYsZykpOzI8ZS5sZW5ndGgmJm1iKGQsZixlKTtyZXR1cm4gZn07dmFyIHZiPWZ1bmN0aW9uKGEsYil7Yj8ocShwYSh2YSxiKSwiTm8gc3VjaCBBUklBIHJvbGUgIitiKSxhLnNldEF0dHJpYnV0ZSgicm9sZSIsYikpOmEucmVtb3ZlQXR0cmlidXRlKCJyb2xlIil9LHhiPWZ1bmN0aW9uKGEsYixjKXtmYShjKSYmKGM9Yy5qb2luKCIgIikpO3ZhciBkPXdiKGIpOyIiPT09Y3x8dm9pZCAwPT1jPyhtYXx8KG1hPXthdG9taWM6ITEsYXV0b2NvbXBsZXRlOiJub25lIixkcm9wZWZmZWN0OiJub25lIixoYXNwb3B1cDohMSxsaXZlOiJvZmYiLG11bHRpbGluZTohMSxtdWx0aXNlbGVjdGFibGU6ITEsb3JpZW50YXRpb246InZlcnRpY2FsIixyZWFkb25seTohMSxyZWxldmFudDoiYWRkaXRpb25zIHRleHQiLHJlcXVpcmVkOiExLHNvcnQ6Im5vbmUiLGJ1c3k6ITEsZGlzYWJsZWQ6ITEsaGlkZGVuOiExLGludmFsaWQ6ImZhbHNlIn0pLGM9bWEsYiBpbiBjP2Euc2V0QXR0cmlidXRlKGQsY1tiXSk6YS5yZW1vdmVBdHRyaWJ1dGUoZCkpOmEuc2V0QXR0cmlidXRlKGQsCmMpfSx3Yj1mdW5jdGlvbihhKXtxKGEsIkFSSUEgYXR0cmlidXRlIGNhbm5vdCBiZSBlbXB0eS4iKTtxKHBhKG5hLGEpLCJObyBzdWNoIEFSSUEgYXR0cmlidXRlICIrYSk7cmV0dXJuImFyaWEtIithfTt2YXIgeWI9T2JqZWN0LmZyZWV6ZXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O3ZhciBDPWZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVTt0aGlzLko9dGhpcy5KfTtDLnByb3RvdHlwZS5VPSExO0MucHJvdG90eXBlLk49ZnVuY3Rpb24oKXt0aGlzLlV8fCh0aGlzLlU9ITAsdGhpcy51KCkpfTt2YXIgemI9ZnVuY3Rpb24oYSxiKXthLlU/YigpOihhLkp8fChhLko9W10pLGEuSi5wdXNoKGIpKX07Qy5wcm90b3R5cGUudT1mdW5jdGlvbigpe2lmKHRoaXMuSilmb3IoO3RoaXMuSi5sZW5ndGg7KXRoaXMuSi5zaGlmdCgpKCl9O3ZhciBBYj1mdW5jdGlvbihhKXthJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5OJiZhLk4oKX07dmFyIEJiPWZ1bmN0aW9uKGEpe3JldHVybiJzdHJpbmciPT10eXBlb2YgYS5jbGFzc05hbWU/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sRD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6QmIoYSkubWF0Y2goL1xTKy9nKXx8W119LENiPWZ1bmN0aW9uKGEsYil7InN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZT9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxEYj1mdW5jdGlvbihhLGIpe3JldHVybiBhLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5jb250YWlucyhiKTpHYShEKGEpLGIpfSxFYj1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFEYihhLGIpKXt2YXIgYz1CYihhKTtDYihhLGMrKDA8Yy5sZW5ndGg/IiAiK2I6YikpfX0sRmI9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClyKGIsCmZ1bmN0aW9uKGUpe0ViKGEsZSl9KTtlbHNle3ZhciBjPXt9O3IoRChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7cihiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPTA8Yi5sZW5ndGg/IiAiK2Q6ZDtDYihhLGIpfX0sR2I9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6RGIoYSxiKSYmQ2IoYSxFYShEKGEpLGZ1bmN0aW9uKGMpe3JldHVybiBjIT1ifSkuam9pbigiICIpKX0sSGI9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9yKGIsZnVuY3Rpb24oYyl7R2IoYSxjKX0pOkNiKGEsRWEoRChhKSxmdW5jdGlvbihjKXtyZXR1cm4hR2EoYixjKX0pLmpvaW4oIiAiKSl9O3ZhciBJYj0hdnx8OTw9TnVtYmVyKGliKSxKYj0hdnx8OTw9TnVtYmVyKGliKSxLYj12JiYhQSgiOSIpLExiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e2wuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsY2EsYiksbC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjYSxiKX1jYXRjaChjKXt9cmV0dXJuIGF9KCk7dmFyIEU9ZnVuY3Rpb24oYSxiKXt0aGlzLnR5cGU9YTt0aGlzLmE9dGhpcy50YXJnZXQ9Yjt0aGlzLmg9ITE7dGhpcy5LYT0hMH07RS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuaD0hMH07RS5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3RoaXMuS2E9ITF9O3ZhciBGPXtMOiJtb3VzZWRvd24iLE06Im1vdXNldXAiLGFhOiJtb3VzZWNhbmNlbCIsaGM6Im1vdXNlbW92ZSIsamM6Im1vdXNlb3ZlciIsaWM6Im1vdXNlb3V0IixmYzoibW91c2VlbnRlciIsZ2M6Im1vdXNlbGVhdmUifTt2YXIgRz1mdW5jdGlvbihhLGIpe0UuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy5hPXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5jPTA7dGhpcy5BPXRoaXMubWV0YUtleT10aGlzLnNoaWZ0S2V5PXRoaXMuYWx0S2V5PXRoaXMuY3RybEtleT0hMTt0aGlzLnBvaW50ZXJJZD0wO3RoaXMucG9pbnRlclR5cGU9IiI7dGhpcy5iPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMuYT1iO2lmKGI9YS5yZWxhdGVkVGFyZ2V0KXtpZih4KXthOnt0cnl7WWEoYi5ub2RlTmFtZSk7dmFyIGU9ITA7YnJlYWsgYX1jYXRjaChmKXt9ZT0KITF9ZXx8KGI9bnVsbCl9fWVsc2UibW91c2VvdmVyIj09Yz9iPWEuZnJvbUVsZW1lbnQ6Im1vdXNlb3V0Ij09YyYmKGI9YS50b0VsZW1lbnQpO3RoaXMucmVsYXRlZFRhcmdldD1iO2Q/KHRoaXMuY2xpZW50WD12b2lkIDAhPT1kLmNsaWVudFg/ZC5jbGllbnRYOmQucGFnZVgsdGhpcy5jbGllbnRZPXZvaWQgMCE9PWQuY2xpZW50WT9kLmNsaWVudFk6ZC5wYWdlWSx0aGlzLnNjcmVlblg9ZC5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1kLnNjcmVlbll8fDApOih0aGlzLmNsaWVudFg9dm9pZCAwIT09YS5jbGllbnRYP2EuY2xpZW50WDphLnBhZ2VYLHRoaXMuY2xpZW50WT12b2lkIDAhPT1hLmNsaWVudFk/YS5jbGllbnRZOmEucGFnZVksdGhpcy5zY3JlZW5YPWEuc2NyZWVuWHx8MCx0aGlzLnNjcmVlblk9YS5zY3JlZW5ZfHwwKTt0aGlzLmJ1dHRvbj1hLmJ1dHRvbjt0aGlzLmM9YS5rZXlDb2RlfHwwO3RoaXMua2V5PWEua2V5fHwiIjt0aGlzLmN0cmxLZXk9YS5jdHJsS2V5O3RoaXMuYWx0S2V5PQphLmFsdEtleTt0aGlzLnNoaWZ0S2V5PWEuc2hpZnRLZXk7dGhpcy5tZXRhS2V5PWEubWV0YUtleTt0aGlzLkE9ej9hLm1ldGFLZXk6YS5jdHJsS2V5O3RoaXMucG9pbnRlcklkPWEucG9pbnRlcklkfHwwO3RoaXMucG9pbnRlclR5cGU9InN0cmluZyI9PT10eXBlb2YgYS5wb2ludGVyVHlwZT9hLnBvaW50ZXJUeXBlOk1iW2EucG9pbnRlclR5cGVdfHwiIjt0aGlzLmI9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnRoaXMuZygpfX07bihHLEUpO3ZhciBOYj15YihbMSw0LDJdKSxNYj15Yih7MjoidG91Y2giLDM6InBlbiIsNDoibW91c2UifSksT2I9ZnVuY3Rpb24oYSl7cmV0dXJuIEliPzA9PWEuYi5idXR0b246ImNsaWNrIj09YS50eXBlPyEwOiEhKGEuYi5idXR0b24mTmJbMF0pfTtHLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7Ry5pLmouY2FsbCh0aGlzKTt0aGlzLmIuc3RvcFByb3BhZ2F0aW9uP3RoaXMuYi5zdG9wUHJvcGFnYXRpb24oKTp0aGlzLmIuY2FuY2VsQnViYmxlPSEwfTsKRy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe0cuaS5nLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5iO2lmKGEucHJldmVudERlZmF1bHQpYS5wcmV2ZW50RGVmYXVsdCgpO2Vsc2UgaWYoYS5yZXR1cm5WYWx1ZT0hMSxLYil0cnl7aWYoYS5jdHJsS2V5fHwxMTI8PWEua2V5Q29kZSYmMTIzPj1hLmtleUNvZGUpYS5rZXlDb2RlPS0xfWNhdGNoKGIpe319O3ZhciBQYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKDFFNipNYXRoLnJhbmRvbSgpfDApLFFiPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW1BiXSl9LFJiPTA7dmFyIFNiPWZ1bmN0aW9uKGEsYixjLGQsZSl7dGhpcy5saXN0ZW5lcj1hO3RoaXMuYT1udWxsO3RoaXMuc3JjPWI7dGhpcy50eXBlPWM7dGhpcy5jYXB0dXJlPSEhZDt0aGlzLm1hPWU7dGhpcy5rZXk9KytSYjt0aGlzLlg9dGhpcy5oYT0hMX0sVGI9ZnVuY3Rpb24oYSl7YS5YPSEwO2EubGlzdGVuZXI9bnVsbDthLmE9bnVsbDthLnNyYz1udWxsO2EubWE9bnVsbH07dmFyIFViPWZ1bmN0aW9uKGEpe3RoaXMuc3JjPWE7dGhpcy5hPXt9O3RoaXMuYj0wfTtVYi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS50b1N0cmluZygpO2E9dGhpcy5hW2ZdO2F8fChhPXRoaXMuYVtmXT1bXSx0aGlzLmIrKyk7dmFyIGc9VmIoYSxiLGQsZSk7LTE8Zz8oYj1hW2ddLGN8fChiLmhhPSExKSk6KGI9bmV3IFNiKGIsdGhpcy5zcmMsZiwhIWQsZSksYi5oYT1jLGEucHVzaChiKSk7cmV0dXJuIGJ9Owp2YXIgV2I9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLnR5cGU7YyBpbiBhLmEmJkhhKGEuYVtjXSxiKSYmKFRiKGIpLDA9PWEuYVtjXS5sZW5ndGgmJihkZWxldGUgYS5hW2NdLGEuYi0tKSl9LFhiPWZ1bmN0aW9uKGEsYixjLGQsZSl7YT1hLmFbYi50b1N0cmluZygpXTtiPS0xO2EmJihiPVZiKGEsYyxkLGUpKTtyZXR1cm4tMTxiP2FbYl06bnVsbH0sVmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuWCYmZi5saXN0ZW5lcj09YiYmZi5jYXB0dXJlPT0hIWMmJmYubWE9PWQpcmV0dXJuIGV9cmV0dXJuLTF9O3ZhciBZYj0iY2xvc3VyZV9sbV8iKygxRTYqTWF0aC5yYW5kb20oKXwwKSxaYj17fSwkYj0wLGJjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZCYmZC5vbmNlKXJldHVybiBhYyhhLGIsYyxkLGUpO2lmKGZhKGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyliYyhhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9Y2MoYyk7cmV0dXJuIFFiKGEpP2RjKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOmVjKGEsYixjLCExLGQsZSl9LGVjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGc9bShlKT8hIWUuY2FwdHVyZTohIWUsaz1mYyhhKTtrfHwoYVtZYl09az1uZXcgVWIoYSkpO2M9ay5hZGQoYixjLGQsZyxmKTtpZihjLmEpcmV0dXJuIGM7ZD1nYygpO2MuYT1kO2Quc3JjPWE7ZC5saXN0ZW5lcj1jO2lmKGEuYWRkRXZlbnRMaXN0ZW5lcilMYnx8KGU9Zyksdm9pZCAwPT09ZSYmKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksCmQsZSk7ZWxzZSBpZihhLmF0dGFjaEV2ZW50KWEuYXR0YWNoRXZlbnQoaGMoYi50b1N0cmluZygpKSxkKTtlbHNlIGlmKGEuYWRkTGlzdGVuZXImJmEucmVtb3ZlTGlzdGVuZXIpcSgiY2hhbmdlIj09PWIsIk1lZGlhUXVlcnlMaXN0IG9ubHkgaGFzIGEgY2hhbmdlIGV2ZW50IiksYS5hZGRMaXN0ZW5lcihkKTtlbHNlIHRocm93IEVycm9yKCJhZGRFdmVudExpc3RlbmVyIGFuZCBhdHRhY2hFdmVudCBhcmUgdW5hdmFpbGFibGUuIik7JGIrKztyZXR1cm4gY30sZ2M9ZnVuY3Rpb24oKXt2YXIgYT1pYyxiPUpiP2Z1bmN0aW9uKGMpe3JldHVybiBhLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKX06ZnVuY3Rpb24oYyl7Yz1hLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKTtpZighYylyZXR1cm4gY307cmV0dXJuIGJ9LGFjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZmEoYikpe2Zvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWFjKGEsYltmXSxjLGQsZSk7cmV0dXJuIG51bGx9Yz1jYyhjKTtyZXR1cm4gUWIoYSk/CmEuaC5hZGQoU3RyaW5nKGIpLGMsITAsbShkKT8hIWQuY2FwdHVyZTohIWQsZSk6ZWMoYSxiLGMsITAsZCxlKX0samM9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihmYShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylqYyhhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPWNjKGMpLFFiKGEpPyhhPWEuaCxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5hJiYoZj1hLmFbYl0sYz1WYihmLGMsZCxlKSwtMTxjJiYoVGIoZltjXSkscShudWxsIT1mLmxlbmd0aCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSwwPT1mLmxlbmd0aCYmKGRlbGV0ZSBhLmFbYl0sYS5iLS0pKSkpOmEmJihhPWZjKGEpKSYmKGM9WGIoYSxiLGMsZCxlKSkmJmtjKGMpfSxrYz1mdW5jdGlvbihhKXtpZigibnVtYmVyIiE9PXR5cGVvZiBhJiZhJiYhYS5YKXt2YXIgYj1hLnNyYztpZihRYihiKSlXYihiLmgsYSk7ZWxzZXt2YXIgYz1hLnR5cGUsZD1hLmE7Yi5yZW1vdmVFdmVudExpc3RlbmVyPwpiLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KGhjKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7JGItLTsoYz1mYyhiKSk/KFdiKGMsYSksMD09Yy5iJiYoYy5zcmM9bnVsbCxiW1liXT1udWxsKSk6VGIoYSl9fX0saGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gWmI/WmJbYV06WmJbYV09Im9uIithfSxtYz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMDtpZihhPWZjKGEpKWlmKGI9YS5hW2IudG9TdHJpbmcoKV0pZm9yKGI9Yi5jb25jYXQoKSxhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBmPWJbYV07ZiYmZi5jYXB0dXJlPT1jJiYhZi5YJiYoZj1sYyhmLGQpLGU9ZSYmITEhPT1mKX1yZXR1cm4gZX0sbGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5tYXx8YS5zcmM7YS5oYSYma2MoYSk7cmV0dXJuIGMuY2FsbChkLGIpfSxpYz1mdW5jdGlvbihhLApiKXtpZihhLlgpcmV0dXJuITA7aWYoIUpiKXtpZighYilhOntiPVsid2luZG93IiwiZXZlbnQiXTtmb3IodmFyIGM9bCxkPTA7ZDxiLmxlbmd0aDtkKyspaWYoYz1jW2JbZF1dLG51bGw9PWMpe2I9bnVsbDticmVhayBhfWI9Y31kPWI7Yj1uZXcgRyhkLHRoaXMpO2M9ITA7aWYoISgwPmQua2V5Q29kZXx8dm9pZCAwIT1kLnJldHVyblZhbHVlKSl7YTp7dmFyIGU9ITE7aWYoMD09ZC5rZXlDb2RlKXRyeXtkLmtleUNvZGU9LTE7YnJlYWsgYX1jYXRjaChnKXtlPSEwfWlmKGV8fHZvaWQgMD09ZC5yZXR1cm5WYWx1ZSlkLnJldHVyblZhbHVlPSEwfWQ9W107Zm9yKGU9Yi5hO2U7ZT1lLnBhcmVudE5vZGUpZC5wdXNoKGUpO2E9YS50eXBlO2ZvcihlPWQubGVuZ3RoLTE7IWIuaCYmMDw9ZTtlLS0pe2IuYT1kW2VdO3ZhciBmPW1jKGRbZV0sYSwhMCxiKTtjPWMmJmZ9Zm9yKGU9MDshYi5oJiZlPGQubGVuZ3RoO2UrKyliLmE9ZFtlXSxmPW1jKGRbZV0sYSwhMSxiKSxjPWMmJmZ9cmV0dXJuIGN9cmV0dXJuIGxjKGEsCm5ldyBHKGIsdGhpcykpfSxmYz1mdW5jdGlvbihhKXthPWFbWWJdO3JldHVybiBhIGluc3RhbmNlb2YgVWI/YTpudWxsfSxuYz0iX19jbG9zdXJlX2V2ZW50c19mbl8iKygxRTkqTWF0aC5yYW5kb20oKT4+PjApLGNjPWZ1bmN0aW9uKGEpe3EoYSwiTGlzdGVuZXIgY2FuIG5vdCBiZSBudWxsLiIpO2lmKGlhKGEpKXJldHVybiBhO3EoYS5oYW5kbGVFdmVudCwiQW4gb2JqZWN0IGxpc3RlbmVyIG11c3QgaGF2ZSBoYW5kbGVFdmVudCBtZXRob2QuIik7YVtuY118fChhW25jXT1mdW5jdGlvbihiKXtyZXR1cm4gYS5oYW5kbGVFdmVudChiKX0pO3JldHVybiBhW25jXX07dmFyIG9jPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9e319O24ob2MsQyk7CnZhciBwYz1bXSxIPWZ1bmN0aW9uKGEsYixjLGQpe2ZhKGMpfHwoYyYmKHBjWzBdPWMudG9TdHJpbmcoKSksYz1wYyk7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWJjKGIsY1tlXSxkfHxhLmhhbmRsZUV2ZW50LCExLGEuYnx8YSk7aWYoIWYpYnJlYWs7YS5hW2Yua2V5XT1mfXJldHVybiBhfSxxYz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoZmEoYykpZm9yKHZhciBnPTA7ZzxjLmxlbmd0aDtnKyspcWMoYSxiLGNbZ10sZCxlLGYpO2Vsc2UgZD1kfHxhLmhhbmRsZUV2ZW50LGU9bShlKT8hIWUuY2FwdHVyZTohIWUsZj1mfHxhLmJ8fGEsZD1jYyhkKSxlPSEhZSxjPVFiKGIpP1hiKGIuaCxTdHJpbmcoYyksZCxlLGYpOmI/KGI9ZmMoYikpP1hiKGIsYyxkLGUsZik6bnVsbDpudWxsLGMmJihrYyhjKSxkZWxldGUgYS5hW2Mua2V5XSk7cmV0dXJuIGF9LHJjPWZ1bmN0aW9uKGEpe29hKGEuYSxmdW5jdGlvbihiLGMpe3RoaXMuYS5oYXNPd25Qcm9wZXJ0eShjKSYma2MoYil9LAphKTthLmE9e319O29jLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7b2MuaS51LmNhbGwodGhpcyk7cmModGhpcyl9O29jLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJFdmVudEhhbmRsZXIuaGFuZGxlRXZlbnQgbm90IGltcGxlbWVudGVkIik7fTt2YXIgST1mdW5jdGlvbigpe0MuY2FsbCh0aGlzKTt0aGlzLmg9bmV3IFViKHRoaXMpO3RoaXMuTWE9dGhpczt0aGlzLnBhPW51bGx9O24oSSxDKTtJLnByb3RvdHlwZVtQYl09ITA7SS5wcm90b3R5cGUucmE9ZnVuY3Rpb24oYSl7dGhpcy5wYT1hfTtJLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjLGQpe2pjKHRoaXMsYSxiLGMsZCl9Owp2YXIgdWM9ZnVuY3Rpb24oYSxiKXtzYyhhKTt2YXIgYz1hLnBhO2lmKGMpe3ZhciBkPVtdO2Zvcih2YXIgZT0xO2M7Yz1jLnBhKWQucHVzaChjKSxxKDFFMz4rK2UsImluZmluaXRlIGxvb3AiKX1hPWEuTWE7Yz1iLnR5cGV8fGI7InN0cmluZyI9PT10eXBlb2YgYj9iPW5ldyBFKGIsYSk6YiBpbnN0YW5jZW9mIEU/Yi50YXJnZXQ9Yi50YXJnZXR8fGE6KGU9YixiPW5ldyBFKGMsYSksdWEoYixlKSk7ZT0hMDtpZihkKWZvcih2YXIgZj1kLmxlbmd0aC0xOyFiLmgmJjA8PWY7Zi0tKXt2YXIgZz1iLmE9ZFtmXTtlPXRjKGcsYywhMCxiKSYmZX1iLmh8fChnPWIuYT1hLGU9dGMoZyxjLCEwLGIpJiZlLGIuaHx8KGU9dGMoZyxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLmgmJmY8ZC5sZW5ndGg7ZisrKWc9Yi5hPWRbZl0sZT10YyhnLGMsITEsYikmJmU7cmV0dXJuIGV9OwpJLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7SS5pLnUuY2FsbCh0aGlzKTtpZih0aGlzLmgpe3ZhciBhPXRoaXMuaCxiPTAsYztmb3IoYyBpbiBhLmEpe2Zvcih2YXIgZD1hLmFbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixUYihkW2VdKTtkZWxldGUgYS5hW2NdO2EuYi0tfX10aGlzLnBhPW51bGx9O3ZhciBkYz1mdW5jdGlvbihhLGIsYyxkLGUpe3NjKGEpO3JldHVybiBhLmguYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LHRjPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5oLmFbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGc9YltmXTtpZihnJiYhZy5YJiZnLmNhcHR1cmU9PWMpe3ZhciBrPWcubGlzdGVuZXIscD1nLm1hfHxnLnNyYztnLmhhJiZXYihhLmgsZyk7ZT0hMSE9PWsuY2FsbChwLGQpJiZlfX1yZXR1cm4gZSYmMCE9ZC5LYX0sc2M9ZnVuY3Rpb24oYSl7cShhLmgsIkV2ZW50IHRhcmdldCBpcyBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgY2FsbCB0aGUgc3VwZXJjbGFzcyAoZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpIGNvbnN0cnVjdG9yPyIpfTt2YXIgeGM9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKHkmJiFBKCI1MjUiKSlyZXR1cm4hMDtpZih6JiZlKXJldHVybiB2YyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZigheCl7Im51bWJlciI9PT10eXBlb2YgYiYmKGI9d2MoYikpO3ZhciBnPTE3PT1ifHwxOD09Ynx8eiYmOTE9PWI7aWYoKCFjfHx6KSYmZ3x8eiYmMTY9PWImJihkfHxmKSlyZXR1cm4hMX1pZigoeXx8YmIpJiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1pZih2JiZkJiZiPT1hKXJldHVybiExO3N3aXRjaChhKXtjYXNlIDEzOnJldHVybiB4P2Z8fGU/ITE6IShjJiZkKTohMDtjYXNlIDI3OnJldHVybiEoeXx8YmJ8fHgpfXJldHVybiB4JiYoZHx8ZXx8Zik/ITE6dmMoYSl9LHZjPWZ1bmN0aW9uKGEpe2lmKDQ4PD1hJiY1Nz49YXx8Cjk2PD1hJiYxMDY+PWF8fDY1PD1hJiY5MD49YXx8KHl8fGJiKSYmMD09YSlyZXR1cm4hMDtzd2l0Y2goYSl7Y2FzZSAzMjpjYXNlIDQzOmNhc2UgNjM6Y2FzZSA2NDpjYXNlIDEwNzpjYXNlIDEwOTpjYXNlIDExMDpjYXNlIDExMTpjYXNlIDE4NjpjYXNlIDU5OmNhc2UgMTg5OmNhc2UgMTg3OmNhc2UgNjE6Y2FzZSAxODg6Y2FzZSAxOTA6Y2FzZSAxOTE6Y2FzZSAxOTI6Y2FzZSAyMjI6Y2FzZSAyMTk6Y2FzZSAyMjA6Y2FzZSAyMjE6Y2FzZSAxNjM6Y2FzZSA1ODpyZXR1cm4hMDtjYXNlIDE3MzpyZXR1cm4geDtkZWZhdWx0OnJldHVybiExfX0sd2M9ZnVuY3Rpb24oYSl7aWYoeClhPXljKGEpO2Vsc2UgaWYoeiYmeSlzd2l0Y2goYSl7Y2FzZSA5MzphPTkxfXJldHVybiBhfSx5Yz1mdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSA2MTpyZXR1cm4gMTg3O2Nhc2UgNTk6cmV0dXJuIDE4NjtjYXNlIDE3MzpyZXR1cm4gMTg5O2Nhc2UgMjI0OnJldHVybiA5MTtjYXNlIDA6cmV0dXJuIDIyNDsKZGVmYXVsdDpyZXR1cm4gYX19O3ZhciBKPWZ1bmN0aW9uKGEsYil7SS5jYWxsKHRoaXMpO2EmJnpjKHRoaXMsYSxiKX07bihKLEkpO2g9Si5wcm90b3R5cGU7aC5TPW51bGw7aC5uYT1udWxsO2guQ2E9bnVsbDtoLm9hPW51bGw7aC53PS0xO2guRj0tMTtoLnVhPSExOwp2YXIgQWM9ezM6MTMsMTI6MTQ0LDYzMjMyOjM4LDYzMjMzOjQwLDYzMjM0OjM3LDYzMjM1OjM5LDYzMjM2OjExMiw2MzIzNzoxMTMsNjMyMzg6MTE0LDYzMjM5OjExNSw2MzI0MDoxMTYsNjMyNDE6MTE3LDYzMjQyOjExOCw2MzI0MzoxMTksNjMyNDQ6MTIwLDYzMjQ1OjEyMSw2MzI0NjoxMjIsNjMyNDc6MTIzLDYzMjQ4OjQ0LDYzMjcyOjQ2LDYzMjczOjM2LDYzMjc1OjM1LDYzMjc2OjMzLDYzMjc3OjM0LDYzMjg5OjE0NCw2MzMwMjo0NX0sQmM9e1VwOjM4LERvd246NDAsTGVmdDozNyxSaWdodDozOSxFbnRlcjoxMyxGMToxMTIsRjI6MTEzLEYzOjExNCxGNDoxMTUsRjU6MTE2LEY2OjExNyxGNzoxMTgsRjg6MTE5LEY5OjEyMCxGMTA6MTIxLEYxMToxMjIsRjEyOjEyMywiVSswMDdGIjo0NixIb21lOjM2LEVuZDozNSxQYWdlVXA6MzMsUGFnZURvd246MzQsSW5zZXJ0OjQ1fSxDYz0heXx8QSgiNTI1IiksRGM9eiYmeDsKSi5wcm90b3R5cGUuYT1mdW5jdGlvbihhKXtpZih5fHxiYilpZigxNz09dGhpcy53JiYhYS5jdHJsS2V5fHwxOD09dGhpcy53JiYhYS5hbHRLZXl8fHomJjkxPT10aGlzLncmJiFhLm1ldGFLZXkpdGhpcy5GPXRoaXMudz0tMTstMT09dGhpcy53JiYoYS5jdHJsS2V5JiYxNyE9YS5jP3RoaXMudz0xNzphLmFsdEtleSYmMTghPWEuYz90aGlzLnc9MTg6YS5tZXRhS2V5JiY5MSE9YS5jJiYodGhpcy53PTkxKSk7Q2MmJiF4YyhhLmMsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGEuYWx0S2V5LGEubWV0YUtleSk/dGhpcy5oYW5kbGVFdmVudChhKToodGhpcy5GPXdjKGEuYyksRGMmJih0aGlzLnVhPWEuYWx0S2V5KSl9O0oucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dGhpcy5GPXRoaXMudz0tMTt0aGlzLnVhPWEuYWx0S2V5fTsKSi5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5iLGM9Yi5hbHRLZXk7aWYodiYmImtleXByZXNzIj09YS50eXBlKXt2YXIgZD10aGlzLkY7dmFyIGU9MTMhPWQmJjI3IT1kP2Iua2V5Q29kZTowfWVsc2UoeXx8YmIpJiYia2V5cHJlc3MiPT1hLnR5cGU/KGQ9dGhpcy5GLGU9MDw9Yi5jaGFyQ29kZSYmNjMyMzI+Yi5jaGFyQ29kZSYmdmMoZCk/Yi5jaGFyQ29kZTowKTphYiYmIXk/KGQ9dGhpcy5GLGU9dmMoZCk/Yi5rZXlDb2RlOjApOigia2V5cHJlc3MiPT1hLnR5cGU/KERjJiYoYz10aGlzLnVhKSxiLmtleUNvZGU9PWIuY2hhckNvZGU/MzI+Yi5rZXlDb2RlPyhkPWIua2V5Q29kZSxlPTApOihkPXRoaXMuRixlPWIuY2hhckNvZGUpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkseiYmNjM9PWUmJjIyND09ZCYmKGQ9MTkxKSk7dmFyIGY9ZD13YyhkKTtkPzYzMjMyPD0KZCYmZCBpbiBBYz9mPUFjW2RdOjI1PT1kJiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBCYyYmKGY9QmNbYi5rZXlJZGVudGlmaWVyXSk7eCYmQ2MmJiJrZXlwcmVzcyI9PWEudHlwZSYmIXhjKGYsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KXx8KGE9Zj09dGhpcy53LHRoaXMudz1mLGI9bmV3IEVjKGYsZSxhLGIpLGIuYWx0S2V5PWMsdWModGhpcyxiKSl9O0oucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTsKdmFyIHpjPWZ1bmN0aW9uKGEsYixjKXthLm9hJiZGYyhhKTthLlM9YjthLm5hPWJjKGEuUywia2V5cHJlc3MiLGEsYyk7YS5DYT1iYyhhLlMsImtleWRvd24iLGEuYSxjLGEpO2Eub2E9YmMoYS5TLCJrZXl1cCIsYS5iLGMsYSl9LEZjPWZ1bmN0aW9uKGEpe2EubmEmJihrYyhhLm5hKSxrYyhhLkNhKSxrYyhhLm9hKSxhLm5hPW51bGwsYS5DYT1udWxsLGEub2E9bnVsbCk7YS5TPW51bGw7YS53PS0xO2EuRj0tMX07Si5wcm90b3R5cGUudT1mdW5jdGlvbigpe0ouaS51LmNhbGwodGhpcyk7RmModGhpcyl9O3ZhciBFYz1mdW5jdGlvbihhLGIsYyxkKXtHLmNhbGwodGhpcyxkKTt0aGlzLnR5cGU9ImtleSI7dGhpcy5jPWE7dGhpcy5yZXBlYXQ9Y307bihFYyxHKTt2YXIgR2M9eD8iTW96VXNlclNlbGVjdCI6eXx8YmI/IldlYmtpdFVzZXJTZWxlY3QiOm51bGwsSGM9ZnVuY3Rpb24oYSxiKXtiPWI/bnVsbDphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7aWYoR2Mpe3ZhciBjPSJub25lIjthLnN0eWxlJiYoYS5zdHlsZVtHY109Yyk7aWYoYil7YT0wO2Zvcih2YXIgZDtkPWJbYV07YSsrKWQuc3R5bGUmJihkLnN0eWxlW0djXT1jKX19ZWxzZSBpZih2fHxhYilpZihjPSJvbiIsYS5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyksYilmb3IoYT0wO2Q9YlthXTthKyspZC5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyl9O3ZhciBJYz1mdW5jdGlvbigpe307ZGEoSWMpO0ljLnByb3RvdHlwZS5hPTA7dmFyIEs9ZnVuY3Rpb24oYSl7SS5jYWxsKHRoaXMpO3RoaXMuaj1hfHx4YXx8KHhhPW5ldyB1Yik7dGhpcy5xYT1KYzt0aGlzLlk9bnVsbDt0aGlzLm09ITE7dGhpcy5hPW51bGw7dGhpcy5BPXZvaWQgMDt0aGlzLmc9dGhpcy5jPXRoaXMuYj1udWxsO3RoaXMuR2E9ITF9O24oSyxJKTtLLnByb3RvdHlwZS5PYT1JYy5SKCk7CnZhciBKYz1udWxsLEtjPWZ1bmN0aW9uKGEsYil7c3dpdGNoKGEpe2Nhc2UgMTpyZXR1cm4gYj8iZGlzYWJsZSI6ImVuYWJsZSI7Y2FzZSAyOnJldHVybiBiPyJoaWdobGlnaHQiOiJ1bmhpZ2hsaWdodCI7Y2FzZSA0OnJldHVybiBiPyJhY3RpdmF0ZSI6ImRlYWN0aXZhdGUiO2Nhc2UgODpyZXR1cm4gYj8ic2VsZWN0IjoidW5zZWxlY3QiO2Nhc2UgMTY6cmV0dXJuIGI/ImNoZWNrIjoidW5jaGVjayI7Y2FzZSAzMjpyZXR1cm4gYj8iZm9jdXMiOiJibHVyIjtjYXNlIDY0OnJldHVybiBiPyJvcGVuIjoiY2xvc2UifXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBzdGF0ZSIpO30sTGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuWXx8KGEuWT0iOiIrKGEuT2EuYSsrKS50b1N0cmluZygzNikpfSxNYz1mdW5jdGlvbihhLGIpe2lmKGEuYiYmYS5iLmcpe3ZhciBjPWEuYi5nLGQ9YS5ZO2QgaW4gYyYmZGVsZXRlIGNbZF07cWEoYS5iLmcsYixhKX1hLlk9Yn07Sy5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9Owp2YXIgTmM9ZnVuY3Rpb24oYSl7YT1hLmE7cShhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cmV0dXJuIGF9LE9jPWZ1bmN0aW9uKGEpe2EuQXx8KGEuQT1uZXcgb2MoYSkpO3JldHVybiBxKGEuQSl9O0sucHJvdG90eXBlLnJhPWZ1bmN0aW9uKGEpe2lmKHRoaXMuYiYmdGhpcy5iIT1hKXRocm93IEVycm9yKCJNZXRob2Qgbm90IHN1cHBvcnRlZCIpO0suaS5yYS5jYWxsKHRoaXMsYSl9O0sucHJvdG90eXBlLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPW5iKHRoaXMuai5hLCJESVYiKX07CnZhciBQYz1mdW5jdGlvbihhLGIpe2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiJiZhLnhhKGIpKXthLkdhPSEwO3ZhciBjPXFiKGIpO2EuaiYmYS5qLmE9PWN8fChhLmo9Yj9uZXcgdWIocWIoYikpOnhhfHwoeGE9bmV3IHViKSk7YS52YShiKTthLkQoKX1lbHNlIHRocm93IEVycm9yKCJJbnZhbGlkIGVsZW1lbnQgdG8gZGVjb3JhdGUiKTt9O2g9Sy5wcm90b3R5cGU7aC54YT1mdW5jdGlvbigpe3JldHVybiEwfTtoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hfTtoLkQ9ZnVuY3Rpb24oKXt0aGlzLm09ITA7UWModGhpcyxmdW5jdGlvbihhKXshYS5tJiZhLmYoKSYmYS5EKCl9KX07aC5QPWZ1bmN0aW9uKCl7UWModGhpcyxmdW5jdGlvbihhKXthLm0mJmEuUCgpfSk7dGhpcy5BJiZyYyh0aGlzLkEpO3RoaXMubT0hMX07CmgudT1mdW5jdGlvbigpe3RoaXMubSYmdGhpcy5QKCk7dGhpcy5BJiYodGhpcy5BLk4oKSxkZWxldGUgdGhpcy5BKTtRYyh0aGlzLGZ1bmN0aW9uKGEpe2EuTigpfSk7IXRoaXMuR2EmJnRoaXMuYSYmb2IodGhpcy5hKTt0aGlzLmI9dGhpcy5hPXRoaXMuZz10aGlzLmM9bnVsbDtLLmkudS5jYWxsKHRoaXMpfTtoLnNhPWZ1bmN0aW9uKGEsYil7dGhpcy50YShhLFJjKHRoaXMpLGIpfTsKaC50YT1mdW5jdGlvbihhLGIsYyl7cSghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLm0mJihjfHwhdGhpcy5tKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZigwPmJ8fGI+UmModGhpcykpdGhyb3cgRXJyb3IoIkNoaWxkIGNvbXBvbmVudCBpbmRleCBvdXQgb2YgYm91bmRzIik7dGhpcy5nJiZ0aGlzLmN8fCh0aGlzLmc9e30sdGhpcy5jPVtdKTtpZihhLmI9PXRoaXMpe3ZhciBkPUxjKGEpO3RoaXMuZ1tkXT1hO0hhKHRoaXMuYyxhKX1lbHNlIHFhKHRoaXMuZyxMYyhhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuYiYmYS5ZKXt2YXIgZT1hLmI7ZD1hLlk7ZS5nJiZkPyhlPWUuZyxkPShudWxsIT09ZSYmZCBpbiBlP2VbZF06dm9pZCAwKXx8bnVsbCk6ZD1udWxsfWlmKGQmJmEuYiE9dGhpcyl0aHJvdyBFcnJvcigiVW5hYmxlIHRvIHNldCBwYXJlbnQgY29tcG9uZW50Iik7CmEuYj10aGlzO0suaS5yYS5jYWxsKGEsdGhpcyk7TGEodGhpcy5jLGIsMCxhKTtpZihhLm0mJnRoaXMubSYmYS5iPT10aGlzKWM9dGhpcy5qYSgpLGI9Yy5jaGlsZE5vZGVzW2JdfHxudWxsLGIhPWEuZigpJiZjLmluc2VydEJlZm9yZShhLmYoKSxiKTtlbHNlIGlmKGMpe3RoaXMuYXx8dGhpcy5pYSgpO2M9TCh0aGlzLGIrMSk7Yj10aGlzLmphKCk7Yz1jP2MuYTpudWxsO2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTthLmF8fGEuaWEoKTtiP2IuaW5zZXJ0QmVmb3JlKGEuYSxjfHxudWxsKTphLmouYS5ib2R5LmFwcGVuZENoaWxkKGEuYSk7YS5iJiYhYS5iLm18fGEuRCgpfWVsc2UgdGhpcy5tJiYhYS5tJiZhLmEmJmEuYS5wYXJlbnROb2RlJiYxPT1hLmEucGFyZW50Tm9kZS5ub2RlVHlwZSYmYS5EKCl9O2guamE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hfTsKdmFyIFNjPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEucWEpe3ZhciBiPWEubT9hLmE6YS5qLmEuYm9keTthOnt2YXIgYz1xYihiKTtpZihjLmRlZmF1bHRWaWV3JiZjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihjPWMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpKSl7Yz1jLmRpcmVjdGlvbnx8Yy5nZXRQcm9wZXJ0eVZhbHVlKCJkaXJlY3Rpb24iKXx8IiI7YnJlYWsgYX1jPSIifWEucWE9InJ0bCI9PShjfHwoYi5jdXJyZW50U3R5bGU/Yi5jdXJyZW50U3R5bGUuZGlyZWN0aW9uOm51bGwpfHxiLnN0eWxlJiZiLnN0eWxlLmRpcmVjdGlvbil9cmV0dXJuIGEucWF9LFJjPWZ1bmN0aW9uKGEpe3JldHVybiBhLmM/YS5jLmxlbmd0aDowfSxMPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuYz9hLmNbYl18fG51bGw6bnVsbH0sUWM9ZnVuY3Rpb24oYSxiLGMpe2EuYyYmcihhLmMsYixjKX0sVGM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jJiZiP0RhKGEuYyxiKTotMX07dmFyIFZjPWZ1bmN0aW9uKGEsYil7aWYoIWEpdGhyb3cgRXJyb3IoIkludmFsaWQgY2xhc3MgbmFtZSAiK2EpO2lmKCFpYShiKSl0aHJvdyBFcnJvcigiSW52YWxpZCBkZWNvcmF0b3IgZnVuY3Rpb24gIitiKTtVY1thXT1ifSxXYz17fSxVYz17fTt2YXIgWGM9ZnVuY3Rpb24oYSl7dGhpcy5oPWF9O2RhKFhjKTt2YXIgWWM9ZnVuY3Rpb24oYSxiKXthJiYoYS50YWJJbmRleD1iPzA6LTEpfSwkYz1mdW5jdGlvbihhLGIsYyl7Yy5pZCYmTWMoYixjLmlkKTt2YXIgZD1hLmIoKSxlPSExLGY9RChjKTtmJiZyKGYsZnVuY3Rpb24oZyl7Zz09ZD9lPSEwOmcmJnRoaXMuZyhiLGcsZCl9LGEpO2V8fEViKGMsZCk7WmMoYixjKTtyZXR1cm4gY307WGMucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiLGMpe2I9PWMrIi1kaXNhYmxlZCI/YS5aKCExKTpiPT1jKyItaG9yaXpvbnRhbCI/YWQoYSwiaG9yaXpvbnRhbCIpOmI9PWMrIi12ZXJ0aWNhbCImJmFkKGEsInZlcnRpY2FsIil9Owp2YXIgWmM9ZnVuY3Rpb24oYSxiKXtpZihiKWZvcih2YXIgYz1iLmZpcnN0Q2hpbGQsZDtjJiZjLnBhcmVudE5vZGU9PWI7KXtkPWMubmV4dFNpYmxpbmc7aWYoMT09Yy5ub2RlVHlwZSl7YTp7dmFyIGU9YztxKGUpO2U9RChlKTtmb3IodmFyIGY9MCxnPWUubGVuZ3RoO2Y8ZztmKyspe3ZhciBrPWVbZl07aWYoaz1rIGluIFVjP1VjW2tdKCk6bnVsbCl7ZT1rO2JyZWFrIGF9fWU9bnVsbH1lJiYoZS5hPWMsYS5pc0VuYWJsZWQoKXx8ZS5aKCExKSxhLnNhKGUpLFBjKGUsYykpfWVsc2UgYy5ub2RlVmFsdWUmJiIiIT1NYShjLm5vZGVWYWx1ZSl8fGIucmVtb3ZlQ2hpbGQoYyk7Yz1kfX0sYmQ9ZnVuY3Rpb24oYSxiKXtiPWIuZigpO3EoYiwiVGhlIGNvbnRhaW5lciBET00gZWxlbWVudCBjYW5ub3QgYmUgbnVsbC4iKTtIYyhiLHgpO3YmJihiLmhpZGVGb2N1cz0hMCk7KGE9YS5oKSYmdmIoYixhKX07WGMucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKWGMucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5iKCksYz1bYiwiaG9yaXpvbnRhbCI9PWEuSD9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgTT1mdW5jdGlvbigpe30sY2Q7ZGEoTSk7dmFyIGRkPXtidXR0b246InByZXNzZWQiLGNoZWNrYm94OiJjaGVja2VkIixtZW51aXRlbToic2VsZWN0ZWQiLG1lbnVpdGVtY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtcmFkaW86ImNoZWNrZWQiLHJhZGlvOiJjaGVja2VkIix0YWI6InNlbGVjdGVkIix0cmVlaXRlbToic2VsZWN0ZWQifTtNLnByb3RvdHlwZS5oPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLmouYigiRElWIixlZCh0aGlzLGEpLmpvaW4oIiAiKSxhLmJhKX07dmFyIGdkPWZ1bmN0aW9uKGEsYixjKXtpZihhPWEuZj9hLmYoKTphKXt2YXIgZD1bYl07diYmIUEoIjciKSYmKGQ9ZmQoRChhKSxiKSxkLnB1c2goYikpOyhjP0ZiOkhiKShhLGQpfX07Ck0ucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiKXtiLmlkJiZNYyhhLGIuaWQpO2ImJmIuZmlyc3RDaGlsZD9oZChhLGIuZmlyc3RDaGlsZC5uZXh0U2libGluZz9KYShiLmNoaWxkTm9kZXMpOmIuZmlyc3RDaGlsZCk6YS5iYT1udWxsO3ZhciBjPTAsZD10aGlzLmEoKSxlPXRoaXMuYSgpLGY9ITEsZz0hMSxrPSExLHA9SmEoRChiKSk7cihwLGZ1bmN0aW9uKEIpe2Z8fEIhPWQ/Z3x8QiE9ZT9jfD1pZCh0aGlzLEIpOmc9ITA6KGY9ITAsZT09ZCYmKGc9ITApKTsxPT1pZCh0aGlzLEIpJiYoQWEoYiksc2IoYikmJnRiKGIpJiZyYihiLCExKSl9LHRoaXMpO2Eubz1jO2Z8fChwLnB1c2goZCksZT09ZCYmKGc9ITApKTtnfHxwLnB1c2goZSk7KGE9YS53YSkmJnAucHVzaC5hcHBseShwLGEpO2lmKHYmJiFBKCI3Iikpe3ZhciB3PWZkKHApOzA8dy5sZW5ndGgmJihwLnB1c2guYXBwbHkocCx3KSxrPSEwKX1mJiZnJiYhYSYmIWt8fENiKGIscC5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIGpkPWZ1bmN0aW9uKGEsYil7aWYoYT1hLmgoKSl7cShiLCJUaGUgZWxlbWVudCBwYXNzZWQgYXMgYSBmaXJzdCBwYXJhbWV0ZXIgY2Fubm90IGJlIG51bGwuIik7dmFyIGM9Yi5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDthIT1jJiZ2YihiLGEpfX0sa2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYztpZihhLnYmMzImJihjPWEuZigpKSl7aWYoIWImJmEubyYzMil7dHJ5e2MuYmx1cigpfWNhdGNoKGQpe31hLm8mMzImJmEuRmEobnVsbCl9KHNiKGMpJiZ0YihjKSkhPWImJnJiKGMsYil9fSxsZD1mdW5jdGlvbihhLGIsYyl7Y2R8fChjZD17MToiZGlzYWJsZWQiLDg6InNlbGVjdGVkIiwxNjoiY2hlY2tlZCIsNjQ6ImV4cGFuZGVkIn0pO3EoYSwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO2I9Y2RbYl07dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDtkJiYoZD1kZFtkXXx8YixiPSJjaGVja2VkIj09Ynx8InNlbGVjdGVkIj09CmI/ZDpiKTtiJiZ4YihhLGIsYyl9O00ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250cm9sIn07CnZhciBlZD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuYSgpLGQ9W2NdLGU9YS5hKCk7ZSE9YyYmZC5wdXNoKGUpO2M9Yi5vO2ZvcihlPVtdO2M7KXt2YXIgZj1jJi1jO2UucHVzaChtZChhLGYpKTtjJj1+Zn1kLnB1c2guYXBwbHkoZCxlKTsoYT1iLndhKSYmZC5wdXNoLmFwcGx5KGQsYSk7diYmIUEoIjciKSYmZC5wdXNoLmFwcGx5KGQsZmQoZCkpO3JldHVybiBkfSxmZD1mdW5jdGlvbihhLGIpe3ZhciBjPVtdO2ImJihhPUlhKGEsW2JdKSk7cihbXSxmdW5jdGlvbihkKXshRmEoZCxsYShHYSxhKSl8fGImJiFHYShkLGIpfHxjLnB1c2goZC5qb2luKCJfIikpfSk7cmV0dXJuIGN9LG1kPWZ1bmN0aW9uKGEsYil7YS5ifHxuZChhKTtyZXR1cm4gYS5iW2JdfSxpZD1mdW5jdGlvbihhLGIpe2Euanx8KGEuYnx8bmQoYSksYS5qPXNhKGEuYikpO2E9cGFyc2VJbnQoYS5qW2JdLDEwKTtyZXR1cm4gaXNOYU4oYSk/MDphfSxuZD1mdW5jdGlvbihhKXt2YXIgYj1hLmEoKSxjPSF0KGIucmVwbGFjZSgvXHhhMHxccy9nLAoiICIpLCIgIik7cShjLCJDb250cm9sUmVuZGVyZXIgaGFzIGFuIGludmFsaWQgY3NzIGNsYXNzOiAnIitiKyInIik7YS5iPXsxOmIrIi1kaXNhYmxlZCIsMjpiKyItaG92ZXIiLDQ6YisiLWFjdGl2ZSIsODpiKyItc2VsZWN0ZWQiLDE2OmIrIi1jaGVja2VkIiwzMjpiKyItZm9jdXNlZCIsNjQ6YisiLW9wZW4ifX07dmFyIE49ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO2lmKCFiKXtiPXRoaXMuY29uc3RydWN0b3I7Zm9yKHZhciBkO2I7KXtkPWJbamFdfHwoYltqYV09KytrYSk7aWYoZD1XY1tkXSlicmVhaztiPWIuaT9iLmkuY29uc3RydWN0b3I6bnVsbH1iPWQ/aWEoZC5SKT9kLlIoKTpuZXcgZDpudWxsfXRoaXMuQj1iO3RoaXMuYmE9dm9pZCAwIT09YT9hOm51bGx9O24oTixLKTtoPU4ucHJvdG90eXBlO2guYmE9bnVsbDtoLm89MDtoLnY9Mzk7aC5LPTA7aC5JYT0hMDtoLndhPW51bGw7aC55YT0hMDtoLmlhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CLmModGhpcyk7dGhpcy5hPWE7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmeGIoYSwiaGlkZGVuIiwhMCkpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hPXRoaXMuQi5nKHRoaXMsYSk7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5JYT0ibm9uZSIhPWEuc3R5bGUuZGlzcGxheX07CmguRD1mdW5jdGlvbigpe04uaS5ELmNhbGwodGhpcyk7dmFyIGE9TmModGhpcyk7cSh0aGlzKTtxKGEpO3RoaXMuaXNWaXNpYmxlKCl8fHhiKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fGxkKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy52JjgmJmxkKGEsOCwhISh0aGlzLm8mOCkpO3RoaXMudiYxNiYmbGQoYSwxNiwhISh0aGlzLm8mMTYpKTt0aGlzLnYmNjQmJmxkKGEsNjQsISEodGhpcy5vJjY0KSk7YT10aGlzLkI7U2ModGhpcykmJmdkKHRoaXMuZigpLGEuYSgpKyItcnRsIiwhMCk7dGhpcy5pc0VuYWJsZWQoKSYma2QodGhpcyx0aGlzLmlzVmlzaWJsZSgpKTtpZih0aGlzLnYmLTImJih0aGlzLnlhJiZvZCh0aGlzLCEwKSx0aGlzLnYmMzImJihhPXRoaXMuZigpKSkpe3ZhciBiPXRoaXMuV3x8KHRoaXMuVz1uZXcgSik7emMoYixhKTtIKEgoSChPYyh0aGlzKSxiLCJrZXkiLHRoaXMuZmEpLGEsImZvY3VzIix0aGlzLk5hKSxhLCJibHVyIiwKdGhpcy5GYSl9fTt2YXIgb2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYz1PYyhhKSxkPWEuZigpO2I/KEgoSChIKEgoYyxkLEYuTCxhLmthKSxkLFtGLk0sRi5hYV0sYS5sYSksZCwibW91c2VvdmVyIixhLkFhKSxkLCJtb3VzZW91dCIsYS56YSksYS5lYSE9Y2EmJkgoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fEgoYyxkLCJkYmxjbGljayIsYS5KYSksYS5nYXx8KGEuZ2E9bmV3IHBkKGEpLHpiKGEsbGEoQWIsYS5nYSkpKSkpOihxYyhxYyhxYyhxYyhjLGQsRi5MLGEua2EpLGQsW0YuTSxGLmFhXSxhLmxhKSxkLCJtb3VzZW92ZXIiLGEuQWEpLGQsIm1vdXNlb3V0IixhLnphKSxhLmVhIT1jYSYmcWMoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fHFjKGMsZCwiZGJsY2xpY2siLGEuSmEpLEFiKGEuZ2EpLGEuZ2E9bnVsbCkpfTsKTi5wcm90b3R5cGUuUD1mdW5jdGlvbigpe04uaS5QLmNhbGwodGhpcyk7dGhpcy5XJiZGYyh0aGlzLlcpO3RoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJmtkKHRoaXMsITEpfTtOLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7Ti5pLnUuY2FsbCh0aGlzKTt0aGlzLlcmJih0aGlzLlcuTigpLGRlbGV0ZSB0aGlzLlcpO2RlbGV0ZSB0aGlzLkI7dGhpcy5nYT10aGlzLndhPXRoaXMuYmE9bnVsbH07dmFyIGhkPWZ1bmN0aW9uKGEsYil7YS5iYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm8mMSl9OwpOLnByb3RvdHlwZS5aPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYjtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0VuYWJsZWQmJiFiLmlzRW5hYmxlZCgpfHwhTyh0aGlzLDEsIWEpfHwoYXx8KHFkKHRoaXMsITEpLFAodGhpcywhMSkpLHRoaXMuaXNWaXNpYmxlKCkmJmtkKHRoaXMsYSksUSh0aGlzLDEsIWEsITApKX07CnZhciBQPWZ1bmN0aW9uKGEsYil7TyhhLDIsYikmJlEoYSwyLGIpfSxxZD1mdW5jdGlvbihhLGIpe08oYSw0LGIpJiZRKGEsNCxiKX0scmQ9ZnVuY3Rpb24oYSxiKXtPKGEsOCxiKSYmUShhLDgsYil9LHNkPWZ1bmN0aW9uKGEsYil7TyhhLDY0LGIpJiZRKGEsNjQsYil9LFE9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIWQmJjE9PWIpYS5aKCFjKTtlbHNlIGlmKGEudiZiJiZjIT0hIShhLm8mYikpe3ZhciBlPWEuQjtpZihkPWEuZigpKShlPW1kKGUsYikpJiZnZChhLGUsYyksbGQoZCxiLGMpO2Eubz1jP2Eub3xiOmEubyZ+Yn19LHRkPWZ1bmN0aW9uKGEsYixjKXtpZihhLm0mJmEubyZiJiYhYyl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTshYyYmYS5vJmImJlEoYSxiLCExKTthLnY9Yz9hLnZ8YjphLnYmfmJ9LFI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hISgyNTUmYikmJiEhKGEudiZiKX0sTz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuISEoYS52JmIpJiYhIShhLm8mCmIpIT1jJiYoIShhLksmYil8fHVjKGEsS2MoYixjKSkpJiYhYS5VfTtoPU4ucHJvdG90eXBlO2guQWE9ZnVuY3Rpb24oYSl7KCFhLnJlbGF0ZWRUYXJnZXR8fCFwYih0aGlzLmYoKSxhLnJlbGF0ZWRUYXJnZXQpKSYmdWModGhpcywiZW50ZXIiKSYmdGhpcy5pc0VuYWJsZWQoKSYmUih0aGlzLDIpJiZQKHRoaXMsITApfTtoLnphPWZ1bmN0aW9uKGEpe2EucmVsYXRlZFRhcmdldCYmcGIodGhpcy5mKCksYS5yZWxhdGVkVGFyZ2V0KXx8IXVjKHRoaXMsImxlYXZlIil8fChSKHRoaXMsNCkmJnFkKHRoaXMsITEpLFIodGhpcywyKSYmUCh0aGlzLCExKSl9O2guZWE9Y2E7Cmgua2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSxPYihhKSYmISh5JiZ6JiZhLmN0cmxLZXkpKSl7Uih0aGlzLDQpJiZxZCh0aGlzLCEwKTt2YXIgYjtpZihiPXRoaXMuQil7dmFyIGM7Yj10aGlzLnYmMzImJihjPXRoaXMuZigpKT9zYihjKSYmdGIoYyk6ITF9YiYmdGhpcy5mKCkuZm9jdXMoKX0hT2IoYSl8fHkmJnomJmEuY3RybEtleXx8YS5nKCl9O2gubGE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSx0aGlzLm8mNCYmdWQodGhpcyxhKSYmUih0aGlzLDQpJiZxZCh0aGlzLCExKSl9O2guSmE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmdWQodGhpcyxhKX07CnZhciB1ZD1mdW5jdGlvbihhLGIpe2lmKFIoYSwxNikpe3ZhciBjPSEoYS5vJjE2KTtPKGEsMTYsYykmJlEoYSwxNixjKX1SKGEsOCkmJnJkKGEsITApO1IoYSw2NCkmJnNkKGEsIShhLm8mNjQpKTtjPW5ldyBFKCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuQT1iLkEpO3JldHVybiB1YyhhLGMpfTtOLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe1IodGhpcywzMikmJk8odGhpcywzMiwhMCkmJlEodGhpcywzMiwhMCl9O04ucHJvdG90eXBlLkZhPWZ1bmN0aW9uKCl7Uih0aGlzLDQpJiZxZCh0aGlzLCExKTtSKHRoaXMsMzIpJiZPKHRoaXMsMzIsITEpJiZRKHRoaXMsMzIsITEpfTsKTi5wcm90b3R5cGUuZmE9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJjEzPT1hLmMmJnVkKHRoaXMsYSk/KGEuZygpLGEuaigpLCEwKTohMX07aWYoIWlhKE4pKXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBjbGFzcyAiK04pO2lmKCFpYShNKSl0aHJvdyBFcnJvcigiSW52YWxpZCByZW5kZXJlciBjbGFzcyAiK00pO3ZhciB2ZD1OW2phXXx8KE5bamFdPSsra2EpO1djW3ZkXT1NO1ZjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIHBkPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9ITE7dGhpcy5jPW5ldyBvYyh0aGlzKTt6Yih0aGlzLGxhKEFiLHRoaXMuYykpO2E9TmModGhpcy5iKTtIKEgoSCh0aGlzLmMsYSxGLkwsdGhpcy5oKSxhLEYuTSx0aGlzLmopLGEsImNsaWNrIix0aGlzLmcpfTtuKHBkLEMpO3ZhciB3ZD0hdnx8OTw9TnVtYmVyKGliKTsKcGQucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXt0aGlzLmE9ITF9O3BkLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7dGhpcy5hPSEwfTt2YXIgeGQ9ZnVuY3Rpb24oYSxiKXtpZighd2QpcmV0dXJuIGEuYnV0dG9uPTAsYS50eXBlPWIsYTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudHMiKTtjLmluaXRNb3VzZUV2ZW50KGIsYS5idWJibGVzLGEuY2FuY2VsYWJsZSxhLnZpZXd8fG51bGwsYS5kZXRhaWwsYS5zY3JlZW5YLGEuc2NyZWVuWSxhLmNsaWVudFgsYS5jbGllbnRZLGEuY3RybEtleSxhLmFsdEtleSxhLnNoaWZ0S2V5LGEubWV0YUtleSwwLGEucmVsYXRlZFRhcmdldHx8bnVsbCk7cmV0dXJuIGN9OwpwZC5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXtpZih0aGlzLmEpdGhpcy5hPSExO2Vsc2V7dmFyIGI9YS5iLGM9Yi5idXR0b24sZD1iLnR5cGUsZT14ZChiLCJtb3VzZWRvd24iKTt0aGlzLmIua2EobmV3IEcoZSxhLmEpKTtlPXhkKGIsIm1vdXNldXAiKTt0aGlzLmIubGEobmV3IEcoZSxhLmEpKTt3ZHx8KGIuYnV0dG9uPWMsYi50eXBlPWQpfX07cGQucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt0aGlzLmI9bnVsbDtwZC5pLnUuY2FsbCh0aGlzKX07dmFyIFM9ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO3RoaXMuZGE9Ynx8WGMuUigpO3RoaXMuSD1hfHwidmVydGljYWwifTtuKFMsSyk7aD1TLnByb3RvdHlwZTtoLkRhPW51bGw7aC5jYT1udWxsO2guZGE9bnVsbDtoLkg9bnVsbDtoLlQ9ITA7aC5PPSEwO2gubD0tMTtoLnM9bnVsbDtoLlY9ITE7aC5JPW51bGw7dmFyIHlkPWZ1bmN0aW9uKGEpe3JldHVybiBhLkRhfHxhLmYoKX07aD1TLnByb3RvdHlwZTtoLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPXRoaXMuai5iKCJESVYiLHRoaXMuZGEuYyh0aGlzKS5qb2luKCIgIikpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKGEpe3JldHVybiJESVYiPT1hLnRhZ05hbWV9O2gudmE9ZnVuY3Rpb24oYSl7dGhpcy5hPSRjKHRoaXMuZGEsdGhpcyxhKTsibm9uZSI9PWEuc3R5bGUuZGlzcGxheSYmKHRoaXMuVD0hMSl9OwpoLkQ9ZnVuY3Rpb24oKXtTLmkuRC5jYWxsKHRoaXMpO1FjKHRoaXMsZnVuY3Rpb24oYil7Yi5tJiZ6ZCh0aGlzLGIpfSx0aGlzKTt2YXIgYT10aGlzLmYoKTtiZCh0aGlzLmRhLHRoaXMpO0FkKHRoaXMsdGhpcy5UKTtIKEgoSChIKEgoSChIKEgoT2ModGhpcyksdGhpcywiZW50ZXIiLHRoaXMuV2EpLHRoaXMsImhpZ2hsaWdodCIsdGhpcy5YYSksdGhpcywidW5oaWdobGlnaHQiLHRoaXMuY2IpLHRoaXMsIm9wZW4iLHRoaXMuWWEpLHRoaXMsImNsb3NlIix0aGlzLlVhKSxhLEYuTCx0aGlzLlNhKSxxYihhKSxbRi5NLEYuYWFdLHRoaXMuVmEpLGEsW0YuTCxGLk0sRi5hYSwibW91c2VvdmVyIiwibW91c2VvdXQiLCJjb250ZXh0bWVudSJdLHRoaXMuVGEpO0JkKHRoaXMpfTt2YXIgQmQ9ZnVuY3Rpb24oYSl7dmFyIGI9T2MoYSksYz15ZChhKTtIKEgoSChiLGMsImZvY3VzIixhLkhhKSxjLCJibHVyIixhLlFhKSxhLmNhfHwoYS5jYT1uZXcgSih5ZChhKSkpLCJrZXkiLGEuUmEpfTtoPVMucHJvdG90eXBlOwpoLlA9ZnVuY3Rpb24oKXtDZCh0aGlzLC0xKTt0aGlzLnMmJnNkKHRoaXMucywhMSk7dGhpcy5WPSExO1MuaS5QLmNhbGwodGhpcyl9O2gudT1mdW5jdGlvbigpe1MuaS51LmNhbGwodGhpcyk7dGhpcy5jYSYmKHRoaXMuY2EuTigpLHRoaXMuY2E9bnVsbCk7dGhpcy5kYT10aGlzLnM9dGhpcy5JPXRoaXMuRGE9bnVsbH07aC5XYT1mdW5jdGlvbigpe3JldHVybiEwfTsKaC5YYT1mdW5jdGlvbihhKXt2YXIgYj1UYyh0aGlzLGEudGFyZ2V0KTtpZigtMTxiJiZiIT10aGlzLmwpe3ZhciBjPUwodGhpcyx0aGlzLmwpO2MmJlAoYywhMSk7dGhpcy5sPWI7Yz1MKHRoaXMsdGhpcy5sKTt0aGlzLlYmJnFkKGMsITApO3RoaXMucyYmYyE9dGhpcy5zJiYoYy52JjY0P3NkKGMsITApOnNkKHRoaXMucywhMSkpfWI9dGhpcy5mKCk7cShiLCJUaGUgRE9NIGVsZW1lbnQgZm9yIHRoZSBjb250YWluZXIgY2Fubm90IGJlIG51bGwuIik7bnVsbCE9YS50YXJnZXQuZigpJiZ4YihiLCJhY3RpdmVkZXNjZW5kYW50IixhLnRhcmdldC5mKCkuaWQpfTtoLmNiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT1MKHRoaXMsdGhpcy5sKSYmKHRoaXMubD0tMSk7YT10aGlzLmYoKTtxKGEsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnJlbW92ZUF0dHJpYnV0ZSh3YigiYWN0aXZlZGVzY2VuZGFudCIpKX07CmguWWE9ZnVuY3Rpb24oYSl7KGE9YS50YXJnZXQpJiZhIT10aGlzLnMmJmEuYj09dGhpcyYmKHRoaXMucyYmc2QodGhpcy5zLCExKSx0aGlzLnM9YSl9O2guVWE9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMucyYmKHRoaXMucz1udWxsKTt2YXIgYj10aGlzLmYoKSxjPWEudGFyZ2V0LmYoKTtiJiZhLnRhcmdldC5vJjImJmMmJihhPSIiLGMmJihhPWMuaWQscShhLCJUaGUgYWN0aXZlIGVsZW1lbnQgc2hvdWxkIGhhdmUgYW4gaWQuIikpLHhiKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEpKX07aC5TYT1mdW5jdGlvbihhKXt0aGlzLk8mJih0aGlzLlY9ITApO3ZhciBiPXlkKHRoaXMpO2ImJnNiKGIpJiZ0YihiKT9iLmZvY3VzKCk6YS5nKCl9O2guVmE9ZnVuY3Rpb24oKXt0aGlzLlY9ITF9OwpoLlRhPWZ1bmN0aW9uKGEpe2E6e3ZhciBiPWEudGFyZ2V0O2lmKHRoaXMuSSlmb3IodmFyIGM9dGhpcy5mKCk7YiYmYiE9PWM7KXt2YXIgZD1iLmlkO2lmKGQgaW4gdGhpcy5JKXtiPXRoaXMuSVtkXTticmVhayBhfWI9Yi5wYXJlbnROb2RlfWI9bnVsbH1pZihiKXN3aXRjaChhLnR5cGUpe2Nhc2UgRi5MOmIua2EoYSk7YnJlYWs7Y2FzZSBGLk06Y2FzZSBGLmFhOmIubGEoYSk7YnJlYWs7Y2FzZSAibW91c2VvdmVyIjpiLkFhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3V0IjpiLnphKGEpO2JyZWFrO2Nhc2UgImNvbnRleHRtZW51IjpiLmVhKGEpfX07aC5IYT1mdW5jdGlvbigpe307aC5RYT1mdW5jdGlvbigpe0NkKHRoaXMsLTEpO3RoaXMuVj0hMTt0aGlzLnMmJnNkKHRoaXMucywhMSl9OwpoLlJhPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmlzRW5hYmxlZCgpJiZ0aGlzLmlzVmlzaWJsZSgpJiYoMCE9UmModGhpcyl8fHRoaXMuRGEpJiZEZCh0aGlzLGEpPyhhLmcoKSxhLmooKSwhMCk6ITF9Owp2YXIgRGQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1MKGEsYS5sKTtpZihjJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5mYSYmYy5mYShiKXx8YS5zJiZhLnMhPWMmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLnMuZmEmJmEucy5mYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuYyl7Y2FzZSAyNzp5ZChhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpFZChhKTticmVhaztjYXNlIDM1OkZkKGEpO2JyZWFrO2Nhc2UgMzg6aWYoInZlcnRpY2FsIj09YS5IKUdkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9IZChhKTpHZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoInZlcnRpY2FsIj09YS5IKUhkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9HZChhKTpIZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSx6ZD1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZigpO2M9Yy5pZHx8KGMuaWQ9TGMoYikpO2EuSXx8KGEuST17fSk7YS5JW2NdPWJ9O1MucHJvdG90eXBlLnNhPWZ1bmN0aW9uKGEsYil7Q2EoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtTLmkuc2EuY2FsbCh0aGlzLGEsYil9O1MucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEsYixjKXtDYShhLE4pO2EuS3w9MjthLkt8PTY0O3RkKGEsMzIsITEpO2EubSYmMCE9YS55YSYmb2QoYSwhMSk7YS55YT0hMTt2YXIgZD1hLmI9PXRoaXM/VGModGhpcyxhKTotMTtTLmkudGEuY2FsbCh0aGlzLGEsYixjKTthLm0mJnRoaXMubSYmemQodGhpcyxhKTthPWQ7LTE9PWEmJihhPVJjKHRoaXMpKTthPT10aGlzLmw/dGhpcy5sPU1hdGgubWluKFJjKHRoaXMpLTEsYik6YT50aGlzLmwmJmI8PXRoaXMubD90aGlzLmwrKzphPHRoaXMubCYmYj50aGlzLmwmJnRoaXMubC0tfTsKdmFyIGFkPWZ1bmN0aW9uKGEsYil7aWYoYS5mKCkpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5IPWJ9O1MucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O3ZhciBBZD1mdW5jdGlvbihhLGIpe2EuVD1iO3ZhciBjPWEuZigpO2MmJihjLnN0eWxlLmRpc3BsYXk9Yj8iIjoibm9uZSIsWWMoeWQoYSksYS5PJiZhLlQpKX07Uy5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT307Uy5wcm90b3R5cGUuWj1mdW5jdGlvbihhKXt0aGlzLk8hPWEmJnVjKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5PPSEwLFFjKHRoaXMsZnVuY3Rpb24oYil7Yi5MYT9kZWxldGUgYi5MYTpiLlooITApfSkpOihRYyh0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5aKCExKTpiLkxhPSEwfSksdGhpcy5WPXRoaXMuTz0hMSksWWMoeWQodGhpcyksYSYmdGhpcy5UKSl9Owp2YXIgQ2Q9ZnVuY3Rpb24oYSxiKXsoYj1MKGEsYikpP1AoYiwhMCk6LTE8YS5sJiZQKEwoYSxhLmwpLCExKX0sRWQ9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LFJjKGEpLTEpfSxGZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiAwPmI/Yy0xOmJ9LDApfSxIZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7cmV0dXJuKGIrMSklY30sYS5sKX0sR2Q9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe2ItLTtyZXR1cm4gMD5iP2MtMTpifSxhLmwpfSxJZD1mdW5jdGlvbihhLGIsYyl7Yz0wPmM/VGMoYSxhLnMpOmM7dmFyIGQ9UmMoYSk7Yz1iLmNhbGwoYSxjLGQpO2Zvcih2YXIgZT0wO2U8PWQ7KXt2YXIgZj1MKGEsYyksZztpZihnPWYpZz1mLmlzVmlzaWJsZSgpJiZmLmlzRW5hYmxlZCgpJiYhIShmLnYmMik7aWYoZyl7YS5FYShjKTticmVha31lKys7Yz1iLmNhbGwoYSxjLGQpfX07ClMucHJvdG90eXBlLkVhPWZ1bmN0aW9uKGEpe0NkKHRoaXMsYSl9O3ZhciBUPWZ1bmN0aW9uKCl7fTtuKFQsTSk7ZGEoVCk7VC5wcm90b3R5cGUuYT1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYiJ9O1QucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXtyZXR1cm4idGFiIn07VC5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYj1ULmkuYy5jYWxsKHRoaXMsYSk7KGE9YS5QYSkmJmImJihiLnRpdGxlPWF8fCIiKTtyZXR1cm4gYn07VC5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIpe2I9VC5pLmcuY2FsbCh0aGlzLGEsYik7dmFyIGM9Yi50aXRsZXx8IiI7YyYmKGEuUGE9Yyk7YS5vJjgmJihjPWEuYikmJmlhKGMuRykmJihRKGEsOCwhMSksYy5HKGEpKTtyZXR1cm4gYn07dmFyIEpkPWZ1bmN0aW9uKGEsYixjKXtOLmNhbGwodGhpcyxhLGJ8fFQuUigpLGMpO3RkKHRoaXMsOCwhMCk7dGhpcy5LfD05fTtuKEpkLE4pO1ZjKCJnb29nLXRhYiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEpkKG51bGwpfSk7dmFyIFU9ZnVuY3Rpb24oKXt0aGlzLmg9InRhYmxpc3QifTtuKFUsWGMpO2RhKFUpO1UucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWItYmFyIn07VS5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIsYyl7dGhpcy5qfHwodGhpcy5hfHxLZCh0aGlzKSx0aGlzLmo9c2EodGhpcy5hKSk7dmFyIGQ9dGhpcy5qW2JdO2Q/KGFkKGEsTGQoZCkpLGEuQj1kKTpVLmkuZy5jYWxsKHRoaXMsYSxiLGMpfTtVLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPVUuaS5jLmNhbGwodGhpcyxhKTt0aGlzLmF8fEtkKHRoaXMpO2IucHVzaCh0aGlzLmFbYS5CXSk7cmV0dXJuIGJ9O3ZhciBLZD1mdW5jdGlvbihhKXt2YXIgYj1hLmIoKTthLmE9e3RvcDpiKyItdG9wIixib3R0b206YisiLWJvdHRvbSIsc3RhcnQ6YisiLXN0YXJ0IixlbmQ6YisiLWVuZCJ9fTt2YXIgVj1mdW5jdGlvbihhLGIsYyl7YT1hfHwidG9wIjthZCh0aGlzLExkKGEpKTt0aGlzLkI9YTtTLmNhbGwodGhpcyx0aGlzLkgsYnx8VS5SKCksYyk7TWQodGhpcyl9O24oVixTKTtoPVYucHJvdG90eXBlO2guQz1udWxsO2guRD1mdW5jdGlvbigpe1YuaS5ELmNhbGwodGhpcyk7TWQodGhpcyl9O2gudT1mdW5jdGlvbigpe1YuaS51LmNhbGwodGhpcyk7dGhpcy5DPW51bGx9O2guRWE9ZnVuY3Rpb24oYSl7Vi5pLkVhLmNhbGwodGhpcyxhKTt0aGlzLkcoTCh0aGlzLGEpKX07aC5HPWZ1bmN0aW9uKGEpe2E/cmQoYSwhMCk6dGhpcy5DJiZyZCh0aGlzLkMsITEpfTsKdmFyIE5kPWZ1bmN0aW9uKGEsYil7aWYoYiYmYj09YS5DKXtmb3IodmFyIGM9VGMoYSxiKSxkPWMtMTtiPUwoYSxkKTtkLS0pe3ZhciBlPWI7aWYoZS5pc1Zpc2libGUoKSYmZS5pc0VuYWJsZWQoKSl7YS5HKGIpO3JldHVybn19Zm9yKGMrPTE7Yj1MKGEsYyk7YysrKWlmKGQ9YixkLmlzVmlzaWJsZSgpJiZkLmlzRW5hYmxlZCgpKXthLkcoYik7cmV0dXJufWEuRyhudWxsKX19O2g9Vi5wcm90b3R5cGU7aC5hYj1mdW5jdGlvbihhKXt0aGlzLkMmJnRoaXMuQyE9YS50YXJnZXQmJnJkKHRoaXMuQywhMSk7dGhpcy5DPWEudGFyZ2V0fTtoLmJiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT10aGlzLkMmJih0aGlzLkM9bnVsbCl9O2guWmE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guJGE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guSGE9ZnVuY3Rpb24oKXtMKHRoaXMsdGhpcy5sKXx8Q2QodGhpcyxUYyh0aGlzLHRoaXMuQ3x8TCh0aGlzLDApKSl9Owp2YXIgTWQ9ZnVuY3Rpb24oYSl7SChIKEgoSChPYyhhKSxhLCJzZWxlY3QiLGEuYWIpLGEsInVuc2VsZWN0IixhLmJiKSxhLCJkaXNhYmxlIixhLlphKSxhLCJoaWRlIixhLiRhKX0sTGQ9ZnVuY3Rpb24oYSl7cmV0dXJuInN0YXJ0Ij09YXx8ImVuZCI9PWE/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O1ZjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBWfSk7ZnVuY3Rpb24gT2QoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIFBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgZz1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIrZyk7Zm9yKHZhciBrPVtdLHA9YmEoYyksdz1wLm5leHQoKTshdy5kb25lO3c9cC5uZXh0KCkpe3c9dy52YWx1ZTt2YXIgQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKQi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO0IudGV4dENvbnRlbnQ9dztmLmFwcGVuZENoaWxkKEIpO2sucHVzaChCKX0iYm90dG9tIiE9ZyYmZS5hcHBlbmRDaGlsZChmKTtwPW51bGw7aWYoInRvcCI9PWd8fCJib3R0b20iPT1nKXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTsidG9wIj09ZyYmcCYmZS5hcHBlbmRDaGlsZChwKTtCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0IuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciByYT1bXTtjPWJhKGMpO2Zvcih3PWMubmV4dCgpOyF3LmRvbmU7dz1jLm5leHQoKSl3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHcuaWQ9ZS5pZCsiX2NvbnRlbnRfIityYS5sZW5ndGgsdy5zdHlsZS5kaXNwbGF5PSJub25lIixCLmFwcGVuZENoaWxkKHcpLHJhLnB1c2godyk7ZS5hcHBlbmRDaGlsZChCKTsiYm90dG9tIj09ZyYmKHAmJgplLmFwcGVuZENoaWxkKHApLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBYPW5ldyBWKGcpO1BjKFgsZik7dmFyIFk9LTE7ZGMoWCwic2VsZWN0IixmdW5jdGlvbihaKXtaPWsuaW5kZXhPZihaLnRhcmdldC5mKCkpO1ohPVkmJigwPD1ZJiZZPHJhLmxlbmd0aCYmKHJhW1ldLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFk9LTEpLDA8PVomJlo8cmEubGVuZ3RoJiYoWT1aLHJhW1ldLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksWC5HKEwoWCxZKSkpfSk7WC5HKEwoWCxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFope1guRyhMKFgsWikpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChPZChhKSl9LFFkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sVz1sOwpRZFswXWluIFd8fCJ1bmRlZmluZWQiPT10eXBlb2YgVy5leGVjU2NyaXB0fHxXLmV4ZWNTY3JpcHQoInZhciAiK1FkWzBdKTtmb3IodmFyIFJkO1FkLmxlbmd0aCYmKFJkPVFkLnNoaWZ0KCkpOylRZC5sZW5ndGh8fHZvaWQgMD09PVBkP1dbUmRdJiZXW1JkXSE9PU9iamVjdC5wcm90b3R5cGVbUmRdP1c9V1tSZF06Vz1XW1JkXT17fTpXW1JkXT1QZDt9KS5jYWxsKHRoaXMpOwovLyBjbGFuZy1mb3JtYXQgb24K", + "headers": [ + [ + "content-type", + "application/javascript" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + } + } + }, + "executionInfo": { + "elapsed": 1534, + "status": "ok", + "timestamp": 1600709839363, + "user": { + "displayName": "Evgeny Skvortsov", + "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhiQjODaOVLfYnUuWS9rB3LRntzJDM0hqElzsUkdQ=s64", + "userId": "11510585406840398626" + }, + "user_tz": 420 + }, + "id": "rfVaUNu3SMEw", + "outputId": "0bd37395-e348-41d6-e569-43ab85883e35" + }, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id65" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id65" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id65" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1853d0f4-fc31-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id65\", \"tabNames\": [\"Description\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_b7cfc51988" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id65" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"18541ef6-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id65\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_f8069a2ca7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id65" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"18556b80-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_263dac266c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_1", + "outputarea_id65" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1855c5b2-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id65_content_1\");\n", + "//# sourceURL=js_56d74ceee0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_1", + "outputarea_id65" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"18560d7e-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1855c5b2-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_05c852b8ff" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_1", + "outputarea_id65" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"18565df6-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id65\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_0ca24551c3" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_1", + "outputarea_id65" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running Description\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"185aef7e-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"18556b80-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_a0e60dcbf3" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_1", + "outputarea_id65" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"185c64d0-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_0bdbf7aaf6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_0", + "outputarea_id65" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"185cae7c-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id65_content_0\");\n", + "//# sourceURL=js_9812b5bca1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_0", + "outputarea_id65" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"185cf2d8-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"185cae7c-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_51498ee049" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_0", + "outputarea_id65" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"185d3ca2-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id65\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_64e8e9e309" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_0", + "outputarea_id65" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_0", + "outputarea_id65", + "outputarea_id66", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_0", + "outputarea_id65", + "outputarea_id66", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_0", + "outputarea_id65", + "outputarea_id66", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"185ec680-fc31-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id66\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_5e6f3de627" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_0", + "outputarea_id65", + "outputarea_id66", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"185f0a8c-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id66\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_38a6efcf20" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_0", + "outputarea_id65", + "outputarea_id66", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"18602962-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_c807541594" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_0", + "id66_content_0", + "outputarea_id65", + "outputarea_id66", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"18606d14-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id66_content_0\");\n", + "//# sourceURL=js_4c622a8156" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_0", + "id66_content_0", + "outputarea_id65", + "outputarea_id66", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1860b21a-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"18606d14-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_b6872be666" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_0", + "id66_content_0", + "outputarea_id65", + "outputarea_id66", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1860f086-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id66\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_356bc49778" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_0", + "id66_content_0", + "outputarea_id65", + "outputarea_id66", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mDescription_sql\u001b[0m variable.\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " \"Alice\" AS name,\n", + " \"Product Manager\" AS role,\n", + " \"SEA\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Bob\" AS name,\n", + " \"Engineer\" AS role,\n", + " \"SEA\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Caroline\" AS name,\n", + " \"Engineer\" AS role,\n", + " \"LAX\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"David\" AS name,\n", + " \"Data Scientist\" AS role,\n", + " \"LAX\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Eve\" AS name,\n", + " \"Data Scientist\" AS role,\n", + " \"SEA\" AS office\n", + " \n", + ") )\n", + "SELECT\n", + " CONCAT(CONCAT(CONCAT(CONCAT(Employee.name, \" is \"), Employee.role), \" @ \"), Employee.office) AS col0\n", + "FROM\n", + " t_0_Employee AS Employee;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"1862078c-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"18602962-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_c792c720fd" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_0", + "id66_content_0", + "outputarea_id65", + "outputarea_id66", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1863340e-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"185c64d0-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_d78dffc085" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_0", + "outputarea_id65" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"18649aa6-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_e28c86c4bb" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_1", + "outputarea_id65" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1864e330-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id65_content_1\");\n", + "//# sourceURL=js_ddd8723fbe" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_1", + "outputarea_id65" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"186528b8-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1864e330-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_74770ac8dd" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_1", + "outputarea_id65" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"18656a6c-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id65\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_9eeb264281" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_1", + "outputarea_id65" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"18f125f2-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"18649aa6-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_d8deca9ce3" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_1", + "outputarea_id65" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"18f3988c-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_f470df2725" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_0", + "outputarea_id65" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"18f3de3c-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id65_content_0\");\n", + "//# sourceURL=js_d289f53e25" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_0", + "outputarea_id65" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"18f42c98-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"18f3de3c-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_6457579de8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_0", + "outputarea_id65" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"18f47342-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id65\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_c69904a51d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_0", + "outputarea_id65" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"18f5ac9e-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_09b2b880ee" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_0", + "id66_content_1", + "outputarea_id65", + "outputarea_id66", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"18f62f2a-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id66_content_1\");\n", + "//# sourceURL=js_1bb9a9c179" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_0", + "id66_content_1", + "outputarea_id65", + "outputarea_id66", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"18f6f374-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"18f62f2a-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_60e8d09912" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_0", + "id66_content_1", + "outputarea_id65", + "outputarea_id66", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"18f72e66-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id66\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_08def49551" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_0", + "id66_content_1", + "outputarea_id65", + "outputarea_id66", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mDescription\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0
0Alice is Product Manager @ SEA
1Bob is Engineer @ SEA
2Caroline is Engineer @ LAX
3David is Data Scientist @ LAX
4Eve is Data Scientist @ SEA
\n", + "
" + ], + "text/plain": [ + " col0\n", + "0 Alice is Product Manager @ SEA\n", + "1 Bob is Engineer @ SEA\n", + "2 Caroline is Engineer @ LAX\n", + "3 David is Data Scientist @ LAX\n", + "4 Eve is Data Scientist @ SEA" + ] + }, + "metadata": { + "tags": [ + "id65_content_0", + "id66_content_1", + "outputarea_id65", + "outputarea_id66", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"18fa4718-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"18f5ac9e-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_a7001a5129" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_0", + "id66_content_1", + "outputarea_id65", + "outputarea_id66", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"18fb71c4-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"18f3988c-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_d0bd5cdb1d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id65_content_0", + "outputarea_id65" + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "%%logica Description\n", + "\n", + "Employee(name: \"Alice\", role: \"Product Manager\", office: \"SEA\");\n", + "Employee(name: \"Bob\", role: \"Engineer\", office: \"SEA\");\n", + "Employee(name: \"Caroline\", role: \"Engineer\", office: \"LAX\");\n", + "Employee(name: \"David\", role: \"Data Scientist\", office: \"LAX\");\n", + "Employee(name: \"Eve\", role: \"Data Scientist\", office: \"SEA\");\n", + "\n", + "Describe(record, result) :-\n", + " result ==\n", + " record.name ++ \" is \" ++ record.role ++ \" @ \" ++ record.office;\n", + " \n", + "Description(d) :- Employee(..r), Describe(r, d);" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "t27kwMtmaoYW" + }, + "source": [ + "## Functions\n", + "\n", + "In set theory a function $f$ from $A$ to $B$ is simply a subset of Cartesian product $A \\times B$, i.e. $f \\subseteq A \\times B$ with the convention that $f(x)$ stands for $y$ such that $(x, y) \\in f$.\n", + "\n", + "Logica is following approach. When you define a predicate using function syntax\n", + "\n", + "\n", + "```\n", + "() = [:- ].\n", + "```\n", + "\n", + "it is interpreted exactly as\n", + "\n", + "```\n", + "(, logica_value: ) [:- ]\n", + "```\n", + "\n", + "Then if a predicate is used in an expression then it is automatically replaced with an auxiliary variable and a call extracting this variable from `logica_value` column is appended to the body.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 270, + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH0=", + "headers": [ + [ + "content-type", + "text/css" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgaCxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9ZnVuY3Rpb24oYSl7dmFyIGI9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmYVtTeW1ib2wuaXRlcmF0b3JdO3JldHVybiBiP2IuY2FsbChhKTp7bmV4dDphYShhKX19LGw9dGhpc3x8c2VsZixjYT1mdW5jdGlvbigpe30sZGE9ZnVuY3Rpb24oYSl7YS5CYT12b2lkIDA7YS5SPWZ1bmN0aW9uKCl7cmV0dXJuIGEuQmE/YS5CYTphLkJhPW5ldyBhfX0sZWE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7aWYoIm9iamVjdCI9PWIpaWYoYSl7aWYoYSBpbnN0YW5jZW9mIEFycmF5KXJldHVybiJhcnJheSI7aWYoYSBpbnN0YW5jZW9mIE9iamVjdClyZXR1cm4gYjt2YXIgYz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk7aWYoIltvYmplY3QgV2luZG93XSI9PWMpcmV0dXJuIm9iamVjdCI7CmlmKCJbb2JqZWN0IEFycmF5XSI9PWN8fCJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGgmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5zcGxpY2UmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoInNwbGljZSIpKXJldHVybiJhcnJheSI7aWYoIltvYmplY3QgRnVuY3Rpb25dIj09Y3x8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmNhbGwmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoImNhbGwiKSlyZXR1cm4iZnVuY3Rpb24ifWVsc2UgcmV0dXJuIm51bGwiO2Vsc2UgaWYoImZ1bmN0aW9uIj09YiYmInVuZGVmaW5lZCI9PXR5cGVvZiBhLmNhbGwpcmV0dXJuIm9iamVjdCI7cmV0dXJuIGJ9LGZhPWZ1bmN0aW9uKGEpe3JldHVybiJhcnJheSI9PWVhKGEpfSxoYT1mdW5jdGlvbihhKXt2YXIgYj1lYShhKTtyZXR1cm4iYXJyYXkiPT1ifHwib2JqZWN0Ij09CmImJiJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGh9LGlhPWZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PWVhKGEpfSxtPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBhO3JldHVybiJvYmplY3QiPT1iJiZudWxsIT1hfHwiZnVuY3Rpb24iPT1ifSxqYT0iY2xvc3VyZV91aWRfIisoMUU5Kk1hdGgucmFuZG9tKCk+Pj4wKSxrYT0wLGxhPWZ1bmN0aW9uKGEsYil7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe3ZhciBkPWMuc2xpY2UoKTtkLnB1c2guYXBwbHkoZCxhcmd1bWVudHMpO3JldHVybiBhLmFwcGx5KHRoaXMsZCl9fSxuPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe31jLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLmk9Yi5wcm90b3R5cGU7YS5wcm90b3R5cGU9bmV3IGM7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YX07dmFyIG1hLG5hPXtlYjoiYWN0aXZlZGVzY2VuZGFudCIsamI6ImF0b21pYyIsa2I6ImF1dG9jb21wbGV0ZSIsbWI6ImJ1c3kiLHBiOiJjaGVja2VkIixxYjoiY29saW5kZXgiLHZiOiJjb250cm9scyIseGI6ImRlc2NyaWJlZGJ5IixBYjoiZGlzYWJsZWQiLENiOiJkcm9wZWZmZWN0IixEYjoiZXhwYW5kZWQiLEViOiJmbG93dG8iLEdiOiJncmFiYmVkIixLYjoiaGFzcG9wdXAiLE1iOiJoaWRkZW4iLE9iOiJpbnZhbGlkIixQYjoibGFiZWwiLFFiOiJsYWJlbGxlZGJ5IixSYjoibGV2ZWwiLFdiOiJsaXZlIixrYzoibXVsdGlsaW5lIixsYzoibXVsdGlzZWxlY3RhYmxlIixwYzoib3JpZW50YXRpb24iLHFjOiJvd25zIixyYzoicG9zaW5zZXQiLHRjOiJwcmVzc2VkIix4YzoicmVhZG9ubHkiLHpjOiJyZWxldmFudCIsQWM6InJlcXVpcmVkIixFYzoicm93aW5kZXgiLEhjOiJzZWxlY3RlZCIsSmM6InNldHNpemUiLExjOiJzb3J0IixaYzoidmFsdWVtYXgiLCRjOiJ2YWx1ZW1pbiIsYWQ6InZhbHVlbm93IiwKYmQ6InZhbHVldGV4dCJ9O3ZhciBvYT1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkIGluIGEpYi5jYWxsKGMsYVtkXSxkLGEpfSxwYT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyBpbiBhKWlmKGFbY109PWIpcmV0dXJuITA7cmV0dXJuITF9LHFhPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsIT09YSYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfSxzYT1mdW5jdGlvbihhKXt2YXIgYj17fSxjO2ZvcihjIGluIGEpYlthW2NdXT1jO3JldHVybiBifSx0YT0iY29uc3RydWN0b3IgaGFzT3duUHJvcGVydHkgaXNQcm90b3R5cGVPZiBwcm9wZXJ0eUlzRW51bWVyYWJsZSB0b0xvY2FsZVN0cmluZyB0b1N0cmluZyB2YWx1ZU9mIi5zcGxpdCgiICIpLHVhPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8dGEubGVuZ3RoO2YrKyljPQp0YVtmXSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZCxjKSYmKGFbY109ZFtjXSl9fTt2YXIgdmE9e2ZiOiJhbGVydCIsZ2I6ImFsZXJ0ZGlhbG9nIixoYjoiYXBwbGljYXRpb24iLGliOiJhcnRpY2xlIixsYjoiYmFubmVyIixuYjoiYnV0dG9uIixvYjoiY2hlY2tib3giLHJiOiJjb2x1bW5oZWFkZXIiLHNiOiJjb21ib2JveCIsdGI6ImNvbXBsZW1lbnRhcnkiLHViOiJjb250ZW50aW5mbyIsd2I6ImRlZmluaXRpb24iLHliOiJkaWFsb2ciLHpiOiJkaXJlY3RvcnkiLEJiOiJkb2N1bWVudCIsRmI6ImZvcm0iLEhiOiJncmlkIixJYjoiZ3JpZGNlbGwiLEpiOiJncm91cCIsTGI6ImhlYWRpbmciLE5iOiJpbWciLFNiOiJsaW5rIixUYjoibGlzdCIsVWI6Imxpc3Rib3giLFZiOiJsaXN0aXRlbSIsWGI6ImxvZyIsWWI6Im1haW4iLFpiOiJtYXJxdWVlIiwkYjoibWF0aCIsYWM6Im1lbnUiLGJjOiJtZW51YmFyIixjYzoibWVudWl0ZW0iLGRjOiJtZW51aXRlbWNoZWNrYm94IixlYzoibWVudWl0ZW1yYWRpbyIsbWM6Im5hdmlnYXRpb24iLG5jOiJub3RlIixvYzoib3B0aW9uIiwKc2M6InByZXNlbnRhdGlvbiIsdWM6InByb2dyZXNzYmFyIix2YzoicmFkaW8iLHdjOiJyYWRpb2dyb3VwIix5YzoicmVnaW9uIixCYzoicm93IixDYzoicm93Z3JvdXAiLERjOiJyb3doZWFkZXIiLEZjOiJzY3JvbGxiYXIiLEdjOiJzZWFyY2giLEljOiJzZXBhcmF0b3IiLEtjOiJzbGlkZXIiLE1jOiJzcGluYnV0dG9uIixOYzoic3RhdHVzIixPYzoidGFiIixQYzoidGFibGlzdCIsUWM6InRhYnBhbmVsIixSYzoidGV4dGJveCIsU2M6InRleHRpbmZvIixUYzoidGltZXIiLFVjOiJ0b29sYmFyIixWYzoidG9vbHRpcCIsV2M6InRyZWUiLFhjOiJ0cmVlZ3JpZCIsWWM6InRyZWVpdGVtIn07dmFyIHdhPWZ1bmN0aW9uKGEpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsd2EpO2Vsc2V7dmFyIGI9RXJyb3IoKS5zdGFjaztiJiYodGhpcy5zdGFjaz1iKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSl9O24od2EsRXJyb3IpO3dhLnByb3RvdHlwZS5uYW1lPSJDdXN0b21FcnJvciI7dmFyIHhhO3ZhciB5YT1mdW5jdGlvbihhLGIpe2E9YS5zcGxpdCgiJXMiKTtmb3IodmFyIGM9IiIsZD1hLmxlbmd0aC0xLGU9MDtlPGQ7ZSsrKWMrPWFbZV0rKGU8Yi5sZW5ndGg/YltlXToiJXMiKTt3YS5jYWxsKHRoaXMsYythW2RdKX07bih5YSx3YSk7eWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjsKdmFyIHphPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSJBc3NlcnRpb24gZmFpbGVkIjtpZihjKXtlKz0iOiAiK2M7dmFyIGY9ZH1lbHNlIGEmJihlKz0iOiAiK2EsZj1iKTt0aHJvdyBuZXcgeWEoIiIrZSxmfHxbXSk7fSxxPWZ1bmN0aW9uKGEsYixjKXthfHx6YSgiIixudWxsLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX0sQWE9ZnVuY3Rpb24oYSxiLGMpe20oYSkmJjE9PWEubm9kZVR5cGV8fHphKCJFeHBlY3RlZCBFbGVtZW50IGJ1dCBnb3QgJXM6ICVzLiIsW2VhKGEpLGFdLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKX0sQ2E9ZnVuY3Rpb24oYSxiLGMsZCl7YSBpbnN0YW5jZW9mIGJ8fHphKCJFeHBlY3RlZCBpbnN0YW5jZW9mICVzIGJ1dCBnb3QgJXMuIixbQmEoYiksQmEoYSldLGMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpKX0sQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZgpGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTpudWxsPT09YT8ibnVsbCI6dHlwZW9mIGF9O3ZhciBEYT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3EobnVsbCE9YS5sZW5ndGgpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKCJzdHJpbmciPT09dHlwZW9mIGEpcmV0dXJuInN0cmluZyIhPT10eXBlb2YgYnx8MSE9Yi5sZW5ndGg/LTE6YS5pbmRleE9mKGIsMCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspaWYoYyBpbiBhJiZhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX0scj1BcnJheS5wcm90b3R5cGUuZm9yRWFjaD9mdW5jdGlvbihhLGIsYyl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsYyl9OmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9YS5sZW5ndGgsZT0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZj0wO2Y8ZDtmKyspZiBpbiBlJiZiLmNhbGwoYyxlW2ZdLGYsYSl9LEVhPUFycmF5LnByb3RvdHlwZS5maWx0ZXI/CmZ1bmN0aW9uKGEsYil7cShudWxsIT1hLmxlbmd0aCk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD1bXSxlPTAsZj0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZz0wO2c8YztnKyspaWYoZyBpbiBmKXt2YXIgaz1mW2ddO2IuY2FsbCh2b2lkIDAsayxnLGEpJiYoZFtlKytdPWspfXJldHVybiBkfSxGYT1BcnJheS5wcm90b3R5cGUuZXZlcnk/ZnVuY3Rpb24oYSxiKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmV2ZXJ5LmNhbGwoYSxiLHZvaWQgMCl9OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWEubGVuZ3RoLGQ9InN0cmluZyI9PT10eXBlb2YgYT9hLnNwbGl0KCIiKTphLGU9MDtlPGM7ZSsrKWlmKGUgaW4gZCYmIWIuY2FsbCh2b2lkIDAsZFtlXSxlLGEpKXJldHVybiExO3JldHVybiEwfSxHYT1mdW5jdGlvbihhLGIpe3JldHVybiAwPD0KRGEoYSxiKX0sSGE9ZnVuY3Rpb24oYSxiKXtiPURhKGEsYik7dmFyIGM7aWYoYz0wPD1iKXEobnVsbCE9YS5sZW5ndGgpLEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhLGIsMSk7cmV0dXJuIGN9LElhPWZ1bmN0aW9uKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGFyZ3VtZW50cyl9LEphPWZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDA8Yil7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX0sTGE9ZnVuY3Rpb24oYSxiLGMsZCl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShhLEthKGFyZ3VtZW50cywxKSl9LEthPWZ1bmN0aW9uKGEsYixjKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gMj49YXJndW1lbnRzLmxlbmd0aD9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsYixjKX07dmFyIE1hPVN0cmluZy5wcm90b3R5cGUudHJpbT9mdW5jdGlvbihhKXtyZXR1cm4gYS50cmltKCl9OmZ1bmN0aW9uKGEpe3JldHVybi9eW1xzXHhhMF0qKFtcc1xTXSo/KVtcc1x4YTBdKiQvLmV4ZWMoYSlbMV19LE5hPS8mL2csT2E9LzwvZyxQYT0vPi9nLFFhPS8iL2csUmE9LycvZyxTYT0vXHgwMC9nLFRhPS9bXHgwMCY8PiInXS8sdD1mdW5jdGlvbihhLGIpe3JldHVybi0xIT1hLmluZGV4T2YoYil9LFVhPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE8Yj8tMTphPmI/MTowfTt2YXIgdTthOnt2YXIgVmE9bC5uYXZpZ2F0b3I7aWYoVmEpe3ZhciBXYT1WYS51c2VyQWdlbnQ7aWYoV2Epe3U9V2E7YnJlYWsgYX19dT0iIn07LyoKCiBDb3B5cmlnaHQgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzLgogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKKi8KdmFyIFhhPWZ1bmN0aW9uKGEpe1RhLnRlc3QoYSkmJigtMSE9YS5pbmRleE9mKCImIikmJihhPWEucmVwbGFjZShOYSwiJmFtcDsiKSksLTEhPWEuaW5kZXhPZigiPCIpJiYoYT1hLnJlcGxhY2UoT2EsIiZsdDsiKSksLTEhPWEuaW5kZXhPZigiPiIpJiYoYT1hLnJlcGxhY2UoUGEsIiZndDsiKSksLTEhPWEuaW5kZXhPZignIicpJiYoYT1hLnJlcGxhY2UoUWEsIiZxdW90OyIpKSwtMSE9YS5pbmRleE9mKCInIikmJihhPWEucmVwbGFjZShSYSwiJiMzOTsiKSksLTEhPWEuaW5kZXhPZigiXHgwMCIpJiYoYT1hLnJlcGxhY2UoU2EsIiYjMDsiKSkpO3JldHVybiBhfTt2YXIgWWE9ZnVuY3Rpb24oYSl7WWFbIiAiXShhKTtyZXR1cm4gYX07WWFbIiAiXT1jYTt2YXIgJGE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1aYTtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsYSk/Y1thXTpjW2FdPWIoYSl9O3ZhciBhYj10KHUsIk9wZXJhIiksdj10KHUsIlRyaWRlbnQiKXx8dCh1LCJNU0lFIiksYmI9dCh1LCJFZGdlIikseD10KHUsIkdlY2tvIikmJiEodCh1LnRvTG93ZXJDYXNlKCksIndlYmtpdCIpJiYhdCh1LCJFZGdlIikpJiYhKHQodSwiVHJpZGVudCIpfHx0KHUsIk1TSUUiKSkmJiF0KHUsIkVkZ2UiKSx5PXQodS50b0xvd2VyQ2FzZSgpLCJ3ZWJraXQiKSYmIXQodSwiRWRnZSIpLHo9dCh1LCJNYWNpbnRvc2giKSxjYj1mdW5jdGlvbigpe3ZhciBhPWwuZG9jdW1lbnQ7cmV0dXJuIGE/YS5kb2N1bWVudE1vZGU6dm9pZCAwfSxkYjsKYTp7dmFyIGViPSIiLGZiPWZ1bmN0aW9uKCl7dmFyIGE9dTtpZih4KXJldHVybi9ydjooW15cKTtdKykoXCl8OykvLmV4ZWMoYSk7aWYoYmIpcmV0dXJuL0VkZ2VcLyhbXGRcLl0rKS8uZXhlYyhhKTtpZih2KXJldHVybi9cYig/Ok1TSUV8cnYpWzogXShbXlwpO10rKShcKXw7KS8uZXhlYyhhKTtpZih5KXJldHVybi9XZWJLaXRcLyhcUyspLy5leGVjKGEpO2lmKGFiKXJldHVybi8oPzpWZXJzaW9uKVsgXC9dPyhcUyspLy5leGVjKGEpfSgpO2ZiJiYoZWI9ZmI/ZmJbMV06IiIpO2lmKHYpe3ZhciBnYj1jYigpO2lmKG51bGwhPWdiJiZnYj5wYXJzZUZsb2F0KGViKSl7ZGI9U3RyaW5nKGdiKTticmVhayBhfX1kYj1lYn0KdmFyIGhiPWRiLFphPXt9LEE9ZnVuY3Rpb24oYSl7cmV0dXJuICRhKGEsZnVuY3Rpb24oKXtmb3IodmFyIGI9MCxjPU1hKFN0cmluZyhoYikpLnNwbGl0KCIuIiksZD1NYShTdHJpbmcoYSkpLnNwbGl0KCIuIiksZT1NYXRoLm1heChjLmxlbmd0aCxkLmxlbmd0aCksZj0wOzA9PWImJmY8ZTtmKyspe3ZhciBnPWNbZl18fCIiLGs9ZFtmXXx8IiI7ZG97Zz0vKFxkKikoXEQqKSguKikvLmV4ZWMoZyl8fFsiIiwiIiwiIiwiIl07az0vKFxkKikoXEQqKSguKikvLmV4ZWMoayl8fFsiIiwiIiwiIiwiIl07aWYoMD09Z1swXS5sZW5ndGgmJjA9PWtbMF0ubGVuZ3RoKWJyZWFrO2I9VWEoMD09Z1sxXS5sZW5ndGg/MDpwYXJzZUludChnWzFdLDEwKSwwPT1rWzFdLmxlbmd0aD8wOnBhcnNlSW50KGtbMV0sMTApKXx8VWEoMD09Z1syXS5sZW5ndGgsMD09a1syXS5sZW5ndGgpfHxVYShnWzJdLGtbMl0pO2c9Z1szXTtrPWtbM119d2hpbGUoMD09Yil9cmV0dXJuIDA8PWJ9KX0saWI7CmliPWwuZG9jdW1lbnQmJnY/Y2IoKTp2b2lkIDA7dmFyIGpiPSF2fHw5PD1OdW1iZXIoaWIpO3ZhciBsYj1mdW5jdGlvbihhLGIpe29hKGIsZnVuY3Rpb24oYyxkKXtjJiYib2JqZWN0Ij09dHlwZW9mIGMmJmMuZGQmJihjPWMuY2QoKSk7InN0eWxlIj09ZD9hLnN0eWxlLmNzc1RleHQ9YzoiY2xhc3MiPT1kP2EuY2xhc3NOYW1lPWM6ImZvciI9PWQ/YS5odG1sRm9yPWM6a2IuaGFzT3duUHJvcGVydHkoZCk/YS5zZXRBdHRyaWJ1dGUoa2JbZF0sYyk6MD09ZC5sYXN0SW5kZXhPZigiYXJpYS0iLDApfHwwPT1kLmxhc3RJbmRleE9mKCJkYXRhLSIsMCk/YS5zZXRBdHRyaWJ1dGUoZCxjKTphW2RdPWN9KX0sa2I9e2NlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjb2xzcGFuOiJjb2xTcGFuIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGhlaWdodDoiaGVpZ2h0IixtYXhsZW5ndGg6Im1heExlbmd0aCIsbm9uY2U6Im5vbmNlIixyb2xlOiJyb2xlIixyb3dzcGFuOiJyb3dTcGFuIix0eXBlOiJ0eXBlIix1c2VtYXA6InVzZU1hcCIsdmFsaWduOiJ2QWxpZ24iLAp3aWR0aDoid2lkdGgifSxtYj1mdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChrKXtrJiZiLmFwcGVuZENoaWxkKCJzdHJpbmciPT09dHlwZW9mIGs/YS5jcmVhdGVUZXh0Tm9kZShrKTprKX1mb3IodmFyIGU9MjtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXTtpZighaGEoZil8fG0oZikmJjA8Zi5ub2RlVHlwZSlkKGYpO2Vsc2V7YTp7aWYoZiYmIm51bWJlciI9PXR5cGVvZiBmLmxlbmd0aCl7aWYobShmKSl7dmFyIGc9ImZ1bmN0aW9uIj09dHlwZW9mIGYuaXRlbXx8InN0cmluZyI9PXR5cGVvZiBmLml0ZW07YnJlYWsgYX1pZihpYShmKSl7Zz0iZnVuY3Rpb24iPT10eXBlb2YgZi5pdGVtO2JyZWFrIGF9fWc9ITF9cihnP0phKGYpOmYsZCl9fX0sbmI9ZnVuY3Rpb24oYSxiKXtiPVN0cmluZyhiKTsiYXBwbGljYXRpb24veGh0bWwreG1sIj09PWEuY29udGVudFR5cGUmJihiPWIudG9Mb3dlckNhc2UoKSk7cmV0dXJuIGEuY3JlYXRlRWxlbWVudChiKX0sb2I9ZnVuY3Rpb24oYSl7YSYmCmEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpfSxwYj1mdW5jdGlvbihhLGIpe2lmKCFhfHwhYilyZXR1cm4hMTtpZihhLmNvbnRhaW5zJiYxPT1iLm5vZGVUeXBlKXJldHVybiBhPT1ifHxhLmNvbnRhaW5zKGIpO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbilyZXR1cm4gYT09Ynx8ISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNik7Zm9yKDtiJiZhIT1iOyliPWIucGFyZW50Tm9kZTtyZXR1cm4gYj09YX0scWI9ZnVuY3Rpb24oYSl7cShhLCJOb2RlIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4iKTtyZXR1cm4gOT09YS5ub2RlVHlwZT9hOmEub3duZXJEb2N1bWVudHx8YS5kb2N1bWVudH0scmI9ZnVuY3Rpb24oYSxiKXtiP2EudGFiSW5kZXg9MDooYS50YWJJbmRleD0tMSxhLnJlbW92ZUF0dHJpYnV0ZSgidGFiSW5kZXgiKSl9LHNiPWZ1bmN0aW9uKGEpe3JldHVybiB2JiYhQSgiOSIpPyhhPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKSwKbnVsbCE9YSYmYS5zcGVjaWZpZWQpOmEuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpfSx0Yj1mdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgYSYmMDw9YSYmMzI3Njg+YX0sdWI9ZnVuY3Rpb24oYSl7dGhpcy5hPWF8fGwuZG9jdW1lbnR8fGRvY3VtZW50fTt1Yi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBhP3RoaXMuYS5nZXRFbGVtZW50QnlJZChhKTphfTsKdWIucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuYSxlPWFyZ3VtZW50cyxmPVN0cmluZyhlWzBdKSxnPWVbMV07aWYoIWpiJiZnJiYoZy5uYW1lfHxnLnR5cGUpKXtmPVsiPCIsZl07Zy5uYW1lJiZmLnB1c2goJyBuYW1lPSInLFhhKGcubmFtZSksJyInKTtpZihnLnR5cGUpe2YucHVzaCgnIHR5cGU9IicsWGEoZy50eXBlKSwnIicpO3ZhciBrPXt9O3VhKGssZyk7ZGVsZXRlIGsudHlwZTtnPWt9Zi5wdXNoKCI+Iik7Zj1mLmpvaW4oIiIpfWY9bmIoZCxmKTtnJiYoInN0cmluZyI9PT10eXBlb2YgZz9mLmNsYXNzTmFtZT1nOmZhKGcpP2YuY2xhc3NOYW1lPWcuam9pbigiICIpOmxiKGYsZykpOzI8ZS5sZW5ndGgmJm1iKGQsZixlKTtyZXR1cm4gZn07dmFyIHZiPWZ1bmN0aW9uKGEsYil7Yj8ocShwYSh2YSxiKSwiTm8gc3VjaCBBUklBIHJvbGUgIitiKSxhLnNldEF0dHJpYnV0ZSgicm9sZSIsYikpOmEucmVtb3ZlQXR0cmlidXRlKCJyb2xlIil9LHhiPWZ1bmN0aW9uKGEsYixjKXtmYShjKSYmKGM9Yy5qb2luKCIgIikpO3ZhciBkPXdiKGIpOyIiPT09Y3x8dm9pZCAwPT1jPyhtYXx8KG1hPXthdG9taWM6ITEsYXV0b2NvbXBsZXRlOiJub25lIixkcm9wZWZmZWN0OiJub25lIixoYXNwb3B1cDohMSxsaXZlOiJvZmYiLG11bHRpbGluZTohMSxtdWx0aXNlbGVjdGFibGU6ITEsb3JpZW50YXRpb246InZlcnRpY2FsIixyZWFkb25seTohMSxyZWxldmFudDoiYWRkaXRpb25zIHRleHQiLHJlcXVpcmVkOiExLHNvcnQ6Im5vbmUiLGJ1c3k6ITEsZGlzYWJsZWQ6ITEsaGlkZGVuOiExLGludmFsaWQ6ImZhbHNlIn0pLGM9bWEsYiBpbiBjP2Euc2V0QXR0cmlidXRlKGQsY1tiXSk6YS5yZW1vdmVBdHRyaWJ1dGUoZCkpOmEuc2V0QXR0cmlidXRlKGQsCmMpfSx3Yj1mdW5jdGlvbihhKXtxKGEsIkFSSUEgYXR0cmlidXRlIGNhbm5vdCBiZSBlbXB0eS4iKTtxKHBhKG5hLGEpLCJObyBzdWNoIEFSSUEgYXR0cmlidXRlICIrYSk7cmV0dXJuImFyaWEtIithfTt2YXIgeWI9T2JqZWN0LmZyZWV6ZXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O3ZhciBDPWZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVTt0aGlzLko9dGhpcy5KfTtDLnByb3RvdHlwZS5VPSExO0MucHJvdG90eXBlLk49ZnVuY3Rpb24oKXt0aGlzLlV8fCh0aGlzLlU9ITAsdGhpcy51KCkpfTt2YXIgemI9ZnVuY3Rpb24oYSxiKXthLlU/YigpOihhLkp8fChhLko9W10pLGEuSi5wdXNoKGIpKX07Qy5wcm90b3R5cGUudT1mdW5jdGlvbigpe2lmKHRoaXMuSilmb3IoO3RoaXMuSi5sZW5ndGg7KXRoaXMuSi5zaGlmdCgpKCl9O3ZhciBBYj1mdW5jdGlvbihhKXthJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5OJiZhLk4oKX07dmFyIEJiPWZ1bmN0aW9uKGEpe3JldHVybiJzdHJpbmciPT10eXBlb2YgYS5jbGFzc05hbWU/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sRD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6QmIoYSkubWF0Y2goL1xTKy9nKXx8W119LENiPWZ1bmN0aW9uKGEsYil7InN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZT9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxEYj1mdW5jdGlvbihhLGIpe3JldHVybiBhLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5jb250YWlucyhiKTpHYShEKGEpLGIpfSxFYj1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFEYihhLGIpKXt2YXIgYz1CYihhKTtDYihhLGMrKDA8Yy5sZW5ndGg/IiAiK2I6YikpfX0sRmI9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClyKGIsCmZ1bmN0aW9uKGUpe0ViKGEsZSl9KTtlbHNle3ZhciBjPXt9O3IoRChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7cihiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPTA8Yi5sZW5ndGg/IiAiK2Q6ZDtDYihhLGIpfX0sR2I9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6RGIoYSxiKSYmQ2IoYSxFYShEKGEpLGZ1bmN0aW9uKGMpe3JldHVybiBjIT1ifSkuam9pbigiICIpKX0sSGI9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9yKGIsZnVuY3Rpb24oYyl7R2IoYSxjKX0pOkNiKGEsRWEoRChhKSxmdW5jdGlvbihjKXtyZXR1cm4hR2EoYixjKX0pLmpvaW4oIiAiKSl9O3ZhciBJYj0hdnx8OTw9TnVtYmVyKGliKSxKYj0hdnx8OTw9TnVtYmVyKGliKSxLYj12JiYhQSgiOSIpLExiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e2wuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsY2EsYiksbC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjYSxiKX1jYXRjaChjKXt9cmV0dXJuIGF9KCk7dmFyIEU9ZnVuY3Rpb24oYSxiKXt0aGlzLnR5cGU9YTt0aGlzLmE9dGhpcy50YXJnZXQ9Yjt0aGlzLmg9ITE7dGhpcy5LYT0hMH07RS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuaD0hMH07RS5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3RoaXMuS2E9ITF9O3ZhciBGPXtMOiJtb3VzZWRvd24iLE06Im1vdXNldXAiLGFhOiJtb3VzZWNhbmNlbCIsaGM6Im1vdXNlbW92ZSIsamM6Im1vdXNlb3ZlciIsaWM6Im1vdXNlb3V0IixmYzoibW91c2VlbnRlciIsZ2M6Im1vdXNlbGVhdmUifTt2YXIgRz1mdW5jdGlvbihhLGIpe0UuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy5hPXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5jPTA7dGhpcy5BPXRoaXMubWV0YUtleT10aGlzLnNoaWZ0S2V5PXRoaXMuYWx0S2V5PXRoaXMuY3RybEtleT0hMTt0aGlzLnBvaW50ZXJJZD0wO3RoaXMucG9pbnRlclR5cGU9IiI7dGhpcy5iPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMuYT1iO2lmKGI9YS5yZWxhdGVkVGFyZ2V0KXtpZih4KXthOnt0cnl7WWEoYi5ub2RlTmFtZSk7dmFyIGU9ITA7YnJlYWsgYX1jYXRjaChmKXt9ZT0KITF9ZXx8KGI9bnVsbCl9fWVsc2UibW91c2VvdmVyIj09Yz9iPWEuZnJvbUVsZW1lbnQ6Im1vdXNlb3V0Ij09YyYmKGI9YS50b0VsZW1lbnQpO3RoaXMucmVsYXRlZFRhcmdldD1iO2Q/KHRoaXMuY2xpZW50WD12b2lkIDAhPT1kLmNsaWVudFg/ZC5jbGllbnRYOmQucGFnZVgsdGhpcy5jbGllbnRZPXZvaWQgMCE9PWQuY2xpZW50WT9kLmNsaWVudFk6ZC5wYWdlWSx0aGlzLnNjcmVlblg9ZC5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1kLnNjcmVlbll8fDApOih0aGlzLmNsaWVudFg9dm9pZCAwIT09YS5jbGllbnRYP2EuY2xpZW50WDphLnBhZ2VYLHRoaXMuY2xpZW50WT12b2lkIDAhPT1hLmNsaWVudFk/YS5jbGllbnRZOmEucGFnZVksdGhpcy5zY3JlZW5YPWEuc2NyZWVuWHx8MCx0aGlzLnNjcmVlblk9YS5zY3JlZW5ZfHwwKTt0aGlzLmJ1dHRvbj1hLmJ1dHRvbjt0aGlzLmM9YS5rZXlDb2RlfHwwO3RoaXMua2V5PWEua2V5fHwiIjt0aGlzLmN0cmxLZXk9YS5jdHJsS2V5O3RoaXMuYWx0S2V5PQphLmFsdEtleTt0aGlzLnNoaWZ0S2V5PWEuc2hpZnRLZXk7dGhpcy5tZXRhS2V5PWEubWV0YUtleTt0aGlzLkE9ej9hLm1ldGFLZXk6YS5jdHJsS2V5O3RoaXMucG9pbnRlcklkPWEucG9pbnRlcklkfHwwO3RoaXMucG9pbnRlclR5cGU9InN0cmluZyI9PT10eXBlb2YgYS5wb2ludGVyVHlwZT9hLnBvaW50ZXJUeXBlOk1iW2EucG9pbnRlclR5cGVdfHwiIjt0aGlzLmI9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnRoaXMuZygpfX07bihHLEUpO3ZhciBOYj15YihbMSw0LDJdKSxNYj15Yih7MjoidG91Y2giLDM6InBlbiIsNDoibW91c2UifSksT2I9ZnVuY3Rpb24oYSl7cmV0dXJuIEliPzA9PWEuYi5idXR0b246ImNsaWNrIj09YS50eXBlPyEwOiEhKGEuYi5idXR0b24mTmJbMF0pfTtHLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7Ry5pLmouY2FsbCh0aGlzKTt0aGlzLmIuc3RvcFByb3BhZ2F0aW9uP3RoaXMuYi5zdG9wUHJvcGFnYXRpb24oKTp0aGlzLmIuY2FuY2VsQnViYmxlPSEwfTsKRy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe0cuaS5nLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5iO2lmKGEucHJldmVudERlZmF1bHQpYS5wcmV2ZW50RGVmYXVsdCgpO2Vsc2UgaWYoYS5yZXR1cm5WYWx1ZT0hMSxLYil0cnl7aWYoYS5jdHJsS2V5fHwxMTI8PWEua2V5Q29kZSYmMTIzPj1hLmtleUNvZGUpYS5rZXlDb2RlPS0xfWNhdGNoKGIpe319O3ZhciBQYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKDFFNipNYXRoLnJhbmRvbSgpfDApLFFiPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW1BiXSl9LFJiPTA7dmFyIFNiPWZ1bmN0aW9uKGEsYixjLGQsZSl7dGhpcy5saXN0ZW5lcj1hO3RoaXMuYT1udWxsO3RoaXMuc3JjPWI7dGhpcy50eXBlPWM7dGhpcy5jYXB0dXJlPSEhZDt0aGlzLm1hPWU7dGhpcy5rZXk9KytSYjt0aGlzLlg9dGhpcy5oYT0hMX0sVGI9ZnVuY3Rpb24oYSl7YS5YPSEwO2EubGlzdGVuZXI9bnVsbDthLmE9bnVsbDthLnNyYz1udWxsO2EubWE9bnVsbH07dmFyIFViPWZ1bmN0aW9uKGEpe3RoaXMuc3JjPWE7dGhpcy5hPXt9O3RoaXMuYj0wfTtVYi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS50b1N0cmluZygpO2E9dGhpcy5hW2ZdO2F8fChhPXRoaXMuYVtmXT1bXSx0aGlzLmIrKyk7dmFyIGc9VmIoYSxiLGQsZSk7LTE8Zz8oYj1hW2ddLGN8fChiLmhhPSExKSk6KGI9bmV3IFNiKGIsdGhpcy5zcmMsZiwhIWQsZSksYi5oYT1jLGEucHVzaChiKSk7cmV0dXJuIGJ9Owp2YXIgV2I9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLnR5cGU7YyBpbiBhLmEmJkhhKGEuYVtjXSxiKSYmKFRiKGIpLDA9PWEuYVtjXS5sZW5ndGgmJihkZWxldGUgYS5hW2NdLGEuYi0tKSl9LFhiPWZ1bmN0aW9uKGEsYixjLGQsZSl7YT1hLmFbYi50b1N0cmluZygpXTtiPS0xO2EmJihiPVZiKGEsYyxkLGUpKTtyZXR1cm4tMTxiP2FbYl06bnVsbH0sVmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuWCYmZi5saXN0ZW5lcj09YiYmZi5jYXB0dXJlPT0hIWMmJmYubWE9PWQpcmV0dXJuIGV9cmV0dXJuLTF9O3ZhciBZYj0iY2xvc3VyZV9sbV8iKygxRTYqTWF0aC5yYW5kb20oKXwwKSxaYj17fSwkYj0wLGJjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZCYmZC5vbmNlKXJldHVybiBhYyhhLGIsYyxkLGUpO2lmKGZhKGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyliYyhhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9Y2MoYyk7cmV0dXJuIFFiKGEpP2RjKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOmVjKGEsYixjLCExLGQsZSl9LGVjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGc9bShlKT8hIWUuY2FwdHVyZTohIWUsaz1mYyhhKTtrfHwoYVtZYl09az1uZXcgVWIoYSkpO2M9ay5hZGQoYixjLGQsZyxmKTtpZihjLmEpcmV0dXJuIGM7ZD1nYygpO2MuYT1kO2Quc3JjPWE7ZC5saXN0ZW5lcj1jO2lmKGEuYWRkRXZlbnRMaXN0ZW5lcilMYnx8KGU9Zyksdm9pZCAwPT09ZSYmKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksCmQsZSk7ZWxzZSBpZihhLmF0dGFjaEV2ZW50KWEuYXR0YWNoRXZlbnQoaGMoYi50b1N0cmluZygpKSxkKTtlbHNlIGlmKGEuYWRkTGlzdGVuZXImJmEucmVtb3ZlTGlzdGVuZXIpcSgiY2hhbmdlIj09PWIsIk1lZGlhUXVlcnlMaXN0IG9ubHkgaGFzIGEgY2hhbmdlIGV2ZW50IiksYS5hZGRMaXN0ZW5lcihkKTtlbHNlIHRocm93IEVycm9yKCJhZGRFdmVudExpc3RlbmVyIGFuZCBhdHRhY2hFdmVudCBhcmUgdW5hdmFpbGFibGUuIik7JGIrKztyZXR1cm4gY30sZ2M9ZnVuY3Rpb24oKXt2YXIgYT1pYyxiPUpiP2Z1bmN0aW9uKGMpe3JldHVybiBhLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKX06ZnVuY3Rpb24oYyl7Yz1hLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKTtpZighYylyZXR1cm4gY307cmV0dXJuIGJ9LGFjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZmEoYikpe2Zvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWFjKGEsYltmXSxjLGQsZSk7cmV0dXJuIG51bGx9Yz1jYyhjKTtyZXR1cm4gUWIoYSk/CmEuaC5hZGQoU3RyaW5nKGIpLGMsITAsbShkKT8hIWQuY2FwdHVyZTohIWQsZSk6ZWMoYSxiLGMsITAsZCxlKX0samM9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihmYShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylqYyhhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPWNjKGMpLFFiKGEpPyhhPWEuaCxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5hJiYoZj1hLmFbYl0sYz1WYihmLGMsZCxlKSwtMTxjJiYoVGIoZltjXSkscShudWxsIT1mLmxlbmd0aCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSwwPT1mLmxlbmd0aCYmKGRlbGV0ZSBhLmFbYl0sYS5iLS0pKSkpOmEmJihhPWZjKGEpKSYmKGM9WGIoYSxiLGMsZCxlKSkmJmtjKGMpfSxrYz1mdW5jdGlvbihhKXtpZigibnVtYmVyIiE9PXR5cGVvZiBhJiZhJiYhYS5YKXt2YXIgYj1hLnNyYztpZihRYihiKSlXYihiLmgsYSk7ZWxzZXt2YXIgYz1hLnR5cGUsZD1hLmE7Yi5yZW1vdmVFdmVudExpc3RlbmVyPwpiLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KGhjKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7JGItLTsoYz1mYyhiKSk/KFdiKGMsYSksMD09Yy5iJiYoYy5zcmM9bnVsbCxiW1liXT1udWxsKSk6VGIoYSl9fX0saGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gWmI/WmJbYV06WmJbYV09Im9uIithfSxtYz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMDtpZihhPWZjKGEpKWlmKGI9YS5hW2IudG9TdHJpbmcoKV0pZm9yKGI9Yi5jb25jYXQoKSxhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBmPWJbYV07ZiYmZi5jYXB0dXJlPT1jJiYhZi5YJiYoZj1sYyhmLGQpLGU9ZSYmITEhPT1mKX1yZXR1cm4gZX0sbGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5tYXx8YS5zcmM7YS5oYSYma2MoYSk7cmV0dXJuIGMuY2FsbChkLGIpfSxpYz1mdW5jdGlvbihhLApiKXtpZihhLlgpcmV0dXJuITA7aWYoIUpiKXtpZighYilhOntiPVsid2luZG93IiwiZXZlbnQiXTtmb3IodmFyIGM9bCxkPTA7ZDxiLmxlbmd0aDtkKyspaWYoYz1jW2JbZF1dLG51bGw9PWMpe2I9bnVsbDticmVhayBhfWI9Y31kPWI7Yj1uZXcgRyhkLHRoaXMpO2M9ITA7aWYoISgwPmQua2V5Q29kZXx8dm9pZCAwIT1kLnJldHVyblZhbHVlKSl7YTp7dmFyIGU9ITE7aWYoMD09ZC5rZXlDb2RlKXRyeXtkLmtleUNvZGU9LTE7YnJlYWsgYX1jYXRjaChnKXtlPSEwfWlmKGV8fHZvaWQgMD09ZC5yZXR1cm5WYWx1ZSlkLnJldHVyblZhbHVlPSEwfWQ9W107Zm9yKGU9Yi5hO2U7ZT1lLnBhcmVudE5vZGUpZC5wdXNoKGUpO2E9YS50eXBlO2ZvcihlPWQubGVuZ3RoLTE7IWIuaCYmMDw9ZTtlLS0pe2IuYT1kW2VdO3ZhciBmPW1jKGRbZV0sYSwhMCxiKTtjPWMmJmZ9Zm9yKGU9MDshYi5oJiZlPGQubGVuZ3RoO2UrKyliLmE9ZFtlXSxmPW1jKGRbZV0sYSwhMSxiKSxjPWMmJmZ9cmV0dXJuIGN9cmV0dXJuIGxjKGEsCm5ldyBHKGIsdGhpcykpfSxmYz1mdW5jdGlvbihhKXthPWFbWWJdO3JldHVybiBhIGluc3RhbmNlb2YgVWI/YTpudWxsfSxuYz0iX19jbG9zdXJlX2V2ZW50c19mbl8iKygxRTkqTWF0aC5yYW5kb20oKT4+PjApLGNjPWZ1bmN0aW9uKGEpe3EoYSwiTGlzdGVuZXIgY2FuIG5vdCBiZSBudWxsLiIpO2lmKGlhKGEpKXJldHVybiBhO3EoYS5oYW5kbGVFdmVudCwiQW4gb2JqZWN0IGxpc3RlbmVyIG11c3QgaGF2ZSBoYW5kbGVFdmVudCBtZXRob2QuIik7YVtuY118fChhW25jXT1mdW5jdGlvbihiKXtyZXR1cm4gYS5oYW5kbGVFdmVudChiKX0pO3JldHVybiBhW25jXX07dmFyIG9jPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9e319O24ob2MsQyk7CnZhciBwYz1bXSxIPWZ1bmN0aW9uKGEsYixjLGQpe2ZhKGMpfHwoYyYmKHBjWzBdPWMudG9TdHJpbmcoKSksYz1wYyk7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWJjKGIsY1tlXSxkfHxhLmhhbmRsZUV2ZW50LCExLGEuYnx8YSk7aWYoIWYpYnJlYWs7YS5hW2Yua2V5XT1mfXJldHVybiBhfSxxYz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoZmEoYykpZm9yKHZhciBnPTA7ZzxjLmxlbmd0aDtnKyspcWMoYSxiLGNbZ10sZCxlLGYpO2Vsc2UgZD1kfHxhLmhhbmRsZUV2ZW50LGU9bShlKT8hIWUuY2FwdHVyZTohIWUsZj1mfHxhLmJ8fGEsZD1jYyhkKSxlPSEhZSxjPVFiKGIpP1hiKGIuaCxTdHJpbmcoYyksZCxlLGYpOmI/KGI9ZmMoYikpP1hiKGIsYyxkLGUsZik6bnVsbDpudWxsLGMmJihrYyhjKSxkZWxldGUgYS5hW2Mua2V5XSk7cmV0dXJuIGF9LHJjPWZ1bmN0aW9uKGEpe29hKGEuYSxmdW5jdGlvbihiLGMpe3RoaXMuYS5oYXNPd25Qcm9wZXJ0eShjKSYma2MoYil9LAphKTthLmE9e319O29jLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7b2MuaS51LmNhbGwodGhpcyk7cmModGhpcyl9O29jLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJFdmVudEhhbmRsZXIuaGFuZGxlRXZlbnQgbm90IGltcGxlbWVudGVkIik7fTt2YXIgST1mdW5jdGlvbigpe0MuY2FsbCh0aGlzKTt0aGlzLmg9bmV3IFViKHRoaXMpO3RoaXMuTWE9dGhpczt0aGlzLnBhPW51bGx9O24oSSxDKTtJLnByb3RvdHlwZVtQYl09ITA7SS5wcm90b3R5cGUucmE9ZnVuY3Rpb24oYSl7dGhpcy5wYT1hfTtJLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjLGQpe2pjKHRoaXMsYSxiLGMsZCl9Owp2YXIgdWM9ZnVuY3Rpb24oYSxiKXtzYyhhKTt2YXIgYz1hLnBhO2lmKGMpe3ZhciBkPVtdO2Zvcih2YXIgZT0xO2M7Yz1jLnBhKWQucHVzaChjKSxxKDFFMz4rK2UsImluZmluaXRlIGxvb3AiKX1hPWEuTWE7Yz1iLnR5cGV8fGI7InN0cmluZyI9PT10eXBlb2YgYj9iPW5ldyBFKGIsYSk6YiBpbnN0YW5jZW9mIEU/Yi50YXJnZXQ9Yi50YXJnZXR8fGE6KGU9YixiPW5ldyBFKGMsYSksdWEoYixlKSk7ZT0hMDtpZihkKWZvcih2YXIgZj1kLmxlbmd0aC0xOyFiLmgmJjA8PWY7Zi0tKXt2YXIgZz1iLmE9ZFtmXTtlPXRjKGcsYywhMCxiKSYmZX1iLmh8fChnPWIuYT1hLGU9dGMoZyxjLCEwLGIpJiZlLGIuaHx8KGU9dGMoZyxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLmgmJmY8ZC5sZW5ndGg7ZisrKWc9Yi5hPWRbZl0sZT10YyhnLGMsITEsYikmJmU7cmV0dXJuIGV9OwpJLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7SS5pLnUuY2FsbCh0aGlzKTtpZih0aGlzLmgpe3ZhciBhPXRoaXMuaCxiPTAsYztmb3IoYyBpbiBhLmEpe2Zvcih2YXIgZD1hLmFbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixUYihkW2VdKTtkZWxldGUgYS5hW2NdO2EuYi0tfX10aGlzLnBhPW51bGx9O3ZhciBkYz1mdW5jdGlvbihhLGIsYyxkLGUpe3NjKGEpO3JldHVybiBhLmguYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LHRjPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5oLmFbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGc9YltmXTtpZihnJiYhZy5YJiZnLmNhcHR1cmU9PWMpe3ZhciBrPWcubGlzdGVuZXIscD1nLm1hfHxnLnNyYztnLmhhJiZXYihhLmgsZyk7ZT0hMSE9PWsuY2FsbChwLGQpJiZlfX1yZXR1cm4gZSYmMCE9ZC5LYX0sc2M9ZnVuY3Rpb24oYSl7cShhLmgsIkV2ZW50IHRhcmdldCBpcyBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgY2FsbCB0aGUgc3VwZXJjbGFzcyAoZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpIGNvbnN0cnVjdG9yPyIpfTt2YXIgeGM9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKHkmJiFBKCI1MjUiKSlyZXR1cm4hMDtpZih6JiZlKXJldHVybiB2YyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZigheCl7Im51bWJlciI9PT10eXBlb2YgYiYmKGI9d2MoYikpO3ZhciBnPTE3PT1ifHwxOD09Ynx8eiYmOTE9PWI7aWYoKCFjfHx6KSYmZ3x8eiYmMTY9PWImJihkfHxmKSlyZXR1cm4hMX1pZigoeXx8YmIpJiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1pZih2JiZkJiZiPT1hKXJldHVybiExO3N3aXRjaChhKXtjYXNlIDEzOnJldHVybiB4P2Z8fGU/ITE6IShjJiZkKTohMDtjYXNlIDI3OnJldHVybiEoeXx8YmJ8fHgpfXJldHVybiB4JiYoZHx8ZXx8Zik/ITE6dmMoYSl9LHZjPWZ1bmN0aW9uKGEpe2lmKDQ4PD1hJiY1Nz49YXx8Cjk2PD1hJiYxMDY+PWF8fDY1PD1hJiY5MD49YXx8KHl8fGJiKSYmMD09YSlyZXR1cm4hMDtzd2l0Y2goYSl7Y2FzZSAzMjpjYXNlIDQzOmNhc2UgNjM6Y2FzZSA2NDpjYXNlIDEwNzpjYXNlIDEwOTpjYXNlIDExMDpjYXNlIDExMTpjYXNlIDE4NjpjYXNlIDU5OmNhc2UgMTg5OmNhc2UgMTg3OmNhc2UgNjE6Y2FzZSAxODg6Y2FzZSAxOTA6Y2FzZSAxOTE6Y2FzZSAxOTI6Y2FzZSAyMjI6Y2FzZSAyMTk6Y2FzZSAyMjA6Y2FzZSAyMjE6Y2FzZSAxNjM6Y2FzZSA1ODpyZXR1cm4hMDtjYXNlIDE3MzpyZXR1cm4geDtkZWZhdWx0OnJldHVybiExfX0sd2M9ZnVuY3Rpb24oYSl7aWYoeClhPXljKGEpO2Vsc2UgaWYoeiYmeSlzd2l0Y2goYSl7Y2FzZSA5MzphPTkxfXJldHVybiBhfSx5Yz1mdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSA2MTpyZXR1cm4gMTg3O2Nhc2UgNTk6cmV0dXJuIDE4NjtjYXNlIDE3MzpyZXR1cm4gMTg5O2Nhc2UgMjI0OnJldHVybiA5MTtjYXNlIDA6cmV0dXJuIDIyNDsKZGVmYXVsdDpyZXR1cm4gYX19O3ZhciBKPWZ1bmN0aW9uKGEsYil7SS5jYWxsKHRoaXMpO2EmJnpjKHRoaXMsYSxiKX07bihKLEkpO2g9Si5wcm90b3R5cGU7aC5TPW51bGw7aC5uYT1udWxsO2guQ2E9bnVsbDtoLm9hPW51bGw7aC53PS0xO2guRj0tMTtoLnVhPSExOwp2YXIgQWM9ezM6MTMsMTI6MTQ0LDYzMjMyOjM4LDYzMjMzOjQwLDYzMjM0OjM3LDYzMjM1OjM5LDYzMjM2OjExMiw2MzIzNzoxMTMsNjMyMzg6MTE0LDYzMjM5OjExNSw2MzI0MDoxMTYsNjMyNDE6MTE3LDYzMjQyOjExOCw2MzI0MzoxMTksNjMyNDQ6MTIwLDYzMjQ1OjEyMSw2MzI0NjoxMjIsNjMyNDc6MTIzLDYzMjQ4OjQ0LDYzMjcyOjQ2LDYzMjczOjM2LDYzMjc1OjM1LDYzMjc2OjMzLDYzMjc3OjM0LDYzMjg5OjE0NCw2MzMwMjo0NX0sQmM9e1VwOjM4LERvd246NDAsTGVmdDozNyxSaWdodDozOSxFbnRlcjoxMyxGMToxMTIsRjI6MTEzLEYzOjExNCxGNDoxMTUsRjU6MTE2LEY2OjExNyxGNzoxMTgsRjg6MTE5LEY5OjEyMCxGMTA6MTIxLEYxMToxMjIsRjEyOjEyMywiVSswMDdGIjo0NixIb21lOjM2LEVuZDozNSxQYWdlVXA6MzMsUGFnZURvd246MzQsSW5zZXJ0OjQ1fSxDYz0heXx8QSgiNTI1IiksRGM9eiYmeDsKSi5wcm90b3R5cGUuYT1mdW5jdGlvbihhKXtpZih5fHxiYilpZigxNz09dGhpcy53JiYhYS5jdHJsS2V5fHwxOD09dGhpcy53JiYhYS5hbHRLZXl8fHomJjkxPT10aGlzLncmJiFhLm1ldGFLZXkpdGhpcy5GPXRoaXMudz0tMTstMT09dGhpcy53JiYoYS5jdHJsS2V5JiYxNyE9YS5jP3RoaXMudz0xNzphLmFsdEtleSYmMTghPWEuYz90aGlzLnc9MTg6YS5tZXRhS2V5JiY5MSE9YS5jJiYodGhpcy53PTkxKSk7Q2MmJiF4YyhhLmMsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGEuYWx0S2V5LGEubWV0YUtleSk/dGhpcy5oYW5kbGVFdmVudChhKToodGhpcy5GPXdjKGEuYyksRGMmJih0aGlzLnVhPWEuYWx0S2V5KSl9O0oucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dGhpcy5GPXRoaXMudz0tMTt0aGlzLnVhPWEuYWx0S2V5fTsKSi5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5iLGM9Yi5hbHRLZXk7aWYodiYmImtleXByZXNzIj09YS50eXBlKXt2YXIgZD10aGlzLkY7dmFyIGU9MTMhPWQmJjI3IT1kP2Iua2V5Q29kZTowfWVsc2UoeXx8YmIpJiYia2V5cHJlc3MiPT1hLnR5cGU/KGQ9dGhpcy5GLGU9MDw9Yi5jaGFyQ29kZSYmNjMyMzI+Yi5jaGFyQ29kZSYmdmMoZCk/Yi5jaGFyQ29kZTowKTphYiYmIXk/KGQ9dGhpcy5GLGU9dmMoZCk/Yi5rZXlDb2RlOjApOigia2V5cHJlc3MiPT1hLnR5cGU/KERjJiYoYz10aGlzLnVhKSxiLmtleUNvZGU9PWIuY2hhckNvZGU/MzI+Yi5rZXlDb2RlPyhkPWIua2V5Q29kZSxlPTApOihkPXRoaXMuRixlPWIuY2hhckNvZGUpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkseiYmNjM9PWUmJjIyND09ZCYmKGQ9MTkxKSk7dmFyIGY9ZD13YyhkKTtkPzYzMjMyPD0KZCYmZCBpbiBBYz9mPUFjW2RdOjI1PT1kJiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBCYyYmKGY9QmNbYi5rZXlJZGVudGlmaWVyXSk7eCYmQ2MmJiJrZXlwcmVzcyI9PWEudHlwZSYmIXhjKGYsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KXx8KGE9Zj09dGhpcy53LHRoaXMudz1mLGI9bmV3IEVjKGYsZSxhLGIpLGIuYWx0S2V5PWMsdWModGhpcyxiKSl9O0oucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTsKdmFyIHpjPWZ1bmN0aW9uKGEsYixjKXthLm9hJiZGYyhhKTthLlM9YjthLm5hPWJjKGEuUywia2V5cHJlc3MiLGEsYyk7YS5DYT1iYyhhLlMsImtleWRvd24iLGEuYSxjLGEpO2Eub2E9YmMoYS5TLCJrZXl1cCIsYS5iLGMsYSl9LEZjPWZ1bmN0aW9uKGEpe2EubmEmJihrYyhhLm5hKSxrYyhhLkNhKSxrYyhhLm9hKSxhLm5hPW51bGwsYS5DYT1udWxsLGEub2E9bnVsbCk7YS5TPW51bGw7YS53PS0xO2EuRj0tMX07Si5wcm90b3R5cGUudT1mdW5jdGlvbigpe0ouaS51LmNhbGwodGhpcyk7RmModGhpcyl9O3ZhciBFYz1mdW5jdGlvbihhLGIsYyxkKXtHLmNhbGwodGhpcyxkKTt0aGlzLnR5cGU9ImtleSI7dGhpcy5jPWE7dGhpcy5yZXBlYXQ9Y307bihFYyxHKTt2YXIgR2M9eD8iTW96VXNlclNlbGVjdCI6eXx8YmI/IldlYmtpdFVzZXJTZWxlY3QiOm51bGwsSGM9ZnVuY3Rpb24oYSxiKXtiPWI/bnVsbDphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7aWYoR2Mpe3ZhciBjPSJub25lIjthLnN0eWxlJiYoYS5zdHlsZVtHY109Yyk7aWYoYil7YT0wO2Zvcih2YXIgZDtkPWJbYV07YSsrKWQuc3R5bGUmJihkLnN0eWxlW0djXT1jKX19ZWxzZSBpZih2fHxhYilpZihjPSJvbiIsYS5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyksYilmb3IoYT0wO2Q9YlthXTthKyspZC5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyl9O3ZhciBJYz1mdW5jdGlvbigpe307ZGEoSWMpO0ljLnByb3RvdHlwZS5hPTA7dmFyIEs9ZnVuY3Rpb24oYSl7SS5jYWxsKHRoaXMpO3RoaXMuaj1hfHx4YXx8KHhhPW5ldyB1Yik7dGhpcy5xYT1KYzt0aGlzLlk9bnVsbDt0aGlzLm09ITE7dGhpcy5hPW51bGw7dGhpcy5BPXZvaWQgMDt0aGlzLmc9dGhpcy5jPXRoaXMuYj1udWxsO3RoaXMuR2E9ITF9O24oSyxJKTtLLnByb3RvdHlwZS5PYT1JYy5SKCk7CnZhciBKYz1udWxsLEtjPWZ1bmN0aW9uKGEsYil7c3dpdGNoKGEpe2Nhc2UgMTpyZXR1cm4gYj8iZGlzYWJsZSI6ImVuYWJsZSI7Y2FzZSAyOnJldHVybiBiPyJoaWdobGlnaHQiOiJ1bmhpZ2hsaWdodCI7Y2FzZSA0OnJldHVybiBiPyJhY3RpdmF0ZSI6ImRlYWN0aXZhdGUiO2Nhc2UgODpyZXR1cm4gYj8ic2VsZWN0IjoidW5zZWxlY3QiO2Nhc2UgMTY6cmV0dXJuIGI/ImNoZWNrIjoidW5jaGVjayI7Y2FzZSAzMjpyZXR1cm4gYj8iZm9jdXMiOiJibHVyIjtjYXNlIDY0OnJldHVybiBiPyJvcGVuIjoiY2xvc2UifXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBzdGF0ZSIpO30sTGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuWXx8KGEuWT0iOiIrKGEuT2EuYSsrKS50b1N0cmluZygzNikpfSxNYz1mdW5jdGlvbihhLGIpe2lmKGEuYiYmYS5iLmcpe3ZhciBjPWEuYi5nLGQ9YS5ZO2QgaW4gYyYmZGVsZXRlIGNbZF07cWEoYS5iLmcsYixhKX1hLlk9Yn07Sy5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9Owp2YXIgTmM9ZnVuY3Rpb24oYSl7YT1hLmE7cShhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cmV0dXJuIGF9LE9jPWZ1bmN0aW9uKGEpe2EuQXx8KGEuQT1uZXcgb2MoYSkpO3JldHVybiBxKGEuQSl9O0sucHJvdG90eXBlLnJhPWZ1bmN0aW9uKGEpe2lmKHRoaXMuYiYmdGhpcy5iIT1hKXRocm93IEVycm9yKCJNZXRob2Qgbm90IHN1cHBvcnRlZCIpO0suaS5yYS5jYWxsKHRoaXMsYSl9O0sucHJvdG90eXBlLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPW5iKHRoaXMuai5hLCJESVYiKX07CnZhciBQYz1mdW5jdGlvbihhLGIpe2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiJiZhLnhhKGIpKXthLkdhPSEwO3ZhciBjPXFiKGIpO2EuaiYmYS5qLmE9PWN8fChhLmo9Yj9uZXcgdWIocWIoYikpOnhhfHwoeGE9bmV3IHViKSk7YS52YShiKTthLkQoKX1lbHNlIHRocm93IEVycm9yKCJJbnZhbGlkIGVsZW1lbnQgdG8gZGVjb3JhdGUiKTt9O2g9Sy5wcm90b3R5cGU7aC54YT1mdW5jdGlvbigpe3JldHVybiEwfTtoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hfTtoLkQ9ZnVuY3Rpb24oKXt0aGlzLm09ITA7UWModGhpcyxmdW5jdGlvbihhKXshYS5tJiZhLmYoKSYmYS5EKCl9KX07aC5QPWZ1bmN0aW9uKCl7UWModGhpcyxmdW5jdGlvbihhKXthLm0mJmEuUCgpfSk7dGhpcy5BJiZyYyh0aGlzLkEpO3RoaXMubT0hMX07CmgudT1mdW5jdGlvbigpe3RoaXMubSYmdGhpcy5QKCk7dGhpcy5BJiYodGhpcy5BLk4oKSxkZWxldGUgdGhpcy5BKTtRYyh0aGlzLGZ1bmN0aW9uKGEpe2EuTigpfSk7IXRoaXMuR2EmJnRoaXMuYSYmb2IodGhpcy5hKTt0aGlzLmI9dGhpcy5hPXRoaXMuZz10aGlzLmM9bnVsbDtLLmkudS5jYWxsKHRoaXMpfTtoLnNhPWZ1bmN0aW9uKGEsYil7dGhpcy50YShhLFJjKHRoaXMpLGIpfTsKaC50YT1mdW5jdGlvbihhLGIsYyl7cSghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLm0mJihjfHwhdGhpcy5tKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZigwPmJ8fGI+UmModGhpcykpdGhyb3cgRXJyb3IoIkNoaWxkIGNvbXBvbmVudCBpbmRleCBvdXQgb2YgYm91bmRzIik7dGhpcy5nJiZ0aGlzLmN8fCh0aGlzLmc9e30sdGhpcy5jPVtdKTtpZihhLmI9PXRoaXMpe3ZhciBkPUxjKGEpO3RoaXMuZ1tkXT1hO0hhKHRoaXMuYyxhKX1lbHNlIHFhKHRoaXMuZyxMYyhhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuYiYmYS5ZKXt2YXIgZT1hLmI7ZD1hLlk7ZS5nJiZkPyhlPWUuZyxkPShudWxsIT09ZSYmZCBpbiBlP2VbZF06dm9pZCAwKXx8bnVsbCk6ZD1udWxsfWlmKGQmJmEuYiE9dGhpcyl0aHJvdyBFcnJvcigiVW5hYmxlIHRvIHNldCBwYXJlbnQgY29tcG9uZW50Iik7CmEuYj10aGlzO0suaS5yYS5jYWxsKGEsdGhpcyk7TGEodGhpcy5jLGIsMCxhKTtpZihhLm0mJnRoaXMubSYmYS5iPT10aGlzKWM9dGhpcy5qYSgpLGI9Yy5jaGlsZE5vZGVzW2JdfHxudWxsLGIhPWEuZigpJiZjLmluc2VydEJlZm9yZShhLmYoKSxiKTtlbHNlIGlmKGMpe3RoaXMuYXx8dGhpcy5pYSgpO2M9TCh0aGlzLGIrMSk7Yj10aGlzLmphKCk7Yz1jP2MuYTpudWxsO2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTthLmF8fGEuaWEoKTtiP2IuaW5zZXJ0QmVmb3JlKGEuYSxjfHxudWxsKTphLmouYS5ib2R5LmFwcGVuZENoaWxkKGEuYSk7YS5iJiYhYS5iLm18fGEuRCgpfWVsc2UgdGhpcy5tJiYhYS5tJiZhLmEmJmEuYS5wYXJlbnROb2RlJiYxPT1hLmEucGFyZW50Tm9kZS5ub2RlVHlwZSYmYS5EKCl9O2guamE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hfTsKdmFyIFNjPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEucWEpe3ZhciBiPWEubT9hLmE6YS5qLmEuYm9keTthOnt2YXIgYz1xYihiKTtpZihjLmRlZmF1bHRWaWV3JiZjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihjPWMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpKSl7Yz1jLmRpcmVjdGlvbnx8Yy5nZXRQcm9wZXJ0eVZhbHVlKCJkaXJlY3Rpb24iKXx8IiI7YnJlYWsgYX1jPSIifWEucWE9InJ0bCI9PShjfHwoYi5jdXJyZW50U3R5bGU/Yi5jdXJyZW50U3R5bGUuZGlyZWN0aW9uOm51bGwpfHxiLnN0eWxlJiZiLnN0eWxlLmRpcmVjdGlvbil9cmV0dXJuIGEucWF9LFJjPWZ1bmN0aW9uKGEpe3JldHVybiBhLmM/YS5jLmxlbmd0aDowfSxMPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuYz9hLmNbYl18fG51bGw6bnVsbH0sUWM9ZnVuY3Rpb24oYSxiLGMpe2EuYyYmcihhLmMsYixjKX0sVGM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jJiZiP0RhKGEuYyxiKTotMX07dmFyIFZjPWZ1bmN0aW9uKGEsYil7aWYoIWEpdGhyb3cgRXJyb3IoIkludmFsaWQgY2xhc3MgbmFtZSAiK2EpO2lmKCFpYShiKSl0aHJvdyBFcnJvcigiSW52YWxpZCBkZWNvcmF0b3IgZnVuY3Rpb24gIitiKTtVY1thXT1ifSxXYz17fSxVYz17fTt2YXIgWGM9ZnVuY3Rpb24oYSl7dGhpcy5oPWF9O2RhKFhjKTt2YXIgWWM9ZnVuY3Rpb24oYSxiKXthJiYoYS50YWJJbmRleD1iPzA6LTEpfSwkYz1mdW5jdGlvbihhLGIsYyl7Yy5pZCYmTWMoYixjLmlkKTt2YXIgZD1hLmIoKSxlPSExLGY9RChjKTtmJiZyKGYsZnVuY3Rpb24oZyl7Zz09ZD9lPSEwOmcmJnRoaXMuZyhiLGcsZCl9LGEpO2V8fEViKGMsZCk7WmMoYixjKTtyZXR1cm4gY307WGMucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiLGMpe2I9PWMrIi1kaXNhYmxlZCI/YS5aKCExKTpiPT1jKyItaG9yaXpvbnRhbCI/YWQoYSwiaG9yaXpvbnRhbCIpOmI9PWMrIi12ZXJ0aWNhbCImJmFkKGEsInZlcnRpY2FsIil9Owp2YXIgWmM9ZnVuY3Rpb24oYSxiKXtpZihiKWZvcih2YXIgYz1iLmZpcnN0Q2hpbGQsZDtjJiZjLnBhcmVudE5vZGU9PWI7KXtkPWMubmV4dFNpYmxpbmc7aWYoMT09Yy5ub2RlVHlwZSl7YTp7dmFyIGU9YztxKGUpO2U9RChlKTtmb3IodmFyIGY9MCxnPWUubGVuZ3RoO2Y8ZztmKyspe3ZhciBrPWVbZl07aWYoaz1rIGluIFVjP1VjW2tdKCk6bnVsbCl7ZT1rO2JyZWFrIGF9fWU9bnVsbH1lJiYoZS5hPWMsYS5pc0VuYWJsZWQoKXx8ZS5aKCExKSxhLnNhKGUpLFBjKGUsYykpfWVsc2UgYy5ub2RlVmFsdWUmJiIiIT1NYShjLm5vZGVWYWx1ZSl8fGIucmVtb3ZlQ2hpbGQoYyk7Yz1kfX0sYmQ9ZnVuY3Rpb24oYSxiKXtiPWIuZigpO3EoYiwiVGhlIGNvbnRhaW5lciBET00gZWxlbWVudCBjYW5ub3QgYmUgbnVsbC4iKTtIYyhiLHgpO3YmJihiLmhpZGVGb2N1cz0hMCk7KGE9YS5oKSYmdmIoYixhKX07WGMucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKWGMucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5iKCksYz1bYiwiaG9yaXpvbnRhbCI9PWEuSD9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgTT1mdW5jdGlvbigpe30sY2Q7ZGEoTSk7dmFyIGRkPXtidXR0b246InByZXNzZWQiLGNoZWNrYm94OiJjaGVja2VkIixtZW51aXRlbToic2VsZWN0ZWQiLG1lbnVpdGVtY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtcmFkaW86ImNoZWNrZWQiLHJhZGlvOiJjaGVja2VkIix0YWI6InNlbGVjdGVkIix0cmVlaXRlbToic2VsZWN0ZWQifTtNLnByb3RvdHlwZS5oPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLmouYigiRElWIixlZCh0aGlzLGEpLmpvaW4oIiAiKSxhLmJhKX07dmFyIGdkPWZ1bmN0aW9uKGEsYixjKXtpZihhPWEuZj9hLmYoKTphKXt2YXIgZD1bYl07diYmIUEoIjciKSYmKGQ9ZmQoRChhKSxiKSxkLnB1c2goYikpOyhjP0ZiOkhiKShhLGQpfX07Ck0ucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiKXtiLmlkJiZNYyhhLGIuaWQpO2ImJmIuZmlyc3RDaGlsZD9oZChhLGIuZmlyc3RDaGlsZC5uZXh0U2libGluZz9KYShiLmNoaWxkTm9kZXMpOmIuZmlyc3RDaGlsZCk6YS5iYT1udWxsO3ZhciBjPTAsZD10aGlzLmEoKSxlPXRoaXMuYSgpLGY9ITEsZz0hMSxrPSExLHA9SmEoRChiKSk7cihwLGZ1bmN0aW9uKEIpe2Z8fEIhPWQ/Z3x8QiE9ZT9jfD1pZCh0aGlzLEIpOmc9ITA6KGY9ITAsZT09ZCYmKGc9ITApKTsxPT1pZCh0aGlzLEIpJiYoQWEoYiksc2IoYikmJnRiKGIpJiZyYihiLCExKSl9LHRoaXMpO2Eubz1jO2Z8fChwLnB1c2goZCksZT09ZCYmKGc9ITApKTtnfHxwLnB1c2goZSk7KGE9YS53YSkmJnAucHVzaC5hcHBseShwLGEpO2lmKHYmJiFBKCI3Iikpe3ZhciB3PWZkKHApOzA8dy5sZW5ndGgmJihwLnB1c2guYXBwbHkocCx3KSxrPSEwKX1mJiZnJiYhYSYmIWt8fENiKGIscC5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIGpkPWZ1bmN0aW9uKGEsYil7aWYoYT1hLmgoKSl7cShiLCJUaGUgZWxlbWVudCBwYXNzZWQgYXMgYSBmaXJzdCBwYXJhbWV0ZXIgY2Fubm90IGJlIG51bGwuIik7dmFyIGM9Yi5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDthIT1jJiZ2YihiLGEpfX0sa2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYztpZihhLnYmMzImJihjPWEuZigpKSl7aWYoIWImJmEubyYzMil7dHJ5e2MuYmx1cigpfWNhdGNoKGQpe31hLm8mMzImJmEuRmEobnVsbCl9KHNiKGMpJiZ0YihjKSkhPWImJnJiKGMsYil9fSxsZD1mdW5jdGlvbihhLGIsYyl7Y2R8fChjZD17MToiZGlzYWJsZWQiLDg6InNlbGVjdGVkIiwxNjoiY2hlY2tlZCIsNjQ6ImV4cGFuZGVkIn0pO3EoYSwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO2I9Y2RbYl07dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDtkJiYoZD1kZFtkXXx8YixiPSJjaGVja2VkIj09Ynx8InNlbGVjdGVkIj09CmI/ZDpiKTtiJiZ4YihhLGIsYyl9O00ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250cm9sIn07CnZhciBlZD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuYSgpLGQ9W2NdLGU9YS5hKCk7ZSE9YyYmZC5wdXNoKGUpO2M9Yi5vO2ZvcihlPVtdO2M7KXt2YXIgZj1jJi1jO2UucHVzaChtZChhLGYpKTtjJj1+Zn1kLnB1c2guYXBwbHkoZCxlKTsoYT1iLndhKSYmZC5wdXNoLmFwcGx5KGQsYSk7diYmIUEoIjciKSYmZC5wdXNoLmFwcGx5KGQsZmQoZCkpO3JldHVybiBkfSxmZD1mdW5jdGlvbihhLGIpe3ZhciBjPVtdO2ImJihhPUlhKGEsW2JdKSk7cihbXSxmdW5jdGlvbihkKXshRmEoZCxsYShHYSxhKSl8fGImJiFHYShkLGIpfHxjLnB1c2goZC5qb2luKCJfIikpfSk7cmV0dXJuIGN9LG1kPWZ1bmN0aW9uKGEsYil7YS5ifHxuZChhKTtyZXR1cm4gYS5iW2JdfSxpZD1mdW5jdGlvbihhLGIpe2Euanx8KGEuYnx8bmQoYSksYS5qPXNhKGEuYikpO2E9cGFyc2VJbnQoYS5qW2JdLDEwKTtyZXR1cm4gaXNOYU4oYSk/MDphfSxuZD1mdW5jdGlvbihhKXt2YXIgYj1hLmEoKSxjPSF0KGIucmVwbGFjZSgvXHhhMHxccy9nLAoiICIpLCIgIik7cShjLCJDb250cm9sUmVuZGVyZXIgaGFzIGFuIGludmFsaWQgY3NzIGNsYXNzOiAnIitiKyInIik7YS5iPXsxOmIrIi1kaXNhYmxlZCIsMjpiKyItaG92ZXIiLDQ6YisiLWFjdGl2ZSIsODpiKyItc2VsZWN0ZWQiLDE2OmIrIi1jaGVja2VkIiwzMjpiKyItZm9jdXNlZCIsNjQ6YisiLW9wZW4ifX07dmFyIE49ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO2lmKCFiKXtiPXRoaXMuY29uc3RydWN0b3I7Zm9yKHZhciBkO2I7KXtkPWJbamFdfHwoYltqYV09KytrYSk7aWYoZD1XY1tkXSlicmVhaztiPWIuaT9iLmkuY29uc3RydWN0b3I6bnVsbH1iPWQ/aWEoZC5SKT9kLlIoKTpuZXcgZDpudWxsfXRoaXMuQj1iO3RoaXMuYmE9dm9pZCAwIT09YT9hOm51bGx9O24oTixLKTtoPU4ucHJvdG90eXBlO2guYmE9bnVsbDtoLm89MDtoLnY9Mzk7aC5LPTA7aC5JYT0hMDtoLndhPW51bGw7aC55YT0hMDtoLmlhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CLmModGhpcyk7dGhpcy5hPWE7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmeGIoYSwiaGlkZGVuIiwhMCkpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hPXRoaXMuQi5nKHRoaXMsYSk7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5JYT0ibm9uZSIhPWEuc3R5bGUuZGlzcGxheX07CmguRD1mdW5jdGlvbigpe04uaS5ELmNhbGwodGhpcyk7dmFyIGE9TmModGhpcyk7cSh0aGlzKTtxKGEpO3RoaXMuaXNWaXNpYmxlKCl8fHhiKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fGxkKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy52JjgmJmxkKGEsOCwhISh0aGlzLm8mOCkpO3RoaXMudiYxNiYmbGQoYSwxNiwhISh0aGlzLm8mMTYpKTt0aGlzLnYmNjQmJmxkKGEsNjQsISEodGhpcy5vJjY0KSk7YT10aGlzLkI7U2ModGhpcykmJmdkKHRoaXMuZigpLGEuYSgpKyItcnRsIiwhMCk7dGhpcy5pc0VuYWJsZWQoKSYma2QodGhpcyx0aGlzLmlzVmlzaWJsZSgpKTtpZih0aGlzLnYmLTImJih0aGlzLnlhJiZvZCh0aGlzLCEwKSx0aGlzLnYmMzImJihhPXRoaXMuZigpKSkpe3ZhciBiPXRoaXMuV3x8KHRoaXMuVz1uZXcgSik7emMoYixhKTtIKEgoSChPYyh0aGlzKSxiLCJrZXkiLHRoaXMuZmEpLGEsImZvY3VzIix0aGlzLk5hKSxhLCJibHVyIiwKdGhpcy5GYSl9fTt2YXIgb2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYz1PYyhhKSxkPWEuZigpO2I/KEgoSChIKEgoYyxkLEYuTCxhLmthKSxkLFtGLk0sRi5hYV0sYS5sYSksZCwibW91c2VvdmVyIixhLkFhKSxkLCJtb3VzZW91dCIsYS56YSksYS5lYSE9Y2EmJkgoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fEgoYyxkLCJkYmxjbGljayIsYS5KYSksYS5nYXx8KGEuZ2E9bmV3IHBkKGEpLHpiKGEsbGEoQWIsYS5nYSkpKSkpOihxYyhxYyhxYyhxYyhjLGQsRi5MLGEua2EpLGQsW0YuTSxGLmFhXSxhLmxhKSxkLCJtb3VzZW92ZXIiLGEuQWEpLGQsIm1vdXNlb3V0IixhLnphKSxhLmVhIT1jYSYmcWMoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fHFjKGMsZCwiZGJsY2xpY2siLGEuSmEpLEFiKGEuZ2EpLGEuZ2E9bnVsbCkpfTsKTi5wcm90b3R5cGUuUD1mdW5jdGlvbigpe04uaS5QLmNhbGwodGhpcyk7dGhpcy5XJiZGYyh0aGlzLlcpO3RoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJmtkKHRoaXMsITEpfTtOLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7Ti5pLnUuY2FsbCh0aGlzKTt0aGlzLlcmJih0aGlzLlcuTigpLGRlbGV0ZSB0aGlzLlcpO2RlbGV0ZSB0aGlzLkI7dGhpcy5nYT10aGlzLndhPXRoaXMuYmE9bnVsbH07dmFyIGhkPWZ1bmN0aW9uKGEsYil7YS5iYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm8mMSl9OwpOLnByb3RvdHlwZS5aPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYjtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0VuYWJsZWQmJiFiLmlzRW5hYmxlZCgpfHwhTyh0aGlzLDEsIWEpfHwoYXx8KHFkKHRoaXMsITEpLFAodGhpcywhMSkpLHRoaXMuaXNWaXNpYmxlKCkmJmtkKHRoaXMsYSksUSh0aGlzLDEsIWEsITApKX07CnZhciBQPWZ1bmN0aW9uKGEsYil7TyhhLDIsYikmJlEoYSwyLGIpfSxxZD1mdW5jdGlvbihhLGIpe08oYSw0LGIpJiZRKGEsNCxiKX0scmQ9ZnVuY3Rpb24oYSxiKXtPKGEsOCxiKSYmUShhLDgsYil9LHNkPWZ1bmN0aW9uKGEsYil7TyhhLDY0LGIpJiZRKGEsNjQsYil9LFE9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIWQmJjE9PWIpYS5aKCFjKTtlbHNlIGlmKGEudiZiJiZjIT0hIShhLm8mYikpe3ZhciBlPWEuQjtpZihkPWEuZigpKShlPW1kKGUsYikpJiZnZChhLGUsYyksbGQoZCxiLGMpO2Eubz1jP2Eub3xiOmEubyZ+Yn19LHRkPWZ1bmN0aW9uKGEsYixjKXtpZihhLm0mJmEubyZiJiYhYyl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTshYyYmYS5vJmImJlEoYSxiLCExKTthLnY9Yz9hLnZ8YjphLnYmfmJ9LFI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hISgyNTUmYikmJiEhKGEudiZiKX0sTz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuISEoYS52JmIpJiYhIShhLm8mCmIpIT1jJiYoIShhLksmYil8fHVjKGEsS2MoYixjKSkpJiYhYS5VfTtoPU4ucHJvdG90eXBlO2guQWE9ZnVuY3Rpb24oYSl7KCFhLnJlbGF0ZWRUYXJnZXR8fCFwYih0aGlzLmYoKSxhLnJlbGF0ZWRUYXJnZXQpKSYmdWModGhpcywiZW50ZXIiKSYmdGhpcy5pc0VuYWJsZWQoKSYmUih0aGlzLDIpJiZQKHRoaXMsITApfTtoLnphPWZ1bmN0aW9uKGEpe2EucmVsYXRlZFRhcmdldCYmcGIodGhpcy5mKCksYS5yZWxhdGVkVGFyZ2V0KXx8IXVjKHRoaXMsImxlYXZlIil8fChSKHRoaXMsNCkmJnFkKHRoaXMsITEpLFIodGhpcywyKSYmUCh0aGlzLCExKSl9O2guZWE9Y2E7Cmgua2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSxPYihhKSYmISh5JiZ6JiZhLmN0cmxLZXkpKSl7Uih0aGlzLDQpJiZxZCh0aGlzLCEwKTt2YXIgYjtpZihiPXRoaXMuQil7dmFyIGM7Yj10aGlzLnYmMzImJihjPXRoaXMuZigpKT9zYihjKSYmdGIoYyk6ITF9YiYmdGhpcy5mKCkuZm9jdXMoKX0hT2IoYSl8fHkmJnomJmEuY3RybEtleXx8YS5nKCl9O2gubGE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSx0aGlzLm8mNCYmdWQodGhpcyxhKSYmUih0aGlzLDQpJiZxZCh0aGlzLCExKSl9O2guSmE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmdWQodGhpcyxhKX07CnZhciB1ZD1mdW5jdGlvbihhLGIpe2lmKFIoYSwxNikpe3ZhciBjPSEoYS5vJjE2KTtPKGEsMTYsYykmJlEoYSwxNixjKX1SKGEsOCkmJnJkKGEsITApO1IoYSw2NCkmJnNkKGEsIShhLm8mNjQpKTtjPW5ldyBFKCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuQT1iLkEpO3JldHVybiB1YyhhLGMpfTtOLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe1IodGhpcywzMikmJk8odGhpcywzMiwhMCkmJlEodGhpcywzMiwhMCl9O04ucHJvdG90eXBlLkZhPWZ1bmN0aW9uKCl7Uih0aGlzLDQpJiZxZCh0aGlzLCExKTtSKHRoaXMsMzIpJiZPKHRoaXMsMzIsITEpJiZRKHRoaXMsMzIsITEpfTsKTi5wcm90b3R5cGUuZmE9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJjEzPT1hLmMmJnVkKHRoaXMsYSk/KGEuZygpLGEuaigpLCEwKTohMX07aWYoIWlhKE4pKXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBjbGFzcyAiK04pO2lmKCFpYShNKSl0aHJvdyBFcnJvcigiSW52YWxpZCByZW5kZXJlciBjbGFzcyAiK00pO3ZhciB2ZD1OW2phXXx8KE5bamFdPSsra2EpO1djW3ZkXT1NO1ZjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIHBkPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9ITE7dGhpcy5jPW5ldyBvYyh0aGlzKTt6Yih0aGlzLGxhKEFiLHRoaXMuYykpO2E9TmModGhpcy5iKTtIKEgoSCh0aGlzLmMsYSxGLkwsdGhpcy5oKSxhLEYuTSx0aGlzLmopLGEsImNsaWNrIix0aGlzLmcpfTtuKHBkLEMpO3ZhciB3ZD0hdnx8OTw9TnVtYmVyKGliKTsKcGQucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXt0aGlzLmE9ITF9O3BkLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7dGhpcy5hPSEwfTt2YXIgeGQ9ZnVuY3Rpb24oYSxiKXtpZighd2QpcmV0dXJuIGEuYnV0dG9uPTAsYS50eXBlPWIsYTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudHMiKTtjLmluaXRNb3VzZUV2ZW50KGIsYS5idWJibGVzLGEuY2FuY2VsYWJsZSxhLnZpZXd8fG51bGwsYS5kZXRhaWwsYS5zY3JlZW5YLGEuc2NyZWVuWSxhLmNsaWVudFgsYS5jbGllbnRZLGEuY3RybEtleSxhLmFsdEtleSxhLnNoaWZ0S2V5LGEubWV0YUtleSwwLGEucmVsYXRlZFRhcmdldHx8bnVsbCk7cmV0dXJuIGN9OwpwZC5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXtpZih0aGlzLmEpdGhpcy5hPSExO2Vsc2V7dmFyIGI9YS5iLGM9Yi5idXR0b24sZD1iLnR5cGUsZT14ZChiLCJtb3VzZWRvd24iKTt0aGlzLmIua2EobmV3IEcoZSxhLmEpKTtlPXhkKGIsIm1vdXNldXAiKTt0aGlzLmIubGEobmV3IEcoZSxhLmEpKTt3ZHx8KGIuYnV0dG9uPWMsYi50eXBlPWQpfX07cGQucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt0aGlzLmI9bnVsbDtwZC5pLnUuY2FsbCh0aGlzKX07dmFyIFM9ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO3RoaXMuZGE9Ynx8WGMuUigpO3RoaXMuSD1hfHwidmVydGljYWwifTtuKFMsSyk7aD1TLnByb3RvdHlwZTtoLkRhPW51bGw7aC5jYT1udWxsO2guZGE9bnVsbDtoLkg9bnVsbDtoLlQ9ITA7aC5PPSEwO2gubD0tMTtoLnM9bnVsbDtoLlY9ITE7aC5JPW51bGw7dmFyIHlkPWZ1bmN0aW9uKGEpe3JldHVybiBhLkRhfHxhLmYoKX07aD1TLnByb3RvdHlwZTtoLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPXRoaXMuai5iKCJESVYiLHRoaXMuZGEuYyh0aGlzKS5qb2luKCIgIikpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKGEpe3JldHVybiJESVYiPT1hLnRhZ05hbWV9O2gudmE9ZnVuY3Rpb24oYSl7dGhpcy5hPSRjKHRoaXMuZGEsdGhpcyxhKTsibm9uZSI9PWEuc3R5bGUuZGlzcGxheSYmKHRoaXMuVD0hMSl9OwpoLkQ9ZnVuY3Rpb24oKXtTLmkuRC5jYWxsKHRoaXMpO1FjKHRoaXMsZnVuY3Rpb24oYil7Yi5tJiZ6ZCh0aGlzLGIpfSx0aGlzKTt2YXIgYT10aGlzLmYoKTtiZCh0aGlzLmRhLHRoaXMpO0FkKHRoaXMsdGhpcy5UKTtIKEgoSChIKEgoSChIKEgoT2ModGhpcyksdGhpcywiZW50ZXIiLHRoaXMuV2EpLHRoaXMsImhpZ2hsaWdodCIsdGhpcy5YYSksdGhpcywidW5oaWdobGlnaHQiLHRoaXMuY2IpLHRoaXMsIm9wZW4iLHRoaXMuWWEpLHRoaXMsImNsb3NlIix0aGlzLlVhKSxhLEYuTCx0aGlzLlNhKSxxYihhKSxbRi5NLEYuYWFdLHRoaXMuVmEpLGEsW0YuTCxGLk0sRi5hYSwibW91c2VvdmVyIiwibW91c2VvdXQiLCJjb250ZXh0bWVudSJdLHRoaXMuVGEpO0JkKHRoaXMpfTt2YXIgQmQ9ZnVuY3Rpb24oYSl7dmFyIGI9T2MoYSksYz15ZChhKTtIKEgoSChiLGMsImZvY3VzIixhLkhhKSxjLCJibHVyIixhLlFhKSxhLmNhfHwoYS5jYT1uZXcgSih5ZChhKSkpLCJrZXkiLGEuUmEpfTtoPVMucHJvdG90eXBlOwpoLlA9ZnVuY3Rpb24oKXtDZCh0aGlzLC0xKTt0aGlzLnMmJnNkKHRoaXMucywhMSk7dGhpcy5WPSExO1MuaS5QLmNhbGwodGhpcyl9O2gudT1mdW5jdGlvbigpe1MuaS51LmNhbGwodGhpcyk7dGhpcy5jYSYmKHRoaXMuY2EuTigpLHRoaXMuY2E9bnVsbCk7dGhpcy5kYT10aGlzLnM9dGhpcy5JPXRoaXMuRGE9bnVsbH07aC5XYT1mdW5jdGlvbigpe3JldHVybiEwfTsKaC5YYT1mdW5jdGlvbihhKXt2YXIgYj1UYyh0aGlzLGEudGFyZ2V0KTtpZigtMTxiJiZiIT10aGlzLmwpe3ZhciBjPUwodGhpcyx0aGlzLmwpO2MmJlAoYywhMSk7dGhpcy5sPWI7Yz1MKHRoaXMsdGhpcy5sKTt0aGlzLlYmJnFkKGMsITApO3RoaXMucyYmYyE9dGhpcy5zJiYoYy52JjY0P3NkKGMsITApOnNkKHRoaXMucywhMSkpfWI9dGhpcy5mKCk7cShiLCJUaGUgRE9NIGVsZW1lbnQgZm9yIHRoZSBjb250YWluZXIgY2Fubm90IGJlIG51bGwuIik7bnVsbCE9YS50YXJnZXQuZigpJiZ4YihiLCJhY3RpdmVkZXNjZW5kYW50IixhLnRhcmdldC5mKCkuaWQpfTtoLmNiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT1MKHRoaXMsdGhpcy5sKSYmKHRoaXMubD0tMSk7YT10aGlzLmYoKTtxKGEsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnJlbW92ZUF0dHJpYnV0ZSh3YigiYWN0aXZlZGVzY2VuZGFudCIpKX07CmguWWE9ZnVuY3Rpb24oYSl7KGE9YS50YXJnZXQpJiZhIT10aGlzLnMmJmEuYj09dGhpcyYmKHRoaXMucyYmc2QodGhpcy5zLCExKSx0aGlzLnM9YSl9O2guVWE9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMucyYmKHRoaXMucz1udWxsKTt2YXIgYj10aGlzLmYoKSxjPWEudGFyZ2V0LmYoKTtiJiZhLnRhcmdldC5vJjImJmMmJihhPSIiLGMmJihhPWMuaWQscShhLCJUaGUgYWN0aXZlIGVsZW1lbnQgc2hvdWxkIGhhdmUgYW4gaWQuIikpLHhiKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEpKX07aC5TYT1mdW5jdGlvbihhKXt0aGlzLk8mJih0aGlzLlY9ITApO3ZhciBiPXlkKHRoaXMpO2ImJnNiKGIpJiZ0YihiKT9iLmZvY3VzKCk6YS5nKCl9O2guVmE9ZnVuY3Rpb24oKXt0aGlzLlY9ITF9OwpoLlRhPWZ1bmN0aW9uKGEpe2E6e3ZhciBiPWEudGFyZ2V0O2lmKHRoaXMuSSlmb3IodmFyIGM9dGhpcy5mKCk7YiYmYiE9PWM7KXt2YXIgZD1iLmlkO2lmKGQgaW4gdGhpcy5JKXtiPXRoaXMuSVtkXTticmVhayBhfWI9Yi5wYXJlbnROb2RlfWI9bnVsbH1pZihiKXN3aXRjaChhLnR5cGUpe2Nhc2UgRi5MOmIua2EoYSk7YnJlYWs7Y2FzZSBGLk06Y2FzZSBGLmFhOmIubGEoYSk7YnJlYWs7Y2FzZSAibW91c2VvdmVyIjpiLkFhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3V0IjpiLnphKGEpO2JyZWFrO2Nhc2UgImNvbnRleHRtZW51IjpiLmVhKGEpfX07aC5IYT1mdW5jdGlvbigpe307aC5RYT1mdW5jdGlvbigpe0NkKHRoaXMsLTEpO3RoaXMuVj0hMTt0aGlzLnMmJnNkKHRoaXMucywhMSl9OwpoLlJhPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmlzRW5hYmxlZCgpJiZ0aGlzLmlzVmlzaWJsZSgpJiYoMCE9UmModGhpcyl8fHRoaXMuRGEpJiZEZCh0aGlzLGEpPyhhLmcoKSxhLmooKSwhMCk6ITF9Owp2YXIgRGQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1MKGEsYS5sKTtpZihjJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5mYSYmYy5mYShiKXx8YS5zJiZhLnMhPWMmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLnMuZmEmJmEucy5mYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuYyl7Y2FzZSAyNzp5ZChhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpFZChhKTticmVhaztjYXNlIDM1OkZkKGEpO2JyZWFrO2Nhc2UgMzg6aWYoInZlcnRpY2FsIj09YS5IKUdkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9IZChhKTpHZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoInZlcnRpY2FsIj09YS5IKUhkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9HZChhKTpIZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSx6ZD1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZigpO2M9Yy5pZHx8KGMuaWQ9TGMoYikpO2EuSXx8KGEuST17fSk7YS5JW2NdPWJ9O1MucHJvdG90eXBlLnNhPWZ1bmN0aW9uKGEsYil7Q2EoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtTLmkuc2EuY2FsbCh0aGlzLGEsYil9O1MucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEsYixjKXtDYShhLE4pO2EuS3w9MjthLkt8PTY0O3RkKGEsMzIsITEpO2EubSYmMCE9YS55YSYmb2QoYSwhMSk7YS55YT0hMTt2YXIgZD1hLmI9PXRoaXM/VGModGhpcyxhKTotMTtTLmkudGEuY2FsbCh0aGlzLGEsYixjKTthLm0mJnRoaXMubSYmemQodGhpcyxhKTthPWQ7LTE9PWEmJihhPVJjKHRoaXMpKTthPT10aGlzLmw/dGhpcy5sPU1hdGgubWluKFJjKHRoaXMpLTEsYik6YT50aGlzLmwmJmI8PXRoaXMubD90aGlzLmwrKzphPHRoaXMubCYmYj50aGlzLmwmJnRoaXMubC0tfTsKdmFyIGFkPWZ1bmN0aW9uKGEsYil7aWYoYS5mKCkpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5IPWJ9O1MucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O3ZhciBBZD1mdW5jdGlvbihhLGIpe2EuVD1iO3ZhciBjPWEuZigpO2MmJihjLnN0eWxlLmRpc3BsYXk9Yj8iIjoibm9uZSIsWWMoeWQoYSksYS5PJiZhLlQpKX07Uy5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT307Uy5wcm90b3R5cGUuWj1mdW5jdGlvbihhKXt0aGlzLk8hPWEmJnVjKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5PPSEwLFFjKHRoaXMsZnVuY3Rpb24oYil7Yi5MYT9kZWxldGUgYi5MYTpiLlooITApfSkpOihRYyh0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5aKCExKTpiLkxhPSEwfSksdGhpcy5WPXRoaXMuTz0hMSksWWMoeWQodGhpcyksYSYmdGhpcy5UKSl9Owp2YXIgQ2Q9ZnVuY3Rpb24oYSxiKXsoYj1MKGEsYikpP1AoYiwhMCk6LTE8YS5sJiZQKEwoYSxhLmwpLCExKX0sRWQ9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LFJjKGEpLTEpfSxGZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiAwPmI/Yy0xOmJ9LDApfSxIZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7cmV0dXJuKGIrMSklY30sYS5sKX0sR2Q9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe2ItLTtyZXR1cm4gMD5iP2MtMTpifSxhLmwpfSxJZD1mdW5jdGlvbihhLGIsYyl7Yz0wPmM/VGMoYSxhLnMpOmM7dmFyIGQ9UmMoYSk7Yz1iLmNhbGwoYSxjLGQpO2Zvcih2YXIgZT0wO2U8PWQ7KXt2YXIgZj1MKGEsYyksZztpZihnPWYpZz1mLmlzVmlzaWJsZSgpJiZmLmlzRW5hYmxlZCgpJiYhIShmLnYmMik7aWYoZyl7YS5FYShjKTticmVha31lKys7Yz1iLmNhbGwoYSxjLGQpfX07ClMucHJvdG90eXBlLkVhPWZ1bmN0aW9uKGEpe0NkKHRoaXMsYSl9O3ZhciBUPWZ1bmN0aW9uKCl7fTtuKFQsTSk7ZGEoVCk7VC5wcm90b3R5cGUuYT1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYiJ9O1QucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXtyZXR1cm4idGFiIn07VC5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYj1ULmkuYy5jYWxsKHRoaXMsYSk7KGE9YS5QYSkmJmImJihiLnRpdGxlPWF8fCIiKTtyZXR1cm4gYn07VC5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIpe2I9VC5pLmcuY2FsbCh0aGlzLGEsYik7dmFyIGM9Yi50aXRsZXx8IiI7YyYmKGEuUGE9Yyk7YS5vJjgmJihjPWEuYikmJmlhKGMuRykmJihRKGEsOCwhMSksYy5HKGEpKTtyZXR1cm4gYn07dmFyIEpkPWZ1bmN0aW9uKGEsYixjKXtOLmNhbGwodGhpcyxhLGJ8fFQuUigpLGMpO3RkKHRoaXMsOCwhMCk7dGhpcy5LfD05fTtuKEpkLE4pO1ZjKCJnb29nLXRhYiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEpkKG51bGwpfSk7dmFyIFU9ZnVuY3Rpb24oKXt0aGlzLmg9InRhYmxpc3QifTtuKFUsWGMpO2RhKFUpO1UucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWItYmFyIn07VS5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIsYyl7dGhpcy5qfHwodGhpcy5hfHxLZCh0aGlzKSx0aGlzLmo9c2EodGhpcy5hKSk7dmFyIGQ9dGhpcy5qW2JdO2Q/KGFkKGEsTGQoZCkpLGEuQj1kKTpVLmkuZy5jYWxsKHRoaXMsYSxiLGMpfTtVLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPVUuaS5jLmNhbGwodGhpcyxhKTt0aGlzLmF8fEtkKHRoaXMpO2IucHVzaCh0aGlzLmFbYS5CXSk7cmV0dXJuIGJ9O3ZhciBLZD1mdW5jdGlvbihhKXt2YXIgYj1hLmIoKTthLmE9e3RvcDpiKyItdG9wIixib3R0b206YisiLWJvdHRvbSIsc3RhcnQ6YisiLXN0YXJ0IixlbmQ6YisiLWVuZCJ9fTt2YXIgVj1mdW5jdGlvbihhLGIsYyl7YT1hfHwidG9wIjthZCh0aGlzLExkKGEpKTt0aGlzLkI9YTtTLmNhbGwodGhpcyx0aGlzLkgsYnx8VS5SKCksYyk7TWQodGhpcyl9O24oVixTKTtoPVYucHJvdG90eXBlO2guQz1udWxsO2guRD1mdW5jdGlvbigpe1YuaS5ELmNhbGwodGhpcyk7TWQodGhpcyl9O2gudT1mdW5jdGlvbigpe1YuaS51LmNhbGwodGhpcyk7dGhpcy5DPW51bGx9O2guRWE9ZnVuY3Rpb24oYSl7Vi5pLkVhLmNhbGwodGhpcyxhKTt0aGlzLkcoTCh0aGlzLGEpKX07aC5HPWZ1bmN0aW9uKGEpe2E/cmQoYSwhMCk6dGhpcy5DJiZyZCh0aGlzLkMsITEpfTsKdmFyIE5kPWZ1bmN0aW9uKGEsYil7aWYoYiYmYj09YS5DKXtmb3IodmFyIGM9VGMoYSxiKSxkPWMtMTtiPUwoYSxkKTtkLS0pe3ZhciBlPWI7aWYoZS5pc1Zpc2libGUoKSYmZS5pc0VuYWJsZWQoKSl7YS5HKGIpO3JldHVybn19Zm9yKGMrPTE7Yj1MKGEsYyk7YysrKWlmKGQ9YixkLmlzVmlzaWJsZSgpJiZkLmlzRW5hYmxlZCgpKXthLkcoYik7cmV0dXJufWEuRyhudWxsKX19O2g9Vi5wcm90b3R5cGU7aC5hYj1mdW5jdGlvbihhKXt0aGlzLkMmJnRoaXMuQyE9YS50YXJnZXQmJnJkKHRoaXMuQywhMSk7dGhpcy5DPWEudGFyZ2V0fTtoLmJiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT10aGlzLkMmJih0aGlzLkM9bnVsbCl9O2guWmE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guJGE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guSGE9ZnVuY3Rpb24oKXtMKHRoaXMsdGhpcy5sKXx8Q2QodGhpcyxUYyh0aGlzLHRoaXMuQ3x8TCh0aGlzLDApKSl9Owp2YXIgTWQ9ZnVuY3Rpb24oYSl7SChIKEgoSChPYyhhKSxhLCJzZWxlY3QiLGEuYWIpLGEsInVuc2VsZWN0IixhLmJiKSxhLCJkaXNhYmxlIixhLlphKSxhLCJoaWRlIixhLiRhKX0sTGQ9ZnVuY3Rpb24oYSl7cmV0dXJuInN0YXJ0Ij09YXx8ImVuZCI9PWE/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O1ZjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBWfSk7ZnVuY3Rpb24gT2QoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIFBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgZz1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIrZyk7Zm9yKHZhciBrPVtdLHA9YmEoYyksdz1wLm5leHQoKTshdy5kb25lO3c9cC5uZXh0KCkpe3c9dy52YWx1ZTt2YXIgQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKQi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO0IudGV4dENvbnRlbnQ9dztmLmFwcGVuZENoaWxkKEIpO2sucHVzaChCKX0iYm90dG9tIiE9ZyYmZS5hcHBlbmRDaGlsZChmKTtwPW51bGw7aWYoInRvcCI9PWd8fCJib3R0b20iPT1nKXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTsidG9wIj09ZyYmcCYmZS5hcHBlbmRDaGlsZChwKTtCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0IuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciByYT1bXTtjPWJhKGMpO2Zvcih3PWMubmV4dCgpOyF3LmRvbmU7dz1jLm5leHQoKSl3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHcuaWQ9ZS5pZCsiX2NvbnRlbnRfIityYS5sZW5ndGgsdy5zdHlsZS5kaXNwbGF5PSJub25lIixCLmFwcGVuZENoaWxkKHcpLHJhLnB1c2godyk7ZS5hcHBlbmRDaGlsZChCKTsiYm90dG9tIj09ZyYmKHAmJgplLmFwcGVuZENoaWxkKHApLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBYPW5ldyBWKGcpO1BjKFgsZik7dmFyIFk9LTE7ZGMoWCwic2VsZWN0IixmdW5jdGlvbihaKXtaPWsuaW5kZXhPZihaLnRhcmdldC5mKCkpO1ohPVkmJigwPD1ZJiZZPHJhLmxlbmd0aCYmKHJhW1ldLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFk9LTEpLDA8PVomJlo8cmEubGVuZ3RoJiYoWT1aLHJhW1ldLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksWC5HKEwoWCxZKSkpfSk7WC5HKEwoWCxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFope1guRyhMKFgsWikpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChPZChhKSl9LFFkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sVz1sOwpRZFswXWluIFd8fCJ1bmRlZmluZWQiPT10eXBlb2YgVy5leGVjU2NyaXB0fHxXLmV4ZWNTY3JpcHQoInZhciAiK1FkWzBdKTtmb3IodmFyIFJkO1FkLmxlbmd0aCYmKFJkPVFkLnNoaWZ0KCkpOylRZC5sZW5ndGh8fHZvaWQgMD09PVBkP1dbUmRdJiZXW1JkXSE9PU9iamVjdC5wcm90b3R5cGVbUmRdP1c9V1tSZF06Vz1XW1JkXT17fTpXW1JkXT1QZDt9KS5jYWxsKHRoaXMpOwovLyBjbGFuZy1mb3JtYXQgb24K", + "headers": [ + [ + "content-type", + "application/javascript" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + } + } + }, + "executionInfo": { + "elapsed": 3000, + "status": "ok", + "timestamp": 1600709846602, + "user": { + "displayName": "Evgeny Skvortsov", + "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhiQjODaOVLfYnUuWS9rB3LRntzJDM0hqElzsUkdQ=s64", + "userId": "11510585406840398626" + }, + "user_tz": 420 + }, + "id": "L0Pvfx6gwznJ", + "outputId": "c5081def-6579-49f7-ad25-ecc64429e459" + }, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1bbe5c1e-fc31-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id67\", \"tabNames\": [\"ExampleFunctionOne\", \"ExampleFunctionTwo\", \"Test\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_59cef0b0f0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1bbedf9a-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id67\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_61e0d9e3e6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1bc04dd0-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_8e2db55b9c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_3", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1bc0c0d0-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id67_content_3\");\n", + "//# sourceURL=js_ce1d8ced44" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_3", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1bc11ed6-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1bc0c0d0-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_c9fafae713" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_3", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1bc16f4e-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id67\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_0b07294eaf" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_3", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running ExampleFunctionOne\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"1bc36be6-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1bc04dd0-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_a302771a0b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_3", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1bc56374-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_531c09e75c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_0", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1bc5b0cc-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id67_content_0\");\n", + "//# sourceURL=js_9074dd2459" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_0", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1bc5fb68-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1bc5b0cc-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_b30983ff38" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_0", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1bc671e2-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id67\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_ef6edd0b0c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_0", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_0", + "outputarea_id67", + "outputarea_id68", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_0", + "outputarea_id67", + "outputarea_id68", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_0", + "outputarea_id67", + "outputarea_id68", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1bc8aa02-fc31-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id68\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_2e932a0dba" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_0", + "outputarea_id67", + "outputarea_id68", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1bc90b96-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id68\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_53c0d4ed59" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_0", + "outputarea_id67", + "outputarea_id68", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1bcaa154-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_04b8f392c5" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_0", + "id68_content_0", + "outputarea_id67", + "outputarea_id68", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1bcb0590-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id68_content_0\");\n", + "//# sourceURL=js_ea6acbbf43" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_0", + "id68_content_0", + "outputarea_id67", + "outputarea_id68", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1bcb5fa4-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1bcb0590-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_8855c32327" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_0", + "id68_content_0", + "outputarea_id67", + "outputarea_id68", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1bcbad74-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id68\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_89c75bdff6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_0", + "id68_content_0", + "outputarea_id67", + "outputarea_id68", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mExampleFunctionOne_sql\u001b[0m variable.\n", + "SELECT\n", + " \"a\" AS col0,\n", + " \"b\" AS logica_value;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"1bcce216-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1bcaa154-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_5e06654b7c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_0", + "id68_content_0", + "outputarea_id67", + "outputarea_id68", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1bce56a0-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1bc56374-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_3ed2bd7e65" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_0", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1bd0018a-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_11d1ed417b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_3", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1bd0631e-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id67_content_3\");\n", + "//# sourceURL=js_d4fe5bc253" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_3", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1bd0b558-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1bd0631e-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_7e75b48efb" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_3", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1bd101c0-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id67\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_4049546215" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_3", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1c2dca72-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1bd0018a-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_b2d12602f7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_3", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1c306958-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b0dbbce343" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_0", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1c31142a-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id67_content_0\");\n", + "//# sourceURL=js_2fb5aa5b9a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_0", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1c3184c8-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1c31142a-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_e6a9fe7cb9" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_0", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1c3210fa-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id67\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_8837828c12" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_0", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1c33a58c-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_d2bbee38b8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_0", + "id68_content_1", + "outputarea_id67", + "outputarea_id68", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1c343326-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id68_content_1\");\n", + "//# sourceURL=js_49af2a28b0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_0", + "id68_content_1", + "outputarea_id67", + "outputarea_id68", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1c348100-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1c343326-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_815ff24a56" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_0", + "id68_content_1", + "outputarea_id67", + "outputarea_id68", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1c350986-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id68\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_6ae5e0520e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_0", + "id68_content_1", + "outputarea_id67", + "outputarea_id68", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mExampleFunctionOne\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0logica_value
0ab
\n", + "
" + ], + "text/plain": [ + " col0 logica_value\n", + "0 a b" + ] + }, + "metadata": { + "tags": [ + "id67_content_0", + "id68_content_1", + "outputarea_id67", + "outputarea_id68", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1c37f9de-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1c33a58c-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_eb3cf33b9d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_0", + "id68_content_1", + "outputarea_id67", + "outputarea_id68", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1c398f74-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1c306958-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_e901082345" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_0", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1c3b3a22-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_bde372640f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_3", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1c3bee04-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id67_content_3\");\n", + "//# sourceURL=js_8fac5a017f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_3", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1c3c3468-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1c3bee04-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_9bff733062" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_3", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1c3c7982-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id67\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_37f8e23db8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_3", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running ExampleFunctionTwo\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"1c3dd99e-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1c3b3a22-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_fb5f7039ca" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_3", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1c3f3cbc-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_19ff17e0db" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_1", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1c3f8546-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id67_content_1\");\n", + "//# sourceURL=js_4e0b2721ff" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_1", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1c3fc5b0-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1c3f8546-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_4b838938f4" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_1", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1c40084a-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id67\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_29399feb07" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_1", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_1", + "outputarea_id67", + "outputarea_id69", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_1", + "outputarea_id67", + "outputarea_id69", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_1", + "outputarea_id67", + "outputarea_id69", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1c4180c6-fc31-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id69\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_acb42f9e57" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_1", + "outputarea_id67", + "outputarea_id69", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1c41c75c-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id69\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_97154a88ac" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_1", + "outputarea_id67", + "outputarea_id69", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1c42cad0-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_8039962d59" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_1", + "id69_content_0", + "outputarea_id67", + "outputarea_id69", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1c42fc3a-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id69_content_0\");\n", + "//# sourceURL=js_b6a4dfd2fc" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_1", + "id69_content_0", + "outputarea_id67", + "outputarea_id69", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1c4331fa-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1c42fc3a-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_0f3b1bc6dc" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_1", + "id69_content_0", + "outputarea_id67", + "outputarea_id69", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1c4399ec-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id69\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_dd4cc10ce1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_1", + "id69_content_0", + "outputarea_id67", + "outputarea_id69", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mExampleFunctionTwo_sql\u001b[0m variable.\n", + "SELECT\n", + " \"b\" AS col0,\n", + " \"c\" AS logica_value;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"1c44a30a-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1c42cad0-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_c70f911cdc" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_1", + "id69_content_0", + "outputarea_id67", + "outputarea_id69", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1c45d8e2-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1c3f3cbc-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_3415b17702" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_1", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1c474e66-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b1870f9f77" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_3", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1c479286-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id67_content_3\");\n", + "//# sourceURL=js_6bb526762f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_3", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1c47d76e-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1c479286-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_089a3ea654" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_3", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1c481ba2-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id67\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_6a75da737c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_3", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1ccc348c-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1c474e66-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_75d7f05c9a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_3", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1ccfba44-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_89c9dfc6c6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_1", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1cd0469e-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id67_content_1\");\n", + "//# sourceURL=js_a5e68ea8e1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_1", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1cd0d78a-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1cd0469e-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_63b866be2f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_1", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1cd1387e-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id67\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_6a6e23a693" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_1", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1cd2a808-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_0fa35eebdc" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_1", + "id69_content_1", + "outputarea_id67", + "outputarea_id69", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1cd2e91c-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id69_content_1\");\n", + "//# sourceURL=js_71f0cc0f7e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_1", + "id69_content_1", + "outputarea_id67", + "outputarea_id69", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1cd350aa-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1cd2e91c-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_5090b05d63" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_1", + "id69_content_1", + "outputarea_id67", + "outputarea_id69", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1cd39bd2-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id69\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_6a5315a915" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_1", + "id69_content_1", + "outputarea_id67", + "outputarea_id69", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mExampleFunctionTwo\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0logica_value
0bc
\n", + "
" + ], + "text/plain": [ + " col0 logica_value\n", + "0 b c" + ] + }, + "metadata": { + "tags": [ + "id67_content_1", + "id69_content_1", + "outputarea_id67", + "outputarea_id69", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1cd7623a-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1cd2a808-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_471dd3e6e7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_1", + "id69_content_1", + "outputarea_id67", + "outputarea_id69", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1cd8c530-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1ccfba44-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_48a85fcfcd" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_1", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1cda73a8-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_7f20fc86d4" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_3", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1cdac9ca-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id67_content_3\");\n", + "//# sourceURL=js_a4ba29d651" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_3", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1cdb1fa6-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1cdac9ca-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_b957511f08" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_3", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1cdb7078-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id67\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_1416e5137f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_3", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running Test\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"1ce08aea-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1cda73a8-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_6091f97b62" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_3", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1ce2bf4a-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_eb2025b6f0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_2", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1ce30ad6-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id67_content_2\");\n", + "//# sourceURL=js_f9aab63463" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_2", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1ce41840-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1ce30ad6-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_71ad072c8e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_2", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1ce495ae-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id67\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_065646bea7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_2", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_2", + "outputarea_id67", + "outputarea_id70", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_2", + "outputarea_id67", + "outputarea_id70", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_2", + "outputarea_id67", + "outputarea_id70", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1ce6e52a-fc31-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id70\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_ae450ed93c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_2", + "outputarea_id67", + "outputarea_id70", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1ce72c38-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id70\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_2215f1af1b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_2", + "outputarea_id67", + "outputarea_id70", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1ce86652-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_045a2ac758" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_2", + "id70_content_0", + "outputarea_id67", + "outputarea_id70", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1ce8b1b6-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id70_content_0\");\n", + "//# sourceURL=js_0f895d008d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_2", + "id70_content_0", + "outputarea_id67", + "outputarea_id70", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1ce8fb08-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1ce8b1b6-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_677d26c4a8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_2", + "id70_content_0", + "outputarea_id67", + "outputarea_id70", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1ce94586-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id70\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_c7bd99a8b9" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_2", + "id70_content_0", + "outputarea_id67", + "outputarea_id70", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mTest_sql\u001b[0m variable.\n", + "SELECT * FROM (\n", + " \n", + " SELECT\n", + " \"test_1\" AS col0,\n", + " \"a\" AS col1,\n", + " \"b\" AS col2\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"test_2\" AS col0,\n", + " \"a\" AS col1,\n", + " \"b\" AS col2\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"test_3\" AS col0,\n", + " \"a\" AS col1,\n", + " \"b\" AS col2\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"test_4\" AS col0,\n", + " \"a\" AS col1,\n", + " \"c\" AS col2\n", + " \n", + ") ;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"1cea6010-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1ce86652-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_e86194ceda" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_2", + "id70_content_0", + "outputarea_id67", + "outputarea_id70", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1ceb98ae-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1ce2bf4a-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_2bf699cb0b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_2", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1cedbe40-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_e77c4f0dd8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_3", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1cee0aee-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id67_content_3\");\n", + "//# sourceURL=js_a612fc7577" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_3", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1cee5274-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1cee0aee-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_a160745a45" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_3", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1cee9f86-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id67\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_d4080bc287" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_3", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1d418002-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1cedbe40-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_e3c71d5273" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_3", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1d43f3f0-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_c7a899ffe0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_2", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1d444b20-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id67_content_2\");\n", + "//# sourceURL=js_65de7fca19" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_2", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1d449864-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1d444b20-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_bb5315a0e0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_2", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1d44ddba-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id67\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_f9731214a4" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_2", + "outputarea_id67" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1d4652e4-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_a5e7d8e94f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_2", + "id70_content_1", + "outputarea_id67", + "outputarea_id70", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1d46a190-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id70_content_1\");\n", + "//# sourceURL=js_fec2a8c0a2" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_2", + "id70_content_1", + "outputarea_id67", + "outputarea_id70", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1d46fe42-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1d46a190-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_20f9a295dd" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_2", + "id70_content_1", + "outputarea_id67", + "outputarea_id70", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1d47a356-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id70\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_fa7bbd0c61" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_2", + "id70_content_1", + "outputarea_id67", + "outputarea_id70", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mTest\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1col2
0test_1ab
1test_2ab
2test_3ab
3test_4ac
\n", + "
" + ], + "text/plain": [ + " col0 col1 col2\n", + "0 test_1 a b\n", + "1 test_2 a b\n", + "2 test_3 a b\n", + "3 test_4 a c" + ] + }, + "metadata": { + "tags": [ + "id67_content_2", + "id70_content_1", + "outputarea_id67", + "outputarea_id70", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1d4bccec-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1d4652e4-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_748bc9240d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_2", + "id70_content_1", + "outputarea_id67", + "outputarea_id70", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"1d4d28d0-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1d43f3f0-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_553eea6c77" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id67_content_2", + "outputarea_id67" + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "%%logica ExampleFunctionOne, ExampleFunctionTwo, Test\n", + "\n", + "ExampleFunctionOne(x) = y :- x == \"a\", y == \"b\";\n", + "\n", + "ExampleFunctionTwo(\"b\", logica_value: \"c\");\n", + "\n", + "Test(\"test_1\", x, y) :- ExampleFunctionOne(x, logica_value: y);\n", + "Test(\"test_2\", x, y) :- ExampleFunctionOne(x) == y;\n", + "Test(\"test_3\", x, ExampleFunctionOne(x));\n", + "Test(\"test_4\", x, ExampleFunctionTwo(ExampleFunctionOne(x)));\n", + "\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9YHMZSsryqYy" + }, + "source": [ + "Thus function notation does not add any new capabilities, but often makes syntax much cleaner." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 301, + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH0=", + "headers": [ + [ + "content-type", + "text/css" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgaCxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9ZnVuY3Rpb24oYSl7dmFyIGI9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmYVtTeW1ib2wuaXRlcmF0b3JdO3JldHVybiBiP2IuY2FsbChhKTp7bmV4dDphYShhKX19LGw9dGhpc3x8c2VsZixjYT1mdW5jdGlvbigpe30sZGE9ZnVuY3Rpb24oYSl7YS5CYT12b2lkIDA7YS5SPWZ1bmN0aW9uKCl7cmV0dXJuIGEuQmE/YS5CYTphLkJhPW5ldyBhfX0sZWE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7aWYoIm9iamVjdCI9PWIpaWYoYSl7aWYoYSBpbnN0YW5jZW9mIEFycmF5KXJldHVybiJhcnJheSI7aWYoYSBpbnN0YW5jZW9mIE9iamVjdClyZXR1cm4gYjt2YXIgYz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk7aWYoIltvYmplY3QgV2luZG93XSI9PWMpcmV0dXJuIm9iamVjdCI7CmlmKCJbb2JqZWN0IEFycmF5XSI9PWN8fCJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGgmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5zcGxpY2UmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoInNwbGljZSIpKXJldHVybiJhcnJheSI7aWYoIltvYmplY3QgRnVuY3Rpb25dIj09Y3x8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmNhbGwmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoImNhbGwiKSlyZXR1cm4iZnVuY3Rpb24ifWVsc2UgcmV0dXJuIm51bGwiO2Vsc2UgaWYoImZ1bmN0aW9uIj09YiYmInVuZGVmaW5lZCI9PXR5cGVvZiBhLmNhbGwpcmV0dXJuIm9iamVjdCI7cmV0dXJuIGJ9LGZhPWZ1bmN0aW9uKGEpe3JldHVybiJhcnJheSI9PWVhKGEpfSxoYT1mdW5jdGlvbihhKXt2YXIgYj1lYShhKTtyZXR1cm4iYXJyYXkiPT1ifHwib2JqZWN0Ij09CmImJiJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGh9LGlhPWZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PWVhKGEpfSxtPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBhO3JldHVybiJvYmplY3QiPT1iJiZudWxsIT1hfHwiZnVuY3Rpb24iPT1ifSxqYT0iY2xvc3VyZV91aWRfIisoMUU5Kk1hdGgucmFuZG9tKCk+Pj4wKSxrYT0wLGxhPWZ1bmN0aW9uKGEsYil7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe3ZhciBkPWMuc2xpY2UoKTtkLnB1c2guYXBwbHkoZCxhcmd1bWVudHMpO3JldHVybiBhLmFwcGx5KHRoaXMsZCl9fSxuPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe31jLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLmk9Yi5wcm90b3R5cGU7YS5wcm90b3R5cGU9bmV3IGM7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YX07dmFyIG1hLG5hPXtlYjoiYWN0aXZlZGVzY2VuZGFudCIsamI6ImF0b21pYyIsa2I6ImF1dG9jb21wbGV0ZSIsbWI6ImJ1c3kiLHBiOiJjaGVja2VkIixxYjoiY29saW5kZXgiLHZiOiJjb250cm9scyIseGI6ImRlc2NyaWJlZGJ5IixBYjoiZGlzYWJsZWQiLENiOiJkcm9wZWZmZWN0IixEYjoiZXhwYW5kZWQiLEViOiJmbG93dG8iLEdiOiJncmFiYmVkIixLYjoiaGFzcG9wdXAiLE1iOiJoaWRkZW4iLE9iOiJpbnZhbGlkIixQYjoibGFiZWwiLFFiOiJsYWJlbGxlZGJ5IixSYjoibGV2ZWwiLFdiOiJsaXZlIixrYzoibXVsdGlsaW5lIixsYzoibXVsdGlzZWxlY3RhYmxlIixwYzoib3JpZW50YXRpb24iLHFjOiJvd25zIixyYzoicG9zaW5zZXQiLHRjOiJwcmVzc2VkIix4YzoicmVhZG9ubHkiLHpjOiJyZWxldmFudCIsQWM6InJlcXVpcmVkIixFYzoicm93aW5kZXgiLEhjOiJzZWxlY3RlZCIsSmM6InNldHNpemUiLExjOiJzb3J0IixaYzoidmFsdWVtYXgiLCRjOiJ2YWx1ZW1pbiIsYWQ6InZhbHVlbm93IiwKYmQ6InZhbHVldGV4dCJ9O3ZhciBvYT1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkIGluIGEpYi5jYWxsKGMsYVtkXSxkLGEpfSxwYT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyBpbiBhKWlmKGFbY109PWIpcmV0dXJuITA7cmV0dXJuITF9LHFhPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsIT09YSYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfSxzYT1mdW5jdGlvbihhKXt2YXIgYj17fSxjO2ZvcihjIGluIGEpYlthW2NdXT1jO3JldHVybiBifSx0YT0iY29uc3RydWN0b3IgaGFzT3duUHJvcGVydHkgaXNQcm90b3R5cGVPZiBwcm9wZXJ0eUlzRW51bWVyYWJsZSB0b0xvY2FsZVN0cmluZyB0b1N0cmluZyB2YWx1ZU9mIi5zcGxpdCgiICIpLHVhPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8dGEubGVuZ3RoO2YrKyljPQp0YVtmXSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZCxjKSYmKGFbY109ZFtjXSl9fTt2YXIgdmE9e2ZiOiJhbGVydCIsZ2I6ImFsZXJ0ZGlhbG9nIixoYjoiYXBwbGljYXRpb24iLGliOiJhcnRpY2xlIixsYjoiYmFubmVyIixuYjoiYnV0dG9uIixvYjoiY2hlY2tib3giLHJiOiJjb2x1bW5oZWFkZXIiLHNiOiJjb21ib2JveCIsdGI6ImNvbXBsZW1lbnRhcnkiLHViOiJjb250ZW50aW5mbyIsd2I6ImRlZmluaXRpb24iLHliOiJkaWFsb2ciLHpiOiJkaXJlY3RvcnkiLEJiOiJkb2N1bWVudCIsRmI6ImZvcm0iLEhiOiJncmlkIixJYjoiZ3JpZGNlbGwiLEpiOiJncm91cCIsTGI6ImhlYWRpbmciLE5iOiJpbWciLFNiOiJsaW5rIixUYjoibGlzdCIsVWI6Imxpc3Rib3giLFZiOiJsaXN0aXRlbSIsWGI6ImxvZyIsWWI6Im1haW4iLFpiOiJtYXJxdWVlIiwkYjoibWF0aCIsYWM6Im1lbnUiLGJjOiJtZW51YmFyIixjYzoibWVudWl0ZW0iLGRjOiJtZW51aXRlbWNoZWNrYm94IixlYzoibWVudWl0ZW1yYWRpbyIsbWM6Im5hdmlnYXRpb24iLG5jOiJub3RlIixvYzoib3B0aW9uIiwKc2M6InByZXNlbnRhdGlvbiIsdWM6InByb2dyZXNzYmFyIix2YzoicmFkaW8iLHdjOiJyYWRpb2dyb3VwIix5YzoicmVnaW9uIixCYzoicm93IixDYzoicm93Z3JvdXAiLERjOiJyb3doZWFkZXIiLEZjOiJzY3JvbGxiYXIiLEdjOiJzZWFyY2giLEljOiJzZXBhcmF0b3IiLEtjOiJzbGlkZXIiLE1jOiJzcGluYnV0dG9uIixOYzoic3RhdHVzIixPYzoidGFiIixQYzoidGFibGlzdCIsUWM6InRhYnBhbmVsIixSYzoidGV4dGJveCIsU2M6InRleHRpbmZvIixUYzoidGltZXIiLFVjOiJ0b29sYmFyIixWYzoidG9vbHRpcCIsV2M6InRyZWUiLFhjOiJ0cmVlZ3JpZCIsWWM6InRyZWVpdGVtIn07dmFyIHdhPWZ1bmN0aW9uKGEpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsd2EpO2Vsc2V7dmFyIGI9RXJyb3IoKS5zdGFjaztiJiYodGhpcy5zdGFjaz1iKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSl9O24od2EsRXJyb3IpO3dhLnByb3RvdHlwZS5uYW1lPSJDdXN0b21FcnJvciI7dmFyIHhhO3ZhciB5YT1mdW5jdGlvbihhLGIpe2E9YS5zcGxpdCgiJXMiKTtmb3IodmFyIGM9IiIsZD1hLmxlbmd0aC0xLGU9MDtlPGQ7ZSsrKWMrPWFbZV0rKGU8Yi5sZW5ndGg/YltlXToiJXMiKTt3YS5jYWxsKHRoaXMsYythW2RdKX07bih5YSx3YSk7eWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjsKdmFyIHphPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSJBc3NlcnRpb24gZmFpbGVkIjtpZihjKXtlKz0iOiAiK2M7dmFyIGY9ZH1lbHNlIGEmJihlKz0iOiAiK2EsZj1iKTt0aHJvdyBuZXcgeWEoIiIrZSxmfHxbXSk7fSxxPWZ1bmN0aW9uKGEsYixjKXthfHx6YSgiIixudWxsLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX0sQWE9ZnVuY3Rpb24oYSxiLGMpe20oYSkmJjE9PWEubm9kZVR5cGV8fHphKCJFeHBlY3RlZCBFbGVtZW50IGJ1dCBnb3QgJXM6ICVzLiIsW2VhKGEpLGFdLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKX0sQ2E9ZnVuY3Rpb24oYSxiLGMsZCl7YSBpbnN0YW5jZW9mIGJ8fHphKCJFeHBlY3RlZCBpbnN0YW5jZW9mICVzIGJ1dCBnb3QgJXMuIixbQmEoYiksQmEoYSldLGMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpKX0sQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZgpGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTpudWxsPT09YT8ibnVsbCI6dHlwZW9mIGF9O3ZhciBEYT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3EobnVsbCE9YS5sZW5ndGgpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKCJzdHJpbmciPT09dHlwZW9mIGEpcmV0dXJuInN0cmluZyIhPT10eXBlb2YgYnx8MSE9Yi5sZW5ndGg/LTE6YS5pbmRleE9mKGIsMCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspaWYoYyBpbiBhJiZhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX0scj1BcnJheS5wcm90b3R5cGUuZm9yRWFjaD9mdW5jdGlvbihhLGIsYyl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsYyl9OmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9YS5sZW5ndGgsZT0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZj0wO2Y8ZDtmKyspZiBpbiBlJiZiLmNhbGwoYyxlW2ZdLGYsYSl9LEVhPUFycmF5LnByb3RvdHlwZS5maWx0ZXI/CmZ1bmN0aW9uKGEsYil7cShudWxsIT1hLmxlbmd0aCk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD1bXSxlPTAsZj0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZz0wO2c8YztnKyspaWYoZyBpbiBmKXt2YXIgaz1mW2ddO2IuY2FsbCh2b2lkIDAsayxnLGEpJiYoZFtlKytdPWspfXJldHVybiBkfSxGYT1BcnJheS5wcm90b3R5cGUuZXZlcnk/ZnVuY3Rpb24oYSxiKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmV2ZXJ5LmNhbGwoYSxiLHZvaWQgMCl9OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWEubGVuZ3RoLGQ9InN0cmluZyI9PT10eXBlb2YgYT9hLnNwbGl0KCIiKTphLGU9MDtlPGM7ZSsrKWlmKGUgaW4gZCYmIWIuY2FsbCh2b2lkIDAsZFtlXSxlLGEpKXJldHVybiExO3JldHVybiEwfSxHYT1mdW5jdGlvbihhLGIpe3JldHVybiAwPD0KRGEoYSxiKX0sSGE9ZnVuY3Rpb24oYSxiKXtiPURhKGEsYik7dmFyIGM7aWYoYz0wPD1iKXEobnVsbCE9YS5sZW5ndGgpLEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhLGIsMSk7cmV0dXJuIGN9LElhPWZ1bmN0aW9uKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGFyZ3VtZW50cyl9LEphPWZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDA8Yil7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX0sTGE9ZnVuY3Rpb24oYSxiLGMsZCl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShhLEthKGFyZ3VtZW50cywxKSl9LEthPWZ1bmN0aW9uKGEsYixjKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gMj49YXJndW1lbnRzLmxlbmd0aD9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsYixjKX07dmFyIE1hPVN0cmluZy5wcm90b3R5cGUudHJpbT9mdW5jdGlvbihhKXtyZXR1cm4gYS50cmltKCl9OmZ1bmN0aW9uKGEpe3JldHVybi9eW1xzXHhhMF0qKFtcc1xTXSo/KVtcc1x4YTBdKiQvLmV4ZWMoYSlbMV19LE5hPS8mL2csT2E9LzwvZyxQYT0vPi9nLFFhPS8iL2csUmE9LycvZyxTYT0vXHgwMC9nLFRhPS9bXHgwMCY8PiInXS8sdD1mdW5jdGlvbihhLGIpe3JldHVybi0xIT1hLmluZGV4T2YoYil9LFVhPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE8Yj8tMTphPmI/MTowfTt2YXIgdTthOnt2YXIgVmE9bC5uYXZpZ2F0b3I7aWYoVmEpe3ZhciBXYT1WYS51c2VyQWdlbnQ7aWYoV2Epe3U9V2E7YnJlYWsgYX19dT0iIn07LyoKCiBDb3B5cmlnaHQgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzLgogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKKi8KdmFyIFhhPWZ1bmN0aW9uKGEpe1RhLnRlc3QoYSkmJigtMSE9YS5pbmRleE9mKCImIikmJihhPWEucmVwbGFjZShOYSwiJmFtcDsiKSksLTEhPWEuaW5kZXhPZigiPCIpJiYoYT1hLnJlcGxhY2UoT2EsIiZsdDsiKSksLTEhPWEuaW5kZXhPZigiPiIpJiYoYT1hLnJlcGxhY2UoUGEsIiZndDsiKSksLTEhPWEuaW5kZXhPZignIicpJiYoYT1hLnJlcGxhY2UoUWEsIiZxdW90OyIpKSwtMSE9YS5pbmRleE9mKCInIikmJihhPWEucmVwbGFjZShSYSwiJiMzOTsiKSksLTEhPWEuaW5kZXhPZigiXHgwMCIpJiYoYT1hLnJlcGxhY2UoU2EsIiYjMDsiKSkpO3JldHVybiBhfTt2YXIgWWE9ZnVuY3Rpb24oYSl7WWFbIiAiXShhKTtyZXR1cm4gYX07WWFbIiAiXT1jYTt2YXIgJGE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1aYTtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsYSk/Y1thXTpjW2FdPWIoYSl9O3ZhciBhYj10KHUsIk9wZXJhIiksdj10KHUsIlRyaWRlbnQiKXx8dCh1LCJNU0lFIiksYmI9dCh1LCJFZGdlIikseD10KHUsIkdlY2tvIikmJiEodCh1LnRvTG93ZXJDYXNlKCksIndlYmtpdCIpJiYhdCh1LCJFZGdlIikpJiYhKHQodSwiVHJpZGVudCIpfHx0KHUsIk1TSUUiKSkmJiF0KHUsIkVkZ2UiKSx5PXQodS50b0xvd2VyQ2FzZSgpLCJ3ZWJraXQiKSYmIXQodSwiRWRnZSIpLHo9dCh1LCJNYWNpbnRvc2giKSxjYj1mdW5jdGlvbigpe3ZhciBhPWwuZG9jdW1lbnQ7cmV0dXJuIGE/YS5kb2N1bWVudE1vZGU6dm9pZCAwfSxkYjsKYTp7dmFyIGViPSIiLGZiPWZ1bmN0aW9uKCl7dmFyIGE9dTtpZih4KXJldHVybi9ydjooW15cKTtdKykoXCl8OykvLmV4ZWMoYSk7aWYoYmIpcmV0dXJuL0VkZ2VcLyhbXGRcLl0rKS8uZXhlYyhhKTtpZih2KXJldHVybi9cYig/Ok1TSUV8cnYpWzogXShbXlwpO10rKShcKXw7KS8uZXhlYyhhKTtpZih5KXJldHVybi9XZWJLaXRcLyhcUyspLy5leGVjKGEpO2lmKGFiKXJldHVybi8oPzpWZXJzaW9uKVsgXC9dPyhcUyspLy5leGVjKGEpfSgpO2ZiJiYoZWI9ZmI/ZmJbMV06IiIpO2lmKHYpe3ZhciBnYj1jYigpO2lmKG51bGwhPWdiJiZnYj5wYXJzZUZsb2F0KGViKSl7ZGI9U3RyaW5nKGdiKTticmVhayBhfX1kYj1lYn0KdmFyIGhiPWRiLFphPXt9LEE9ZnVuY3Rpb24oYSl7cmV0dXJuICRhKGEsZnVuY3Rpb24oKXtmb3IodmFyIGI9MCxjPU1hKFN0cmluZyhoYikpLnNwbGl0KCIuIiksZD1NYShTdHJpbmcoYSkpLnNwbGl0KCIuIiksZT1NYXRoLm1heChjLmxlbmd0aCxkLmxlbmd0aCksZj0wOzA9PWImJmY8ZTtmKyspe3ZhciBnPWNbZl18fCIiLGs9ZFtmXXx8IiI7ZG97Zz0vKFxkKikoXEQqKSguKikvLmV4ZWMoZyl8fFsiIiwiIiwiIiwiIl07az0vKFxkKikoXEQqKSguKikvLmV4ZWMoayl8fFsiIiwiIiwiIiwiIl07aWYoMD09Z1swXS5sZW5ndGgmJjA9PWtbMF0ubGVuZ3RoKWJyZWFrO2I9VWEoMD09Z1sxXS5sZW5ndGg/MDpwYXJzZUludChnWzFdLDEwKSwwPT1rWzFdLmxlbmd0aD8wOnBhcnNlSW50KGtbMV0sMTApKXx8VWEoMD09Z1syXS5sZW5ndGgsMD09a1syXS5sZW5ndGgpfHxVYShnWzJdLGtbMl0pO2c9Z1szXTtrPWtbM119d2hpbGUoMD09Yil9cmV0dXJuIDA8PWJ9KX0saWI7CmliPWwuZG9jdW1lbnQmJnY/Y2IoKTp2b2lkIDA7dmFyIGpiPSF2fHw5PD1OdW1iZXIoaWIpO3ZhciBsYj1mdW5jdGlvbihhLGIpe29hKGIsZnVuY3Rpb24oYyxkKXtjJiYib2JqZWN0Ij09dHlwZW9mIGMmJmMuZGQmJihjPWMuY2QoKSk7InN0eWxlIj09ZD9hLnN0eWxlLmNzc1RleHQ9YzoiY2xhc3MiPT1kP2EuY2xhc3NOYW1lPWM6ImZvciI9PWQ/YS5odG1sRm9yPWM6a2IuaGFzT3duUHJvcGVydHkoZCk/YS5zZXRBdHRyaWJ1dGUoa2JbZF0sYyk6MD09ZC5sYXN0SW5kZXhPZigiYXJpYS0iLDApfHwwPT1kLmxhc3RJbmRleE9mKCJkYXRhLSIsMCk/YS5zZXRBdHRyaWJ1dGUoZCxjKTphW2RdPWN9KX0sa2I9e2NlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjb2xzcGFuOiJjb2xTcGFuIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGhlaWdodDoiaGVpZ2h0IixtYXhsZW5ndGg6Im1heExlbmd0aCIsbm9uY2U6Im5vbmNlIixyb2xlOiJyb2xlIixyb3dzcGFuOiJyb3dTcGFuIix0eXBlOiJ0eXBlIix1c2VtYXA6InVzZU1hcCIsdmFsaWduOiJ2QWxpZ24iLAp3aWR0aDoid2lkdGgifSxtYj1mdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChrKXtrJiZiLmFwcGVuZENoaWxkKCJzdHJpbmciPT09dHlwZW9mIGs/YS5jcmVhdGVUZXh0Tm9kZShrKTprKX1mb3IodmFyIGU9MjtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXTtpZighaGEoZil8fG0oZikmJjA8Zi5ub2RlVHlwZSlkKGYpO2Vsc2V7YTp7aWYoZiYmIm51bWJlciI9PXR5cGVvZiBmLmxlbmd0aCl7aWYobShmKSl7dmFyIGc9ImZ1bmN0aW9uIj09dHlwZW9mIGYuaXRlbXx8InN0cmluZyI9PXR5cGVvZiBmLml0ZW07YnJlYWsgYX1pZihpYShmKSl7Zz0iZnVuY3Rpb24iPT10eXBlb2YgZi5pdGVtO2JyZWFrIGF9fWc9ITF9cihnP0phKGYpOmYsZCl9fX0sbmI9ZnVuY3Rpb24oYSxiKXtiPVN0cmluZyhiKTsiYXBwbGljYXRpb24veGh0bWwreG1sIj09PWEuY29udGVudFR5cGUmJihiPWIudG9Mb3dlckNhc2UoKSk7cmV0dXJuIGEuY3JlYXRlRWxlbWVudChiKX0sb2I9ZnVuY3Rpb24oYSl7YSYmCmEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpfSxwYj1mdW5jdGlvbihhLGIpe2lmKCFhfHwhYilyZXR1cm4hMTtpZihhLmNvbnRhaW5zJiYxPT1iLm5vZGVUeXBlKXJldHVybiBhPT1ifHxhLmNvbnRhaW5zKGIpO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbilyZXR1cm4gYT09Ynx8ISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNik7Zm9yKDtiJiZhIT1iOyliPWIucGFyZW50Tm9kZTtyZXR1cm4gYj09YX0scWI9ZnVuY3Rpb24oYSl7cShhLCJOb2RlIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4iKTtyZXR1cm4gOT09YS5ub2RlVHlwZT9hOmEub3duZXJEb2N1bWVudHx8YS5kb2N1bWVudH0scmI9ZnVuY3Rpb24oYSxiKXtiP2EudGFiSW5kZXg9MDooYS50YWJJbmRleD0tMSxhLnJlbW92ZUF0dHJpYnV0ZSgidGFiSW5kZXgiKSl9LHNiPWZ1bmN0aW9uKGEpe3JldHVybiB2JiYhQSgiOSIpPyhhPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKSwKbnVsbCE9YSYmYS5zcGVjaWZpZWQpOmEuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpfSx0Yj1mdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgYSYmMDw9YSYmMzI3Njg+YX0sdWI9ZnVuY3Rpb24oYSl7dGhpcy5hPWF8fGwuZG9jdW1lbnR8fGRvY3VtZW50fTt1Yi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBhP3RoaXMuYS5nZXRFbGVtZW50QnlJZChhKTphfTsKdWIucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuYSxlPWFyZ3VtZW50cyxmPVN0cmluZyhlWzBdKSxnPWVbMV07aWYoIWpiJiZnJiYoZy5uYW1lfHxnLnR5cGUpKXtmPVsiPCIsZl07Zy5uYW1lJiZmLnB1c2goJyBuYW1lPSInLFhhKGcubmFtZSksJyInKTtpZihnLnR5cGUpe2YucHVzaCgnIHR5cGU9IicsWGEoZy50eXBlKSwnIicpO3ZhciBrPXt9O3VhKGssZyk7ZGVsZXRlIGsudHlwZTtnPWt9Zi5wdXNoKCI+Iik7Zj1mLmpvaW4oIiIpfWY9bmIoZCxmKTtnJiYoInN0cmluZyI9PT10eXBlb2YgZz9mLmNsYXNzTmFtZT1nOmZhKGcpP2YuY2xhc3NOYW1lPWcuam9pbigiICIpOmxiKGYsZykpOzI8ZS5sZW5ndGgmJm1iKGQsZixlKTtyZXR1cm4gZn07dmFyIHZiPWZ1bmN0aW9uKGEsYil7Yj8ocShwYSh2YSxiKSwiTm8gc3VjaCBBUklBIHJvbGUgIitiKSxhLnNldEF0dHJpYnV0ZSgicm9sZSIsYikpOmEucmVtb3ZlQXR0cmlidXRlKCJyb2xlIil9LHhiPWZ1bmN0aW9uKGEsYixjKXtmYShjKSYmKGM9Yy5qb2luKCIgIikpO3ZhciBkPXdiKGIpOyIiPT09Y3x8dm9pZCAwPT1jPyhtYXx8KG1hPXthdG9taWM6ITEsYXV0b2NvbXBsZXRlOiJub25lIixkcm9wZWZmZWN0OiJub25lIixoYXNwb3B1cDohMSxsaXZlOiJvZmYiLG11bHRpbGluZTohMSxtdWx0aXNlbGVjdGFibGU6ITEsb3JpZW50YXRpb246InZlcnRpY2FsIixyZWFkb25seTohMSxyZWxldmFudDoiYWRkaXRpb25zIHRleHQiLHJlcXVpcmVkOiExLHNvcnQ6Im5vbmUiLGJ1c3k6ITEsZGlzYWJsZWQ6ITEsaGlkZGVuOiExLGludmFsaWQ6ImZhbHNlIn0pLGM9bWEsYiBpbiBjP2Euc2V0QXR0cmlidXRlKGQsY1tiXSk6YS5yZW1vdmVBdHRyaWJ1dGUoZCkpOmEuc2V0QXR0cmlidXRlKGQsCmMpfSx3Yj1mdW5jdGlvbihhKXtxKGEsIkFSSUEgYXR0cmlidXRlIGNhbm5vdCBiZSBlbXB0eS4iKTtxKHBhKG5hLGEpLCJObyBzdWNoIEFSSUEgYXR0cmlidXRlICIrYSk7cmV0dXJuImFyaWEtIithfTt2YXIgeWI9T2JqZWN0LmZyZWV6ZXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O3ZhciBDPWZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVTt0aGlzLko9dGhpcy5KfTtDLnByb3RvdHlwZS5VPSExO0MucHJvdG90eXBlLk49ZnVuY3Rpb24oKXt0aGlzLlV8fCh0aGlzLlU9ITAsdGhpcy51KCkpfTt2YXIgemI9ZnVuY3Rpb24oYSxiKXthLlU/YigpOihhLkp8fChhLko9W10pLGEuSi5wdXNoKGIpKX07Qy5wcm90b3R5cGUudT1mdW5jdGlvbigpe2lmKHRoaXMuSilmb3IoO3RoaXMuSi5sZW5ndGg7KXRoaXMuSi5zaGlmdCgpKCl9O3ZhciBBYj1mdW5jdGlvbihhKXthJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5OJiZhLk4oKX07dmFyIEJiPWZ1bmN0aW9uKGEpe3JldHVybiJzdHJpbmciPT10eXBlb2YgYS5jbGFzc05hbWU/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sRD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6QmIoYSkubWF0Y2goL1xTKy9nKXx8W119LENiPWZ1bmN0aW9uKGEsYil7InN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZT9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxEYj1mdW5jdGlvbihhLGIpe3JldHVybiBhLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5jb250YWlucyhiKTpHYShEKGEpLGIpfSxFYj1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFEYihhLGIpKXt2YXIgYz1CYihhKTtDYihhLGMrKDA8Yy5sZW5ndGg/IiAiK2I6YikpfX0sRmI9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClyKGIsCmZ1bmN0aW9uKGUpe0ViKGEsZSl9KTtlbHNle3ZhciBjPXt9O3IoRChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7cihiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPTA8Yi5sZW5ndGg/IiAiK2Q6ZDtDYihhLGIpfX0sR2I9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6RGIoYSxiKSYmQ2IoYSxFYShEKGEpLGZ1bmN0aW9uKGMpe3JldHVybiBjIT1ifSkuam9pbigiICIpKX0sSGI9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9yKGIsZnVuY3Rpb24oYyl7R2IoYSxjKX0pOkNiKGEsRWEoRChhKSxmdW5jdGlvbihjKXtyZXR1cm4hR2EoYixjKX0pLmpvaW4oIiAiKSl9O3ZhciBJYj0hdnx8OTw9TnVtYmVyKGliKSxKYj0hdnx8OTw9TnVtYmVyKGliKSxLYj12JiYhQSgiOSIpLExiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e2wuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsY2EsYiksbC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjYSxiKX1jYXRjaChjKXt9cmV0dXJuIGF9KCk7dmFyIEU9ZnVuY3Rpb24oYSxiKXt0aGlzLnR5cGU9YTt0aGlzLmE9dGhpcy50YXJnZXQ9Yjt0aGlzLmg9ITE7dGhpcy5LYT0hMH07RS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuaD0hMH07RS5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3RoaXMuS2E9ITF9O3ZhciBGPXtMOiJtb3VzZWRvd24iLE06Im1vdXNldXAiLGFhOiJtb3VzZWNhbmNlbCIsaGM6Im1vdXNlbW92ZSIsamM6Im1vdXNlb3ZlciIsaWM6Im1vdXNlb3V0IixmYzoibW91c2VlbnRlciIsZ2M6Im1vdXNlbGVhdmUifTt2YXIgRz1mdW5jdGlvbihhLGIpe0UuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy5hPXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5jPTA7dGhpcy5BPXRoaXMubWV0YUtleT10aGlzLnNoaWZ0S2V5PXRoaXMuYWx0S2V5PXRoaXMuY3RybEtleT0hMTt0aGlzLnBvaW50ZXJJZD0wO3RoaXMucG9pbnRlclR5cGU9IiI7dGhpcy5iPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMuYT1iO2lmKGI9YS5yZWxhdGVkVGFyZ2V0KXtpZih4KXthOnt0cnl7WWEoYi5ub2RlTmFtZSk7dmFyIGU9ITA7YnJlYWsgYX1jYXRjaChmKXt9ZT0KITF9ZXx8KGI9bnVsbCl9fWVsc2UibW91c2VvdmVyIj09Yz9iPWEuZnJvbUVsZW1lbnQ6Im1vdXNlb3V0Ij09YyYmKGI9YS50b0VsZW1lbnQpO3RoaXMucmVsYXRlZFRhcmdldD1iO2Q/KHRoaXMuY2xpZW50WD12b2lkIDAhPT1kLmNsaWVudFg/ZC5jbGllbnRYOmQucGFnZVgsdGhpcy5jbGllbnRZPXZvaWQgMCE9PWQuY2xpZW50WT9kLmNsaWVudFk6ZC5wYWdlWSx0aGlzLnNjcmVlblg9ZC5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1kLnNjcmVlbll8fDApOih0aGlzLmNsaWVudFg9dm9pZCAwIT09YS5jbGllbnRYP2EuY2xpZW50WDphLnBhZ2VYLHRoaXMuY2xpZW50WT12b2lkIDAhPT1hLmNsaWVudFk/YS5jbGllbnRZOmEucGFnZVksdGhpcy5zY3JlZW5YPWEuc2NyZWVuWHx8MCx0aGlzLnNjcmVlblk9YS5zY3JlZW5ZfHwwKTt0aGlzLmJ1dHRvbj1hLmJ1dHRvbjt0aGlzLmM9YS5rZXlDb2RlfHwwO3RoaXMua2V5PWEua2V5fHwiIjt0aGlzLmN0cmxLZXk9YS5jdHJsS2V5O3RoaXMuYWx0S2V5PQphLmFsdEtleTt0aGlzLnNoaWZ0S2V5PWEuc2hpZnRLZXk7dGhpcy5tZXRhS2V5PWEubWV0YUtleTt0aGlzLkE9ej9hLm1ldGFLZXk6YS5jdHJsS2V5O3RoaXMucG9pbnRlcklkPWEucG9pbnRlcklkfHwwO3RoaXMucG9pbnRlclR5cGU9InN0cmluZyI9PT10eXBlb2YgYS5wb2ludGVyVHlwZT9hLnBvaW50ZXJUeXBlOk1iW2EucG9pbnRlclR5cGVdfHwiIjt0aGlzLmI9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnRoaXMuZygpfX07bihHLEUpO3ZhciBOYj15YihbMSw0LDJdKSxNYj15Yih7MjoidG91Y2giLDM6InBlbiIsNDoibW91c2UifSksT2I9ZnVuY3Rpb24oYSl7cmV0dXJuIEliPzA9PWEuYi5idXR0b246ImNsaWNrIj09YS50eXBlPyEwOiEhKGEuYi5idXR0b24mTmJbMF0pfTtHLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7Ry5pLmouY2FsbCh0aGlzKTt0aGlzLmIuc3RvcFByb3BhZ2F0aW9uP3RoaXMuYi5zdG9wUHJvcGFnYXRpb24oKTp0aGlzLmIuY2FuY2VsQnViYmxlPSEwfTsKRy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe0cuaS5nLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5iO2lmKGEucHJldmVudERlZmF1bHQpYS5wcmV2ZW50RGVmYXVsdCgpO2Vsc2UgaWYoYS5yZXR1cm5WYWx1ZT0hMSxLYil0cnl7aWYoYS5jdHJsS2V5fHwxMTI8PWEua2V5Q29kZSYmMTIzPj1hLmtleUNvZGUpYS5rZXlDb2RlPS0xfWNhdGNoKGIpe319O3ZhciBQYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKDFFNipNYXRoLnJhbmRvbSgpfDApLFFiPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW1BiXSl9LFJiPTA7dmFyIFNiPWZ1bmN0aW9uKGEsYixjLGQsZSl7dGhpcy5saXN0ZW5lcj1hO3RoaXMuYT1udWxsO3RoaXMuc3JjPWI7dGhpcy50eXBlPWM7dGhpcy5jYXB0dXJlPSEhZDt0aGlzLm1hPWU7dGhpcy5rZXk9KytSYjt0aGlzLlg9dGhpcy5oYT0hMX0sVGI9ZnVuY3Rpb24oYSl7YS5YPSEwO2EubGlzdGVuZXI9bnVsbDthLmE9bnVsbDthLnNyYz1udWxsO2EubWE9bnVsbH07dmFyIFViPWZ1bmN0aW9uKGEpe3RoaXMuc3JjPWE7dGhpcy5hPXt9O3RoaXMuYj0wfTtVYi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS50b1N0cmluZygpO2E9dGhpcy5hW2ZdO2F8fChhPXRoaXMuYVtmXT1bXSx0aGlzLmIrKyk7dmFyIGc9VmIoYSxiLGQsZSk7LTE8Zz8oYj1hW2ddLGN8fChiLmhhPSExKSk6KGI9bmV3IFNiKGIsdGhpcy5zcmMsZiwhIWQsZSksYi5oYT1jLGEucHVzaChiKSk7cmV0dXJuIGJ9Owp2YXIgV2I9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLnR5cGU7YyBpbiBhLmEmJkhhKGEuYVtjXSxiKSYmKFRiKGIpLDA9PWEuYVtjXS5sZW5ndGgmJihkZWxldGUgYS5hW2NdLGEuYi0tKSl9LFhiPWZ1bmN0aW9uKGEsYixjLGQsZSl7YT1hLmFbYi50b1N0cmluZygpXTtiPS0xO2EmJihiPVZiKGEsYyxkLGUpKTtyZXR1cm4tMTxiP2FbYl06bnVsbH0sVmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuWCYmZi5saXN0ZW5lcj09YiYmZi5jYXB0dXJlPT0hIWMmJmYubWE9PWQpcmV0dXJuIGV9cmV0dXJuLTF9O3ZhciBZYj0iY2xvc3VyZV9sbV8iKygxRTYqTWF0aC5yYW5kb20oKXwwKSxaYj17fSwkYj0wLGJjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZCYmZC5vbmNlKXJldHVybiBhYyhhLGIsYyxkLGUpO2lmKGZhKGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyliYyhhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9Y2MoYyk7cmV0dXJuIFFiKGEpP2RjKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOmVjKGEsYixjLCExLGQsZSl9LGVjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGc9bShlKT8hIWUuY2FwdHVyZTohIWUsaz1mYyhhKTtrfHwoYVtZYl09az1uZXcgVWIoYSkpO2M9ay5hZGQoYixjLGQsZyxmKTtpZihjLmEpcmV0dXJuIGM7ZD1nYygpO2MuYT1kO2Quc3JjPWE7ZC5saXN0ZW5lcj1jO2lmKGEuYWRkRXZlbnRMaXN0ZW5lcilMYnx8KGU9Zyksdm9pZCAwPT09ZSYmKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksCmQsZSk7ZWxzZSBpZihhLmF0dGFjaEV2ZW50KWEuYXR0YWNoRXZlbnQoaGMoYi50b1N0cmluZygpKSxkKTtlbHNlIGlmKGEuYWRkTGlzdGVuZXImJmEucmVtb3ZlTGlzdGVuZXIpcSgiY2hhbmdlIj09PWIsIk1lZGlhUXVlcnlMaXN0IG9ubHkgaGFzIGEgY2hhbmdlIGV2ZW50IiksYS5hZGRMaXN0ZW5lcihkKTtlbHNlIHRocm93IEVycm9yKCJhZGRFdmVudExpc3RlbmVyIGFuZCBhdHRhY2hFdmVudCBhcmUgdW5hdmFpbGFibGUuIik7JGIrKztyZXR1cm4gY30sZ2M9ZnVuY3Rpb24oKXt2YXIgYT1pYyxiPUpiP2Z1bmN0aW9uKGMpe3JldHVybiBhLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKX06ZnVuY3Rpb24oYyl7Yz1hLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKTtpZighYylyZXR1cm4gY307cmV0dXJuIGJ9LGFjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZmEoYikpe2Zvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWFjKGEsYltmXSxjLGQsZSk7cmV0dXJuIG51bGx9Yz1jYyhjKTtyZXR1cm4gUWIoYSk/CmEuaC5hZGQoU3RyaW5nKGIpLGMsITAsbShkKT8hIWQuY2FwdHVyZTohIWQsZSk6ZWMoYSxiLGMsITAsZCxlKX0samM9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihmYShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylqYyhhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPWNjKGMpLFFiKGEpPyhhPWEuaCxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5hJiYoZj1hLmFbYl0sYz1WYihmLGMsZCxlKSwtMTxjJiYoVGIoZltjXSkscShudWxsIT1mLmxlbmd0aCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSwwPT1mLmxlbmd0aCYmKGRlbGV0ZSBhLmFbYl0sYS5iLS0pKSkpOmEmJihhPWZjKGEpKSYmKGM9WGIoYSxiLGMsZCxlKSkmJmtjKGMpfSxrYz1mdW5jdGlvbihhKXtpZigibnVtYmVyIiE9PXR5cGVvZiBhJiZhJiYhYS5YKXt2YXIgYj1hLnNyYztpZihRYihiKSlXYihiLmgsYSk7ZWxzZXt2YXIgYz1hLnR5cGUsZD1hLmE7Yi5yZW1vdmVFdmVudExpc3RlbmVyPwpiLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KGhjKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7JGItLTsoYz1mYyhiKSk/KFdiKGMsYSksMD09Yy5iJiYoYy5zcmM9bnVsbCxiW1liXT1udWxsKSk6VGIoYSl9fX0saGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gWmI/WmJbYV06WmJbYV09Im9uIithfSxtYz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMDtpZihhPWZjKGEpKWlmKGI9YS5hW2IudG9TdHJpbmcoKV0pZm9yKGI9Yi5jb25jYXQoKSxhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBmPWJbYV07ZiYmZi5jYXB0dXJlPT1jJiYhZi5YJiYoZj1sYyhmLGQpLGU9ZSYmITEhPT1mKX1yZXR1cm4gZX0sbGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5tYXx8YS5zcmM7YS5oYSYma2MoYSk7cmV0dXJuIGMuY2FsbChkLGIpfSxpYz1mdW5jdGlvbihhLApiKXtpZihhLlgpcmV0dXJuITA7aWYoIUpiKXtpZighYilhOntiPVsid2luZG93IiwiZXZlbnQiXTtmb3IodmFyIGM9bCxkPTA7ZDxiLmxlbmd0aDtkKyspaWYoYz1jW2JbZF1dLG51bGw9PWMpe2I9bnVsbDticmVhayBhfWI9Y31kPWI7Yj1uZXcgRyhkLHRoaXMpO2M9ITA7aWYoISgwPmQua2V5Q29kZXx8dm9pZCAwIT1kLnJldHVyblZhbHVlKSl7YTp7dmFyIGU9ITE7aWYoMD09ZC5rZXlDb2RlKXRyeXtkLmtleUNvZGU9LTE7YnJlYWsgYX1jYXRjaChnKXtlPSEwfWlmKGV8fHZvaWQgMD09ZC5yZXR1cm5WYWx1ZSlkLnJldHVyblZhbHVlPSEwfWQ9W107Zm9yKGU9Yi5hO2U7ZT1lLnBhcmVudE5vZGUpZC5wdXNoKGUpO2E9YS50eXBlO2ZvcihlPWQubGVuZ3RoLTE7IWIuaCYmMDw9ZTtlLS0pe2IuYT1kW2VdO3ZhciBmPW1jKGRbZV0sYSwhMCxiKTtjPWMmJmZ9Zm9yKGU9MDshYi5oJiZlPGQubGVuZ3RoO2UrKyliLmE9ZFtlXSxmPW1jKGRbZV0sYSwhMSxiKSxjPWMmJmZ9cmV0dXJuIGN9cmV0dXJuIGxjKGEsCm5ldyBHKGIsdGhpcykpfSxmYz1mdW5jdGlvbihhKXthPWFbWWJdO3JldHVybiBhIGluc3RhbmNlb2YgVWI/YTpudWxsfSxuYz0iX19jbG9zdXJlX2V2ZW50c19mbl8iKygxRTkqTWF0aC5yYW5kb20oKT4+PjApLGNjPWZ1bmN0aW9uKGEpe3EoYSwiTGlzdGVuZXIgY2FuIG5vdCBiZSBudWxsLiIpO2lmKGlhKGEpKXJldHVybiBhO3EoYS5oYW5kbGVFdmVudCwiQW4gb2JqZWN0IGxpc3RlbmVyIG11c3QgaGF2ZSBoYW5kbGVFdmVudCBtZXRob2QuIik7YVtuY118fChhW25jXT1mdW5jdGlvbihiKXtyZXR1cm4gYS5oYW5kbGVFdmVudChiKX0pO3JldHVybiBhW25jXX07dmFyIG9jPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9e319O24ob2MsQyk7CnZhciBwYz1bXSxIPWZ1bmN0aW9uKGEsYixjLGQpe2ZhKGMpfHwoYyYmKHBjWzBdPWMudG9TdHJpbmcoKSksYz1wYyk7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWJjKGIsY1tlXSxkfHxhLmhhbmRsZUV2ZW50LCExLGEuYnx8YSk7aWYoIWYpYnJlYWs7YS5hW2Yua2V5XT1mfXJldHVybiBhfSxxYz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoZmEoYykpZm9yKHZhciBnPTA7ZzxjLmxlbmd0aDtnKyspcWMoYSxiLGNbZ10sZCxlLGYpO2Vsc2UgZD1kfHxhLmhhbmRsZUV2ZW50LGU9bShlKT8hIWUuY2FwdHVyZTohIWUsZj1mfHxhLmJ8fGEsZD1jYyhkKSxlPSEhZSxjPVFiKGIpP1hiKGIuaCxTdHJpbmcoYyksZCxlLGYpOmI/KGI9ZmMoYikpP1hiKGIsYyxkLGUsZik6bnVsbDpudWxsLGMmJihrYyhjKSxkZWxldGUgYS5hW2Mua2V5XSk7cmV0dXJuIGF9LHJjPWZ1bmN0aW9uKGEpe29hKGEuYSxmdW5jdGlvbihiLGMpe3RoaXMuYS5oYXNPd25Qcm9wZXJ0eShjKSYma2MoYil9LAphKTthLmE9e319O29jLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7b2MuaS51LmNhbGwodGhpcyk7cmModGhpcyl9O29jLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJFdmVudEhhbmRsZXIuaGFuZGxlRXZlbnQgbm90IGltcGxlbWVudGVkIik7fTt2YXIgST1mdW5jdGlvbigpe0MuY2FsbCh0aGlzKTt0aGlzLmg9bmV3IFViKHRoaXMpO3RoaXMuTWE9dGhpczt0aGlzLnBhPW51bGx9O24oSSxDKTtJLnByb3RvdHlwZVtQYl09ITA7SS5wcm90b3R5cGUucmE9ZnVuY3Rpb24oYSl7dGhpcy5wYT1hfTtJLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjLGQpe2pjKHRoaXMsYSxiLGMsZCl9Owp2YXIgdWM9ZnVuY3Rpb24oYSxiKXtzYyhhKTt2YXIgYz1hLnBhO2lmKGMpe3ZhciBkPVtdO2Zvcih2YXIgZT0xO2M7Yz1jLnBhKWQucHVzaChjKSxxKDFFMz4rK2UsImluZmluaXRlIGxvb3AiKX1hPWEuTWE7Yz1iLnR5cGV8fGI7InN0cmluZyI9PT10eXBlb2YgYj9iPW5ldyBFKGIsYSk6YiBpbnN0YW5jZW9mIEU/Yi50YXJnZXQ9Yi50YXJnZXR8fGE6KGU9YixiPW5ldyBFKGMsYSksdWEoYixlKSk7ZT0hMDtpZihkKWZvcih2YXIgZj1kLmxlbmd0aC0xOyFiLmgmJjA8PWY7Zi0tKXt2YXIgZz1iLmE9ZFtmXTtlPXRjKGcsYywhMCxiKSYmZX1iLmh8fChnPWIuYT1hLGU9dGMoZyxjLCEwLGIpJiZlLGIuaHx8KGU9dGMoZyxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLmgmJmY8ZC5sZW5ndGg7ZisrKWc9Yi5hPWRbZl0sZT10YyhnLGMsITEsYikmJmU7cmV0dXJuIGV9OwpJLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7SS5pLnUuY2FsbCh0aGlzKTtpZih0aGlzLmgpe3ZhciBhPXRoaXMuaCxiPTAsYztmb3IoYyBpbiBhLmEpe2Zvcih2YXIgZD1hLmFbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixUYihkW2VdKTtkZWxldGUgYS5hW2NdO2EuYi0tfX10aGlzLnBhPW51bGx9O3ZhciBkYz1mdW5jdGlvbihhLGIsYyxkLGUpe3NjKGEpO3JldHVybiBhLmguYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LHRjPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5oLmFbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGc9YltmXTtpZihnJiYhZy5YJiZnLmNhcHR1cmU9PWMpe3ZhciBrPWcubGlzdGVuZXIscD1nLm1hfHxnLnNyYztnLmhhJiZXYihhLmgsZyk7ZT0hMSE9PWsuY2FsbChwLGQpJiZlfX1yZXR1cm4gZSYmMCE9ZC5LYX0sc2M9ZnVuY3Rpb24oYSl7cShhLmgsIkV2ZW50IHRhcmdldCBpcyBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgY2FsbCB0aGUgc3VwZXJjbGFzcyAoZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpIGNvbnN0cnVjdG9yPyIpfTt2YXIgeGM9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKHkmJiFBKCI1MjUiKSlyZXR1cm4hMDtpZih6JiZlKXJldHVybiB2YyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZigheCl7Im51bWJlciI9PT10eXBlb2YgYiYmKGI9d2MoYikpO3ZhciBnPTE3PT1ifHwxOD09Ynx8eiYmOTE9PWI7aWYoKCFjfHx6KSYmZ3x8eiYmMTY9PWImJihkfHxmKSlyZXR1cm4hMX1pZigoeXx8YmIpJiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1pZih2JiZkJiZiPT1hKXJldHVybiExO3N3aXRjaChhKXtjYXNlIDEzOnJldHVybiB4P2Z8fGU/ITE6IShjJiZkKTohMDtjYXNlIDI3OnJldHVybiEoeXx8YmJ8fHgpfXJldHVybiB4JiYoZHx8ZXx8Zik/ITE6dmMoYSl9LHZjPWZ1bmN0aW9uKGEpe2lmKDQ4PD1hJiY1Nz49YXx8Cjk2PD1hJiYxMDY+PWF8fDY1PD1hJiY5MD49YXx8KHl8fGJiKSYmMD09YSlyZXR1cm4hMDtzd2l0Y2goYSl7Y2FzZSAzMjpjYXNlIDQzOmNhc2UgNjM6Y2FzZSA2NDpjYXNlIDEwNzpjYXNlIDEwOTpjYXNlIDExMDpjYXNlIDExMTpjYXNlIDE4NjpjYXNlIDU5OmNhc2UgMTg5OmNhc2UgMTg3OmNhc2UgNjE6Y2FzZSAxODg6Y2FzZSAxOTA6Y2FzZSAxOTE6Y2FzZSAxOTI6Y2FzZSAyMjI6Y2FzZSAyMTk6Y2FzZSAyMjA6Y2FzZSAyMjE6Y2FzZSAxNjM6Y2FzZSA1ODpyZXR1cm4hMDtjYXNlIDE3MzpyZXR1cm4geDtkZWZhdWx0OnJldHVybiExfX0sd2M9ZnVuY3Rpb24oYSl7aWYoeClhPXljKGEpO2Vsc2UgaWYoeiYmeSlzd2l0Y2goYSl7Y2FzZSA5MzphPTkxfXJldHVybiBhfSx5Yz1mdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSA2MTpyZXR1cm4gMTg3O2Nhc2UgNTk6cmV0dXJuIDE4NjtjYXNlIDE3MzpyZXR1cm4gMTg5O2Nhc2UgMjI0OnJldHVybiA5MTtjYXNlIDA6cmV0dXJuIDIyNDsKZGVmYXVsdDpyZXR1cm4gYX19O3ZhciBKPWZ1bmN0aW9uKGEsYil7SS5jYWxsKHRoaXMpO2EmJnpjKHRoaXMsYSxiKX07bihKLEkpO2g9Si5wcm90b3R5cGU7aC5TPW51bGw7aC5uYT1udWxsO2guQ2E9bnVsbDtoLm9hPW51bGw7aC53PS0xO2guRj0tMTtoLnVhPSExOwp2YXIgQWM9ezM6MTMsMTI6MTQ0LDYzMjMyOjM4LDYzMjMzOjQwLDYzMjM0OjM3LDYzMjM1OjM5LDYzMjM2OjExMiw2MzIzNzoxMTMsNjMyMzg6MTE0LDYzMjM5OjExNSw2MzI0MDoxMTYsNjMyNDE6MTE3LDYzMjQyOjExOCw2MzI0MzoxMTksNjMyNDQ6MTIwLDYzMjQ1OjEyMSw2MzI0NjoxMjIsNjMyNDc6MTIzLDYzMjQ4OjQ0LDYzMjcyOjQ2LDYzMjczOjM2LDYzMjc1OjM1LDYzMjc2OjMzLDYzMjc3OjM0LDYzMjg5OjE0NCw2MzMwMjo0NX0sQmM9e1VwOjM4LERvd246NDAsTGVmdDozNyxSaWdodDozOSxFbnRlcjoxMyxGMToxMTIsRjI6MTEzLEYzOjExNCxGNDoxMTUsRjU6MTE2LEY2OjExNyxGNzoxMTgsRjg6MTE5LEY5OjEyMCxGMTA6MTIxLEYxMToxMjIsRjEyOjEyMywiVSswMDdGIjo0NixIb21lOjM2LEVuZDozNSxQYWdlVXA6MzMsUGFnZURvd246MzQsSW5zZXJ0OjQ1fSxDYz0heXx8QSgiNTI1IiksRGM9eiYmeDsKSi5wcm90b3R5cGUuYT1mdW5jdGlvbihhKXtpZih5fHxiYilpZigxNz09dGhpcy53JiYhYS5jdHJsS2V5fHwxOD09dGhpcy53JiYhYS5hbHRLZXl8fHomJjkxPT10aGlzLncmJiFhLm1ldGFLZXkpdGhpcy5GPXRoaXMudz0tMTstMT09dGhpcy53JiYoYS5jdHJsS2V5JiYxNyE9YS5jP3RoaXMudz0xNzphLmFsdEtleSYmMTghPWEuYz90aGlzLnc9MTg6YS5tZXRhS2V5JiY5MSE9YS5jJiYodGhpcy53PTkxKSk7Q2MmJiF4YyhhLmMsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGEuYWx0S2V5LGEubWV0YUtleSk/dGhpcy5oYW5kbGVFdmVudChhKToodGhpcy5GPXdjKGEuYyksRGMmJih0aGlzLnVhPWEuYWx0S2V5KSl9O0oucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dGhpcy5GPXRoaXMudz0tMTt0aGlzLnVhPWEuYWx0S2V5fTsKSi5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5iLGM9Yi5hbHRLZXk7aWYodiYmImtleXByZXNzIj09YS50eXBlKXt2YXIgZD10aGlzLkY7dmFyIGU9MTMhPWQmJjI3IT1kP2Iua2V5Q29kZTowfWVsc2UoeXx8YmIpJiYia2V5cHJlc3MiPT1hLnR5cGU/KGQ9dGhpcy5GLGU9MDw9Yi5jaGFyQ29kZSYmNjMyMzI+Yi5jaGFyQ29kZSYmdmMoZCk/Yi5jaGFyQ29kZTowKTphYiYmIXk/KGQ9dGhpcy5GLGU9dmMoZCk/Yi5rZXlDb2RlOjApOigia2V5cHJlc3MiPT1hLnR5cGU/KERjJiYoYz10aGlzLnVhKSxiLmtleUNvZGU9PWIuY2hhckNvZGU/MzI+Yi5rZXlDb2RlPyhkPWIua2V5Q29kZSxlPTApOihkPXRoaXMuRixlPWIuY2hhckNvZGUpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkseiYmNjM9PWUmJjIyND09ZCYmKGQ9MTkxKSk7dmFyIGY9ZD13YyhkKTtkPzYzMjMyPD0KZCYmZCBpbiBBYz9mPUFjW2RdOjI1PT1kJiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBCYyYmKGY9QmNbYi5rZXlJZGVudGlmaWVyXSk7eCYmQ2MmJiJrZXlwcmVzcyI9PWEudHlwZSYmIXhjKGYsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KXx8KGE9Zj09dGhpcy53LHRoaXMudz1mLGI9bmV3IEVjKGYsZSxhLGIpLGIuYWx0S2V5PWMsdWModGhpcyxiKSl9O0oucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTsKdmFyIHpjPWZ1bmN0aW9uKGEsYixjKXthLm9hJiZGYyhhKTthLlM9YjthLm5hPWJjKGEuUywia2V5cHJlc3MiLGEsYyk7YS5DYT1iYyhhLlMsImtleWRvd24iLGEuYSxjLGEpO2Eub2E9YmMoYS5TLCJrZXl1cCIsYS5iLGMsYSl9LEZjPWZ1bmN0aW9uKGEpe2EubmEmJihrYyhhLm5hKSxrYyhhLkNhKSxrYyhhLm9hKSxhLm5hPW51bGwsYS5DYT1udWxsLGEub2E9bnVsbCk7YS5TPW51bGw7YS53PS0xO2EuRj0tMX07Si5wcm90b3R5cGUudT1mdW5jdGlvbigpe0ouaS51LmNhbGwodGhpcyk7RmModGhpcyl9O3ZhciBFYz1mdW5jdGlvbihhLGIsYyxkKXtHLmNhbGwodGhpcyxkKTt0aGlzLnR5cGU9ImtleSI7dGhpcy5jPWE7dGhpcy5yZXBlYXQ9Y307bihFYyxHKTt2YXIgR2M9eD8iTW96VXNlclNlbGVjdCI6eXx8YmI/IldlYmtpdFVzZXJTZWxlY3QiOm51bGwsSGM9ZnVuY3Rpb24oYSxiKXtiPWI/bnVsbDphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7aWYoR2Mpe3ZhciBjPSJub25lIjthLnN0eWxlJiYoYS5zdHlsZVtHY109Yyk7aWYoYil7YT0wO2Zvcih2YXIgZDtkPWJbYV07YSsrKWQuc3R5bGUmJihkLnN0eWxlW0djXT1jKX19ZWxzZSBpZih2fHxhYilpZihjPSJvbiIsYS5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyksYilmb3IoYT0wO2Q9YlthXTthKyspZC5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyl9O3ZhciBJYz1mdW5jdGlvbigpe307ZGEoSWMpO0ljLnByb3RvdHlwZS5hPTA7dmFyIEs9ZnVuY3Rpb24oYSl7SS5jYWxsKHRoaXMpO3RoaXMuaj1hfHx4YXx8KHhhPW5ldyB1Yik7dGhpcy5xYT1KYzt0aGlzLlk9bnVsbDt0aGlzLm09ITE7dGhpcy5hPW51bGw7dGhpcy5BPXZvaWQgMDt0aGlzLmc9dGhpcy5jPXRoaXMuYj1udWxsO3RoaXMuR2E9ITF9O24oSyxJKTtLLnByb3RvdHlwZS5PYT1JYy5SKCk7CnZhciBKYz1udWxsLEtjPWZ1bmN0aW9uKGEsYil7c3dpdGNoKGEpe2Nhc2UgMTpyZXR1cm4gYj8iZGlzYWJsZSI6ImVuYWJsZSI7Y2FzZSAyOnJldHVybiBiPyJoaWdobGlnaHQiOiJ1bmhpZ2hsaWdodCI7Y2FzZSA0OnJldHVybiBiPyJhY3RpdmF0ZSI6ImRlYWN0aXZhdGUiO2Nhc2UgODpyZXR1cm4gYj8ic2VsZWN0IjoidW5zZWxlY3QiO2Nhc2UgMTY6cmV0dXJuIGI/ImNoZWNrIjoidW5jaGVjayI7Y2FzZSAzMjpyZXR1cm4gYj8iZm9jdXMiOiJibHVyIjtjYXNlIDY0OnJldHVybiBiPyJvcGVuIjoiY2xvc2UifXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBzdGF0ZSIpO30sTGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuWXx8KGEuWT0iOiIrKGEuT2EuYSsrKS50b1N0cmluZygzNikpfSxNYz1mdW5jdGlvbihhLGIpe2lmKGEuYiYmYS5iLmcpe3ZhciBjPWEuYi5nLGQ9YS5ZO2QgaW4gYyYmZGVsZXRlIGNbZF07cWEoYS5iLmcsYixhKX1hLlk9Yn07Sy5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9Owp2YXIgTmM9ZnVuY3Rpb24oYSl7YT1hLmE7cShhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cmV0dXJuIGF9LE9jPWZ1bmN0aW9uKGEpe2EuQXx8KGEuQT1uZXcgb2MoYSkpO3JldHVybiBxKGEuQSl9O0sucHJvdG90eXBlLnJhPWZ1bmN0aW9uKGEpe2lmKHRoaXMuYiYmdGhpcy5iIT1hKXRocm93IEVycm9yKCJNZXRob2Qgbm90IHN1cHBvcnRlZCIpO0suaS5yYS5jYWxsKHRoaXMsYSl9O0sucHJvdG90eXBlLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPW5iKHRoaXMuai5hLCJESVYiKX07CnZhciBQYz1mdW5jdGlvbihhLGIpe2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiJiZhLnhhKGIpKXthLkdhPSEwO3ZhciBjPXFiKGIpO2EuaiYmYS5qLmE9PWN8fChhLmo9Yj9uZXcgdWIocWIoYikpOnhhfHwoeGE9bmV3IHViKSk7YS52YShiKTthLkQoKX1lbHNlIHRocm93IEVycm9yKCJJbnZhbGlkIGVsZW1lbnQgdG8gZGVjb3JhdGUiKTt9O2g9Sy5wcm90b3R5cGU7aC54YT1mdW5jdGlvbigpe3JldHVybiEwfTtoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hfTtoLkQ9ZnVuY3Rpb24oKXt0aGlzLm09ITA7UWModGhpcyxmdW5jdGlvbihhKXshYS5tJiZhLmYoKSYmYS5EKCl9KX07aC5QPWZ1bmN0aW9uKCl7UWModGhpcyxmdW5jdGlvbihhKXthLm0mJmEuUCgpfSk7dGhpcy5BJiZyYyh0aGlzLkEpO3RoaXMubT0hMX07CmgudT1mdW5jdGlvbigpe3RoaXMubSYmdGhpcy5QKCk7dGhpcy5BJiYodGhpcy5BLk4oKSxkZWxldGUgdGhpcy5BKTtRYyh0aGlzLGZ1bmN0aW9uKGEpe2EuTigpfSk7IXRoaXMuR2EmJnRoaXMuYSYmb2IodGhpcy5hKTt0aGlzLmI9dGhpcy5hPXRoaXMuZz10aGlzLmM9bnVsbDtLLmkudS5jYWxsKHRoaXMpfTtoLnNhPWZ1bmN0aW9uKGEsYil7dGhpcy50YShhLFJjKHRoaXMpLGIpfTsKaC50YT1mdW5jdGlvbihhLGIsYyl7cSghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLm0mJihjfHwhdGhpcy5tKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZigwPmJ8fGI+UmModGhpcykpdGhyb3cgRXJyb3IoIkNoaWxkIGNvbXBvbmVudCBpbmRleCBvdXQgb2YgYm91bmRzIik7dGhpcy5nJiZ0aGlzLmN8fCh0aGlzLmc9e30sdGhpcy5jPVtdKTtpZihhLmI9PXRoaXMpe3ZhciBkPUxjKGEpO3RoaXMuZ1tkXT1hO0hhKHRoaXMuYyxhKX1lbHNlIHFhKHRoaXMuZyxMYyhhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuYiYmYS5ZKXt2YXIgZT1hLmI7ZD1hLlk7ZS5nJiZkPyhlPWUuZyxkPShudWxsIT09ZSYmZCBpbiBlP2VbZF06dm9pZCAwKXx8bnVsbCk6ZD1udWxsfWlmKGQmJmEuYiE9dGhpcyl0aHJvdyBFcnJvcigiVW5hYmxlIHRvIHNldCBwYXJlbnQgY29tcG9uZW50Iik7CmEuYj10aGlzO0suaS5yYS5jYWxsKGEsdGhpcyk7TGEodGhpcy5jLGIsMCxhKTtpZihhLm0mJnRoaXMubSYmYS5iPT10aGlzKWM9dGhpcy5qYSgpLGI9Yy5jaGlsZE5vZGVzW2JdfHxudWxsLGIhPWEuZigpJiZjLmluc2VydEJlZm9yZShhLmYoKSxiKTtlbHNlIGlmKGMpe3RoaXMuYXx8dGhpcy5pYSgpO2M9TCh0aGlzLGIrMSk7Yj10aGlzLmphKCk7Yz1jP2MuYTpudWxsO2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTthLmF8fGEuaWEoKTtiP2IuaW5zZXJ0QmVmb3JlKGEuYSxjfHxudWxsKTphLmouYS5ib2R5LmFwcGVuZENoaWxkKGEuYSk7YS5iJiYhYS5iLm18fGEuRCgpfWVsc2UgdGhpcy5tJiYhYS5tJiZhLmEmJmEuYS5wYXJlbnROb2RlJiYxPT1hLmEucGFyZW50Tm9kZS5ub2RlVHlwZSYmYS5EKCl9O2guamE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hfTsKdmFyIFNjPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEucWEpe3ZhciBiPWEubT9hLmE6YS5qLmEuYm9keTthOnt2YXIgYz1xYihiKTtpZihjLmRlZmF1bHRWaWV3JiZjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihjPWMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpKSl7Yz1jLmRpcmVjdGlvbnx8Yy5nZXRQcm9wZXJ0eVZhbHVlKCJkaXJlY3Rpb24iKXx8IiI7YnJlYWsgYX1jPSIifWEucWE9InJ0bCI9PShjfHwoYi5jdXJyZW50U3R5bGU/Yi5jdXJyZW50U3R5bGUuZGlyZWN0aW9uOm51bGwpfHxiLnN0eWxlJiZiLnN0eWxlLmRpcmVjdGlvbil9cmV0dXJuIGEucWF9LFJjPWZ1bmN0aW9uKGEpe3JldHVybiBhLmM/YS5jLmxlbmd0aDowfSxMPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuYz9hLmNbYl18fG51bGw6bnVsbH0sUWM9ZnVuY3Rpb24oYSxiLGMpe2EuYyYmcihhLmMsYixjKX0sVGM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jJiZiP0RhKGEuYyxiKTotMX07dmFyIFZjPWZ1bmN0aW9uKGEsYil7aWYoIWEpdGhyb3cgRXJyb3IoIkludmFsaWQgY2xhc3MgbmFtZSAiK2EpO2lmKCFpYShiKSl0aHJvdyBFcnJvcigiSW52YWxpZCBkZWNvcmF0b3IgZnVuY3Rpb24gIitiKTtVY1thXT1ifSxXYz17fSxVYz17fTt2YXIgWGM9ZnVuY3Rpb24oYSl7dGhpcy5oPWF9O2RhKFhjKTt2YXIgWWM9ZnVuY3Rpb24oYSxiKXthJiYoYS50YWJJbmRleD1iPzA6LTEpfSwkYz1mdW5jdGlvbihhLGIsYyl7Yy5pZCYmTWMoYixjLmlkKTt2YXIgZD1hLmIoKSxlPSExLGY9RChjKTtmJiZyKGYsZnVuY3Rpb24oZyl7Zz09ZD9lPSEwOmcmJnRoaXMuZyhiLGcsZCl9LGEpO2V8fEViKGMsZCk7WmMoYixjKTtyZXR1cm4gY307WGMucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiLGMpe2I9PWMrIi1kaXNhYmxlZCI/YS5aKCExKTpiPT1jKyItaG9yaXpvbnRhbCI/YWQoYSwiaG9yaXpvbnRhbCIpOmI9PWMrIi12ZXJ0aWNhbCImJmFkKGEsInZlcnRpY2FsIil9Owp2YXIgWmM9ZnVuY3Rpb24oYSxiKXtpZihiKWZvcih2YXIgYz1iLmZpcnN0Q2hpbGQsZDtjJiZjLnBhcmVudE5vZGU9PWI7KXtkPWMubmV4dFNpYmxpbmc7aWYoMT09Yy5ub2RlVHlwZSl7YTp7dmFyIGU9YztxKGUpO2U9RChlKTtmb3IodmFyIGY9MCxnPWUubGVuZ3RoO2Y8ZztmKyspe3ZhciBrPWVbZl07aWYoaz1rIGluIFVjP1VjW2tdKCk6bnVsbCl7ZT1rO2JyZWFrIGF9fWU9bnVsbH1lJiYoZS5hPWMsYS5pc0VuYWJsZWQoKXx8ZS5aKCExKSxhLnNhKGUpLFBjKGUsYykpfWVsc2UgYy5ub2RlVmFsdWUmJiIiIT1NYShjLm5vZGVWYWx1ZSl8fGIucmVtb3ZlQ2hpbGQoYyk7Yz1kfX0sYmQ9ZnVuY3Rpb24oYSxiKXtiPWIuZigpO3EoYiwiVGhlIGNvbnRhaW5lciBET00gZWxlbWVudCBjYW5ub3QgYmUgbnVsbC4iKTtIYyhiLHgpO3YmJihiLmhpZGVGb2N1cz0hMCk7KGE9YS5oKSYmdmIoYixhKX07WGMucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKWGMucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5iKCksYz1bYiwiaG9yaXpvbnRhbCI9PWEuSD9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgTT1mdW5jdGlvbigpe30sY2Q7ZGEoTSk7dmFyIGRkPXtidXR0b246InByZXNzZWQiLGNoZWNrYm94OiJjaGVja2VkIixtZW51aXRlbToic2VsZWN0ZWQiLG1lbnVpdGVtY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtcmFkaW86ImNoZWNrZWQiLHJhZGlvOiJjaGVja2VkIix0YWI6InNlbGVjdGVkIix0cmVlaXRlbToic2VsZWN0ZWQifTtNLnByb3RvdHlwZS5oPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLmouYigiRElWIixlZCh0aGlzLGEpLmpvaW4oIiAiKSxhLmJhKX07dmFyIGdkPWZ1bmN0aW9uKGEsYixjKXtpZihhPWEuZj9hLmYoKTphKXt2YXIgZD1bYl07diYmIUEoIjciKSYmKGQ9ZmQoRChhKSxiKSxkLnB1c2goYikpOyhjP0ZiOkhiKShhLGQpfX07Ck0ucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiKXtiLmlkJiZNYyhhLGIuaWQpO2ImJmIuZmlyc3RDaGlsZD9oZChhLGIuZmlyc3RDaGlsZC5uZXh0U2libGluZz9KYShiLmNoaWxkTm9kZXMpOmIuZmlyc3RDaGlsZCk6YS5iYT1udWxsO3ZhciBjPTAsZD10aGlzLmEoKSxlPXRoaXMuYSgpLGY9ITEsZz0hMSxrPSExLHA9SmEoRChiKSk7cihwLGZ1bmN0aW9uKEIpe2Z8fEIhPWQ/Z3x8QiE9ZT9jfD1pZCh0aGlzLEIpOmc9ITA6KGY9ITAsZT09ZCYmKGc9ITApKTsxPT1pZCh0aGlzLEIpJiYoQWEoYiksc2IoYikmJnRiKGIpJiZyYihiLCExKSl9LHRoaXMpO2Eubz1jO2Z8fChwLnB1c2goZCksZT09ZCYmKGc9ITApKTtnfHxwLnB1c2goZSk7KGE9YS53YSkmJnAucHVzaC5hcHBseShwLGEpO2lmKHYmJiFBKCI3Iikpe3ZhciB3PWZkKHApOzA8dy5sZW5ndGgmJihwLnB1c2guYXBwbHkocCx3KSxrPSEwKX1mJiZnJiYhYSYmIWt8fENiKGIscC5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIGpkPWZ1bmN0aW9uKGEsYil7aWYoYT1hLmgoKSl7cShiLCJUaGUgZWxlbWVudCBwYXNzZWQgYXMgYSBmaXJzdCBwYXJhbWV0ZXIgY2Fubm90IGJlIG51bGwuIik7dmFyIGM9Yi5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDthIT1jJiZ2YihiLGEpfX0sa2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYztpZihhLnYmMzImJihjPWEuZigpKSl7aWYoIWImJmEubyYzMil7dHJ5e2MuYmx1cigpfWNhdGNoKGQpe31hLm8mMzImJmEuRmEobnVsbCl9KHNiKGMpJiZ0YihjKSkhPWImJnJiKGMsYil9fSxsZD1mdW5jdGlvbihhLGIsYyl7Y2R8fChjZD17MToiZGlzYWJsZWQiLDg6InNlbGVjdGVkIiwxNjoiY2hlY2tlZCIsNjQ6ImV4cGFuZGVkIn0pO3EoYSwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO2I9Y2RbYl07dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDtkJiYoZD1kZFtkXXx8YixiPSJjaGVja2VkIj09Ynx8InNlbGVjdGVkIj09CmI/ZDpiKTtiJiZ4YihhLGIsYyl9O00ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250cm9sIn07CnZhciBlZD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuYSgpLGQ9W2NdLGU9YS5hKCk7ZSE9YyYmZC5wdXNoKGUpO2M9Yi5vO2ZvcihlPVtdO2M7KXt2YXIgZj1jJi1jO2UucHVzaChtZChhLGYpKTtjJj1+Zn1kLnB1c2guYXBwbHkoZCxlKTsoYT1iLndhKSYmZC5wdXNoLmFwcGx5KGQsYSk7diYmIUEoIjciKSYmZC5wdXNoLmFwcGx5KGQsZmQoZCkpO3JldHVybiBkfSxmZD1mdW5jdGlvbihhLGIpe3ZhciBjPVtdO2ImJihhPUlhKGEsW2JdKSk7cihbXSxmdW5jdGlvbihkKXshRmEoZCxsYShHYSxhKSl8fGImJiFHYShkLGIpfHxjLnB1c2goZC5qb2luKCJfIikpfSk7cmV0dXJuIGN9LG1kPWZ1bmN0aW9uKGEsYil7YS5ifHxuZChhKTtyZXR1cm4gYS5iW2JdfSxpZD1mdW5jdGlvbihhLGIpe2Euanx8KGEuYnx8bmQoYSksYS5qPXNhKGEuYikpO2E9cGFyc2VJbnQoYS5qW2JdLDEwKTtyZXR1cm4gaXNOYU4oYSk/MDphfSxuZD1mdW5jdGlvbihhKXt2YXIgYj1hLmEoKSxjPSF0KGIucmVwbGFjZSgvXHhhMHxccy9nLAoiICIpLCIgIik7cShjLCJDb250cm9sUmVuZGVyZXIgaGFzIGFuIGludmFsaWQgY3NzIGNsYXNzOiAnIitiKyInIik7YS5iPXsxOmIrIi1kaXNhYmxlZCIsMjpiKyItaG92ZXIiLDQ6YisiLWFjdGl2ZSIsODpiKyItc2VsZWN0ZWQiLDE2OmIrIi1jaGVja2VkIiwzMjpiKyItZm9jdXNlZCIsNjQ6YisiLW9wZW4ifX07dmFyIE49ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO2lmKCFiKXtiPXRoaXMuY29uc3RydWN0b3I7Zm9yKHZhciBkO2I7KXtkPWJbamFdfHwoYltqYV09KytrYSk7aWYoZD1XY1tkXSlicmVhaztiPWIuaT9iLmkuY29uc3RydWN0b3I6bnVsbH1iPWQ/aWEoZC5SKT9kLlIoKTpuZXcgZDpudWxsfXRoaXMuQj1iO3RoaXMuYmE9dm9pZCAwIT09YT9hOm51bGx9O24oTixLKTtoPU4ucHJvdG90eXBlO2guYmE9bnVsbDtoLm89MDtoLnY9Mzk7aC5LPTA7aC5JYT0hMDtoLndhPW51bGw7aC55YT0hMDtoLmlhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CLmModGhpcyk7dGhpcy5hPWE7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmeGIoYSwiaGlkZGVuIiwhMCkpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hPXRoaXMuQi5nKHRoaXMsYSk7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5JYT0ibm9uZSIhPWEuc3R5bGUuZGlzcGxheX07CmguRD1mdW5jdGlvbigpe04uaS5ELmNhbGwodGhpcyk7dmFyIGE9TmModGhpcyk7cSh0aGlzKTtxKGEpO3RoaXMuaXNWaXNpYmxlKCl8fHhiKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fGxkKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy52JjgmJmxkKGEsOCwhISh0aGlzLm8mOCkpO3RoaXMudiYxNiYmbGQoYSwxNiwhISh0aGlzLm8mMTYpKTt0aGlzLnYmNjQmJmxkKGEsNjQsISEodGhpcy5vJjY0KSk7YT10aGlzLkI7U2ModGhpcykmJmdkKHRoaXMuZigpLGEuYSgpKyItcnRsIiwhMCk7dGhpcy5pc0VuYWJsZWQoKSYma2QodGhpcyx0aGlzLmlzVmlzaWJsZSgpKTtpZih0aGlzLnYmLTImJih0aGlzLnlhJiZvZCh0aGlzLCEwKSx0aGlzLnYmMzImJihhPXRoaXMuZigpKSkpe3ZhciBiPXRoaXMuV3x8KHRoaXMuVz1uZXcgSik7emMoYixhKTtIKEgoSChPYyh0aGlzKSxiLCJrZXkiLHRoaXMuZmEpLGEsImZvY3VzIix0aGlzLk5hKSxhLCJibHVyIiwKdGhpcy5GYSl9fTt2YXIgb2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYz1PYyhhKSxkPWEuZigpO2I/KEgoSChIKEgoYyxkLEYuTCxhLmthKSxkLFtGLk0sRi5hYV0sYS5sYSksZCwibW91c2VvdmVyIixhLkFhKSxkLCJtb3VzZW91dCIsYS56YSksYS5lYSE9Y2EmJkgoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fEgoYyxkLCJkYmxjbGljayIsYS5KYSksYS5nYXx8KGEuZ2E9bmV3IHBkKGEpLHpiKGEsbGEoQWIsYS5nYSkpKSkpOihxYyhxYyhxYyhxYyhjLGQsRi5MLGEua2EpLGQsW0YuTSxGLmFhXSxhLmxhKSxkLCJtb3VzZW92ZXIiLGEuQWEpLGQsIm1vdXNlb3V0IixhLnphKSxhLmVhIT1jYSYmcWMoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fHFjKGMsZCwiZGJsY2xpY2siLGEuSmEpLEFiKGEuZ2EpLGEuZ2E9bnVsbCkpfTsKTi5wcm90b3R5cGUuUD1mdW5jdGlvbigpe04uaS5QLmNhbGwodGhpcyk7dGhpcy5XJiZGYyh0aGlzLlcpO3RoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJmtkKHRoaXMsITEpfTtOLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7Ti5pLnUuY2FsbCh0aGlzKTt0aGlzLlcmJih0aGlzLlcuTigpLGRlbGV0ZSB0aGlzLlcpO2RlbGV0ZSB0aGlzLkI7dGhpcy5nYT10aGlzLndhPXRoaXMuYmE9bnVsbH07dmFyIGhkPWZ1bmN0aW9uKGEsYil7YS5iYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm8mMSl9OwpOLnByb3RvdHlwZS5aPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYjtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0VuYWJsZWQmJiFiLmlzRW5hYmxlZCgpfHwhTyh0aGlzLDEsIWEpfHwoYXx8KHFkKHRoaXMsITEpLFAodGhpcywhMSkpLHRoaXMuaXNWaXNpYmxlKCkmJmtkKHRoaXMsYSksUSh0aGlzLDEsIWEsITApKX07CnZhciBQPWZ1bmN0aW9uKGEsYil7TyhhLDIsYikmJlEoYSwyLGIpfSxxZD1mdW5jdGlvbihhLGIpe08oYSw0LGIpJiZRKGEsNCxiKX0scmQ9ZnVuY3Rpb24oYSxiKXtPKGEsOCxiKSYmUShhLDgsYil9LHNkPWZ1bmN0aW9uKGEsYil7TyhhLDY0LGIpJiZRKGEsNjQsYil9LFE9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIWQmJjE9PWIpYS5aKCFjKTtlbHNlIGlmKGEudiZiJiZjIT0hIShhLm8mYikpe3ZhciBlPWEuQjtpZihkPWEuZigpKShlPW1kKGUsYikpJiZnZChhLGUsYyksbGQoZCxiLGMpO2Eubz1jP2Eub3xiOmEubyZ+Yn19LHRkPWZ1bmN0aW9uKGEsYixjKXtpZihhLm0mJmEubyZiJiYhYyl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTshYyYmYS5vJmImJlEoYSxiLCExKTthLnY9Yz9hLnZ8YjphLnYmfmJ9LFI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hISgyNTUmYikmJiEhKGEudiZiKX0sTz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuISEoYS52JmIpJiYhIShhLm8mCmIpIT1jJiYoIShhLksmYil8fHVjKGEsS2MoYixjKSkpJiYhYS5VfTtoPU4ucHJvdG90eXBlO2guQWE9ZnVuY3Rpb24oYSl7KCFhLnJlbGF0ZWRUYXJnZXR8fCFwYih0aGlzLmYoKSxhLnJlbGF0ZWRUYXJnZXQpKSYmdWModGhpcywiZW50ZXIiKSYmdGhpcy5pc0VuYWJsZWQoKSYmUih0aGlzLDIpJiZQKHRoaXMsITApfTtoLnphPWZ1bmN0aW9uKGEpe2EucmVsYXRlZFRhcmdldCYmcGIodGhpcy5mKCksYS5yZWxhdGVkVGFyZ2V0KXx8IXVjKHRoaXMsImxlYXZlIil8fChSKHRoaXMsNCkmJnFkKHRoaXMsITEpLFIodGhpcywyKSYmUCh0aGlzLCExKSl9O2guZWE9Y2E7Cmgua2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSxPYihhKSYmISh5JiZ6JiZhLmN0cmxLZXkpKSl7Uih0aGlzLDQpJiZxZCh0aGlzLCEwKTt2YXIgYjtpZihiPXRoaXMuQil7dmFyIGM7Yj10aGlzLnYmMzImJihjPXRoaXMuZigpKT9zYihjKSYmdGIoYyk6ITF9YiYmdGhpcy5mKCkuZm9jdXMoKX0hT2IoYSl8fHkmJnomJmEuY3RybEtleXx8YS5nKCl9O2gubGE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSx0aGlzLm8mNCYmdWQodGhpcyxhKSYmUih0aGlzLDQpJiZxZCh0aGlzLCExKSl9O2guSmE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmdWQodGhpcyxhKX07CnZhciB1ZD1mdW5jdGlvbihhLGIpe2lmKFIoYSwxNikpe3ZhciBjPSEoYS5vJjE2KTtPKGEsMTYsYykmJlEoYSwxNixjKX1SKGEsOCkmJnJkKGEsITApO1IoYSw2NCkmJnNkKGEsIShhLm8mNjQpKTtjPW5ldyBFKCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuQT1iLkEpO3JldHVybiB1YyhhLGMpfTtOLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe1IodGhpcywzMikmJk8odGhpcywzMiwhMCkmJlEodGhpcywzMiwhMCl9O04ucHJvdG90eXBlLkZhPWZ1bmN0aW9uKCl7Uih0aGlzLDQpJiZxZCh0aGlzLCExKTtSKHRoaXMsMzIpJiZPKHRoaXMsMzIsITEpJiZRKHRoaXMsMzIsITEpfTsKTi5wcm90b3R5cGUuZmE9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJjEzPT1hLmMmJnVkKHRoaXMsYSk/KGEuZygpLGEuaigpLCEwKTohMX07aWYoIWlhKE4pKXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBjbGFzcyAiK04pO2lmKCFpYShNKSl0aHJvdyBFcnJvcigiSW52YWxpZCByZW5kZXJlciBjbGFzcyAiK00pO3ZhciB2ZD1OW2phXXx8KE5bamFdPSsra2EpO1djW3ZkXT1NO1ZjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIHBkPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9ITE7dGhpcy5jPW5ldyBvYyh0aGlzKTt6Yih0aGlzLGxhKEFiLHRoaXMuYykpO2E9TmModGhpcy5iKTtIKEgoSCh0aGlzLmMsYSxGLkwsdGhpcy5oKSxhLEYuTSx0aGlzLmopLGEsImNsaWNrIix0aGlzLmcpfTtuKHBkLEMpO3ZhciB3ZD0hdnx8OTw9TnVtYmVyKGliKTsKcGQucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXt0aGlzLmE9ITF9O3BkLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7dGhpcy5hPSEwfTt2YXIgeGQ9ZnVuY3Rpb24oYSxiKXtpZighd2QpcmV0dXJuIGEuYnV0dG9uPTAsYS50eXBlPWIsYTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudHMiKTtjLmluaXRNb3VzZUV2ZW50KGIsYS5idWJibGVzLGEuY2FuY2VsYWJsZSxhLnZpZXd8fG51bGwsYS5kZXRhaWwsYS5zY3JlZW5YLGEuc2NyZWVuWSxhLmNsaWVudFgsYS5jbGllbnRZLGEuY3RybEtleSxhLmFsdEtleSxhLnNoaWZ0S2V5LGEubWV0YUtleSwwLGEucmVsYXRlZFRhcmdldHx8bnVsbCk7cmV0dXJuIGN9OwpwZC5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXtpZih0aGlzLmEpdGhpcy5hPSExO2Vsc2V7dmFyIGI9YS5iLGM9Yi5idXR0b24sZD1iLnR5cGUsZT14ZChiLCJtb3VzZWRvd24iKTt0aGlzLmIua2EobmV3IEcoZSxhLmEpKTtlPXhkKGIsIm1vdXNldXAiKTt0aGlzLmIubGEobmV3IEcoZSxhLmEpKTt3ZHx8KGIuYnV0dG9uPWMsYi50eXBlPWQpfX07cGQucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt0aGlzLmI9bnVsbDtwZC5pLnUuY2FsbCh0aGlzKX07dmFyIFM9ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO3RoaXMuZGE9Ynx8WGMuUigpO3RoaXMuSD1hfHwidmVydGljYWwifTtuKFMsSyk7aD1TLnByb3RvdHlwZTtoLkRhPW51bGw7aC5jYT1udWxsO2guZGE9bnVsbDtoLkg9bnVsbDtoLlQ9ITA7aC5PPSEwO2gubD0tMTtoLnM9bnVsbDtoLlY9ITE7aC5JPW51bGw7dmFyIHlkPWZ1bmN0aW9uKGEpe3JldHVybiBhLkRhfHxhLmYoKX07aD1TLnByb3RvdHlwZTtoLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPXRoaXMuai5iKCJESVYiLHRoaXMuZGEuYyh0aGlzKS5qb2luKCIgIikpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKGEpe3JldHVybiJESVYiPT1hLnRhZ05hbWV9O2gudmE9ZnVuY3Rpb24oYSl7dGhpcy5hPSRjKHRoaXMuZGEsdGhpcyxhKTsibm9uZSI9PWEuc3R5bGUuZGlzcGxheSYmKHRoaXMuVD0hMSl9OwpoLkQ9ZnVuY3Rpb24oKXtTLmkuRC5jYWxsKHRoaXMpO1FjKHRoaXMsZnVuY3Rpb24oYil7Yi5tJiZ6ZCh0aGlzLGIpfSx0aGlzKTt2YXIgYT10aGlzLmYoKTtiZCh0aGlzLmRhLHRoaXMpO0FkKHRoaXMsdGhpcy5UKTtIKEgoSChIKEgoSChIKEgoT2ModGhpcyksdGhpcywiZW50ZXIiLHRoaXMuV2EpLHRoaXMsImhpZ2hsaWdodCIsdGhpcy5YYSksdGhpcywidW5oaWdobGlnaHQiLHRoaXMuY2IpLHRoaXMsIm9wZW4iLHRoaXMuWWEpLHRoaXMsImNsb3NlIix0aGlzLlVhKSxhLEYuTCx0aGlzLlNhKSxxYihhKSxbRi5NLEYuYWFdLHRoaXMuVmEpLGEsW0YuTCxGLk0sRi5hYSwibW91c2VvdmVyIiwibW91c2VvdXQiLCJjb250ZXh0bWVudSJdLHRoaXMuVGEpO0JkKHRoaXMpfTt2YXIgQmQ9ZnVuY3Rpb24oYSl7dmFyIGI9T2MoYSksYz15ZChhKTtIKEgoSChiLGMsImZvY3VzIixhLkhhKSxjLCJibHVyIixhLlFhKSxhLmNhfHwoYS5jYT1uZXcgSih5ZChhKSkpLCJrZXkiLGEuUmEpfTtoPVMucHJvdG90eXBlOwpoLlA9ZnVuY3Rpb24oKXtDZCh0aGlzLC0xKTt0aGlzLnMmJnNkKHRoaXMucywhMSk7dGhpcy5WPSExO1MuaS5QLmNhbGwodGhpcyl9O2gudT1mdW5jdGlvbigpe1MuaS51LmNhbGwodGhpcyk7dGhpcy5jYSYmKHRoaXMuY2EuTigpLHRoaXMuY2E9bnVsbCk7dGhpcy5kYT10aGlzLnM9dGhpcy5JPXRoaXMuRGE9bnVsbH07aC5XYT1mdW5jdGlvbigpe3JldHVybiEwfTsKaC5YYT1mdW5jdGlvbihhKXt2YXIgYj1UYyh0aGlzLGEudGFyZ2V0KTtpZigtMTxiJiZiIT10aGlzLmwpe3ZhciBjPUwodGhpcyx0aGlzLmwpO2MmJlAoYywhMSk7dGhpcy5sPWI7Yz1MKHRoaXMsdGhpcy5sKTt0aGlzLlYmJnFkKGMsITApO3RoaXMucyYmYyE9dGhpcy5zJiYoYy52JjY0P3NkKGMsITApOnNkKHRoaXMucywhMSkpfWI9dGhpcy5mKCk7cShiLCJUaGUgRE9NIGVsZW1lbnQgZm9yIHRoZSBjb250YWluZXIgY2Fubm90IGJlIG51bGwuIik7bnVsbCE9YS50YXJnZXQuZigpJiZ4YihiLCJhY3RpdmVkZXNjZW5kYW50IixhLnRhcmdldC5mKCkuaWQpfTtoLmNiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT1MKHRoaXMsdGhpcy5sKSYmKHRoaXMubD0tMSk7YT10aGlzLmYoKTtxKGEsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnJlbW92ZUF0dHJpYnV0ZSh3YigiYWN0aXZlZGVzY2VuZGFudCIpKX07CmguWWE9ZnVuY3Rpb24oYSl7KGE9YS50YXJnZXQpJiZhIT10aGlzLnMmJmEuYj09dGhpcyYmKHRoaXMucyYmc2QodGhpcy5zLCExKSx0aGlzLnM9YSl9O2guVWE9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMucyYmKHRoaXMucz1udWxsKTt2YXIgYj10aGlzLmYoKSxjPWEudGFyZ2V0LmYoKTtiJiZhLnRhcmdldC5vJjImJmMmJihhPSIiLGMmJihhPWMuaWQscShhLCJUaGUgYWN0aXZlIGVsZW1lbnQgc2hvdWxkIGhhdmUgYW4gaWQuIikpLHhiKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEpKX07aC5TYT1mdW5jdGlvbihhKXt0aGlzLk8mJih0aGlzLlY9ITApO3ZhciBiPXlkKHRoaXMpO2ImJnNiKGIpJiZ0YihiKT9iLmZvY3VzKCk6YS5nKCl9O2guVmE9ZnVuY3Rpb24oKXt0aGlzLlY9ITF9OwpoLlRhPWZ1bmN0aW9uKGEpe2E6e3ZhciBiPWEudGFyZ2V0O2lmKHRoaXMuSSlmb3IodmFyIGM9dGhpcy5mKCk7YiYmYiE9PWM7KXt2YXIgZD1iLmlkO2lmKGQgaW4gdGhpcy5JKXtiPXRoaXMuSVtkXTticmVhayBhfWI9Yi5wYXJlbnROb2RlfWI9bnVsbH1pZihiKXN3aXRjaChhLnR5cGUpe2Nhc2UgRi5MOmIua2EoYSk7YnJlYWs7Y2FzZSBGLk06Y2FzZSBGLmFhOmIubGEoYSk7YnJlYWs7Y2FzZSAibW91c2VvdmVyIjpiLkFhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3V0IjpiLnphKGEpO2JyZWFrO2Nhc2UgImNvbnRleHRtZW51IjpiLmVhKGEpfX07aC5IYT1mdW5jdGlvbigpe307aC5RYT1mdW5jdGlvbigpe0NkKHRoaXMsLTEpO3RoaXMuVj0hMTt0aGlzLnMmJnNkKHRoaXMucywhMSl9OwpoLlJhPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmlzRW5hYmxlZCgpJiZ0aGlzLmlzVmlzaWJsZSgpJiYoMCE9UmModGhpcyl8fHRoaXMuRGEpJiZEZCh0aGlzLGEpPyhhLmcoKSxhLmooKSwhMCk6ITF9Owp2YXIgRGQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1MKGEsYS5sKTtpZihjJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5mYSYmYy5mYShiKXx8YS5zJiZhLnMhPWMmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLnMuZmEmJmEucy5mYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuYyl7Y2FzZSAyNzp5ZChhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpFZChhKTticmVhaztjYXNlIDM1OkZkKGEpO2JyZWFrO2Nhc2UgMzg6aWYoInZlcnRpY2FsIj09YS5IKUdkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9IZChhKTpHZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoInZlcnRpY2FsIj09YS5IKUhkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9HZChhKTpIZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSx6ZD1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZigpO2M9Yy5pZHx8KGMuaWQ9TGMoYikpO2EuSXx8KGEuST17fSk7YS5JW2NdPWJ9O1MucHJvdG90eXBlLnNhPWZ1bmN0aW9uKGEsYil7Q2EoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtTLmkuc2EuY2FsbCh0aGlzLGEsYil9O1MucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEsYixjKXtDYShhLE4pO2EuS3w9MjthLkt8PTY0O3RkKGEsMzIsITEpO2EubSYmMCE9YS55YSYmb2QoYSwhMSk7YS55YT0hMTt2YXIgZD1hLmI9PXRoaXM/VGModGhpcyxhKTotMTtTLmkudGEuY2FsbCh0aGlzLGEsYixjKTthLm0mJnRoaXMubSYmemQodGhpcyxhKTthPWQ7LTE9PWEmJihhPVJjKHRoaXMpKTthPT10aGlzLmw/dGhpcy5sPU1hdGgubWluKFJjKHRoaXMpLTEsYik6YT50aGlzLmwmJmI8PXRoaXMubD90aGlzLmwrKzphPHRoaXMubCYmYj50aGlzLmwmJnRoaXMubC0tfTsKdmFyIGFkPWZ1bmN0aW9uKGEsYil7aWYoYS5mKCkpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5IPWJ9O1MucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O3ZhciBBZD1mdW5jdGlvbihhLGIpe2EuVD1iO3ZhciBjPWEuZigpO2MmJihjLnN0eWxlLmRpc3BsYXk9Yj8iIjoibm9uZSIsWWMoeWQoYSksYS5PJiZhLlQpKX07Uy5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT307Uy5wcm90b3R5cGUuWj1mdW5jdGlvbihhKXt0aGlzLk8hPWEmJnVjKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5PPSEwLFFjKHRoaXMsZnVuY3Rpb24oYil7Yi5MYT9kZWxldGUgYi5MYTpiLlooITApfSkpOihRYyh0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5aKCExKTpiLkxhPSEwfSksdGhpcy5WPXRoaXMuTz0hMSksWWMoeWQodGhpcyksYSYmdGhpcy5UKSl9Owp2YXIgQ2Q9ZnVuY3Rpb24oYSxiKXsoYj1MKGEsYikpP1AoYiwhMCk6LTE8YS5sJiZQKEwoYSxhLmwpLCExKX0sRWQ9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LFJjKGEpLTEpfSxGZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiAwPmI/Yy0xOmJ9LDApfSxIZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7cmV0dXJuKGIrMSklY30sYS5sKX0sR2Q9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe2ItLTtyZXR1cm4gMD5iP2MtMTpifSxhLmwpfSxJZD1mdW5jdGlvbihhLGIsYyl7Yz0wPmM/VGMoYSxhLnMpOmM7dmFyIGQ9UmMoYSk7Yz1iLmNhbGwoYSxjLGQpO2Zvcih2YXIgZT0wO2U8PWQ7KXt2YXIgZj1MKGEsYyksZztpZihnPWYpZz1mLmlzVmlzaWJsZSgpJiZmLmlzRW5hYmxlZCgpJiYhIShmLnYmMik7aWYoZyl7YS5FYShjKTticmVha31lKys7Yz1iLmNhbGwoYSxjLGQpfX07ClMucHJvdG90eXBlLkVhPWZ1bmN0aW9uKGEpe0NkKHRoaXMsYSl9O3ZhciBUPWZ1bmN0aW9uKCl7fTtuKFQsTSk7ZGEoVCk7VC5wcm90b3R5cGUuYT1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYiJ9O1QucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXtyZXR1cm4idGFiIn07VC5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYj1ULmkuYy5jYWxsKHRoaXMsYSk7KGE9YS5QYSkmJmImJihiLnRpdGxlPWF8fCIiKTtyZXR1cm4gYn07VC5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIpe2I9VC5pLmcuY2FsbCh0aGlzLGEsYik7dmFyIGM9Yi50aXRsZXx8IiI7YyYmKGEuUGE9Yyk7YS5vJjgmJihjPWEuYikmJmlhKGMuRykmJihRKGEsOCwhMSksYy5HKGEpKTtyZXR1cm4gYn07dmFyIEpkPWZ1bmN0aW9uKGEsYixjKXtOLmNhbGwodGhpcyxhLGJ8fFQuUigpLGMpO3RkKHRoaXMsOCwhMCk7dGhpcy5LfD05fTtuKEpkLE4pO1ZjKCJnb29nLXRhYiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEpkKG51bGwpfSk7dmFyIFU9ZnVuY3Rpb24oKXt0aGlzLmg9InRhYmxpc3QifTtuKFUsWGMpO2RhKFUpO1UucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWItYmFyIn07VS5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIsYyl7dGhpcy5qfHwodGhpcy5hfHxLZCh0aGlzKSx0aGlzLmo9c2EodGhpcy5hKSk7dmFyIGQ9dGhpcy5qW2JdO2Q/KGFkKGEsTGQoZCkpLGEuQj1kKTpVLmkuZy5jYWxsKHRoaXMsYSxiLGMpfTtVLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPVUuaS5jLmNhbGwodGhpcyxhKTt0aGlzLmF8fEtkKHRoaXMpO2IucHVzaCh0aGlzLmFbYS5CXSk7cmV0dXJuIGJ9O3ZhciBLZD1mdW5jdGlvbihhKXt2YXIgYj1hLmIoKTthLmE9e3RvcDpiKyItdG9wIixib3R0b206YisiLWJvdHRvbSIsc3RhcnQ6YisiLXN0YXJ0IixlbmQ6YisiLWVuZCJ9fTt2YXIgVj1mdW5jdGlvbihhLGIsYyl7YT1hfHwidG9wIjthZCh0aGlzLExkKGEpKTt0aGlzLkI9YTtTLmNhbGwodGhpcyx0aGlzLkgsYnx8VS5SKCksYyk7TWQodGhpcyl9O24oVixTKTtoPVYucHJvdG90eXBlO2guQz1udWxsO2guRD1mdW5jdGlvbigpe1YuaS5ELmNhbGwodGhpcyk7TWQodGhpcyl9O2gudT1mdW5jdGlvbigpe1YuaS51LmNhbGwodGhpcyk7dGhpcy5DPW51bGx9O2guRWE9ZnVuY3Rpb24oYSl7Vi5pLkVhLmNhbGwodGhpcyxhKTt0aGlzLkcoTCh0aGlzLGEpKX07aC5HPWZ1bmN0aW9uKGEpe2E/cmQoYSwhMCk6dGhpcy5DJiZyZCh0aGlzLkMsITEpfTsKdmFyIE5kPWZ1bmN0aW9uKGEsYil7aWYoYiYmYj09YS5DKXtmb3IodmFyIGM9VGMoYSxiKSxkPWMtMTtiPUwoYSxkKTtkLS0pe3ZhciBlPWI7aWYoZS5pc1Zpc2libGUoKSYmZS5pc0VuYWJsZWQoKSl7YS5HKGIpO3JldHVybn19Zm9yKGMrPTE7Yj1MKGEsYyk7YysrKWlmKGQ9YixkLmlzVmlzaWJsZSgpJiZkLmlzRW5hYmxlZCgpKXthLkcoYik7cmV0dXJufWEuRyhudWxsKX19O2g9Vi5wcm90b3R5cGU7aC5hYj1mdW5jdGlvbihhKXt0aGlzLkMmJnRoaXMuQyE9YS50YXJnZXQmJnJkKHRoaXMuQywhMSk7dGhpcy5DPWEudGFyZ2V0fTtoLmJiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT10aGlzLkMmJih0aGlzLkM9bnVsbCl9O2guWmE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guJGE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guSGE9ZnVuY3Rpb24oKXtMKHRoaXMsdGhpcy5sKXx8Q2QodGhpcyxUYyh0aGlzLHRoaXMuQ3x8TCh0aGlzLDApKSl9Owp2YXIgTWQ9ZnVuY3Rpb24oYSl7SChIKEgoSChPYyhhKSxhLCJzZWxlY3QiLGEuYWIpLGEsInVuc2VsZWN0IixhLmJiKSxhLCJkaXNhYmxlIixhLlphKSxhLCJoaWRlIixhLiRhKX0sTGQ9ZnVuY3Rpb24oYSl7cmV0dXJuInN0YXJ0Ij09YXx8ImVuZCI9PWE/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O1ZjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBWfSk7ZnVuY3Rpb24gT2QoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIFBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgZz1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIrZyk7Zm9yKHZhciBrPVtdLHA9YmEoYyksdz1wLm5leHQoKTshdy5kb25lO3c9cC5uZXh0KCkpe3c9dy52YWx1ZTt2YXIgQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKQi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO0IudGV4dENvbnRlbnQ9dztmLmFwcGVuZENoaWxkKEIpO2sucHVzaChCKX0iYm90dG9tIiE9ZyYmZS5hcHBlbmRDaGlsZChmKTtwPW51bGw7aWYoInRvcCI9PWd8fCJib3R0b20iPT1nKXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTsidG9wIj09ZyYmcCYmZS5hcHBlbmRDaGlsZChwKTtCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0IuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciByYT1bXTtjPWJhKGMpO2Zvcih3PWMubmV4dCgpOyF3LmRvbmU7dz1jLm5leHQoKSl3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHcuaWQ9ZS5pZCsiX2NvbnRlbnRfIityYS5sZW5ndGgsdy5zdHlsZS5kaXNwbGF5PSJub25lIixCLmFwcGVuZENoaWxkKHcpLHJhLnB1c2godyk7ZS5hcHBlbmRDaGlsZChCKTsiYm90dG9tIj09ZyYmKHAmJgplLmFwcGVuZENoaWxkKHApLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBYPW5ldyBWKGcpO1BjKFgsZik7dmFyIFk9LTE7ZGMoWCwic2VsZWN0IixmdW5jdGlvbihaKXtaPWsuaW5kZXhPZihaLnRhcmdldC5mKCkpO1ohPVkmJigwPD1ZJiZZPHJhLmxlbmd0aCYmKHJhW1ldLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFk9LTEpLDA8PVomJlo8cmEubGVuZ3RoJiYoWT1aLHJhW1ldLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksWC5HKEwoWCxZKSkpfSk7WC5HKEwoWCxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFope1guRyhMKFgsWikpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChPZChhKSl9LFFkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sVz1sOwpRZFswXWluIFd8fCJ1bmRlZmluZWQiPT10eXBlb2YgVy5leGVjU2NyaXB0fHxXLmV4ZWNTY3JpcHQoInZhciAiK1FkWzBdKTtmb3IodmFyIFJkO1FkLmxlbmd0aCYmKFJkPVFkLnNoaWZ0KCkpOylRZC5sZW5ndGh8fHZvaWQgMD09PVBkP1dbUmRdJiZXW1JkXSE9PU9iamVjdC5wcm90b3R5cGVbUmRdP1c9V1tSZF06Vz1XW1JkXT17fTpXW1JkXT1QZDt9KS5jYWxsKHRoaXMpOwovLyBjbGFuZy1mb3JtYXQgb24K", + "headers": [ + [ + "content-type", + "application/javascript" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + } + } + }, + "executionInfo": { + "elapsed": 1689, + "status": "ok", + "timestamp": 1600709853778, + "user": { + "displayName": "Evgeny Skvortsov", + "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhiQjODaOVLfYnUuWS9rB3LRntzJDM0hqElzsUkdQ=s64", + "userId": "11510585406840398626" + }, + "user_tz": 420 + }, + "id": "H1HUmd-mb9MW", + "outputId": "0e1b2c47-064d-4c8a-cdc8-ebe9b887d348" + }, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id71" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id71" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id71" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"20ce5222-fc31-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id71\", \"tabNames\": [\"Test\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_faa63b5839" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id71" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"20ced4cc-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id71\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_2c1b3c668a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id71" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"20d018dc-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b9961976f3" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_1", + "outputarea_id71" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"20d05a40-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id71_content_1\");\n", + "//# sourceURL=js_09c3b456c0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_1", + "outputarea_id71" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"20d0a89c-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"20d05a40-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_03ac680a0e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_1", + "outputarea_id71" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"20d0f2b6-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id71\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_06913d1b28" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_1", + "outputarea_id71" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running Test\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"20d5aeaa-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"20d018dc-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_65fa747246" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_1", + "outputarea_id71" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"20d74878-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_1b384ff7bd" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_0", + "outputarea_id71" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"20d79238-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id71_content_0\");\n", + "//# sourceURL=js_0826a2d0f0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_0", + "outputarea_id71" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"20d7de64-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"20d79238-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_a62af3dd2b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_0", + "outputarea_id71" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"20d840d4-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id71\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_18af28cc0b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_0", + "outputarea_id71" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_0", + "outputarea_id71", + "outputarea_id72", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_0", + "outputarea_id71", + "outputarea_id72", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_0", + "outputarea_id71", + "outputarea_id72", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"20da0360-fc31-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id72\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_9be1f976e1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_0", + "outputarea_id71", + "outputarea_id72", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"20da5536-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id72\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_cf930a7782" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_0", + "outputarea_id71", + "outputarea_id72", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"20db95c2-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_4bd7127161" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_0", + "id72_content_0", + "outputarea_id71", + "outputarea_id72", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"20dbdeec-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id72_content_0\");\n", + "//# sourceURL=js_70b0bdd5e4" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_0", + "id72_content_0", + "outputarea_id71", + "outputarea_id72", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"20dc2eec-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"20dbdeec-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_550c254bf0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_0", + "id72_content_0", + "outputarea_id71", + "outputarea_id72", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"20dc74ce-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id72\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_e187245e29" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_0", + "id72_content_0", + "outputarea_id71", + "outputarea_id72", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mTest_sql\u001b[0m variable.\n", + "SELECT\n", + " x_2 AS x,\n", + " (((((POW(x_2, 2))) - (((2) * (x_2))))) + (1)) AS y\n", + "FROM\n", + " UNNEST([0, 0.5, 1.0, 1.5, 2.0]) as x_2;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"20dd9110-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"20db95c2-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_4f9196032b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_0", + "id72_content_0", + "outputarea_id71", + "outputarea_id72", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"20ded49e-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"20d74878-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_063ff8f96c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_0", + "outputarea_id71" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"20e05b66-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_20f53f10d8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_1", + "outputarea_id71" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"20e0a8e6-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id71_content_1\");\n", + "//# sourceURL=js_81cf969699" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_1", + "outputarea_id71" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"20e0f3e6-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"20e0a8e6-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_9dc422b78f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_1", + "outputarea_id71" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"20e13e0a-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id71\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_8f613148c1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_1", + "outputarea_id71" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"21614712-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"20e05b66-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_9c391199be" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_1", + "outputarea_id71" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2164362a-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_462ac622bc" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_0", + "outputarea_id71" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2164b2b2-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id71_content_0\");\n", + "//# sourceURL=js_85347d1e29" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_0", + "outputarea_id71" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"21652fd0-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2164b2b2-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_be90a3b946" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_0", + "outputarea_id71" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2165ad2a-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id71\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_a91cc02a32" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_0", + "outputarea_id71" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"21676eb2-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_dfe0c6e8d0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_0", + "id72_content_1", + "outputarea_id71", + "outputarea_id72", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2167c97a-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id72_content_1\");\n", + "//# sourceURL=js_6171e629d7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_0", + "id72_content_1", + "outputarea_id71", + "outputarea_id72", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2168435a-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2167c97a-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_57836a1f8a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_0", + "id72_content_1", + "outputarea_id71", + "outputarea_id72", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2168949a-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id72\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_07378211da" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_0", + "id72_content_1", + "outputarea_id71", + "outputarea_id72", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mTest\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
xy
00.01.00
10.50.25
21.00.00
31.50.25
42.01.00
\n", + "
" + ], + "text/plain": [ + " x y\n", + "0 0.0 1.00\n", + "1 0.5 0.25\n", + "2 1.0 0.00\n", + "3 1.5 0.25\n", + "4 2.0 1.00" + ] + }, + "metadata": { + "tags": [ + "id71_content_0", + "id72_content_1", + "outputarea_id71", + "outputarea_id72", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"216d1880-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"21676eb2-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_0c2c4bac1f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_0", + "id72_content_1", + "outputarea_id71", + "outputarea_id72", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"216eda76-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2164362a-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_3a0d24d0aa" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id71_content_0", + "outputarea_id71" + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "%%logica Test\n", + "\n", + "F(x:, y:) :- y == x ^ 2 - 2 * x + 1;\n", + "\n", + "Test(x:, y:) :- x in [0, 0.5, 1.0, 1.5, 2.0], F(x:, y:);" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 301, + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH0=", + "headers": [ + [ + "content-type", + "text/css" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgaCxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9ZnVuY3Rpb24oYSl7dmFyIGI9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmYVtTeW1ib2wuaXRlcmF0b3JdO3JldHVybiBiP2IuY2FsbChhKTp7bmV4dDphYShhKX19LGw9dGhpc3x8c2VsZixjYT1mdW5jdGlvbigpe30sZGE9ZnVuY3Rpb24oYSl7YS5CYT12b2lkIDA7YS5SPWZ1bmN0aW9uKCl7cmV0dXJuIGEuQmE/YS5CYTphLkJhPW5ldyBhfX0sZWE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7aWYoIm9iamVjdCI9PWIpaWYoYSl7aWYoYSBpbnN0YW5jZW9mIEFycmF5KXJldHVybiJhcnJheSI7aWYoYSBpbnN0YW5jZW9mIE9iamVjdClyZXR1cm4gYjt2YXIgYz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk7aWYoIltvYmplY3QgV2luZG93XSI9PWMpcmV0dXJuIm9iamVjdCI7CmlmKCJbb2JqZWN0IEFycmF5XSI9PWN8fCJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGgmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5zcGxpY2UmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoInNwbGljZSIpKXJldHVybiJhcnJheSI7aWYoIltvYmplY3QgRnVuY3Rpb25dIj09Y3x8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmNhbGwmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoImNhbGwiKSlyZXR1cm4iZnVuY3Rpb24ifWVsc2UgcmV0dXJuIm51bGwiO2Vsc2UgaWYoImZ1bmN0aW9uIj09YiYmInVuZGVmaW5lZCI9PXR5cGVvZiBhLmNhbGwpcmV0dXJuIm9iamVjdCI7cmV0dXJuIGJ9LGZhPWZ1bmN0aW9uKGEpe3JldHVybiJhcnJheSI9PWVhKGEpfSxoYT1mdW5jdGlvbihhKXt2YXIgYj1lYShhKTtyZXR1cm4iYXJyYXkiPT1ifHwib2JqZWN0Ij09CmImJiJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGh9LGlhPWZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PWVhKGEpfSxtPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBhO3JldHVybiJvYmplY3QiPT1iJiZudWxsIT1hfHwiZnVuY3Rpb24iPT1ifSxqYT0iY2xvc3VyZV91aWRfIisoMUU5Kk1hdGgucmFuZG9tKCk+Pj4wKSxrYT0wLGxhPWZ1bmN0aW9uKGEsYil7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe3ZhciBkPWMuc2xpY2UoKTtkLnB1c2guYXBwbHkoZCxhcmd1bWVudHMpO3JldHVybiBhLmFwcGx5KHRoaXMsZCl9fSxuPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe31jLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLmk9Yi5wcm90b3R5cGU7YS5wcm90b3R5cGU9bmV3IGM7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YX07dmFyIG1hLG5hPXtlYjoiYWN0aXZlZGVzY2VuZGFudCIsamI6ImF0b21pYyIsa2I6ImF1dG9jb21wbGV0ZSIsbWI6ImJ1c3kiLHBiOiJjaGVja2VkIixxYjoiY29saW5kZXgiLHZiOiJjb250cm9scyIseGI6ImRlc2NyaWJlZGJ5IixBYjoiZGlzYWJsZWQiLENiOiJkcm9wZWZmZWN0IixEYjoiZXhwYW5kZWQiLEViOiJmbG93dG8iLEdiOiJncmFiYmVkIixLYjoiaGFzcG9wdXAiLE1iOiJoaWRkZW4iLE9iOiJpbnZhbGlkIixQYjoibGFiZWwiLFFiOiJsYWJlbGxlZGJ5IixSYjoibGV2ZWwiLFdiOiJsaXZlIixrYzoibXVsdGlsaW5lIixsYzoibXVsdGlzZWxlY3RhYmxlIixwYzoib3JpZW50YXRpb24iLHFjOiJvd25zIixyYzoicG9zaW5zZXQiLHRjOiJwcmVzc2VkIix4YzoicmVhZG9ubHkiLHpjOiJyZWxldmFudCIsQWM6InJlcXVpcmVkIixFYzoicm93aW5kZXgiLEhjOiJzZWxlY3RlZCIsSmM6InNldHNpemUiLExjOiJzb3J0IixaYzoidmFsdWVtYXgiLCRjOiJ2YWx1ZW1pbiIsYWQ6InZhbHVlbm93IiwKYmQ6InZhbHVldGV4dCJ9O3ZhciBvYT1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkIGluIGEpYi5jYWxsKGMsYVtkXSxkLGEpfSxwYT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyBpbiBhKWlmKGFbY109PWIpcmV0dXJuITA7cmV0dXJuITF9LHFhPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsIT09YSYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfSxzYT1mdW5jdGlvbihhKXt2YXIgYj17fSxjO2ZvcihjIGluIGEpYlthW2NdXT1jO3JldHVybiBifSx0YT0iY29uc3RydWN0b3IgaGFzT3duUHJvcGVydHkgaXNQcm90b3R5cGVPZiBwcm9wZXJ0eUlzRW51bWVyYWJsZSB0b0xvY2FsZVN0cmluZyB0b1N0cmluZyB2YWx1ZU9mIi5zcGxpdCgiICIpLHVhPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8dGEubGVuZ3RoO2YrKyljPQp0YVtmXSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZCxjKSYmKGFbY109ZFtjXSl9fTt2YXIgdmE9e2ZiOiJhbGVydCIsZ2I6ImFsZXJ0ZGlhbG9nIixoYjoiYXBwbGljYXRpb24iLGliOiJhcnRpY2xlIixsYjoiYmFubmVyIixuYjoiYnV0dG9uIixvYjoiY2hlY2tib3giLHJiOiJjb2x1bW5oZWFkZXIiLHNiOiJjb21ib2JveCIsdGI6ImNvbXBsZW1lbnRhcnkiLHViOiJjb250ZW50aW5mbyIsd2I6ImRlZmluaXRpb24iLHliOiJkaWFsb2ciLHpiOiJkaXJlY3RvcnkiLEJiOiJkb2N1bWVudCIsRmI6ImZvcm0iLEhiOiJncmlkIixJYjoiZ3JpZGNlbGwiLEpiOiJncm91cCIsTGI6ImhlYWRpbmciLE5iOiJpbWciLFNiOiJsaW5rIixUYjoibGlzdCIsVWI6Imxpc3Rib3giLFZiOiJsaXN0aXRlbSIsWGI6ImxvZyIsWWI6Im1haW4iLFpiOiJtYXJxdWVlIiwkYjoibWF0aCIsYWM6Im1lbnUiLGJjOiJtZW51YmFyIixjYzoibWVudWl0ZW0iLGRjOiJtZW51aXRlbWNoZWNrYm94IixlYzoibWVudWl0ZW1yYWRpbyIsbWM6Im5hdmlnYXRpb24iLG5jOiJub3RlIixvYzoib3B0aW9uIiwKc2M6InByZXNlbnRhdGlvbiIsdWM6InByb2dyZXNzYmFyIix2YzoicmFkaW8iLHdjOiJyYWRpb2dyb3VwIix5YzoicmVnaW9uIixCYzoicm93IixDYzoicm93Z3JvdXAiLERjOiJyb3doZWFkZXIiLEZjOiJzY3JvbGxiYXIiLEdjOiJzZWFyY2giLEljOiJzZXBhcmF0b3IiLEtjOiJzbGlkZXIiLE1jOiJzcGluYnV0dG9uIixOYzoic3RhdHVzIixPYzoidGFiIixQYzoidGFibGlzdCIsUWM6InRhYnBhbmVsIixSYzoidGV4dGJveCIsU2M6InRleHRpbmZvIixUYzoidGltZXIiLFVjOiJ0b29sYmFyIixWYzoidG9vbHRpcCIsV2M6InRyZWUiLFhjOiJ0cmVlZ3JpZCIsWWM6InRyZWVpdGVtIn07dmFyIHdhPWZ1bmN0aW9uKGEpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsd2EpO2Vsc2V7dmFyIGI9RXJyb3IoKS5zdGFjaztiJiYodGhpcy5zdGFjaz1iKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSl9O24od2EsRXJyb3IpO3dhLnByb3RvdHlwZS5uYW1lPSJDdXN0b21FcnJvciI7dmFyIHhhO3ZhciB5YT1mdW5jdGlvbihhLGIpe2E9YS5zcGxpdCgiJXMiKTtmb3IodmFyIGM9IiIsZD1hLmxlbmd0aC0xLGU9MDtlPGQ7ZSsrKWMrPWFbZV0rKGU8Yi5sZW5ndGg/YltlXToiJXMiKTt3YS5jYWxsKHRoaXMsYythW2RdKX07bih5YSx3YSk7eWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjsKdmFyIHphPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSJBc3NlcnRpb24gZmFpbGVkIjtpZihjKXtlKz0iOiAiK2M7dmFyIGY9ZH1lbHNlIGEmJihlKz0iOiAiK2EsZj1iKTt0aHJvdyBuZXcgeWEoIiIrZSxmfHxbXSk7fSxxPWZ1bmN0aW9uKGEsYixjKXthfHx6YSgiIixudWxsLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX0sQWE9ZnVuY3Rpb24oYSxiLGMpe20oYSkmJjE9PWEubm9kZVR5cGV8fHphKCJFeHBlY3RlZCBFbGVtZW50IGJ1dCBnb3QgJXM6ICVzLiIsW2VhKGEpLGFdLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKX0sQ2E9ZnVuY3Rpb24oYSxiLGMsZCl7YSBpbnN0YW5jZW9mIGJ8fHphKCJFeHBlY3RlZCBpbnN0YW5jZW9mICVzIGJ1dCBnb3QgJXMuIixbQmEoYiksQmEoYSldLGMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpKX0sQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZgpGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTpudWxsPT09YT8ibnVsbCI6dHlwZW9mIGF9O3ZhciBEYT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3EobnVsbCE9YS5sZW5ndGgpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKCJzdHJpbmciPT09dHlwZW9mIGEpcmV0dXJuInN0cmluZyIhPT10eXBlb2YgYnx8MSE9Yi5sZW5ndGg/LTE6YS5pbmRleE9mKGIsMCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspaWYoYyBpbiBhJiZhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX0scj1BcnJheS5wcm90b3R5cGUuZm9yRWFjaD9mdW5jdGlvbihhLGIsYyl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsYyl9OmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9YS5sZW5ndGgsZT0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZj0wO2Y8ZDtmKyspZiBpbiBlJiZiLmNhbGwoYyxlW2ZdLGYsYSl9LEVhPUFycmF5LnByb3RvdHlwZS5maWx0ZXI/CmZ1bmN0aW9uKGEsYil7cShudWxsIT1hLmxlbmd0aCk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD1bXSxlPTAsZj0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZz0wO2c8YztnKyspaWYoZyBpbiBmKXt2YXIgaz1mW2ddO2IuY2FsbCh2b2lkIDAsayxnLGEpJiYoZFtlKytdPWspfXJldHVybiBkfSxGYT1BcnJheS5wcm90b3R5cGUuZXZlcnk/ZnVuY3Rpb24oYSxiKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmV2ZXJ5LmNhbGwoYSxiLHZvaWQgMCl9OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWEubGVuZ3RoLGQ9InN0cmluZyI9PT10eXBlb2YgYT9hLnNwbGl0KCIiKTphLGU9MDtlPGM7ZSsrKWlmKGUgaW4gZCYmIWIuY2FsbCh2b2lkIDAsZFtlXSxlLGEpKXJldHVybiExO3JldHVybiEwfSxHYT1mdW5jdGlvbihhLGIpe3JldHVybiAwPD0KRGEoYSxiKX0sSGE9ZnVuY3Rpb24oYSxiKXtiPURhKGEsYik7dmFyIGM7aWYoYz0wPD1iKXEobnVsbCE9YS5sZW5ndGgpLEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhLGIsMSk7cmV0dXJuIGN9LElhPWZ1bmN0aW9uKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGFyZ3VtZW50cyl9LEphPWZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDA8Yil7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX0sTGE9ZnVuY3Rpb24oYSxiLGMsZCl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShhLEthKGFyZ3VtZW50cywxKSl9LEthPWZ1bmN0aW9uKGEsYixjKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gMj49YXJndW1lbnRzLmxlbmd0aD9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsYixjKX07dmFyIE1hPVN0cmluZy5wcm90b3R5cGUudHJpbT9mdW5jdGlvbihhKXtyZXR1cm4gYS50cmltKCl9OmZ1bmN0aW9uKGEpe3JldHVybi9eW1xzXHhhMF0qKFtcc1xTXSo/KVtcc1x4YTBdKiQvLmV4ZWMoYSlbMV19LE5hPS8mL2csT2E9LzwvZyxQYT0vPi9nLFFhPS8iL2csUmE9LycvZyxTYT0vXHgwMC9nLFRhPS9bXHgwMCY8PiInXS8sdD1mdW5jdGlvbihhLGIpe3JldHVybi0xIT1hLmluZGV4T2YoYil9LFVhPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE8Yj8tMTphPmI/MTowfTt2YXIgdTthOnt2YXIgVmE9bC5uYXZpZ2F0b3I7aWYoVmEpe3ZhciBXYT1WYS51c2VyQWdlbnQ7aWYoV2Epe3U9V2E7YnJlYWsgYX19dT0iIn07LyoKCiBDb3B5cmlnaHQgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzLgogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKKi8KdmFyIFhhPWZ1bmN0aW9uKGEpe1RhLnRlc3QoYSkmJigtMSE9YS5pbmRleE9mKCImIikmJihhPWEucmVwbGFjZShOYSwiJmFtcDsiKSksLTEhPWEuaW5kZXhPZigiPCIpJiYoYT1hLnJlcGxhY2UoT2EsIiZsdDsiKSksLTEhPWEuaW5kZXhPZigiPiIpJiYoYT1hLnJlcGxhY2UoUGEsIiZndDsiKSksLTEhPWEuaW5kZXhPZignIicpJiYoYT1hLnJlcGxhY2UoUWEsIiZxdW90OyIpKSwtMSE9YS5pbmRleE9mKCInIikmJihhPWEucmVwbGFjZShSYSwiJiMzOTsiKSksLTEhPWEuaW5kZXhPZigiXHgwMCIpJiYoYT1hLnJlcGxhY2UoU2EsIiYjMDsiKSkpO3JldHVybiBhfTt2YXIgWWE9ZnVuY3Rpb24oYSl7WWFbIiAiXShhKTtyZXR1cm4gYX07WWFbIiAiXT1jYTt2YXIgJGE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1aYTtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsYSk/Y1thXTpjW2FdPWIoYSl9O3ZhciBhYj10KHUsIk9wZXJhIiksdj10KHUsIlRyaWRlbnQiKXx8dCh1LCJNU0lFIiksYmI9dCh1LCJFZGdlIikseD10KHUsIkdlY2tvIikmJiEodCh1LnRvTG93ZXJDYXNlKCksIndlYmtpdCIpJiYhdCh1LCJFZGdlIikpJiYhKHQodSwiVHJpZGVudCIpfHx0KHUsIk1TSUUiKSkmJiF0KHUsIkVkZ2UiKSx5PXQodS50b0xvd2VyQ2FzZSgpLCJ3ZWJraXQiKSYmIXQodSwiRWRnZSIpLHo9dCh1LCJNYWNpbnRvc2giKSxjYj1mdW5jdGlvbigpe3ZhciBhPWwuZG9jdW1lbnQ7cmV0dXJuIGE/YS5kb2N1bWVudE1vZGU6dm9pZCAwfSxkYjsKYTp7dmFyIGViPSIiLGZiPWZ1bmN0aW9uKCl7dmFyIGE9dTtpZih4KXJldHVybi9ydjooW15cKTtdKykoXCl8OykvLmV4ZWMoYSk7aWYoYmIpcmV0dXJuL0VkZ2VcLyhbXGRcLl0rKS8uZXhlYyhhKTtpZih2KXJldHVybi9cYig/Ok1TSUV8cnYpWzogXShbXlwpO10rKShcKXw7KS8uZXhlYyhhKTtpZih5KXJldHVybi9XZWJLaXRcLyhcUyspLy5leGVjKGEpO2lmKGFiKXJldHVybi8oPzpWZXJzaW9uKVsgXC9dPyhcUyspLy5leGVjKGEpfSgpO2ZiJiYoZWI9ZmI/ZmJbMV06IiIpO2lmKHYpe3ZhciBnYj1jYigpO2lmKG51bGwhPWdiJiZnYj5wYXJzZUZsb2F0KGViKSl7ZGI9U3RyaW5nKGdiKTticmVhayBhfX1kYj1lYn0KdmFyIGhiPWRiLFphPXt9LEE9ZnVuY3Rpb24oYSl7cmV0dXJuICRhKGEsZnVuY3Rpb24oKXtmb3IodmFyIGI9MCxjPU1hKFN0cmluZyhoYikpLnNwbGl0KCIuIiksZD1NYShTdHJpbmcoYSkpLnNwbGl0KCIuIiksZT1NYXRoLm1heChjLmxlbmd0aCxkLmxlbmd0aCksZj0wOzA9PWImJmY8ZTtmKyspe3ZhciBnPWNbZl18fCIiLGs9ZFtmXXx8IiI7ZG97Zz0vKFxkKikoXEQqKSguKikvLmV4ZWMoZyl8fFsiIiwiIiwiIiwiIl07az0vKFxkKikoXEQqKSguKikvLmV4ZWMoayl8fFsiIiwiIiwiIiwiIl07aWYoMD09Z1swXS5sZW5ndGgmJjA9PWtbMF0ubGVuZ3RoKWJyZWFrO2I9VWEoMD09Z1sxXS5sZW5ndGg/MDpwYXJzZUludChnWzFdLDEwKSwwPT1rWzFdLmxlbmd0aD8wOnBhcnNlSW50KGtbMV0sMTApKXx8VWEoMD09Z1syXS5sZW5ndGgsMD09a1syXS5sZW5ndGgpfHxVYShnWzJdLGtbMl0pO2c9Z1szXTtrPWtbM119d2hpbGUoMD09Yil9cmV0dXJuIDA8PWJ9KX0saWI7CmliPWwuZG9jdW1lbnQmJnY/Y2IoKTp2b2lkIDA7dmFyIGpiPSF2fHw5PD1OdW1iZXIoaWIpO3ZhciBsYj1mdW5jdGlvbihhLGIpe29hKGIsZnVuY3Rpb24oYyxkKXtjJiYib2JqZWN0Ij09dHlwZW9mIGMmJmMuZGQmJihjPWMuY2QoKSk7InN0eWxlIj09ZD9hLnN0eWxlLmNzc1RleHQ9YzoiY2xhc3MiPT1kP2EuY2xhc3NOYW1lPWM6ImZvciI9PWQ/YS5odG1sRm9yPWM6a2IuaGFzT3duUHJvcGVydHkoZCk/YS5zZXRBdHRyaWJ1dGUoa2JbZF0sYyk6MD09ZC5sYXN0SW5kZXhPZigiYXJpYS0iLDApfHwwPT1kLmxhc3RJbmRleE9mKCJkYXRhLSIsMCk/YS5zZXRBdHRyaWJ1dGUoZCxjKTphW2RdPWN9KX0sa2I9e2NlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjb2xzcGFuOiJjb2xTcGFuIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGhlaWdodDoiaGVpZ2h0IixtYXhsZW5ndGg6Im1heExlbmd0aCIsbm9uY2U6Im5vbmNlIixyb2xlOiJyb2xlIixyb3dzcGFuOiJyb3dTcGFuIix0eXBlOiJ0eXBlIix1c2VtYXA6InVzZU1hcCIsdmFsaWduOiJ2QWxpZ24iLAp3aWR0aDoid2lkdGgifSxtYj1mdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChrKXtrJiZiLmFwcGVuZENoaWxkKCJzdHJpbmciPT09dHlwZW9mIGs/YS5jcmVhdGVUZXh0Tm9kZShrKTprKX1mb3IodmFyIGU9MjtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXTtpZighaGEoZil8fG0oZikmJjA8Zi5ub2RlVHlwZSlkKGYpO2Vsc2V7YTp7aWYoZiYmIm51bWJlciI9PXR5cGVvZiBmLmxlbmd0aCl7aWYobShmKSl7dmFyIGc9ImZ1bmN0aW9uIj09dHlwZW9mIGYuaXRlbXx8InN0cmluZyI9PXR5cGVvZiBmLml0ZW07YnJlYWsgYX1pZihpYShmKSl7Zz0iZnVuY3Rpb24iPT10eXBlb2YgZi5pdGVtO2JyZWFrIGF9fWc9ITF9cihnP0phKGYpOmYsZCl9fX0sbmI9ZnVuY3Rpb24oYSxiKXtiPVN0cmluZyhiKTsiYXBwbGljYXRpb24veGh0bWwreG1sIj09PWEuY29udGVudFR5cGUmJihiPWIudG9Mb3dlckNhc2UoKSk7cmV0dXJuIGEuY3JlYXRlRWxlbWVudChiKX0sb2I9ZnVuY3Rpb24oYSl7YSYmCmEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpfSxwYj1mdW5jdGlvbihhLGIpe2lmKCFhfHwhYilyZXR1cm4hMTtpZihhLmNvbnRhaW5zJiYxPT1iLm5vZGVUeXBlKXJldHVybiBhPT1ifHxhLmNvbnRhaW5zKGIpO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbilyZXR1cm4gYT09Ynx8ISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNik7Zm9yKDtiJiZhIT1iOyliPWIucGFyZW50Tm9kZTtyZXR1cm4gYj09YX0scWI9ZnVuY3Rpb24oYSl7cShhLCJOb2RlIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4iKTtyZXR1cm4gOT09YS5ub2RlVHlwZT9hOmEub3duZXJEb2N1bWVudHx8YS5kb2N1bWVudH0scmI9ZnVuY3Rpb24oYSxiKXtiP2EudGFiSW5kZXg9MDooYS50YWJJbmRleD0tMSxhLnJlbW92ZUF0dHJpYnV0ZSgidGFiSW5kZXgiKSl9LHNiPWZ1bmN0aW9uKGEpe3JldHVybiB2JiYhQSgiOSIpPyhhPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKSwKbnVsbCE9YSYmYS5zcGVjaWZpZWQpOmEuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpfSx0Yj1mdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgYSYmMDw9YSYmMzI3Njg+YX0sdWI9ZnVuY3Rpb24oYSl7dGhpcy5hPWF8fGwuZG9jdW1lbnR8fGRvY3VtZW50fTt1Yi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBhP3RoaXMuYS5nZXRFbGVtZW50QnlJZChhKTphfTsKdWIucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuYSxlPWFyZ3VtZW50cyxmPVN0cmluZyhlWzBdKSxnPWVbMV07aWYoIWpiJiZnJiYoZy5uYW1lfHxnLnR5cGUpKXtmPVsiPCIsZl07Zy5uYW1lJiZmLnB1c2goJyBuYW1lPSInLFhhKGcubmFtZSksJyInKTtpZihnLnR5cGUpe2YucHVzaCgnIHR5cGU9IicsWGEoZy50eXBlKSwnIicpO3ZhciBrPXt9O3VhKGssZyk7ZGVsZXRlIGsudHlwZTtnPWt9Zi5wdXNoKCI+Iik7Zj1mLmpvaW4oIiIpfWY9bmIoZCxmKTtnJiYoInN0cmluZyI9PT10eXBlb2YgZz9mLmNsYXNzTmFtZT1nOmZhKGcpP2YuY2xhc3NOYW1lPWcuam9pbigiICIpOmxiKGYsZykpOzI8ZS5sZW5ndGgmJm1iKGQsZixlKTtyZXR1cm4gZn07dmFyIHZiPWZ1bmN0aW9uKGEsYil7Yj8ocShwYSh2YSxiKSwiTm8gc3VjaCBBUklBIHJvbGUgIitiKSxhLnNldEF0dHJpYnV0ZSgicm9sZSIsYikpOmEucmVtb3ZlQXR0cmlidXRlKCJyb2xlIil9LHhiPWZ1bmN0aW9uKGEsYixjKXtmYShjKSYmKGM9Yy5qb2luKCIgIikpO3ZhciBkPXdiKGIpOyIiPT09Y3x8dm9pZCAwPT1jPyhtYXx8KG1hPXthdG9taWM6ITEsYXV0b2NvbXBsZXRlOiJub25lIixkcm9wZWZmZWN0OiJub25lIixoYXNwb3B1cDohMSxsaXZlOiJvZmYiLG11bHRpbGluZTohMSxtdWx0aXNlbGVjdGFibGU6ITEsb3JpZW50YXRpb246InZlcnRpY2FsIixyZWFkb25seTohMSxyZWxldmFudDoiYWRkaXRpb25zIHRleHQiLHJlcXVpcmVkOiExLHNvcnQ6Im5vbmUiLGJ1c3k6ITEsZGlzYWJsZWQ6ITEsaGlkZGVuOiExLGludmFsaWQ6ImZhbHNlIn0pLGM9bWEsYiBpbiBjP2Euc2V0QXR0cmlidXRlKGQsY1tiXSk6YS5yZW1vdmVBdHRyaWJ1dGUoZCkpOmEuc2V0QXR0cmlidXRlKGQsCmMpfSx3Yj1mdW5jdGlvbihhKXtxKGEsIkFSSUEgYXR0cmlidXRlIGNhbm5vdCBiZSBlbXB0eS4iKTtxKHBhKG5hLGEpLCJObyBzdWNoIEFSSUEgYXR0cmlidXRlICIrYSk7cmV0dXJuImFyaWEtIithfTt2YXIgeWI9T2JqZWN0LmZyZWV6ZXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O3ZhciBDPWZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVTt0aGlzLko9dGhpcy5KfTtDLnByb3RvdHlwZS5VPSExO0MucHJvdG90eXBlLk49ZnVuY3Rpb24oKXt0aGlzLlV8fCh0aGlzLlU9ITAsdGhpcy51KCkpfTt2YXIgemI9ZnVuY3Rpb24oYSxiKXthLlU/YigpOihhLkp8fChhLko9W10pLGEuSi5wdXNoKGIpKX07Qy5wcm90b3R5cGUudT1mdW5jdGlvbigpe2lmKHRoaXMuSilmb3IoO3RoaXMuSi5sZW5ndGg7KXRoaXMuSi5zaGlmdCgpKCl9O3ZhciBBYj1mdW5jdGlvbihhKXthJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5OJiZhLk4oKX07dmFyIEJiPWZ1bmN0aW9uKGEpe3JldHVybiJzdHJpbmciPT10eXBlb2YgYS5jbGFzc05hbWU/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sRD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6QmIoYSkubWF0Y2goL1xTKy9nKXx8W119LENiPWZ1bmN0aW9uKGEsYil7InN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZT9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxEYj1mdW5jdGlvbihhLGIpe3JldHVybiBhLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5jb250YWlucyhiKTpHYShEKGEpLGIpfSxFYj1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFEYihhLGIpKXt2YXIgYz1CYihhKTtDYihhLGMrKDA8Yy5sZW5ndGg/IiAiK2I6YikpfX0sRmI9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClyKGIsCmZ1bmN0aW9uKGUpe0ViKGEsZSl9KTtlbHNle3ZhciBjPXt9O3IoRChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7cihiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPTA8Yi5sZW5ndGg/IiAiK2Q6ZDtDYihhLGIpfX0sR2I9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6RGIoYSxiKSYmQ2IoYSxFYShEKGEpLGZ1bmN0aW9uKGMpe3JldHVybiBjIT1ifSkuam9pbigiICIpKX0sSGI9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9yKGIsZnVuY3Rpb24oYyl7R2IoYSxjKX0pOkNiKGEsRWEoRChhKSxmdW5jdGlvbihjKXtyZXR1cm4hR2EoYixjKX0pLmpvaW4oIiAiKSl9O3ZhciBJYj0hdnx8OTw9TnVtYmVyKGliKSxKYj0hdnx8OTw9TnVtYmVyKGliKSxLYj12JiYhQSgiOSIpLExiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e2wuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsY2EsYiksbC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjYSxiKX1jYXRjaChjKXt9cmV0dXJuIGF9KCk7dmFyIEU9ZnVuY3Rpb24oYSxiKXt0aGlzLnR5cGU9YTt0aGlzLmE9dGhpcy50YXJnZXQ9Yjt0aGlzLmg9ITE7dGhpcy5LYT0hMH07RS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuaD0hMH07RS5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3RoaXMuS2E9ITF9O3ZhciBGPXtMOiJtb3VzZWRvd24iLE06Im1vdXNldXAiLGFhOiJtb3VzZWNhbmNlbCIsaGM6Im1vdXNlbW92ZSIsamM6Im1vdXNlb3ZlciIsaWM6Im1vdXNlb3V0IixmYzoibW91c2VlbnRlciIsZ2M6Im1vdXNlbGVhdmUifTt2YXIgRz1mdW5jdGlvbihhLGIpe0UuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy5hPXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5jPTA7dGhpcy5BPXRoaXMubWV0YUtleT10aGlzLnNoaWZ0S2V5PXRoaXMuYWx0S2V5PXRoaXMuY3RybEtleT0hMTt0aGlzLnBvaW50ZXJJZD0wO3RoaXMucG9pbnRlclR5cGU9IiI7dGhpcy5iPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMuYT1iO2lmKGI9YS5yZWxhdGVkVGFyZ2V0KXtpZih4KXthOnt0cnl7WWEoYi5ub2RlTmFtZSk7dmFyIGU9ITA7YnJlYWsgYX1jYXRjaChmKXt9ZT0KITF9ZXx8KGI9bnVsbCl9fWVsc2UibW91c2VvdmVyIj09Yz9iPWEuZnJvbUVsZW1lbnQ6Im1vdXNlb3V0Ij09YyYmKGI9YS50b0VsZW1lbnQpO3RoaXMucmVsYXRlZFRhcmdldD1iO2Q/KHRoaXMuY2xpZW50WD12b2lkIDAhPT1kLmNsaWVudFg/ZC5jbGllbnRYOmQucGFnZVgsdGhpcy5jbGllbnRZPXZvaWQgMCE9PWQuY2xpZW50WT9kLmNsaWVudFk6ZC5wYWdlWSx0aGlzLnNjcmVlblg9ZC5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1kLnNjcmVlbll8fDApOih0aGlzLmNsaWVudFg9dm9pZCAwIT09YS5jbGllbnRYP2EuY2xpZW50WDphLnBhZ2VYLHRoaXMuY2xpZW50WT12b2lkIDAhPT1hLmNsaWVudFk/YS5jbGllbnRZOmEucGFnZVksdGhpcy5zY3JlZW5YPWEuc2NyZWVuWHx8MCx0aGlzLnNjcmVlblk9YS5zY3JlZW5ZfHwwKTt0aGlzLmJ1dHRvbj1hLmJ1dHRvbjt0aGlzLmM9YS5rZXlDb2RlfHwwO3RoaXMua2V5PWEua2V5fHwiIjt0aGlzLmN0cmxLZXk9YS5jdHJsS2V5O3RoaXMuYWx0S2V5PQphLmFsdEtleTt0aGlzLnNoaWZ0S2V5PWEuc2hpZnRLZXk7dGhpcy5tZXRhS2V5PWEubWV0YUtleTt0aGlzLkE9ej9hLm1ldGFLZXk6YS5jdHJsS2V5O3RoaXMucG9pbnRlcklkPWEucG9pbnRlcklkfHwwO3RoaXMucG9pbnRlclR5cGU9InN0cmluZyI9PT10eXBlb2YgYS5wb2ludGVyVHlwZT9hLnBvaW50ZXJUeXBlOk1iW2EucG9pbnRlclR5cGVdfHwiIjt0aGlzLmI9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnRoaXMuZygpfX07bihHLEUpO3ZhciBOYj15YihbMSw0LDJdKSxNYj15Yih7MjoidG91Y2giLDM6InBlbiIsNDoibW91c2UifSksT2I9ZnVuY3Rpb24oYSl7cmV0dXJuIEliPzA9PWEuYi5idXR0b246ImNsaWNrIj09YS50eXBlPyEwOiEhKGEuYi5idXR0b24mTmJbMF0pfTtHLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7Ry5pLmouY2FsbCh0aGlzKTt0aGlzLmIuc3RvcFByb3BhZ2F0aW9uP3RoaXMuYi5zdG9wUHJvcGFnYXRpb24oKTp0aGlzLmIuY2FuY2VsQnViYmxlPSEwfTsKRy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe0cuaS5nLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5iO2lmKGEucHJldmVudERlZmF1bHQpYS5wcmV2ZW50RGVmYXVsdCgpO2Vsc2UgaWYoYS5yZXR1cm5WYWx1ZT0hMSxLYil0cnl7aWYoYS5jdHJsS2V5fHwxMTI8PWEua2V5Q29kZSYmMTIzPj1hLmtleUNvZGUpYS5rZXlDb2RlPS0xfWNhdGNoKGIpe319O3ZhciBQYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKDFFNipNYXRoLnJhbmRvbSgpfDApLFFiPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW1BiXSl9LFJiPTA7dmFyIFNiPWZ1bmN0aW9uKGEsYixjLGQsZSl7dGhpcy5saXN0ZW5lcj1hO3RoaXMuYT1udWxsO3RoaXMuc3JjPWI7dGhpcy50eXBlPWM7dGhpcy5jYXB0dXJlPSEhZDt0aGlzLm1hPWU7dGhpcy5rZXk9KytSYjt0aGlzLlg9dGhpcy5oYT0hMX0sVGI9ZnVuY3Rpb24oYSl7YS5YPSEwO2EubGlzdGVuZXI9bnVsbDthLmE9bnVsbDthLnNyYz1udWxsO2EubWE9bnVsbH07dmFyIFViPWZ1bmN0aW9uKGEpe3RoaXMuc3JjPWE7dGhpcy5hPXt9O3RoaXMuYj0wfTtVYi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS50b1N0cmluZygpO2E9dGhpcy5hW2ZdO2F8fChhPXRoaXMuYVtmXT1bXSx0aGlzLmIrKyk7dmFyIGc9VmIoYSxiLGQsZSk7LTE8Zz8oYj1hW2ddLGN8fChiLmhhPSExKSk6KGI9bmV3IFNiKGIsdGhpcy5zcmMsZiwhIWQsZSksYi5oYT1jLGEucHVzaChiKSk7cmV0dXJuIGJ9Owp2YXIgV2I9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLnR5cGU7YyBpbiBhLmEmJkhhKGEuYVtjXSxiKSYmKFRiKGIpLDA9PWEuYVtjXS5sZW5ndGgmJihkZWxldGUgYS5hW2NdLGEuYi0tKSl9LFhiPWZ1bmN0aW9uKGEsYixjLGQsZSl7YT1hLmFbYi50b1N0cmluZygpXTtiPS0xO2EmJihiPVZiKGEsYyxkLGUpKTtyZXR1cm4tMTxiP2FbYl06bnVsbH0sVmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuWCYmZi5saXN0ZW5lcj09YiYmZi5jYXB0dXJlPT0hIWMmJmYubWE9PWQpcmV0dXJuIGV9cmV0dXJuLTF9O3ZhciBZYj0iY2xvc3VyZV9sbV8iKygxRTYqTWF0aC5yYW5kb20oKXwwKSxaYj17fSwkYj0wLGJjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZCYmZC5vbmNlKXJldHVybiBhYyhhLGIsYyxkLGUpO2lmKGZhKGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyliYyhhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9Y2MoYyk7cmV0dXJuIFFiKGEpP2RjKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOmVjKGEsYixjLCExLGQsZSl9LGVjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGc9bShlKT8hIWUuY2FwdHVyZTohIWUsaz1mYyhhKTtrfHwoYVtZYl09az1uZXcgVWIoYSkpO2M9ay5hZGQoYixjLGQsZyxmKTtpZihjLmEpcmV0dXJuIGM7ZD1nYygpO2MuYT1kO2Quc3JjPWE7ZC5saXN0ZW5lcj1jO2lmKGEuYWRkRXZlbnRMaXN0ZW5lcilMYnx8KGU9Zyksdm9pZCAwPT09ZSYmKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksCmQsZSk7ZWxzZSBpZihhLmF0dGFjaEV2ZW50KWEuYXR0YWNoRXZlbnQoaGMoYi50b1N0cmluZygpKSxkKTtlbHNlIGlmKGEuYWRkTGlzdGVuZXImJmEucmVtb3ZlTGlzdGVuZXIpcSgiY2hhbmdlIj09PWIsIk1lZGlhUXVlcnlMaXN0IG9ubHkgaGFzIGEgY2hhbmdlIGV2ZW50IiksYS5hZGRMaXN0ZW5lcihkKTtlbHNlIHRocm93IEVycm9yKCJhZGRFdmVudExpc3RlbmVyIGFuZCBhdHRhY2hFdmVudCBhcmUgdW5hdmFpbGFibGUuIik7JGIrKztyZXR1cm4gY30sZ2M9ZnVuY3Rpb24oKXt2YXIgYT1pYyxiPUpiP2Z1bmN0aW9uKGMpe3JldHVybiBhLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKX06ZnVuY3Rpb24oYyl7Yz1hLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKTtpZighYylyZXR1cm4gY307cmV0dXJuIGJ9LGFjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZmEoYikpe2Zvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWFjKGEsYltmXSxjLGQsZSk7cmV0dXJuIG51bGx9Yz1jYyhjKTtyZXR1cm4gUWIoYSk/CmEuaC5hZGQoU3RyaW5nKGIpLGMsITAsbShkKT8hIWQuY2FwdHVyZTohIWQsZSk6ZWMoYSxiLGMsITAsZCxlKX0samM9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihmYShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylqYyhhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPWNjKGMpLFFiKGEpPyhhPWEuaCxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5hJiYoZj1hLmFbYl0sYz1WYihmLGMsZCxlKSwtMTxjJiYoVGIoZltjXSkscShudWxsIT1mLmxlbmd0aCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSwwPT1mLmxlbmd0aCYmKGRlbGV0ZSBhLmFbYl0sYS5iLS0pKSkpOmEmJihhPWZjKGEpKSYmKGM9WGIoYSxiLGMsZCxlKSkmJmtjKGMpfSxrYz1mdW5jdGlvbihhKXtpZigibnVtYmVyIiE9PXR5cGVvZiBhJiZhJiYhYS5YKXt2YXIgYj1hLnNyYztpZihRYihiKSlXYihiLmgsYSk7ZWxzZXt2YXIgYz1hLnR5cGUsZD1hLmE7Yi5yZW1vdmVFdmVudExpc3RlbmVyPwpiLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KGhjKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7JGItLTsoYz1mYyhiKSk/KFdiKGMsYSksMD09Yy5iJiYoYy5zcmM9bnVsbCxiW1liXT1udWxsKSk6VGIoYSl9fX0saGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gWmI/WmJbYV06WmJbYV09Im9uIithfSxtYz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMDtpZihhPWZjKGEpKWlmKGI9YS5hW2IudG9TdHJpbmcoKV0pZm9yKGI9Yi5jb25jYXQoKSxhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBmPWJbYV07ZiYmZi5jYXB0dXJlPT1jJiYhZi5YJiYoZj1sYyhmLGQpLGU9ZSYmITEhPT1mKX1yZXR1cm4gZX0sbGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5tYXx8YS5zcmM7YS5oYSYma2MoYSk7cmV0dXJuIGMuY2FsbChkLGIpfSxpYz1mdW5jdGlvbihhLApiKXtpZihhLlgpcmV0dXJuITA7aWYoIUpiKXtpZighYilhOntiPVsid2luZG93IiwiZXZlbnQiXTtmb3IodmFyIGM9bCxkPTA7ZDxiLmxlbmd0aDtkKyspaWYoYz1jW2JbZF1dLG51bGw9PWMpe2I9bnVsbDticmVhayBhfWI9Y31kPWI7Yj1uZXcgRyhkLHRoaXMpO2M9ITA7aWYoISgwPmQua2V5Q29kZXx8dm9pZCAwIT1kLnJldHVyblZhbHVlKSl7YTp7dmFyIGU9ITE7aWYoMD09ZC5rZXlDb2RlKXRyeXtkLmtleUNvZGU9LTE7YnJlYWsgYX1jYXRjaChnKXtlPSEwfWlmKGV8fHZvaWQgMD09ZC5yZXR1cm5WYWx1ZSlkLnJldHVyblZhbHVlPSEwfWQ9W107Zm9yKGU9Yi5hO2U7ZT1lLnBhcmVudE5vZGUpZC5wdXNoKGUpO2E9YS50eXBlO2ZvcihlPWQubGVuZ3RoLTE7IWIuaCYmMDw9ZTtlLS0pe2IuYT1kW2VdO3ZhciBmPW1jKGRbZV0sYSwhMCxiKTtjPWMmJmZ9Zm9yKGU9MDshYi5oJiZlPGQubGVuZ3RoO2UrKyliLmE9ZFtlXSxmPW1jKGRbZV0sYSwhMSxiKSxjPWMmJmZ9cmV0dXJuIGN9cmV0dXJuIGxjKGEsCm5ldyBHKGIsdGhpcykpfSxmYz1mdW5jdGlvbihhKXthPWFbWWJdO3JldHVybiBhIGluc3RhbmNlb2YgVWI/YTpudWxsfSxuYz0iX19jbG9zdXJlX2V2ZW50c19mbl8iKygxRTkqTWF0aC5yYW5kb20oKT4+PjApLGNjPWZ1bmN0aW9uKGEpe3EoYSwiTGlzdGVuZXIgY2FuIG5vdCBiZSBudWxsLiIpO2lmKGlhKGEpKXJldHVybiBhO3EoYS5oYW5kbGVFdmVudCwiQW4gb2JqZWN0IGxpc3RlbmVyIG11c3QgaGF2ZSBoYW5kbGVFdmVudCBtZXRob2QuIik7YVtuY118fChhW25jXT1mdW5jdGlvbihiKXtyZXR1cm4gYS5oYW5kbGVFdmVudChiKX0pO3JldHVybiBhW25jXX07dmFyIG9jPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9e319O24ob2MsQyk7CnZhciBwYz1bXSxIPWZ1bmN0aW9uKGEsYixjLGQpe2ZhKGMpfHwoYyYmKHBjWzBdPWMudG9TdHJpbmcoKSksYz1wYyk7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWJjKGIsY1tlXSxkfHxhLmhhbmRsZUV2ZW50LCExLGEuYnx8YSk7aWYoIWYpYnJlYWs7YS5hW2Yua2V5XT1mfXJldHVybiBhfSxxYz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoZmEoYykpZm9yKHZhciBnPTA7ZzxjLmxlbmd0aDtnKyspcWMoYSxiLGNbZ10sZCxlLGYpO2Vsc2UgZD1kfHxhLmhhbmRsZUV2ZW50LGU9bShlKT8hIWUuY2FwdHVyZTohIWUsZj1mfHxhLmJ8fGEsZD1jYyhkKSxlPSEhZSxjPVFiKGIpP1hiKGIuaCxTdHJpbmcoYyksZCxlLGYpOmI/KGI9ZmMoYikpP1hiKGIsYyxkLGUsZik6bnVsbDpudWxsLGMmJihrYyhjKSxkZWxldGUgYS5hW2Mua2V5XSk7cmV0dXJuIGF9LHJjPWZ1bmN0aW9uKGEpe29hKGEuYSxmdW5jdGlvbihiLGMpe3RoaXMuYS5oYXNPd25Qcm9wZXJ0eShjKSYma2MoYil9LAphKTthLmE9e319O29jLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7b2MuaS51LmNhbGwodGhpcyk7cmModGhpcyl9O29jLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJFdmVudEhhbmRsZXIuaGFuZGxlRXZlbnQgbm90IGltcGxlbWVudGVkIik7fTt2YXIgST1mdW5jdGlvbigpe0MuY2FsbCh0aGlzKTt0aGlzLmg9bmV3IFViKHRoaXMpO3RoaXMuTWE9dGhpczt0aGlzLnBhPW51bGx9O24oSSxDKTtJLnByb3RvdHlwZVtQYl09ITA7SS5wcm90b3R5cGUucmE9ZnVuY3Rpb24oYSl7dGhpcy5wYT1hfTtJLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjLGQpe2pjKHRoaXMsYSxiLGMsZCl9Owp2YXIgdWM9ZnVuY3Rpb24oYSxiKXtzYyhhKTt2YXIgYz1hLnBhO2lmKGMpe3ZhciBkPVtdO2Zvcih2YXIgZT0xO2M7Yz1jLnBhKWQucHVzaChjKSxxKDFFMz4rK2UsImluZmluaXRlIGxvb3AiKX1hPWEuTWE7Yz1iLnR5cGV8fGI7InN0cmluZyI9PT10eXBlb2YgYj9iPW5ldyBFKGIsYSk6YiBpbnN0YW5jZW9mIEU/Yi50YXJnZXQ9Yi50YXJnZXR8fGE6KGU9YixiPW5ldyBFKGMsYSksdWEoYixlKSk7ZT0hMDtpZihkKWZvcih2YXIgZj1kLmxlbmd0aC0xOyFiLmgmJjA8PWY7Zi0tKXt2YXIgZz1iLmE9ZFtmXTtlPXRjKGcsYywhMCxiKSYmZX1iLmh8fChnPWIuYT1hLGU9dGMoZyxjLCEwLGIpJiZlLGIuaHx8KGU9dGMoZyxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLmgmJmY8ZC5sZW5ndGg7ZisrKWc9Yi5hPWRbZl0sZT10YyhnLGMsITEsYikmJmU7cmV0dXJuIGV9OwpJLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7SS5pLnUuY2FsbCh0aGlzKTtpZih0aGlzLmgpe3ZhciBhPXRoaXMuaCxiPTAsYztmb3IoYyBpbiBhLmEpe2Zvcih2YXIgZD1hLmFbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixUYihkW2VdKTtkZWxldGUgYS5hW2NdO2EuYi0tfX10aGlzLnBhPW51bGx9O3ZhciBkYz1mdW5jdGlvbihhLGIsYyxkLGUpe3NjKGEpO3JldHVybiBhLmguYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LHRjPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5oLmFbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGc9YltmXTtpZihnJiYhZy5YJiZnLmNhcHR1cmU9PWMpe3ZhciBrPWcubGlzdGVuZXIscD1nLm1hfHxnLnNyYztnLmhhJiZXYihhLmgsZyk7ZT0hMSE9PWsuY2FsbChwLGQpJiZlfX1yZXR1cm4gZSYmMCE9ZC5LYX0sc2M9ZnVuY3Rpb24oYSl7cShhLmgsIkV2ZW50IHRhcmdldCBpcyBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgY2FsbCB0aGUgc3VwZXJjbGFzcyAoZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpIGNvbnN0cnVjdG9yPyIpfTt2YXIgeGM9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKHkmJiFBKCI1MjUiKSlyZXR1cm4hMDtpZih6JiZlKXJldHVybiB2YyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZigheCl7Im51bWJlciI9PT10eXBlb2YgYiYmKGI9d2MoYikpO3ZhciBnPTE3PT1ifHwxOD09Ynx8eiYmOTE9PWI7aWYoKCFjfHx6KSYmZ3x8eiYmMTY9PWImJihkfHxmKSlyZXR1cm4hMX1pZigoeXx8YmIpJiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1pZih2JiZkJiZiPT1hKXJldHVybiExO3N3aXRjaChhKXtjYXNlIDEzOnJldHVybiB4P2Z8fGU/ITE6IShjJiZkKTohMDtjYXNlIDI3OnJldHVybiEoeXx8YmJ8fHgpfXJldHVybiB4JiYoZHx8ZXx8Zik/ITE6dmMoYSl9LHZjPWZ1bmN0aW9uKGEpe2lmKDQ4PD1hJiY1Nz49YXx8Cjk2PD1hJiYxMDY+PWF8fDY1PD1hJiY5MD49YXx8KHl8fGJiKSYmMD09YSlyZXR1cm4hMDtzd2l0Y2goYSl7Y2FzZSAzMjpjYXNlIDQzOmNhc2UgNjM6Y2FzZSA2NDpjYXNlIDEwNzpjYXNlIDEwOTpjYXNlIDExMDpjYXNlIDExMTpjYXNlIDE4NjpjYXNlIDU5OmNhc2UgMTg5OmNhc2UgMTg3OmNhc2UgNjE6Y2FzZSAxODg6Y2FzZSAxOTA6Y2FzZSAxOTE6Y2FzZSAxOTI6Y2FzZSAyMjI6Y2FzZSAyMTk6Y2FzZSAyMjA6Y2FzZSAyMjE6Y2FzZSAxNjM6Y2FzZSA1ODpyZXR1cm4hMDtjYXNlIDE3MzpyZXR1cm4geDtkZWZhdWx0OnJldHVybiExfX0sd2M9ZnVuY3Rpb24oYSl7aWYoeClhPXljKGEpO2Vsc2UgaWYoeiYmeSlzd2l0Y2goYSl7Y2FzZSA5MzphPTkxfXJldHVybiBhfSx5Yz1mdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSA2MTpyZXR1cm4gMTg3O2Nhc2UgNTk6cmV0dXJuIDE4NjtjYXNlIDE3MzpyZXR1cm4gMTg5O2Nhc2UgMjI0OnJldHVybiA5MTtjYXNlIDA6cmV0dXJuIDIyNDsKZGVmYXVsdDpyZXR1cm4gYX19O3ZhciBKPWZ1bmN0aW9uKGEsYil7SS5jYWxsKHRoaXMpO2EmJnpjKHRoaXMsYSxiKX07bihKLEkpO2g9Si5wcm90b3R5cGU7aC5TPW51bGw7aC5uYT1udWxsO2guQ2E9bnVsbDtoLm9hPW51bGw7aC53PS0xO2guRj0tMTtoLnVhPSExOwp2YXIgQWM9ezM6MTMsMTI6MTQ0LDYzMjMyOjM4LDYzMjMzOjQwLDYzMjM0OjM3LDYzMjM1OjM5LDYzMjM2OjExMiw2MzIzNzoxMTMsNjMyMzg6MTE0LDYzMjM5OjExNSw2MzI0MDoxMTYsNjMyNDE6MTE3LDYzMjQyOjExOCw2MzI0MzoxMTksNjMyNDQ6MTIwLDYzMjQ1OjEyMSw2MzI0NjoxMjIsNjMyNDc6MTIzLDYzMjQ4OjQ0LDYzMjcyOjQ2LDYzMjczOjM2LDYzMjc1OjM1LDYzMjc2OjMzLDYzMjc3OjM0LDYzMjg5OjE0NCw2MzMwMjo0NX0sQmM9e1VwOjM4LERvd246NDAsTGVmdDozNyxSaWdodDozOSxFbnRlcjoxMyxGMToxMTIsRjI6MTEzLEYzOjExNCxGNDoxMTUsRjU6MTE2LEY2OjExNyxGNzoxMTgsRjg6MTE5LEY5OjEyMCxGMTA6MTIxLEYxMToxMjIsRjEyOjEyMywiVSswMDdGIjo0NixIb21lOjM2LEVuZDozNSxQYWdlVXA6MzMsUGFnZURvd246MzQsSW5zZXJ0OjQ1fSxDYz0heXx8QSgiNTI1IiksRGM9eiYmeDsKSi5wcm90b3R5cGUuYT1mdW5jdGlvbihhKXtpZih5fHxiYilpZigxNz09dGhpcy53JiYhYS5jdHJsS2V5fHwxOD09dGhpcy53JiYhYS5hbHRLZXl8fHomJjkxPT10aGlzLncmJiFhLm1ldGFLZXkpdGhpcy5GPXRoaXMudz0tMTstMT09dGhpcy53JiYoYS5jdHJsS2V5JiYxNyE9YS5jP3RoaXMudz0xNzphLmFsdEtleSYmMTghPWEuYz90aGlzLnc9MTg6YS5tZXRhS2V5JiY5MSE9YS5jJiYodGhpcy53PTkxKSk7Q2MmJiF4YyhhLmMsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGEuYWx0S2V5LGEubWV0YUtleSk/dGhpcy5oYW5kbGVFdmVudChhKToodGhpcy5GPXdjKGEuYyksRGMmJih0aGlzLnVhPWEuYWx0S2V5KSl9O0oucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dGhpcy5GPXRoaXMudz0tMTt0aGlzLnVhPWEuYWx0S2V5fTsKSi5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5iLGM9Yi5hbHRLZXk7aWYodiYmImtleXByZXNzIj09YS50eXBlKXt2YXIgZD10aGlzLkY7dmFyIGU9MTMhPWQmJjI3IT1kP2Iua2V5Q29kZTowfWVsc2UoeXx8YmIpJiYia2V5cHJlc3MiPT1hLnR5cGU/KGQ9dGhpcy5GLGU9MDw9Yi5jaGFyQ29kZSYmNjMyMzI+Yi5jaGFyQ29kZSYmdmMoZCk/Yi5jaGFyQ29kZTowKTphYiYmIXk/KGQ9dGhpcy5GLGU9dmMoZCk/Yi5rZXlDb2RlOjApOigia2V5cHJlc3MiPT1hLnR5cGU/KERjJiYoYz10aGlzLnVhKSxiLmtleUNvZGU9PWIuY2hhckNvZGU/MzI+Yi5rZXlDb2RlPyhkPWIua2V5Q29kZSxlPTApOihkPXRoaXMuRixlPWIuY2hhckNvZGUpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkseiYmNjM9PWUmJjIyND09ZCYmKGQ9MTkxKSk7dmFyIGY9ZD13YyhkKTtkPzYzMjMyPD0KZCYmZCBpbiBBYz9mPUFjW2RdOjI1PT1kJiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBCYyYmKGY9QmNbYi5rZXlJZGVudGlmaWVyXSk7eCYmQ2MmJiJrZXlwcmVzcyI9PWEudHlwZSYmIXhjKGYsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KXx8KGE9Zj09dGhpcy53LHRoaXMudz1mLGI9bmV3IEVjKGYsZSxhLGIpLGIuYWx0S2V5PWMsdWModGhpcyxiKSl9O0oucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTsKdmFyIHpjPWZ1bmN0aW9uKGEsYixjKXthLm9hJiZGYyhhKTthLlM9YjthLm5hPWJjKGEuUywia2V5cHJlc3MiLGEsYyk7YS5DYT1iYyhhLlMsImtleWRvd24iLGEuYSxjLGEpO2Eub2E9YmMoYS5TLCJrZXl1cCIsYS5iLGMsYSl9LEZjPWZ1bmN0aW9uKGEpe2EubmEmJihrYyhhLm5hKSxrYyhhLkNhKSxrYyhhLm9hKSxhLm5hPW51bGwsYS5DYT1udWxsLGEub2E9bnVsbCk7YS5TPW51bGw7YS53PS0xO2EuRj0tMX07Si5wcm90b3R5cGUudT1mdW5jdGlvbigpe0ouaS51LmNhbGwodGhpcyk7RmModGhpcyl9O3ZhciBFYz1mdW5jdGlvbihhLGIsYyxkKXtHLmNhbGwodGhpcyxkKTt0aGlzLnR5cGU9ImtleSI7dGhpcy5jPWE7dGhpcy5yZXBlYXQ9Y307bihFYyxHKTt2YXIgR2M9eD8iTW96VXNlclNlbGVjdCI6eXx8YmI/IldlYmtpdFVzZXJTZWxlY3QiOm51bGwsSGM9ZnVuY3Rpb24oYSxiKXtiPWI/bnVsbDphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7aWYoR2Mpe3ZhciBjPSJub25lIjthLnN0eWxlJiYoYS5zdHlsZVtHY109Yyk7aWYoYil7YT0wO2Zvcih2YXIgZDtkPWJbYV07YSsrKWQuc3R5bGUmJihkLnN0eWxlW0djXT1jKX19ZWxzZSBpZih2fHxhYilpZihjPSJvbiIsYS5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyksYilmb3IoYT0wO2Q9YlthXTthKyspZC5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyl9O3ZhciBJYz1mdW5jdGlvbigpe307ZGEoSWMpO0ljLnByb3RvdHlwZS5hPTA7dmFyIEs9ZnVuY3Rpb24oYSl7SS5jYWxsKHRoaXMpO3RoaXMuaj1hfHx4YXx8KHhhPW5ldyB1Yik7dGhpcy5xYT1KYzt0aGlzLlk9bnVsbDt0aGlzLm09ITE7dGhpcy5hPW51bGw7dGhpcy5BPXZvaWQgMDt0aGlzLmc9dGhpcy5jPXRoaXMuYj1udWxsO3RoaXMuR2E9ITF9O24oSyxJKTtLLnByb3RvdHlwZS5PYT1JYy5SKCk7CnZhciBKYz1udWxsLEtjPWZ1bmN0aW9uKGEsYil7c3dpdGNoKGEpe2Nhc2UgMTpyZXR1cm4gYj8iZGlzYWJsZSI6ImVuYWJsZSI7Y2FzZSAyOnJldHVybiBiPyJoaWdobGlnaHQiOiJ1bmhpZ2hsaWdodCI7Y2FzZSA0OnJldHVybiBiPyJhY3RpdmF0ZSI6ImRlYWN0aXZhdGUiO2Nhc2UgODpyZXR1cm4gYj8ic2VsZWN0IjoidW5zZWxlY3QiO2Nhc2UgMTY6cmV0dXJuIGI/ImNoZWNrIjoidW5jaGVjayI7Y2FzZSAzMjpyZXR1cm4gYj8iZm9jdXMiOiJibHVyIjtjYXNlIDY0OnJldHVybiBiPyJvcGVuIjoiY2xvc2UifXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBzdGF0ZSIpO30sTGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuWXx8KGEuWT0iOiIrKGEuT2EuYSsrKS50b1N0cmluZygzNikpfSxNYz1mdW5jdGlvbihhLGIpe2lmKGEuYiYmYS5iLmcpe3ZhciBjPWEuYi5nLGQ9YS5ZO2QgaW4gYyYmZGVsZXRlIGNbZF07cWEoYS5iLmcsYixhKX1hLlk9Yn07Sy5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9Owp2YXIgTmM9ZnVuY3Rpb24oYSl7YT1hLmE7cShhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cmV0dXJuIGF9LE9jPWZ1bmN0aW9uKGEpe2EuQXx8KGEuQT1uZXcgb2MoYSkpO3JldHVybiBxKGEuQSl9O0sucHJvdG90eXBlLnJhPWZ1bmN0aW9uKGEpe2lmKHRoaXMuYiYmdGhpcy5iIT1hKXRocm93IEVycm9yKCJNZXRob2Qgbm90IHN1cHBvcnRlZCIpO0suaS5yYS5jYWxsKHRoaXMsYSl9O0sucHJvdG90eXBlLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPW5iKHRoaXMuai5hLCJESVYiKX07CnZhciBQYz1mdW5jdGlvbihhLGIpe2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiJiZhLnhhKGIpKXthLkdhPSEwO3ZhciBjPXFiKGIpO2EuaiYmYS5qLmE9PWN8fChhLmo9Yj9uZXcgdWIocWIoYikpOnhhfHwoeGE9bmV3IHViKSk7YS52YShiKTthLkQoKX1lbHNlIHRocm93IEVycm9yKCJJbnZhbGlkIGVsZW1lbnQgdG8gZGVjb3JhdGUiKTt9O2g9Sy5wcm90b3R5cGU7aC54YT1mdW5jdGlvbigpe3JldHVybiEwfTtoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hfTtoLkQ9ZnVuY3Rpb24oKXt0aGlzLm09ITA7UWModGhpcyxmdW5jdGlvbihhKXshYS5tJiZhLmYoKSYmYS5EKCl9KX07aC5QPWZ1bmN0aW9uKCl7UWModGhpcyxmdW5jdGlvbihhKXthLm0mJmEuUCgpfSk7dGhpcy5BJiZyYyh0aGlzLkEpO3RoaXMubT0hMX07CmgudT1mdW5jdGlvbigpe3RoaXMubSYmdGhpcy5QKCk7dGhpcy5BJiYodGhpcy5BLk4oKSxkZWxldGUgdGhpcy5BKTtRYyh0aGlzLGZ1bmN0aW9uKGEpe2EuTigpfSk7IXRoaXMuR2EmJnRoaXMuYSYmb2IodGhpcy5hKTt0aGlzLmI9dGhpcy5hPXRoaXMuZz10aGlzLmM9bnVsbDtLLmkudS5jYWxsKHRoaXMpfTtoLnNhPWZ1bmN0aW9uKGEsYil7dGhpcy50YShhLFJjKHRoaXMpLGIpfTsKaC50YT1mdW5jdGlvbihhLGIsYyl7cSghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLm0mJihjfHwhdGhpcy5tKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZigwPmJ8fGI+UmModGhpcykpdGhyb3cgRXJyb3IoIkNoaWxkIGNvbXBvbmVudCBpbmRleCBvdXQgb2YgYm91bmRzIik7dGhpcy5nJiZ0aGlzLmN8fCh0aGlzLmc9e30sdGhpcy5jPVtdKTtpZihhLmI9PXRoaXMpe3ZhciBkPUxjKGEpO3RoaXMuZ1tkXT1hO0hhKHRoaXMuYyxhKX1lbHNlIHFhKHRoaXMuZyxMYyhhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuYiYmYS5ZKXt2YXIgZT1hLmI7ZD1hLlk7ZS5nJiZkPyhlPWUuZyxkPShudWxsIT09ZSYmZCBpbiBlP2VbZF06dm9pZCAwKXx8bnVsbCk6ZD1udWxsfWlmKGQmJmEuYiE9dGhpcyl0aHJvdyBFcnJvcigiVW5hYmxlIHRvIHNldCBwYXJlbnQgY29tcG9uZW50Iik7CmEuYj10aGlzO0suaS5yYS5jYWxsKGEsdGhpcyk7TGEodGhpcy5jLGIsMCxhKTtpZihhLm0mJnRoaXMubSYmYS5iPT10aGlzKWM9dGhpcy5qYSgpLGI9Yy5jaGlsZE5vZGVzW2JdfHxudWxsLGIhPWEuZigpJiZjLmluc2VydEJlZm9yZShhLmYoKSxiKTtlbHNlIGlmKGMpe3RoaXMuYXx8dGhpcy5pYSgpO2M9TCh0aGlzLGIrMSk7Yj10aGlzLmphKCk7Yz1jP2MuYTpudWxsO2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTthLmF8fGEuaWEoKTtiP2IuaW5zZXJ0QmVmb3JlKGEuYSxjfHxudWxsKTphLmouYS5ib2R5LmFwcGVuZENoaWxkKGEuYSk7YS5iJiYhYS5iLm18fGEuRCgpfWVsc2UgdGhpcy5tJiYhYS5tJiZhLmEmJmEuYS5wYXJlbnROb2RlJiYxPT1hLmEucGFyZW50Tm9kZS5ub2RlVHlwZSYmYS5EKCl9O2guamE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hfTsKdmFyIFNjPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEucWEpe3ZhciBiPWEubT9hLmE6YS5qLmEuYm9keTthOnt2YXIgYz1xYihiKTtpZihjLmRlZmF1bHRWaWV3JiZjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihjPWMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpKSl7Yz1jLmRpcmVjdGlvbnx8Yy5nZXRQcm9wZXJ0eVZhbHVlKCJkaXJlY3Rpb24iKXx8IiI7YnJlYWsgYX1jPSIifWEucWE9InJ0bCI9PShjfHwoYi5jdXJyZW50U3R5bGU/Yi5jdXJyZW50U3R5bGUuZGlyZWN0aW9uOm51bGwpfHxiLnN0eWxlJiZiLnN0eWxlLmRpcmVjdGlvbil9cmV0dXJuIGEucWF9LFJjPWZ1bmN0aW9uKGEpe3JldHVybiBhLmM/YS5jLmxlbmd0aDowfSxMPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuYz9hLmNbYl18fG51bGw6bnVsbH0sUWM9ZnVuY3Rpb24oYSxiLGMpe2EuYyYmcihhLmMsYixjKX0sVGM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jJiZiP0RhKGEuYyxiKTotMX07dmFyIFZjPWZ1bmN0aW9uKGEsYil7aWYoIWEpdGhyb3cgRXJyb3IoIkludmFsaWQgY2xhc3MgbmFtZSAiK2EpO2lmKCFpYShiKSl0aHJvdyBFcnJvcigiSW52YWxpZCBkZWNvcmF0b3IgZnVuY3Rpb24gIitiKTtVY1thXT1ifSxXYz17fSxVYz17fTt2YXIgWGM9ZnVuY3Rpb24oYSl7dGhpcy5oPWF9O2RhKFhjKTt2YXIgWWM9ZnVuY3Rpb24oYSxiKXthJiYoYS50YWJJbmRleD1iPzA6LTEpfSwkYz1mdW5jdGlvbihhLGIsYyl7Yy5pZCYmTWMoYixjLmlkKTt2YXIgZD1hLmIoKSxlPSExLGY9RChjKTtmJiZyKGYsZnVuY3Rpb24oZyl7Zz09ZD9lPSEwOmcmJnRoaXMuZyhiLGcsZCl9LGEpO2V8fEViKGMsZCk7WmMoYixjKTtyZXR1cm4gY307WGMucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiLGMpe2I9PWMrIi1kaXNhYmxlZCI/YS5aKCExKTpiPT1jKyItaG9yaXpvbnRhbCI/YWQoYSwiaG9yaXpvbnRhbCIpOmI9PWMrIi12ZXJ0aWNhbCImJmFkKGEsInZlcnRpY2FsIil9Owp2YXIgWmM9ZnVuY3Rpb24oYSxiKXtpZihiKWZvcih2YXIgYz1iLmZpcnN0Q2hpbGQsZDtjJiZjLnBhcmVudE5vZGU9PWI7KXtkPWMubmV4dFNpYmxpbmc7aWYoMT09Yy5ub2RlVHlwZSl7YTp7dmFyIGU9YztxKGUpO2U9RChlKTtmb3IodmFyIGY9MCxnPWUubGVuZ3RoO2Y8ZztmKyspe3ZhciBrPWVbZl07aWYoaz1rIGluIFVjP1VjW2tdKCk6bnVsbCl7ZT1rO2JyZWFrIGF9fWU9bnVsbH1lJiYoZS5hPWMsYS5pc0VuYWJsZWQoKXx8ZS5aKCExKSxhLnNhKGUpLFBjKGUsYykpfWVsc2UgYy5ub2RlVmFsdWUmJiIiIT1NYShjLm5vZGVWYWx1ZSl8fGIucmVtb3ZlQ2hpbGQoYyk7Yz1kfX0sYmQ9ZnVuY3Rpb24oYSxiKXtiPWIuZigpO3EoYiwiVGhlIGNvbnRhaW5lciBET00gZWxlbWVudCBjYW5ub3QgYmUgbnVsbC4iKTtIYyhiLHgpO3YmJihiLmhpZGVGb2N1cz0hMCk7KGE9YS5oKSYmdmIoYixhKX07WGMucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKWGMucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5iKCksYz1bYiwiaG9yaXpvbnRhbCI9PWEuSD9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgTT1mdW5jdGlvbigpe30sY2Q7ZGEoTSk7dmFyIGRkPXtidXR0b246InByZXNzZWQiLGNoZWNrYm94OiJjaGVja2VkIixtZW51aXRlbToic2VsZWN0ZWQiLG1lbnVpdGVtY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtcmFkaW86ImNoZWNrZWQiLHJhZGlvOiJjaGVja2VkIix0YWI6InNlbGVjdGVkIix0cmVlaXRlbToic2VsZWN0ZWQifTtNLnByb3RvdHlwZS5oPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLmouYigiRElWIixlZCh0aGlzLGEpLmpvaW4oIiAiKSxhLmJhKX07dmFyIGdkPWZ1bmN0aW9uKGEsYixjKXtpZihhPWEuZj9hLmYoKTphKXt2YXIgZD1bYl07diYmIUEoIjciKSYmKGQ9ZmQoRChhKSxiKSxkLnB1c2goYikpOyhjP0ZiOkhiKShhLGQpfX07Ck0ucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiKXtiLmlkJiZNYyhhLGIuaWQpO2ImJmIuZmlyc3RDaGlsZD9oZChhLGIuZmlyc3RDaGlsZC5uZXh0U2libGluZz9KYShiLmNoaWxkTm9kZXMpOmIuZmlyc3RDaGlsZCk6YS5iYT1udWxsO3ZhciBjPTAsZD10aGlzLmEoKSxlPXRoaXMuYSgpLGY9ITEsZz0hMSxrPSExLHA9SmEoRChiKSk7cihwLGZ1bmN0aW9uKEIpe2Z8fEIhPWQ/Z3x8QiE9ZT9jfD1pZCh0aGlzLEIpOmc9ITA6KGY9ITAsZT09ZCYmKGc9ITApKTsxPT1pZCh0aGlzLEIpJiYoQWEoYiksc2IoYikmJnRiKGIpJiZyYihiLCExKSl9LHRoaXMpO2Eubz1jO2Z8fChwLnB1c2goZCksZT09ZCYmKGc9ITApKTtnfHxwLnB1c2goZSk7KGE9YS53YSkmJnAucHVzaC5hcHBseShwLGEpO2lmKHYmJiFBKCI3Iikpe3ZhciB3PWZkKHApOzA8dy5sZW5ndGgmJihwLnB1c2guYXBwbHkocCx3KSxrPSEwKX1mJiZnJiYhYSYmIWt8fENiKGIscC5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIGpkPWZ1bmN0aW9uKGEsYil7aWYoYT1hLmgoKSl7cShiLCJUaGUgZWxlbWVudCBwYXNzZWQgYXMgYSBmaXJzdCBwYXJhbWV0ZXIgY2Fubm90IGJlIG51bGwuIik7dmFyIGM9Yi5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDthIT1jJiZ2YihiLGEpfX0sa2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYztpZihhLnYmMzImJihjPWEuZigpKSl7aWYoIWImJmEubyYzMil7dHJ5e2MuYmx1cigpfWNhdGNoKGQpe31hLm8mMzImJmEuRmEobnVsbCl9KHNiKGMpJiZ0YihjKSkhPWImJnJiKGMsYil9fSxsZD1mdW5jdGlvbihhLGIsYyl7Y2R8fChjZD17MToiZGlzYWJsZWQiLDg6InNlbGVjdGVkIiwxNjoiY2hlY2tlZCIsNjQ6ImV4cGFuZGVkIn0pO3EoYSwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO2I9Y2RbYl07dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDtkJiYoZD1kZFtkXXx8YixiPSJjaGVja2VkIj09Ynx8InNlbGVjdGVkIj09CmI/ZDpiKTtiJiZ4YihhLGIsYyl9O00ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250cm9sIn07CnZhciBlZD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuYSgpLGQ9W2NdLGU9YS5hKCk7ZSE9YyYmZC5wdXNoKGUpO2M9Yi5vO2ZvcihlPVtdO2M7KXt2YXIgZj1jJi1jO2UucHVzaChtZChhLGYpKTtjJj1+Zn1kLnB1c2guYXBwbHkoZCxlKTsoYT1iLndhKSYmZC5wdXNoLmFwcGx5KGQsYSk7diYmIUEoIjciKSYmZC5wdXNoLmFwcGx5KGQsZmQoZCkpO3JldHVybiBkfSxmZD1mdW5jdGlvbihhLGIpe3ZhciBjPVtdO2ImJihhPUlhKGEsW2JdKSk7cihbXSxmdW5jdGlvbihkKXshRmEoZCxsYShHYSxhKSl8fGImJiFHYShkLGIpfHxjLnB1c2goZC5qb2luKCJfIikpfSk7cmV0dXJuIGN9LG1kPWZ1bmN0aW9uKGEsYil7YS5ifHxuZChhKTtyZXR1cm4gYS5iW2JdfSxpZD1mdW5jdGlvbihhLGIpe2Euanx8KGEuYnx8bmQoYSksYS5qPXNhKGEuYikpO2E9cGFyc2VJbnQoYS5qW2JdLDEwKTtyZXR1cm4gaXNOYU4oYSk/MDphfSxuZD1mdW5jdGlvbihhKXt2YXIgYj1hLmEoKSxjPSF0KGIucmVwbGFjZSgvXHhhMHxccy9nLAoiICIpLCIgIik7cShjLCJDb250cm9sUmVuZGVyZXIgaGFzIGFuIGludmFsaWQgY3NzIGNsYXNzOiAnIitiKyInIik7YS5iPXsxOmIrIi1kaXNhYmxlZCIsMjpiKyItaG92ZXIiLDQ6YisiLWFjdGl2ZSIsODpiKyItc2VsZWN0ZWQiLDE2OmIrIi1jaGVja2VkIiwzMjpiKyItZm9jdXNlZCIsNjQ6YisiLW9wZW4ifX07dmFyIE49ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO2lmKCFiKXtiPXRoaXMuY29uc3RydWN0b3I7Zm9yKHZhciBkO2I7KXtkPWJbamFdfHwoYltqYV09KytrYSk7aWYoZD1XY1tkXSlicmVhaztiPWIuaT9iLmkuY29uc3RydWN0b3I6bnVsbH1iPWQ/aWEoZC5SKT9kLlIoKTpuZXcgZDpudWxsfXRoaXMuQj1iO3RoaXMuYmE9dm9pZCAwIT09YT9hOm51bGx9O24oTixLKTtoPU4ucHJvdG90eXBlO2guYmE9bnVsbDtoLm89MDtoLnY9Mzk7aC5LPTA7aC5JYT0hMDtoLndhPW51bGw7aC55YT0hMDtoLmlhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CLmModGhpcyk7dGhpcy5hPWE7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmeGIoYSwiaGlkZGVuIiwhMCkpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hPXRoaXMuQi5nKHRoaXMsYSk7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5JYT0ibm9uZSIhPWEuc3R5bGUuZGlzcGxheX07CmguRD1mdW5jdGlvbigpe04uaS5ELmNhbGwodGhpcyk7dmFyIGE9TmModGhpcyk7cSh0aGlzKTtxKGEpO3RoaXMuaXNWaXNpYmxlKCl8fHhiKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fGxkKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy52JjgmJmxkKGEsOCwhISh0aGlzLm8mOCkpO3RoaXMudiYxNiYmbGQoYSwxNiwhISh0aGlzLm8mMTYpKTt0aGlzLnYmNjQmJmxkKGEsNjQsISEodGhpcy5vJjY0KSk7YT10aGlzLkI7U2ModGhpcykmJmdkKHRoaXMuZigpLGEuYSgpKyItcnRsIiwhMCk7dGhpcy5pc0VuYWJsZWQoKSYma2QodGhpcyx0aGlzLmlzVmlzaWJsZSgpKTtpZih0aGlzLnYmLTImJih0aGlzLnlhJiZvZCh0aGlzLCEwKSx0aGlzLnYmMzImJihhPXRoaXMuZigpKSkpe3ZhciBiPXRoaXMuV3x8KHRoaXMuVz1uZXcgSik7emMoYixhKTtIKEgoSChPYyh0aGlzKSxiLCJrZXkiLHRoaXMuZmEpLGEsImZvY3VzIix0aGlzLk5hKSxhLCJibHVyIiwKdGhpcy5GYSl9fTt2YXIgb2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYz1PYyhhKSxkPWEuZigpO2I/KEgoSChIKEgoYyxkLEYuTCxhLmthKSxkLFtGLk0sRi5hYV0sYS5sYSksZCwibW91c2VvdmVyIixhLkFhKSxkLCJtb3VzZW91dCIsYS56YSksYS5lYSE9Y2EmJkgoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fEgoYyxkLCJkYmxjbGljayIsYS5KYSksYS5nYXx8KGEuZ2E9bmV3IHBkKGEpLHpiKGEsbGEoQWIsYS5nYSkpKSkpOihxYyhxYyhxYyhxYyhjLGQsRi5MLGEua2EpLGQsW0YuTSxGLmFhXSxhLmxhKSxkLCJtb3VzZW92ZXIiLGEuQWEpLGQsIm1vdXNlb3V0IixhLnphKSxhLmVhIT1jYSYmcWMoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fHFjKGMsZCwiZGJsY2xpY2siLGEuSmEpLEFiKGEuZ2EpLGEuZ2E9bnVsbCkpfTsKTi5wcm90b3R5cGUuUD1mdW5jdGlvbigpe04uaS5QLmNhbGwodGhpcyk7dGhpcy5XJiZGYyh0aGlzLlcpO3RoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJmtkKHRoaXMsITEpfTtOLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7Ti5pLnUuY2FsbCh0aGlzKTt0aGlzLlcmJih0aGlzLlcuTigpLGRlbGV0ZSB0aGlzLlcpO2RlbGV0ZSB0aGlzLkI7dGhpcy5nYT10aGlzLndhPXRoaXMuYmE9bnVsbH07dmFyIGhkPWZ1bmN0aW9uKGEsYil7YS5iYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm8mMSl9OwpOLnByb3RvdHlwZS5aPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYjtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0VuYWJsZWQmJiFiLmlzRW5hYmxlZCgpfHwhTyh0aGlzLDEsIWEpfHwoYXx8KHFkKHRoaXMsITEpLFAodGhpcywhMSkpLHRoaXMuaXNWaXNpYmxlKCkmJmtkKHRoaXMsYSksUSh0aGlzLDEsIWEsITApKX07CnZhciBQPWZ1bmN0aW9uKGEsYil7TyhhLDIsYikmJlEoYSwyLGIpfSxxZD1mdW5jdGlvbihhLGIpe08oYSw0LGIpJiZRKGEsNCxiKX0scmQ9ZnVuY3Rpb24oYSxiKXtPKGEsOCxiKSYmUShhLDgsYil9LHNkPWZ1bmN0aW9uKGEsYil7TyhhLDY0LGIpJiZRKGEsNjQsYil9LFE9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIWQmJjE9PWIpYS5aKCFjKTtlbHNlIGlmKGEudiZiJiZjIT0hIShhLm8mYikpe3ZhciBlPWEuQjtpZihkPWEuZigpKShlPW1kKGUsYikpJiZnZChhLGUsYyksbGQoZCxiLGMpO2Eubz1jP2Eub3xiOmEubyZ+Yn19LHRkPWZ1bmN0aW9uKGEsYixjKXtpZihhLm0mJmEubyZiJiYhYyl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTshYyYmYS5vJmImJlEoYSxiLCExKTthLnY9Yz9hLnZ8YjphLnYmfmJ9LFI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hISgyNTUmYikmJiEhKGEudiZiKX0sTz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuISEoYS52JmIpJiYhIShhLm8mCmIpIT1jJiYoIShhLksmYil8fHVjKGEsS2MoYixjKSkpJiYhYS5VfTtoPU4ucHJvdG90eXBlO2guQWE9ZnVuY3Rpb24oYSl7KCFhLnJlbGF0ZWRUYXJnZXR8fCFwYih0aGlzLmYoKSxhLnJlbGF0ZWRUYXJnZXQpKSYmdWModGhpcywiZW50ZXIiKSYmdGhpcy5pc0VuYWJsZWQoKSYmUih0aGlzLDIpJiZQKHRoaXMsITApfTtoLnphPWZ1bmN0aW9uKGEpe2EucmVsYXRlZFRhcmdldCYmcGIodGhpcy5mKCksYS5yZWxhdGVkVGFyZ2V0KXx8IXVjKHRoaXMsImxlYXZlIil8fChSKHRoaXMsNCkmJnFkKHRoaXMsITEpLFIodGhpcywyKSYmUCh0aGlzLCExKSl9O2guZWE9Y2E7Cmgua2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSxPYihhKSYmISh5JiZ6JiZhLmN0cmxLZXkpKSl7Uih0aGlzLDQpJiZxZCh0aGlzLCEwKTt2YXIgYjtpZihiPXRoaXMuQil7dmFyIGM7Yj10aGlzLnYmMzImJihjPXRoaXMuZigpKT9zYihjKSYmdGIoYyk6ITF9YiYmdGhpcy5mKCkuZm9jdXMoKX0hT2IoYSl8fHkmJnomJmEuY3RybEtleXx8YS5nKCl9O2gubGE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSx0aGlzLm8mNCYmdWQodGhpcyxhKSYmUih0aGlzLDQpJiZxZCh0aGlzLCExKSl9O2guSmE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmdWQodGhpcyxhKX07CnZhciB1ZD1mdW5jdGlvbihhLGIpe2lmKFIoYSwxNikpe3ZhciBjPSEoYS5vJjE2KTtPKGEsMTYsYykmJlEoYSwxNixjKX1SKGEsOCkmJnJkKGEsITApO1IoYSw2NCkmJnNkKGEsIShhLm8mNjQpKTtjPW5ldyBFKCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuQT1iLkEpO3JldHVybiB1YyhhLGMpfTtOLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe1IodGhpcywzMikmJk8odGhpcywzMiwhMCkmJlEodGhpcywzMiwhMCl9O04ucHJvdG90eXBlLkZhPWZ1bmN0aW9uKCl7Uih0aGlzLDQpJiZxZCh0aGlzLCExKTtSKHRoaXMsMzIpJiZPKHRoaXMsMzIsITEpJiZRKHRoaXMsMzIsITEpfTsKTi5wcm90b3R5cGUuZmE9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJjEzPT1hLmMmJnVkKHRoaXMsYSk/KGEuZygpLGEuaigpLCEwKTohMX07aWYoIWlhKE4pKXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBjbGFzcyAiK04pO2lmKCFpYShNKSl0aHJvdyBFcnJvcigiSW52YWxpZCByZW5kZXJlciBjbGFzcyAiK00pO3ZhciB2ZD1OW2phXXx8KE5bamFdPSsra2EpO1djW3ZkXT1NO1ZjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIHBkPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9ITE7dGhpcy5jPW5ldyBvYyh0aGlzKTt6Yih0aGlzLGxhKEFiLHRoaXMuYykpO2E9TmModGhpcy5iKTtIKEgoSCh0aGlzLmMsYSxGLkwsdGhpcy5oKSxhLEYuTSx0aGlzLmopLGEsImNsaWNrIix0aGlzLmcpfTtuKHBkLEMpO3ZhciB3ZD0hdnx8OTw9TnVtYmVyKGliKTsKcGQucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXt0aGlzLmE9ITF9O3BkLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7dGhpcy5hPSEwfTt2YXIgeGQ9ZnVuY3Rpb24oYSxiKXtpZighd2QpcmV0dXJuIGEuYnV0dG9uPTAsYS50eXBlPWIsYTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudHMiKTtjLmluaXRNb3VzZUV2ZW50KGIsYS5idWJibGVzLGEuY2FuY2VsYWJsZSxhLnZpZXd8fG51bGwsYS5kZXRhaWwsYS5zY3JlZW5YLGEuc2NyZWVuWSxhLmNsaWVudFgsYS5jbGllbnRZLGEuY3RybEtleSxhLmFsdEtleSxhLnNoaWZ0S2V5LGEubWV0YUtleSwwLGEucmVsYXRlZFRhcmdldHx8bnVsbCk7cmV0dXJuIGN9OwpwZC5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXtpZih0aGlzLmEpdGhpcy5hPSExO2Vsc2V7dmFyIGI9YS5iLGM9Yi5idXR0b24sZD1iLnR5cGUsZT14ZChiLCJtb3VzZWRvd24iKTt0aGlzLmIua2EobmV3IEcoZSxhLmEpKTtlPXhkKGIsIm1vdXNldXAiKTt0aGlzLmIubGEobmV3IEcoZSxhLmEpKTt3ZHx8KGIuYnV0dG9uPWMsYi50eXBlPWQpfX07cGQucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt0aGlzLmI9bnVsbDtwZC5pLnUuY2FsbCh0aGlzKX07dmFyIFM9ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO3RoaXMuZGE9Ynx8WGMuUigpO3RoaXMuSD1hfHwidmVydGljYWwifTtuKFMsSyk7aD1TLnByb3RvdHlwZTtoLkRhPW51bGw7aC5jYT1udWxsO2guZGE9bnVsbDtoLkg9bnVsbDtoLlQ9ITA7aC5PPSEwO2gubD0tMTtoLnM9bnVsbDtoLlY9ITE7aC5JPW51bGw7dmFyIHlkPWZ1bmN0aW9uKGEpe3JldHVybiBhLkRhfHxhLmYoKX07aD1TLnByb3RvdHlwZTtoLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPXRoaXMuai5iKCJESVYiLHRoaXMuZGEuYyh0aGlzKS5qb2luKCIgIikpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKGEpe3JldHVybiJESVYiPT1hLnRhZ05hbWV9O2gudmE9ZnVuY3Rpb24oYSl7dGhpcy5hPSRjKHRoaXMuZGEsdGhpcyxhKTsibm9uZSI9PWEuc3R5bGUuZGlzcGxheSYmKHRoaXMuVD0hMSl9OwpoLkQ9ZnVuY3Rpb24oKXtTLmkuRC5jYWxsKHRoaXMpO1FjKHRoaXMsZnVuY3Rpb24oYil7Yi5tJiZ6ZCh0aGlzLGIpfSx0aGlzKTt2YXIgYT10aGlzLmYoKTtiZCh0aGlzLmRhLHRoaXMpO0FkKHRoaXMsdGhpcy5UKTtIKEgoSChIKEgoSChIKEgoT2ModGhpcyksdGhpcywiZW50ZXIiLHRoaXMuV2EpLHRoaXMsImhpZ2hsaWdodCIsdGhpcy5YYSksdGhpcywidW5oaWdobGlnaHQiLHRoaXMuY2IpLHRoaXMsIm9wZW4iLHRoaXMuWWEpLHRoaXMsImNsb3NlIix0aGlzLlVhKSxhLEYuTCx0aGlzLlNhKSxxYihhKSxbRi5NLEYuYWFdLHRoaXMuVmEpLGEsW0YuTCxGLk0sRi5hYSwibW91c2VvdmVyIiwibW91c2VvdXQiLCJjb250ZXh0bWVudSJdLHRoaXMuVGEpO0JkKHRoaXMpfTt2YXIgQmQ9ZnVuY3Rpb24oYSl7dmFyIGI9T2MoYSksYz15ZChhKTtIKEgoSChiLGMsImZvY3VzIixhLkhhKSxjLCJibHVyIixhLlFhKSxhLmNhfHwoYS5jYT1uZXcgSih5ZChhKSkpLCJrZXkiLGEuUmEpfTtoPVMucHJvdG90eXBlOwpoLlA9ZnVuY3Rpb24oKXtDZCh0aGlzLC0xKTt0aGlzLnMmJnNkKHRoaXMucywhMSk7dGhpcy5WPSExO1MuaS5QLmNhbGwodGhpcyl9O2gudT1mdW5jdGlvbigpe1MuaS51LmNhbGwodGhpcyk7dGhpcy5jYSYmKHRoaXMuY2EuTigpLHRoaXMuY2E9bnVsbCk7dGhpcy5kYT10aGlzLnM9dGhpcy5JPXRoaXMuRGE9bnVsbH07aC5XYT1mdW5jdGlvbigpe3JldHVybiEwfTsKaC5YYT1mdW5jdGlvbihhKXt2YXIgYj1UYyh0aGlzLGEudGFyZ2V0KTtpZigtMTxiJiZiIT10aGlzLmwpe3ZhciBjPUwodGhpcyx0aGlzLmwpO2MmJlAoYywhMSk7dGhpcy5sPWI7Yz1MKHRoaXMsdGhpcy5sKTt0aGlzLlYmJnFkKGMsITApO3RoaXMucyYmYyE9dGhpcy5zJiYoYy52JjY0P3NkKGMsITApOnNkKHRoaXMucywhMSkpfWI9dGhpcy5mKCk7cShiLCJUaGUgRE9NIGVsZW1lbnQgZm9yIHRoZSBjb250YWluZXIgY2Fubm90IGJlIG51bGwuIik7bnVsbCE9YS50YXJnZXQuZigpJiZ4YihiLCJhY3RpdmVkZXNjZW5kYW50IixhLnRhcmdldC5mKCkuaWQpfTtoLmNiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT1MKHRoaXMsdGhpcy5sKSYmKHRoaXMubD0tMSk7YT10aGlzLmYoKTtxKGEsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnJlbW92ZUF0dHJpYnV0ZSh3YigiYWN0aXZlZGVzY2VuZGFudCIpKX07CmguWWE9ZnVuY3Rpb24oYSl7KGE9YS50YXJnZXQpJiZhIT10aGlzLnMmJmEuYj09dGhpcyYmKHRoaXMucyYmc2QodGhpcy5zLCExKSx0aGlzLnM9YSl9O2guVWE9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMucyYmKHRoaXMucz1udWxsKTt2YXIgYj10aGlzLmYoKSxjPWEudGFyZ2V0LmYoKTtiJiZhLnRhcmdldC5vJjImJmMmJihhPSIiLGMmJihhPWMuaWQscShhLCJUaGUgYWN0aXZlIGVsZW1lbnQgc2hvdWxkIGhhdmUgYW4gaWQuIikpLHhiKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEpKX07aC5TYT1mdW5jdGlvbihhKXt0aGlzLk8mJih0aGlzLlY9ITApO3ZhciBiPXlkKHRoaXMpO2ImJnNiKGIpJiZ0YihiKT9iLmZvY3VzKCk6YS5nKCl9O2guVmE9ZnVuY3Rpb24oKXt0aGlzLlY9ITF9OwpoLlRhPWZ1bmN0aW9uKGEpe2E6e3ZhciBiPWEudGFyZ2V0O2lmKHRoaXMuSSlmb3IodmFyIGM9dGhpcy5mKCk7YiYmYiE9PWM7KXt2YXIgZD1iLmlkO2lmKGQgaW4gdGhpcy5JKXtiPXRoaXMuSVtkXTticmVhayBhfWI9Yi5wYXJlbnROb2RlfWI9bnVsbH1pZihiKXN3aXRjaChhLnR5cGUpe2Nhc2UgRi5MOmIua2EoYSk7YnJlYWs7Y2FzZSBGLk06Y2FzZSBGLmFhOmIubGEoYSk7YnJlYWs7Y2FzZSAibW91c2VvdmVyIjpiLkFhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3V0IjpiLnphKGEpO2JyZWFrO2Nhc2UgImNvbnRleHRtZW51IjpiLmVhKGEpfX07aC5IYT1mdW5jdGlvbigpe307aC5RYT1mdW5jdGlvbigpe0NkKHRoaXMsLTEpO3RoaXMuVj0hMTt0aGlzLnMmJnNkKHRoaXMucywhMSl9OwpoLlJhPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmlzRW5hYmxlZCgpJiZ0aGlzLmlzVmlzaWJsZSgpJiYoMCE9UmModGhpcyl8fHRoaXMuRGEpJiZEZCh0aGlzLGEpPyhhLmcoKSxhLmooKSwhMCk6ITF9Owp2YXIgRGQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1MKGEsYS5sKTtpZihjJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5mYSYmYy5mYShiKXx8YS5zJiZhLnMhPWMmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLnMuZmEmJmEucy5mYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuYyl7Y2FzZSAyNzp5ZChhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpFZChhKTticmVhaztjYXNlIDM1OkZkKGEpO2JyZWFrO2Nhc2UgMzg6aWYoInZlcnRpY2FsIj09YS5IKUdkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9IZChhKTpHZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoInZlcnRpY2FsIj09YS5IKUhkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9HZChhKTpIZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSx6ZD1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZigpO2M9Yy5pZHx8KGMuaWQ9TGMoYikpO2EuSXx8KGEuST17fSk7YS5JW2NdPWJ9O1MucHJvdG90eXBlLnNhPWZ1bmN0aW9uKGEsYil7Q2EoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtTLmkuc2EuY2FsbCh0aGlzLGEsYil9O1MucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEsYixjKXtDYShhLE4pO2EuS3w9MjthLkt8PTY0O3RkKGEsMzIsITEpO2EubSYmMCE9YS55YSYmb2QoYSwhMSk7YS55YT0hMTt2YXIgZD1hLmI9PXRoaXM/VGModGhpcyxhKTotMTtTLmkudGEuY2FsbCh0aGlzLGEsYixjKTthLm0mJnRoaXMubSYmemQodGhpcyxhKTthPWQ7LTE9PWEmJihhPVJjKHRoaXMpKTthPT10aGlzLmw/dGhpcy5sPU1hdGgubWluKFJjKHRoaXMpLTEsYik6YT50aGlzLmwmJmI8PXRoaXMubD90aGlzLmwrKzphPHRoaXMubCYmYj50aGlzLmwmJnRoaXMubC0tfTsKdmFyIGFkPWZ1bmN0aW9uKGEsYil7aWYoYS5mKCkpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5IPWJ9O1MucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O3ZhciBBZD1mdW5jdGlvbihhLGIpe2EuVD1iO3ZhciBjPWEuZigpO2MmJihjLnN0eWxlLmRpc3BsYXk9Yj8iIjoibm9uZSIsWWMoeWQoYSksYS5PJiZhLlQpKX07Uy5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT307Uy5wcm90b3R5cGUuWj1mdW5jdGlvbihhKXt0aGlzLk8hPWEmJnVjKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5PPSEwLFFjKHRoaXMsZnVuY3Rpb24oYil7Yi5MYT9kZWxldGUgYi5MYTpiLlooITApfSkpOihRYyh0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5aKCExKTpiLkxhPSEwfSksdGhpcy5WPXRoaXMuTz0hMSksWWMoeWQodGhpcyksYSYmdGhpcy5UKSl9Owp2YXIgQ2Q9ZnVuY3Rpb24oYSxiKXsoYj1MKGEsYikpP1AoYiwhMCk6LTE8YS5sJiZQKEwoYSxhLmwpLCExKX0sRWQ9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LFJjKGEpLTEpfSxGZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiAwPmI/Yy0xOmJ9LDApfSxIZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7cmV0dXJuKGIrMSklY30sYS5sKX0sR2Q9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe2ItLTtyZXR1cm4gMD5iP2MtMTpifSxhLmwpfSxJZD1mdW5jdGlvbihhLGIsYyl7Yz0wPmM/VGMoYSxhLnMpOmM7dmFyIGQ9UmMoYSk7Yz1iLmNhbGwoYSxjLGQpO2Zvcih2YXIgZT0wO2U8PWQ7KXt2YXIgZj1MKGEsYyksZztpZihnPWYpZz1mLmlzVmlzaWJsZSgpJiZmLmlzRW5hYmxlZCgpJiYhIShmLnYmMik7aWYoZyl7YS5FYShjKTticmVha31lKys7Yz1iLmNhbGwoYSxjLGQpfX07ClMucHJvdG90eXBlLkVhPWZ1bmN0aW9uKGEpe0NkKHRoaXMsYSl9O3ZhciBUPWZ1bmN0aW9uKCl7fTtuKFQsTSk7ZGEoVCk7VC5wcm90b3R5cGUuYT1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYiJ9O1QucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXtyZXR1cm4idGFiIn07VC5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYj1ULmkuYy5jYWxsKHRoaXMsYSk7KGE9YS5QYSkmJmImJihiLnRpdGxlPWF8fCIiKTtyZXR1cm4gYn07VC5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIpe2I9VC5pLmcuY2FsbCh0aGlzLGEsYik7dmFyIGM9Yi50aXRsZXx8IiI7YyYmKGEuUGE9Yyk7YS5vJjgmJihjPWEuYikmJmlhKGMuRykmJihRKGEsOCwhMSksYy5HKGEpKTtyZXR1cm4gYn07dmFyIEpkPWZ1bmN0aW9uKGEsYixjKXtOLmNhbGwodGhpcyxhLGJ8fFQuUigpLGMpO3RkKHRoaXMsOCwhMCk7dGhpcy5LfD05fTtuKEpkLE4pO1ZjKCJnb29nLXRhYiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEpkKG51bGwpfSk7dmFyIFU9ZnVuY3Rpb24oKXt0aGlzLmg9InRhYmxpc3QifTtuKFUsWGMpO2RhKFUpO1UucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWItYmFyIn07VS5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIsYyl7dGhpcy5qfHwodGhpcy5hfHxLZCh0aGlzKSx0aGlzLmo9c2EodGhpcy5hKSk7dmFyIGQ9dGhpcy5qW2JdO2Q/KGFkKGEsTGQoZCkpLGEuQj1kKTpVLmkuZy5jYWxsKHRoaXMsYSxiLGMpfTtVLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPVUuaS5jLmNhbGwodGhpcyxhKTt0aGlzLmF8fEtkKHRoaXMpO2IucHVzaCh0aGlzLmFbYS5CXSk7cmV0dXJuIGJ9O3ZhciBLZD1mdW5jdGlvbihhKXt2YXIgYj1hLmIoKTthLmE9e3RvcDpiKyItdG9wIixib3R0b206YisiLWJvdHRvbSIsc3RhcnQ6YisiLXN0YXJ0IixlbmQ6YisiLWVuZCJ9fTt2YXIgVj1mdW5jdGlvbihhLGIsYyl7YT1hfHwidG9wIjthZCh0aGlzLExkKGEpKTt0aGlzLkI9YTtTLmNhbGwodGhpcyx0aGlzLkgsYnx8VS5SKCksYyk7TWQodGhpcyl9O24oVixTKTtoPVYucHJvdG90eXBlO2guQz1udWxsO2guRD1mdW5jdGlvbigpe1YuaS5ELmNhbGwodGhpcyk7TWQodGhpcyl9O2gudT1mdW5jdGlvbigpe1YuaS51LmNhbGwodGhpcyk7dGhpcy5DPW51bGx9O2guRWE9ZnVuY3Rpb24oYSl7Vi5pLkVhLmNhbGwodGhpcyxhKTt0aGlzLkcoTCh0aGlzLGEpKX07aC5HPWZ1bmN0aW9uKGEpe2E/cmQoYSwhMCk6dGhpcy5DJiZyZCh0aGlzLkMsITEpfTsKdmFyIE5kPWZ1bmN0aW9uKGEsYil7aWYoYiYmYj09YS5DKXtmb3IodmFyIGM9VGMoYSxiKSxkPWMtMTtiPUwoYSxkKTtkLS0pe3ZhciBlPWI7aWYoZS5pc1Zpc2libGUoKSYmZS5pc0VuYWJsZWQoKSl7YS5HKGIpO3JldHVybn19Zm9yKGMrPTE7Yj1MKGEsYyk7YysrKWlmKGQ9YixkLmlzVmlzaWJsZSgpJiZkLmlzRW5hYmxlZCgpKXthLkcoYik7cmV0dXJufWEuRyhudWxsKX19O2g9Vi5wcm90b3R5cGU7aC5hYj1mdW5jdGlvbihhKXt0aGlzLkMmJnRoaXMuQyE9YS50YXJnZXQmJnJkKHRoaXMuQywhMSk7dGhpcy5DPWEudGFyZ2V0fTtoLmJiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT10aGlzLkMmJih0aGlzLkM9bnVsbCl9O2guWmE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guJGE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guSGE9ZnVuY3Rpb24oKXtMKHRoaXMsdGhpcy5sKXx8Q2QodGhpcyxUYyh0aGlzLHRoaXMuQ3x8TCh0aGlzLDApKSl9Owp2YXIgTWQ9ZnVuY3Rpb24oYSl7SChIKEgoSChPYyhhKSxhLCJzZWxlY3QiLGEuYWIpLGEsInVuc2VsZWN0IixhLmJiKSxhLCJkaXNhYmxlIixhLlphKSxhLCJoaWRlIixhLiRhKX0sTGQ9ZnVuY3Rpb24oYSl7cmV0dXJuInN0YXJ0Ij09YXx8ImVuZCI9PWE/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O1ZjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBWfSk7ZnVuY3Rpb24gT2QoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIFBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgZz1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIrZyk7Zm9yKHZhciBrPVtdLHA9YmEoYyksdz1wLm5leHQoKTshdy5kb25lO3c9cC5uZXh0KCkpe3c9dy52YWx1ZTt2YXIgQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKQi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO0IudGV4dENvbnRlbnQ9dztmLmFwcGVuZENoaWxkKEIpO2sucHVzaChCKX0iYm90dG9tIiE9ZyYmZS5hcHBlbmRDaGlsZChmKTtwPW51bGw7aWYoInRvcCI9PWd8fCJib3R0b20iPT1nKXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTsidG9wIj09ZyYmcCYmZS5hcHBlbmRDaGlsZChwKTtCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0IuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciByYT1bXTtjPWJhKGMpO2Zvcih3PWMubmV4dCgpOyF3LmRvbmU7dz1jLm5leHQoKSl3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHcuaWQ9ZS5pZCsiX2NvbnRlbnRfIityYS5sZW5ndGgsdy5zdHlsZS5kaXNwbGF5PSJub25lIixCLmFwcGVuZENoaWxkKHcpLHJhLnB1c2godyk7ZS5hcHBlbmRDaGlsZChCKTsiYm90dG9tIj09ZyYmKHAmJgplLmFwcGVuZENoaWxkKHApLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBYPW5ldyBWKGcpO1BjKFgsZik7dmFyIFk9LTE7ZGMoWCwic2VsZWN0IixmdW5jdGlvbihaKXtaPWsuaW5kZXhPZihaLnRhcmdldC5mKCkpO1ohPVkmJigwPD1ZJiZZPHJhLmxlbmd0aCYmKHJhW1ldLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFk9LTEpLDA8PVomJlo8cmEubGVuZ3RoJiYoWT1aLHJhW1ldLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksWC5HKEwoWCxZKSkpfSk7WC5HKEwoWCxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFope1guRyhMKFgsWikpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChPZChhKSl9LFFkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sVz1sOwpRZFswXWluIFd8fCJ1bmRlZmluZWQiPT10eXBlb2YgVy5leGVjU2NyaXB0fHxXLmV4ZWNTY3JpcHQoInZhciAiK1FkWzBdKTtmb3IodmFyIFJkO1FkLmxlbmd0aCYmKFJkPVFkLnNoaWZ0KCkpOylRZC5sZW5ndGh8fHZvaWQgMD09PVBkP1dbUmRdJiZXW1JkXSE9PU9iamVjdC5wcm90b3R5cGVbUmRdP1c9V1tSZF06Vz1XW1JkXT17fTpXW1JkXT1QZDt9KS5jYWxsKHRoaXMpOwovLyBjbGFuZy1mb3JtYXQgb24K", + "headers": [ + [ + "content-type", + "application/javascript" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + } + } + }, + "executionInfo": { + "elapsed": 1384, + "status": "ok", + "timestamp": 1600709859544, + "user": { + "displayName": "Evgeny Skvortsov", + "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhiQjODaOVLfYnUuWS9rB3LRntzJDM0hqElzsUkdQ=s64", + "userId": "11510585406840398626" + }, + "user_tz": 420 + }, + "id": "8j0eyM1LanX_", + "outputId": "5344c202-d704-4c05-bcd6-022f967ed707" + }, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id73" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id73" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id73" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"246b1bcc-fc31-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id73\", \"tabNames\": [\"Test\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_1ce3c050b0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id73" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"246b5c5e-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id73\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_39af795fad" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id73" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"246d379a-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_ff3d532d43" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_1", + "outputarea_id73" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"246db47c-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id73_content_1\");\n", + "//# sourceURL=js_9f3cb1d525" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_1", + "outputarea_id73" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"246e1b74-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"246db47c-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_dcbe43415e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_1", + "outputarea_id73" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"246eb606-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id73\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_d9b06b8c05" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_1", + "outputarea_id73" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running Test\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"24714ff6-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"246d379a-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_c93970d4b2" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_1", + "outputarea_id73" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2472e708-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_944aed9fba" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_0", + "outputarea_id73" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"24733014-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id73_content_0\");\n", + "//# sourceURL=js_0dd1aa474b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_0", + "outputarea_id73" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2473722c-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"24733014-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_47f71405ad" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_0", + "outputarea_id73" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2473bd2c-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id73\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_20aad6d198" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_0", + "outputarea_id73" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_0", + "outputarea_id73", + "outputarea_id74", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_0", + "outputarea_id73", + "outputarea_id74", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_0", + "outputarea_id73", + "outputarea_id74", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2475cc7a-fc31-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id74\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_8e792e0129" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_0", + "outputarea_id73", + "outputarea_id74", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"247810c0-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id74\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_9bbc768c59" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_0", + "outputarea_id73", + "outputarea_id74", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"247a48d6-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_6130cf1592" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_0", + "id74_content_0", + "outputarea_id73", + "outputarea_id74", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"247a8af8-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id74_content_0\");\n", + "//# sourceURL=js_2ca0e2e1b3" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_0", + "id74_content_0", + "outputarea_id73", + "outputarea_id74", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"247ae200-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"247a8af8-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_cd35d2f9f8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_0", + "id74_content_0", + "outputarea_id73", + "outputarea_id74", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"247b25ee-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id74\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_0608b7435c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_0", + "id74_content_0", + "outputarea_id73", + "outputarea_id74", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mTest_sql\u001b[0m variable.\n", + "SELECT\n", + " x_3 AS x,\n", + " (((((POW(x_3, 2))) - (((2) * (x_3))))) + (1)) AS y\n", + "FROM\n", + " UNNEST([0, 0.5, 1.0, 1.5, 2.0]) as x_3;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"247c383a-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"247a48d6-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_af5434a059" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_0", + "id74_content_0", + "outputarea_id73", + "outputarea_id74", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"247d655c-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2472e708-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_685992a749" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_0", + "outputarea_id73" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"247ede1e-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_21c6e5b4a6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_1", + "outputarea_id73" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"247f2360-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id73_content_1\");\n", + "//# sourceURL=js_0b8bb1a155" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_1", + "outputarea_id73" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"247f6ba4-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"247f2360-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_f96ca66da7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_1", + "outputarea_id73" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"247fb10e-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id73\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_a6b2470ce6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_1", + "outputarea_id73" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"24ff3898-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"247ede1e-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_28fa98db04" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_1", + "outputarea_id73" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"25011910-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_fbac137687" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_0", + "outputarea_id73" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2501754a-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id73_content_0\");\n", + "//# sourceURL=js_4674930308" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_0", + "outputarea_id73" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2501dbb6-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2501754a-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_123adcad38" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_0", + "outputarea_id73" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"25024042-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id73\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_a4bfccbaca" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_0", + "outputarea_id73" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2503e762-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_ff7bf9479e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_0", + "id74_content_1", + "outputarea_id73", + "outputarea_id74", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"25045044-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id74_content_1\");\n", + "//# sourceURL=js_fcbdd4f8fb" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_0", + "id74_content_1", + "outputarea_id73", + "outputarea_id74", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2504b4bc-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"25045044-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_9cea094ca6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_0", + "id74_content_1", + "outputarea_id73", + "outputarea_id74", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"25051a4c-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id74\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_43cf8d940d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_0", + "id74_content_1", + "outputarea_id73", + "outputarea_id74", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mTest\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
xy
00.01.00
10.50.25
21.00.00
31.50.25
42.01.00
\n", + "
" + ], + "text/plain": [ + " x y\n", + "0 0.0 1.00\n", + "1 0.5 0.25\n", + "2 1.0 0.00\n", + "3 1.5 0.25\n", + "4 2.0 1.00" + ] + }, + "metadata": { + "tags": [ + "id73_content_0", + "id74_content_1", + "outputarea_id73", + "outputarea_id74", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2508bfb2-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2503e762-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_0844c5e16e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_0", + "id74_content_1", + "outputarea_id73", + "outputarea_id74", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"250a909e-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"25011910-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_0f2984b216" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id73_content_0", + "outputarea_id73" + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "%%logica Test\n", + "\n", + "F(x) = x ^ 2 - 2 * x + 1;\n", + "\n", + "Test(x:, y: F(x)) :- x in [0, 0.5, 1.0, 1.5, 2.0];" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "O8Tz_rL3NXdh" + }, + "source": [ + "### Functional aggregation\n", + "\n", + "You can compute predicate's value via an aggregation, just like with any other field.\n", + "If predicate value is aggregated then keyword `distinct` is not needed (must not be used actually), as it's already very clear\n", + "that an aggregation is performed." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 239, + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH0=", + "headers": [ + [ + "content-type", + "text/css" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgaCxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9ZnVuY3Rpb24oYSl7dmFyIGI9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmYVtTeW1ib2wuaXRlcmF0b3JdO3JldHVybiBiP2IuY2FsbChhKTp7bmV4dDphYShhKX19LGw9dGhpc3x8c2VsZixjYT1mdW5jdGlvbigpe30sZGE9ZnVuY3Rpb24oYSl7YS5CYT12b2lkIDA7YS5SPWZ1bmN0aW9uKCl7cmV0dXJuIGEuQmE/YS5CYTphLkJhPW5ldyBhfX0sZWE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7aWYoIm9iamVjdCI9PWIpaWYoYSl7aWYoYSBpbnN0YW5jZW9mIEFycmF5KXJldHVybiJhcnJheSI7aWYoYSBpbnN0YW5jZW9mIE9iamVjdClyZXR1cm4gYjt2YXIgYz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk7aWYoIltvYmplY3QgV2luZG93XSI9PWMpcmV0dXJuIm9iamVjdCI7CmlmKCJbb2JqZWN0IEFycmF5XSI9PWN8fCJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGgmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5zcGxpY2UmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoInNwbGljZSIpKXJldHVybiJhcnJheSI7aWYoIltvYmplY3QgRnVuY3Rpb25dIj09Y3x8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmNhbGwmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoImNhbGwiKSlyZXR1cm4iZnVuY3Rpb24ifWVsc2UgcmV0dXJuIm51bGwiO2Vsc2UgaWYoImZ1bmN0aW9uIj09YiYmInVuZGVmaW5lZCI9PXR5cGVvZiBhLmNhbGwpcmV0dXJuIm9iamVjdCI7cmV0dXJuIGJ9LGZhPWZ1bmN0aW9uKGEpe3JldHVybiJhcnJheSI9PWVhKGEpfSxoYT1mdW5jdGlvbihhKXt2YXIgYj1lYShhKTtyZXR1cm4iYXJyYXkiPT1ifHwib2JqZWN0Ij09CmImJiJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGh9LGlhPWZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PWVhKGEpfSxtPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBhO3JldHVybiJvYmplY3QiPT1iJiZudWxsIT1hfHwiZnVuY3Rpb24iPT1ifSxqYT0iY2xvc3VyZV91aWRfIisoMUU5Kk1hdGgucmFuZG9tKCk+Pj4wKSxrYT0wLGxhPWZ1bmN0aW9uKGEsYil7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe3ZhciBkPWMuc2xpY2UoKTtkLnB1c2guYXBwbHkoZCxhcmd1bWVudHMpO3JldHVybiBhLmFwcGx5KHRoaXMsZCl9fSxuPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe31jLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLmk9Yi5wcm90b3R5cGU7YS5wcm90b3R5cGU9bmV3IGM7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YX07dmFyIG1hLG5hPXtlYjoiYWN0aXZlZGVzY2VuZGFudCIsamI6ImF0b21pYyIsa2I6ImF1dG9jb21wbGV0ZSIsbWI6ImJ1c3kiLHBiOiJjaGVja2VkIixxYjoiY29saW5kZXgiLHZiOiJjb250cm9scyIseGI6ImRlc2NyaWJlZGJ5IixBYjoiZGlzYWJsZWQiLENiOiJkcm9wZWZmZWN0IixEYjoiZXhwYW5kZWQiLEViOiJmbG93dG8iLEdiOiJncmFiYmVkIixLYjoiaGFzcG9wdXAiLE1iOiJoaWRkZW4iLE9iOiJpbnZhbGlkIixQYjoibGFiZWwiLFFiOiJsYWJlbGxlZGJ5IixSYjoibGV2ZWwiLFdiOiJsaXZlIixrYzoibXVsdGlsaW5lIixsYzoibXVsdGlzZWxlY3RhYmxlIixwYzoib3JpZW50YXRpb24iLHFjOiJvd25zIixyYzoicG9zaW5zZXQiLHRjOiJwcmVzc2VkIix4YzoicmVhZG9ubHkiLHpjOiJyZWxldmFudCIsQWM6InJlcXVpcmVkIixFYzoicm93aW5kZXgiLEhjOiJzZWxlY3RlZCIsSmM6InNldHNpemUiLExjOiJzb3J0IixaYzoidmFsdWVtYXgiLCRjOiJ2YWx1ZW1pbiIsYWQ6InZhbHVlbm93IiwKYmQ6InZhbHVldGV4dCJ9O3ZhciBvYT1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkIGluIGEpYi5jYWxsKGMsYVtkXSxkLGEpfSxwYT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyBpbiBhKWlmKGFbY109PWIpcmV0dXJuITA7cmV0dXJuITF9LHFhPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsIT09YSYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfSxzYT1mdW5jdGlvbihhKXt2YXIgYj17fSxjO2ZvcihjIGluIGEpYlthW2NdXT1jO3JldHVybiBifSx0YT0iY29uc3RydWN0b3IgaGFzT3duUHJvcGVydHkgaXNQcm90b3R5cGVPZiBwcm9wZXJ0eUlzRW51bWVyYWJsZSB0b0xvY2FsZVN0cmluZyB0b1N0cmluZyB2YWx1ZU9mIi5zcGxpdCgiICIpLHVhPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8dGEubGVuZ3RoO2YrKyljPQp0YVtmXSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZCxjKSYmKGFbY109ZFtjXSl9fTt2YXIgdmE9e2ZiOiJhbGVydCIsZ2I6ImFsZXJ0ZGlhbG9nIixoYjoiYXBwbGljYXRpb24iLGliOiJhcnRpY2xlIixsYjoiYmFubmVyIixuYjoiYnV0dG9uIixvYjoiY2hlY2tib3giLHJiOiJjb2x1bW5oZWFkZXIiLHNiOiJjb21ib2JveCIsdGI6ImNvbXBsZW1lbnRhcnkiLHViOiJjb250ZW50aW5mbyIsd2I6ImRlZmluaXRpb24iLHliOiJkaWFsb2ciLHpiOiJkaXJlY3RvcnkiLEJiOiJkb2N1bWVudCIsRmI6ImZvcm0iLEhiOiJncmlkIixJYjoiZ3JpZGNlbGwiLEpiOiJncm91cCIsTGI6ImhlYWRpbmciLE5iOiJpbWciLFNiOiJsaW5rIixUYjoibGlzdCIsVWI6Imxpc3Rib3giLFZiOiJsaXN0aXRlbSIsWGI6ImxvZyIsWWI6Im1haW4iLFpiOiJtYXJxdWVlIiwkYjoibWF0aCIsYWM6Im1lbnUiLGJjOiJtZW51YmFyIixjYzoibWVudWl0ZW0iLGRjOiJtZW51aXRlbWNoZWNrYm94IixlYzoibWVudWl0ZW1yYWRpbyIsbWM6Im5hdmlnYXRpb24iLG5jOiJub3RlIixvYzoib3B0aW9uIiwKc2M6InByZXNlbnRhdGlvbiIsdWM6InByb2dyZXNzYmFyIix2YzoicmFkaW8iLHdjOiJyYWRpb2dyb3VwIix5YzoicmVnaW9uIixCYzoicm93IixDYzoicm93Z3JvdXAiLERjOiJyb3doZWFkZXIiLEZjOiJzY3JvbGxiYXIiLEdjOiJzZWFyY2giLEljOiJzZXBhcmF0b3IiLEtjOiJzbGlkZXIiLE1jOiJzcGluYnV0dG9uIixOYzoic3RhdHVzIixPYzoidGFiIixQYzoidGFibGlzdCIsUWM6InRhYnBhbmVsIixSYzoidGV4dGJveCIsU2M6InRleHRpbmZvIixUYzoidGltZXIiLFVjOiJ0b29sYmFyIixWYzoidG9vbHRpcCIsV2M6InRyZWUiLFhjOiJ0cmVlZ3JpZCIsWWM6InRyZWVpdGVtIn07dmFyIHdhPWZ1bmN0aW9uKGEpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsd2EpO2Vsc2V7dmFyIGI9RXJyb3IoKS5zdGFjaztiJiYodGhpcy5zdGFjaz1iKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSl9O24od2EsRXJyb3IpO3dhLnByb3RvdHlwZS5uYW1lPSJDdXN0b21FcnJvciI7dmFyIHhhO3ZhciB5YT1mdW5jdGlvbihhLGIpe2E9YS5zcGxpdCgiJXMiKTtmb3IodmFyIGM9IiIsZD1hLmxlbmd0aC0xLGU9MDtlPGQ7ZSsrKWMrPWFbZV0rKGU8Yi5sZW5ndGg/YltlXToiJXMiKTt3YS5jYWxsKHRoaXMsYythW2RdKX07bih5YSx3YSk7eWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjsKdmFyIHphPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSJBc3NlcnRpb24gZmFpbGVkIjtpZihjKXtlKz0iOiAiK2M7dmFyIGY9ZH1lbHNlIGEmJihlKz0iOiAiK2EsZj1iKTt0aHJvdyBuZXcgeWEoIiIrZSxmfHxbXSk7fSxxPWZ1bmN0aW9uKGEsYixjKXthfHx6YSgiIixudWxsLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX0sQWE9ZnVuY3Rpb24oYSxiLGMpe20oYSkmJjE9PWEubm9kZVR5cGV8fHphKCJFeHBlY3RlZCBFbGVtZW50IGJ1dCBnb3QgJXM6ICVzLiIsW2VhKGEpLGFdLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKX0sQ2E9ZnVuY3Rpb24oYSxiLGMsZCl7YSBpbnN0YW5jZW9mIGJ8fHphKCJFeHBlY3RlZCBpbnN0YW5jZW9mICVzIGJ1dCBnb3QgJXMuIixbQmEoYiksQmEoYSldLGMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpKX0sQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZgpGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTpudWxsPT09YT8ibnVsbCI6dHlwZW9mIGF9O3ZhciBEYT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3EobnVsbCE9YS5sZW5ndGgpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKCJzdHJpbmciPT09dHlwZW9mIGEpcmV0dXJuInN0cmluZyIhPT10eXBlb2YgYnx8MSE9Yi5sZW5ndGg/LTE6YS5pbmRleE9mKGIsMCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspaWYoYyBpbiBhJiZhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX0scj1BcnJheS5wcm90b3R5cGUuZm9yRWFjaD9mdW5jdGlvbihhLGIsYyl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsYyl9OmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9YS5sZW5ndGgsZT0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZj0wO2Y8ZDtmKyspZiBpbiBlJiZiLmNhbGwoYyxlW2ZdLGYsYSl9LEVhPUFycmF5LnByb3RvdHlwZS5maWx0ZXI/CmZ1bmN0aW9uKGEsYil7cShudWxsIT1hLmxlbmd0aCk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD1bXSxlPTAsZj0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZz0wO2c8YztnKyspaWYoZyBpbiBmKXt2YXIgaz1mW2ddO2IuY2FsbCh2b2lkIDAsayxnLGEpJiYoZFtlKytdPWspfXJldHVybiBkfSxGYT1BcnJheS5wcm90b3R5cGUuZXZlcnk/ZnVuY3Rpb24oYSxiKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmV2ZXJ5LmNhbGwoYSxiLHZvaWQgMCl9OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWEubGVuZ3RoLGQ9InN0cmluZyI9PT10eXBlb2YgYT9hLnNwbGl0KCIiKTphLGU9MDtlPGM7ZSsrKWlmKGUgaW4gZCYmIWIuY2FsbCh2b2lkIDAsZFtlXSxlLGEpKXJldHVybiExO3JldHVybiEwfSxHYT1mdW5jdGlvbihhLGIpe3JldHVybiAwPD0KRGEoYSxiKX0sSGE9ZnVuY3Rpb24oYSxiKXtiPURhKGEsYik7dmFyIGM7aWYoYz0wPD1iKXEobnVsbCE9YS5sZW5ndGgpLEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhLGIsMSk7cmV0dXJuIGN9LElhPWZ1bmN0aW9uKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGFyZ3VtZW50cyl9LEphPWZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDA8Yil7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX0sTGE9ZnVuY3Rpb24oYSxiLGMsZCl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShhLEthKGFyZ3VtZW50cywxKSl9LEthPWZ1bmN0aW9uKGEsYixjKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gMj49YXJndW1lbnRzLmxlbmd0aD9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsYixjKX07dmFyIE1hPVN0cmluZy5wcm90b3R5cGUudHJpbT9mdW5jdGlvbihhKXtyZXR1cm4gYS50cmltKCl9OmZ1bmN0aW9uKGEpe3JldHVybi9eW1xzXHhhMF0qKFtcc1xTXSo/KVtcc1x4YTBdKiQvLmV4ZWMoYSlbMV19LE5hPS8mL2csT2E9LzwvZyxQYT0vPi9nLFFhPS8iL2csUmE9LycvZyxTYT0vXHgwMC9nLFRhPS9bXHgwMCY8PiInXS8sdD1mdW5jdGlvbihhLGIpe3JldHVybi0xIT1hLmluZGV4T2YoYil9LFVhPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE8Yj8tMTphPmI/MTowfTt2YXIgdTthOnt2YXIgVmE9bC5uYXZpZ2F0b3I7aWYoVmEpe3ZhciBXYT1WYS51c2VyQWdlbnQ7aWYoV2Epe3U9V2E7YnJlYWsgYX19dT0iIn07LyoKCiBDb3B5cmlnaHQgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzLgogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKKi8KdmFyIFhhPWZ1bmN0aW9uKGEpe1RhLnRlc3QoYSkmJigtMSE9YS5pbmRleE9mKCImIikmJihhPWEucmVwbGFjZShOYSwiJmFtcDsiKSksLTEhPWEuaW5kZXhPZigiPCIpJiYoYT1hLnJlcGxhY2UoT2EsIiZsdDsiKSksLTEhPWEuaW5kZXhPZigiPiIpJiYoYT1hLnJlcGxhY2UoUGEsIiZndDsiKSksLTEhPWEuaW5kZXhPZignIicpJiYoYT1hLnJlcGxhY2UoUWEsIiZxdW90OyIpKSwtMSE9YS5pbmRleE9mKCInIikmJihhPWEucmVwbGFjZShSYSwiJiMzOTsiKSksLTEhPWEuaW5kZXhPZigiXHgwMCIpJiYoYT1hLnJlcGxhY2UoU2EsIiYjMDsiKSkpO3JldHVybiBhfTt2YXIgWWE9ZnVuY3Rpb24oYSl7WWFbIiAiXShhKTtyZXR1cm4gYX07WWFbIiAiXT1jYTt2YXIgJGE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1aYTtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsYSk/Y1thXTpjW2FdPWIoYSl9O3ZhciBhYj10KHUsIk9wZXJhIiksdj10KHUsIlRyaWRlbnQiKXx8dCh1LCJNU0lFIiksYmI9dCh1LCJFZGdlIikseD10KHUsIkdlY2tvIikmJiEodCh1LnRvTG93ZXJDYXNlKCksIndlYmtpdCIpJiYhdCh1LCJFZGdlIikpJiYhKHQodSwiVHJpZGVudCIpfHx0KHUsIk1TSUUiKSkmJiF0KHUsIkVkZ2UiKSx5PXQodS50b0xvd2VyQ2FzZSgpLCJ3ZWJraXQiKSYmIXQodSwiRWRnZSIpLHo9dCh1LCJNYWNpbnRvc2giKSxjYj1mdW5jdGlvbigpe3ZhciBhPWwuZG9jdW1lbnQ7cmV0dXJuIGE/YS5kb2N1bWVudE1vZGU6dm9pZCAwfSxkYjsKYTp7dmFyIGViPSIiLGZiPWZ1bmN0aW9uKCl7dmFyIGE9dTtpZih4KXJldHVybi9ydjooW15cKTtdKykoXCl8OykvLmV4ZWMoYSk7aWYoYmIpcmV0dXJuL0VkZ2VcLyhbXGRcLl0rKS8uZXhlYyhhKTtpZih2KXJldHVybi9cYig/Ok1TSUV8cnYpWzogXShbXlwpO10rKShcKXw7KS8uZXhlYyhhKTtpZih5KXJldHVybi9XZWJLaXRcLyhcUyspLy5leGVjKGEpO2lmKGFiKXJldHVybi8oPzpWZXJzaW9uKVsgXC9dPyhcUyspLy5leGVjKGEpfSgpO2ZiJiYoZWI9ZmI/ZmJbMV06IiIpO2lmKHYpe3ZhciBnYj1jYigpO2lmKG51bGwhPWdiJiZnYj5wYXJzZUZsb2F0KGViKSl7ZGI9U3RyaW5nKGdiKTticmVhayBhfX1kYj1lYn0KdmFyIGhiPWRiLFphPXt9LEE9ZnVuY3Rpb24oYSl7cmV0dXJuICRhKGEsZnVuY3Rpb24oKXtmb3IodmFyIGI9MCxjPU1hKFN0cmluZyhoYikpLnNwbGl0KCIuIiksZD1NYShTdHJpbmcoYSkpLnNwbGl0KCIuIiksZT1NYXRoLm1heChjLmxlbmd0aCxkLmxlbmd0aCksZj0wOzA9PWImJmY8ZTtmKyspe3ZhciBnPWNbZl18fCIiLGs9ZFtmXXx8IiI7ZG97Zz0vKFxkKikoXEQqKSguKikvLmV4ZWMoZyl8fFsiIiwiIiwiIiwiIl07az0vKFxkKikoXEQqKSguKikvLmV4ZWMoayl8fFsiIiwiIiwiIiwiIl07aWYoMD09Z1swXS5sZW5ndGgmJjA9PWtbMF0ubGVuZ3RoKWJyZWFrO2I9VWEoMD09Z1sxXS5sZW5ndGg/MDpwYXJzZUludChnWzFdLDEwKSwwPT1rWzFdLmxlbmd0aD8wOnBhcnNlSW50KGtbMV0sMTApKXx8VWEoMD09Z1syXS5sZW5ndGgsMD09a1syXS5sZW5ndGgpfHxVYShnWzJdLGtbMl0pO2c9Z1szXTtrPWtbM119d2hpbGUoMD09Yil9cmV0dXJuIDA8PWJ9KX0saWI7CmliPWwuZG9jdW1lbnQmJnY/Y2IoKTp2b2lkIDA7dmFyIGpiPSF2fHw5PD1OdW1iZXIoaWIpO3ZhciBsYj1mdW5jdGlvbihhLGIpe29hKGIsZnVuY3Rpb24oYyxkKXtjJiYib2JqZWN0Ij09dHlwZW9mIGMmJmMuZGQmJihjPWMuY2QoKSk7InN0eWxlIj09ZD9hLnN0eWxlLmNzc1RleHQ9YzoiY2xhc3MiPT1kP2EuY2xhc3NOYW1lPWM6ImZvciI9PWQ/YS5odG1sRm9yPWM6a2IuaGFzT3duUHJvcGVydHkoZCk/YS5zZXRBdHRyaWJ1dGUoa2JbZF0sYyk6MD09ZC5sYXN0SW5kZXhPZigiYXJpYS0iLDApfHwwPT1kLmxhc3RJbmRleE9mKCJkYXRhLSIsMCk/YS5zZXRBdHRyaWJ1dGUoZCxjKTphW2RdPWN9KX0sa2I9e2NlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjb2xzcGFuOiJjb2xTcGFuIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGhlaWdodDoiaGVpZ2h0IixtYXhsZW5ndGg6Im1heExlbmd0aCIsbm9uY2U6Im5vbmNlIixyb2xlOiJyb2xlIixyb3dzcGFuOiJyb3dTcGFuIix0eXBlOiJ0eXBlIix1c2VtYXA6InVzZU1hcCIsdmFsaWduOiJ2QWxpZ24iLAp3aWR0aDoid2lkdGgifSxtYj1mdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChrKXtrJiZiLmFwcGVuZENoaWxkKCJzdHJpbmciPT09dHlwZW9mIGs/YS5jcmVhdGVUZXh0Tm9kZShrKTprKX1mb3IodmFyIGU9MjtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXTtpZighaGEoZil8fG0oZikmJjA8Zi5ub2RlVHlwZSlkKGYpO2Vsc2V7YTp7aWYoZiYmIm51bWJlciI9PXR5cGVvZiBmLmxlbmd0aCl7aWYobShmKSl7dmFyIGc9ImZ1bmN0aW9uIj09dHlwZW9mIGYuaXRlbXx8InN0cmluZyI9PXR5cGVvZiBmLml0ZW07YnJlYWsgYX1pZihpYShmKSl7Zz0iZnVuY3Rpb24iPT10eXBlb2YgZi5pdGVtO2JyZWFrIGF9fWc9ITF9cihnP0phKGYpOmYsZCl9fX0sbmI9ZnVuY3Rpb24oYSxiKXtiPVN0cmluZyhiKTsiYXBwbGljYXRpb24veGh0bWwreG1sIj09PWEuY29udGVudFR5cGUmJihiPWIudG9Mb3dlckNhc2UoKSk7cmV0dXJuIGEuY3JlYXRlRWxlbWVudChiKX0sb2I9ZnVuY3Rpb24oYSl7YSYmCmEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpfSxwYj1mdW5jdGlvbihhLGIpe2lmKCFhfHwhYilyZXR1cm4hMTtpZihhLmNvbnRhaW5zJiYxPT1iLm5vZGVUeXBlKXJldHVybiBhPT1ifHxhLmNvbnRhaW5zKGIpO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbilyZXR1cm4gYT09Ynx8ISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNik7Zm9yKDtiJiZhIT1iOyliPWIucGFyZW50Tm9kZTtyZXR1cm4gYj09YX0scWI9ZnVuY3Rpb24oYSl7cShhLCJOb2RlIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4iKTtyZXR1cm4gOT09YS5ub2RlVHlwZT9hOmEub3duZXJEb2N1bWVudHx8YS5kb2N1bWVudH0scmI9ZnVuY3Rpb24oYSxiKXtiP2EudGFiSW5kZXg9MDooYS50YWJJbmRleD0tMSxhLnJlbW92ZUF0dHJpYnV0ZSgidGFiSW5kZXgiKSl9LHNiPWZ1bmN0aW9uKGEpe3JldHVybiB2JiYhQSgiOSIpPyhhPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKSwKbnVsbCE9YSYmYS5zcGVjaWZpZWQpOmEuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpfSx0Yj1mdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgYSYmMDw9YSYmMzI3Njg+YX0sdWI9ZnVuY3Rpb24oYSl7dGhpcy5hPWF8fGwuZG9jdW1lbnR8fGRvY3VtZW50fTt1Yi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBhP3RoaXMuYS5nZXRFbGVtZW50QnlJZChhKTphfTsKdWIucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuYSxlPWFyZ3VtZW50cyxmPVN0cmluZyhlWzBdKSxnPWVbMV07aWYoIWpiJiZnJiYoZy5uYW1lfHxnLnR5cGUpKXtmPVsiPCIsZl07Zy5uYW1lJiZmLnB1c2goJyBuYW1lPSInLFhhKGcubmFtZSksJyInKTtpZihnLnR5cGUpe2YucHVzaCgnIHR5cGU9IicsWGEoZy50eXBlKSwnIicpO3ZhciBrPXt9O3VhKGssZyk7ZGVsZXRlIGsudHlwZTtnPWt9Zi5wdXNoKCI+Iik7Zj1mLmpvaW4oIiIpfWY9bmIoZCxmKTtnJiYoInN0cmluZyI9PT10eXBlb2YgZz9mLmNsYXNzTmFtZT1nOmZhKGcpP2YuY2xhc3NOYW1lPWcuam9pbigiICIpOmxiKGYsZykpOzI8ZS5sZW5ndGgmJm1iKGQsZixlKTtyZXR1cm4gZn07dmFyIHZiPWZ1bmN0aW9uKGEsYil7Yj8ocShwYSh2YSxiKSwiTm8gc3VjaCBBUklBIHJvbGUgIitiKSxhLnNldEF0dHJpYnV0ZSgicm9sZSIsYikpOmEucmVtb3ZlQXR0cmlidXRlKCJyb2xlIil9LHhiPWZ1bmN0aW9uKGEsYixjKXtmYShjKSYmKGM9Yy5qb2luKCIgIikpO3ZhciBkPXdiKGIpOyIiPT09Y3x8dm9pZCAwPT1jPyhtYXx8KG1hPXthdG9taWM6ITEsYXV0b2NvbXBsZXRlOiJub25lIixkcm9wZWZmZWN0OiJub25lIixoYXNwb3B1cDohMSxsaXZlOiJvZmYiLG11bHRpbGluZTohMSxtdWx0aXNlbGVjdGFibGU6ITEsb3JpZW50YXRpb246InZlcnRpY2FsIixyZWFkb25seTohMSxyZWxldmFudDoiYWRkaXRpb25zIHRleHQiLHJlcXVpcmVkOiExLHNvcnQ6Im5vbmUiLGJ1c3k6ITEsZGlzYWJsZWQ6ITEsaGlkZGVuOiExLGludmFsaWQ6ImZhbHNlIn0pLGM9bWEsYiBpbiBjP2Euc2V0QXR0cmlidXRlKGQsY1tiXSk6YS5yZW1vdmVBdHRyaWJ1dGUoZCkpOmEuc2V0QXR0cmlidXRlKGQsCmMpfSx3Yj1mdW5jdGlvbihhKXtxKGEsIkFSSUEgYXR0cmlidXRlIGNhbm5vdCBiZSBlbXB0eS4iKTtxKHBhKG5hLGEpLCJObyBzdWNoIEFSSUEgYXR0cmlidXRlICIrYSk7cmV0dXJuImFyaWEtIithfTt2YXIgeWI9T2JqZWN0LmZyZWV6ZXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O3ZhciBDPWZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVTt0aGlzLko9dGhpcy5KfTtDLnByb3RvdHlwZS5VPSExO0MucHJvdG90eXBlLk49ZnVuY3Rpb24oKXt0aGlzLlV8fCh0aGlzLlU9ITAsdGhpcy51KCkpfTt2YXIgemI9ZnVuY3Rpb24oYSxiKXthLlU/YigpOihhLkp8fChhLko9W10pLGEuSi5wdXNoKGIpKX07Qy5wcm90b3R5cGUudT1mdW5jdGlvbigpe2lmKHRoaXMuSilmb3IoO3RoaXMuSi5sZW5ndGg7KXRoaXMuSi5zaGlmdCgpKCl9O3ZhciBBYj1mdW5jdGlvbihhKXthJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5OJiZhLk4oKX07dmFyIEJiPWZ1bmN0aW9uKGEpe3JldHVybiJzdHJpbmciPT10eXBlb2YgYS5jbGFzc05hbWU/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sRD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6QmIoYSkubWF0Y2goL1xTKy9nKXx8W119LENiPWZ1bmN0aW9uKGEsYil7InN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZT9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxEYj1mdW5jdGlvbihhLGIpe3JldHVybiBhLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5jb250YWlucyhiKTpHYShEKGEpLGIpfSxFYj1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFEYihhLGIpKXt2YXIgYz1CYihhKTtDYihhLGMrKDA8Yy5sZW5ndGg/IiAiK2I6YikpfX0sRmI9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClyKGIsCmZ1bmN0aW9uKGUpe0ViKGEsZSl9KTtlbHNle3ZhciBjPXt9O3IoRChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7cihiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPTA8Yi5sZW5ndGg/IiAiK2Q6ZDtDYihhLGIpfX0sR2I9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6RGIoYSxiKSYmQ2IoYSxFYShEKGEpLGZ1bmN0aW9uKGMpe3JldHVybiBjIT1ifSkuam9pbigiICIpKX0sSGI9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9yKGIsZnVuY3Rpb24oYyl7R2IoYSxjKX0pOkNiKGEsRWEoRChhKSxmdW5jdGlvbihjKXtyZXR1cm4hR2EoYixjKX0pLmpvaW4oIiAiKSl9O3ZhciBJYj0hdnx8OTw9TnVtYmVyKGliKSxKYj0hdnx8OTw9TnVtYmVyKGliKSxLYj12JiYhQSgiOSIpLExiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e2wuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsY2EsYiksbC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjYSxiKX1jYXRjaChjKXt9cmV0dXJuIGF9KCk7dmFyIEU9ZnVuY3Rpb24oYSxiKXt0aGlzLnR5cGU9YTt0aGlzLmE9dGhpcy50YXJnZXQ9Yjt0aGlzLmg9ITE7dGhpcy5LYT0hMH07RS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuaD0hMH07RS5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3RoaXMuS2E9ITF9O3ZhciBGPXtMOiJtb3VzZWRvd24iLE06Im1vdXNldXAiLGFhOiJtb3VzZWNhbmNlbCIsaGM6Im1vdXNlbW92ZSIsamM6Im1vdXNlb3ZlciIsaWM6Im1vdXNlb3V0IixmYzoibW91c2VlbnRlciIsZ2M6Im1vdXNlbGVhdmUifTt2YXIgRz1mdW5jdGlvbihhLGIpe0UuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy5hPXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5jPTA7dGhpcy5BPXRoaXMubWV0YUtleT10aGlzLnNoaWZ0S2V5PXRoaXMuYWx0S2V5PXRoaXMuY3RybEtleT0hMTt0aGlzLnBvaW50ZXJJZD0wO3RoaXMucG9pbnRlclR5cGU9IiI7dGhpcy5iPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMuYT1iO2lmKGI9YS5yZWxhdGVkVGFyZ2V0KXtpZih4KXthOnt0cnl7WWEoYi5ub2RlTmFtZSk7dmFyIGU9ITA7YnJlYWsgYX1jYXRjaChmKXt9ZT0KITF9ZXx8KGI9bnVsbCl9fWVsc2UibW91c2VvdmVyIj09Yz9iPWEuZnJvbUVsZW1lbnQ6Im1vdXNlb3V0Ij09YyYmKGI9YS50b0VsZW1lbnQpO3RoaXMucmVsYXRlZFRhcmdldD1iO2Q/KHRoaXMuY2xpZW50WD12b2lkIDAhPT1kLmNsaWVudFg/ZC5jbGllbnRYOmQucGFnZVgsdGhpcy5jbGllbnRZPXZvaWQgMCE9PWQuY2xpZW50WT9kLmNsaWVudFk6ZC5wYWdlWSx0aGlzLnNjcmVlblg9ZC5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1kLnNjcmVlbll8fDApOih0aGlzLmNsaWVudFg9dm9pZCAwIT09YS5jbGllbnRYP2EuY2xpZW50WDphLnBhZ2VYLHRoaXMuY2xpZW50WT12b2lkIDAhPT1hLmNsaWVudFk/YS5jbGllbnRZOmEucGFnZVksdGhpcy5zY3JlZW5YPWEuc2NyZWVuWHx8MCx0aGlzLnNjcmVlblk9YS5zY3JlZW5ZfHwwKTt0aGlzLmJ1dHRvbj1hLmJ1dHRvbjt0aGlzLmM9YS5rZXlDb2RlfHwwO3RoaXMua2V5PWEua2V5fHwiIjt0aGlzLmN0cmxLZXk9YS5jdHJsS2V5O3RoaXMuYWx0S2V5PQphLmFsdEtleTt0aGlzLnNoaWZ0S2V5PWEuc2hpZnRLZXk7dGhpcy5tZXRhS2V5PWEubWV0YUtleTt0aGlzLkE9ej9hLm1ldGFLZXk6YS5jdHJsS2V5O3RoaXMucG9pbnRlcklkPWEucG9pbnRlcklkfHwwO3RoaXMucG9pbnRlclR5cGU9InN0cmluZyI9PT10eXBlb2YgYS5wb2ludGVyVHlwZT9hLnBvaW50ZXJUeXBlOk1iW2EucG9pbnRlclR5cGVdfHwiIjt0aGlzLmI9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnRoaXMuZygpfX07bihHLEUpO3ZhciBOYj15YihbMSw0LDJdKSxNYj15Yih7MjoidG91Y2giLDM6InBlbiIsNDoibW91c2UifSksT2I9ZnVuY3Rpb24oYSl7cmV0dXJuIEliPzA9PWEuYi5idXR0b246ImNsaWNrIj09YS50eXBlPyEwOiEhKGEuYi5idXR0b24mTmJbMF0pfTtHLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7Ry5pLmouY2FsbCh0aGlzKTt0aGlzLmIuc3RvcFByb3BhZ2F0aW9uP3RoaXMuYi5zdG9wUHJvcGFnYXRpb24oKTp0aGlzLmIuY2FuY2VsQnViYmxlPSEwfTsKRy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe0cuaS5nLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5iO2lmKGEucHJldmVudERlZmF1bHQpYS5wcmV2ZW50RGVmYXVsdCgpO2Vsc2UgaWYoYS5yZXR1cm5WYWx1ZT0hMSxLYil0cnl7aWYoYS5jdHJsS2V5fHwxMTI8PWEua2V5Q29kZSYmMTIzPj1hLmtleUNvZGUpYS5rZXlDb2RlPS0xfWNhdGNoKGIpe319O3ZhciBQYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKDFFNipNYXRoLnJhbmRvbSgpfDApLFFiPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW1BiXSl9LFJiPTA7dmFyIFNiPWZ1bmN0aW9uKGEsYixjLGQsZSl7dGhpcy5saXN0ZW5lcj1hO3RoaXMuYT1udWxsO3RoaXMuc3JjPWI7dGhpcy50eXBlPWM7dGhpcy5jYXB0dXJlPSEhZDt0aGlzLm1hPWU7dGhpcy5rZXk9KytSYjt0aGlzLlg9dGhpcy5oYT0hMX0sVGI9ZnVuY3Rpb24oYSl7YS5YPSEwO2EubGlzdGVuZXI9bnVsbDthLmE9bnVsbDthLnNyYz1udWxsO2EubWE9bnVsbH07dmFyIFViPWZ1bmN0aW9uKGEpe3RoaXMuc3JjPWE7dGhpcy5hPXt9O3RoaXMuYj0wfTtVYi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS50b1N0cmluZygpO2E9dGhpcy5hW2ZdO2F8fChhPXRoaXMuYVtmXT1bXSx0aGlzLmIrKyk7dmFyIGc9VmIoYSxiLGQsZSk7LTE8Zz8oYj1hW2ddLGN8fChiLmhhPSExKSk6KGI9bmV3IFNiKGIsdGhpcy5zcmMsZiwhIWQsZSksYi5oYT1jLGEucHVzaChiKSk7cmV0dXJuIGJ9Owp2YXIgV2I9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLnR5cGU7YyBpbiBhLmEmJkhhKGEuYVtjXSxiKSYmKFRiKGIpLDA9PWEuYVtjXS5sZW5ndGgmJihkZWxldGUgYS5hW2NdLGEuYi0tKSl9LFhiPWZ1bmN0aW9uKGEsYixjLGQsZSl7YT1hLmFbYi50b1N0cmluZygpXTtiPS0xO2EmJihiPVZiKGEsYyxkLGUpKTtyZXR1cm4tMTxiP2FbYl06bnVsbH0sVmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuWCYmZi5saXN0ZW5lcj09YiYmZi5jYXB0dXJlPT0hIWMmJmYubWE9PWQpcmV0dXJuIGV9cmV0dXJuLTF9O3ZhciBZYj0iY2xvc3VyZV9sbV8iKygxRTYqTWF0aC5yYW5kb20oKXwwKSxaYj17fSwkYj0wLGJjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZCYmZC5vbmNlKXJldHVybiBhYyhhLGIsYyxkLGUpO2lmKGZhKGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyliYyhhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9Y2MoYyk7cmV0dXJuIFFiKGEpP2RjKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOmVjKGEsYixjLCExLGQsZSl9LGVjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGc9bShlKT8hIWUuY2FwdHVyZTohIWUsaz1mYyhhKTtrfHwoYVtZYl09az1uZXcgVWIoYSkpO2M9ay5hZGQoYixjLGQsZyxmKTtpZihjLmEpcmV0dXJuIGM7ZD1nYygpO2MuYT1kO2Quc3JjPWE7ZC5saXN0ZW5lcj1jO2lmKGEuYWRkRXZlbnRMaXN0ZW5lcilMYnx8KGU9Zyksdm9pZCAwPT09ZSYmKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksCmQsZSk7ZWxzZSBpZihhLmF0dGFjaEV2ZW50KWEuYXR0YWNoRXZlbnQoaGMoYi50b1N0cmluZygpKSxkKTtlbHNlIGlmKGEuYWRkTGlzdGVuZXImJmEucmVtb3ZlTGlzdGVuZXIpcSgiY2hhbmdlIj09PWIsIk1lZGlhUXVlcnlMaXN0IG9ubHkgaGFzIGEgY2hhbmdlIGV2ZW50IiksYS5hZGRMaXN0ZW5lcihkKTtlbHNlIHRocm93IEVycm9yKCJhZGRFdmVudExpc3RlbmVyIGFuZCBhdHRhY2hFdmVudCBhcmUgdW5hdmFpbGFibGUuIik7JGIrKztyZXR1cm4gY30sZ2M9ZnVuY3Rpb24oKXt2YXIgYT1pYyxiPUpiP2Z1bmN0aW9uKGMpe3JldHVybiBhLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKX06ZnVuY3Rpb24oYyl7Yz1hLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKTtpZighYylyZXR1cm4gY307cmV0dXJuIGJ9LGFjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZmEoYikpe2Zvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWFjKGEsYltmXSxjLGQsZSk7cmV0dXJuIG51bGx9Yz1jYyhjKTtyZXR1cm4gUWIoYSk/CmEuaC5hZGQoU3RyaW5nKGIpLGMsITAsbShkKT8hIWQuY2FwdHVyZTohIWQsZSk6ZWMoYSxiLGMsITAsZCxlKX0samM9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihmYShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylqYyhhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPWNjKGMpLFFiKGEpPyhhPWEuaCxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5hJiYoZj1hLmFbYl0sYz1WYihmLGMsZCxlKSwtMTxjJiYoVGIoZltjXSkscShudWxsIT1mLmxlbmd0aCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSwwPT1mLmxlbmd0aCYmKGRlbGV0ZSBhLmFbYl0sYS5iLS0pKSkpOmEmJihhPWZjKGEpKSYmKGM9WGIoYSxiLGMsZCxlKSkmJmtjKGMpfSxrYz1mdW5jdGlvbihhKXtpZigibnVtYmVyIiE9PXR5cGVvZiBhJiZhJiYhYS5YKXt2YXIgYj1hLnNyYztpZihRYihiKSlXYihiLmgsYSk7ZWxzZXt2YXIgYz1hLnR5cGUsZD1hLmE7Yi5yZW1vdmVFdmVudExpc3RlbmVyPwpiLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KGhjKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7JGItLTsoYz1mYyhiKSk/KFdiKGMsYSksMD09Yy5iJiYoYy5zcmM9bnVsbCxiW1liXT1udWxsKSk6VGIoYSl9fX0saGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gWmI/WmJbYV06WmJbYV09Im9uIithfSxtYz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMDtpZihhPWZjKGEpKWlmKGI9YS5hW2IudG9TdHJpbmcoKV0pZm9yKGI9Yi5jb25jYXQoKSxhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBmPWJbYV07ZiYmZi5jYXB0dXJlPT1jJiYhZi5YJiYoZj1sYyhmLGQpLGU9ZSYmITEhPT1mKX1yZXR1cm4gZX0sbGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5tYXx8YS5zcmM7YS5oYSYma2MoYSk7cmV0dXJuIGMuY2FsbChkLGIpfSxpYz1mdW5jdGlvbihhLApiKXtpZihhLlgpcmV0dXJuITA7aWYoIUpiKXtpZighYilhOntiPVsid2luZG93IiwiZXZlbnQiXTtmb3IodmFyIGM9bCxkPTA7ZDxiLmxlbmd0aDtkKyspaWYoYz1jW2JbZF1dLG51bGw9PWMpe2I9bnVsbDticmVhayBhfWI9Y31kPWI7Yj1uZXcgRyhkLHRoaXMpO2M9ITA7aWYoISgwPmQua2V5Q29kZXx8dm9pZCAwIT1kLnJldHVyblZhbHVlKSl7YTp7dmFyIGU9ITE7aWYoMD09ZC5rZXlDb2RlKXRyeXtkLmtleUNvZGU9LTE7YnJlYWsgYX1jYXRjaChnKXtlPSEwfWlmKGV8fHZvaWQgMD09ZC5yZXR1cm5WYWx1ZSlkLnJldHVyblZhbHVlPSEwfWQ9W107Zm9yKGU9Yi5hO2U7ZT1lLnBhcmVudE5vZGUpZC5wdXNoKGUpO2E9YS50eXBlO2ZvcihlPWQubGVuZ3RoLTE7IWIuaCYmMDw9ZTtlLS0pe2IuYT1kW2VdO3ZhciBmPW1jKGRbZV0sYSwhMCxiKTtjPWMmJmZ9Zm9yKGU9MDshYi5oJiZlPGQubGVuZ3RoO2UrKyliLmE9ZFtlXSxmPW1jKGRbZV0sYSwhMSxiKSxjPWMmJmZ9cmV0dXJuIGN9cmV0dXJuIGxjKGEsCm5ldyBHKGIsdGhpcykpfSxmYz1mdW5jdGlvbihhKXthPWFbWWJdO3JldHVybiBhIGluc3RhbmNlb2YgVWI/YTpudWxsfSxuYz0iX19jbG9zdXJlX2V2ZW50c19mbl8iKygxRTkqTWF0aC5yYW5kb20oKT4+PjApLGNjPWZ1bmN0aW9uKGEpe3EoYSwiTGlzdGVuZXIgY2FuIG5vdCBiZSBudWxsLiIpO2lmKGlhKGEpKXJldHVybiBhO3EoYS5oYW5kbGVFdmVudCwiQW4gb2JqZWN0IGxpc3RlbmVyIG11c3QgaGF2ZSBoYW5kbGVFdmVudCBtZXRob2QuIik7YVtuY118fChhW25jXT1mdW5jdGlvbihiKXtyZXR1cm4gYS5oYW5kbGVFdmVudChiKX0pO3JldHVybiBhW25jXX07dmFyIG9jPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9e319O24ob2MsQyk7CnZhciBwYz1bXSxIPWZ1bmN0aW9uKGEsYixjLGQpe2ZhKGMpfHwoYyYmKHBjWzBdPWMudG9TdHJpbmcoKSksYz1wYyk7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWJjKGIsY1tlXSxkfHxhLmhhbmRsZUV2ZW50LCExLGEuYnx8YSk7aWYoIWYpYnJlYWs7YS5hW2Yua2V5XT1mfXJldHVybiBhfSxxYz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoZmEoYykpZm9yKHZhciBnPTA7ZzxjLmxlbmd0aDtnKyspcWMoYSxiLGNbZ10sZCxlLGYpO2Vsc2UgZD1kfHxhLmhhbmRsZUV2ZW50LGU9bShlKT8hIWUuY2FwdHVyZTohIWUsZj1mfHxhLmJ8fGEsZD1jYyhkKSxlPSEhZSxjPVFiKGIpP1hiKGIuaCxTdHJpbmcoYyksZCxlLGYpOmI/KGI9ZmMoYikpP1hiKGIsYyxkLGUsZik6bnVsbDpudWxsLGMmJihrYyhjKSxkZWxldGUgYS5hW2Mua2V5XSk7cmV0dXJuIGF9LHJjPWZ1bmN0aW9uKGEpe29hKGEuYSxmdW5jdGlvbihiLGMpe3RoaXMuYS5oYXNPd25Qcm9wZXJ0eShjKSYma2MoYil9LAphKTthLmE9e319O29jLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7b2MuaS51LmNhbGwodGhpcyk7cmModGhpcyl9O29jLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJFdmVudEhhbmRsZXIuaGFuZGxlRXZlbnQgbm90IGltcGxlbWVudGVkIik7fTt2YXIgST1mdW5jdGlvbigpe0MuY2FsbCh0aGlzKTt0aGlzLmg9bmV3IFViKHRoaXMpO3RoaXMuTWE9dGhpczt0aGlzLnBhPW51bGx9O24oSSxDKTtJLnByb3RvdHlwZVtQYl09ITA7SS5wcm90b3R5cGUucmE9ZnVuY3Rpb24oYSl7dGhpcy5wYT1hfTtJLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjLGQpe2pjKHRoaXMsYSxiLGMsZCl9Owp2YXIgdWM9ZnVuY3Rpb24oYSxiKXtzYyhhKTt2YXIgYz1hLnBhO2lmKGMpe3ZhciBkPVtdO2Zvcih2YXIgZT0xO2M7Yz1jLnBhKWQucHVzaChjKSxxKDFFMz4rK2UsImluZmluaXRlIGxvb3AiKX1hPWEuTWE7Yz1iLnR5cGV8fGI7InN0cmluZyI9PT10eXBlb2YgYj9iPW5ldyBFKGIsYSk6YiBpbnN0YW5jZW9mIEU/Yi50YXJnZXQ9Yi50YXJnZXR8fGE6KGU9YixiPW5ldyBFKGMsYSksdWEoYixlKSk7ZT0hMDtpZihkKWZvcih2YXIgZj1kLmxlbmd0aC0xOyFiLmgmJjA8PWY7Zi0tKXt2YXIgZz1iLmE9ZFtmXTtlPXRjKGcsYywhMCxiKSYmZX1iLmh8fChnPWIuYT1hLGU9dGMoZyxjLCEwLGIpJiZlLGIuaHx8KGU9dGMoZyxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLmgmJmY8ZC5sZW5ndGg7ZisrKWc9Yi5hPWRbZl0sZT10YyhnLGMsITEsYikmJmU7cmV0dXJuIGV9OwpJLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7SS5pLnUuY2FsbCh0aGlzKTtpZih0aGlzLmgpe3ZhciBhPXRoaXMuaCxiPTAsYztmb3IoYyBpbiBhLmEpe2Zvcih2YXIgZD1hLmFbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixUYihkW2VdKTtkZWxldGUgYS5hW2NdO2EuYi0tfX10aGlzLnBhPW51bGx9O3ZhciBkYz1mdW5jdGlvbihhLGIsYyxkLGUpe3NjKGEpO3JldHVybiBhLmguYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LHRjPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5oLmFbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGc9YltmXTtpZihnJiYhZy5YJiZnLmNhcHR1cmU9PWMpe3ZhciBrPWcubGlzdGVuZXIscD1nLm1hfHxnLnNyYztnLmhhJiZXYihhLmgsZyk7ZT0hMSE9PWsuY2FsbChwLGQpJiZlfX1yZXR1cm4gZSYmMCE9ZC5LYX0sc2M9ZnVuY3Rpb24oYSl7cShhLmgsIkV2ZW50IHRhcmdldCBpcyBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgY2FsbCB0aGUgc3VwZXJjbGFzcyAoZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpIGNvbnN0cnVjdG9yPyIpfTt2YXIgeGM9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKHkmJiFBKCI1MjUiKSlyZXR1cm4hMDtpZih6JiZlKXJldHVybiB2YyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZigheCl7Im51bWJlciI9PT10eXBlb2YgYiYmKGI9d2MoYikpO3ZhciBnPTE3PT1ifHwxOD09Ynx8eiYmOTE9PWI7aWYoKCFjfHx6KSYmZ3x8eiYmMTY9PWImJihkfHxmKSlyZXR1cm4hMX1pZigoeXx8YmIpJiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1pZih2JiZkJiZiPT1hKXJldHVybiExO3N3aXRjaChhKXtjYXNlIDEzOnJldHVybiB4P2Z8fGU/ITE6IShjJiZkKTohMDtjYXNlIDI3OnJldHVybiEoeXx8YmJ8fHgpfXJldHVybiB4JiYoZHx8ZXx8Zik/ITE6dmMoYSl9LHZjPWZ1bmN0aW9uKGEpe2lmKDQ4PD1hJiY1Nz49YXx8Cjk2PD1hJiYxMDY+PWF8fDY1PD1hJiY5MD49YXx8KHl8fGJiKSYmMD09YSlyZXR1cm4hMDtzd2l0Y2goYSl7Y2FzZSAzMjpjYXNlIDQzOmNhc2UgNjM6Y2FzZSA2NDpjYXNlIDEwNzpjYXNlIDEwOTpjYXNlIDExMDpjYXNlIDExMTpjYXNlIDE4NjpjYXNlIDU5OmNhc2UgMTg5OmNhc2UgMTg3OmNhc2UgNjE6Y2FzZSAxODg6Y2FzZSAxOTA6Y2FzZSAxOTE6Y2FzZSAxOTI6Y2FzZSAyMjI6Y2FzZSAyMTk6Y2FzZSAyMjA6Y2FzZSAyMjE6Y2FzZSAxNjM6Y2FzZSA1ODpyZXR1cm4hMDtjYXNlIDE3MzpyZXR1cm4geDtkZWZhdWx0OnJldHVybiExfX0sd2M9ZnVuY3Rpb24oYSl7aWYoeClhPXljKGEpO2Vsc2UgaWYoeiYmeSlzd2l0Y2goYSl7Y2FzZSA5MzphPTkxfXJldHVybiBhfSx5Yz1mdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSA2MTpyZXR1cm4gMTg3O2Nhc2UgNTk6cmV0dXJuIDE4NjtjYXNlIDE3MzpyZXR1cm4gMTg5O2Nhc2UgMjI0OnJldHVybiA5MTtjYXNlIDA6cmV0dXJuIDIyNDsKZGVmYXVsdDpyZXR1cm4gYX19O3ZhciBKPWZ1bmN0aW9uKGEsYil7SS5jYWxsKHRoaXMpO2EmJnpjKHRoaXMsYSxiKX07bihKLEkpO2g9Si5wcm90b3R5cGU7aC5TPW51bGw7aC5uYT1udWxsO2guQ2E9bnVsbDtoLm9hPW51bGw7aC53PS0xO2guRj0tMTtoLnVhPSExOwp2YXIgQWM9ezM6MTMsMTI6MTQ0LDYzMjMyOjM4LDYzMjMzOjQwLDYzMjM0OjM3LDYzMjM1OjM5LDYzMjM2OjExMiw2MzIzNzoxMTMsNjMyMzg6MTE0LDYzMjM5OjExNSw2MzI0MDoxMTYsNjMyNDE6MTE3LDYzMjQyOjExOCw2MzI0MzoxMTksNjMyNDQ6MTIwLDYzMjQ1OjEyMSw2MzI0NjoxMjIsNjMyNDc6MTIzLDYzMjQ4OjQ0LDYzMjcyOjQ2LDYzMjczOjM2LDYzMjc1OjM1LDYzMjc2OjMzLDYzMjc3OjM0LDYzMjg5OjE0NCw2MzMwMjo0NX0sQmM9e1VwOjM4LERvd246NDAsTGVmdDozNyxSaWdodDozOSxFbnRlcjoxMyxGMToxMTIsRjI6MTEzLEYzOjExNCxGNDoxMTUsRjU6MTE2LEY2OjExNyxGNzoxMTgsRjg6MTE5LEY5OjEyMCxGMTA6MTIxLEYxMToxMjIsRjEyOjEyMywiVSswMDdGIjo0NixIb21lOjM2LEVuZDozNSxQYWdlVXA6MzMsUGFnZURvd246MzQsSW5zZXJ0OjQ1fSxDYz0heXx8QSgiNTI1IiksRGM9eiYmeDsKSi5wcm90b3R5cGUuYT1mdW5jdGlvbihhKXtpZih5fHxiYilpZigxNz09dGhpcy53JiYhYS5jdHJsS2V5fHwxOD09dGhpcy53JiYhYS5hbHRLZXl8fHomJjkxPT10aGlzLncmJiFhLm1ldGFLZXkpdGhpcy5GPXRoaXMudz0tMTstMT09dGhpcy53JiYoYS5jdHJsS2V5JiYxNyE9YS5jP3RoaXMudz0xNzphLmFsdEtleSYmMTghPWEuYz90aGlzLnc9MTg6YS5tZXRhS2V5JiY5MSE9YS5jJiYodGhpcy53PTkxKSk7Q2MmJiF4YyhhLmMsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGEuYWx0S2V5LGEubWV0YUtleSk/dGhpcy5oYW5kbGVFdmVudChhKToodGhpcy5GPXdjKGEuYyksRGMmJih0aGlzLnVhPWEuYWx0S2V5KSl9O0oucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dGhpcy5GPXRoaXMudz0tMTt0aGlzLnVhPWEuYWx0S2V5fTsKSi5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5iLGM9Yi5hbHRLZXk7aWYodiYmImtleXByZXNzIj09YS50eXBlKXt2YXIgZD10aGlzLkY7dmFyIGU9MTMhPWQmJjI3IT1kP2Iua2V5Q29kZTowfWVsc2UoeXx8YmIpJiYia2V5cHJlc3MiPT1hLnR5cGU/KGQ9dGhpcy5GLGU9MDw9Yi5jaGFyQ29kZSYmNjMyMzI+Yi5jaGFyQ29kZSYmdmMoZCk/Yi5jaGFyQ29kZTowKTphYiYmIXk/KGQ9dGhpcy5GLGU9dmMoZCk/Yi5rZXlDb2RlOjApOigia2V5cHJlc3MiPT1hLnR5cGU/KERjJiYoYz10aGlzLnVhKSxiLmtleUNvZGU9PWIuY2hhckNvZGU/MzI+Yi5rZXlDb2RlPyhkPWIua2V5Q29kZSxlPTApOihkPXRoaXMuRixlPWIuY2hhckNvZGUpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkseiYmNjM9PWUmJjIyND09ZCYmKGQ9MTkxKSk7dmFyIGY9ZD13YyhkKTtkPzYzMjMyPD0KZCYmZCBpbiBBYz9mPUFjW2RdOjI1PT1kJiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBCYyYmKGY9QmNbYi5rZXlJZGVudGlmaWVyXSk7eCYmQ2MmJiJrZXlwcmVzcyI9PWEudHlwZSYmIXhjKGYsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KXx8KGE9Zj09dGhpcy53LHRoaXMudz1mLGI9bmV3IEVjKGYsZSxhLGIpLGIuYWx0S2V5PWMsdWModGhpcyxiKSl9O0oucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTsKdmFyIHpjPWZ1bmN0aW9uKGEsYixjKXthLm9hJiZGYyhhKTthLlM9YjthLm5hPWJjKGEuUywia2V5cHJlc3MiLGEsYyk7YS5DYT1iYyhhLlMsImtleWRvd24iLGEuYSxjLGEpO2Eub2E9YmMoYS5TLCJrZXl1cCIsYS5iLGMsYSl9LEZjPWZ1bmN0aW9uKGEpe2EubmEmJihrYyhhLm5hKSxrYyhhLkNhKSxrYyhhLm9hKSxhLm5hPW51bGwsYS5DYT1udWxsLGEub2E9bnVsbCk7YS5TPW51bGw7YS53PS0xO2EuRj0tMX07Si5wcm90b3R5cGUudT1mdW5jdGlvbigpe0ouaS51LmNhbGwodGhpcyk7RmModGhpcyl9O3ZhciBFYz1mdW5jdGlvbihhLGIsYyxkKXtHLmNhbGwodGhpcyxkKTt0aGlzLnR5cGU9ImtleSI7dGhpcy5jPWE7dGhpcy5yZXBlYXQ9Y307bihFYyxHKTt2YXIgR2M9eD8iTW96VXNlclNlbGVjdCI6eXx8YmI/IldlYmtpdFVzZXJTZWxlY3QiOm51bGwsSGM9ZnVuY3Rpb24oYSxiKXtiPWI/bnVsbDphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7aWYoR2Mpe3ZhciBjPSJub25lIjthLnN0eWxlJiYoYS5zdHlsZVtHY109Yyk7aWYoYil7YT0wO2Zvcih2YXIgZDtkPWJbYV07YSsrKWQuc3R5bGUmJihkLnN0eWxlW0djXT1jKX19ZWxzZSBpZih2fHxhYilpZihjPSJvbiIsYS5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyksYilmb3IoYT0wO2Q9YlthXTthKyspZC5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyl9O3ZhciBJYz1mdW5jdGlvbigpe307ZGEoSWMpO0ljLnByb3RvdHlwZS5hPTA7dmFyIEs9ZnVuY3Rpb24oYSl7SS5jYWxsKHRoaXMpO3RoaXMuaj1hfHx4YXx8KHhhPW5ldyB1Yik7dGhpcy5xYT1KYzt0aGlzLlk9bnVsbDt0aGlzLm09ITE7dGhpcy5hPW51bGw7dGhpcy5BPXZvaWQgMDt0aGlzLmc9dGhpcy5jPXRoaXMuYj1udWxsO3RoaXMuR2E9ITF9O24oSyxJKTtLLnByb3RvdHlwZS5PYT1JYy5SKCk7CnZhciBKYz1udWxsLEtjPWZ1bmN0aW9uKGEsYil7c3dpdGNoKGEpe2Nhc2UgMTpyZXR1cm4gYj8iZGlzYWJsZSI6ImVuYWJsZSI7Y2FzZSAyOnJldHVybiBiPyJoaWdobGlnaHQiOiJ1bmhpZ2hsaWdodCI7Y2FzZSA0OnJldHVybiBiPyJhY3RpdmF0ZSI6ImRlYWN0aXZhdGUiO2Nhc2UgODpyZXR1cm4gYj8ic2VsZWN0IjoidW5zZWxlY3QiO2Nhc2UgMTY6cmV0dXJuIGI/ImNoZWNrIjoidW5jaGVjayI7Y2FzZSAzMjpyZXR1cm4gYj8iZm9jdXMiOiJibHVyIjtjYXNlIDY0OnJldHVybiBiPyJvcGVuIjoiY2xvc2UifXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBzdGF0ZSIpO30sTGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuWXx8KGEuWT0iOiIrKGEuT2EuYSsrKS50b1N0cmluZygzNikpfSxNYz1mdW5jdGlvbihhLGIpe2lmKGEuYiYmYS5iLmcpe3ZhciBjPWEuYi5nLGQ9YS5ZO2QgaW4gYyYmZGVsZXRlIGNbZF07cWEoYS5iLmcsYixhKX1hLlk9Yn07Sy5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9Owp2YXIgTmM9ZnVuY3Rpb24oYSl7YT1hLmE7cShhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cmV0dXJuIGF9LE9jPWZ1bmN0aW9uKGEpe2EuQXx8KGEuQT1uZXcgb2MoYSkpO3JldHVybiBxKGEuQSl9O0sucHJvdG90eXBlLnJhPWZ1bmN0aW9uKGEpe2lmKHRoaXMuYiYmdGhpcy5iIT1hKXRocm93IEVycm9yKCJNZXRob2Qgbm90IHN1cHBvcnRlZCIpO0suaS5yYS5jYWxsKHRoaXMsYSl9O0sucHJvdG90eXBlLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPW5iKHRoaXMuai5hLCJESVYiKX07CnZhciBQYz1mdW5jdGlvbihhLGIpe2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiJiZhLnhhKGIpKXthLkdhPSEwO3ZhciBjPXFiKGIpO2EuaiYmYS5qLmE9PWN8fChhLmo9Yj9uZXcgdWIocWIoYikpOnhhfHwoeGE9bmV3IHViKSk7YS52YShiKTthLkQoKX1lbHNlIHRocm93IEVycm9yKCJJbnZhbGlkIGVsZW1lbnQgdG8gZGVjb3JhdGUiKTt9O2g9Sy5wcm90b3R5cGU7aC54YT1mdW5jdGlvbigpe3JldHVybiEwfTtoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hfTtoLkQ9ZnVuY3Rpb24oKXt0aGlzLm09ITA7UWModGhpcyxmdW5jdGlvbihhKXshYS5tJiZhLmYoKSYmYS5EKCl9KX07aC5QPWZ1bmN0aW9uKCl7UWModGhpcyxmdW5jdGlvbihhKXthLm0mJmEuUCgpfSk7dGhpcy5BJiZyYyh0aGlzLkEpO3RoaXMubT0hMX07CmgudT1mdW5jdGlvbigpe3RoaXMubSYmdGhpcy5QKCk7dGhpcy5BJiYodGhpcy5BLk4oKSxkZWxldGUgdGhpcy5BKTtRYyh0aGlzLGZ1bmN0aW9uKGEpe2EuTigpfSk7IXRoaXMuR2EmJnRoaXMuYSYmb2IodGhpcy5hKTt0aGlzLmI9dGhpcy5hPXRoaXMuZz10aGlzLmM9bnVsbDtLLmkudS5jYWxsKHRoaXMpfTtoLnNhPWZ1bmN0aW9uKGEsYil7dGhpcy50YShhLFJjKHRoaXMpLGIpfTsKaC50YT1mdW5jdGlvbihhLGIsYyl7cSghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLm0mJihjfHwhdGhpcy5tKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZigwPmJ8fGI+UmModGhpcykpdGhyb3cgRXJyb3IoIkNoaWxkIGNvbXBvbmVudCBpbmRleCBvdXQgb2YgYm91bmRzIik7dGhpcy5nJiZ0aGlzLmN8fCh0aGlzLmc9e30sdGhpcy5jPVtdKTtpZihhLmI9PXRoaXMpe3ZhciBkPUxjKGEpO3RoaXMuZ1tkXT1hO0hhKHRoaXMuYyxhKX1lbHNlIHFhKHRoaXMuZyxMYyhhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuYiYmYS5ZKXt2YXIgZT1hLmI7ZD1hLlk7ZS5nJiZkPyhlPWUuZyxkPShudWxsIT09ZSYmZCBpbiBlP2VbZF06dm9pZCAwKXx8bnVsbCk6ZD1udWxsfWlmKGQmJmEuYiE9dGhpcyl0aHJvdyBFcnJvcigiVW5hYmxlIHRvIHNldCBwYXJlbnQgY29tcG9uZW50Iik7CmEuYj10aGlzO0suaS5yYS5jYWxsKGEsdGhpcyk7TGEodGhpcy5jLGIsMCxhKTtpZihhLm0mJnRoaXMubSYmYS5iPT10aGlzKWM9dGhpcy5qYSgpLGI9Yy5jaGlsZE5vZGVzW2JdfHxudWxsLGIhPWEuZigpJiZjLmluc2VydEJlZm9yZShhLmYoKSxiKTtlbHNlIGlmKGMpe3RoaXMuYXx8dGhpcy5pYSgpO2M9TCh0aGlzLGIrMSk7Yj10aGlzLmphKCk7Yz1jP2MuYTpudWxsO2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTthLmF8fGEuaWEoKTtiP2IuaW5zZXJ0QmVmb3JlKGEuYSxjfHxudWxsKTphLmouYS5ib2R5LmFwcGVuZENoaWxkKGEuYSk7YS5iJiYhYS5iLm18fGEuRCgpfWVsc2UgdGhpcy5tJiYhYS5tJiZhLmEmJmEuYS5wYXJlbnROb2RlJiYxPT1hLmEucGFyZW50Tm9kZS5ub2RlVHlwZSYmYS5EKCl9O2guamE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hfTsKdmFyIFNjPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEucWEpe3ZhciBiPWEubT9hLmE6YS5qLmEuYm9keTthOnt2YXIgYz1xYihiKTtpZihjLmRlZmF1bHRWaWV3JiZjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihjPWMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpKSl7Yz1jLmRpcmVjdGlvbnx8Yy5nZXRQcm9wZXJ0eVZhbHVlKCJkaXJlY3Rpb24iKXx8IiI7YnJlYWsgYX1jPSIifWEucWE9InJ0bCI9PShjfHwoYi5jdXJyZW50U3R5bGU/Yi5jdXJyZW50U3R5bGUuZGlyZWN0aW9uOm51bGwpfHxiLnN0eWxlJiZiLnN0eWxlLmRpcmVjdGlvbil9cmV0dXJuIGEucWF9LFJjPWZ1bmN0aW9uKGEpe3JldHVybiBhLmM/YS5jLmxlbmd0aDowfSxMPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuYz9hLmNbYl18fG51bGw6bnVsbH0sUWM9ZnVuY3Rpb24oYSxiLGMpe2EuYyYmcihhLmMsYixjKX0sVGM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jJiZiP0RhKGEuYyxiKTotMX07dmFyIFZjPWZ1bmN0aW9uKGEsYil7aWYoIWEpdGhyb3cgRXJyb3IoIkludmFsaWQgY2xhc3MgbmFtZSAiK2EpO2lmKCFpYShiKSl0aHJvdyBFcnJvcigiSW52YWxpZCBkZWNvcmF0b3IgZnVuY3Rpb24gIitiKTtVY1thXT1ifSxXYz17fSxVYz17fTt2YXIgWGM9ZnVuY3Rpb24oYSl7dGhpcy5oPWF9O2RhKFhjKTt2YXIgWWM9ZnVuY3Rpb24oYSxiKXthJiYoYS50YWJJbmRleD1iPzA6LTEpfSwkYz1mdW5jdGlvbihhLGIsYyl7Yy5pZCYmTWMoYixjLmlkKTt2YXIgZD1hLmIoKSxlPSExLGY9RChjKTtmJiZyKGYsZnVuY3Rpb24oZyl7Zz09ZD9lPSEwOmcmJnRoaXMuZyhiLGcsZCl9LGEpO2V8fEViKGMsZCk7WmMoYixjKTtyZXR1cm4gY307WGMucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiLGMpe2I9PWMrIi1kaXNhYmxlZCI/YS5aKCExKTpiPT1jKyItaG9yaXpvbnRhbCI/YWQoYSwiaG9yaXpvbnRhbCIpOmI9PWMrIi12ZXJ0aWNhbCImJmFkKGEsInZlcnRpY2FsIil9Owp2YXIgWmM9ZnVuY3Rpb24oYSxiKXtpZihiKWZvcih2YXIgYz1iLmZpcnN0Q2hpbGQsZDtjJiZjLnBhcmVudE5vZGU9PWI7KXtkPWMubmV4dFNpYmxpbmc7aWYoMT09Yy5ub2RlVHlwZSl7YTp7dmFyIGU9YztxKGUpO2U9RChlKTtmb3IodmFyIGY9MCxnPWUubGVuZ3RoO2Y8ZztmKyspe3ZhciBrPWVbZl07aWYoaz1rIGluIFVjP1VjW2tdKCk6bnVsbCl7ZT1rO2JyZWFrIGF9fWU9bnVsbH1lJiYoZS5hPWMsYS5pc0VuYWJsZWQoKXx8ZS5aKCExKSxhLnNhKGUpLFBjKGUsYykpfWVsc2UgYy5ub2RlVmFsdWUmJiIiIT1NYShjLm5vZGVWYWx1ZSl8fGIucmVtb3ZlQ2hpbGQoYyk7Yz1kfX0sYmQ9ZnVuY3Rpb24oYSxiKXtiPWIuZigpO3EoYiwiVGhlIGNvbnRhaW5lciBET00gZWxlbWVudCBjYW5ub3QgYmUgbnVsbC4iKTtIYyhiLHgpO3YmJihiLmhpZGVGb2N1cz0hMCk7KGE9YS5oKSYmdmIoYixhKX07WGMucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKWGMucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5iKCksYz1bYiwiaG9yaXpvbnRhbCI9PWEuSD9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgTT1mdW5jdGlvbigpe30sY2Q7ZGEoTSk7dmFyIGRkPXtidXR0b246InByZXNzZWQiLGNoZWNrYm94OiJjaGVja2VkIixtZW51aXRlbToic2VsZWN0ZWQiLG1lbnVpdGVtY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtcmFkaW86ImNoZWNrZWQiLHJhZGlvOiJjaGVja2VkIix0YWI6InNlbGVjdGVkIix0cmVlaXRlbToic2VsZWN0ZWQifTtNLnByb3RvdHlwZS5oPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLmouYigiRElWIixlZCh0aGlzLGEpLmpvaW4oIiAiKSxhLmJhKX07dmFyIGdkPWZ1bmN0aW9uKGEsYixjKXtpZihhPWEuZj9hLmYoKTphKXt2YXIgZD1bYl07diYmIUEoIjciKSYmKGQ9ZmQoRChhKSxiKSxkLnB1c2goYikpOyhjP0ZiOkhiKShhLGQpfX07Ck0ucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiKXtiLmlkJiZNYyhhLGIuaWQpO2ImJmIuZmlyc3RDaGlsZD9oZChhLGIuZmlyc3RDaGlsZC5uZXh0U2libGluZz9KYShiLmNoaWxkTm9kZXMpOmIuZmlyc3RDaGlsZCk6YS5iYT1udWxsO3ZhciBjPTAsZD10aGlzLmEoKSxlPXRoaXMuYSgpLGY9ITEsZz0hMSxrPSExLHA9SmEoRChiKSk7cihwLGZ1bmN0aW9uKEIpe2Z8fEIhPWQ/Z3x8QiE9ZT9jfD1pZCh0aGlzLEIpOmc9ITA6KGY9ITAsZT09ZCYmKGc9ITApKTsxPT1pZCh0aGlzLEIpJiYoQWEoYiksc2IoYikmJnRiKGIpJiZyYihiLCExKSl9LHRoaXMpO2Eubz1jO2Z8fChwLnB1c2goZCksZT09ZCYmKGc9ITApKTtnfHxwLnB1c2goZSk7KGE9YS53YSkmJnAucHVzaC5hcHBseShwLGEpO2lmKHYmJiFBKCI3Iikpe3ZhciB3PWZkKHApOzA8dy5sZW5ndGgmJihwLnB1c2guYXBwbHkocCx3KSxrPSEwKX1mJiZnJiYhYSYmIWt8fENiKGIscC5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIGpkPWZ1bmN0aW9uKGEsYil7aWYoYT1hLmgoKSl7cShiLCJUaGUgZWxlbWVudCBwYXNzZWQgYXMgYSBmaXJzdCBwYXJhbWV0ZXIgY2Fubm90IGJlIG51bGwuIik7dmFyIGM9Yi5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDthIT1jJiZ2YihiLGEpfX0sa2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYztpZihhLnYmMzImJihjPWEuZigpKSl7aWYoIWImJmEubyYzMil7dHJ5e2MuYmx1cigpfWNhdGNoKGQpe31hLm8mMzImJmEuRmEobnVsbCl9KHNiKGMpJiZ0YihjKSkhPWImJnJiKGMsYil9fSxsZD1mdW5jdGlvbihhLGIsYyl7Y2R8fChjZD17MToiZGlzYWJsZWQiLDg6InNlbGVjdGVkIiwxNjoiY2hlY2tlZCIsNjQ6ImV4cGFuZGVkIn0pO3EoYSwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO2I9Y2RbYl07dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDtkJiYoZD1kZFtkXXx8YixiPSJjaGVja2VkIj09Ynx8InNlbGVjdGVkIj09CmI/ZDpiKTtiJiZ4YihhLGIsYyl9O00ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250cm9sIn07CnZhciBlZD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuYSgpLGQ9W2NdLGU9YS5hKCk7ZSE9YyYmZC5wdXNoKGUpO2M9Yi5vO2ZvcihlPVtdO2M7KXt2YXIgZj1jJi1jO2UucHVzaChtZChhLGYpKTtjJj1+Zn1kLnB1c2guYXBwbHkoZCxlKTsoYT1iLndhKSYmZC5wdXNoLmFwcGx5KGQsYSk7diYmIUEoIjciKSYmZC5wdXNoLmFwcGx5KGQsZmQoZCkpO3JldHVybiBkfSxmZD1mdW5jdGlvbihhLGIpe3ZhciBjPVtdO2ImJihhPUlhKGEsW2JdKSk7cihbXSxmdW5jdGlvbihkKXshRmEoZCxsYShHYSxhKSl8fGImJiFHYShkLGIpfHxjLnB1c2goZC5qb2luKCJfIikpfSk7cmV0dXJuIGN9LG1kPWZ1bmN0aW9uKGEsYil7YS5ifHxuZChhKTtyZXR1cm4gYS5iW2JdfSxpZD1mdW5jdGlvbihhLGIpe2Euanx8KGEuYnx8bmQoYSksYS5qPXNhKGEuYikpO2E9cGFyc2VJbnQoYS5qW2JdLDEwKTtyZXR1cm4gaXNOYU4oYSk/MDphfSxuZD1mdW5jdGlvbihhKXt2YXIgYj1hLmEoKSxjPSF0KGIucmVwbGFjZSgvXHhhMHxccy9nLAoiICIpLCIgIik7cShjLCJDb250cm9sUmVuZGVyZXIgaGFzIGFuIGludmFsaWQgY3NzIGNsYXNzOiAnIitiKyInIik7YS5iPXsxOmIrIi1kaXNhYmxlZCIsMjpiKyItaG92ZXIiLDQ6YisiLWFjdGl2ZSIsODpiKyItc2VsZWN0ZWQiLDE2OmIrIi1jaGVja2VkIiwzMjpiKyItZm9jdXNlZCIsNjQ6YisiLW9wZW4ifX07dmFyIE49ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO2lmKCFiKXtiPXRoaXMuY29uc3RydWN0b3I7Zm9yKHZhciBkO2I7KXtkPWJbamFdfHwoYltqYV09KytrYSk7aWYoZD1XY1tkXSlicmVhaztiPWIuaT9iLmkuY29uc3RydWN0b3I6bnVsbH1iPWQ/aWEoZC5SKT9kLlIoKTpuZXcgZDpudWxsfXRoaXMuQj1iO3RoaXMuYmE9dm9pZCAwIT09YT9hOm51bGx9O24oTixLKTtoPU4ucHJvdG90eXBlO2guYmE9bnVsbDtoLm89MDtoLnY9Mzk7aC5LPTA7aC5JYT0hMDtoLndhPW51bGw7aC55YT0hMDtoLmlhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CLmModGhpcyk7dGhpcy5hPWE7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmeGIoYSwiaGlkZGVuIiwhMCkpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hPXRoaXMuQi5nKHRoaXMsYSk7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5JYT0ibm9uZSIhPWEuc3R5bGUuZGlzcGxheX07CmguRD1mdW5jdGlvbigpe04uaS5ELmNhbGwodGhpcyk7dmFyIGE9TmModGhpcyk7cSh0aGlzKTtxKGEpO3RoaXMuaXNWaXNpYmxlKCl8fHhiKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fGxkKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy52JjgmJmxkKGEsOCwhISh0aGlzLm8mOCkpO3RoaXMudiYxNiYmbGQoYSwxNiwhISh0aGlzLm8mMTYpKTt0aGlzLnYmNjQmJmxkKGEsNjQsISEodGhpcy5vJjY0KSk7YT10aGlzLkI7U2ModGhpcykmJmdkKHRoaXMuZigpLGEuYSgpKyItcnRsIiwhMCk7dGhpcy5pc0VuYWJsZWQoKSYma2QodGhpcyx0aGlzLmlzVmlzaWJsZSgpKTtpZih0aGlzLnYmLTImJih0aGlzLnlhJiZvZCh0aGlzLCEwKSx0aGlzLnYmMzImJihhPXRoaXMuZigpKSkpe3ZhciBiPXRoaXMuV3x8KHRoaXMuVz1uZXcgSik7emMoYixhKTtIKEgoSChPYyh0aGlzKSxiLCJrZXkiLHRoaXMuZmEpLGEsImZvY3VzIix0aGlzLk5hKSxhLCJibHVyIiwKdGhpcy5GYSl9fTt2YXIgb2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYz1PYyhhKSxkPWEuZigpO2I/KEgoSChIKEgoYyxkLEYuTCxhLmthKSxkLFtGLk0sRi5hYV0sYS5sYSksZCwibW91c2VvdmVyIixhLkFhKSxkLCJtb3VzZW91dCIsYS56YSksYS5lYSE9Y2EmJkgoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fEgoYyxkLCJkYmxjbGljayIsYS5KYSksYS5nYXx8KGEuZ2E9bmV3IHBkKGEpLHpiKGEsbGEoQWIsYS5nYSkpKSkpOihxYyhxYyhxYyhxYyhjLGQsRi5MLGEua2EpLGQsW0YuTSxGLmFhXSxhLmxhKSxkLCJtb3VzZW92ZXIiLGEuQWEpLGQsIm1vdXNlb3V0IixhLnphKSxhLmVhIT1jYSYmcWMoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fHFjKGMsZCwiZGJsY2xpY2siLGEuSmEpLEFiKGEuZ2EpLGEuZ2E9bnVsbCkpfTsKTi5wcm90b3R5cGUuUD1mdW5jdGlvbigpe04uaS5QLmNhbGwodGhpcyk7dGhpcy5XJiZGYyh0aGlzLlcpO3RoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJmtkKHRoaXMsITEpfTtOLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7Ti5pLnUuY2FsbCh0aGlzKTt0aGlzLlcmJih0aGlzLlcuTigpLGRlbGV0ZSB0aGlzLlcpO2RlbGV0ZSB0aGlzLkI7dGhpcy5nYT10aGlzLndhPXRoaXMuYmE9bnVsbH07dmFyIGhkPWZ1bmN0aW9uKGEsYil7YS5iYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm8mMSl9OwpOLnByb3RvdHlwZS5aPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYjtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0VuYWJsZWQmJiFiLmlzRW5hYmxlZCgpfHwhTyh0aGlzLDEsIWEpfHwoYXx8KHFkKHRoaXMsITEpLFAodGhpcywhMSkpLHRoaXMuaXNWaXNpYmxlKCkmJmtkKHRoaXMsYSksUSh0aGlzLDEsIWEsITApKX07CnZhciBQPWZ1bmN0aW9uKGEsYil7TyhhLDIsYikmJlEoYSwyLGIpfSxxZD1mdW5jdGlvbihhLGIpe08oYSw0LGIpJiZRKGEsNCxiKX0scmQ9ZnVuY3Rpb24oYSxiKXtPKGEsOCxiKSYmUShhLDgsYil9LHNkPWZ1bmN0aW9uKGEsYil7TyhhLDY0LGIpJiZRKGEsNjQsYil9LFE9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIWQmJjE9PWIpYS5aKCFjKTtlbHNlIGlmKGEudiZiJiZjIT0hIShhLm8mYikpe3ZhciBlPWEuQjtpZihkPWEuZigpKShlPW1kKGUsYikpJiZnZChhLGUsYyksbGQoZCxiLGMpO2Eubz1jP2Eub3xiOmEubyZ+Yn19LHRkPWZ1bmN0aW9uKGEsYixjKXtpZihhLm0mJmEubyZiJiYhYyl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTshYyYmYS5vJmImJlEoYSxiLCExKTthLnY9Yz9hLnZ8YjphLnYmfmJ9LFI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hISgyNTUmYikmJiEhKGEudiZiKX0sTz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuISEoYS52JmIpJiYhIShhLm8mCmIpIT1jJiYoIShhLksmYil8fHVjKGEsS2MoYixjKSkpJiYhYS5VfTtoPU4ucHJvdG90eXBlO2guQWE9ZnVuY3Rpb24oYSl7KCFhLnJlbGF0ZWRUYXJnZXR8fCFwYih0aGlzLmYoKSxhLnJlbGF0ZWRUYXJnZXQpKSYmdWModGhpcywiZW50ZXIiKSYmdGhpcy5pc0VuYWJsZWQoKSYmUih0aGlzLDIpJiZQKHRoaXMsITApfTtoLnphPWZ1bmN0aW9uKGEpe2EucmVsYXRlZFRhcmdldCYmcGIodGhpcy5mKCksYS5yZWxhdGVkVGFyZ2V0KXx8IXVjKHRoaXMsImxlYXZlIil8fChSKHRoaXMsNCkmJnFkKHRoaXMsITEpLFIodGhpcywyKSYmUCh0aGlzLCExKSl9O2guZWE9Y2E7Cmgua2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSxPYihhKSYmISh5JiZ6JiZhLmN0cmxLZXkpKSl7Uih0aGlzLDQpJiZxZCh0aGlzLCEwKTt2YXIgYjtpZihiPXRoaXMuQil7dmFyIGM7Yj10aGlzLnYmMzImJihjPXRoaXMuZigpKT9zYihjKSYmdGIoYyk6ITF9YiYmdGhpcy5mKCkuZm9jdXMoKX0hT2IoYSl8fHkmJnomJmEuY3RybEtleXx8YS5nKCl9O2gubGE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSx0aGlzLm8mNCYmdWQodGhpcyxhKSYmUih0aGlzLDQpJiZxZCh0aGlzLCExKSl9O2guSmE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmdWQodGhpcyxhKX07CnZhciB1ZD1mdW5jdGlvbihhLGIpe2lmKFIoYSwxNikpe3ZhciBjPSEoYS5vJjE2KTtPKGEsMTYsYykmJlEoYSwxNixjKX1SKGEsOCkmJnJkKGEsITApO1IoYSw2NCkmJnNkKGEsIShhLm8mNjQpKTtjPW5ldyBFKCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuQT1iLkEpO3JldHVybiB1YyhhLGMpfTtOLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe1IodGhpcywzMikmJk8odGhpcywzMiwhMCkmJlEodGhpcywzMiwhMCl9O04ucHJvdG90eXBlLkZhPWZ1bmN0aW9uKCl7Uih0aGlzLDQpJiZxZCh0aGlzLCExKTtSKHRoaXMsMzIpJiZPKHRoaXMsMzIsITEpJiZRKHRoaXMsMzIsITEpfTsKTi5wcm90b3R5cGUuZmE9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJjEzPT1hLmMmJnVkKHRoaXMsYSk/KGEuZygpLGEuaigpLCEwKTohMX07aWYoIWlhKE4pKXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBjbGFzcyAiK04pO2lmKCFpYShNKSl0aHJvdyBFcnJvcigiSW52YWxpZCByZW5kZXJlciBjbGFzcyAiK00pO3ZhciB2ZD1OW2phXXx8KE5bamFdPSsra2EpO1djW3ZkXT1NO1ZjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIHBkPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9ITE7dGhpcy5jPW5ldyBvYyh0aGlzKTt6Yih0aGlzLGxhKEFiLHRoaXMuYykpO2E9TmModGhpcy5iKTtIKEgoSCh0aGlzLmMsYSxGLkwsdGhpcy5oKSxhLEYuTSx0aGlzLmopLGEsImNsaWNrIix0aGlzLmcpfTtuKHBkLEMpO3ZhciB3ZD0hdnx8OTw9TnVtYmVyKGliKTsKcGQucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXt0aGlzLmE9ITF9O3BkLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7dGhpcy5hPSEwfTt2YXIgeGQ9ZnVuY3Rpb24oYSxiKXtpZighd2QpcmV0dXJuIGEuYnV0dG9uPTAsYS50eXBlPWIsYTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudHMiKTtjLmluaXRNb3VzZUV2ZW50KGIsYS5idWJibGVzLGEuY2FuY2VsYWJsZSxhLnZpZXd8fG51bGwsYS5kZXRhaWwsYS5zY3JlZW5YLGEuc2NyZWVuWSxhLmNsaWVudFgsYS5jbGllbnRZLGEuY3RybEtleSxhLmFsdEtleSxhLnNoaWZ0S2V5LGEubWV0YUtleSwwLGEucmVsYXRlZFRhcmdldHx8bnVsbCk7cmV0dXJuIGN9OwpwZC5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXtpZih0aGlzLmEpdGhpcy5hPSExO2Vsc2V7dmFyIGI9YS5iLGM9Yi5idXR0b24sZD1iLnR5cGUsZT14ZChiLCJtb3VzZWRvd24iKTt0aGlzLmIua2EobmV3IEcoZSxhLmEpKTtlPXhkKGIsIm1vdXNldXAiKTt0aGlzLmIubGEobmV3IEcoZSxhLmEpKTt3ZHx8KGIuYnV0dG9uPWMsYi50eXBlPWQpfX07cGQucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt0aGlzLmI9bnVsbDtwZC5pLnUuY2FsbCh0aGlzKX07dmFyIFM9ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO3RoaXMuZGE9Ynx8WGMuUigpO3RoaXMuSD1hfHwidmVydGljYWwifTtuKFMsSyk7aD1TLnByb3RvdHlwZTtoLkRhPW51bGw7aC5jYT1udWxsO2guZGE9bnVsbDtoLkg9bnVsbDtoLlQ9ITA7aC5PPSEwO2gubD0tMTtoLnM9bnVsbDtoLlY9ITE7aC5JPW51bGw7dmFyIHlkPWZ1bmN0aW9uKGEpe3JldHVybiBhLkRhfHxhLmYoKX07aD1TLnByb3RvdHlwZTtoLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPXRoaXMuai5iKCJESVYiLHRoaXMuZGEuYyh0aGlzKS5qb2luKCIgIikpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKGEpe3JldHVybiJESVYiPT1hLnRhZ05hbWV9O2gudmE9ZnVuY3Rpb24oYSl7dGhpcy5hPSRjKHRoaXMuZGEsdGhpcyxhKTsibm9uZSI9PWEuc3R5bGUuZGlzcGxheSYmKHRoaXMuVD0hMSl9OwpoLkQ9ZnVuY3Rpb24oKXtTLmkuRC5jYWxsKHRoaXMpO1FjKHRoaXMsZnVuY3Rpb24oYil7Yi5tJiZ6ZCh0aGlzLGIpfSx0aGlzKTt2YXIgYT10aGlzLmYoKTtiZCh0aGlzLmRhLHRoaXMpO0FkKHRoaXMsdGhpcy5UKTtIKEgoSChIKEgoSChIKEgoT2ModGhpcyksdGhpcywiZW50ZXIiLHRoaXMuV2EpLHRoaXMsImhpZ2hsaWdodCIsdGhpcy5YYSksdGhpcywidW5oaWdobGlnaHQiLHRoaXMuY2IpLHRoaXMsIm9wZW4iLHRoaXMuWWEpLHRoaXMsImNsb3NlIix0aGlzLlVhKSxhLEYuTCx0aGlzLlNhKSxxYihhKSxbRi5NLEYuYWFdLHRoaXMuVmEpLGEsW0YuTCxGLk0sRi5hYSwibW91c2VvdmVyIiwibW91c2VvdXQiLCJjb250ZXh0bWVudSJdLHRoaXMuVGEpO0JkKHRoaXMpfTt2YXIgQmQ9ZnVuY3Rpb24oYSl7dmFyIGI9T2MoYSksYz15ZChhKTtIKEgoSChiLGMsImZvY3VzIixhLkhhKSxjLCJibHVyIixhLlFhKSxhLmNhfHwoYS5jYT1uZXcgSih5ZChhKSkpLCJrZXkiLGEuUmEpfTtoPVMucHJvdG90eXBlOwpoLlA9ZnVuY3Rpb24oKXtDZCh0aGlzLC0xKTt0aGlzLnMmJnNkKHRoaXMucywhMSk7dGhpcy5WPSExO1MuaS5QLmNhbGwodGhpcyl9O2gudT1mdW5jdGlvbigpe1MuaS51LmNhbGwodGhpcyk7dGhpcy5jYSYmKHRoaXMuY2EuTigpLHRoaXMuY2E9bnVsbCk7dGhpcy5kYT10aGlzLnM9dGhpcy5JPXRoaXMuRGE9bnVsbH07aC5XYT1mdW5jdGlvbigpe3JldHVybiEwfTsKaC5YYT1mdW5jdGlvbihhKXt2YXIgYj1UYyh0aGlzLGEudGFyZ2V0KTtpZigtMTxiJiZiIT10aGlzLmwpe3ZhciBjPUwodGhpcyx0aGlzLmwpO2MmJlAoYywhMSk7dGhpcy5sPWI7Yz1MKHRoaXMsdGhpcy5sKTt0aGlzLlYmJnFkKGMsITApO3RoaXMucyYmYyE9dGhpcy5zJiYoYy52JjY0P3NkKGMsITApOnNkKHRoaXMucywhMSkpfWI9dGhpcy5mKCk7cShiLCJUaGUgRE9NIGVsZW1lbnQgZm9yIHRoZSBjb250YWluZXIgY2Fubm90IGJlIG51bGwuIik7bnVsbCE9YS50YXJnZXQuZigpJiZ4YihiLCJhY3RpdmVkZXNjZW5kYW50IixhLnRhcmdldC5mKCkuaWQpfTtoLmNiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT1MKHRoaXMsdGhpcy5sKSYmKHRoaXMubD0tMSk7YT10aGlzLmYoKTtxKGEsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnJlbW92ZUF0dHJpYnV0ZSh3YigiYWN0aXZlZGVzY2VuZGFudCIpKX07CmguWWE9ZnVuY3Rpb24oYSl7KGE9YS50YXJnZXQpJiZhIT10aGlzLnMmJmEuYj09dGhpcyYmKHRoaXMucyYmc2QodGhpcy5zLCExKSx0aGlzLnM9YSl9O2guVWE9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMucyYmKHRoaXMucz1udWxsKTt2YXIgYj10aGlzLmYoKSxjPWEudGFyZ2V0LmYoKTtiJiZhLnRhcmdldC5vJjImJmMmJihhPSIiLGMmJihhPWMuaWQscShhLCJUaGUgYWN0aXZlIGVsZW1lbnQgc2hvdWxkIGhhdmUgYW4gaWQuIikpLHhiKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEpKX07aC5TYT1mdW5jdGlvbihhKXt0aGlzLk8mJih0aGlzLlY9ITApO3ZhciBiPXlkKHRoaXMpO2ImJnNiKGIpJiZ0YihiKT9iLmZvY3VzKCk6YS5nKCl9O2guVmE9ZnVuY3Rpb24oKXt0aGlzLlY9ITF9OwpoLlRhPWZ1bmN0aW9uKGEpe2E6e3ZhciBiPWEudGFyZ2V0O2lmKHRoaXMuSSlmb3IodmFyIGM9dGhpcy5mKCk7YiYmYiE9PWM7KXt2YXIgZD1iLmlkO2lmKGQgaW4gdGhpcy5JKXtiPXRoaXMuSVtkXTticmVhayBhfWI9Yi5wYXJlbnROb2RlfWI9bnVsbH1pZihiKXN3aXRjaChhLnR5cGUpe2Nhc2UgRi5MOmIua2EoYSk7YnJlYWs7Y2FzZSBGLk06Y2FzZSBGLmFhOmIubGEoYSk7YnJlYWs7Y2FzZSAibW91c2VvdmVyIjpiLkFhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3V0IjpiLnphKGEpO2JyZWFrO2Nhc2UgImNvbnRleHRtZW51IjpiLmVhKGEpfX07aC5IYT1mdW5jdGlvbigpe307aC5RYT1mdW5jdGlvbigpe0NkKHRoaXMsLTEpO3RoaXMuVj0hMTt0aGlzLnMmJnNkKHRoaXMucywhMSl9OwpoLlJhPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmlzRW5hYmxlZCgpJiZ0aGlzLmlzVmlzaWJsZSgpJiYoMCE9UmModGhpcyl8fHRoaXMuRGEpJiZEZCh0aGlzLGEpPyhhLmcoKSxhLmooKSwhMCk6ITF9Owp2YXIgRGQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1MKGEsYS5sKTtpZihjJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5mYSYmYy5mYShiKXx8YS5zJiZhLnMhPWMmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLnMuZmEmJmEucy5mYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuYyl7Y2FzZSAyNzp5ZChhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpFZChhKTticmVhaztjYXNlIDM1OkZkKGEpO2JyZWFrO2Nhc2UgMzg6aWYoInZlcnRpY2FsIj09YS5IKUdkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9IZChhKTpHZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoInZlcnRpY2FsIj09YS5IKUhkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9HZChhKTpIZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSx6ZD1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZigpO2M9Yy5pZHx8KGMuaWQ9TGMoYikpO2EuSXx8KGEuST17fSk7YS5JW2NdPWJ9O1MucHJvdG90eXBlLnNhPWZ1bmN0aW9uKGEsYil7Q2EoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtTLmkuc2EuY2FsbCh0aGlzLGEsYil9O1MucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEsYixjKXtDYShhLE4pO2EuS3w9MjthLkt8PTY0O3RkKGEsMzIsITEpO2EubSYmMCE9YS55YSYmb2QoYSwhMSk7YS55YT0hMTt2YXIgZD1hLmI9PXRoaXM/VGModGhpcyxhKTotMTtTLmkudGEuY2FsbCh0aGlzLGEsYixjKTthLm0mJnRoaXMubSYmemQodGhpcyxhKTthPWQ7LTE9PWEmJihhPVJjKHRoaXMpKTthPT10aGlzLmw/dGhpcy5sPU1hdGgubWluKFJjKHRoaXMpLTEsYik6YT50aGlzLmwmJmI8PXRoaXMubD90aGlzLmwrKzphPHRoaXMubCYmYj50aGlzLmwmJnRoaXMubC0tfTsKdmFyIGFkPWZ1bmN0aW9uKGEsYil7aWYoYS5mKCkpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5IPWJ9O1MucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O3ZhciBBZD1mdW5jdGlvbihhLGIpe2EuVD1iO3ZhciBjPWEuZigpO2MmJihjLnN0eWxlLmRpc3BsYXk9Yj8iIjoibm9uZSIsWWMoeWQoYSksYS5PJiZhLlQpKX07Uy5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT307Uy5wcm90b3R5cGUuWj1mdW5jdGlvbihhKXt0aGlzLk8hPWEmJnVjKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5PPSEwLFFjKHRoaXMsZnVuY3Rpb24oYil7Yi5MYT9kZWxldGUgYi5MYTpiLlooITApfSkpOihRYyh0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5aKCExKTpiLkxhPSEwfSksdGhpcy5WPXRoaXMuTz0hMSksWWMoeWQodGhpcyksYSYmdGhpcy5UKSl9Owp2YXIgQ2Q9ZnVuY3Rpb24oYSxiKXsoYj1MKGEsYikpP1AoYiwhMCk6LTE8YS5sJiZQKEwoYSxhLmwpLCExKX0sRWQ9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LFJjKGEpLTEpfSxGZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiAwPmI/Yy0xOmJ9LDApfSxIZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7cmV0dXJuKGIrMSklY30sYS5sKX0sR2Q9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe2ItLTtyZXR1cm4gMD5iP2MtMTpifSxhLmwpfSxJZD1mdW5jdGlvbihhLGIsYyl7Yz0wPmM/VGMoYSxhLnMpOmM7dmFyIGQ9UmMoYSk7Yz1iLmNhbGwoYSxjLGQpO2Zvcih2YXIgZT0wO2U8PWQ7KXt2YXIgZj1MKGEsYyksZztpZihnPWYpZz1mLmlzVmlzaWJsZSgpJiZmLmlzRW5hYmxlZCgpJiYhIShmLnYmMik7aWYoZyl7YS5FYShjKTticmVha31lKys7Yz1iLmNhbGwoYSxjLGQpfX07ClMucHJvdG90eXBlLkVhPWZ1bmN0aW9uKGEpe0NkKHRoaXMsYSl9O3ZhciBUPWZ1bmN0aW9uKCl7fTtuKFQsTSk7ZGEoVCk7VC5wcm90b3R5cGUuYT1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYiJ9O1QucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXtyZXR1cm4idGFiIn07VC5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYj1ULmkuYy5jYWxsKHRoaXMsYSk7KGE9YS5QYSkmJmImJihiLnRpdGxlPWF8fCIiKTtyZXR1cm4gYn07VC5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIpe2I9VC5pLmcuY2FsbCh0aGlzLGEsYik7dmFyIGM9Yi50aXRsZXx8IiI7YyYmKGEuUGE9Yyk7YS5vJjgmJihjPWEuYikmJmlhKGMuRykmJihRKGEsOCwhMSksYy5HKGEpKTtyZXR1cm4gYn07dmFyIEpkPWZ1bmN0aW9uKGEsYixjKXtOLmNhbGwodGhpcyxhLGJ8fFQuUigpLGMpO3RkKHRoaXMsOCwhMCk7dGhpcy5LfD05fTtuKEpkLE4pO1ZjKCJnb29nLXRhYiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEpkKG51bGwpfSk7dmFyIFU9ZnVuY3Rpb24oKXt0aGlzLmg9InRhYmxpc3QifTtuKFUsWGMpO2RhKFUpO1UucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWItYmFyIn07VS5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIsYyl7dGhpcy5qfHwodGhpcy5hfHxLZCh0aGlzKSx0aGlzLmo9c2EodGhpcy5hKSk7dmFyIGQ9dGhpcy5qW2JdO2Q/KGFkKGEsTGQoZCkpLGEuQj1kKTpVLmkuZy5jYWxsKHRoaXMsYSxiLGMpfTtVLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPVUuaS5jLmNhbGwodGhpcyxhKTt0aGlzLmF8fEtkKHRoaXMpO2IucHVzaCh0aGlzLmFbYS5CXSk7cmV0dXJuIGJ9O3ZhciBLZD1mdW5jdGlvbihhKXt2YXIgYj1hLmIoKTthLmE9e3RvcDpiKyItdG9wIixib3R0b206YisiLWJvdHRvbSIsc3RhcnQ6YisiLXN0YXJ0IixlbmQ6YisiLWVuZCJ9fTt2YXIgVj1mdW5jdGlvbihhLGIsYyl7YT1hfHwidG9wIjthZCh0aGlzLExkKGEpKTt0aGlzLkI9YTtTLmNhbGwodGhpcyx0aGlzLkgsYnx8VS5SKCksYyk7TWQodGhpcyl9O24oVixTKTtoPVYucHJvdG90eXBlO2guQz1udWxsO2guRD1mdW5jdGlvbigpe1YuaS5ELmNhbGwodGhpcyk7TWQodGhpcyl9O2gudT1mdW5jdGlvbigpe1YuaS51LmNhbGwodGhpcyk7dGhpcy5DPW51bGx9O2guRWE9ZnVuY3Rpb24oYSl7Vi5pLkVhLmNhbGwodGhpcyxhKTt0aGlzLkcoTCh0aGlzLGEpKX07aC5HPWZ1bmN0aW9uKGEpe2E/cmQoYSwhMCk6dGhpcy5DJiZyZCh0aGlzLkMsITEpfTsKdmFyIE5kPWZ1bmN0aW9uKGEsYil7aWYoYiYmYj09YS5DKXtmb3IodmFyIGM9VGMoYSxiKSxkPWMtMTtiPUwoYSxkKTtkLS0pe3ZhciBlPWI7aWYoZS5pc1Zpc2libGUoKSYmZS5pc0VuYWJsZWQoKSl7YS5HKGIpO3JldHVybn19Zm9yKGMrPTE7Yj1MKGEsYyk7YysrKWlmKGQ9YixkLmlzVmlzaWJsZSgpJiZkLmlzRW5hYmxlZCgpKXthLkcoYik7cmV0dXJufWEuRyhudWxsKX19O2g9Vi5wcm90b3R5cGU7aC5hYj1mdW5jdGlvbihhKXt0aGlzLkMmJnRoaXMuQyE9YS50YXJnZXQmJnJkKHRoaXMuQywhMSk7dGhpcy5DPWEudGFyZ2V0fTtoLmJiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT10aGlzLkMmJih0aGlzLkM9bnVsbCl9O2guWmE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guJGE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guSGE9ZnVuY3Rpb24oKXtMKHRoaXMsdGhpcy5sKXx8Q2QodGhpcyxUYyh0aGlzLHRoaXMuQ3x8TCh0aGlzLDApKSl9Owp2YXIgTWQ9ZnVuY3Rpb24oYSl7SChIKEgoSChPYyhhKSxhLCJzZWxlY3QiLGEuYWIpLGEsInVuc2VsZWN0IixhLmJiKSxhLCJkaXNhYmxlIixhLlphKSxhLCJoaWRlIixhLiRhKX0sTGQ9ZnVuY3Rpb24oYSl7cmV0dXJuInN0YXJ0Ij09YXx8ImVuZCI9PWE/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O1ZjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBWfSk7ZnVuY3Rpb24gT2QoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIFBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgZz1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIrZyk7Zm9yKHZhciBrPVtdLHA9YmEoYyksdz1wLm5leHQoKTshdy5kb25lO3c9cC5uZXh0KCkpe3c9dy52YWx1ZTt2YXIgQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKQi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO0IudGV4dENvbnRlbnQ9dztmLmFwcGVuZENoaWxkKEIpO2sucHVzaChCKX0iYm90dG9tIiE9ZyYmZS5hcHBlbmRDaGlsZChmKTtwPW51bGw7aWYoInRvcCI9PWd8fCJib3R0b20iPT1nKXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTsidG9wIj09ZyYmcCYmZS5hcHBlbmRDaGlsZChwKTtCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0IuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciByYT1bXTtjPWJhKGMpO2Zvcih3PWMubmV4dCgpOyF3LmRvbmU7dz1jLm5leHQoKSl3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHcuaWQ9ZS5pZCsiX2NvbnRlbnRfIityYS5sZW5ndGgsdy5zdHlsZS5kaXNwbGF5PSJub25lIixCLmFwcGVuZENoaWxkKHcpLHJhLnB1c2godyk7ZS5hcHBlbmRDaGlsZChCKTsiYm90dG9tIj09ZyYmKHAmJgplLmFwcGVuZENoaWxkKHApLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBYPW5ldyBWKGcpO1BjKFgsZik7dmFyIFk9LTE7ZGMoWCwic2VsZWN0IixmdW5jdGlvbihaKXtaPWsuaW5kZXhPZihaLnRhcmdldC5mKCkpO1ohPVkmJigwPD1ZJiZZPHJhLmxlbmd0aCYmKHJhW1ldLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFk9LTEpLDA8PVomJlo8cmEubGVuZ3RoJiYoWT1aLHJhW1ldLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksWC5HKEwoWCxZKSkpfSk7WC5HKEwoWCxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFope1guRyhMKFgsWikpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChPZChhKSl9LFFkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sVz1sOwpRZFswXWluIFd8fCJ1bmRlZmluZWQiPT10eXBlb2YgVy5leGVjU2NyaXB0fHxXLmV4ZWNTY3JpcHQoInZhciAiK1FkWzBdKTtmb3IodmFyIFJkO1FkLmxlbmd0aCYmKFJkPVFkLnNoaWZ0KCkpOylRZC5sZW5ndGh8fHZvaWQgMD09PVBkP1dbUmRdJiZXW1JkXSE9PU9iamVjdC5wcm90b3R5cGVbUmRdP1c9V1tSZF06Vz1XW1JkXT17fTpXW1JkXT1QZDt9KS5jYWxsKHRoaXMpOwovLyBjbGFuZy1mb3JtYXQgb24K", + "headers": [ + [ + "content-type", + "application/javascript" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + } + } + }, + "executionInfo": { + "elapsed": 1457, + "status": "ok", + "timestamp": 1600709868374, + "user": { + "displayName": "Evgeny Skvortsov", + "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhiQjODaOVLfYnUuWS9rB3LRntzJDM0hqElzsUkdQ=s64", + "userId": "11510585406840398626" + }, + "user_tz": 420 + }, + "id": "-ZWQ1qPsNXrx", + "outputId": "6f3487fd-e19f-406a-8a53-1206688eeeb2" + }, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id75" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id75" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id75" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"29a45f18-fc31-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id75\", \"tabNames\": [\"EmployeesOfRole\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_e697031426" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id75" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"29a4b6de-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id75\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_101352d730" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id75" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"29a76faa-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_46ce333de6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_1", + "outputarea_id75" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"29a7d698-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id75_content_1\");\n", + "//# sourceURL=js_d9ed3829ec" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_1", + "outputarea_id75" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"29a83b24-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"29a7d698-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_bab362739d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_1", + "outputarea_id75" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"29a893b2-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id75\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_d81da12d4c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_1", + "outputarea_id75" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running EmployeesOfRole\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"29ac59b6-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"29a76faa-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_f69c0602e2" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_1", + "outputarea_id75" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"29ae6a80-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_ddbb925df5" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_0", + "outputarea_id75" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"29aee690-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id75_content_0\");\n", + "//# sourceURL=js_a68b6c8c35" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_0", + "outputarea_id75" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"29af39ba-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"29aee690-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_6cdf2c46ed" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_0", + "outputarea_id75" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"29af8794-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id75\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_89b5a56179" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_0", + "outputarea_id75" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_0", + "outputarea_id75", + "outputarea_id76", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_0", + "outputarea_id75", + "outputarea_id76", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_0", + "outputarea_id75", + "outputarea_id76", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"29b17158-fc31-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id76\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_91e878a91c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_0", + "outputarea_id75", + "outputarea_id76", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"29b1cd38-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id76\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_66a55a6b05" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_0", + "outputarea_id75", + "outputarea_id76", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"29b34640-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_2a76aed309" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_0", + "id76_content_0", + "outputarea_id75", + "outputarea_id76", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"29b3aaa4-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id76_content_0\");\n", + "//# sourceURL=js_d18697cce9" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_0", + "id76_content_0", + "outputarea_id75", + "outputarea_id76", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"29b40c42-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"29b3aaa4-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_96b7155b3c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_0", + "id76_content_0", + "outputarea_id75", + "outputarea_id76", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"29b47254-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id76\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_68ffa6d0f9" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_0", + "id76_content_0", + "outputarea_id75", + "outputarea_id76", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mEmployeesOfRole_sql\u001b[0m variable.\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " \"Alice\" AS name,\n", + " \"Product Manager\" AS role,\n", + " \"SEA\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Bob\" AS name,\n", + " \"Engineer\" AS role,\n", + " \"SEA\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Caroline\" AS name,\n", + " \"Engineer\" AS role,\n", + " \"LAX\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"David\" AS name,\n", + " \"Data Scientist\" AS role,\n", + " \"LAX\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Eve\" AS name,\n", + " \"Data Scientist\" AS role,\n", + " \"SEA\" AS office\n", + " \n", + ") )\n", + "SELECT\n", + " Employee.role AS col0,\n", + " ARRAY_AGG(Employee.name) AS logica_value\n", + "FROM\n", + " t_0_Employee AS Employee\n", + "GROUP BY col0;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"29b5ac14-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"29b34640-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_8aad76ee4c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_0", + "id76_content_0", + "outputarea_id75", + "outputarea_id76", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"29b74966-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"29ae6a80-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_a385a28ad9" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_0", + "outputarea_id75" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"29b91d0e-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_47f5e042ef" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_1", + "outputarea_id75" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"29b97d80-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id75_content_1\");\n", + "//# sourceURL=js_ea027ce94e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_1", + "outputarea_id75" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"29b9e1e4-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"29b97d80-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_f0e4c62950" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_1", + "outputarea_id75" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"29ba2b36-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id75\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_577d188e4a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_1", + "outputarea_id75" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2a2e0be6-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"29b91d0e-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_8e66723e2e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_1", + "outputarea_id75" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2a30b5a8-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_96b998badb" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_0", + "outputarea_id75" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2a312998-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id75_content_0\");\n", + "//# sourceURL=js_673cbf5583" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_0", + "outputarea_id75" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2a318f1e-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2a312998-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_8ed7d3f483" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_0", + "outputarea_id75" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2a31c47a-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id75\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_08c0ee4d58" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_0", + "outputarea_id75" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2a330222-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_0772a26a06" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_0", + "id76_content_1", + "outputarea_id75", + "outputarea_id76", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2a332f18-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id76_content_1\");\n", + "//# sourceURL=js_c24677aa47" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_0", + "id76_content_1", + "outputarea_id75", + "outputarea_id76", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2a338d8c-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2a332f18-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_2eb82ee792" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_0", + "id76_content_1", + "outputarea_id75", + "outputarea_id76", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2a33c9d2-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id76\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_23f5851c63" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_0", + "id76_content_1", + "outputarea_id75", + "outputarea_id76", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mEmployeesOfRole\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0logica_value
0Product Manager[Alice]
1Engineer[Bob, Caroline]
2Data Scientist[David, Eve]
\n", + "
" + ], + "text/plain": [ + " col0 logica_value\n", + "0 Product Manager [Alice]\n", + "1 Engineer [Bob, Caroline]\n", + "2 Data Scientist [David, Eve]" + ] + }, + "metadata": { + "tags": [ + "id75_content_0", + "id76_content_1", + "outputarea_id75", + "outputarea_id76", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2a37889c-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2a330222-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_c1515a3d0e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_0", + "id76_content_1", + "outputarea_id75", + "outputarea_id76", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2a38be38-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2a30b5a8-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_c2f450e5b3" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id75_content_0", + "outputarea_id75" + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "%%logica EmployeesOfRole\n", + "\n", + "Employee(name: \"Alice\", role: \"Product Manager\", office: \"SEA\");\n", + "Employee(name: \"Bob\", role: \"Engineer\", office: \"SEA\");\n", + "Employee(name: \"Caroline\", role: \"Engineer\", office: \"LAX\");\n", + "Employee(name: \"David\", role: \"Data Scientist\", office: \"LAX\");\n", + "Employee(name: \"Eve\", role: \"Data Scientist\", office: \"SEA\");\n", + "\n", + "EmployeesOfRole(role) List= name :- Employee(name:, role:);" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "M6feYNXXN-vk" + }, + "source": [ + "Here are some more examples of functions." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 239, + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH0=", + "headers": [ + [ + "content-type", + "text/css" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgaCxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9ZnVuY3Rpb24oYSl7dmFyIGI9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmYVtTeW1ib2wuaXRlcmF0b3JdO3JldHVybiBiP2IuY2FsbChhKTp7bmV4dDphYShhKX19LGw9dGhpc3x8c2VsZixjYT1mdW5jdGlvbigpe30sZGE9ZnVuY3Rpb24oYSl7YS5CYT12b2lkIDA7YS5SPWZ1bmN0aW9uKCl7cmV0dXJuIGEuQmE/YS5CYTphLkJhPW5ldyBhfX0sZWE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7aWYoIm9iamVjdCI9PWIpaWYoYSl7aWYoYSBpbnN0YW5jZW9mIEFycmF5KXJldHVybiJhcnJheSI7aWYoYSBpbnN0YW5jZW9mIE9iamVjdClyZXR1cm4gYjt2YXIgYz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk7aWYoIltvYmplY3QgV2luZG93XSI9PWMpcmV0dXJuIm9iamVjdCI7CmlmKCJbb2JqZWN0IEFycmF5XSI9PWN8fCJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGgmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5zcGxpY2UmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoInNwbGljZSIpKXJldHVybiJhcnJheSI7aWYoIltvYmplY3QgRnVuY3Rpb25dIj09Y3x8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmNhbGwmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoImNhbGwiKSlyZXR1cm4iZnVuY3Rpb24ifWVsc2UgcmV0dXJuIm51bGwiO2Vsc2UgaWYoImZ1bmN0aW9uIj09YiYmInVuZGVmaW5lZCI9PXR5cGVvZiBhLmNhbGwpcmV0dXJuIm9iamVjdCI7cmV0dXJuIGJ9LGZhPWZ1bmN0aW9uKGEpe3JldHVybiJhcnJheSI9PWVhKGEpfSxoYT1mdW5jdGlvbihhKXt2YXIgYj1lYShhKTtyZXR1cm4iYXJyYXkiPT1ifHwib2JqZWN0Ij09CmImJiJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGh9LGlhPWZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PWVhKGEpfSxtPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBhO3JldHVybiJvYmplY3QiPT1iJiZudWxsIT1hfHwiZnVuY3Rpb24iPT1ifSxqYT0iY2xvc3VyZV91aWRfIisoMUU5Kk1hdGgucmFuZG9tKCk+Pj4wKSxrYT0wLGxhPWZ1bmN0aW9uKGEsYil7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe3ZhciBkPWMuc2xpY2UoKTtkLnB1c2guYXBwbHkoZCxhcmd1bWVudHMpO3JldHVybiBhLmFwcGx5KHRoaXMsZCl9fSxuPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe31jLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLmk9Yi5wcm90b3R5cGU7YS5wcm90b3R5cGU9bmV3IGM7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YX07dmFyIG1hLG5hPXtlYjoiYWN0aXZlZGVzY2VuZGFudCIsamI6ImF0b21pYyIsa2I6ImF1dG9jb21wbGV0ZSIsbWI6ImJ1c3kiLHBiOiJjaGVja2VkIixxYjoiY29saW5kZXgiLHZiOiJjb250cm9scyIseGI6ImRlc2NyaWJlZGJ5IixBYjoiZGlzYWJsZWQiLENiOiJkcm9wZWZmZWN0IixEYjoiZXhwYW5kZWQiLEViOiJmbG93dG8iLEdiOiJncmFiYmVkIixLYjoiaGFzcG9wdXAiLE1iOiJoaWRkZW4iLE9iOiJpbnZhbGlkIixQYjoibGFiZWwiLFFiOiJsYWJlbGxlZGJ5IixSYjoibGV2ZWwiLFdiOiJsaXZlIixrYzoibXVsdGlsaW5lIixsYzoibXVsdGlzZWxlY3RhYmxlIixwYzoib3JpZW50YXRpb24iLHFjOiJvd25zIixyYzoicG9zaW5zZXQiLHRjOiJwcmVzc2VkIix4YzoicmVhZG9ubHkiLHpjOiJyZWxldmFudCIsQWM6InJlcXVpcmVkIixFYzoicm93aW5kZXgiLEhjOiJzZWxlY3RlZCIsSmM6InNldHNpemUiLExjOiJzb3J0IixaYzoidmFsdWVtYXgiLCRjOiJ2YWx1ZW1pbiIsYWQ6InZhbHVlbm93IiwKYmQ6InZhbHVldGV4dCJ9O3ZhciBvYT1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkIGluIGEpYi5jYWxsKGMsYVtkXSxkLGEpfSxwYT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyBpbiBhKWlmKGFbY109PWIpcmV0dXJuITA7cmV0dXJuITF9LHFhPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsIT09YSYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfSxzYT1mdW5jdGlvbihhKXt2YXIgYj17fSxjO2ZvcihjIGluIGEpYlthW2NdXT1jO3JldHVybiBifSx0YT0iY29uc3RydWN0b3IgaGFzT3duUHJvcGVydHkgaXNQcm90b3R5cGVPZiBwcm9wZXJ0eUlzRW51bWVyYWJsZSB0b0xvY2FsZVN0cmluZyB0b1N0cmluZyB2YWx1ZU9mIi5zcGxpdCgiICIpLHVhPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8dGEubGVuZ3RoO2YrKyljPQp0YVtmXSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZCxjKSYmKGFbY109ZFtjXSl9fTt2YXIgdmE9e2ZiOiJhbGVydCIsZ2I6ImFsZXJ0ZGlhbG9nIixoYjoiYXBwbGljYXRpb24iLGliOiJhcnRpY2xlIixsYjoiYmFubmVyIixuYjoiYnV0dG9uIixvYjoiY2hlY2tib3giLHJiOiJjb2x1bW5oZWFkZXIiLHNiOiJjb21ib2JveCIsdGI6ImNvbXBsZW1lbnRhcnkiLHViOiJjb250ZW50aW5mbyIsd2I6ImRlZmluaXRpb24iLHliOiJkaWFsb2ciLHpiOiJkaXJlY3RvcnkiLEJiOiJkb2N1bWVudCIsRmI6ImZvcm0iLEhiOiJncmlkIixJYjoiZ3JpZGNlbGwiLEpiOiJncm91cCIsTGI6ImhlYWRpbmciLE5iOiJpbWciLFNiOiJsaW5rIixUYjoibGlzdCIsVWI6Imxpc3Rib3giLFZiOiJsaXN0aXRlbSIsWGI6ImxvZyIsWWI6Im1haW4iLFpiOiJtYXJxdWVlIiwkYjoibWF0aCIsYWM6Im1lbnUiLGJjOiJtZW51YmFyIixjYzoibWVudWl0ZW0iLGRjOiJtZW51aXRlbWNoZWNrYm94IixlYzoibWVudWl0ZW1yYWRpbyIsbWM6Im5hdmlnYXRpb24iLG5jOiJub3RlIixvYzoib3B0aW9uIiwKc2M6InByZXNlbnRhdGlvbiIsdWM6InByb2dyZXNzYmFyIix2YzoicmFkaW8iLHdjOiJyYWRpb2dyb3VwIix5YzoicmVnaW9uIixCYzoicm93IixDYzoicm93Z3JvdXAiLERjOiJyb3doZWFkZXIiLEZjOiJzY3JvbGxiYXIiLEdjOiJzZWFyY2giLEljOiJzZXBhcmF0b3IiLEtjOiJzbGlkZXIiLE1jOiJzcGluYnV0dG9uIixOYzoic3RhdHVzIixPYzoidGFiIixQYzoidGFibGlzdCIsUWM6InRhYnBhbmVsIixSYzoidGV4dGJveCIsU2M6InRleHRpbmZvIixUYzoidGltZXIiLFVjOiJ0b29sYmFyIixWYzoidG9vbHRpcCIsV2M6InRyZWUiLFhjOiJ0cmVlZ3JpZCIsWWM6InRyZWVpdGVtIn07dmFyIHdhPWZ1bmN0aW9uKGEpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsd2EpO2Vsc2V7dmFyIGI9RXJyb3IoKS5zdGFjaztiJiYodGhpcy5zdGFjaz1iKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSl9O24od2EsRXJyb3IpO3dhLnByb3RvdHlwZS5uYW1lPSJDdXN0b21FcnJvciI7dmFyIHhhO3ZhciB5YT1mdW5jdGlvbihhLGIpe2E9YS5zcGxpdCgiJXMiKTtmb3IodmFyIGM9IiIsZD1hLmxlbmd0aC0xLGU9MDtlPGQ7ZSsrKWMrPWFbZV0rKGU8Yi5sZW5ndGg/YltlXToiJXMiKTt3YS5jYWxsKHRoaXMsYythW2RdKX07bih5YSx3YSk7eWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjsKdmFyIHphPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSJBc3NlcnRpb24gZmFpbGVkIjtpZihjKXtlKz0iOiAiK2M7dmFyIGY9ZH1lbHNlIGEmJihlKz0iOiAiK2EsZj1iKTt0aHJvdyBuZXcgeWEoIiIrZSxmfHxbXSk7fSxxPWZ1bmN0aW9uKGEsYixjKXthfHx6YSgiIixudWxsLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX0sQWE9ZnVuY3Rpb24oYSxiLGMpe20oYSkmJjE9PWEubm9kZVR5cGV8fHphKCJFeHBlY3RlZCBFbGVtZW50IGJ1dCBnb3QgJXM6ICVzLiIsW2VhKGEpLGFdLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKX0sQ2E9ZnVuY3Rpb24oYSxiLGMsZCl7YSBpbnN0YW5jZW9mIGJ8fHphKCJFeHBlY3RlZCBpbnN0YW5jZW9mICVzIGJ1dCBnb3QgJXMuIixbQmEoYiksQmEoYSldLGMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpKX0sQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZgpGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTpudWxsPT09YT8ibnVsbCI6dHlwZW9mIGF9O3ZhciBEYT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3EobnVsbCE9YS5sZW5ndGgpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKCJzdHJpbmciPT09dHlwZW9mIGEpcmV0dXJuInN0cmluZyIhPT10eXBlb2YgYnx8MSE9Yi5sZW5ndGg/LTE6YS5pbmRleE9mKGIsMCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspaWYoYyBpbiBhJiZhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX0scj1BcnJheS5wcm90b3R5cGUuZm9yRWFjaD9mdW5jdGlvbihhLGIsYyl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsYyl9OmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9YS5sZW5ndGgsZT0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZj0wO2Y8ZDtmKyspZiBpbiBlJiZiLmNhbGwoYyxlW2ZdLGYsYSl9LEVhPUFycmF5LnByb3RvdHlwZS5maWx0ZXI/CmZ1bmN0aW9uKGEsYil7cShudWxsIT1hLmxlbmd0aCk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD1bXSxlPTAsZj0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZz0wO2c8YztnKyspaWYoZyBpbiBmKXt2YXIgaz1mW2ddO2IuY2FsbCh2b2lkIDAsayxnLGEpJiYoZFtlKytdPWspfXJldHVybiBkfSxGYT1BcnJheS5wcm90b3R5cGUuZXZlcnk/ZnVuY3Rpb24oYSxiKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmV2ZXJ5LmNhbGwoYSxiLHZvaWQgMCl9OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWEubGVuZ3RoLGQ9InN0cmluZyI9PT10eXBlb2YgYT9hLnNwbGl0KCIiKTphLGU9MDtlPGM7ZSsrKWlmKGUgaW4gZCYmIWIuY2FsbCh2b2lkIDAsZFtlXSxlLGEpKXJldHVybiExO3JldHVybiEwfSxHYT1mdW5jdGlvbihhLGIpe3JldHVybiAwPD0KRGEoYSxiKX0sSGE9ZnVuY3Rpb24oYSxiKXtiPURhKGEsYik7dmFyIGM7aWYoYz0wPD1iKXEobnVsbCE9YS5sZW5ndGgpLEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhLGIsMSk7cmV0dXJuIGN9LElhPWZ1bmN0aW9uKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGFyZ3VtZW50cyl9LEphPWZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDA8Yil7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX0sTGE9ZnVuY3Rpb24oYSxiLGMsZCl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShhLEthKGFyZ3VtZW50cywxKSl9LEthPWZ1bmN0aW9uKGEsYixjKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gMj49YXJndW1lbnRzLmxlbmd0aD9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsYixjKX07dmFyIE1hPVN0cmluZy5wcm90b3R5cGUudHJpbT9mdW5jdGlvbihhKXtyZXR1cm4gYS50cmltKCl9OmZ1bmN0aW9uKGEpe3JldHVybi9eW1xzXHhhMF0qKFtcc1xTXSo/KVtcc1x4YTBdKiQvLmV4ZWMoYSlbMV19LE5hPS8mL2csT2E9LzwvZyxQYT0vPi9nLFFhPS8iL2csUmE9LycvZyxTYT0vXHgwMC9nLFRhPS9bXHgwMCY8PiInXS8sdD1mdW5jdGlvbihhLGIpe3JldHVybi0xIT1hLmluZGV4T2YoYil9LFVhPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE8Yj8tMTphPmI/MTowfTt2YXIgdTthOnt2YXIgVmE9bC5uYXZpZ2F0b3I7aWYoVmEpe3ZhciBXYT1WYS51c2VyQWdlbnQ7aWYoV2Epe3U9V2E7YnJlYWsgYX19dT0iIn07LyoKCiBDb3B5cmlnaHQgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzLgogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKKi8KdmFyIFhhPWZ1bmN0aW9uKGEpe1RhLnRlc3QoYSkmJigtMSE9YS5pbmRleE9mKCImIikmJihhPWEucmVwbGFjZShOYSwiJmFtcDsiKSksLTEhPWEuaW5kZXhPZigiPCIpJiYoYT1hLnJlcGxhY2UoT2EsIiZsdDsiKSksLTEhPWEuaW5kZXhPZigiPiIpJiYoYT1hLnJlcGxhY2UoUGEsIiZndDsiKSksLTEhPWEuaW5kZXhPZignIicpJiYoYT1hLnJlcGxhY2UoUWEsIiZxdW90OyIpKSwtMSE9YS5pbmRleE9mKCInIikmJihhPWEucmVwbGFjZShSYSwiJiMzOTsiKSksLTEhPWEuaW5kZXhPZigiXHgwMCIpJiYoYT1hLnJlcGxhY2UoU2EsIiYjMDsiKSkpO3JldHVybiBhfTt2YXIgWWE9ZnVuY3Rpb24oYSl7WWFbIiAiXShhKTtyZXR1cm4gYX07WWFbIiAiXT1jYTt2YXIgJGE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1aYTtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsYSk/Y1thXTpjW2FdPWIoYSl9O3ZhciBhYj10KHUsIk9wZXJhIiksdj10KHUsIlRyaWRlbnQiKXx8dCh1LCJNU0lFIiksYmI9dCh1LCJFZGdlIikseD10KHUsIkdlY2tvIikmJiEodCh1LnRvTG93ZXJDYXNlKCksIndlYmtpdCIpJiYhdCh1LCJFZGdlIikpJiYhKHQodSwiVHJpZGVudCIpfHx0KHUsIk1TSUUiKSkmJiF0KHUsIkVkZ2UiKSx5PXQodS50b0xvd2VyQ2FzZSgpLCJ3ZWJraXQiKSYmIXQodSwiRWRnZSIpLHo9dCh1LCJNYWNpbnRvc2giKSxjYj1mdW5jdGlvbigpe3ZhciBhPWwuZG9jdW1lbnQ7cmV0dXJuIGE/YS5kb2N1bWVudE1vZGU6dm9pZCAwfSxkYjsKYTp7dmFyIGViPSIiLGZiPWZ1bmN0aW9uKCl7dmFyIGE9dTtpZih4KXJldHVybi9ydjooW15cKTtdKykoXCl8OykvLmV4ZWMoYSk7aWYoYmIpcmV0dXJuL0VkZ2VcLyhbXGRcLl0rKS8uZXhlYyhhKTtpZih2KXJldHVybi9cYig/Ok1TSUV8cnYpWzogXShbXlwpO10rKShcKXw7KS8uZXhlYyhhKTtpZih5KXJldHVybi9XZWJLaXRcLyhcUyspLy5leGVjKGEpO2lmKGFiKXJldHVybi8oPzpWZXJzaW9uKVsgXC9dPyhcUyspLy5leGVjKGEpfSgpO2ZiJiYoZWI9ZmI/ZmJbMV06IiIpO2lmKHYpe3ZhciBnYj1jYigpO2lmKG51bGwhPWdiJiZnYj5wYXJzZUZsb2F0KGViKSl7ZGI9U3RyaW5nKGdiKTticmVhayBhfX1kYj1lYn0KdmFyIGhiPWRiLFphPXt9LEE9ZnVuY3Rpb24oYSl7cmV0dXJuICRhKGEsZnVuY3Rpb24oKXtmb3IodmFyIGI9MCxjPU1hKFN0cmluZyhoYikpLnNwbGl0KCIuIiksZD1NYShTdHJpbmcoYSkpLnNwbGl0KCIuIiksZT1NYXRoLm1heChjLmxlbmd0aCxkLmxlbmd0aCksZj0wOzA9PWImJmY8ZTtmKyspe3ZhciBnPWNbZl18fCIiLGs9ZFtmXXx8IiI7ZG97Zz0vKFxkKikoXEQqKSguKikvLmV4ZWMoZyl8fFsiIiwiIiwiIiwiIl07az0vKFxkKikoXEQqKSguKikvLmV4ZWMoayl8fFsiIiwiIiwiIiwiIl07aWYoMD09Z1swXS5sZW5ndGgmJjA9PWtbMF0ubGVuZ3RoKWJyZWFrO2I9VWEoMD09Z1sxXS5sZW5ndGg/MDpwYXJzZUludChnWzFdLDEwKSwwPT1rWzFdLmxlbmd0aD8wOnBhcnNlSW50KGtbMV0sMTApKXx8VWEoMD09Z1syXS5sZW5ndGgsMD09a1syXS5sZW5ndGgpfHxVYShnWzJdLGtbMl0pO2c9Z1szXTtrPWtbM119d2hpbGUoMD09Yil9cmV0dXJuIDA8PWJ9KX0saWI7CmliPWwuZG9jdW1lbnQmJnY/Y2IoKTp2b2lkIDA7dmFyIGpiPSF2fHw5PD1OdW1iZXIoaWIpO3ZhciBsYj1mdW5jdGlvbihhLGIpe29hKGIsZnVuY3Rpb24oYyxkKXtjJiYib2JqZWN0Ij09dHlwZW9mIGMmJmMuZGQmJihjPWMuY2QoKSk7InN0eWxlIj09ZD9hLnN0eWxlLmNzc1RleHQ9YzoiY2xhc3MiPT1kP2EuY2xhc3NOYW1lPWM6ImZvciI9PWQ/YS5odG1sRm9yPWM6a2IuaGFzT3duUHJvcGVydHkoZCk/YS5zZXRBdHRyaWJ1dGUoa2JbZF0sYyk6MD09ZC5sYXN0SW5kZXhPZigiYXJpYS0iLDApfHwwPT1kLmxhc3RJbmRleE9mKCJkYXRhLSIsMCk/YS5zZXRBdHRyaWJ1dGUoZCxjKTphW2RdPWN9KX0sa2I9e2NlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjb2xzcGFuOiJjb2xTcGFuIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGhlaWdodDoiaGVpZ2h0IixtYXhsZW5ndGg6Im1heExlbmd0aCIsbm9uY2U6Im5vbmNlIixyb2xlOiJyb2xlIixyb3dzcGFuOiJyb3dTcGFuIix0eXBlOiJ0eXBlIix1c2VtYXA6InVzZU1hcCIsdmFsaWduOiJ2QWxpZ24iLAp3aWR0aDoid2lkdGgifSxtYj1mdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChrKXtrJiZiLmFwcGVuZENoaWxkKCJzdHJpbmciPT09dHlwZW9mIGs/YS5jcmVhdGVUZXh0Tm9kZShrKTprKX1mb3IodmFyIGU9MjtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXTtpZighaGEoZil8fG0oZikmJjA8Zi5ub2RlVHlwZSlkKGYpO2Vsc2V7YTp7aWYoZiYmIm51bWJlciI9PXR5cGVvZiBmLmxlbmd0aCl7aWYobShmKSl7dmFyIGc9ImZ1bmN0aW9uIj09dHlwZW9mIGYuaXRlbXx8InN0cmluZyI9PXR5cGVvZiBmLml0ZW07YnJlYWsgYX1pZihpYShmKSl7Zz0iZnVuY3Rpb24iPT10eXBlb2YgZi5pdGVtO2JyZWFrIGF9fWc9ITF9cihnP0phKGYpOmYsZCl9fX0sbmI9ZnVuY3Rpb24oYSxiKXtiPVN0cmluZyhiKTsiYXBwbGljYXRpb24veGh0bWwreG1sIj09PWEuY29udGVudFR5cGUmJihiPWIudG9Mb3dlckNhc2UoKSk7cmV0dXJuIGEuY3JlYXRlRWxlbWVudChiKX0sb2I9ZnVuY3Rpb24oYSl7YSYmCmEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpfSxwYj1mdW5jdGlvbihhLGIpe2lmKCFhfHwhYilyZXR1cm4hMTtpZihhLmNvbnRhaW5zJiYxPT1iLm5vZGVUeXBlKXJldHVybiBhPT1ifHxhLmNvbnRhaW5zKGIpO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbilyZXR1cm4gYT09Ynx8ISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNik7Zm9yKDtiJiZhIT1iOyliPWIucGFyZW50Tm9kZTtyZXR1cm4gYj09YX0scWI9ZnVuY3Rpb24oYSl7cShhLCJOb2RlIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4iKTtyZXR1cm4gOT09YS5ub2RlVHlwZT9hOmEub3duZXJEb2N1bWVudHx8YS5kb2N1bWVudH0scmI9ZnVuY3Rpb24oYSxiKXtiP2EudGFiSW5kZXg9MDooYS50YWJJbmRleD0tMSxhLnJlbW92ZUF0dHJpYnV0ZSgidGFiSW5kZXgiKSl9LHNiPWZ1bmN0aW9uKGEpe3JldHVybiB2JiYhQSgiOSIpPyhhPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKSwKbnVsbCE9YSYmYS5zcGVjaWZpZWQpOmEuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpfSx0Yj1mdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgYSYmMDw9YSYmMzI3Njg+YX0sdWI9ZnVuY3Rpb24oYSl7dGhpcy5hPWF8fGwuZG9jdW1lbnR8fGRvY3VtZW50fTt1Yi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBhP3RoaXMuYS5nZXRFbGVtZW50QnlJZChhKTphfTsKdWIucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuYSxlPWFyZ3VtZW50cyxmPVN0cmluZyhlWzBdKSxnPWVbMV07aWYoIWpiJiZnJiYoZy5uYW1lfHxnLnR5cGUpKXtmPVsiPCIsZl07Zy5uYW1lJiZmLnB1c2goJyBuYW1lPSInLFhhKGcubmFtZSksJyInKTtpZihnLnR5cGUpe2YucHVzaCgnIHR5cGU9IicsWGEoZy50eXBlKSwnIicpO3ZhciBrPXt9O3VhKGssZyk7ZGVsZXRlIGsudHlwZTtnPWt9Zi5wdXNoKCI+Iik7Zj1mLmpvaW4oIiIpfWY9bmIoZCxmKTtnJiYoInN0cmluZyI9PT10eXBlb2YgZz9mLmNsYXNzTmFtZT1nOmZhKGcpP2YuY2xhc3NOYW1lPWcuam9pbigiICIpOmxiKGYsZykpOzI8ZS5sZW5ndGgmJm1iKGQsZixlKTtyZXR1cm4gZn07dmFyIHZiPWZ1bmN0aW9uKGEsYil7Yj8ocShwYSh2YSxiKSwiTm8gc3VjaCBBUklBIHJvbGUgIitiKSxhLnNldEF0dHJpYnV0ZSgicm9sZSIsYikpOmEucmVtb3ZlQXR0cmlidXRlKCJyb2xlIil9LHhiPWZ1bmN0aW9uKGEsYixjKXtmYShjKSYmKGM9Yy5qb2luKCIgIikpO3ZhciBkPXdiKGIpOyIiPT09Y3x8dm9pZCAwPT1jPyhtYXx8KG1hPXthdG9taWM6ITEsYXV0b2NvbXBsZXRlOiJub25lIixkcm9wZWZmZWN0OiJub25lIixoYXNwb3B1cDohMSxsaXZlOiJvZmYiLG11bHRpbGluZTohMSxtdWx0aXNlbGVjdGFibGU6ITEsb3JpZW50YXRpb246InZlcnRpY2FsIixyZWFkb25seTohMSxyZWxldmFudDoiYWRkaXRpb25zIHRleHQiLHJlcXVpcmVkOiExLHNvcnQ6Im5vbmUiLGJ1c3k6ITEsZGlzYWJsZWQ6ITEsaGlkZGVuOiExLGludmFsaWQ6ImZhbHNlIn0pLGM9bWEsYiBpbiBjP2Euc2V0QXR0cmlidXRlKGQsY1tiXSk6YS5yZW1vdmVBdHRyaWJ1dGUoZCkpOmEuc2V0QXR0cmlidXRlKGQsCmMpfSx3Yj1mdW5jdGlvbihhKXtxKGEsIkFSSUEgYXR0cmlidXRlIGNhbm5vdCBiZSBlbXB0eS4iKTtxKHBhKG5hLGEpLCJObyBzdWNoIEFSSUEgYXR0cmlidXRlICIrYSk7cmV0dXJuImFyaWEtIithfTt2YXIgeWI9T2JqZWN0LmZyZWV6ZXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O3ZhciBDPWZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVTt0aGlzLko9dGhpcy5KfTtDLnByb3RvdHlwZS5VPSExO0MucHJvdG90eXBlLk49ZnVuY3Rpb24oKXt0aGlzLlV8fCh0aGlzLlU9ITAsdGhpcy51KCkpfTt2YXIgemI9ZnVuY3Rpb24oYSxiKXthLlU/YigpOihhLkp8fChhLko9W10pLGEuSi5wdXNoKGIpKX07Qy5wcm90b3R5cGUudT1mdW5jdGlvbigpe2lmKHRoaXMuSilmb3IoO3RoaXMuSi5sZW5ndGg7KXRoaXMuSi5zaGlmdCgpKCl9O3ZhciBBYj1mdW5jdGlvbihhKXthJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5OJiZhLk4oKX07dmFyIEJiPWZ1bmN0aW9uKGEpe3JldHVybiJzdHJpbmciPT10eXBlb2YgYS5jbGFzc05hbWU/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sRD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6QmIoYSkubWF0Y2goL1xTKy9nKXx8W119LENiPWZ1bmN0aW9uKGEsYil7InN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZT9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxEYj1mdW5jdGlvbihhLGIpe3JldHVybiBhLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5jb250YWlucyhiKTpHYShEKGEpLGIpfSxFYj1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFEYihhLGIpKXt2YXIgYz1CYihhKTtDYihhLGMrKDA8Yy5sZW5ndGg/IiAiK2I6YikpfX0sRmI9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClyKGIsCmZ1bmN0aW9uKGUpe0ViKGEsZSl9KTtlbHNle3ZhciBjPXt9O3IoRChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7cihiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPTA8Yi5sZW5ndGg/IiAiK2Q6ZDtDYihhLGIpfX0sR2I9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6RGIoYSxiKSYmQ2IoYSxFYShEKGEpLGZ1bmN0aW9uKGMpe3JldHVybiBjIT1ifSkuam9pbigiICIpKX0sSGI9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9yKGIsZnVuY3Rpb24oYyl7R2IoYSxjKX0pOkNiKGEsRWEoRChhKSxmdW5jdGlvbihjKXtyZXR1cm4hR2EoYixjKX0pLmpvaW4oIiAiKSl9O3ZhciBJYj0hdnx8OTw9TnVtYmVyKGliKSxKYj0hdnx8OTw9TnVtYmVyKGliKSxLYj12JiYhQSgiOSIpLExiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e2wuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsY2EsYiksbC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjYSxiKX1jYXRjaChjKXt9cmV0dXJuIGF9KCk7dmFyIEU9ZnVuY3Rpb24oYSxiKXt0aGlzLnR5cGU9YTt0aGlzLmE9dGhpcy50YXJnZXQ9Yjt0aGlzLmg9ITE7dGhpcy5LYT0hMH07RS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuaD0hMH07RS5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3RoaXMuS2E9ITF9O3ZhciBGPXtMOiJtb3VzZWRvd24iLE06Im1vdXNldXAiLGFhOiJtb3VzZWNhbmNlbCIsaGM6Im1vdXNlbW92ZSIsamM6Im1vdXNlb3ZlciIsaWM6Im1vdXNlb3V0IixmYzoibW91c2VlbnRlciIsZ2M6Im1vdXNlbGVhdmUifTt2YXIgRz1mdW5jdGlvbihhLGIpe0UuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy5hPXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5jPTA7dGhpcy5BPXRoaXMubWV0YUtleT10aGlzLnNoaWZ0S2V5PXRoaXMuYWx0S2V5PXRoaXMuY3RybEtleT0hMTt0aGlzLnBvaW50ZXJJZD0wO3RoaXMucG9pbnRlclR5cGU9IiI7dGhpcy5iPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMuYT1iO2lmKGI9YS5yZWxhdGVkVGFyZ2V0KXtpZih4KXthOnt0cnl7WWEoYi5ub2RlTmFtZSk7dmFyIGU9ITA7YnJlYWsgYX1jYXRjaChmKXt9ZT0KITF9ZXx8KGI9bnVsbCl9fWVsc2UibW91c2VvdmVyIj09Yz9iPWEuZnJvbUVsZW1lbnQ6Im1vdXNlb3V0Ij09YyYmKGI9YS50b0VsZW1lbnQpO3RoaXMucmVsYXRlZFRhcmdldD1iO2Q/KHRoaXMuY2xpZW50WD12b2lkIDAhPT1kLmNsaWVudFg/ZC5jbGllbnRYOmQucGFnZVgsdGhpcy5jbGllbnRZPXZvaWQgMCE9PWQuY2xpZW50WT9kLmNsaWVudFk6ZC5wYWdlWSx0aGlzLnNjcmVlblg9ZC5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1kLnNjcmVlbll8fDApOih0aGlzLmNsaWVudFg9dm9pZCAwIT09YS5jbGllbnRYP2EuY2xpZW50WDphLnBhZ2VYLHRoaXMuY2xpZW50WT12b2lkIDAhPT1hLmNsaWVudFk/YS5jbGllbnRZOmEucGFnZVksdGhpcy5zY3JlZW5YPWEuc2NyZWVuWHx8MCx0aGlzLnNjcmVlblk9YS5zY3JlZW5ZfHwwKTt0aGlzLmJ1dHRvbj1hLmJ1dHRvbjt0aGlzLmM9YS5rZXlDb2RlfHwwO3RoaXMua2V5PWEua2V5fHwiIjt0aGlzLmN0cmxLZXk9YS5jdHJsS2V5O3RoaXMuYWx0S2V5PQphLmFsdEtleTt0aGlzLnNoaWZ0S2V5PWEuc2hpZnRLZXk7dGhpcy5tZXRhS2V5PWEubWV0YUtleTt0aGlzLkE9ej9hLm1ldGFLZXk6YS5jdHJsS2V5O3RoaXMucG9pbnRlcklkPWEucG9pbnRlcklkfHwwO3RoaXMucG9pbnRlclR5cGU9InN0cmluZyI9PT10eXBlb2YgYS5wb2ludGVyVHlwZT9hLnBvaW50ZXJUeXBlOk1iW2EucG9pbnRlclR5cGVdfHwiIjt0aGlzLmI9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnRoaXMuZygpfX07bihHLEUpO3ZhciBOYj15YihbMSw0LDJdKSxNYj15Yih7MjoidG91Y2giLDM6InBlbiIsNDoibW91c2UifSksT2I9ZnVuY3Rpb24oYSl7cmV0dXJuIEliPzA9PWEuYi5idXR0b246ImNsaWNrIj09YS50eXBlPyEwOiEhKGEuYi5idXR0b24mTmJbMF0pfTtHLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7Ry5pLmouY2FsbCh0aGlzKTt0aGlzLmIuc3RvcFByb3BhZ2F0aW9uP3RoaXMuYi5zdG9wUHJvcGFnYXRpb24oKTp0aGlzLmIuY2FuY2VsQnViYmxlPSEwfTsKRy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe0cuaS5nLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5iO2lmKGEucHJldmVudERlZmF1bHQpYS5wcmV2ZW50RGVmYXVsdCgpO2Vsc2UgaWYoYS5yZXR1cm5WYWx1ZT0hMSxLYil0cnl7aWYoYS5jdHJsS2V5fHwxMTI8PWEua2V5Q29kZSYmMTIzPj1hLmtleUNvZGUpYS5rZXlDb2RlPS0xfWNhdGNoKGIpe319O3ZhciBQYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKDFFNipNYXRoLnJhbmRvbSgpfDApLFFiPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW1BiXSl9LFJiPTA7dmFyIFNiPWZ1bmN0aW9uKGEsYixjLGQsZSl7dGhpcy5saXN0ZW5lcj1hO3RoaXMuYT1udWxsO3RoaXMuc3JjPWI7dGhpcy50eXBlPWM7dGhpcy5jYXB0dXJlPSEhZDt0aGlzLm1hPWU7dGhpcy5rZXk9KytSYjt0aGlzLlg9dGhpcy5oYT0hMX0sVGI9ZnVuY3Rpb24oYSl7YS5YPSEwO2EubGlzdGVuZXI9bnVsbDthLmE9bnVsbDthLnNyYz1udWxsO2EubWE9bnVsbH07dmFyIFViPWZ1bmN0aW9uKGEpe3RoaXMuc3JjPWE7dGhpcy5hPXt9O3RoaXMuYj0wfTtVYi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS50b1N0cmluZygpO2E9dGhpcy5hW2ZdO2F8fChhPXRoaXMuYVtmXT1bXSx0aGlzLmIrKyk7dmFyIGc9VmIoYSxiLGQsZSk7LTE8Zz8oYj1hW2ddLGN8fChiLmhhPSExKSk6KGI9bmV3IFNiKGIsdGhpcy5zcmMsZiwhIWQsZSksYi5oYT1jLGEucHVzaChiKSk7cmV0dXJuIGJ9Owp2YXIgV2I9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLnR5cGU7YyBpbiBhLmEmJkhhKGEuYVtjXSxiKSYmKFRiKGIpLDA9PWEuYVtjXS5sZW5ndGgmJihkZWxldGUgYS5hW2NdLGEuYi0tKSl9LFhiPWZ1bmN0aW9uKGEsYixjLGQsZSl7YT1hLmFbYi50b1N0cmluZygpXTtiPS0xO2EmJihiPVZiKGEsYyxkLGUpKTtyZXR1cm4tMTxiP2FbYl06bnVsbH0sVmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuWCYmZi5saXN0ZW5lcj09YiYmZi5jYXB0dXJlPT0hIWMmJmYubWE9PWQpcmV0dXJuIGV9cmV0dXJuLTF9O3ZhciBZYj0iY2xvc3VyZV9sbV8iKygxRTYqTWF0aC5yYW5kb20oKXwwKSxaYj17fSwkYj0wLGJjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZCYmZC5vbmNlKXJldHVybiBhYyhhLGIsYyxkLGUpO2lmKGZhKGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyliYyhhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9Y2MoYyk7cmV0dXJuIFFiKGEpP2RjKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOmVjKGEsYixjLCExLGQsZSl9LGVjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGc9bShlKT8hIWUuY2FwdHVyZTohIWUsaz1mYyhhKTtrfHwoYVtZYl09az1uZXcgVWIoYSkpO2M9ay5hZGQoYixjLGQsZyxmKTtpZihjLmEpcmV0dXJuIGM7ZD1nYygpO2MuYT1kO2Quc3JjPWE7ZC5saXN0ZW5lcj1jO2lmKGEuYWRkRXZlbnRMaXN0ZW5lcilMYnx8KGU9Zyksdm9pZCAwPT09ZSYmKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksCmQsZSk7ZWxzZSBpZihhLmF0dGFjaEV2ZW50KWEuYXR0YWNoRXZlbnQoaGMoYi50b1N0cmluZygpKSxkKTtlbHNlIGlmKGEuYWRkTGlzdGVuZXImJmEucmVtb3ZlTGlzdGVuZXIpcSgiY2hhbmdlIj09PWIsIk1lZGlhUXVlcnlMaXN0IG9ubHkgaGFzIGEgY2hhbmdlIGV2ZW50IiksYS5hZGRMaXN0ZW5lcihkKTtlbHNlIHRocm93IEVycm9yKCJhZGRFdmVudExpc3RlbmVyIGFuZCBhdHRhY2hFdmVudCBhcmUgdW5hdmFpbGFibGUuIik7JGIrKztyZXR1cm4gY30sZ2M9ZnVuY3Rpb24oKXt2YXIgYT1pYyxiPUpiP2Z1bmN0aW9uKGMpe3JldHVybiBhLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKX06ZnVuY3Rpb24oYyl7Yz1hLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKTtpZighYylyZXR1cm4gY307cmV0dXJuIGJ9LGFjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZmEoYikpe2Zvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWFjKGEsYltmXSxjLGQsZSk7cmV0dXJuIG51bGx9Yz1jYyhjKTtyZXR1cm4gUWIoYSk/CmEuaC5hZGQoU3RyaW5nKGIpLGMsITAsbShkKT8hIWQuY2FwdHVyZTohIWQsZSk6ZWMoYSxiLGMsITAsZCxlKX0samM9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihmYShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylqYyhhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPWNjKGMpLFFiKGEpPyhhPWEuaCxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5hJiYoZj1hLmFbYl0sYz1WYihmLGMsZCxlKSwtMTxjJiYoVGIoZltjXSkscShudWxsIT1mLmxlbmd0aCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSwwPT1mLmxlbmd0aCYmKGRlbGV0ZSBhLmFbYl0sYS5iLS0pKSkpOmEmJihhPWZjKGEpKSYmKGM9WGIoYSxiLGMsZCxlKSkmJmtjKGMpfSxrYz1mdW5jdGlvbihhKXtpZigibnVtYmVyIiE9PXR5cGVvZiBhJiZhJiYhYS5YKXt2YXIgYj1hLnNyYztpZihRYihiKSlXYihiLmgsYSk7ZWxzZXt2YXIgYz1hLnR5cGUsZD1hLmE7Yi5yZW1vdmVFdmVudExpc3RlbmVyPwpiLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KGhjKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7JGItLTsoYz1mYyhiKSk/KFdiKGMsYSksMD09Yy5iJiYoYy5zcmM9bnVsbCxiW1liXT1udWxsKSk6VGIoYSl9fX0saGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gWmI/WmJbYV06WmJbYV09Im9uIithfSxtYz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMDtpZihhPWZjKGEpKWlmKGI9YS5hW2IudG9TdHJpbmcoKV0pZm9yKGI9Yi5jb25jYXQoKSxhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBmPWJbYV07ZiYmZi5jYXB0dXJlPT1jJiYhZi5YJiYoZj1sYyhmLGQpLGU9ZSYmITEhPT1mKX1yZXR1cm4gZX0sbGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5tYXx8YS5zcmM7YS5oYSYma2MoYSk7cmV0dXJuIGMuY2FsbChkLGIpfSxpYz1mdW5jdGlvbihhLApiKXtpZihhLlgpcmV0dXJuITA7aWYoIUpiKXtpZighYilhOntiPVsid2luZG93IiwiZXZlbnQiXTtmb3IodmFyIGM9bCxkPTA7ZDxiLmxlbmd0aDtkKyspaWYoYz1jW2JbZF1dLG51bGw9PWMpe2I9bnVsbDticmVhayBhfWI9Y31kPWI7Yj1uZXcgRyhkLHRoaXMpO2M9ITA7aWYoISgwPmQua2V5Q29kZXx8dm9pZCAwIT1kLnJldHVyblZhbHVlKSl7YTp7dmFyIGU9ITE7aWYoMD09ZC5rZXlDb2RlKXRyeXtkLmtleUNvZGU9LTE7YnJlYWsgYX1jYXRjaChnKXtlPSEwfWlmKGV8fHZvaWQgMD09ZC5yZXR1cm5WYWx1ZSlkLnJldHVyblZhbHVlPSEwfWQ9W107Zm9yKGU9Yi5hO2U7ZT1lLnBhcmVudE5vZGUpZC5wdXNoKGUpO2E9YS50eXBlO2ZvcihlPWQubGVuZ3RoLTE7IWIuaCYmMDw9ZTtlLS0pe2IuYT1kW2VdO3ZhciBmPW1jKGRbZV0sYSwhMCxiKTtjPWMmJmZ9Zm9yKGU9MDshYi5oJiZlPGQubGVuZ3RoO2UrKyliLmE9ZFtlXSxmPW1jKGRbZV0sYSwhMSxiKSxjPWMmJmZ9cmV0dXJuIGN9cmV0dXJuIGxjKGEsCm5ldyBHKGIsdGhpcykpfSxmYz1mdW5jdGlvbihhKXthPWFbWWJdO3JldHVybiBhIGluc3RhbmNlb2YgVWI/YTpudWxsfSxuYz0iX19jbG9zdXJlX2V2ZW50c19mbl8iKygxRTkqTWF0aC5yYW5kb20oKT4+PjApLGNjPWZ1bmN0aW9uKGEpe3EoYSwiTGlzdGVuZXIgY2FuIG5vdCBiZSBudWxsLiIpO2lmKGlhKGEpKXJldHVybiBhO3EoYS5oYW5kbGVFdmVudCwiQW4gb2JqZWN0IGxpc3RlbmVyIG11c3QgaGF2ZSBoYW5kbGVFdmVudCBtZXRob2QuIik7YVtuY118fChhW25jXT1mdW5jdGlvbihiKXtyZXR1cm4gYS5oYW5kbGVFdmVudChiKX0pO3JldHVybiBhW25jXX07dmFyIG9jPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9e319O24ob2MsQyk7CnZhciBwYz1bXSxIPWZ1bmN0aW9uKGEsYixjLGQpe2ZhKGMpfHwoYyYmKHBjWzBdPWMudG9TdHJpbmcoKSksYz1wYyk7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWJjKGIsY1tlXSxkfHxhLmhhbmRsZUV2ZW50LCExLGEuYnx8YSk7aWYoIWYpYnJlYWs7YS5hW2Yua2V5XT1mfXJldHVybiBhfSxxYz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoZmEoYykpZm9yKHZhciBnPTA7ZzxjLmxlbmd0aDtnKyspcWMoYSxiLGNbZ10sZCxlLGYpO2Vsc2UgZD1kfHxhLmhhbmRsZUV2ZW50LGU9bShlKT8hIWUuY2FwdHVyZTohIWUsZj1mfHxhLmJ8fGEsZD1jYyhkKSxlPSEhZSxjPVFiKGIpP1hiKGIuaCxTdHJpbmcoYyksZCxlLGYpOmI/KGI9ZmMoYikpP1hiKGIsYyxkLGUsZik6bnVsbDpudWxsLGMmJihrYyhjKSxkZWxldGUgYS5hW2Mua2V5XSk7cmV0dXJuIGF9LHJjPWZ1bmN0aW9uKGEpe29hKGEuYSxmdW5jdGlvbihiLGMpe3RoaXMuYS5oYXNPd25Qcm9wZXJ0eShjKSYma2MoYil9LAphKTthLmE9e319O29jLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7b2MuaS51LmNhbGwodGhpcyk7cmModGhpcyl9O29jLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJFdmVudEhhbmRsZXIuaGFuZGxlRXZlbnQgbm90IGltcGxlbWVudGVkIik7fTt2YXIgST1mdW5jdGlvbigpe0MuY2FsbCh0aGlzKTt0aGlzLmg9bmV3IFViKHRoaXMpO3RoaXMuTWE9dGhpczt0aGlzLnBhPW51bGx9O24oSSxDKTtJLnByb3RvdHlwZVtQYl09ITA7SS5wcm90b3R5cGUucmE9ZnVuY3Rpb24oYSl7dGhpcy5wYT1hfTtJLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjLGQpe2pjKHRoaXMsYSxiLGMsZCl9Owp2YXIgdWM9ZnVuY3Rpb24oYSxiKXtzYyhhKTt2YXIgYz1hLnBhO2lmKGMpe3ZhciBkPVtdO2Zvcih2YXIgZT0xO2M7Yz1jLnBhKWQucHVzaChjKSxxKDFFMz4rK2UsImluZmluaXRlIGxvb3AiKX1hPWEuTWE7Yz1iLnR5cGV8fGI7InN0cmluZyI9PT10eXBlb2YgYj9iPW5ldyBFKGIsYSk6YiBpbnN0YW5jZW9mIEU/Yi50YXJnZXQ9Yi50YXJnZXR8fGE6KGU9YixiPW5ldyBFKGMsYSksdWEoYixlKSk7ZT0hMDtpZihkKWZvcih2YXIgZj1kLmxlbmd0aC0xOyFiLmgmJjA8PWY7Zi0tKXt2YXIgZz1iLmE9ZFtmXTtlPXRjKGcsYywhMCxiKSYmZX1iLmh8fChnPWIuYT1hLGU9dGMoZyxjLCEwLGIpJiZlLGIuaHx8KGU9dGMoZyxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLmgmJmY8ZC5sZW5ndGg7ZisrKWc9Yi5hPWRbZl0sZT10YyhnLGMsITEsYikmJmU7cmV0dXJuIGV9OwpJLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7SS5pLnUuY2FsbCh0aGlzKTtpZih0aGlzLmgpe3ZhciBhPXRoaXMuaCxiPTAsYztmb3IoYyBpbiBhLmEpe2Zvcih2YXIgZD1hLmFbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixUYihkW2VdKTtkZWxldGUgYS5hW2NdO2EuYi0tfX10aGlzLnBhPW51bGx9O3ZhciBkYz1mdW5jdGlvbihhLGIsYyxkLGUpe3NjKGEpO3JldHVybiBhLmguYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LHRjPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5oLmFbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGc9YltmXTtpZihnJiYhZy5YJiZnLmNhcHR1cmU9PWMpe3ZhciBrPWcubGlzdGVuZXIscD1nLm1hfHxnLnNyYztnLmhhJiZXYihhLmgsZyk7ZT0hMSE9PWsuY2FsbChwLGQpJiZlfX1yZXR1cm4gZSYmMCE9ZC5LYX0sc2M9ZnVuY3Rpb24oYSl7cShhLmgsIkV2ZW50IHRhcmdldCBpcyBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgY2FsbCB0aGUgc3VwZXJjbGFzcyAoZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpIGNvbnN0cnVjdG9yPyIpfTt2YXIgeGM9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKHkmJiFBKCI1MjUiKSlyZXR1cm4hMDtpZih6JiZlKXJldHVybiB2YyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZigheCl7Im51bWJlciI9PT10eXBlb2YgYiYmKGI9d2MoYikpO3ZhciBnPTE3PT1ifHwxOD09Ynx8eiYmOTE9PWI7aWYoKCFjfHx6KSYmZ3x8eiYmMTY9PWImJihkfHxmKSlyZXR1cm4hMX1pZigoeXx8YmIpJiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1pZih2JiZkJiZiPT1hKXJldHVybiExO3N3aXRjaChhKXtjYXNlIDEzOnJldHVybiB4P2Z8fGU/ITE6IShjJiZkKTohMDtjYXNlIDI3OnJldHVybiEoeXx8YmJ8fHgpfXJldHVybiB4JiYoZHx8ZXx8Zik/ITE6dmMoYSl9LHZjPWZ1bmN0aW9uKGEpe2lmKDQ4PD1hJiY1Nz49YXx8Cjk2PD1hJiYxMDY+PWF8fDY1PD1hJiY5MD49YXx8KHl8fGJiKSYmMD09YSlyZXR1cm4hMDtzd2l0Y2goYSl7Y2FzZSAzMjpjYXNlIDQzOmNhc2UgNjM6Y2FzZSA2NDpjYXNlIDEwNzpjYXNlIDEwOTpjYXNlIDExMDpjYXNlIDExMTpjYXNlIDE4NjpjYXNlIDU5OmNhc2UgMTg5OmNhc2UgMTg3OmNhc2UgNjE6Y2FzZSAxODg6Y2FzZSAxOTA6Y2FzZSAxOTE6Y2FzZSAxOTI6Y2FzZSAyMjI6Y2FzZSAyMTk6Y2FzZSAyMjA6Y2FzZSAyMjE6Y2FzZSAxNjM6Y2FzZSA1ODpyZXR1cm4hMDtjYXNlIDE3MzpyZXR1cm4geDtkZWZhdWx0OnJldHVybiExfX0sd2M9ZnVuY3Rpb24oYSl7aWYoeClhPXljKGEpO2Vsc2UgaWYoeiYmeSlzd2l0Y2goYSl7Y2FzZSA5MzphPTkxfXJldHVybiBhfSx5Yz1mdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSA2MTpyZXR1cm4gMTg3O2Nhc2UgNTk6cmV0dXJuIDE4NjtjYXNlIDE3MzpyZXR1cm4gMTg5O2Nhc2UgMjI0OnJldHVybiA5MTtjYXNlIDA6cmV0dXJuIDIyNDsKZGVmYXVsdDpyZXR1cm4gYX19O3ZhciBKPWZ1bmN0aW9uKGEsYil7SS5jYWxsKHRoaXMpO2EmJnpjKHRoaXMsYSxiKX07bihKLEkpO2g9Si5wcm90b3R5cGU7aC5TPW51bGw7aC5uYT1udWxsO2guQ2E9bnVsbDtoLm9hPW51bGw7aC53PS0xO2guRj0tMTtoLnVhPSExOwp2YXIgQWM9ezM6MTMsMTI6MTQ0LDYzMjMyOjM4LDYzMjMzOjQwLDYzMjM0OjM3LDYzMjM1OjM5LDYzMjM2OjExMiw2MzIzNzoxMTMsNjMyMzg6MTE0LDYzMjM5OjExNSw2MzI0MDoxMTYsNjMyNDE6MTE3LDYzMjQyOjExOCw2MzI0MzoxMTksNjMyNDQ6MTIwLDYzMjQ1OjEyMSw2MzI0NjoxMjIsNjMyNDc6MTIzLDYzMjQ4OjQ0LDYzMjcyOjQ2LDYzMjczOjM2LDYzMjc1OjM1LDYzMjc2OjMzLDYzMjc3OjM0LDYzMjg5OjE0NCw2MzMwMjo0NX0sQmM9e1VwOjM4LERvd246NDAsTGVmdDozNyxSaWdodDozOSxFbnRlcjoxMyxGMToxMTIsRjI6MTEzLEYzOjExNCxGNDoxMTUsRjU6MTE2LEY2OjExNyxGNzoxMTgsRjg6MTE5LEY5OjEyMCxGMTA6MTIxLEYxMToxMjIsRjEyOjEyMywiVSswMDdGIjo0NixIb21lOjM2LEVuZDozNSxQYWdlVXA6MzMsUGFnZURvd246MzQsSW5zZXJ0OjQ1fSxDYz0heXx8QSgiNTI1IiksRGM9eiYmeDsKSi5wcm90b3R5cGUuYT1mdW5jdGlvbihhKXtpZih5fHxiYilpZigxNz09dGhpcy53JiYhYS5jdHJsS2V5fHwxOD09dGhpcy53JiYhYS5hbHRLZXl8fHomJjkxPT10aGlzLncmJiFhLm1ldGFLZXkpdGhpcy5GPXRoaXMudz0tMTstMT09dGhpcy53JiYoYS5jdHJsS2V5JiYxNyE9YS5jP3RoaXMudz0xNzphLmFsdEtleSYmMTghPWEuYz90aGlzLnc9MTg6YS5tZXRhS2V5JiY5MSE9YS5jJiYodGhpcy53PTkxKSk7Q2MmJiF4YyhhLmMsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGEuYWx0S2V5LGEubWV0YUtleSk/dGhpcy5oYW5kbGVFdmVudChhKToodGhpcy5GPXdjKGEuYyksRGMmJih0aGlzLnVhPWEuYWx0S2V5KSl9O0oucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dGhpcy5GPXRoaXMudz0tMTt0aGlzLnVhPWEuYWx0S2V5fTsKSi5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5iLGM9Yi5hbHRLZXk7aWYodiYmImtleXByZXNzIj09YS50eXBlKXt2YXIgZD10aGlzLkY7dmFyIGU9MTMhPWQmJjI3IT1kP2Iua2V5Q29kZTowfWVsc2UoeXx8YmIpJiYia2V5cHJlc3MiPT1hLnR5cGU/KGQ9dGhpcy5GLGU9MDw9Yi5jaGFyQ29kZSYmNjMyMzI+Yi5jaGFyQ29kZSYmdmMoZCk/Yi5jaGFyQ29kZTowKTphYiYmIXk/KGQ9dGhpcy5GLGU9dmMoZCk/Yi5rZXlDb2RlOjApOigia2V5cHJlc3MiPT1hLnR5cGU/KERjJiYoYz10aGlzLnVhKSxiLmtleUNvZGU9PWIuY2hhckNvZGU/MzI+Yi5rZXlDb2RlPyhkPWIua2V5Q29kZSxlPTApOihkPXRoaXMuRixlPWIuY2hhckNvZGUpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkseiYmNjM9PWUmJjIyND09ZCYmKGQ9MTkxKSk7dmFyIGY9ZD13YyhkKTtkPzYzMjMyPD0KZCYmZCBpbiBBYz9mPUFjW2RdOjI1PT1kJiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBCYyYmKGY9QmNbYi5rZXlJZGVudGlmaWVyXSk7eCYmQ2MmJiJrZXlwcmVzcyI9PWEudHlwZSYmIXhjKGYsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KXx8KGE9Zj09dGhpcy53LHRoaXMudz1mLGI9bmV3IEVjKGYsZSxhLGIpLGIuYWx0S2V5PWMsdWModGhpcyxiKSl9O0oucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTsKdmFyIHpjPWZ1bmN0aW9uKGEsYixjKXthLm9hJiZGYyhhKTthLlM9YjthLm5hPWJjKGEuUywia2V5cHJlc3MiLGEsYyk7YS5DYT1iYyhhLlMsImtleWRvd24iLGEuYSxjLGEpO2Eub2E9YmMoYS5TLCJrZXl1cCIsYS5iLGMsYSl9LEZjPWZ1bmN0aW9uKGEpe2EubmEmJihrYyhhLm5hKSxrYyhhLkNhKSxrYyhhLm9hKSxhLm5hPW51bGwsYS5DYT1udWxsLGEub2E9bnVsbCk7YS5TPW51bGw7YS53PS0xO2EuRj0tMX07Si5wcm90b3R5cGUudT1mdW5jdGlvbigpe0ouaS51LmNhbGwodGhpcyk7RmModGhpcyl9O3ZhciBFYz1mdW5jdGlvbihhLGIsYyxkKXtHLmNhbGwodGhpcyxkKTt0aGlzLnR5cGU9ImtleSI7dGhpcy5jPWE7dGhpcy5yZXBlYXQ9Y307bihFYyxHKTt2YXIgR2M9eD8iTW96VXNlclNlbGVjdCI6eXx8YmI/IldlYmtpdFVzZXJTZWxlY3QiOm51bGwsSGM9ZnVuY3Rpb24oYSxiKXtiPWI/bnVsbDphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7aWYoR2Mpe3ZhciBjPSJub25lIjthLnN0eWxlJiYoYS5zdHlsZVtHY109Yyk7aWYoYil7YT0wO2Zvcih2YXIgZDtkPWJbYV07YSsrKWQuc3R5bGUmJihkLnN0eWxlW0djXT1jKX19ZWxzZSBpZih2fHxhYilpZihjPSJvbiIsYS5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyksYilmb3IoYT0wO2Q9YlthXTthKyspZC5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyl9O3ZhciBJYz1mdW5jdGlvbigpe307ZGEoSWMpO0ljLnByb3RvdHlwZS5hPTA7dmFyIEs9ZnVuY3Rpb24oYSl7SS5jYWxsKHRoaXMpO3RoaXMuaj1hfHx4YXx8KHhhPW5ldyB1Yik7dGhpcy5xYT1KYzt0aGlzLlk9bnVsbDt0aGlzLm09ITE7dGhpcy5hPW51bGw7dGhpcy5BPXZvaWQgMDt0aGlzLmc9dGhpcy5jPXRoaXMuYj1udWxsO3RoaXMuR2E9ITF9O24oSyxJKTtLLnByb3RvdHlwZS5PYT1JYy5SKCk7CnZhciBKYz1udWxsLEtjPWZ1bmN0aW9uKGEsYil7c3dpdGNoKGEpe2Nhc2UgMTpyZXR1cm4gYj8iZGlzYWJsZSI6ImVuYWJsZSI7Y2FzZSAyOnJldHVybiBiPyJoaWdobGlnaHQiOiJ1bmhpZ2hsaWdodCI7Y2FzZSA0OnJldHVybiBiPyJhY3RpdmF0ZSI6ImRlYWN0aXZhdGUiO2Nhc2UgODpyZXR1cm4gYj8ic2VsZWN0IjoidW5zZWxlY3QiO2Nhc2UgMTY6cmV0dXJuIGI/ImNoZWNrIjoidW5jaGVjayI7Y2FzZSAzMjpyZXR1cm4gYj8iZm9jdXMiOiJibHVyIjtjYXNlIDY0OnJldHVybiBiPyJvcGVuIjoiY2xvc2UifXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBzdGF0ZSIpO30sTGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuWXx8KGEuWT0iOiIrKGEuT2EuYSsrKS50b1N0cmluZygzNikpfSxNYz1mdW5jdGlvbihhLGIpe2lmKGEuYiYmYS5iLmcpe3ZhciBjPWEuYi5nLGQ9YS5ZO2QgaW4gYyYmZGVsZXRlIGNbZF07cWEoYS5iLmcsYixhKX1hLlk9Yn07Sy5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9Owp2YXIgTmM9ZnVuY3Rpb24oYSl7YT1hLmE7cShhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cmV0dXJuIGF9LE9jPWZ1bmN0aW9uKGEpe2EuQXx8KGEuQT1uZXcgb2MoYSkpO3JldHVybiBxKGEuQSl9O0sucHJvdG90eXBlLnJhPWZ1bmN0aW9uKGEpe2lmKHRoaXMuYiYmdGhpcy5iIT1hKXRocm93IEVycm9yKCJNZXRob2Qgbm90IHN1cHBvcnRlZCIpO0suaS5yYS5jYWxsKHRoaXMsYSl9O0sucHJvdG90eXBlLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPW5iKHRoaXMuai5hLCJESVYiKX07CnZhciBQYz1mdW5jdGlvbihhLGIpe2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiJiZhLnhhKGIpKXthLkdhPSEwO3ZhciBjPXFiKGIpO2EuaiYmYS5qLmE9PWN8fChhLmo9Yj9uZXcgdWIocWIoYikpOnhhfHwoeGE9bmV3IHViKSk7YS52YShiKTthLkQoKX1lbHNlIHRocm93IEVycm9yKCJJbnZhbGlkIGVsZW1lbnQgdG8gZGVjb3JhdGUiKTt9O2g9Sy5wcm90b3R5cGU7aC54YT1mdW5jdGlvbigpe3JldHVybiEwfTtoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hfTtoLkQ9ZnVuY3Rpb24oKXt0aGlzLm09ITA7UWModGhpcyxmdW5jdGlvbihhKXshYS5tJiZhLmYoKSYmYS5EKCl9KX07aC5QPWZ1bmN0aW9uKCl7UWModGhpcyxmdW5jdGlvbihhKXthLm0mJmEuUCgpfSk7dGhpcy5BJiZyYyh0aGlzLkEpO3RoaXMubT0hMX07CmgudT1mdW5jdGlvbigpe3RoaXMubSYmdGhpcy5QKCk7dGhpcy5BJiYodGhpcy5BLk4oKSxkZWxldGUgdGhpcy5BKTtRYyh0aGlzLGZ1bmN0aW9uKGEpe2EuTigpfSk7IXRoaXMuR2EmJnRoaXMuYSYmb2IodGhpcy5hKTt0aGlzLmI9dGhpcy5hPXRoaXMuZz10aGlzLmM9bnVsbDtLLmkudS5jYWxsKHRoaXMpfTtoLnNhPWZ1bmN0aW9uKGEsYil7dGhpcy50YShhLFJjKHRoaXMpLGIpfTsKaC50YT1mdW5jdGlvbihhLGIsYyl7cSghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLm0mJihjfHwhdGhpcy5tKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZigwPmJ8fGI+UmModGhpcykpdGhyb3cgRXJyb3IoIkNoaWxkIGNvbXBvbmVudCBpbmRleCBvdXQgb2YgYm91bmRzIik7dGhpcy5nJiZ0aGlzLmN8fCh0aGlzLmc9e30sdGhpcy5jPVtdKTtpZihhLmI9PXRoaXMpe3ZhciBkPUxjKGEpO3RoaXMuZ1tkXT1hO0hhKHRoaXMuYyxhKX1lbHNlIHFhKHRoaXMuZyxMYyhhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuYiYmYS5ZKXt2YXIgZT1hLmI7ZD1hLlk7ZS5nJiZkPyhlPWUuZyxkPShudWxsIT09ZSYmZCBpbiBlP2VbZF06dm9pZCAwKXx8bnVsbCk6ZD1udWxsfWlmKGQmJmEuYiE9dGhpcyl0aHJvdyBFcnJvcigiVW5hYmxlIHRvIHNldCBwYXJlbnQgY29tcG9uZW50Iik7CmEuYj10aGlzO0suaS5yYS5jYWxsKGEsdGhpcyk7TGEodGhpcy5jLGIsMCxhKTtpZihhLm0mJnRoaXMubSYmYS5iPT10aGlzKWM9dGhpcy5qYSgpLGI9Yy5jaGlsZE5vZGVzW2JdfHxudWxsLGIhPWEuZigpJiZjLmluc2VydEJlZm9yZShhLmYoKSxiKTtlbHNlIGlmKGMpe3RoaXMuYXx8dGhpcy5pYSgpO2M9TCh0aGlzLGIrMSk7Yj10aGlzLmphKCk7Yz1jP2MuYTpudWxsO2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTthLmF8fGEuaWEoKTtiP2IuaW5zZXJ0QmVmb3JlKGEuYSxjfHxudWxsKTphLmouYS5ib2R5LmFwcGVuZENoaWxkKGEuYSk7YS5iJiYhYS5iLm18fGEuRCgpfWVsc2UgdGhpcy5tJiYhYS5tJiZhLmEmJmEuYS5wYXJlbnROb2RlJiYxPT1hLmEucGFyZW50Tm9kZS5ub2RlVHlwZSYmYS5EKCl9O2guamE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hfTsKdmFyIFNjPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEucWEpe3ZhciBiPWEubT9hLmE6YS5qLmEuYm9keTthOnt2YXIgYz1xYihiKTtpZihjLmRlZmF1bHRWaWV3JiZjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihjPWMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpKSl7Yz1jLmRpcmVjdGlvbnx8Yy5nZXRQcm9wZXJ0eVZhbHVlKCJkaXJlY3Rpb24iKXx8IiI7YnJlYWsgYX1jPSIifWEucWE9InJ0bCI9PShjfHwoYi5jdXJyZW50U3R5bGU/Yi5jdXJyZW50U3R5bGUuZGlyZWN0aW9uOm51bGwpfHxiLnN0eWxlJiZiLnN0eWxlLmRpcmVjdGlvbil9cmV0dXJuIGEucWF9LFJjPWZ1bmN0aW9uKGEpe3JldHVybiBhLmM/YS5jLmxlbmd0aDowfSxMPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuYz9hLmNbYl18fG51bGw6bnVsbH0sUWM9ZnVuY3Rpb24oYSxiLGMpe2EuYyYmcihhLmMsYixjKX0sVGM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jJiZiP0RhKGEuYyxiKTotMX07dmFyIFZjPWZ1bmN0aW9uKGEsYil7aWYoIWEpdGhyb3cgRXJyb3IoIkludmFsaWQgY2xhc3MgbmFtZSAiK2EpO2lmKCFpYShiKSl0aHJvdyBFcnJvcigiSW52YWxpZCBkZWNvcmF0b3IgZnVuY3Rpb24gIitiKTtVY1thXT1ifSxXYz17fSxVYz17fTt2YXIgWGM9ZnVuY3Rpb24oYSl7dGhpcy5oPWF9O2RhKFhjKTt2YXIgWWM9ZnVuY3Rpb24oYSxiKXthJiYoYS50YWJJbmRleD1iPzA6LTEpfSwkYz1mdW5jdGlvbihhLGIsYyl7Yy5pZCYmTWMoYixjLmlkKTt2YXIgZD1hLmIoKSxlPSExLGY9RChjKTtmJiZyKGYsZnVuY3Rpb24oZyl7Zz09ZD9lPSEwOmcmJnRoaXMuZyhiLGcsZCl9LGEpO2V8fEViKGMsZCk7WmMoYixjKTtyZXR1cm4gY307WGMucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiLGMpe2I9PWMrIi1kaXNhYmxlZCI/YS5aKCExKTpiPT1jKyItaG9yaXpvbnRhbCI/YWQoYSwiaG9yaXpvbnRhbCIpOmI9PWMrIi12ZXJ0aWNhbCImJmFkKGEsInZlcnRpY2FsIil9Owp2YXIgWmM9ZnVuY3Rpb24oYSxiKXtpZihiKWZvcih2YXIgYz1iLmZpcnN0Q2hpbGQsZDtjJiZjLnBhcmVudE5vZGU9PWI7KXtkPWMubmV4dFNpYmxpbmc7aWYoMT09Yy5ub2RlVHlwZSl7YTp7dmFyIGU9YztxKGUpO2U9RChlKTtmb3IodmFyIGY9MCxnPWUubGVuZ3RoO2Y8ZztmKyspe3ZhciBrPWVbZl07aWYoaz1rIGluIFVjP1VjW2tdKCk6bnVsbCl7ZT1rO2JyZWFrIGF9fWU9bnVsbH1lJiYoZS5hPWMsYS5pc0VuYWJsZWQoKXx8ZS5aKCExKSxhLnNhKGUpLFBjKGUsYykpfWVsc2UgYy5ub2RlVmFsdWUmJiIiIT1NYShjLm5vZGVWYWx1ZSl8fGIucmVtb3ZlQ2hpbGQoYyk7Yz1kfX0sYmQ9ZnVuY3Rpb24oYSxiKXtiPWIuZigpO3EoYiwiVGhlIGNvbnRhaW5lciBET00gZWxlbWVudCBjYW5ub3QgYmUgbnVsbC4iKTtIYyhiLHgpO3YmJihiLmhpZGVGb2N1cz0hMCk7KGE9YS5oKSYmdmIoYixhKX07WGMucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKWGMucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5iKCksYz1bYiwiaG9yaXpvbnRhbCI9PWEuSD9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgTT1mdW5jdGlvbigpe30sY2Q7ZGEoTSk7dmFyIGRkPXtidXR0b246InByZXNzZWQiLGNoZWNrYm94OiJjaGVja2VkIixtZW51aXRlbToic2VsZWN0ZWQiLG1lbnVpdGVtY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtcmFkaW86ImNoZWNrZWQiLHJhZGlvOiJjaGVja2VkIix0YWI6InNlbGVjdGVkIix0cmVlaXRlbToic2VsZWN0ZWQifTtNLnByb3RvdHlwZS5oPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLmouYigiRElWIixlZCh0aGlzLGEpLmpvaW4oIiAiKSxhLmJhKX07dmFyIGdkPWZ1bmN0aW9uKGEsYixjKXtpZihhPWEuZj9hLmYoKTphKXt2YXIgZD1bYl07diYmIUEoIjciKSYmKGQ9ZmQoRChhKSxiKSxkLnB1c2goYikpOyhjP0ZiOkhiKShhLGQpfX07Ck0ucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiKXtiLmlkJiZNYyhhLGIuaWQpO2ImJmIuZmlyc3RDaGlsZD9oZChhLGIuZmlyc3RDaGlsZC5uZXh0U2libGluZz9KYShiLmNoaWxkTm9kZXMpOmIuZmlyc3RDaGlsZCk6YS5iYT1udWxsO3ZhciBjPTAsZD10aGlzLmEoKSxlPXRoaXMuYSgpLGY9ITEsZz0hMSxrPSExLHA9SmEoRChiKSk7cihwLGZ1bmN0aW9uKEIpe2Z8fEIhPWQ/Z3x8QiE9ZT9jfD1pZCh0aGlzLEIpOmc9ITA6KGY9ITAsZT09ZCYmKGc9ITApKTsxPT1pZCh0aGlzLEIpJiYoQWEoYiksc2IoYikmJnRiKGIpJiZyYihiLCExKSl9LHRoaXMpO2Eubz1jO2Z8fChwLnB1c2goZCksZT09ZCYmKGc9ITApKTtnfHxwLnB1c2goZSk7KGE9YS53YSkmJnAucHVzaC5hcHBseShwLGEpO2lmKHYmJiFBKCI3Iikpe3ZhciB3PWZkKHApOzA8dy5sZW5ndGgmJihwLnB1c2guYXBwbHkocCx3KSxrPSEwKX1mJiZnJiYhYSYmIWt8fENiKGIscC5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIGpkPWZ1bmN0aW9uKGEsYil7aWYoYT1hLmgoKSl7cShiLCJUaGUgZWxlbWVudCBwYXNzZWQgYXMgYSBmaXJzdCBwYXJhbWV0ZXIgY2Fubm90IGJlIG51bGwuIik7dmFyIGM9Yi5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDthIT1jJiZ2YihiLGEpfX0sa2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYztpZihhLnYmMzImJihjPWEuZigpKSl7aWYoIWImJmEubyYzMil7dHJ5e2MuYmx1cigpfWNhdGNoKGQpe31hLm8mMzImJmEuRmEobnVsbCl9KHNiKGMpJiZ0YihjKSkhPWImJnJiKGMsYil9fSxsZD1mdW5jdGlvbihhLGIsYyl7Y2R8fChjZD17MToiZGlzYWJsZWQiLDg6InNlbGVjdGVkIiwxNjoiY2hlY2tlZCIsNjQ6ImV4cGFuZGVkIn0pO3EoYSwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO2I9Y2RbYl07dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDtkJiYoZD1kZFtkXXx8YixiPSJjaGVja2VkIj09Ynx8InNlbGVjdGVkIj09CmI/ZDpiKTtiJiZ4YihhLGIsYyl9O00ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250cm9sIn07CnZhciBlZD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuYSgpLGQ9W2NdLGU9YS5hKCk7ZSE9YyYmZC5wdXNoKGUpO2M9Yi5vO2ZvcihlPVtdO2M7KXt2YXIgZj1jJi1jO2UucHVzaChtZChhLGYpKTtjJj1+Zn1kLnB1c2guYXBwbHkoZCxlKTsoYT1iLndhKSYmZC5wdXNoLmFwcGx5KGQsYSk7diYmIUEoIjciKSYmZC5wdXNoLmFwcGx5KGQsZmQoZCkpO3JldHVybiBkfSxmZD1mdW5jdGlvbihhLGIpe3ZhciBjPVtdO2ImJihhPUlhKGEsW2JdKSk7cihbXSxmdW5jdGlvbihkKXshRmEoZCxsYShHYSxhKSl8fGImJiFHYShkLGIpfHxjLnB1c2goZC5qb2luKCJfIikpfSk7cmV0dXJuIGN9LG1kPWZ1bmN0aW9uKGEsYil7YS5ifHxuZChhKTtyZXR1cm4gYS5iW2JdfSxpZD1mdW5jdGlvbihhLGIpe2Euanx8KGEuYnx8bmQoYSksYS5qPXNhKGEuYikpO2E9cGFyc2VJbnQoYS5qW2JdLDEwKTtyZXR1cm4gaXNOYU4oYSk/MDphfSxuZD1mdW5jdGlvbihhKXt2YXIgYj1hLmEoKSxjPSF0KGIucmVwbGFjZSgvXHhhMHxccy9nLAoiICIpLCIgIik7cShjLCJDb250cm9sUmVuZGVyZXIgaGFzIGFuIGludmFsaWQgY3NzIGNsYXNzOiAnIitiKyInIik7YS5iPXsxOmIrIi1kaXNhYmxlZCIsMjpiKyItaG92ZXIiLDQ6YisiLWFjdGl2ZSIsODpiKyItc2VsZWN0ZWQiLDE2OmIrIi1jaGVja2VkIiwzMjpiKyItZm9jdXNlZCIsNjQ6YisiLW9wZW4ifX07dmFyIE49ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO2lmKCFiKXtiPXRoaXMuY29uc3RydWN0b3I7Zm9yKHZhciBkO2I7KXtkPWJbamFdfHwoYltqYV09KytrYSk7aWYoZD1XY1tkXSlicmVhaztiPWIuaT9iLmkuY29uc3RydWN0b3I6bnVsbH1iPWQ/aWEoZC5SKT9kLlIoKTpuZXcgZDpudWxsfXRoaXMuQj1iO3RoaXMuYmE9dm9pZCAwIT09YT9hOm51bGx9O24oTixLKTtoPU4ucHJvdG90eXBlO2guYmE9bnVsbDtoLm89MDtoLnY9Mzk7aC5LPTA7aC5JYT0hMDtoLndhPW51bGw7aC55YT0hMDtoLmlhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CLmModGhpcyk7dGhpcy5hPWE7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmeGIoYSwiaGlkZGVuIiwhMCkpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hPXRoaXMuQi5nKHRoaXMsYSk7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5JYT0ibm9uZSIhPWEuc3R5bGUuZGlzcGxheX07CmguRD1mdW5jdGlvbigpe04uaS5ELmNhbGwodGhpcyk7dmFyIGE9TmModGhpcyk7cSh0aGlzKTtxKGEpO3RoaXMuaXNWaXNpYmxlKCl8fHhiKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fGxkKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy52JjgmJmxkKGEsOCwhISh0aGlzLm8mOCkpO3RoaXMudiYxNiYmbGQoYSwxNiwhISh0aGlzLm8mMTYpKTt0aGlzLnYmNjQmJmxkKGEsNjQsISEodGhpcy5vJjY0KSk7YT10aGlzLkI7U2ModGhpcykmJmdkKHRoaXMuZigpLGEuYSgpKyItcnRsIiwhMCk7dGhpcy5pc0VuYWJsZWQoKSYma2QodGhpcyx0aGlzLmlzVmlzaWJsZSgpKTtpZih0aGlzLnYmLTImJih0aGlzLnlhJiZvZCh0aGlzLCEwKSx0aGlzLnYmMzImJihhPXRoaXMuZigpKSkpe3ZhciBiPXRoaXMuV3x8KHRoaXMuVz1uZXcgSik7emMoYixhKTtIKEgoSChPYyh0aGlzKSxiLCJrZXkiLHRoaXMuZmEpLGEsImZvY3VzIix0aGlzLk5hKSxhLCJibHVyIiwKdGhpcy5GYSl9fTt2YXIgb2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYz1PYyhhKSxkPWEuZigpO2I/KEgoSChIKEgoYyxkLEYuTCxhLmthKSxkLFtGLk0sRi5hYV0sYS5sYSksZCwibW91c2VvdmVyIixhLkFhKSxkLCJtb3VzZW91dCIsYS56YSksYS5lYSE9Y2EmJkgoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fEgoYyxkLCJkYmxjbGljayIsYS5KYSksYS5nYXx8KGEuZ2E9bmV3IHBkKGEpLHpiKGEsbGEoQWIsYS5nYSkpKSkpOihxYyhxYyhxYyhxYyhjLGQsRi5MLGEua2EpLGQsW0YuTSxGLmFhXSxhLmxhKSxkLCJtb3VzZW92ZXIiLGEuQWEpLGQsIm1vdXNlb3V0IixhLnphKSxhLmVhIT1jYSYmcWMoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fHFjKGMsZCwiZGJsY2xpY2siLGEuSmEpLEFiKGEuZ2EpLGEuZ2E9bnVsbCkpfTsKTi5wcm90b3R5cGUuUD1mdW5jdGlvbigpe04uaS5QLmNhbGwodGhpcyk7dGhpcy5XJiZGYyh0aGlzLlcpO3RoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJmtkKHRoaXMsITEpfTtOLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7Ti5pLnUuY2FsbCh0aGlzKTt0aGlzLlcmJih0aGlzLlcuTigpLGRlbGV0ZSB0aGlzLlcpO2RlbGV0ZSB0aGlzLkI7dGhpcy5nYT10aGlzLndhPXRoaXMuYmE9bnVsbH07dmFyIGhkPWZ1bmN0aW9uKGEsYil7YS5iYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm8mMSl9OwpOLnByb3RvdHlwZS5aPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYjtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0VuYWJsZWQmJiFiLmlzRW5hYmxlZCgpfHwhTyh0aGlzLDEsIWEpfHwoYXx8KHFkKHRoaXMsITEpLFAodGhpcywhMSkpLHRoaXMuaXNWaXNpYmxlKCkmJmtkKHRoaXMsYSksUSh0aGlzLDEsIWEsITApKX07CnZhciBQPWZ1bmN0aW9uKGEsYil7TyhhLDIsYikmJlEoYSwyLGIpfSxxZD1mdW5jdGlvbihhLGIpe08oYSw0LGIpJiZRKGEsNCxiKX0scmQ9ZnVuY3Rpb24oYSxiKXtPKGEsOCxiKSYmUShhLDgsYil9LHNkPWZ1bmN0aW9uKGEsYil7TyhhLDY0LGIpJiZRKGEsNjQsYil9LFE9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIWQmJjE9PWIpYS5aKCFjKTtlbHNlIGlmKGEudiZiJiZjIT0hIShhLm8mYikpe3ZhciBlPWEuQjtpZihkPWEuZigpKShlPW1kKGUsYikpJiZnZChhLGUsYyksbGQoZCxiLGMpO2Eubz1jP2Eub3xiOmEubyZ+Yn19LHRkPWZ1bmN0aW9uKGEsYixjKXtpZihhLm0mJmEubyZiJiYhYyl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTshYyYmYS5vJmImJlEoYSxiLCExKTthLnY9Yz9hLnZ8YjphLnYmfmJ9LFI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hISgyNTUmYikmJiEhKGEudiZiKX0sTz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuISEoYS52JmIpJiYhIShhLm8mCmIpIT1jJiYoIShhLksmYil8fHVjKGEsS2MoYixjKSkpJiYhYS5VfTtoPU4ucHJvdG90eXBlO2guQWE9ZnVuY3Rpb24oYSl7KCFhLnJlbGF0ZWRUYXJnZXR8fCFwYih0aGlzLmYoKSxhLnJlbGF0ZWRUYXJnZXQpKSYmdWModGhpcywiZW50ZXIiKSYmdGhpcy5pc0VuYWJsZWQoKSYmUih0aGlzLDIpJiZQKHRoaXMsITApfTtoLnphPWZ1bmN0aW9uKGEpe2EucmVsYXRlZFRhcmdldCYmcGIodGhpcy5mKCksYS5yZWxhdGVkVGFyZ2V0KXx8IXVjKHRoaXMsImxlYXZlIil8fChSKHRoaXMsNCkmJnFkKHRoaXMsITEpLFIodGhpcywyKSYmUCh0aGlzLCExKSl9O2guZWE9Y2E7Cmgua2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSxPYihhKSYmISh5JiZ6JiZhLmN0cmxLZXkpKSl7Uih0aGlzLDQpJiZxZCh0aGlzLCEwKTt2YXIgYjtpZihiPXRoaXMuQil7dmFyIGM7Yj10aGlzLnYmMzImJihjPXRoaXMuZigpKT9zYihjKSYmdGIoYyk6ITF9YiYmdGhpcy5mKCkuZm9jdXMoKX0hT2IoYSl8fHkmJnomJmEuY3RybEtleXx8YS5nKCl9O2gubGE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSx0aGlzLm8mNCYmdWQodGhpcyxhKSYmUih0aGlzLDQpJiZxZCh0aGlzLCExKSl9O2guSmE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmdWQodGhpcyxhKX07CnZhciB1ZD1mdW5jdGlvbihhLGIpe2lmKFIoYSwxNikpe3ZhciBjPSEoYS5vJjE2KTtPKGEsMTYsYykmJlEoYSwxNixjKX1SKGEsOCkmJnJkKGEsITApO1IoYSw2NCkmJnNkKGEsIShhLm8mNjQpKTtjPW5ldyBFKCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuQT1iLkEpO3JldHVybiB1YyhhLGMpfTtOLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe1IodGhpcywzMikmJk8odGhpcywzMiwhMCkmJlEodGhpcywzMiwhMCl9O04ucHJvdG90eXBlLkZhPWZ1bmN0aW9uKCl7Uih0aGlzLDQpJiZxZCh0aGlzLCExKTtSKHRoaXMsMzIpJiZPKHRoaXMsMzIsITEpJiZRKHRoaXMsMzIsITEpfTsKTi5wcm90b3R5cGUuZmE9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJjEzPT1hLmMmJnVkKHRoaXMsYSk/KGEuZygpLGEuaigpLCEwKTohMX07aWYoIWlhKE4pKXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBjbGFzcyAiK04pO2lmKCFpYShNKSl0aHJvdyBFcnJvcigiSW52YWxpZCByZW5kZXJlciBjbGFzcyAiK00pO3ZhciB2ZD1OW2phXXx8KE5bamFdPSsra2EpO1djW3ZkXT1NO1ZjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIHBkPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9ITE7dGhpcy5jPW5ldyBvYyh0aGlzKTt6Yih0aGlzLGxhKEFiLHRoaXMuYykpO2E9TmModGhpcy5iKTtIKEgoSCh0aGlzLmMsYSxGLkwsdGhpcy5oKSxhLEYuTSx0aGlzLmopLGEsImNsaWNrIix0aGlzLmcpfTtuKHBkLEMpO3ZhciB3ZD0hdnx8OTw9TnVtYmVyKGliKTsKcGQucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXt0aGlzLmE9ITF9O3BkLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7dGhpcy5hPSEwfTt2YXIgeGQ9ZnVuY3Rpb24oYSxiKXtpZighd2QpcmV0dXJuIGEuYnV0dG9uPTAsYS50eXBlPWIsYTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudHMiKTtjLmluaXRNb3VzZUV2ZW50KGIsYS5idWJibGVzLGEuY2FuY2VsYWJsZSxhLnZpZXd8fG51bGwsYS5kZXRhaWwsYS5zY3JlZW5YLGEuc2NyZWVuWSxhLmNsaWVudFgsYS5jbGllbnRZLGEuY3RybEtleSxhLmFsdEtleSxhLnNoaWZ0S2V5LGEubWV0YUtleSwwLGEucmVsYXRlZFRhcmdldHx8bnVsbCk7cmV0dXJuIGN9OwpwZC5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXtpZih0aGlzLmEpdGhpcy5hPSExO2Vsc2V7dmFyIGI9YS5iLGM9Yi5idXR0b24sZD1iLnR5cGUsZT14ZChiLCJtb3VzZWRvd24iKTt0aGlzLmIua2EobmV3IEcoZSxhLmEpKTtlPXhkKGIsIm1vdXNldXAiKTt0aGlzLmIubGEobmV3IEcoZSxhLmEpKTt3ZHx8KGIuYnV0dG9uPWMsYi50eXBlPWQpfX07cGQucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt0aGlzLmI9bnVsbDtwZC5pLnUuY2FsbCh0aGlzKX07dmFyIFM9ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO3RoaXMuZGE9Ynx8WGMuUigpO3RoaXMuSD1hfHwidmVydGljYWwifTtuKFMsSyk7aD1TLnByb3RvdHlwZTtoLkRhPW51bGw7aC5jYT1udWxsO2guZGE9bnVsbDtoLkg9bnVsbDtoLlQ9ITA7aC5PPSEwO2gubD0tMTtoLnM9bnVsbDtoLlY9ITE7aC5JPW51bGw7dmFyIHlkPWZ1bmN0aW9uKGEpe3JldHVybiBhLkRhfHxhLmYoKX07aD1TLnByb3RvdHlwZTtoLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPXRoaXMuai5iKCJESVYiLHRoaXMuZGEuYyh0aGlzKS5qb2luKCIgIikpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKGEpe3JldHVybiJESVYiPT1hLnRhZ05hbWV9O2gudmE9ZnVuY3Rpb24oYSl7dGhpcy5hPSRjKHRoaXMuZGEsdGhpcyxhKTsibm9uZSI9PWEuc3R5bGUuZGlzcGxheSYmKHRoaXMuVD0hMSl9OwpoLkQ9ZnVuY3Rpb24oKXtTLmkuRC5jYWxsKHRoaXMpO1FjKHRoaXMsZnVuY3Rpb24oYil7Yi5tJiZ6ZCh0aGlzLGIpfSx0aGlzKTt2YXIgYT10aGlzLmYoKTtiZCh0aGlzLmRhLHRoaXMpO0FkKHRoaXMsdGhpcy5UKTtIKEgoSChIKEgoSChIKEgoT2ModGhpcyksdGhpcywiZW50ZXIiLHRoaXMuV2EpLHRoaXMsImhpZ2hsaWdodCIsdGhpcy5YYSksdGhpcywidW5oaWdobGlnaHQiLHRoaXMuY2IpLHRoaXMsIm9wZW4iLHRoaXMuWWEpLHRoaXMsImNsb3NlIix0aGlzLlVhKSxhLEYuTCx0aGlzLlNhKSxxYihhKSxbRi5NLEYuYWFdLHRoaXMuVmEpLGEsW0YuTCxGLk0sRi5hYSwibW91c2VvdmVyIiwibW91c2VvdXQiLCJjb250ZXh0bWVudSJdLHRoaXMuVGEpO0JkKHRoaXMpfTt2YXIgQmQ9ZnVuY3Rpb24oYSl7dmFyIGI9T2MoYSksYz15ZChhKTtIKEgoSChiLGMsImZvY3VzIixhLkhhKSxjLCJibHVyIixhLlFhKSxhLmNhfHwoYS5jYT1uZXcgSih5ZChhKSkpLCJrZXkiLGEuUmEpfTtoPVMucHJvdG90eXBlOwpoLlA9ZnVuY3Rpb24oKXtDZCh0aGlzLC0xKTt0aGlzLnMmJnNkKHRoaXMucywhMSk7dGhpcy5WPSExO1MuaS5QLmNhbGwodGhpcyl9O2gudT1mdW5jdGlvbigpe1MuaS51LmNhbGwodGhpcyk7dGhpcy5jYSYmKHRoaXMuY2EuTigpLHRoaXMuY2E9bnVsbCk7dGhpcy5kYT10aGlzLnM9dGhpcy5JPXRoaXMuRGE9bnVsbH07aC5XYT1mdW5jdGlvbigpe3JldHVybiEwfTsKaC5YYT1mdW5jdGlvbihhKXt2YXIgYj1UYyh0aGlzLGEudGFyZ2V0KTtpZigtMTxiJiZiIT10aGlzLmwpe3ZhciBjPUwodGhpcyx0aGlzLmwpO2MmJlAoYywhMSk7dGhpcy5sPWI7Yz1MKHRoaXMsdGhpcy5sKTt0aGlzLlYmJnFkKGMsITApO3RoaXMucyYmYyE9dGhpcy5zJiYoYy52JjY0P3NkKGMsITApOnNkKHRoaXMucywhMSkpfWI9dGhpcy5mKCk7cShiLCJUaGUgRE9NIGVsZW1lbnQgZm9yIHRoZSBjb250YWluZXIgY2Fubm90IGJlIG51bGwuIik7bnVsbCE9YS50YXJnZXQuZigpJiZ4YihiLCJhY3RpdmVkZXNjZW5kYW50IixhLnRhcmdldC5mKCkuaWQpfTtoLmNiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT1MKHRoaXMsdGhpcy5sKSYmKHRoaXMubD0tMSk7YT10aGlzLmYoKTtxKGEsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnJlbW92ZUF0dHJpYnV0ZSh3YigiYWN0aXZlZGVzY2VuZGFudCIpKX07CmguWWE9ZnVuY3Rpb24oYSl7KGE9YS50YXJnZXQpJiZhIT10aGlzLnMmJmEuYj09dGhpcyYmKHRoaXMucyYmc2QodGhpcy5zLCExKSx0aGlzLnM9YSl9O2guVWE9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMucyYmKHRoaXMucz1udWxsKTt2YXIgYj10aGlzLmYoKSxjPWEudGFyZ2V0LmYoKTtiJiZhLnRhcmdldC5vJjImJmMmJihhPSIiLGMmJihhPWMuaWQscShhLCJUaGUgYWN0aXZlIGVsZW1lbnQgc2hvdWxkIGhhdmUgYW4gaWQuIikpLHhiKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEpKX07aC5TYT1mdW5jdGlvbihhKXt0aGlzLk8mJih0aGlzLlY9ITApO3ZhciBiPXlkKHRoaXMpO2ImJnNiKGIpJiZ0YihiKT9iLmZvY3VzKCk6YS5nKCl9O2guVmE9ZnVuY3Rpb24oKXt0aGlzLlY9ITF9OwpoLlRhPWZ1bmN0aW9uKGEpe2E6e3ZhciBiPWEudGFyZ2V0O2lmKHRoaXMuSSlmb3IodmFyIGM9dGhpcy5mKCk7YiYmYiE9PWM7KXt2YXIgZD1iLmlkO2lmKGQgaW4gdGhpcy5JKXtiPXRoaXMuSVtkXTticmVhayBhfWI9Yi5wYXJlbnROb2RlfWI9bnVsbH1pZihiKXN3aXRjaChhLnR5cGUpe2Nhc2UgRi5MOmIua2EoYSk7YnJlYWs7Y2FzZSBGLk06Y2FzZSBGLmFhOmIubGEoYSk7YnJlYWs7Y2FzZSAibW91c2VvdmVyIjpiLkFhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3V0IjpiLnphKGEpO2JyZWFrO2Nhc2UgImNvbnRleHRtZW51IjpiLmVhKGEpfX07aC5IYT1mdW5jdGlvbigpe307aC5RYT1mdW5jdGlvbigpe0NkKHRoaXMsLTEpO3RoaXMuVj0hMTt0aGlzLnMmJnNkKHRoaXMucywhMSl9OwpoLlJhPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmlzRW5hYmxlZCgpJiZ0aGlzLmlzVmlzaWJsZSgpJiYoMCE9UmModGhpcyl8fHRoaXMuRGEpJiZEZCh0aGlzLGEpPyhhLmcoKSxhLmooKSwhMCk6ITF9Owp2YXIgRGQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1MKGEsYS5sKTtpZihjJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5mYSYmYy5mYShiKXx8YS5zJiZhLnMhPWMmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLnMuZmEmJmEucy5mYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuYyl7Y2FzZSAyNzp5ZChhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpFZChhKTticmVhaztjYXNlIDM1OkZkKGEpO2JyZWFrO2Nhc2UgMzg6aWYoInZlcnRpY2FsIj09YS5IKUdkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9IZChhKTpHZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoInZlcnRpY2FsIj09YS5IKUhkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9HZChhKTpIZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSx6ZD1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZigpO2M9Yy5pZHx8KGMuaWQ9TGMoYikpO2EuSXx8KGEuST17fSk7YS5JW2NdPWJ9O1MucHJvdG90eXBlLnNhPWZ1bmN0aW9uKGEsYil7Q2EoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtTLmkuc2EuY2FsbCh0aGlzLGEsYil9O1MucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEsYixjKXtDYShhLE4pO2EuS3w9MjthLkt8PTY0O3RkKGEsMzIsITEpO2EubSYmMCE9YS55YSYmb2QoYSwhMSk7YS55YT0hMTt2YXIgZD1hLmI9PXRoaXM/VGModGhpcyxhKTotMTtTLmkudGEuY2FsbCh0aGlzLGEsYixjKTthLm0mJnRoaXMubSYmemQodGhpcyxhKTthPWQ7LTE9PWEmJihhPVJjKHRoaXMpKTthPT10aGlzLmw/dGhpcy5sPU1hdGgubWluKFJjKHRoaXMpLTEsYik6YT50aGlzLmwmJmI8PXRoaXMubD90aGlzLmwrKzphPHRoaXMubCYmYj50aGlzLmwmJnRoaXMubC0tfTsKdmFyIGFkPWZ1bmN0aW9uKGEsYil7aWYoYS5mKCkpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5IPWJ9O1MucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O3ZhciBBZD1mdW5jdGlvbihhLGIpe2EuVD1iO3ZhciBjPWEuZigpO2MmJihjLnN0eWxlLmRpc3BsYXk9Yj8iIjoibm9uZSIsWWMoeWQoYSksYS5PJiZhLlQpKX07Uy5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT307Uy5wcm90b3R5cGUuWj1mdW5jdGlvbihhKXt0aGlzLk8hPWEmJnVjKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5PPSEwLFFjKHRoaXMsZnVuY3Rpb24oYil7Yi5MYT9kZWxldGUgYi5MYTpiLlooITApfSkpOihRYyh0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5aKCExKTpiLkxhPSEwfSksdGhpcy5WPXRoaXMuTz0hMSksWWMoeWQodGhpcyksYSYmdGhpcy5UKSl9Owp2YXIgQ2Q9ZnVuY3Rpb24oYSxiKXsoYj1MKGEsYikpP1AoYiwhMCk6LTE8YS5sJiZQKEwoYSxhLmwpLCExKX0sRWQ9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LFJjKGEpLTEpfSxGZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiAwPmI/Yy0xOmJ9LDApfSxIZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7cmV0dXJuKGIrMSklY30sYS5sKX0sR2Q9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe2ItLTtyZXR1cm4gMD5iP2MtMTpifSxhLmwpfSxJZD1mdW5jdGlvbihhLGIsYyl7Yz0wPmM/VGMoYSxhLnMpOmM7dmFyIGQ9UmMoYSk7Yz1iLmNhbGwoYSxjLGQpO2Zvcih2YXIgZT0wO2U8PWQ7KXt2YXIgZj1MKGEsYyksZztpZihnPWYpZz1mLmlzVmlzaWJsZSgpJiZmLmlzRW5hYmxlZCgpJiYhIShmLnYmMik7aWYoZyl7YS5FYShjKTticmVha31lKys7Yz1iLmNhbGwoYSxjLGQpfX07ClMucHJvdG90eXBlLkVhPWZ1bmN0aW9uKGEpe0NkKHRoaXMsYSl9O3ZhciBUPWZ1bmN0aW9uKCl7fTtuKFQsTSk7ZGEoVCk7VC5wcm90b3R5cGUuYT1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYiJ9O1QucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXtyZXR1cm4idGFiIn07VC5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYj1ULmkuYy5jYWxsKHRoaXMsYSk7KGE9YS5QYSkmJmImJihiLnRpdGxlPWF8fCIiKTtyZXR1cm4gYn07VC5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIpe2I9VC5pLmcuY2FsbCh0aGlzLGEsYik7dmFyIGM9Yi50aXRsZXx8IiI7YyYmKGEuUGE9Yyk7YS5vJjgmJihjPWEuYikmJmlhKGMuRykmJihRKGEsOCwhMSksYy5HKGEpKTtyZXR1cm4gYn07dmFyIEpkPWZ1bmN0aW9uKGEsYixjKXtOLmNhbGwodGhpcyxhLGJ8fFQuUigpLGMpO3RkKHRoaXMsOCwhMCk7dGhpcy5LfD05fTtuKEpkLE4pO1ZjKCJnb29nLXRhYiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEpkKG51bGwpfSk7dmFyIFU9ZnVuY3Rpb24oKXt0aGlzLmg9InRhYmxpc3QifTtuKFUsWGMpO2RhKFUpO1UucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWItYmFyIn07VS5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIsYyl7dGhpcy5qfHwodGhpcy5hfHxLZCh0aGlzKSx0aGlzLmo9c2EodGhpcy5hKSk7dmFyIGQ9dGhpcy5qW2JdO2Q/KGFkKGEsTGQoZCkpLGEuQj1kKTpVLmkuZy5jYWxsKHRoaXMsYSxiLGMpfTtVLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPVUuaS5jLmNhbGwodGhpcyxhKTt0aGlzLmF8fEtkKHRoaXMpO2IucHVzaCh0aGlzLmFbYS5CXSk7cmV0dXJuIGJ9O3ZhciBLZD1mdW5jdGlvbihhKXt2YXIgYj1hLmIoKTthLmE9e3RvcDpiKyItdG9wIixib3R0b206YisiLWJvdHRvbSIsc3RhcnQ6YisiLXN0YXJ0IixlbmQ6YisiLWVuZCJ9fTt2YXIgVj1mdW5jdGlvbihhLGIsYyl7YT1hfHwidG9wIjthZCh0aGlzLExkKGEpKTt0aGlzLkI9YTtTLmNhbGwodGhpcyx0aGlzLkgsYnx8VS5SKCksYyk7TWQodGhpcyl9O24oVixTKTtoPVYucHJvdG90eXBlO2guQz1udWxsO2guRD1mdW5jdGlvbigpe1YuaS5ELmNhbGwodGhpcyk7TWQodGhpcyl9O2gudT1mdW5jdGlvbigpe1YuaS51LmNhbGwodGhpcyk7dGhpcy5DPW51bGx9O2guRWE9ZnVuY3Rpb24oYSl7Vi5pLkVhLmNhbGwodGhpcyxhKTt0aGlzLkcoTCh0aGlzLGEpKX07aC5HPWZ1bmN0aW9uKGEpe2E/cmQoYSwhMCk6dGhpcy5DJiZyZCh0aGlzLkMsITEpfTsKdmFyIE5kPWZ1bmN0aW9uKGEsYil7aWYoYiYmYj09YS5DKXtmb3IodmFyIGM9VGMoYSxiKSxkPWMtMTtiPUwoYSxkKTtkLS0pe3ZhciBlPWI7aWYoZS5pc1Zpc2libGUoKSYmZS5pc0VuYWJsZWQoKSl7YS5HKGIpO3JldHVybn19Zm9yKGMrPTE7Yj1MKGEsYyk7YysrKWlmKGQ9YixkLmlzVmlzaWJsZSgpJiZkLmlzRW5hYmxlZCgpKXthLkcoYik7cmV0dXJufWEuRyhudWxsKX19O2g9Vi5wcm90b3R5cGU7aC5hYj1mdW5jdGlvbihhKXt0aGlzLkMmJnRoaXMuQyE9YS50YXJnZXQmJnJkKHRoaXMuQywhMSk7dGhpcy5DPWEudGFyZ2V0fTtoLmJiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT10aGlzLkMmJih0aGlzLkM9bnVsbCl9O2guWmE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guJGE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guSGE9ZnVuY3Rpb24oKXtMKHRoaXMsdGhpcy5sKXx8Q2QodGhpcyxUYyh0aGlzLHRoaXMuQ3x8TCh0aGlzLDApKSl9Owp2YXIgTWQ9ZnVuY3Rpb24oYSl7SChIKEgoSChPYyhhKSxhLCJzZWxlY3QiLGEuYWIpLGEsInVuc2VsZWN0IixhLmJiKSxhLCJkaXNhYmxlIixhLlphKSxhLCJoaWRlIixhLiRhKX0sTGQ9ZnVuY3Rpb24oYSl7cmV0dXJuInN0YXJ0Ij09YXx8ImVuZCI9PWE/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O1ZjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBWfSk7ZnVuY3Rpb24gT2QoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIFBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgZz1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIrZyk7Zm9yKHZhciBrPVtdLHA9YmEoYyksdz1wLm5leHQoKTshdy5kb25lO3c9cC5uZXh0KCkpe3c9dy52YWx1ZTt2YXIgQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKQi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO0IudGV4dENvbnRlbnQ9dztmLmFwcGVuZENoaWxkKEIpO2sucHVzaChCKX0iYm90dG9tIiE9ZyYmZS5hcHBlbmRDaGlsZChmKTtwPW51bGw7aWYoInRvcCI9PWd8fCJib3R0b20iPT1nKXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTsidG9wIj09ZyYmcCYmZS5hcHBlbmRDaGlsZChwKTtCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0IuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciByYT1bXTtjPWJhKGMpO2Zvcih3PWMubmV4dCgpOyF3LmRvbmU7dz1jLm5leHQoKSl3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHcuaWQ9ZS5pZCsiX2NvbnRlbnRfIityYS5sZW5ndGgsdy5zdHlsZS5kaXNwbGF5PSJub25lIixCLmFwcGVuZENoaWxkKHcpLHJhLnB1c2godyk7ZS5hcHBlbmRDaGlsZChCKTsiYm90dG9tIj09ZyYmKHAmJgplLmFwcGVuZENoaWxkKHApLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBYPW5ldyBWKGcpO1BjKFgsZik7dmFyIFk9LTE7ZGMoWCwic2VsZWN0IixmdW5jdGlvbihaKXtaPWsuaW5kZXhPZihaLnRhcmdldC5mKCkpO1ohPVkmJigwPD1ZJiZZPHJhLmxlbmd0aCYmKHJhW1ldLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFk9LTEpLDA8PVomJlo8cmEubGVuZ3RoJiYoWT1aLHJhW1ldLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksWC5HKEwoWCxZKSkpfSk7WC5HKEwoWCxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFope1guRyhMKFgsWikpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChPZChhKSl9LFFkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sVz1sOwpRZFswXWluIFd8fCJ1bmRlZmluZWQiPT10eXBlb2YgVy5leGVjU2NyaXB0fHxXLmV4ZWNTY3JpcHQoInZhciAiK1FkWzBdKTtmb3IodmFyIFJkO1FkLmxlbmd0aCYmKFJkPVFkLnNoaWZ0KCkpOylRZC5sZW5ndGh8fHZvaWQgMD09PVBkP1dbUmRdJiZXW1JkXSE9PU9iamVjdC5wcm90b3R5cGVbUmRdP1c9V1tSZF06Vz1XW1JkXT17fTpXW1JkXT1QZDt9KS5jYWxsKHRoaXMpOwovLyBjbGFuZy1mb3JtYXQgb24K", + "headers": [ + [ + "content-type", + "application/javascript" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + } + } + }, + "executionInfo": { + "elapsed": 4271, + "status": "ok", + "timestamp": 1600709875325, + "user": { + "displayName": "Evgeny Skvortsov", + "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhiQjODaOVLfYnUuWS9rB3LRntzJDM0hqElzsUkdQ=s64", + "userId": "11510585406840398626" + }, + "user_tz": 420 + }, + "id": "GnnU6ZRhbhA0", + "outputId": "5bfb0cf5-674c-4d74-d06f-cf98dbc3acb5" + }, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2c220fba-fc31-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id77\", \"tabNames\": [\"EmployeeRole\", \"ToolUsed\", \"UsesTool\", \"UsersOfTool\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_1e1bc85af8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2c2257ae-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id77\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_5bee1eb2eb" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2c23a82a-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_6d2b9456de" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2c23ebd2-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id77_content_4\");\n", + "//# sourceURL=js_04e489b391" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2c243538-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2c23ebd2-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_8be609cc27" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2c247c00-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id77\"].setSelectedTabIndex(4);\n", + "//# sourceURL=js_3a215c1c16" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running EmployeeRole\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"2c298eac-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2c23a82a-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_9c717f756a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2c2b5d18-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_f2fc6330f1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_0", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2c2b9bca-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id77_content_0\");\n", + "//# sourceURL=js_098d2725db" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_0", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2c2bdcd4-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2c2b9bca-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_99754df2f5" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_0", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2c2c1a5a-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id77\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_80b5a18d09" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_0", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_0", + "outputarea_id77", + "outputarea_id78", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_0", + "outputarea_id77", + "outputarea_id78", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_0", + "outputarea_id77", + "outputarea_id78", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2c2dba4a-fc31-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id78\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_339eb01770" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_0", + "outputarea_id77", + "outputarea_id78", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2c2dfbe0-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id78\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_10b2800357" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_0", + "outputarea_id77", + "outputarea_id78", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2c2f0c74-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_e649d3ae9a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_0", + "id78_content_0", + "outputarea_id77", + "outputarea_id78", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2c2f47c0-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id78_content_0\");\n", + "//# sourceURL=js_f52bf60215" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_0", + "id78_content_0", + "outputarea_id77", + "outputarea_id78", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2c2f8604-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2c2f47c0-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_9a4d3a082e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_0", + "id78_content_0", + "outputarea_id77", + "outputarea_id78", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2c2fc09c-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id78\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_24ab0e7652" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_0", + "id78_content_0", + "outputarea_id77", + "outputarea_id78", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mEmployeeRole_sql\u001b[0m variable.\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " \"Alice\" AS name,\n", + " \"Product Manager\" AS role,\n", + " \"SEA\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Bob\" AS name,\n", + " \"Engineer\" AS role,\n", + " \"SEA\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Caroline\" AS name,\n", + " \"Engineer\" AS role,\n", + " \"LAX\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"David\" AS name,\n", + " \"Data Scientist\" AS role,\n", + " \"LAX\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Eve\" AS name,\n", + " \"Data Scientist\" AS role,\n", + " \"SEA\" AS office\n", + " \n", + ") ),\n", + "t_1_RoleFullName AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " \"Product Manager\" AS col0,\n", + " \"Product Manager\" AS logica_value\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Engineer\" AS col0,\n", + " \"Software Engineer\" AS logica_value\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Data Scientist\" AS col0,\n", + " \"Statistician\" AS logica_value\n", + " \n", + ") )\n", + "SELECT\n", + " Employee.name AS name,\n", + " RoleFullName.logica_value AS role_full_name\n", + "FROM\n", + " t_0_Employee AS Employee, t_1_RoleFullName AS RoleFullName\n", + "WHERE\n", + " RoleFullName.col0 = Employee.role;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"2c30aafc-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2c2f0c74-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_3a33d30f77" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_0", + "id78_content_0", + "outputarea_id77", + "outputarea_id78", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2c31ade4-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2c2b5d18-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_efcd957ae6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_0", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2c32f154-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_a5d550332b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2c332f52-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id77_content_4\");\n", + "//# sourceURL=js_354d742ed5" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2c336e18-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2c332f52-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_73c1861dd9" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2c33abf8-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id77\"].setSelectedTabIndex(4);\n", + "//# sourceURL=js_1fc3a8f3c6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2c9d6ee4-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2c32f154-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_d76910189c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2ca04880-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b951068d4d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_0", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2ca0b716-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id77_content_0\");\n", + "//# sourceURL=js_efb19331aa" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_0", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2ca122a0-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2ca0b716-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_3f6fb91fdd" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_0", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2ca1fab8-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id77\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_18a67cd25c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_0", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2ca3b060-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_4c56c7a354" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_0", + "id78_content_1", + "outputarea_id77", + "outputarea_id78", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2ca3e666-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id78_content_1\");\n", + "//# sourceURL=js_a3dbc62d43" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_0", + "id78_content_1", + "outputarea_id77", + "outputarea_id78", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2ca41c4e-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2ca3e666-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_ec0502c380" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_0", + "id78_content_1", + "outputarea_id77", + "outputarea_id78", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2ca46e92-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id78\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_fb25677419" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_0", + "id78_content_1", + "outputarea_id77", + "outputarea_id78", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mEmployeeRole\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
namerole_full_name
0AliceProduct Manager
1BobSoftware Engineer
2CarolineSoftware Engineer
3DavidStatistician
4EveStatistician
\n", + "
" + ], + "text/plain": [ + " name role_full_name\n", + "0 Alice Product Manager\n", + "1 Bob Software Engineer\n", + "2 Caroline Software Engineer\n", + "3 David Statistician\n", + "4 Eve Statistician" + ] + }, + "metadata": { + "tags": [ + "id77_content_0", + "id78_content_1", + "outputarea_id77", + "outputarea_id78", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2ca8d72a-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2ca3b060-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_b72d89c154" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_0", + "id78_content_1", + "outputarea_id77", + "outputarea_id78", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2caa27ec-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2ca04880-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_6f4d73cc9f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_0", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2cabdd4e-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_dea8e261d7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2cac2ed4-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id77_content_4\");\n", + "//# sourceURL=js_7fc98754ef" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2cac7ad8-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2cac2ed4-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_c96952f4bf" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2cacd258-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id77\"].setSelectedTabIndex(4);\n", + "//# sourceURL=js_bc63893c1b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running ToolUsed\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"2caf54f6-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2cabdd4e-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_9d6c7fa886" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2cb10594-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_5a8b521d06" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_1", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2cb14d56-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id77_content_1\");\n", + "//# sourceURL=js_54c06e8d22" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_1", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2cb19db0-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2cb14d56-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_970c71f703" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_1", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2cb1e414-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id77\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_78c2ddf605" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_1", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_1", + "outputarea_id77", + "outputarea_id79", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_1", + "outputarea_id77", + "outputarea_id79", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_1", + "outputarea_id77", + "outputarea_id79", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2cb3817a-fc31-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id79\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_b7156eea21" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_1", + "outputarea_id77", + "outputarea_id79", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2cb3da6c-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id79\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_95fdc6982f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_1", + "outputarea_id77", + "outputarea_id79", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2cb53e02-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_19d3d60b12" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_1", + "id79_content_0", + "outputarea_id77", + "outputarea_id79", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2cb58902-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id79_content_0\");\n", + "//# sourceURL=js_2c9a16ea5f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_1", + "id79_content_0", + "outputarea_id77", + "outputarea_id79", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2cb5ce12-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2cb58902-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_4cc7bc0c17" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_1", + "id79_content_0", + "outputarea_id77", + "outputarea_id79", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2cb61c00-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id79\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_7ae483e3a1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_1", + "id79_content_0", + "outputarea_id77", + "outputarea_id79", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mToolUsed_sql\u001b[0m variable.\n", + "SELECT * FROM (\n", + " \n", + " SELECT\n", + " \"Product Manager\" AS col0,\n", + " \"spreadsheet\" AS logica_value\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Engineer\" AS col0,\n", + " \"cloud\" AS logica_value\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Engineer\" AS col0,\n", + " \"python\" AS logica_value\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Data Scientist\" AS col0,\n", + " \"spreadsheet\" AS logica_value\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Data Scientist\" AS col0,\n", + " \"python\" AS logica_value\n", + " \n", + ") ;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"2cb73aea-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2cb53e02-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_bf718e30e7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_1", + "id79_content_0", + "outputarea_id77", + "outputarea_id79", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2cb8775c-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2cb10594-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_c4b9cbdbc2" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_1", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2cb9dfac-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_478e1cfeb8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2cba37a4-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id77_content_4\");\n", + "//# sourceURL=js_d925e3bac5" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2cba89a2-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2cba37a4-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_e90da7e0d7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2cbae226-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id77\"].setSelectedTabIndex(4);\n", + "//# sourceURL=js_a5015cbc94" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2d14e9ce-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2cb9dfac-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_ad1d512d7a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2d17fdc6-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_11dfcf8246" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_1", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2d18803e-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id77_content_1\");\n", + "//# sourceURL=js_59b026a859" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_1", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2d190ab8-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2d18803e-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_9565287243" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_1", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2d198236-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id77\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_1ddf4aeaf9" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_1", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2d1bae8a-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_6f1c18401a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_1", + "id79_content_1", + "outputarea_id77", + "outputarea_id79", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2d1c3184-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id79_content_1\");\n", + "//# sourceURL=js_98bad3f43d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_1", + "id79_content_1", + "outputarea_id77", + "outputarea_id79", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2d1c7108-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2d1c3184-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_796af5922f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_1", + "id79_content_1", + "outputarea_id77", + "outputarea_id79", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2d1cc734-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id79\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_40ce44ed38" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_1", + "id79_content_1", + "outputarea_id77", + "outputarea_id79", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mToolUsed\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0logica_value
0Product Managerspreadsheet
1Engineercloud
2Engineerpython
3Data Scientistspreadsheet
4Data Scientistpython
\n", + "
" + ], + "text/plain": [ + " col0 logica_value\n", + "0 Product Manager spreadsheet\n", + "1 Engineer cloud\n", + "2 Engineer python\n", + "3 Data Scientist spreadsheet\n", + "4 Data Scientist python" + ] + }, + "metadata": { + "tags": [ + "id77_content_1", + "id79_content_1", + "outputarea_id77", + "outputarea_id79", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2d200a7a-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2d1bae8a-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_7645889005" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_1", + "id79_content_1", + "outputarea_id77", + "outputarea_id79", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2d218e22-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2d17fdc6-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_de0be1e3e5" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_1", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2d234f78-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_33831be184" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2d23a66c-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id77_content_4\");\n", + "//# sourceURL=js_6f2f166b97" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2d23fd06-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2d23a66c-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_3874bb7845" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2d24439c-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id77\"].setSelectedTabIndex(4);\n", + "//# sourceURL=js_68b63830b3" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running UsesTool\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"2d287c3c-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2d234f78-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_ebd4ee4de8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2d2a67fe-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_42290a547e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_2", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2d2abcf4-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id77_content_2\");\n", + "//# sourceURL=js_ab4bb498f8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_2", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2d2b0c72-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2d2abcf4-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_25b5a3080f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_2", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2d2b6b72-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id77\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_b4f88677f0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_2", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_2", + "outputarea_id77", + "outputarea_id80", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_2", + "outputarea_id77", + "outputarea_id80", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_2", + "outputarea_id77", + "outputarea_id80", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2d2d8b3c-fc31-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id80\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_5fdd48490d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_2", + "outputarea_id77", + "outputarea_id80", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2d2de73a-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id80\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_fa61488594" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_2", + "outputarea_id77", + "outputarea_id80", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2d2f7834-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_0a86117248" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_2", + "id80_content_0", + "outputarea_id77", + "outputarea_id80", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2d2fd9aa-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id80_content_0\");\n", + "//# sourceURL=js_aa409a80f2" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_2", + "id80_content_0", + "outputarea_id77", + "outputarea_id80", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2d30371a-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2d2fd9aa-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_8d088e7d92" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_2", + "id80_content_0", + "outputarea_id77", + "outputarea_id80", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2d307f5e-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id80\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_adf71b6d46" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_2", + "id80_content_0", + "outputarea_id77", + "outputarea_id80", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mUsesTool_sql\u001b[0m variable.\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " \"Alice\" AS name,\n", + " \"Product Manager\" AS role,\n", + " \"SEA\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Bob\" AS name,\n", + " \"Engineer\" AS role,\n", + " \"SEA\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Caroline\" AS name,\n", + " \"Engineer\" AS role,\n", + " \"LAX\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"David\" AS name,\n", + " \"Data Scientist\" AS role,\n", + " \"LAX\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Eve\" AS name,\n", + " \"Data Scientist\" AS role,\n", + " \"SEA\" AS office\n", + " \n", + ") ),\n", + "t_1_ToolUsed AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " \"Product Manager\" AS col0,\n", + " \"spreadsheet\" AS logica_value\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Engineer\" AS col0,\n", + " \"cloud\" AS logica_value\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Engineer\" AS col0,\n", + " \"python\" AS logica_value\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Data Scientist\" AS col0,\n", + " \"spreadsheet\" AS logica_value\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Data Scientist\" AS col0,\n", + " \"python\" AS logica_value\n", + " \n", + ") )\n", + "SELECT\n", + " Employee.name AS name,\n", + " ToolUsed.logica_value AS tool\n", + "FROM\n", + " t_0_Employee AS Employee, t_1_ToolUsed AS ToolUsed\n", + "WHERE\n", + " ToolUsed.col0 = Employee.role;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"2d31e8b2-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2d2f7834-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_1de1ea98bb" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_2", + "id80_content_0", + "outputarea_id77", + "outputarea_id80", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2d337718-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2d2a67fe-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_3fa7bc684f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_2", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2d354d18-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_3db89bdfa3" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2d35ac68-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id77_content_4\");\n", + "//# sourceURL=js_bac00a38ff" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2d360c9e-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2d35ac68-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_ea4f79dcb1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2d365e92-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id77\"].setSelectedTabIndex(4);\n", + "//# sourceURL=js_2fedca70b6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2dae8f70-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2d354d18-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_0080e0b36e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2db0d3c0-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_0c80609f78" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_2", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2db1af0c-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id77_content_2\");\n", + "//# sourceURL=js_ddb2d2ea7f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_2", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2db218a2-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2db1af0c-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_6bd52b215d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_2", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2db27c7a-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id77\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_2e1075acc5" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_2", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2db3f4b0-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_dac1d89c51" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_2", + "id80_content_1", + "outputarea_id77", + "outputarea_id80", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2db45716-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id80_content_1\");\n", + "//# sourceURL=js_08af394518" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_2", + "id80_content_1", + "outputarea_id77", + "outputarea_id80", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2db4bd64-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2db45716-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_308564cb57" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_2", + "id80_content_1", + "outputarea_id77", + "outputarea_id80", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2db516b0-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id80\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_277dd49464" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_2", + "id80_content_1", + "outputarea_id77", + "outputarea_id80", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mUsesTool\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nametool
0Alicespreadsheet
1Bobcloud
2Bobpython
3Carolinecloud
4Carolinepython
5Davidspreadsheet
6Davidpython
7Evespreadsheet
8Evepython
\n", + "
" + ], + "text/plain": [ + " name tool\n", + "0 Alice spreadsheet\n", + "1 Bob cloud\n", + "2 Bob python\n", + "3 Caroline cloud\n", + "4 Caroline python\n", + "5 David spreadsheet\n", + "6 David python\n", + "7 Eve spreadsheet\n", + "8 Eve python" + ] + }, + "metadata": { + "tags": [ + "id77_content_2", + "id80_content_1", + "outputarea_id77", + "outputarea_id80", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2db84fd8-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2db3f4b0-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_9ef0885441" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_2", + "id80_content_1", + "outputarea_id77", + "outputarea_id80", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2db9e7f8-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2db0d3c0-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_46f694e13d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_2", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2dbbbbb4-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_c1f11dff93" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2dbc237e-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id77_content_4\");\n", + "//# sourceURL=js_86f51ae1b2" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2dbc8c9c-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2dbc237e-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_b5980f7d3f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2dbcdc60-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id77\"].setSelectedTabIndex(4);\n", + "//# sourceURL=js_0fb176f672" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running UsersOfTool\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"2dc16a82-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2dbbbbb4-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_1b496b3160" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2dc3bae4-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_7f0862ec7c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_3", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2dc41e12-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id77_content_3\");\n", + "//# sourceURL=js_313ea565e7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_3", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2dc47ca4-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2dc41e12-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_2703a20999" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_3", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2dc4c470-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id77\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_e2b1b82b87" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_3", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_3", + "outputarea_id77", + "outputarea_id81", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_3", + "outputarea_id77", + "outputarea_id81", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_3", + "outputarea_id77", + "outputarea_id81", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2dc6df1c-fc31-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id81\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_3bf174f918" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_3", + "outputarea_id77", + "outputarea_id81", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2dc73174-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id81\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_c84d14760b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_3", + "outputarea_id77", + "outputarea_id81", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2dc8b6c0-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_ba9f41c056" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_3", + "id81_content_0", + "outputarea_id77", + "outputarea_id81", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2dc91c28-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id81_content_0\");\n", + "//# sourceURL=js_2aa92ff142" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_3", + "id81_content_0", + "outputarea_id77", + "outputarea_id81", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2dc977a4-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2dc91c28-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_6bf1b59af8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_3", + "id81_content_0", + "outputarea_id77", + "outputarea_id81", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2dc9c8ee-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id81\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_4b6f02ccc1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_3", + "id81_content_0", + "outputarea_id77", + "outputarea_id81", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mUsersOfTool_sql\u001b[0m variable.\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " \"Alice\" AS name,\n", + " \"Product Manager\" AS role,\n", + " \"SEA\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Bob\" AS name,\n", + " \"Engineer\" AS role,\n", + " \"SEA\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Caroline\" AS name,\n", + " \"Engineer\" AS role,\n", + " \"LAX\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"David\" AS name,\n", + " \"Data Scientist\" AS role,\n", + " \"LAX\" AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Eve\" AS name,\n", + " \"Data Scientist\" AS role,\n", + " \"SEA\" AS office\n", + " \n", + ") ),\n", + "t_1_ToolUsed AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " \"Product Manager\" AS col0,\n", + " \"spreadsheet\" AS logica_value\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Engineer\" AS col0,\n", + " \"cloud\" AS logica_value\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Engineer\" AS col0,\n", + " \"python\" AS logica_value\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Data Scientist\" AS col0,\n", + " \"spreadsheet\" AS logica_value\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"Data Scientist\" AS col0,\n", + " \"python\" AS logica_value\n", + " \n", + ") )\n", + "SELECT\n", + " ToolUsed.logica_value AS tool,\n", + " ARRAY_AGG(Employee.name) AS logica_value\n", + "FROM\n", + " t_0_Employee AS Employee, t_1_ToolUsed AS ToolUsed\n", + "WHERE\n", + " ToolUsed.col0 = Employee.role\n", + "GROUP BY tool;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"2dcb1d52-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2dc8b6c0-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_5f78fde680" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_3", + "id81_content_0", + "outputarea_id77", + "outputarea_id81", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2dcc9f56-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2dc3bae4-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_0ee6cab05c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_3", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2dce7dee-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_90b95fdded" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2dcee43c-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id77_content_4\");\n", + "//# sourceURL=js_aff083538a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2dcf4a1c-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2dcee43c-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_564e9a07cf" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2dcfa598-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id77\"].setSelectedTabIndex(4);\n", + "//# sourceURL=js_4e7239e5a3" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2e5a73e4-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2dce7dee-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_6141a33bbe" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_4", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2e5cdbfc-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_920ec4f47a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_3", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2e5d2bde-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id77_content_3\");\n", + "//# sourceURL=js_ab423904b2" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_3", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2e5d655e-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2e5d2bde-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_fe154cae30" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_3", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2e5d9c68-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id77\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_daa3cc2012" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_3", + "outputarea_id77" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2e5f1ade-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_4514970973" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_3", + "id81_content_1", + "outputarea_id77", + "outputarea_id81", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2e5f9996-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id81_content_1\");\n", + "//# sourceURL=js_ba885a79f3" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_3", + "id81_content_1", + "outputarea_id77", + "outputarea_id81", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2e5ff7b0-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2e5f9996-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_b75847dcf9" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_3", + "id81_content_1", + "outputarea_id77", + "outputarea_id81", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2e6054da-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id81\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_99fd32ffff" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_3", + "id81_content_1", + "outputarea_id77", + "outputarea_id81", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mUsersOfTool\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
toollogica_value
0spreadsheet[Alice, David, Eve]
1cloud[Bob, Caroline]
2python[Bob, Caroline, David, Eve]
\n", + "
" + ], + "text/plain": [ + " tool logica_value\n", + "0 spreadsheet [Alice, David, Eve]\n", + "1 cloud [Bob, Caroline]\n", + "2 python [Bob, Caroline, David, Eve]" + ] + }, + "metadata": { + "tags": [ + "id77_content_3", + "id81_content_1", + "outputarea_id77", + "outputarea_id81", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2e64c150-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2e5f1ade-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_8529c39134" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_3", + "id81_content_1", + "outputarea_id77", + "outputarea_id81", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"2e6681fc-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2e5cdbfc-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_8658295225" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id77_content_3", + "outputarea_id77" + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "%%logica EmployeeRole, ToolUsed, UsesTool, UsersOfTool\n", + "\n", + "Employee(name: \"Alice\", role: \"Product Manager\", office: \"SEA\");\n", + "Employee(name: \"Bob\", role: \"Engineer\", office: \"SEA\");\n", + "Employee(name: \"Caroline\", role: \"Engineer\", office: \"LAX\");\n", + "Employee(name: \"David\", role: \"Data Scientist\", office: \"LAX\");\n", + "Employee(name: \"Eve\", role: \"Data Scientist\", office: \"SEA\");\n", + "\n", + "RoleFullName(\"Product Manager\") = \"Product Manager\";\n", + "RoleFullName(\"Engineer\") = \"Software Engineer\";\n", + "RoleFullName(\"Data Scientist\") = \"Statistician\";\n", + "\n", + "EmployeeRole(name:, role_full_name: RoleFullName(role)) :- Employee(name:, role:);\n", + "\n", + "ToolUsed(\"Product Manager\") = \"spreadsheet\";\n", + "ToolUsed(\"Engineer\") = \"cloud\";\n", + "ToolUsed(\"Engineer\") = \"python\";\n", + "ToolUsed(\"Data Scientist\") = \"spreadsheet\";\n", + "ToolUsed(\"Data Scientist\") = \"python\";\n", + "\n", + "UsesTool(name:, tool: ToolUsed(role)) :- Employee(name:, role:);\n", + "\n", + "UsersOfTool(tool:) List= name :- UsesTool(name:, tool:);" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "b5O9U_bAhEo1" + }, + "source": [ + "## Example: Popular Baby Names\n", + "\n", + "Here we use Logica to compute most popular baby name by year and plot the popularity of these most popular names over time." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 516, + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH0=", + "headers": [ + [ + "content-type", + "text/css" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgaCxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9ZnVuY3Rpb24oYSl7dmFyIGI9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmYVtTeW1ib2wuaXRlcmF0b3JdO3JldHVybiBiP2IuY2FsbChhKTp7bmV4dDphYShhKX19LGw9dGhpc3x8c2VsZixjYT1mdW5jdGlvbigpe30sZGE9ZnVuY3Rpb24oYSl7YS5CYT12b2lkIDA7YS5SPWZ1bmN0aW9uKCl7cmV0dXJuIGEuQmE/YS5CYTphLkJhPW5ldyBhfX0sZWE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7aWYoIm9iamVjdCI9PWIpaWYoYSl7aWYoYSBpbnN0YW5jZW9mIEFycmF5KXJldHVybiJhcnJheSI7aWYoYSBpbnN0YW5jZW9mIE9iamVjdClyZXR1cm4gYjt2YXIgYz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk7aWYoIltvYmplY3QgV2luZG93XSI9PWMpcmV0dXJuIm9iamVjdCI7CmlmKCJbb2JqZWN0IEFycmF5XSI9PWN8fCJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGgmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5zcGxpY2UmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoInNwbGljZSIpKXJldHVybiJhcnJheSI7aWYoIltvYmplY3QgRnVuY3Rpb25dIj09Y3x8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmNhbGwmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoImNhbGwiKSlyZXR1cm4iZnVuY3Rpb24ifWVsc2UgcmV0dXJuIm51bGwiO2Vsc2UgaWYoImZ1bmN0aW9uIj09YiYmInVuZGVmaW5lZCI9PXR5cGVvZiBhLmNhbGwpcmV0dXJuIm9iamVjdCI7cmV0dXJuIGJ9LGZhPWZ1bmN0aW9uKGEpe3JldHVybiJhcnJheSI9PWVhKGEpfSxoYT1mdW5jdGlvbihhKXt2YXIgYj1lYShhKTtyZXR1cm4iYXJyYXkiPT1ifHwib2JqZWN0Ij09CmImJiJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGh9LGlhPWZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PWVhKGEpfSxtPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBhO3JldHVybiJvYmplY3QiPT1iJiZudWxsIT1hfHwiZnVuY3Rpb24iPT1ifSxqYT0iY2xvc3VyZV91aWRfIisoMUU5Kk1hdGgucmFuZG9tKCk+Pj4wKSxrYT0wLGxhPWZ1bmN0aW9uKGEsYil7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe3ZhciBkPWMuc2xpY2UoKTtkLnB1c2guYXBwbHkoZCxhcmd1bWVudHMpO3JldHVybiBhLmFwcGx5KHRoaXMsZCl9fSxuPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe31jLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLmk9Yi5wcm90b3R5cGU7YS5wcm90b3R5cGU9bmV3IGM7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YX07dmFyIG1hLG5hPXtlYjoiYWN0aXZlZGVzY2VuZGFudCIsamI6ImF0b21pYyIsa2I6ImF1dG9jb21wbGV0ZSIsbWI6ImJ1c3kiLHBiOiJjaGVja2VkIixxYjoiY29saW5kZXgiLHZiOiJjb250cm9scyIseGI6ImRlc2NyaWJlZGJ5IixBYjoiZGlzYWJsZWQiLENiOiJkcm9wZWZmZWN0IixEYjoiZXhwYW5kZWQiLEViOiJmbG93dG8iLEdiOiJncmFiYmVkIixLYjoiaGFzcG9wdXAiLE1iOiJoaWRkZW4iLE9iOiJpbnZhbGlkIixQYjoibGFiZWwiLFFiOiJsYWJlbGxlZGJ5IixSYjoibGV2ZWwiLFdiOiJsaXZlIixrYzoibXVsdGlsaW5lIixsYzoibXVsdGlzZWxlY3RhYmxlIixwYzoib3JpZW50YXRpb24iLHFjOiJvd25zIixyYzoicG9zaW5zZXQiLHRjOiJwcmVzc2VkIix4YzoicmVhZG9ubHkiLHpjOiJyZWxldmFudCIsQWM6InJlcXVpcmVkIixFYzoicm93aW5kZXgiLEhjOiJzZWxlY3RlZCIsSmM6InNldHNpemUiLExjOiJzb3J0IixaYzoidmFsdWVtYXgiLCRjOiJ2YWx1ZW1pbiIsYWQ6InZhbHVlbm93IiwKYmQ6InZhbHVldGV4dCJ9O3ZhciBvYT1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkIGluIGEpYi5jYWxsKGMsYVtkXSxkLGEpfSxwYT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyBpbiBhKWlmKGFbY109PWIpcmV0dXJuITA7cmV0dXJuITF9LHFhPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsIT09YSYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfSxzYT1mdW5jdGlvbihhKXt2YXIgYj17fSxjO2ZvcihjIGluIGEpYlthW2NdXT1jO3JldHVybiBifSx0YT0iY29uc3RydWN0b3IgaGFzT3duUHJvcGVydHkgaXNQcm90b3R5cGVPZiBwcm9wZXJ0eUlzRW51bWVyYWJsZSB0b0xvY2FsZVN0cmluZyB0b1N0cmluZyB2YWx1ZU9mIi5zcGxpdCgiICIpLHVhPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8dGEubGVuZ3RoO2YrKyljPQp0YVtmXSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZCxjKSYmKGFbY109ZFtjXSl9fTt2YXIgdmE9e2ZiOiJhbGVydCIsZ2I6ImFsZXJ0ZGlhbG9nIixoYjoiYXBwbGljYXRpb24iLGliOiJhcnRpY2xlIixsYjoiYmFubmVyIixuYjoiYnV0dG9uIixvYjoiY2hlY2tib3giLHJiOiJjb2x1bW5oZWFkZXIiLHNiOiJjb21ib2JveCIsdGI6ImNvbXBsZW1lbnRhcnkiLHViOiJjb250ZW50aW5mbyIsd2I6ImRlZmluaXRpb24iLHliOiJkaWFsb2ciLHpiOiJkaXJlY3RvcnkiLEJiOiJkb2N1bWVudCIsRmI6ImZvcm0iLEhiOiJncmlkIixJYjoiZ3JpZGNlbGwiLEpiOiJncm91cCIsTGI6ImhlYWRpbmciLE5iOiJpbWciLFNiOiJsaW5rIixUYjoibGlzdCIsVWI6Imxpc3Rib3giLFZiOiJsaXN0aXRlbSIsWGI6ImxvZyIsWWI6Im1haW4iLFpiOiJtYXJxdWVlIiwkYjoibWF0aCIsYWM6Im1lbnUiLGJjOiJtZW51YmFyIixjYzoibWVudWl0ZW0iLGRjOiJtZW51aXRlbWNoZWNrYm94IixlYzoibWVudWl0ZW1yYWRpbyIsbWM6Im5hdmlnYXRpb24iLG5jOiJub3RlIixvYzoib3B0aW9uIiwKc2M6InByZXNlbnRhdGlvbiIsdWM6InByb2dyZXNzYmFyIix2YzoicmFkaW8iLHdjOiJyYWRpb2dyb3VwIix5YzoicmVnaW9uIixCYzoicm93IixDYzoicm93Z3JvdXAiLERjOiJyb3doZWFkZXIiLEZjOiJzY3JvbGxiYXIiLEdjOiJzZWFyY2giLEljOiJzZXBhcmF0b3IiLEtjOiJzbGlkZXIiLE1jOiJzcGluYnV0dG9uIixOYzoic3RhdHVzIixPYzoidGFiIixQYzoidGFibGlzdCIsUWM6InRhYnBhbmVsIixSYzoidGV4dGJveCIsU2M6InRleHRpbmZvIixUYzoidGltZXIiLFVjOiJ0b29sYmFyIixWYzoidG9vbHRpcCIsV2M6InRyZWUiLFhjOiJ0cmVlZ3JpZCIsWWM6InRyZWVpdGVtIn07dmFyIHdhPWZ1bmN0aW9uKGEpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsd2EpO2Vsc2V7dmFyIGI9RXJyb3IoKS5zdGFjaztiJiYodGhpcy5zdGFjaz1iKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSl9O24od2EsRXJyb3IpO3dhLnByb3RvdHlwZS5uYW1lPSJDdXN0b21FcnJvciI7dmFyIHhhO3ZhciB5YT1mdW5jdGlvbihhLGIpe2E9YS5zcGxpdCgiJXMiKTtmb3IodmFyIGM9IiIsZD1hLmxlbmd0aC0xLGU9MDtlPGQ7ZSsrKWMrPWFbZV0rKGU8Yi5sZW5ndGg/YltlXToiJXMiKTt3YS5jYWxsKHRoaXMsYythW2RdKX07bih5YSx3YSk7eWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjsKdmFyIHphPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSJBc3NlcnRpb24gZmFpbGVkIjtpZihjKXtlKz0iOiAiK2M7dmFyIGY9ZH1lbHNlIGEmJihlKz0iOiAiK2EsZj1iKTt0aHJvdyBuZXcgeWEoIiIrZSxmfHxbXSk7fSxxPWZ1bmN0aW9uKGEsYixjKXthfHx6YSgiIixudWxsLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX0sQWE9ZnVuY3Rpb24oYSxiLGMpe20oYSkmJjE9PWEubm9kZVR5cGV8fHphKCJFeHBlY3RlZCBFbGVtZW50IGJ1dCBnb3QgJXM6ICVzLiIsW2VhKGEpLGFdLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKX0sQ2E9ZnVuY3Rpb24oYSxiLGMsZCl7YSBpbnN0YW5jZW9mIGJ8fHphKCJFeHBlY3RlZCBpbnN0YW5jZW9mICVzIGJ1dCBnb3QgJXMuIixbQmEoYiksQmEoYSldLGMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpKX0sQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZgpGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTpudWxsPT09YT8ibnVsbCI6dHlwZW9mIGF9O3ZhciBEYT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3EobnVsbCE9YS5sZW5ndGgpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKCJzdHJpbmciPT09dHlwZW9mIGEpcmV0dXJuInN0cmluZyIhPT10eXBlb2YgYnx8MSE9Yi5sZW5ndGg/LTE6YS5pbmRleE9mKGIsMCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspaWYoYyBpbiBhJiZhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX0scj1BcnJheS5wcm90b3R5cGUuZm9yRWFjaD9mdW5jdGlvbihhLGIsYyl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsYyl9OmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9YS5sZW5ndGgsZT0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZj0wO2Y8ZDtmKyspZiBpbiBlJiZiLmNhbGwoYyxlW2ZdLGYsYSl9LEVhPUFycmF5LnByb3RvdHlwZS5maWx0ZXI/CmZ1bmN0aW9uKGEsYil7cShudWxsIT1hLmxlbmd0aCk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD1bXSxlPTAsZj0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZz0wO2c8YztnKyspaWYoZyBpbiBmKXt2YXIgaz1mW2ddO2IuY2FsbCh2b2lkIDAsayxnLGEpJiYoZFtlKytdPWspfXJldHVybiBkfSxGYT1BcnJheS5wcm90b3R5cGUuZXZlcnk/ZnVuY3Rpb24oYSxiKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmV2ZXJ5LmNhbGwoYSxiLHZvaWQgMCl9OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWEubGVuZ3RoLGQ9InN0cmluZyI9PT10eXBlb2YgYT9hLnNwbGl0KCIiKTphLGU9MDtlPGM7ZSsrKWlmKGUgaW4gZCYmIWIuY2FsbCh2b2lkIDAsZFtlXSxlLGEpKXJldHVybiExO3JldHVybiEwfSxHYT1mdW5jdGlvbihhLGIpe3JldHVybiAwPD0KRGEoYSxiKX0sSGE9ZnVuY3Rpb24oYSxiKXtiPURhKGEsYik7dmFyIGM7aWYoYz0wPD1iKXEobnVsbCE9YS5sZW5ndGgpLEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhLGIsMSk7cmV0dXJuIGN9LElhPWZ1bmN0aW9uKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGFyZ3VtZW50cyl9LEphPWZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDA8Yil7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX0sTGE9ZnVuY3Rpb24oYSxiLGMsZCl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShhLEthKGFyZ3VtZW50cywxKSl9LEthPWZ1bmN0aW9uKGEsYixjKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gMj49YXJndW1lbnRzLmxlbmd0aD9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsYixjKX07dmFyIE1hPVN0cmluZy5wcm90b3R5cGUudHJpbT9mdW5jdGlvbihhKXtyZXR1cm4gYS50cmltKCl9OmZ1bmN0aW9uKGEpe3JldHVybi9eW1xzXHhhMF0qKFtcc1xTXSo/KVtcc1x4YTBdKiQvLmV4ZWMoYSlbMV19LE5hPS8mL2csT2E9LzwvZyxQYT0vPi9nLFFhPS8iL2csUmE9LycvZyxTYT0vXHgwMC9nLFRhPS9bXHgwMCY8PiInXS8sdD1mdW5jdGlvbihhLGIpe3JldHVybi0xIT1hLmluZGV4T2YoYil9LFVhPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE8Yj8tMTphPmI/MTowfTt2YXIgdTthOnt2YXIgVmE9bC5uYXZpZ2F0b3I7aWYoVmEpe3ZhciBXYT1WYS51c2VyQWdlbnQ7aWYoV2Epe3U9V2E7YnJlYWsgYX19dT0iIn07LyoKCiBDb3B5cmlnaHQgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzLgogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKKi8KdmFyIFhhPWZ1bmN0aW9uKGEpe1RhLnRlc3QoYSkmJigtMSE9YS5pbmRleE9mKCImIikmJihhPWEucmVwbGFjZShOYSwiJmFtcDsiKSksLTEhPWEuaW5kZXhPZigiPCIpJiYoYT1hLnJlcGxhY2UoT2EsIiZsdDsiKSksLTEhPWEuaW5kZXhPZigiPiIpJiYoYT1hLnJlcGxhY2UoUGEsIiZndDsiKSksLTEhPWEuaW5kZXhPZignIicpJiYoYT1hLnJlcGxhY2UoUWEsIiZxdW90OyIpKSwtMSE9YS5pbmRleE9mKCInIikmJihhPWEucmVwbGFjZShSYSwiJiMzOTsiKSksLTEhPWEuaW5kZXhPZigiXHgwMCIpJiYoYT1hLnJlcGxhY2UoU2EsIiYjMDsiKSkpO3JldHVybiBhfTt2YXIgWWE9ZnVuY3Rpb24oYSl7WWFbIiAiXShhKTtyZXR1cm4gYX07WWFbIiAiXT1jYTt2YXIgJGE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1aYTtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsYSk/Y1thXTpjW2FdPWIoYSl9O3ZhciBhYj10KHUsIk9wZXJhIiksdj10KHUsIlRyaWRlbnQiKXx8dCh1LCJNU0lFIiksYmI9dCh1LCJFZGdlIikseD10KHUsIkdlY2tvIikmJiEodCh1LnRvTG93ZXJDYXNlKCksIndlYmtpdCIpJiYhdCh1LCJFZGdlIikpJiYhKHQodSwiVHJpZGVudCIpfHx0KHUsIk1TSUUiKSkmJiF0KHUsIkVkZ2UiKSx5PXQodS50b0xvd2VyQ2FzZSgpLCJ3ZWJraXQiKSYmIXQodSwiRWRnZSIpLHo9dCh1LCJNYWNpbnRvc2giKSxjYj1mdW5jdGlvbigpe3ZhciBhPWwuZG9jdW1lbnQ7cmV0dXJuIGE/YS5kb2N1bWVudE1vZGU6dm9pZCAwfSxkYjsKYTp7dmFyIGViPSIiLGZiPWZ1bmN0aW9uKCl7dmFyIGE9dTtpZih4KXJldHVybi9ydjooW15cKTtdKykoXCl8OykvLmV4ZWMoYSk7aWYoYmIpcmV0dXJuL0VkZ2VcLyhbXGRcLl0rKS8uZXhlYyhhKTtpZih2KXJldHVybi9cYig/Ok1TSUV8cnYpWzogXShbXlwpO10rKShcKXw7KS8uZXhlYyhhKTtpZih5KXJldHVybi9XZWJLaXRcLyhcUyspLy5leGVjKGEpO2lmKGFiKXJldHVybi8oPzpWZXJzaW9uKVsgXC9dPyhcUyspLy5leGVjKGEpfSgpO2ZiJiYoZWI9ZmI/ZmJbMV06IiIpO2lmKHYpe3ZhciBnYj1jYigpO2lmKG51bGwhPWdiJiZnYj5wYXJzZUZsb2F0KGViKSl7ZGI9U3RyaW5nKGdiKTticmVhayBhfX1kYj1lYn0KdmFyIGhiPWRiLFphPXt9LEE9ZnVuY3Rpb24oYSl7cmV0dXJuICRhKGEsZnVuY3Rpb24oKXtmb3IodmFyIGI9MCxjPU1hKFN0cmluZyhoYikpLnNwbGl0KCIuIiksZD1NYShTdHJpbmcoYSkpLnNwbGl0KCIuIiksZT1NYXRoLm1heChjLmxlbmd0aCxkLmxlbmd0aCksZj0wOzA9PWImJmY8ZTtmKyspe3ZhciBnPWNbZl18fCIiLGs9ZFtmXXx8IiI7ZG97Zz0vKFxkKikoXEQqKSguKikvLmV4ZWMoZyl8fFsiIiwiIiwiIiwiIl07az0vKFxkKikoXEQqKSguKikvLmV4ZWMoayl8fFsiIiwiIiwiIiwiIl07aWYoMD09Z1swXS5sZW5ndGgmJjA9PWtbMF0ubGVuZ3RoKWJyZWFrO2I9VWEoMD09Z1sxXS5sZW5ndGg/MDpwYXJzZUludChnWzFdLDEwKSwwPT1rWzFdLmxlbmd0aD8wOnBhcnNlSW50KGtbMV0sMTApKXx8VWEoMD09Z1syXS5sZW5ndGgsMD09a1syXS5sZW5ndGgpfHxVYShnWzJdLGtbMl0pO2c9Z1szXTtrPWtbM119d2hpbGUoMD09Yil9cmV0dXJuIDA8PWJ9KX0saWI7CmliPWwuZG9jdW1lbnQmJnY/Y2IoKTp2b2lkIDA7dmFyIGpiPSF2fHw5PD1OdW1iZXIoaWIpO3ZhciBsYj1mdW5jdGlvbihhLGIpe29hKGIsZnVuY3Rpb24oYyxkKXtjJiYib2JqZWN0Ij09dHlwZW9mIGMmJmMuZGQmJihjPWMuY2QoKSk7InN0eWxlIj09ZD9hLnN0eWxlLmNzc1RleHQ9YzoiY2xhc3MiPT1kP2EuY2xhc3NOYW1lPWM6ImZvciI9PWQ/YS5odG1sRm9yPWM6a2IuaGFzT3duUHJvcGVydHkoZCk/YS5zZXRBdHRyaWJ1dGUoa2JbZF0sYyk6MD09ZC5sYXN0SW5kZXhPZigiYXJpYS0iLDApfHwwPT1kLmxhc3RJbmRleE9mKCJkYXRhLSIsMCk/YS5zZXRBdHRyaWJ1dGUoZCxjKTphW2RdPWN9KX0sa2I9e2NlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjb2xzcGFuOiJjb2xTcGFuIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGhlaWdodDoiaGVpZ2h0IixtYXhsZW5ndGg6Im1heExlbmd0aCIsbm9uY2U6Im5vbmNlIixyb2xlOiJyb2xlIixyb3dzcGFuOiJyb3dTcGFuIix0eXBlOiJ0eXBlIix1c2VtYXA6InVzZU1hcCIsdmFsaWduOiJ2QWxpZ24iLAp3aWR0aDoid2lkdGgifSxtYj1mdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChrKXtrJiZiLmFwcGVuZENoaWxkKCJzdHJpbmciPT09dHlwZW9mIGs/YS5jcmVhdGVUZXh0Tm9kZShrKTprKX1mb3IodmFyIGU9MjtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXTtpZighaGEoZil8fG0oZikmJjA8Zi5ub2RlVHlwZSlkKGYpO2Vsc2V7YTp7aWYoZiYmIm51bWJlciI9PXR5cGVvZiBmLmxlbmd0aCl7aWYobShmKSl7dmFyIGc9ImZ1bmN0aW9uIj09dHlwZW9mIGYuaXRlbXx8InN0cmluZyI9PXR5cGVvZiBmLml0ZW07YnJlYWsgYX1pZihpYShmKSl7Zz0iZnVuY3Rpb24iPT10eXBlb2YgZi5pdGVtO2JyZWFrIGF9fWc9ITF9cihnP0phKGYpOmYsZCl9fX0sbmI9ZnVuY3Rpb24oYSxiKXtiPVN0cmluZyhiKTsiYXBwbGljYXRpb24veGh0bWwreG1sIj09PWEuY29udGVudFR5cGUmJihiPWIudG9Mb3dlckNhc2UoKSk7cmV0dXJuIGEuY3JlYXRlRWxlbWVudChiKX0sb2I9ZnVuY3Rpb24oYSl7YSYmCmEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpfSxwYj1mdW5jdGlvbihhLGIpe2lmKCFhfHwhYilyZXR1cm4hMTtpZihhLmNvbnRhaW5zJiYxPT1iLm5vZGVUeXBlKXJldHVybiBhPT1ifHxhLmNvbnRhaW5zKGIpO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbilyZXR1cm4gYT09Ynx8ISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNik7Zm9yKDtiJiZhIT1iOyliPWIucGFyZW50Tm9kZTtyZXR1cm4gYj09YX0scWI9ZnVuY3Rpb24oYSl7cShhLCJOb2RlIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4iKTtyZXR1cm4gOT09YS5ub2RlVHlwZT9hOmEub3duZXJEb2N1bWVudHx8YS5kb2N1bWVudH0scmI9ZnVuY3Rpb24oYSxiKXtiP2EudGFiSW5kZXg9MDooYS50YWJJbmRleD0tMSxhLnJlbW92ZUF0dHJpYnV0ZSgidGFiSW5kZXgiKSl9LHNiPWZ1bmN0aW9uKGEpe3JldHVybiB2JiYhQSgiOSIpPyhhPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKSwKbnVsbCE9YSYmYS5zcGVjaWZpZWQpOmEuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpfSx0Yj1mdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgYSYmMDw9YSYmMzI3Njg+YX0sdWI9ZnVuY3Rpb24oYSl7dGhpcy5hPWF8fGwuZG9jdW1lbnR8fGRvY3VtZW50fTt1Yi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBhP3RoaXMuYS5nZXRFbGVtZW50QnlJZChhKTphfTsKdWIucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuYSxlPWFyZ3VtZW50cyxmPVN0cmluZyhlWzBdKSxnPWVbMV07aWYoIWpiJiZnJiYoZy5uYW1lfHxnLnR5cGUpKXtmPVsiPCIsZl07Zy5uYW1lJiZmLnB1c2goJyBuYW1lPSInLFhhKGcubmFtZSksJyInKTtpZihnLnR5cGUpe2YucHVzaCgnIHR5cGU9IicsWGEoZy50eXBlKSwnIicpO3ZhciBrPXt9O3VhKGssZyk7ZGVsZXRlIGsudHlwZTtnPWt9Zi5wdXNoKCI+Iik7Zj1mLmpvaW4oIiIpfWY9bmIoZCxmKTtnJiYoInN0cmluZyI9PT10eXBlb2YgZz9mLmNsYXNzTmFtZT1nOmZhKGcpP2YuY2xhc3NOYW1lPWcuam9pbigiICIpOmxiKGYsZykpOzI8ZS5sZW5ndGgmJm1iKGQsZixlKTtyZXR1cm4gZn07dmFyIHZiPWZ1bmN0aW9uKGEsYil7Yj8ocShwYSh2YSxiKSwiTm8gc3VjaCBBUklBIHJvbGUgIitiKSxhLnNldEF0dHJpYnV0ZSgicm9sZSIsYikpOmEucmVtb3ZlQXR0cmlidXRlKCJyb2xlIil9LHhiPWZ1bmN0aW9uKGEsYixjKXtmYShjKSYmKGM9Yy5qb2luKCIgIikpO3ZhciBkPXdiKGIpOyIiPT09Y3x8dm9pZCAwPT1jPyhtYXx8KG1hPXthdG9taWM6ITEsYXV0b2NvbXBsZXRlOiJub25lIixkcm9wZWZmZWN0OiJub25lIixoYXNwb3B1cDohMSxsaXZlOiJvZmYiLG11bHRpbGluZTohMSxtdWx0aXNlbGVjdGFibGU6ITEsb3JpZW50YXRpb246InZlcnRpY2FsIixyZWFkb25seTohMSxyZWxldmFudDoiYWRkaXRpb25zIHRleHQiLHJlcXVpcmVkOiExLHNvcnQ6Im5vbmUiLGJ1c3k6ITEsZGlzYWJsZWQ6ITEsaGlkZGVuOiExLGludmFsaWQ6ImZhbHNlIn0pLGM9bWEsYiBpbiBjP2Euc2V0QXR0cmlidXRlKGQsY1tiXSk6YS5yZW1vdmVBdHRyaWJ1dGUoZCkpOmEuc2V0QXR0cmlidXRlKGQsCmMpfSx3Yj1mdW5jdGlvbihhKXtxKGEsIkFSSUEgYXR0cmlidXRlIGNhbm5vdCBiZSBlbXB0eS4iKTtxKHBhKG5hLGEpLCJObyBzdWNoIEFSSUEgYXR0cmlidXRlICIrYSk7cmV0dXJuImFyaWEtIithfTt2YXIgeWI9T2JqZWN0LmZyZWV6ZXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O3ZhciBDPWZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVTt0aGlzLko9dGhpcy5KfTtDLnByb3RvdHlwZS5VPSExO0MucHJvdG90eXBlLk49ZnVuY3Rpb24oKXt0aGlzLlV8fCh0aGlzLlU9ITAsdGhpcy51KCkpfTt2YXIgemI9ZnVuY3Rpb24oYSxiKXthLlU/YigpOihhLkp8fChhLko9W10pLGEuSi5wdXNoKGIpKX07Qy5wcm90b3R5cGUudT1mdW5jdGlvbigpe2lmKHRoaXMuSilmb3IoO3RoaXMuSi5sZW5ndGg7KXRoaXMuSi5zaGlmdCgpKCl9O3ZhciBBYj1mdW5jdGlvbihhKXthJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5OJiZhLk4oKX07dmFyIEJiPWZ1bmN0aW9uKGEpe3JldHVybiJzdHJpbmciPT10eXBlb2YgYS5jbGFzc05hbWU/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sRD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6QmIoYSkubWF0Y2goL1xTKy9nKXx8W119LENiPWZ1bmN0aW9uKGEsYil7InN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZT9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxEYj1mdW5jdGlvbihhLGIpe3JldHVybiBhLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5jb250YWlucyhiKTpHYShEKGEpLGIpfSxFYj1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFEYihhLGIpKXt2YXIgYz1CYihhKTtDYihhLGMrKDA8Yy5sZW5ndGg/IiAiK2I6YikpfX0sRmI9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClyKGIsCmZ1bmN0aW9uKGUpe0ViKGEsZSl9KTtlbHNle3ZhciBjPXt9O3IoRChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7cihiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPTA8Yi5sZW5ndGg/IiAiK2Q6ZDtDYihhLGIpfX0sR2I9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6RGIoYSxiKSYmQ2IoYSxFYShEKGEpLGZ1bmN0aW9uKGMpe3JldHVybiBjIT1ifSkuam9pbigiICIpKX0sSGI9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9yKGIsZnVuY3Rpb24oYyl7R2IoYSxjKX0pOkNiKGEsRWEoRChhKSxmdW5jdGlvbihjKXtyZXR1cm4hR2EoYixjKX0pLmpvaW4oIiAiKSl9O3ZhciBJYj0hdnx8OTw9TnVtYmVyKGliKSxKYj0hdnx8OTw9TnVtYmVyKGliKSxLYj12JiYhQSgiOSIpLExiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e2wuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsY2EsYiksbC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjYSxiKX1jYXRjaChjKXt9cmV0dXJuIGF9KCk7dmFyIEU9ZnVuY3Rpb24oYSxiKXt0aGlzLnR5cGU9YTt0aGlzLmE9dGhpcy50YXJnZXQ9Yjt0aGlzLmg9ITE7dGhpcy5LYT0hMH07RS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuaD0hMH07RS5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3RoaXMuS2E9ITF9O3ZhciBGPXtMOiJtb3VzZWRvd24iLE06Im1vdXNldXAiLGFhOiJtb3VzZWNhbmNlbCIsaGM6Im1vdXNlbW92ZSIsamM6Im1vdXNlb3ZlciIsaWM6Im1vdXNlb3V0IixmYzoibW91c2VlbnRlciIsZ2M6Im1vdXNlbGVhdmUifTt2YXIgRz1mdW5jdGlvbihhLGIpe0UuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy5hPXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5jPTA7dGhpcy5BPXRoaXMubWV0YUtleT10aGlzLnNoaWZ0S2V5PXRoaXMuYWx0S2V5PXRoaXMuY3RybEtleT0hMTt0aGlzLnBvaW50ZXJJZD0wO3RoaXMucG9pbnRlclR5cGU9IiI7dGhpcy5iPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMuYT1iO2lmKGI9YS5yZWxhdGVkVGFyZ2V0KXtpZih4KXthOnt0cnl7WWEoYi5ub2RlTmFtZSk7dmFyIGU9ITA7YnJlYWsgYX1jYXRjaChmKXt9ZT0KITF9ZXx8KGI9bnVsbCl9fWVsc2UibW91c2VvdmVyIj09Yz9iPWEuZnJvbUVsZW1lbnQ6Im1vdXNlb3V0Ij09YyYmKGI9YS50b0VsZW1lbnQpO3RoaXMucmVsYXRlZFRhcmdldD1iO2Q/KHRoaXMuY2xpZW50WD12b2lkIDAhPT1kLmNsaWVudFg/ZC5jbGllbnRYOmQucGFnZVgsdGhpcy5jbGllbnRZPXZvaWQgMCE9PWQuY2xpZW50WT9kLmNsaWVudFk6ZC5wYWdlWSx0aGlzLnNjcmVlblg9ZC5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1kLnNjcmVlbll8fDApOih0aGlzLmNsaWVudFg9dm9pZCAwIT09YS5jbGllbnRYP2EuY2xpZW50WDphLnBhZ2VYLHRoaXMuY2xpZW50WT12b2lkIDAhPT1hLmNsaWVudFk/YS5jbGllbnRZOmEucGFnZVksdGhpcy5zY3JlZW5YPWEuc2NyZWVuWHx8MCx0aGlzLnNjcmVlblk9YS5zY3JlZW5ZfHwwKTt0aGlzLmJ1dHRvbj1hLmJ1dHRvbjt0aGlzLmM9YS5rZXlDb2RlfHwwO3RoaXMua2V5PWEua2V5fHwiIjt0aGlzLmN0cmxLZXk9YS5jdHJsS2V5O3RoaXMuYWx0S2V5PQphLmFsdEtleTt0aGlzLnNoaWZ0S2V5PWEuc2hpZnRLZXk7dGhpcy5tZXRhS2V5PWEubWV0YUtleTt0aGlzLkE9ej9hLm1ldGFLZXk6YS5jdHJsS2V5O3RoaXMucG9pbnRlcklkPWEucG9pbnRlcklkfHwwO3RoaXMucG9pbnRlclR5cGU9InN0cmluZyI9PT10eXBlb2YgYS5wb2ludGVyVHlwZT9hLnBvaW50ZXJUeXBlOk1iW2EucG9pbnRlclR5cGVdfHwiIjt0aGlzLmI9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnRoaXMuZygpfX07bihHLEUpO3ZhciBOYj15YihbMSw0LDJdKSxNYj15Yih7MjoidG91Y2giLDM6InBlbiIsNDoibW91c2UifSksT2I9ZnVuY3Rpb24oYSl7cmV0dXJuIEliPzA9PWEuYi5idXR0b246ImNsaWNrIj09YS50eXBlPyEwOiEhKGEuYi5idXR0b24mTmJbMF0pfTtHLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7Ry5pLmouY2FsbCh0aGlzKTt0aGlzLmIuc3RvcFByb3BhZ2F0aW9uP3RoaXMuYi5zdG9wUHJvcGFnYXRpb24oKTp0aGlzLmIuY2FuY2VsQnViYmxlPSEwfTsKRy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe0cuaS5nLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5iO2lmKGEucHJldmVudERlZmF1bHQpYS5wcmV2ZW50RGVmYXVsdCgpO2Vsc2UgaWYoYS5yZXR1cm5WYWx1ZT0hMSxLYil0cnl7aWYoYS5jdHJsS2V5fHwxMTI8PWEua2V5Q29kZSYmMTIzPj1hLmtleUNvZGUpYS5rZXlDb2RlPS0xfWNhdGNoKGIpe319O3ZhciBQYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKDFFNipNYXRoLnJhbmRvbSgpfDApLFFiPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW1BiXSl9LFJiPTA7dmFyIFNiPWZ1bmN0aW9uKGEsYixjLGQsZSl7dGhpcy5saXN0ZW5lcj1hO3RoaXMuYT1udWxsO3RoaXMuc3JjPWI7dGhpcy50eXBlPWM7dGhpcy5jYXB0dXJlPSEhZDt0aGlzLm1hPWU7dGhpcy5rZXk9KytSYjt0aGlzLlg9dGhpcy5oYT0hMX0sVGI9ZnVuY3Rpb24oYSl7YS5YPSEwO2EubGlzdGVuZXI9bnVsbDthLmE9bnVsbDthLnNyYz1udWxsO2EubWE9bnVsbH07dmFyIFViPWZ1bmN0aW9uKGEpe3RoaXMuc3JjPWE7dGhpcy5hPXt9O3RoaXMuYj0wfTtVYi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS50b1N0cmluZygpO2E9dGhpcy5hW2ZdO2F8fChhPXRoaXMuYVtmXT1bXSx0aGlzLmIrKyk7dmFyIGc9VmIoYSxiLGQsZSk7LTE8Zz8oYj1hW2ddLGN8fChiLmhhPSExKSk6KGI9bmV3IFNiKGIsdGhpcy5zcmMsZiwhIWQsZSksYi5oYT1jLGEucHVzaChiKSk7cmV0dXJuIGJ9Owp2YXIgV2I9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLnR5cGU7YyBpbiBhLmEmJkhhKGEuYVtjXSxiKSYmKFRiKGIpLDA9PWEuYVtjXS5sZW5ndGgmJihkZWxldGUgYS5hW2NdLGEuYi0tKSl9LFhiPWZ1bmN0aW9uKGEsYixjLGQsZSl7YT1hLmFbYi50b1N0cmluZygpXTtiPS0xO2EmJihiPVZiKGEsYyxkLGUpKTtyZXR1cm4tMTxiP2FbYl06bnVsbH0sVmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuWCYmZi5saXN0ZW5lcj09YiYmZi5jYXB0dXJlPT0hIWMmJmYubWE9PWQpcmV0dXJuIGV9cmV0dXJuLTF9O3ZhciBZYj0iY2xvc3VyZV9sbV8iKygxRTYqTWF0aC5yYW5kb20oKXwwKSxaYj17fSwkYj0wLGJjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZCYmZC5vbmNlKXJldHVybiBhYyhhLGIsYyxkLGUpO2lmKGZhKGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyliYyhhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9Y2MoYyk7cmV0dXJuIFFiKGEpP2RjKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOmVjKGEsYixjLCExLGQsZSl9LGVjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGc9bShlKT8hIWUuY2FwdHVyZTohIWUsaz1mYyhhKTtrfHwoYVtZYl09az1uZXcgVWIoYSkpO2M9ay5hZGQoYixjLGQsZyxmKTtpZihjLmEpcmV0dXJuIGM7ZD1nYygpO2MuYT1kO2Quc3JjPWE7ZC5saXN0ZW5lcj1jO2lmKGEuYWRkRXZlbnRMaXN0ZW5lcilMYnx8KGU9Zyksdm9pZCAwPT09ZSYmKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksCmQsZSk7ZWxzZSBpZihhLmF0dGFjaEV2ZW50KWEuYXR0YWNoRXZlbnQoaGMoYi50b1N0cmluZygpKSxkKTtlbHNlIGlmKGEuYWRkTGlzdGVuZXImJmEucmVtb3ZlTGlzdGVuZXIpcSgiY2hhbmdlIj09PWIsIk1lZGlhUXVlcnlMaXN0IG9ubHkgaGFzIGEgY2hhbmdlIGV2ZW50IiksYS5hZGRMaXN0ZW5lcihkKTtlbHNlIHRocm93IEVycm9yKCJhZGRFdmVudExpc3RlbmVyIGFuZCBhdHRhY2hFdmVudCBhcmUgdW5hdmFpbGFibGUuIik7JGIrKztyZXR1cm4gY30sZ2M9ZnVuY3Rpb24oKXt2YXIgYT1pYyxiPUpiP2Z1bmN0aW9uKGMpe3JldHVybiBhLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKX06ZnVuY3Rpb24oYyl7Yz1hLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKTtpZighYylyZXR1cm4gY307cmV0dXJuIGJ9LGFjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZmEoYikpe2Zvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWFjKGEsYltmXSxjLGQsZSk7cmV0dXJuIG51bGx9Yz1jYyhjKTtyZXR1cm4gUWIoYSk/CmEuaC5hZGQoU3RyaW5nKGIpLGMsITAsbShkKT8hIWQuY2FwdHVyZTohIWQsZSk6ZWMoYSxiLGMsITAsZCxlKX0samM9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihmYShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylqYyhhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPWNjKGMpLFFiKGEpPyhhPWEuaCxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5hJiYoZj1hLmFbYl0sYz1WYihmLGMsZCxlKSwtMTxjJiYoVGIoZltjXSkscShudWxsIT1mLmxlbmd0aCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSwwPT1mLmxlbmd0aCYmKGRlbGV0ZSBhLmFbYl0sYS5iLS0pKSkpOmEmJihhPWZjKGEpKSYmKGM9WGIoYSxiLGMsZCxlKSkmJmtjKGMpfSxrYz1mdW5jdGlvbihhKXtpZigibnVtYmVyIiE9PXR5cGVvZiBhJiZhJiYhYS5YKXt2YXIgYj1hLnNyYztpZihRYihiKSlXYihiLmgsYSk7ZWxzZXt2YXIgYz1hLnR5cGUsZD1hLmE7Yi5yZW1vdmVFdmVudExpc3RlbmVyPwpiLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KGhjKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7JGItLTsoYz1mYyhiKSk/KFdiKGMsYSksMD09Yy5iJiYoYy5zcmM9bnVsbCxiW1liXT1udWxsKSk6VGIoYSl9fX0saGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gWmI/WmJbYV06WmJbYV09Im9uIithfSxtYz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMDtpZihhPWZjKGEpKWlmKGI9YS5hW2IudG9TdHJpbmcoKV0pZm9yKGI9Yi5jb25jYXQoKSxhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBmPWJbYV07ZiYmZi5jYXB0dXJlPT1jJiYhZi5YJiYoZj1sYyhmLGQpLGU9ZSYmITEhPT1mKX1yZXR1cm4gZX0sbGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5tYXx8YS5zcmM7YS5oYSYma2MoYSk7cmV0dXJuIGMuY2FsbChkLGIpfSxpYz1mdW5jdGlvbihhLApiKXtpZihhLlgpcmV0dXJuITA7aWYoIUpiKXtpZighYilhOntiPVsid2luZG93IiwiZXZlbnQiXTtmb3IodmFyIGM9bCxkPTA7ZDxiLmxlbmd0aDtkKyspaWYoYz1jW2JbZF1dLG51bGw9PWMpe2I9bnVsbDticmVhayBhfWI9Y31kPWI7Yj1uZXcgRyhkLHRoaXMpO2M9ITA7aWYoISgwPmQua2V5Q29kZXx8dm9pZCAwIT1kLnJldHVyblZhbHVlKSl7YTp7dmFyIGU9ITE7aWYoMD09ZC5rZXlDb2RlKXRyeXtkLmtleUNvZGU9LTE7YnJlYWsgYX1jYXRjaChnKXtlPSEwfWlmKGV8fHZvaWQgMD09ZC5yZXR1cm5WYWx1ZSlkLnJldHVyblZhbHVlPSEwfWQ9W107Zm9yKGU9Yi5hO2U7ZT1lLnBhcmVudE5vZGUpZC5wdXNoKGUpO2E9YS50eXBlO2ZvcihlPWQubGVuZ3RoLTE7IWIuaCYmMDw9ZTtlLS0pe2IuYT1kW2VdO3ZhciBmPW1jKGRbZV0sYSwhMCxiKTtjPWMmJmZ9Zm9yKGU9MDshYi5oJiZlPGQubGVuZ3RoO2UrKyliLmE9ZFtlXSxmPW1jKGRbZV0sYSwhMSxiKSxjPWMmJmZ9cmV0dXJuIGN9cmV0dXJuIGxjKGEsCm5ldyBHKGIsdGhpcykpfSxmYz1mdW5jdGlvbihhKXthPWFbWWJdO3JldHVybiBhIGluc3RhbmNlb2YgVWI/YTpudWxsfSxuYz0iX19jbG9zdXJlX2V2ZW50c19mbl8iKygxRTkqTWF0aC5yYW5kb20oKT4+PjApLGNjPWZ1bmN0aW9uKGEpe3EoYSwiTGlzdGVuZXIgY2FuIG5vdCBiZSBudWxsLiIpO2lmKGlhKGEpKXJldHVybiBhO3EoYS5oYW5kbGVFdmVudCwiQW4gb2JqZWN0IGxpc3RlbmVyIG11c3QgaGF2ZSBoYW5kbGVFdmVudCBtZXRob2QuIik7YVtuY118fChhW25jXT1mdW5jdGlvbihiKXtyZXR1cm4gYS5oYW5kbGVFdmVudChiKX0pO3JldHVybiBhW25jXX07dmFyIG9jPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9e319O24ob2MsQyk7CnZhciBwYz1bXSxIPWZ1bmN0aW9uKGEsYixjLGQpe2ZhKGMpfHwoYyYmKHBjWzBdPWMudG9TdHJpbmcoKSksYz1wYyk7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWJjKGIsY1tlXSxkfHxhLmhhbmRsZUV2ZW50LCExLGEuYnx8YSk7aWYoIWYpYnJlYWs7YS5hW2Yua2V5XT1mfXJldHVybiBhfSxxYz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoZmEoYykpZm9yKHZhciBnPTA7ZzxjLmxlbmd0aDtnKyspcWMoYSxiLGNbZ10sZCxlLGYpO2Vsc2UgZD1kfHxhLmhhbmRsZUV2ZW50LGU9bShlKT8hIWUuY2FwdHVyZTohIWUsZj1mfHxhLmJ8fGEsZD1jYyhkKSxlPSEhZSxjPVFiKGIpP1hiKGIuaCxTdHJpbmcoYyksZCxlLGYpOmI/KGI9ZmMoYikpP1hiKGIsYyxkLGUsZik6bnVsbDpudWxsLGMmJihrYyhjKSxkZWxldGUgYS5hW2Mua2V5XSk7cmV0dXJuIGF9LHJjPWZ1bmN0aW9uKGEpe29hKGEuYSxmdW5jdGlvbihiLGMpe3RoaXMuYS5oYXNPd25Qcm9wZXJ0eShjKSYma2MoYil9LAphKTthLmE9e319O29jLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7b2MuaS51LmNhbGwodGhpcyk7cmModGhpcyl9O29jLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJFdmVudEhhbmRsZXIuaGFuZGxlRXZlbnQgbm90IGltcGxlbWVudGVkIik7fTt2YXIgST1mdW5jdGlvbigpe0MuY2FsbCh0aGlzKTt0aGlzLmg9bmV3IFViKHRoaXMpO3RoaXMuTWE9dGhpczt0aGlzLnBhPW51bGx9O24oSSxDKTtJLnByb3RvdHlwZVtQYl09ITA7SS5wcm90b3R5cGUucmE9ZnVuY3Rpb24oYSl7dGhpcy5wYT1hfTtJLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjLGQpe2pjKHRoaXMsYSxiLGMsZCl9Owp2YXIgdWM9ZnVuY3Rpb24oYSxiKXtzYyhhKTt2YXIgYz1hLnBhO2lmKGMpe3ZhciBkPVtdO2Zvcih2YXIgZT0xO2M7Yz1jLnBhKWQucHVzaChjKSxxKDFFMz4rK2UsImluZmluaXRlIGxvb3AiKX1hPWEuTWE7Yz1iLnR5cGV8fGI7InN0cmluZyI9PT10eXBlb2YgYj9iPW5ldyBFKGIsYSk6YiBpbnN0YW5jZW9mIEU/Yi50YXJnZXQ9Yi50YXJnZXR8fGE6KGU9YixiPW5ldyBFKGMsYSksdWEoYixlKSk7ZT0hMDtpZihkKWZvcih2YXIgZj1kLmxlbmd0aC0xOyFiLmgmJjA8PWY7Zi0tKXt2YXIgZz1iLmE9ZFtmXTtlPXRjKGcsYywhMCxiKSYmZX1iLmh8fChnPWIuYT1hLGU9dGMoZyxjLCEwLGIpJiZlLGIuaHx8KGU9dGMoZyxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLmgmJmY8ZC5sZW5ndGg7ZisrKWc9Yi5hPWRbZl0sZT10YyhnLGMsITEsYikmJmU7cmV0dXJuIGV9OwpJLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7SS5pLnUuY2FsbCh0aGlzKTtpZih0aGlzLmgpe3ZhciBhPXRoaXMuaCxiPTAsYztmb3IoYyBpbiBhLmEpe2Zvcih2YXIgZD1hLmFbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixUYihkW2VdKTtkZWxldGUgYS5hW2NdO2EuYi0tfX10aGlzLnBhPW51bGx9O3ZhciBkYz1mdW5jdGlvbihhLGIsYyxkLGUpe3NjKGEpO3JldHVybiBhLmguYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LHRjPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5oLmFbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGc9YltmXTtpZihnJiYhZy5YJiZnLmNhcHR1cmU9PWMpe3ZhciBrPWcubGlzdGVuZXIscD1nLm1hfHxnLnNyYztnLmhhJiZXYihhLmgsZyk7ZT0hMSE9PWsuY2FsbChwLGQpJiZlfX1yZXR1cm4gZSYmMCE9ZC5LYX0sc2M9ZnVuY3Rpb24oYSl7cShhLmgsIkV2ZW50IHRhcmdldCBpcyBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgY2FsbCB0aGUgc3VwZXJjbGFzcyAoZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpIGNvbnN0cnVjdG9yPyIpfTt2YXIgeGM9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKHkmJiFBKCI1MjUiKSlyZXR1cm4hMDtpZih6JiZlKXJldHVybiB2YyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZigheCl7Im51bWJlciI9PT10eXBlb2YgYiYmKGI9d2MoYikpO3ZhciBnPTE3PT1ifHwxOD09Ynx8eiYmOTE9PWI7aWYoKCFjfHx6KSYmZ3x8eiYmMTY9PWImJihkfHxmKSlyZXR1cm4hMX1pZigoeXx8YmIpJiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1pZih2JiZkJiZiPT1hKXJldHVybiExO3N3aXRjaChhKXtjYXNlIDEzOnJldHVybiB4P2Z8fGU/ITE6IShjJiZkKTohMDtjYXNlIDI3OnJldHVybiEoeXx8YmJ8fHgpfXJldHVybiB4JiYoZHx8ZXx8Zik/ITE6dmMoYSl9LHZjPWZ1bmN0aW9uKGEpe2lmKDQ4PD1hJiY1Nz49YXx8Cjk2PD1hJiYxMDY+PWF8fDY1PD1hJiY5MD49YXx8KHl8fGJiKSYmMD09YSlyZXR1cm4hMDtzd2l0Y2goYSl7Y2FzZSAzMjpjYXNlIDQzOmNhc2UgNjM6Y2FzZSA2NDpjYXNlIDEwNzpjYXNlIDEwOTpjYXNlIDExMDpjYXNlIDExMTpjYXNlIDE4NjpjYXNlIDU5OmNhc2UgMTg5OmNhc2UgMTg3OmNhc2UgNjE6Y2FzZSAxODg6Y2FzZSAxOTA6Y2FzZSAxOTE6Y2FzZSAxOTI6Y2FzZSAyMjI6Y2FzZSAyMTk6Y2FzZSAyMjA6Y2FzZSAyMjE6Y2FzZSAxNjM6Y2FzZSA1ODpyZXR1cm4hMDtjYXNlIDE3MzpyZXR1cm4geDtkZWZhdWx0OnJldHVybiExfX0sd2M9ZnVuY3Rpb24oYSl7aWYoeClhPXljKGEpO2Vsc2UgaWYoeiYmeSlzd2l0Y2goYSl7Y2FzZSA5MzphPTkxfXJldHVybiBhfSx5Yz1mdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSA2MTpyZXR1cm4gMTg3O2Nhc2UgNTk6cmV0dXJuIDE4NjtjYXNlIDE3MzpyZXR1cm4gMTg5O2Nhc2UgMjI0OnJldHVybiA5MTtjYXNlIDA6cmV0dXJuIDIyNDsKZGVmYXVsdDpyZXR1cm4gYX19O3ZhciBKPWZ1bmN0aW9uKGEsYil7SS5jYWxsKHRoaXMpO2EmJnpjKHRoaXMsYSxiKX07bihKLEkpO2g9Si5wcm90b3R5cGU7aC5TPW51bGw7aC5uYT1udWxsO2guQ2E9bnVsbDtoLm9hPW51bGw7aC53PS0xO2guRj0tMTtoLnVhPSExOwp2YXIgQWM9ezM6MTMsMTI6MTQ0LDYzMjMyOjM4LDYzMjMzOjQwLDYzMjM0OjM3LDYzMjM1OjM5LDYzMjM2OjExMiw2MzIzNzoxMTMsNjMyMzg6MTE0LDYzMjM5OjExNSw2MzI0MDoxMTYsNjMyNDE6MTE3LDYzMjQyOjExOCw2MzI0MzoxMTksNjMyNDQ6MTIwLDYzMjQ1OjEyMSw2MzI0NjoxMjIsNjMyNDc6MTIzLDYzMjQ4OjQ0LDYzMjcyOjQ2LDYzMjczOjM2LDYzMjc1OjM1LDYzMjc2OjMzLDYzMjc3OjM0LDYzMjg5OjE0NCw2MzMwMjo0NX0sQmM9e1VwOjM4LERvd246NDAsTGVmdDozNyxSaWdodDozOSxFbnRlcjoxMyxGMToxMTIsRjI6MTEzLEYzOjExNCxGNDoxMTUsRjU6MTE2LEY2OjExNyxGNzoxMTgsRjg6MTE5LEY5OjEyMCxGMTA6MTIxLEYxMToxMjIsRjEyOjEyMywiVSswMDdGIjo0NixIb21lOjM2LEVuZDozNSxQYWdlVXA6MzMsUGFnZURvd246MzQsSW5zZXJ0OjQ1fSxDYz0heXx8QSgiNTI1IiksRGM9eiYmeDsKSi5wcm90b3R5cGUuYT1mdW5jdGlvbihhKXtpZih5fHxiYilpZigxNz09dGhpcy53JiYhYS5jdHJsS2V5fHwxOD09dGhpcy53JiYhYS5hbHRLZXl8fHomJjkxPT10aGlzLncmJiFhLm1ldGFLZXkpdGhpcy5GPXRoaXMudz0tMTstMT09dGhpcy53JiYoYS5jdHJsS2V5JiYxNyE9YS5jP3RoaXMudz0xNzphLmFsdEtleSYmMTghPWEuYz90aGlzLnc9MTg6YS5tZXRhS2V5JiY5MSE9YS5jJiYodGhpcy53PTkxKSk7Q2MmJiF4YyhhLmMsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGEuYWx0S2V5LGEubWV0YUtleSk/dGhpcy5oYW5kbGVFdmVudChhKToodGhpcy5GPXdjKGEuYyksRGMmJih0aGlzLnVhPWEuYWx0S2V5KSl9O0oucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dGhpcy5GPXRoaXMudz0tMTt0aGlzLnVhPWEuYWx0S2V5fTsKSi5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5iLGM9Yi5hbHRLZXk7aWYodiYmImtleXByZXNzIj09YS50eXBlKXt2YXIgZD10aGlzLkY7dmFyIGU9MTMhPWQmJjI3IT1kP2Iua2V5Q29kZTowfWVsc2UoeXx8YmIpJiYia2V5cHJlc3MiPT1hLnR5cGU/KGQ9dGhpcy5GLGU9MDw9Yi5jaGFyQ29kZSYmNjMyMzI+Yi5jaGFyQ29kZSYmdmMoZCk/Yi5jaGFyQ29kZTowKTphYiYmIXk/KGQ9dGhpcy5GLGU9dmMoZCk/Yi5rZXlDb2RlOjApOigia2V5cHJlc3MiPT1hLnR5cGU/KERjJiYoYz10aGlzLnVhKSxiLmtleUNvZGU9PWIuY2hhckNvZGU/MzI+Yi5rZXlDb2RlPyhkPWIua2V5Q29kZSxlPTApOihkPXRoaXMuRixlPWIuY2hhckNvZGUpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkseiYmNjM9PWUmJjIyND09ZCYmKGQ9MTkxKSk7dmFyIGY9ZD13YyhkKTtkPzYzMjMyPD0KZCYmZCBpbiBBYz9mPUFjW2RdOjI1PT1kJiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBCYyYmKGY9QmNbYi5rZXlJZGVudGlmaWVyXSk7eCYmQ2MmJiJrZXlwcmVzcyI9PWEudHlwZSYmIXhjKGYsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KXx8KGE9Zj09dGhpcy53LHRoaXMudz1mLGI9bmV3IEVjKGYsZSxhLGIpLGIuYWx0S2V5PWMsdWModGhpcyxiKSl9O0oucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTsKdmFyIHpjPWZ1bmN0aW9uKGEsYixjKXthLm9hJiZGYyhhKTthLlM9YjthLm5hPWJjKGEuUywia2V5cHJlc3MiLGEsYyk7YS5DYT1iYyhhLlMsImtleWRvd24iLGEuYSxjLGEpO2Eub2E9YmMoYS5TLCJrZXl1cCIsYS5iLGMsYSl9LEZjPWZ1bmN0aW9uKGEpe2EubmEmJihrYyhhLm5hKSxrYyhhLkNhKSxrYyhhLm9hKSxhLm5hPW51bGwsYS5DYT1udWxsLGEub2E9bnVsbCk7YS5TPW51bGw7YS53PS0xO2EuRj0tMX07Si5wcm90b3R5cGUudT1mdW5jdGlvbigpe0ouaS51LmNhbGwodGhpcyk7RmModGhpcyl9O3ZhciBFYz1mdW5jdGlvbihhLGIsYyxkKXtHLmNhbGwodGhpcyxkKTt0aGlzLnR5cGU9ImtleSI7dGhpcy5jPWE7dGhpcy5yZXBlYXQ9Y307bihFYyxHKTt2YXIgR2M9eD8iTW96VXNlclNlbGVjdCI6eXx8YmI/IldlYmtpdFVzZXJTZWxlY3QiOm51bGwsSGM9ZnVuY3Rpb24oYSxiKXtiPWI/bnVsbDphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7aWYoR2Mpe3ZhciBjPSJub25lIjthLnN0eWxlJiYoYS5zdHlsZVtHY109Yyk7aWYoYil7YT0wO2Zvcih2YXIgZDtkPWJbYV07YSsrKWQuc3R5bGUmJihkLnN0eWxlW0djXT1jKX19ZWxzZSBpZih2fHxhYilpZihjPSJvbiIsYS5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyksYilmb3IoYT0wO2Q9YlthXTthKyspZC5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyl9O3ZhciBJYz1mdW5jdGlvbigpe307ZGEoSWMpO0ljLnByb3RvdHlwZS5hPTA7dmFyIEs9ZnVuY3Rpb24oYSl7SS5jYWxsKHRoaXMpO3RoaXMuaj1hfHx4YXx8KHhhPW5ldyB1Yik7dGhpcy5xYT1KYzt0aGlzLlk9bnVsbDt0aGlzLm09ITE7dGhpcy5hPW51bGw7dGhpcy5BPXZvaWQgMDt0aGlzLmc9dGhpcy5jPXRoaXMuYj1udWxsO3RoaXMuR2E9ITF9O24oSyxJKTtLLnByb3RvdHlwZS5PYT1JYy5SKCk7CnZhciBKYz1udWxsLEtjPWZ1bmN0aW9uKGEsYil7c3dpdGNoKGEpe2Nhc2UgMTpyZXR1cm4gYj8iZGlzYWJsZSI6ImVuYWJsZSI7Y2FzZSAyOnJldHVybiBiPyJoaWdobGlnaHQiOiJ1bmhpZ2hsaWdodCI7Y2FzZSA0OnJldHVybiBiPyJhY3RpdmF0ZSI6ImRlYWN0aXZhdGUiO2Nhc2UgODpyZXR1cm4gYj8ic2VsZWN0IjoidW5zZWxlY3QiO2Nhc2UgMTY6cmV0dXJuIGI/ImNoZWNrIjoidW5jaGVjayI7Y2FzZSAzMjpyZXR1cm4gYj8iZm9jdXMiOiJibHVyIjtjYXNlIDY0OnJldHVybiBiPyJvcGVuIjoiY2xvc2UifXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBzdGF0ZSIpO30sTGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuWXx8KGEuWT0iOiIrKGEuT2EuYSsrKS50b1N0cmluZygzNikpfSxNYz1mdW5jdGlvbihhLGIpe2lmKGEuYiYmYS5iLmcpe3ZhciBjPWEuYi5nLGQ9YS5ZO2QgaW4gYyYmZGVsZXRlIGNbZF07cWEoYS5iLmcsYixhKX1hLlk9Yn07Sy5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9Owp2YXIgTmM9ZnVuY3Rpb24oYSl7YT1hLmE7cShhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cmV0dXJuIGF9LE9jPWZ1bmN0aW9uKGEpe2EuQXx8KGEuQT1uZXcgb2MoYSkpO3JldHVybiBxKGEuQSl9O0sucHJvdG90eXBlLnJhPWZ1bmN0aW9uKGEpe2lmKHRoaXMuYiYmdGhpcy5iIT1hKXRocm93IEVycm9yKCJNZXRob2Qgbm90IHN1cHBvcnRlZCIpO0suaS5yYS5jYWxsKHRoaXMsYSl9O0sucHJvdG90eXBlLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPW5iKHRoaXMuai5hLCJESVYiKX07CnZhciBQYz1mdW5jdGlvbihhLGIpe2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiJiZhLnhhKGIpKXthLkdhPSEwO3ZhciBjPXFiKGIpO2EuaiYmYS5qLmE9PWN8fChhLmo9Yj9uZXcgdWIocWIoYikpOnhhfHwoeGE9bmV3IHViKSk7YS52YShiKTthLkQoKX1lbHNlIHRocm93IEVycm9yKCJJbnZhbGlkIGVsZW1lbnQgdG8gZGVjb3JhdGUiKTt9O2g9Sy5wcm90b3R5cGU7aC54YT1mdW5jdGlvbigpe3JldHVybiEwfTtoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hfTtoLkQ9ZnVuY3Rpb24oKXt0aGlzLm09ITA7UWModGhpcyxmdW5jdGlvbihhKXshYS5tJiZhLmYoKSYmYS5EKCl9KX07aC5QPWZ1bmN0aW9uKCl7UWModGhpcyxmdW5jdGlvbihhKXthLm0mJmEuUCgpfSk7dGhpcy5BJiZyYyh0aGlzLkEpO3RoaXMubT0hMX07CmgudT1mdW5jdGlvbigpe3RoaXMubSYmdGhpcy5QKCk7dGhpcy5BJiYodGhpcy5BLk4oKSxkZWxldGUgdGhpcy5BKTtRYyh0aGlzLGZ1bmN0aW9uKGEpe2EuTigpfSk7IXRoaXMuR2EmJnRoaXMuYSYmb2IodGhpcy5hKTt0aGlzLmI9dGhpcy5hPXRoaXMuZz10aGlzLmM9bnVsbDtLLmkudS5jYWxsKHRoaXMpfTtoLnNhPWZ1bmN0aW9uKGEsYil7dGhpcy50YShhLFJjKHRoaXMpLGIpfTsKaC50YT1mdW5jdGlvbihhLGIsYyl7cSghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLm0mJihjfHwhdGhpcy5tKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZigwPmJ8fGI+UmModGhpcykpdGhyb3cgRXJyb3IoIkNoaWxkIGNvbXBvbmVudCBpbmRleCBvdXQgb2YgYm91bmRzIik7dGhpcy5nJiZ0aGlzLmN8fCh0aGlzLmc9e30sdGhpcy5jPVtdKTtpZihhLmI9PXRoaXMpe3ZhciBkPUxjKGEpO3RoaXMuZ1tkXT1hO0hhKHRoaXMuYyxhKX1lbHNlIHFhKHRoaXMuZyxMYyhhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuYiYmYS5ZKXt2YXIgZT1hLmI7ZD1hLlk7ZS5nJiZkPyhlPWUuZyxkPShudWxsIT09ZSYmZCBpbiBlP2VbZF06dm9pZCAwKXx8bnVsbCk6ZD1udWxsfWlmKGQmJmEuYiE9dGhpcyl0aHJvdyBFcnJvcigiVW5hYmxlIHRvIHNldCBwYXJlbnQgY29tcG9uZW50Iik7CmEuYj10aGlzO0suaS5yYS5jYWxsKGEsdGhpcyk7TGEodGhpcy5jLGIsMCxhKTtpZihhLm0mJnRoaXMubSYmYS5iPT10aGlzKWM9dGhpcy5qYSgpLGI9Yy5jaGlsZE5vZGVzW2JdfHxudWxsLGIhPWEuZigpJiZjLmluc2VydEJlZm9yZShhLmYoKSxiKTtlbHNlIGlmKGMpe3RoaXMuYXx8dGhpcy5pYSgpO2M9TCh0aGlzLGIrMSk7Yj10aGlzLmphKCk7Yz1jP2MuYTpudWxsO2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTthLmF8fGEuaWEoKTtiP2IuaW5zZXJ0QmVmb3JlKGEuYSxjfHxudWxsKTphLmouYS5ib2R5LmFwcGVuZENoaWxkKGEuYSk7YS5iJiYhYS5iLm18fGEuRCgpfWVsc2UgdGhpcy5tJiYhYS5tJiZhLmEmJmEuYS5wYXJlbnROb2RlJiYxPT1hLmEucGFyZW50Tm9kZS5ub2RlVHlwZSYmYS5EKCl9O2guamE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hfTsKdmFyIFNjPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEucWEpe3ZhciBiPWEubT9hLmE6YS5qLmEuYm9keTthOnt2YXIgYz1xYihiKTtpZihjLmRlZmF1bHRWaWV3JiZjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihjPWMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpKSl7Yz1jLmRpcmVjdGlvbnx8Yy5nZXRQcm9wZXJ0eVZhbHVlKCJkaXJlY3Rpb24iKXx8IiI7YnJlYWsgYX1jPSIifWEucWE9InJ0bCI9PShjfHwoYi5jdXJyZW50U3R5bGU/Yi5jdXJyZW50U3R5bGUuZGlyZWN0aW9uOm51bGwpfHxiLnN0eWxlJiZiLnN0eWxlLmRpcmVjdGlvbil9cmV0dXJuIGEucWF9LFJjPWZ1bmN0aW9uKGEpe3JldHVybiBhLmM/YS5jLmxlbmd0aDowfSxMPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuYz9hLmNbYl18fG51bGw6bnVsbH0sUWM9ZnVuY3Rpb24oYSxiLGMpe2EuYyYmcihhLmMsYixjKX0sVGM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jJiZiP0RhKGEuYyxiKTotMX07dmFyIFZjPWZ1bmN0aW9uKGEsYil7aWYoIWEpdGhyb3cgRXJyb3IoIkludmFsaWQgY2xhc3MgbmFtZSAiK2EpO2lmKCFpYShiKSl0aHJvdyBFcnJvcigiSW52YWxpZCBkZWNvcmF0b3IgZnVuY3Rpb24gIitiKTtVY1thXT1ifSxXYz17fSxVYz17fTt2YXIgWGM9ZnVuY3Rpb24oYSl7dGhpcy5oPWF9O2RhKFhjKTt2YXIgWWM9ZnVuY3Rpb24oYSxiKXthJiYoYS50YWJJbmRleD1iPzA6LTEpfSwkYz1mdW5jdGlvbihhLGIsYyl7Yy5pZCYmTWMoYixjLmlkKTt2YXIgZD1hLmIoKSxlPSExLGY9RChjKTtmJiZyKGYsZnVuY3Rpb24oZyl7Zz09ZD9lPSEwOmcmJnRoaXMuZyhiLGcsZCl9LGEpO2V8fEViKGMsZCk7WmMoYixjKTtyZXR1cm4gY307WGMucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiLGMpe2I9PWMrIi1kaXNhYmxlZCI/YS5aKCExKTpiPT1jKyItaG9yaXpvbnRhbCI/YWQoYSwiaG9yaXpvbnRhbCIpOmI9PWMrIi12ZXJ0aWNhbCImJmFkKGEsInZlcnRpY2FsIil9Owp2YXIgWmM9ZnVuY3Rpb24oYSxiKXtpZihiKWZvcih2YXIgYz1iLmZpcnN0Q2hpbGQsZDtjJiZjLnBhcmVudE5vZGU9PWI7KXtkPWMubmV4dFNpYmxpbmc7aWYoMT09Yy5ub2RlVHlwZSl7YTp7dmFyIGU9YztxKGUpO2U9RChlKTtmb3IodmFyIGY9MCxnPWUubGVuZ3RoO2Y8ZztmKyspe3ZhciBrPWVbZl07aWYoaz1rIGluIFVjP1VjW2tdKCk6bnVsbCl7ZT1rO2JyZWFrIGF9fWU9bnVsbH1lJiYoZS5hPWMsYS5pc0VuYWJsZWQoKXx8ZS5aKCExKSxhLnNhKGUpLFBjKGUsYykpfWVsc2UgYy5ub2RlVmFsdWUmJiIiIT1NYShjLm5vZGVWYWx1ZSl8fGIucmVtb3ZlQ2hpbGQoYyk7Yz1kfX0sYmQ9ZnVuY3Rpb24oYSxiKXtiPWIuZigpO3EoYiwiVGhlIGNvbnRhaW5lciBET00gZWxlbWVudCBjYW5ub3QgYmUgbnVsbC4iKTtIYyhiLHgpO3YmJihiLmhpZGVGb2N1cz0hMCk7KGE9YS5oKSYmdmIoYixhKX07WGMucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKWGMucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5iKCksYz1bYiwiaG9yaXpvbnRhbCI9PWEuSD9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgTT1mdW5jdGlvbigpe30sY2Q7ZGEoTSk7dmFyIGRkPXtidXR0b246InByZXNzZWQiLGNoZWNrYm94OiJjaGVja2VkIixtZW51aXRlbToic2VsZWN0ZWQiLG1lbnVpdGVtY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtcmFkaW86ImNoZWNrZWQiLHJhZGlvOiJjaGVja2VkIix0YWI6InNlbGVjdGVkIix0cmVlaXRlbToic2VsZWN0ZWQifTtNLnByb3RvdHlwZS5oPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLmouYigiRElWIixlZCh0aGlzLGEpLmpvaW4oIiAiKSxhLmJhKX07dmFyIGdkPWZ1bmN0aW9uKGEsYixjKXtpZihhPWEuZj9hLmYoKTphKXt2YXIgZD1bYl07diYmIUEoIjciKSYmKGQ9ZmQoRChhKSxiKSxkLnB1c2goYikpOyhjP0ZiOkhiKShhLGQpfX07Ck0ucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiKXtiLmlkJiZNYyhhLGIuaWQpO2ImJmIuZmlyc3RDaGlsZD9oZChhLGIuZmlyc3RDaGlsZC5uZXh0U2libGluZz9KYShiLmNoaWxkTm9kZXMpOmIuZmlyc3RDaGlsZCk6YS5iYT1udWxsO3ZhciBjPTAsZD10aGlzLmEoKSxlPXRoaXMuYSgpLGY9ITEsZz0hMSxrPSExLHA9SmEoRChiKSk7cihwLGZ1bmN0aW9uKEIpe2Z8fEIhPWQ/Z3x8QiE9ZT9jfD1pZCh0aGlzLEIpOmc9ITA6KGY9ITAsZT09ZCYmKGc9ITApKTsxPT1pZCh0aGlzLEIpJiYoQWEoYiksc2IoYikmJnRiKGIpJiZyYihiLCExKSl9LHRoaXMpO2Eubz1jO2Z8fChwLnB1c2goZCksZT09ZCYmKGc9ITApKTtnfHxwLnB1c2goZSk7KGE9YS53YSkmJnAucHVzaC5hcHBseShwLGEpO2lmKHYmJiFBKCI3Iikpe3ZhciB3PWZkKHApOzA8dy5sZW5ndGgmJihwLnB1c2guYXBwbHkocCx3KSxrPSEwKX1mJiZnJiYhYSYmIWt8fENiKGIscC5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIGpkPWZ1bmN0aW9uKGEsYil7aWYoYT1hLmgoKSl7cShiLCJUaGUgZWxlbWVudCBwYXNzZWQgYXMgYSBmaXJzdCBwYXJhbWV0ZXIgY2Fubm90IGJlIG51bGwuIik7dmFyIGM9Yi5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDthIT1jJiZ2YihiLGEpfX0sa2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYztpZihhLnYmMzImJihjPWEuZigpKSl7aWYoIWImJmEubyYzMil7dHJ5e2MuYmx1cigpfWNhdGNoKGQpe31hLm8mMzImJmEuRmEobnVsbCl9KHNiKGMpJiZ0YihjKSkhPWImJnJiKGMsYil9fSxsZD1mdW5jdGlvbihhLGIsYyl7Y2R8fChjZD17MToiZGlzYWJsZWQiLDg6InNlbGVjdGVkIiwxNjoiY2hlY2tlZCIsNjQ6ImV4cGFuZGVkIn0pO3EoYSwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO2I9Y2RbYl07dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDtkJiYoZD1kZFtkXXx8YixiPSJjaGVja2VkIj09Ynx8InNlbGVjdGVkIj09CmI/ZDpiKTtiJiZ4YihhLGIsYyl9O00ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250cm9sIn07CnZhciBlZD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuYSgpLGQ9W2NdLGU9YS5hKCk7ZSE9YyYmZC5wdXNoKGUpO2M9Yi5vO2ZvcihlPVtdO2M7KXt2YXIgZj1jJi1jO2UucHVzaChtZChhLGYpKTtjJj1+Zn1kLnB1c2guYXBwbHkoZCxlKTsoYT1iLndhKSYmZC5wdXNoLmFwcGx5KGQsYSk7diYmIUEoIjciKSYmZC5wdXNoLmFwcGx5KGQsZmQoZCkpO3JldHVybiBkfSxmZD1mdW5jdGlvbihhLGIpe3ZhciBjPVtdO2ImJihhPUlhKGEsW2JdKSk7cihbXSxmdW5jdGlvbihkKXshRmEoZCxsYShHYSxhKSl8fGImJiFHYShkLGIpfHxjLnB1c2goZC5qb2luKCJfIikpfSk7cmV0dXJuIGN9LG1kPWZ1bmN0aW9uKGEsYil7YS5ifHxuZChhKTtyZXR1cm4gYS5iW2JdfSxpZD1mdW5jdGlvbihhLGIpe2Euanx8KGEuYnx8bmQoYSksYS5qPXNhKGEuYikpO2E9cGFyc2VJbnQoYS5qW2JdLDEwKTtyZXR1cm4gaXNOYU4oYSk/MDphfSxuZD1mdW5jdGlvbihhKXt2YXIgYj1hLmEoKSxjPSF0KGIucmVwbGFjZSgvXHhhMHxccy9nLAoiICIpLCIgIik7cShjLCJDb250cm9sUmVuZGVyZXIgaGFzIGFuIGludmFsaWQgY3NzIGNsYXNzOiAnIitiKyInIik7YS5iPXsxOmIrIi1kaXNhYmxlZCIsMjpiKyItaG92ZXIiLDQ6YisiLWFjdGl2ZSIsODpiKyItc2VsZWN0ZWQiLDE2OmIrIi1jaGVja2VkIiwzMjpiKyItZm9jdXNlZCIsNjQ6YisiLW9wZW4ifX07dmFyIE49ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO2lmKCFiKXtiPXRoaXMuY29uc3RydWN0b3I7Zm9yKHZhciBkO2I7KXtkPWJbamFdfHwoYltqYV09KytrYSk7aWYoZD1XY1tkXSlicmVhaztiPWIuaT9iLmkuY29uc3RydWN0b3I6bnVsbH1iPWQ/aWEoZC5SKT9kLlIoKTpuZXcgZDpudWxsfXRoaXMuQj1iO3RoaXMuYmE9dm9pZCAwIT09YT9hOm51bGx9O24oTixLKTtoPU4ucHJvdG90eXBlO2guYmE9bnVsbDtoLm89MDtoLnY9Mzk7aC5LPTA7aC5JYT0hMDtoLndhPW51bGw7aC55YT0hMDtoLmlhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CLmModGhpcyk7dGhpcy5hPWE7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmeGIoYSwiaGlkZGVuIiwhMCkpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hPXRoaXMuQi5nKHRoaXMsYSk7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5JYT0ibm9uZSIhPWEuc3R5bGUuZGlzcGxheX07CmguRD1mdW5jdGlvbigpe04uaS5ELmNhbGwodGhpcyk7dmFyIGE9TmModGhpcyk7cSh0aGlzKTtxKGEpO3RoaXMuaXNWaXNpYmxlKCl8fHhiKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fGxkKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy52JjgmJmxkKGEsOCwhISh0aGlzLm8mOCkpO3RoaXMudiYxNiYmbGQoYSwxNiwhISh0aGlzLm8mMTYpKTt0aGlzLnYmNjQmJmxkKGEsNjQsISEodGhpcy5vJjY0KSk7YT10aGlzLkI7U2ModGhpcykmJmdkKHRoaXMuZigpLGEuYSgpKyItcnRsIiwhMCk7dGhpcy5pc0VuYWJsZWQoKSYma2QodGhpcyx0aGlzLmlzVmlzaWJsZSgpKTtpZih0aGlzLnYmLTImJih0aGlzLnlhJiZvZCh0aGlzLCEwKSx0aGlzLnYmMzImJihhPXRoaXMuZigpKSkpe3ZhciBiPXRoaXMuV3x8KHRoaXMuVz1uZXcgSik7emMoYixhKTtIKEgoSChPYyh0aGlzKSxiLCJrZXkiLHRoaXMuZmEpLGEsImZvY3VzIix0aGlzLk5hKSxhLCJibHVyIiwKdGhpcy5GYSl9fTt2YXIgb2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYz1PYyhhKSxkPWEuZigpO2I/KEgoSChIKEgoYyxkLEYuTCxhLmthKSxkLFtGLk0sRi5hYV0sYS5sYSksZCwibW91c2VvdmVyIixhLkFhKSxkLCJtb3VzZW91dCIsYS56YSksYS5lYSE9Y2EmJkgoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fEgoYyxkLCJkYmxjbGljayIsYS5KYSksYS5nYXx8KGEuZ2E9bmV3IHBkKGEpLHpiKGEsbGEoQWIsYS5nYSkpKSkpOihxYyhxYyhxYyhxYyhjLGQsRi5MLGEua2EpLGQsW0YuTSxGLmFhXSxhLmxhKSxkLCJtb3VzZW92ZXIiLGEuQWEpLGQsIm1vdXNlb3V0IixhLnphKSxhLmVhIT1jYSYmcWMoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fHFjKGMsZCwiZGJsY2xpY2siLGEuSmEpLEFiKGEuZ2EpLGEuZ2E9bnVsbCkpfTsKTi5wcm90b3R5cGUuUD1mdW5jdGlvbigpe04uaS5QLmNhbGwodGhpcyk7dGhpcy5XJiZGYyh0aGlzLlcpO3RoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJmtkKHRoaXMsITEpfTtOLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7Ti5pLnUuY2FsbCh0aGlzKTt0aGlzLlcmJih0aGlzLlcuTigpLGRlbGV0ZSB0aGlzLlcpO2RlbGV0ZSB0aGlzLkI7dGhpcy5nYT10aGlzLndhPXRoaXMuYmE9bnVsbH07dmFyIGhkPWZ1bmN0aW9uKGEsYil7YS5iYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm8mMSl9OwpOLnByb3RvdHlwZS5aPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYjtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0VuYWJsZWQmJiFiLmlzRW5hYmxlZCgpfHwhTyh0aGlzLDEsIWEpfHwoYXx8KHFkKHRoaXMsITEpLFAodGhpcywhMSkpLHRoaXMuaXNWaXNpYmxlKCkmJmtkKHRoaXMsYSksUSh0aGlzLDEsIWEsITApKX07CnZhciBQPWZ1bmN0aW9uKGEsYil7TyhhLDIsYikmJlEoYSwyLGIpfSxxZD1mdW5jdGlvbihhLGIpe08oYSw0LGIpJiZRKGEsNCxiKX0scmQ9ZnVuY3Rpb24oYSxiKXtPKGEsOCxiKSYmUShhLDgsYil9LHNkPWZ1bmN0aW9uKGEsYil7TyhhLDY0LGIpJiZRKGEsNjQsYil9LFE9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIWQmJjE9PWIpYS5aKCFjKTtlbHNlIGlmKGEudiZiJiZjIT0hIShhLm8mYikpe3ZhciBlPWEuQjtpZihkPWEuZigpKShlPW1kKGUsYikpJiZnZChhLGUsYyksbGQoZCxiLGMpO2Eubz1jP2Eub3xiOmEubyZ+Yn19LHRkPWZ1bmN0aW9uKGEsYixjKXtpZihhLm0mJmEubyZiJiYhYyl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTshYyYmYS5vJmImJlEoYSxiLCExKTthLnY9Yz9hLnZ8YjphLnYmfmJ9LFI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hISgyNTUmYikmJiEhKGEudiZiKX0sTz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuISEoYS52JmIpJiYhIShhLm8mCmIpIT1jJiYoIShhLksmYil8fHVjKGEsS2MoYixjKSkpJiYhYS5VfTtoPU4ucHJvdG90eXBlO2guQWE9ZnVuY3Rpb24oYSl7KCFhLnJlbGF0ZWRUYXJnZXR8fCFwYih0aGlzLmYoKSxhLnJlbGF0ZWRUYXJnZXQpKSYmdWModGhpcywiZW50ZXIiKSYmdGhpcy5pc0VuYWJsZWQoKSYmUih0aGlzLDIpJiZQKHRoaXMsITApfTtoLnphPWZ1bmN0aW9uKGEpe2EucmVsYXRlZFRhcmdldCYmcGIodGhpcy5mKCksYS5yZWxhdGVkVGFyZ2V0KXx8IXVjKHRoaXMsImxlYXZlIil8fChSKHRoaXMsNCkmJnFkKHRoaXMsITEpLFIodGhpcywyKSYmUCh0aGlzLCExKSl9O2guZWE9Y2E7Cmgua2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSxPYihhKSYmISh5JiZ6JiZhLmN0cmxLZXkpKSl7Uih0aGlzLDQpJiZxZCh0aGlzLCEwKTt2YXIgYjtpZihiPXRoaXMuQil7dmFyIGM7Yj10aGlzLnYmMzImJihjPXRoaXMuZigpKT9zYihjKSYmdGIoYyk6ITF9YiYmdGhpcy5mKCkuZm9jdXMoKX0hT2IoYSl8fHkmJnomJmEuY3RybEtleXx8YS5nKCl9O2gubGE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSx0aGlzLm8mNCYmdWQodGhpcyxhKSYmUih0aGlzLDQpJiZxZCh0aGlzLCExKSl9O2guSmE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmdWQodGhpcyxhKX07CnZhciB1ZD1mdW5jdGlvbihhLGIpe2lmKFIoYSwxNikpe3ZhciBjPSEoYS5vJjE2KTtPKGEsMTYsYykmJlEoYSwxNixjKX1SKGEsOCkmJnJkKGEsITApO1IoYSw2NCkmJnNkKGEsIShhLm8mNjQpKTtjPW5ldyBFKCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuQT1iLkEpO3JldHVybiB1YyhhLGMpfTtOLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe1IodGhpcywzMikmJk8odGhpcywzMiwhMCkmJlEodGhpcywzMiwhMCl9O04ucHJvdG90eXBlLkZhPWZ1bmN0aW9uKCl7Uih0aGlzLDQpJiZxZCh0aGlzLCExKTtSKHRoaXMsMzIpJiZPKHRoaXMsMzIsITEpJiZRKHRoaXMsMzIsITEpfTsKTi5wcm90b3R5cGUuZmE9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJjEzPT1hLmMmJnVkKHRoaXMsYSk/KGEuZygpLGEuaigpLCEwKTohMX07aWYoIWlhKE4pKXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBjbGFzcyAiK04pO2lmKCFpYShNKSl0aHJvdyBFcnJvcigiSW52YWxpZCByZW5kZXJlciBjbGFzcyAiK00pO3ZhciB2ZD1OW2phXXx8KE5bamFdPSsra2EpO1djW3ZkXT1NO1ZjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIHBkPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9ITE7dGhpcy5jPW5ldyBvYyh0aGlzKTt6Yih0aGlzLGxhKEFiLHRoaXMuYykpO2E9TmModGhpcy5iKTtIKEgoSCh0aGlzLmMsYSxGLkwsdGhpcy5oKSxhLEYuTSx0aGlzLmopLGEsImNsaWNrIix0aGlzLmcpfTtuKHBkLEMpO3ZhciB3ZD0hdnx8OTw9TnVtYmVyKGliKTsKcGQucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXt0aGlzLmE9ITF9O3BkLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7dGhpcy5hPSEwfTt2YXIgeGQ9ZnVuY3Rpb24oYSxiKXtpZighd2QpcmV0dXJuIGEuYnV0dG9uPTAsYS50eXBlPWIsYTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudHMiKTtjLmluaXRNb3VzZUV2ZW50KGIsYS5idWJibGVzLGEuY2FuY2VsYWJsZSxhLnZpZXd8fG51bGwsYS5kZXRhaWwsYS5zY3JlZW5YLGEuc2NyZWVuWSxhLmNsaWVudFgsYS5jbGllbnRZLGEuY3RybEtleSxhLmFsdEtleSxhLnNoaWZ0S2V5LGEubWV0YUtleSwwLGEucmVsYXRlZFRhcmdldHx8bnVsbCk7cmV0dXJuIGN9OwpwZC5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXtpZih0aGlzLmEpdGhpcy5hPSExO2Vsc2V7dmFyIGI9YS5iLGM9Yi5idXR0b24sZD1iLnR5cGUsZT14ZChiLCJtb3VzZWRvd24iKTt0aGlzLmIua2EobmV3IEcoZSxhLmEpKTtlPXhkKGIsIm1vdXNldXAiKTt0aGlzLmIubGEobmV3IEcoZSxhLmEpKTt3ZHx8KGIuYnV0dG9uPWMsYi50eXBlPWQpfX07cGQucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt0aGlzLmI9bnVsbDtwZC5pLnUuY2FsbCh0aGlzKX07dmFyIFM9ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO3RoaXMuZGE9Ynx8WGMuUigpO3RoaXMuSD1hfHwidmVydGljYWwifTtuKFMsSyk7aD1TLnByb3RvdHlwZTtoLkRhPW51bGw7aC5jYT1udWxsO2guZGE9bnVsbDtoLkg9bnVsbDtoLlQ9ITA7aC5PPSEwO2gubD0tMTtoLnM9bnVsbDtoLlY9ITE7aC5JPW51bGw7dmFyIHlkPWZ1bmN0aW9uKGEpe3JldHVybiBhLkRhfHxhLmYoKX07aD1TLnByb3RvdHlwZTtoLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPXRoaXMuai5iKCJESVYiLHRoaXMuZGEuYyh0aGlzKS5qb2luKCIgIikpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKGEpe3JldHVybiJESVYiPT1hLnRhZ05hbWV9O2gudmE9ZnVuY3Rpb24oYSl7dGhpcy5hPSRjKHRoaXMuZGEsdGhpcyxhKTsibm9uZSI9PWEuc3R5bGUuZGlzcGxheSYmKHRoaXMuVD0hMSl9OwpoLkQ9ZnVuY3Rpb24oKXtTLmkuRC5jYWxsKHRoaXMpO1FjKHRoaXMsZnVuY3Rpb24oYil7Yi5tJiZ6ZCh0aGlzLGIpfSx0aGlzKTt2YXIgYT10aGlzLmYoKTtiZCh0aGlzLmRhLHRoaXMpO0FkKHRoaXMsdGhpcy5UKTtIKEgoSChIKEgoSChIKEgoT2ModGhpcyksdGhpcywiZW50ZXIiLHRoaXMuV2EpLHRoaXMsImhpZ2hsaWdodCIsdGhpcy5YYSksdGhpcywidW5oaWdobGlnaHQiLHRoaXMuY2IpLHRoaXMsIm9wZW4iLHRoaXMuWWEpLHRoaXMsImNsb3NlIix0aGlzLlVhKSxhLEYuTCx0aGlzLlNhKSxxYihhKSxbRi5NLEYuYWFdLHRoaXMuVmEpLGEsW0YuTCxGLk0sRi5hYSwibW91c2VvdmVyIiwibW91c2VvdXQiLCJjb250ZXh0bWVudSJdLHRoaXMuVGEpO0JkKHRoaXMpfTt2YXIgQmQ9ZnVuY3Rpb24oYSl7dmFyIGI9T2MoYSksYz15ZChhKTtIKEgoSChiLGMsImZvY3VzIixhLkhhKSxjLCJibHVyIixhLlFhKSxhLmNhfHwoYS5jYT1uZXcgSih5ZChhKSkpLCJrZXkiLGEuUmEpfTtoPVMucHJvdG90eXBlOwpoLlA9ZnVuY3Rpb24oKXtDZCh0aGlzLC0xKTt0aGlzLnMmJnNkKHRoaXMucywhMSk7dGhpcy5WPSExO1MuaS5QLmNhbGwodGhpcyl9O2gudT1mdW5jdGlvbigpe1MuaS51LmNhbGwodGhpcyk7dGhpcy5jYSYmKHRoaXMuY2EuTigpLHRoaXMuY2E9bnVsbCk7dGhpcy5kYT10aGlzLnM9dGhpcy5JPXRoaXMuRGE9bnVsbH07aC5XYT1mdW5jdGlvbigpe3JldHVybiEwfTsKaC5YYT1mdW5jdGlvbihhKXt2YXIgYj1UYyh0aGlzLGEudGFyZ2V0KTtpZigtMTxiJiZiIT10aGlzLmwpe3ZhciBjPUwodGhpcyx0aGlzLmwpO2MmJlAoYywhMSk7dGhpcy5sPWI7Yz1MKHRoaXMsdGhpcy5sKTt0aGlzLlYmJnFkKGMsITApO3RoaXMucyYmYyE9dGhpcy5zJiYoYy52JjY0P3NkKGMsITApOnNkKHRoaXMucywhMSkpfWI9dGhpcy5mKCk7cShiLCJUaGUgRE9NIGVsZW1lbnQgZm9yIHRoZSBjb250YWluZXIgY2Fubm90IGJlIG51bGwuIik7bnVsbCE9YS50YXJnZXQuZigpJiZ4YihiLCJhY3RpdmVkZXNjZW5kYW50IixhLnRhcmdldC5mKCkuaWQpfTtoLmNiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT1MKHRoaXMsdGhpcy5sKSYmKHRoaXMubD0tMSk7YT10aGlzLmYoKTtxKGEsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnJlbW92ZUF0dHJpYnV0ZSh3YigiYWN0aXZlZGVzY2VuZGFudCIpKX07CmguWWE9ZnVuY3Rpb24oYSl7KGE9YS50YXJnZXQpJiZhIT10aGlzLnMmJmEuYj09dGhpcyYmKHRoaXMucyYmc2QodGhpcy5zLCExKSx0aGlzLnM9YSl9O2guVWE9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMucyYmKHRoaXMucz1udWxsKTt2YXIgYj10aGlzLmYoKSxjPWEudGFyZ2V0LmYoKTtiJiZhLnRhcmdldC5vJjImJmMmJihhPSIiLGMmJihhPWMuaWQscShhLCJUaGUgYWN0aXZlIGVsZW1lbnQgc2hvdWxkIGhhdmUgYW4gaWQuIikpLHhiKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEpKX07aC5TYT1mdW5jdGlvbihhKXt0aGlzLk8mJih0aGlzLlY9ITApO3ZhciBiPXlkKHRoaXMpO2ImJnNiKGIpJiZ0YihiKT9iLmZvY3VzKCk6YS5nKCl9O2guVmE9ZnVuY3Rpb24oKXt0aGlzLlY9ITF9OwpoLlRhPWZ1bmN0aW9uKGEpe2E6e3ZhciBiPWEudGFyZ2V0O2lmKHRoaXMuSSlmb3IodmFyIGM9dGhpcy5mKCk7YiYmYiE9PWM7KXt2YXIgZD1iLmlkO2lmKGQgaW4gdGhpcy5JKXtiPXRoaXMuSVtkXTticmVhayBhfWI9Yi5wYXJlbnROb2RlfWI9bnVsbH1pZihiKXN3aXRjaChhLnR5cGUpe2Nhc2UgRi5MOmIua2EoYSk7YnJlYWs7Y2FzZSBGLk06Y2FzZSBGLmFhOmIubGEoYSk7YnJlYWs7Y2FzZSAibW91c2VvdmVyIjpiLkFhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3V0IjpiLnphKGEpO2JyZWFrO2Nhc2UgImNvbnRleHRtZW51IjpiLmVhKGEpfX07aC5IYT1mdW5jdGlvbigpe307aC5RYT1mdW5jdGlvbigpe0NkKHRoaXMsLTEpO3RoaXMuVj0hMTt0aGlzLnMmJnNkKHRoaXMucywhMSl9OwpoLlJhPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmlzRW5hYmxlZCgpJiZ0aGlzLmlzVmlzaWJsZSgpJiYoMCE9UmModGhpcyl8fHRoaXMuRGEpJiZEZCh0aGlzLGEpPyhhLmcoKSxhLmooKSwhMCk6ITF9Owp2YXIgRGQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1MKGEsYS5sKTtpZihjJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5mYSYmYy5mYShiKXx8YS5zJiZhLnMhPWMmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLnMuZmEmJmEucy5mYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuYyl7Y2FzZSAyNzp5ZChhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpFZChhKTticmVhaztjYXNlIDM1OkZkKGEpO2JyZWFrO2Nhc2UgMzg6aWYoInZlcnRpY2FsIj09YS5IKUdkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9IZChhKTpHZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoInZlcnRpY2FsIj09YS5IKUhkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9HZChhKTpIZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSx6ZD1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZigpO2M9Yy5pZHx8KGMuaWQ9TGMoYikpO2EuSXx8KGEuST17fSk7YS5JW2NdPWJ9O1MucHJvdG90eXBlLnNhPWZ1bmN0aW9uKGEsYil7Q2EoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtTLmkuc2EuY2FsbCh0aGlzLGEsYil9O1MucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEsYixjKXtDYShhLE4pO2EuS3w9MjthLkt8PTY0O3RkKGEsMzIsITEpO2EubSYmMCE9YS55YSYmb2QoYSwhMSk7YS55YT0hMTt2YXIgZD1hLmI9PXRoaXM/VGModGhpcyxhKTotMTtTLmkudGEuY2FsbCh0aGlzLGEsYixjKTthLm0mJnRoaXMubSYmemQodGhpcyxhKTthPWQ7LTE9PWEmJihhPVJjKHRoaXMpKTthPT10aGlzLmw/dGhpcy5sPU1hdGgubWluKFJjKHRoaXMpLTEsYik6YT50aGlzLmwmJmI8PXRoaXMubD90aGlzLmwrKzphPHRoaXMubCYmYj50aGlzLmwmJnRoaXMubC0tfTsKdmFyIGFkPWZ1bmN0aW9uKGEsYil7aWYoYS5mKCkpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5IPWJ9O1MucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O3ZhciBBZD1mdW5jdGlvbihhLGIpe2EuVD1iO3ZhciBjPWEuZigpO2MmJihjLnN0eWxlLmRpc3BsYXk9Yj8iIjoibm9uZSIsWWMoeWQoYSksYS5PJiZhLlQpKX07Uy5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT307Uy5wcm90b3R5cGUuWj1mdW5jdGlvbihhKXt0aGlzLk8hPWEmJnVjKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5PPSEwLFFjKHRoaXMsZnVuY3Rpb24oYil7Yi5MYT9kZWxldGUgYi5MYTpiLlooITApfSkpOihRYyh0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5aKCExKTpiLkxhPSEwfSksdGhpcy5WPXRoaXMuTz0hMSksWWMoeWQodGhpcyksYSYmdGhpcy5UKSl9Owp2YXIgQ2Q9ZnVuY3Rpb24oYSxiKXsoYj1MKGEsYikpP1AoYiwhMCk6LTE8YS5sJiZQKEwoYSxhLmwpLCExKX0sRWQ9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LFJjKGEpLTEpfSxGZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiAwPmI/Yy0xOmJ9LDApfSxIZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7cmV0dXJuKGIrMSklY30sYS5sKX0sR2Q9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe2ItLTtyZXR1cm4gMD5iP2MtMTpifSxhLmwpfSxJZD1mdW5jdGlvbihhLGIsYyl7Yz0wPmM/VGMoYSxhLnMpOmM7dmFyIGQ9UmMoYSk7Yz1iLmNhbGwoYSxjLGQpO2Zvcih2YXIgZT0wO2U8PWQ7KXt2YXIgZj1MKGEsYyksZztpZihnPWYpZz1mLmlzVmlzaWJsZSgpJiZmLmlzRW5hYmxlZCgpJiYhIShmLnYmMik7aWYoZyl7YS5FYShjKTticmVha31lKys7Yz1iLmNhbGwoYSxjLGQpfX07ClMucHJvdG90eXBlLkVhPWZ1bmN0aW9uKGEpe0NkKHRoaXMsYSl9O3ZhciBUPWZ1bmN0aW9uKCl7fTtuKFQsTSk7ZGEoVCk7VC5wcm90b3R5cGUuYT1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYiJ9O1QucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXtyZXR1cm4idGFiIn07VC5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYj1ULmkuYy5jYWxsKHRoaXMsYSk7KGE9YS5QYSkmJmImJihiLnRpdGxlPWF8fCIiKTtyZXR1cm4gYn07VC5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIpe2I9VC5pLmcuY2FsbCh0aGlzLGEsYik7dmFyIGM9Yi50aXRsZXx8IiI7YyYmKGEuUGE9Yyk7YS5vJjgmJihjPWEuYikmJmlhKGMuRykmJihRKGEsOCwhMSksYy5HKGEpKTtyZXR1cm4gYn07dmFyIEpkPWZ1bmN0aW9uKGEsYixjKXtOLmNhbGwodGhpcyxhLGJ8fFQuUigpLGMpO3RkKHRoaXMsOCwhMCk7dGhpcy5LfD05fTtuKEpkLE4pO1ZjKCJnb29nLXRhYiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEpkKG51bGwpfSk7dmFyIFU9ZnVuY3Rpb24oKXt0aGlzLmg9InRhYmxpc3QifTtuKFUsWGMpO2RhKFUpO1UucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWItYmFyIn07VS5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIsYyl7dGhpcy5qfHwodGhpcy5hfHxLZCh0aGlzKSx0aGlzLmo9c2EodGhpcy5hKSk7dmFyIGQ9dGhpcy5qW2JdO2Q/KGFkKGEsTGQoZCkpLGEuQj1kKTpVLmkuZy5jYWxsKHRoaXMsYSxiLGMpfTtVLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPVUuaS5jLmNhbGwodGhpcyxhKTt0aGlzLmF8fEtkKHRoaXMpO2IucHVzaCh0aGlzLmFbYS5CXSk7cmV0dXJuIGJ9O3ZhciBLZD1mdW5jdGlvbihhKXt2YXIgYj1hLmIoKTthLmE9e3RvcDpiKyItdG9wIixib3R0b206YisiLWJvdHRvbSIsc3RhcnQ6YisiLXN0YXJ0IixlbmQ6YisiLWVuZCJ9fTt2YXIgVj1mdW5jdGlvbihhLGIsYyl7YT1hfHwidG9wIjthZCh0aGlzLExkKGEpKTt0aGlzLkI9YTtTLmNhbGwodGhpcyx0aGlzLkgsYnx8VS5SKCksYyk7TWQodGhpcyl9O24oVixTKTtoPVYucHJvdG90eXBlO2guQz1udWxsO2guRD1mdW5jdGlvbigpe1YuaS5ELmNhbGwodGhpcyk7TWQodGhpcyl9O2gudT1mdW5jdGlvbigpe1YuaS51LmNhbGwodGhpcyk7dGhpcy5DPW51bGx9O2guRWE9ZnVuY3Rpb24oYSl7Vi5pLkVhLmNhbGwodGhpcyxhKTt0aGlzLkcoTCh0aGlzLGEpKX07aC5HPWZ1bmN0aW9uKGEpe2E/cmQoYSwhMCk6dGhpcy5DJiZyZCh0aGlzLkMsITEpfTsKdmFyIE5kPWZ1bmN0aW9uKGEsYil7aWYoYiYmYj09YS5DKXtmb3IodmFyIGM9VGMoYSxiKSxkPWMtMTtiPUwoYSxkKTtkLS0pe3ZhciBlPWI7aWYoZS5pc1Zpc2libGUoKSYmZS5pc0VuYWJsZWQoKSl7YS5HKGIpO3JldHVybn19Zm9yKGMrPTE7Yj1MKGEsYyk7YysrKWlmKGQ9YixkLmlzVmlzaWJsZSgpJiZkLmlzRW5hYmxlZCgpKXthLkcoYik7cmV0dXJufWEuRyhudWxsKX19O2g9Vi5wcm90b3R5cGU7aC5hYj1mdW5jdGlvbihhKXt0aGlzLkMmJnRoaXMuQyE9YS50YXJnZXQmJnJkKHRoaXMuQywhMSk7dGhpcy5DPWEudGFyZ2V0fTtoLmJiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT10aGlzLkMmJih0aGlzLkM9bnVsbCl9O2guWmE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guJGE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guSGE9ZnVuY3Rpb24oKXtMKHRoaXMsdGhpcy5sKXx8Q2QodGhpcyxUYyh0aGlzLHRoaXMuQ3x8TCh0aGlzLDApKSl9Owp2YXIgTWQ9ZnVuY3Rpb24oYSl7SChIKEgoSChPYyhhKSxhLCJzZWxlY3QiLGEuYWIpLGEsInVuc2VsZWN0IixhLmJiKSxhLCJkaXNhYmxlIixhLlphKSxhLCJoaWRlIixhLiRhKX0sTGQ9ZnVuY3Rpb24oYSl7cmV0dXJuInN0YXJ0Ij09YXx8ImVuZCI9PWE/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O1ZjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBWfSk7ZnVuY3Rpb24gT2QoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIFBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgZz1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIrZyk7Zm9yKHZhciBrPVtdLHA9YmEoYyksdz1wLm5leHQoKTshdy5kb25lO3c9cC5uZXh0KCkpe3c9dy52YWx1ZTt2YXIgQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKQi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO0IudGV4dENvbnRlbnQ9dztmLmFwcGVuZENoaWxkKEIpO2sucHVzaChCKX0iYm90dG9tIiE9ZyYmZS5hcHBlbmRDaGlsZChmKTtwPW51bGw7aWYoInRvcCI9PWd8fCJib3R0b20iPT1nKXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTsidG9wIj09ZyYmcCYmZS5hcHBlbmRDaGlsZChwKTtCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0IuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciByYT1bXTtjPWJhKGMpO2Zvcih3PWMubmV4dCgpOyF3LmRvbmU7dz1jLm5leHQoKSl3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHcuaWQ9ZS5pZCsiX2NvbnRlbnRfIityYS5sZW5ndGgsdy5zdHlsZS5kaXNwbGF5PSJub25lIixCLmFwcGVuZENoaWxkKHcpLHJhLnB1c2godyk7ZS5hcHBlbmRDaGlsZChCKTsiYm90dG9tIj09ZyYmKHAmJgplLmFwcGVuZENoaWxkKHApLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBYPW5ldyBWKGcpO1BjKFgsZik7dmFyIFk9LTE7ZGMoWCwic2VsZWN0IixmdW5jdGlvbihaKXtaPWsuaW5kZXhPZihaLnRhcmdldC5mKCkpO1ohPVkmJigwPD1ZJiZZPHJhLmxlbmd0aCYmKHJhW1ldLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFk9LTEpLDA8PVomJlo8cmEubGVuZ3RoJiYoWT1aLHJhW1ldLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksWC5HKEwoWCxZKSkpfSk7WC5HKEwoWCxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFope1guRyhMKFgsWikpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChPZChhKSl9LFFkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sVz1sOwpRZFswXWluIFd8fCJ1bmRlZmluZWQiPT10eXBlb2YgVy5leGVjU2NyaXB0fHxXLmV4ZWNTY3JpcHQoInZhciAiK1FkWzBdKTtmb3IodmFyIFJkO1FkLmxlbmd0aCYmKFJkPVFkLnNoaWZ0KCkpOylRZC5sZW5ndGh8fHZvaWQgMD09PVBkP1dbUmRdJiZXW1JkXSE9PU9iamVjdC5wcm90b3R5cGVbUmRdP1c9V1tSZF06Vz1XW1JkXT17fTpXW1JkXT1QZDt9KS5jYWxsKHRoaXMpOwovLyBjbGFuZy1mb3JtYXQgb24K", + "headers": [ + [ + "content-type", + "application/javascript" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + } + } + }, + "executionInfo": { + "elapsed": 5520, + "status": "ok", + "timestamp": 1600709886282, + "user": { + "displayName": "Evgeny Skvortsov", + "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhiQjODaOVLfYnUuWS9rB3LRntzJDM0hqElzsUkdQ=s64", + "userId": "11510585406840398626" + }, + "user_tz": 420 + }, + "id": "ICf5qvL_hHkL", + "outputId": "202bbd15-12b5-4b14-b7de-f53da37e8cd3" + }, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"31e8cf92-fc31-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id82\", \"tabNames\": [\"BabyNamesSample\", \"TopNameByYear\", \"PlotNames\", \"Graph\", \"TotalBabies\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_5cf06cda35" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"31e91b50-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id82\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_43c8ec8edc" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"31ea4728-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_1e3a5add4b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"31ea9520-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id82_content_5\");\n", + "//# sourceURL=js_651a964f45" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"31eae0a2-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"31ea9520-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_0027a5eb8c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"31eb1cca-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id82\"].setSelectedTabIndex(5);\n", + "//# sourceURL=js_7c23fc89e6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running BabyNamesSample\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"31eca446-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"31ea4728-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_3146cd6326" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"31ee2622-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_7567f1954e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_0", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"31ee677c-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id82_content_0\");\n", + "//# sourceURL=js_e990fb730f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_0", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"31eeb286-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"31ee677c-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_bf6ebc9e93" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_0", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"31eef2be-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id82\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_da988c9ac7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_0", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_0", + "outputarea_id82", + "outputarea_id83", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_0", + "outputarea_id82", + "outputarea_id83", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_0", + "outputarea_id82", + "outputarea_id83", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"31f1aebe-fc31-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id83\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_944aff7043" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_0", + "outputarea_id82", + "outputarea_id83", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"31f1f676-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id83\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_1f68722dad" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_0", + "outputarea_id82", + "outputarea_id83", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"31f311e6-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_a0e83fbeae" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_0", + "id83_content_0", + "outputarea_id82", + "outputarea_id83", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"31f34a1c-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id83_content_0\");\n", + "//# sourceURL=js_534203e074" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_0", + "id83_content_0", + "outputarea_id82", + "outputarea_id83", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"31f38694-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"31f34a1c-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_7d5a373832" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_0", + "id83_content_0", + "outputarea_id82", + "outputarea_id83", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"31f3c050-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id83\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_4bd5e17a9e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_0", + "id83_content_0", + "outputarea_id82", + "outputarea_id83", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mBabyNamesSample_sql\u001b[0m variable.\n", + "SELECT\n", + " bigquerypublicdata_usa_names_usa_1910_current.*\n", + "FROM\n", + " `bigquery-public-data.usa_names.usa_1910_current` AS bigquerypublicdata_usa_names_usa_1910_current LIMIT 10;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"31f49aca-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"31f311e6-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_e2666ef7e4" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_0", + "id83_content_0", + "outputarea_id82", + "outputarea_id83", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"31f5a6b8-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"31ee2622-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_002eb3aa95" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_0", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"31f71c32-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_e75dceffc0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"31f76926-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id82_content_5\");\n", + "//# sourceURL=js_d9a5eba78c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"31f7ae4a-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"31f76926-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_1d7d6e06f3" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"31f7f5c6-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id82\"].setSelectedTabIndex(5);\n", + "//# sourceURL=js_1a92db5762" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"3262df30-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"31f71c32-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_3fed9a1ed0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"3264b26a-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_976de2832e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_0", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"3265153e-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id82_content_0\");\n", + "//# sourceURL=js_1aeaa77518" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_0", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"32657e52-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"3265153e-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_5c9dda0b2e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_0", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"3265cdb2-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id82\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_58243ff4a3" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_0", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"32673ba2-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_6276e1a81b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_0", + "id83_content_1", + "outputarea_id82", + "outputarea_id83", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"32679728-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id83_content_1\");\n", + "//# sourceURL=js_a9e07b5d70" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_0", + "id83_content_1", + "outputarea_id82", + "outputarea_id83", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"32680c62-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"32679728-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_d6dee44413" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_0", + "id83_content_1", + "outputarea_id82", + "outputarea_id83", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"326864e6-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id83\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_70adcbe205" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_0", + "id83_content_1", + "outputarea_id82", + "outputarea_id83", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mBabyNamesSample\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
stategenderyearnamenumber
0MIF1910Helen368
1MIF1910Mary349
2MIF1910Margaret272
3MIF1910Dorothy265
4MIF1910Ruth212
5MIF1910Florence164
6MIF1910Mildred159
7MIF1910Frances155
8MIF1910Anna143
9MIF1910Marie143
\n", + "
" + ], + "text/plain": [ + " state gender year name number\n", + "0 MI F 1910 Helen 368\n", + "1 MI F 1910 Mary 349\n", + "2 MI F 1910 Margaret 272\n", + "3 MI F 1910 Dorothy 265\n", + "4 MI F 1910 Ruth 212\n", + "5 MI F 1910 Florence 164\n", + "6 MI F 1910 Mildred 159\n", + "7 MI F 1910 Frances 155\n", + "8 MI F 1910 Anna 143\n", + "9 MI F 1910 Marie 143" + ] + }, + "metadata": { + "tags": [ + "id82_content_0", + "id83_content_1", + "outputarea_id82", + "outputarea_id83", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"326e40d2-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"32673ba2-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_49590a513f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_0", + "id83_content_1", + "outputarea_id82", + "outputarea_id83", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"326fb49e-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"3264b26a-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_0908a28944" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_0", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"327164a6-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_7bf7a7e421" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"3271bbc2-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id82_content_5\");\n", + "//# sourceURL=js_16c593fa41" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"32720e56-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"3271bbc2-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_24b4969d4a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"3272583e-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id82\"].setSelectedTabIndex(5);\n", + "//# sourceURL=js_df33773348" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running TopNameByYear\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"3275a322-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"327164a6-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_160f76809e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"327722d8-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_f00efe5502" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_1", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"327777ba-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id82_content_1\");\n", + "//# sourceURL=js_970da49e13" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_1", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"3277c08a-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"327777ba-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_3142cb0d5f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_1", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"32780f22-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id82\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_a42c910260" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_1", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_1", + "outputarea_id82", + "outputarea_id84", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_1", + "outputarea_id82", + "outputarea_id84", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_1", + "outputarea_id82", + "outputarea_id84", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"3279cdf8-fc31-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id84\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_a884736405" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_1", + "outputarea_id82", + "outputarea_id84", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"327a143e-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id84\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_d9f89e3825" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_1", + "outputarea_id82", + "outputarea_id84", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"327b5920-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_48dd78554c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_1", + "id84_content_0", + "outputarea_id82", + "outputarea_id84", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"327ba4ac-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id84_content_0\");\n", + "//# sourceURL=js_7f3444e204" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_1", + "id84_content_0", + "outputarea_id82", + "outputarea_id84", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"327bf308-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"327ba4ac-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_843380b9fe" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_1", + "id84_content_0", + "outputarea_id82", + "outputarea_id84", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"327c3ac0-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id84\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_5fe196e134" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_1", + "id84_content_0", + "outputarea_id82", + "outputarea_id84", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mTopNameByYear_sql\u001b[0m variable.\n", + "WITH t_0_NameCountByYear AS (SELECT\n", + " bigquerypublicdata_usa_names_usa_1910_current.name AS name,\n", + " bigquerypublicdata_usa_names_usa_1910_current.year AS year,\n", + " SUM(bigquerypublicdata_usa_names_usa_1910_current.number) AS logica_value\n", + "FROM\n", + " `bigquery-public-data.usa_names.usa_1910_current` AS bigquerypublicdata_usa_names_usa_1910_current\n", + "GROUP BY name, year)\n", + "SELECT\n", + " NameCountByYear.year AS col0,\n", + " ARRAY_AGG((STRUCT(NameCountByYear.name AS arg, NameCountByYear.logica_value as value)).arg order by (STRUCT(NameCountByYear.name AS arg, NameCountByYear.logica_value as value)).value desc limit 1)[OFFSET(0)] AS logica_value\n", + "FROM\n", + " t_0_NameCountByYear AS NameCountByYear\n", + "GROUP BY col0 ORDER BY year;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"327d55ae-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"327b5920-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_2e39830ede" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_1", + "id84_content_0", + "outputarea_id82", + "outputarea_id84", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"327ea0f8-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"327722d8-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_050d87dad1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_1", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"32802964-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_112e313fa4" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"32807388-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id82_content_5\");\n", + "//# sourceURL=js_06c7689b92" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"3280c518-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"32807388-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_4e771742bb" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"328111e4-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id82\"].setSelectedTabIndex(5);\n", + "//# sourceURL=js_e7549e528c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33086bbc-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"32802964-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_54acf4e4e7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"330b903a-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_ee41cc618e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_1", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"330c0f38-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id82_content_1\");\n", + "//# sourceURL=js_8e10ac1fd7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_1", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"330c7aa4-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"330c0f38-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_9d07cf4016" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_1", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"330cec14-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id82\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_4e58ee267f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_1", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"330e5d7e-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_6b11853598" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_1", + "id84_content_1", + "outputarea_id82", + "outputarea_id84", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"330ea07c-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id84_content_1\");\n", + "//# sourceURL=js_24c3681dba" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_1", + "id84_content_1", + "outputarea_id82", + "outputarea_id84", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"330ee3a2-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"330ea07c-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_b594502eed" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_1", + "id84_content_1", + "outputarea_id82", + "outputarea_id84", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"330f22f4-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id84\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_9042d2505a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_1", + "id84_content_1", + "outputarea_id82", + "outputarea_id84", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mTopNameByYear\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0logica_value
01910Mary
11911Mary
21912Mary
31913Mary
41914Mary
.........
1052015Emma
1062016Emma
1072017Emma
1082018Liam
1092019Liam
\n", + "

110 rows \u00d7 2 columns

\n", + "
" + ], + "text/plain": [ + " col0 logica_value\n", + "0 1910 Mary\n", + "1 1911 Mary\n", + "2 1912 Mary\n", + "3 1913 Mary\n", + "4 1914 Mary\n", + ".. ... ...\n", + "105 2015 Emma\n", + "106 2016 Emma\n", + "107 2017 Emma\n", + "108 2018 Liam\n", + "109 2019 Liam\n", + "\n", + "[110 rows x 2 columns]" + ] + }, + "metadata": { + "tags": [ + "id82_content_1", + "id84_content_1", + "outputarea_id82", + "outputarea_id84", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"3312d2f0-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"330e5d7e-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_477b062b2e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_1", + "id84_content_1", + "outputarea_id82", + "outputarea_id84", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"3313fb30-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"330b903a-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_e6ecf3b8ce" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_1", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"331559e4-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_a0115832f6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"3315a52a-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id82_content_5\");\n", + "//# sourceURL=js_f82a445937" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"3315edbe-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"3315a52a-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_e0af422e83" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33163012-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id82\"].setSelectedTabIndex(5);\n", + "//# sourceURL=js_938ccae37d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running PlotNames\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"33190152-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"331559e4-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_0a2c37f119" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"331a8a36-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_828644f495" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_2", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"331ae31e-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id82_content_2\");\n", + "//# sourceURL=js_df47f7db52" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_2", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"331b2e5a-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"331ae31e-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_20d8b09d8f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_2", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"331b7310-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id82\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_3b5cd54af5" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_2", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_2", + "outputarea_id82", + "outputarea_id85", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_2", + "outputarea_id82", + "outputarea_id85", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_2", + "outputarea_id82", + "outputarea_id85", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"331d2476-fc31-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id85\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_da20456c7b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_2", + "outputarea_id82", + "outputarea_id85", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"331d6c92-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id85\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_328e1b72d1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_2", + "outputarea_id82", + "outputarea_id85", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"331eae54-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_07aa0162ef" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_2", + "id85_content_0", + "outputarea_id82", + "outputarea_id85", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"331ef85a-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id85_content_0\");\n", + "//# sourceURL=js_a442f75450" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_2", + "id85_content_0", + "outputarea_id82", + "outputarea_id85", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"331f486e-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"331ef85a-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_2766f171ed" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_2", + "id85_content_0", + "outputarea_id82", + "outputarea_id85", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"331f8ed2-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id85\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_806a0d1402" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_2", + "id85_content_0", + "outputarea_id82", + "outputarea_id85", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mPlotNames_sql\u001b[0m variable.\n", + "WITH t_1_NameCountByYear AS (SELECT\n", + " bigquerypublicdata_usa_names_usa_1910_current.name AS name,\n", + " bigquerypublicdata_usa_names_usa_1910_current.year AS year,\n", + " SUM(bigquerypublicdata_usa_names_usa_1910_current.number) AS logica_value\n", + "FROM\n", + " `bigquery-public-data.usa_names.usa_1910_current` AS bigquerypublicdata_usa_names_usa_1910_current\n", + "GROUP BY name, year),\n", + "t_0_TopNameByYear AS (SELECT\n", + " NameCountByYear.year AS col0,\n", + " ARRAY_AGG((STRUCT(NameCountByYear.name AS arg, NameCountByYear.logica_value as value)).arg order by (STRUCT(NameCountByYear.name AS arg, NameCountByYear.logica_value as value)).value desc limit 1)[OFFSET(0)] AS logica_value\n", + "FROM\n", + " t_1_NameCountByYear AS NameCountByYear\n", + "GROUP BY col0 ORDER BY year)\n", + "SELECT\n", + " TopNameByYear.logica_value AS name\n", + "FROM\n", + " t_0_TopNameByYear AS TopNameByYear\n", + "GROUP BY name;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"3320a402-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"331eae54-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_21d3e08a2e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_2", + "id85_content_0", + "outputarea_id82", + "outputarea_id85", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"3321dcb4-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"331a8a36-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_601aca8899" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_2", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"3323ca1a-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_58afb60e11" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"3324192a-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id82_content_5\");\n", + "//# sourceURL=js_ec821494c0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33245b9c-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"3324192a-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_e5776efb4e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33249e86-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id82\"].setSelectedTabIndex(5);\n", + "//# sourceURL=js_82b4a19ade" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33b522ee-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"3323ca1a-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_e6686e512d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33b89046-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_8a27e693db" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_2", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33b8fe28-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id82_content_2\");\n", + "//# sourceURL=js_bcf9986e34" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_2", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33b97934-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"33b8fe28-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_fc69e1bf5c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_2", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33b9fdaa-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id82\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_fffd308a80" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_2", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33bb7036-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_34cf7e2c78" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_2", + "id85_content_1", + "outputarea_id82", + "outputarea_id85", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33bbde36-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id85_content_1\");\n", + "//# sourceURL=js_2a1d2bab1d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_2", + "id85_content_1", + "outputarea_id82", + "outputarea_id85", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33bc3778-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"33bbde36-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_ba4d06a233" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_2", + "id85_content_1", + "outputarea_id82", + "outputarea_id85", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33bc9a9c-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id85\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_025fc90180" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_2", + "id85_content_1", + "outputarea_id82", + "outputarea_id85", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mPlotNames\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
name
0Mary
1Robert
2James
3Linda
4Michael
5David
6Jacob
7Isabella
8Sophia
9Emma
10Liam
\n", + "
" + ], + "text/plain": [ + " name\n", + "0 Mary\n", + "1 Robert\n", + "2 James\n", + "3 Linda\n", + "4 Michael\n", + "5 David\n", + "6 Jacob\n", + "7 Isabella\n", + "8 Sophia\n", + "9 Emma\n", + "10 Liam" + ] + }, + "metadata": { + "tags": [ + "id82_content_2", + "id85_content_1", + "outputarea_id82", + "outputarea_id85", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33bfefd0-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"33bb7036-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_3c324bbcb3" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_2", + "id85_content_1", + "outputarea_id82", + "outputarea_id85", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33c1100e-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"33b89046-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_15526f7436" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_2", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33c25e50-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_1f12b4839d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33c2a432-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id82_content_5\");\n", + "//# sourceURL=js_6de278fb85" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33c2e744-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"33c2a432-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_d11aeb211c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33c32880-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id82\"].setSelectedTabIndex(5);\n", + "//# sourceURL=js_3ceee7a884" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running Graph\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"33c72124-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"33c25e50-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_37a21bf3e7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33c873e4-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_ab16910d88" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_3", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33c8b6e2-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id82_content_3\");\n", + "//# sourceURL=js_8a9afc63d5" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_3", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33c8fc6a-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"33c8b6e2-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_5cde67b712" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_3", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33c93cf2-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id82\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_5f2cf16b78" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_3", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_3", + "outputarea_id82", + "outputarea_id86", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_3", + "outputarea_id82", + "outputarea_id86", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_3", + "outputarea_id82", + "outputarea_id86", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33cb41f0-fc31-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id86\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_c3d2820471" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_3", + "outputarea_id82", + "outputarea_id86", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33cb7ed6-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id86\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_ae99636fec" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_3", + "outputarea_id82", + "outputarea_id86", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33cd0210-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_8af43d10cc" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_3", + "id86_content_0", + "outputarea_id82", + "outputarea_id86", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33cd46c6-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id86_content_0\");\n", + "//# sourceURL=js_86c6569436" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_3", + "id86_content_0", + "outputarea_id82", + "outputarea_id86", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33cd92b6-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"33cd46c6-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_abefde8577" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_3", + "id86_content_0", + "outputarea_id82", + "outputarea_id86", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33cdde1a-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id86\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_a024a90f25" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_3", + "id86_content_0", + "outputarea_id82", + "outputarea_id86", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mGraph_sql\u001b[0m variable.\n", + "WITH t_3_NameCountByYear AS (SELECT\n", + " bigquerypublicdata_usa_names_usa_1910_current.name AS name,\n", + " bigquerypublicdata_usa_names_usa_1910_current.year AS year,\n", + " SUM(bigquerypublicdata_usa_names_usa_1910_current.number) AS logica_value\n", + "FROM\n", + " `bigquery-public-data.usa_names.usa_1910_current` AS bigquerypublicdata_usa_names_usa_1910_current\n", + "GROUP BY name, year),\n", + "t_1_TopNameByYear AS (SELECT\n", + " t_2_NameCountByYear.year AS col0,\n", + " ARRAY_AGG((STRUCT(t_2_NameCountByYear.name AS arg, t_2_NameCountByYear.logica_value as value)).arg order by (STRUCT(t_2_NameCountByYear.name AS arg, t_2_NameCountByYear.logica_value as value)).value desc limit 1)[OFFSET(0)] AS logica_value\n", + "FROM\n", + " t_3_NameCountByYear AS t_2_NameCountByYear\n", + "GROUP BY col0 ORDER BY year),\n", + "t_0_PlotNames AS (SELECT\n", + " TopNameByYear.logica_value AS name\n", + "FROM\n", + " t_1_TopNameByYear AS TopNameByYear\n", + "GROUP BY name)\n", + "SELECT\n", + " PlotNames.name AS name,\n", + " NameCountByYear.year AS year,\n", + " NameCountByYear.logica_value AS count\n", + "FROM\n", + " t_0_PlotNames AS PlotNames, t_3_NameCountByYear AS NameCountByYear\n", + "WHERE\n", + " NameCountByYear.name = PlotNames.name ORDER BY name, year;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"33cef11a-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"33cd0210-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_e78e9cc2a5" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_3", + "id86_content_0", + "outputarea_id82", + "outputarea_id86", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33d00384-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"33c873e4-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_2db195822e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_3", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33d15fe0-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_4cbb0c79cd" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33d1ad42-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id82_content_5\");\n", + "//# sourceURL=js_73548b3c25" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33d1ef32-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"33d1ad42-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_fe4bc8e3da" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"33d2379e-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id82\"].setSelectedTabIndex(5);\n", + "//# sourceURL=js_7bac9c3d08" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"3448493e-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"33d15fe0-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_141e94ffb4" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"3449db50-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b814a366ab" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_3", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"344a1624-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id82_content_3\");\n", + "//# sourceURL=js_a87292a823" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_3", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"344a5b20-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"344a1624-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_b560431880" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_3", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"344a9086-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id82\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_bb068c5cb8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_3", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"344b5818-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_00c4dd6162" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_3", + "id86_content_1", + "outputarea_id82", + "outputarea_id86", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"344b8d24-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id86_content_1\");\n", + "//# sourceURL=js_b66179ba47" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_3", + "id86_content_1", + "outputarea_id82", + "outputarea_id86", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"344bc35c-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"344b8d24-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_3bddf3b18f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_3", + "id86_content_1", + "outputarea_id82", + "outputarea_id86", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"344c101e-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id86\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_b8fa6f5a3d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_3", + "id86_content_1", + "outputarea_id82", + "outputarea_id86", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mGraph\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nameyearcount
0David19101243
1David19111535
2David19122851
3David19133278
4David19144251
............
1161Sophia201517430
1162Sophia201616144
1163Sophia201714899
1164Sophia201813977
1165Sophia201913714
\n", + "

1166 rows \u00d7 3 columns

\n", + "
" + ], + "text/plain": [ + " name year count\n", + "0 David 1910 1243\n", + "1 David 1911 1535\n", + "2 David 1912 2851\n", + "3 David 1913 3278\n", + "4 David 1914 4251\n", + "... ... ... ...\n", + "1161 Sophia 2015 17430\n", + "1162 Sophia 2016 16144\n", + "1163 Sophia 2017 14899\n", + "1164 Sophia 2018 13977\n", + "1165 Sophia 2019 13714\n", + "\n", + "[1166 rows x 3 columns]" + ] + }, + "metadata": { + "tags": [ + "id82_content_3", + "id86_content_1", + "outputarea_id82", + "outputarea_id86", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"3450a282-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"344b5818-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_3bb0ba8335" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_3", + "id86_content_1", + "outputarea_id82", + "outputarea_id86", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"3451c54a-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"3449db50-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_b1f8d97131" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_3", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"34535496-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_5c3f64e37c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"3453b760-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id82_content_5\");\n", + "//# sourceURL=js_8830ba332a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"34540382-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"3453b760-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_e9e135f5ef" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"34544680-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id82\"].setSelectedTabIndex(5);\n", + "//# sourceURL=js_14407c8edf" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running TotalBabies\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"34560c36-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"34535496-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_e87d8e4abc" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"345772c4-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_7c2d858c15" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_4", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"3457bd74-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id82_content_4\");\n", + "//# sourceURL=js_715e79a4b9" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_4", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"34580072-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"3457bd74-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_f0fc215e85" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_4", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"34584564-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id82\"].setSelectedTabIndex(4);\n", + "//# sourceURL=js_451c87b646" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_4", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_4", + "outputarea_id82", + "outputarea_id87", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_4", + "outputarea_id82", + "outputarea_id87", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_4", + "outputarea_id82", + "outputarea_id87", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"3459dbe0-fc31-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id87\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_43c044f6cf" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_4", + "outputarea_id82", + "outputarea_id87", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"345a2302-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id87\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_3e5c82da0c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_4", + "outputarea_id82", + "outputarea_id87", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"345b461a-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_84c70ee7b7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_4", + "id87_content_0", + "outputarea_id82", + "outputarea_id87", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"345b8c24-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id87_content_0\");\n", + "//# sourceURL=js_26e9845f21" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_4", + "id87_content_0", + "outputarea_id82", + "outputarea_id87", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"345bd13e-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"345b8c24-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_991945f745" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_4", + "id87_content_0", + "outputarea_id82", + "outputarea_id87", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"345c1716-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id87\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_603e08e0f0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_4", + "id87_content_0", + "outputarea_id82", + "outputarea_id87", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mTotalBabies_sql\u001b[0m variable.\n", + "SELECT\n", + " bigquerypublicdata_usa_names_usa_1910_current.year AS year,\n", + " SUM(bigquerypublicdata_usa_names_usa_1910_current.number) AS logica_value\n", + "FROM\n", + " `bigquery-public-data.usa_names.usa_1910_current` AS bigquerypublicdata_usa_names_usa_1910_current\n", + "GROUP BY year ORDER BY year;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"345d1922-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"345b461a-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_459fd3302e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_4", + "id87_content_0", + "outputarea_id82", + "outputarea_id87", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"345e2a9c-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"345772c4-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_a690c98d07" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_4", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"345f7e88-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_ebd19c971f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"345fc2d0-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id82_content_5\");\n", + "//# sourceURL=js_3eadb17fcf" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"34600448-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"345fc2d0-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_40ec52f5db" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"34604886-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id82\"].setSelectedTabIndex(5);\n", + "//# sourceURL=js_f116fafac1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"34e4a8ec-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"345f7e88-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_d967117fea" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_5", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"34e7c9c8-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b53c954a4e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_4", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"34e83070-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id82_content_4\");\n", + "//# sourceURL=js_a38d6935f0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_4", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"34e8790e-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"34e83070-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_ee6791e336" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_4", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"34e8d8ea-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id82\"].setSelectedTabIndex(4);\n", + "//# sourceURL=js_be0c442507" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_4", + "outputarea_id82" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"34ea2506-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_25250e4670" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_4", + "id87_content_1", + "outputarea_id82", + "outputarea_id87", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"34ea8492-fc31-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id87_content_1\");\n", + "//# sourceURL=js_5f45d0ca6e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_4", + "id87_content_1", + "outputarea_id82", + "outputarea_id87", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"34eadfb4-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"34ea8492-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_78543b3695" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_4", + "id87_content_1", + "outputarea_id82", + "outputarea_id87", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"34eb2b7c-fc31-11ea-b2c3-0242ac1c0002\"] = window[\"id87\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_c342174cfe" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_4", + "id87_content_1", + "outputarea_id82", + "outputarea_id87", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mTotalBabies\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
yearlogica_value
01910516313
11911565817
21912888002
319131028578
419141293348
.........
10520153134011
10620163098778
10720173008598
10820182949060
10920192891772
\n", + "

110 rows \u00d7 2 columns

\n", + "
" + ], + "text/plain": [ + " year logica_value\n", + "0 1910 516313\n", + "1 1911 565817\n", + "2 1912 888002\n", + "3 1913 1028578\n", + "4 1914 1293348\n", + ".. ... ...\n", + "105 2015 3134011\n", + "106 2016 3098778\n", + "107 2017 3008598\n", + "108 2018 2949060\n", + "109 2019 2891772\n", + "\n", + "[110 rows x 2 columns]" + ] + }, + "metadata": { + "tags": [ + "id82_content_4", + "id87_content_1", + "outputarea_id82", + "outputarea_id87", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"34ef8fbe-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"34ea2506-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_b648c412a6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_4", + "id87_content_1", + "outputarea_id82", + "outputarea_id87", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"34f0d27a-fc31-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"34e7c9c8-fc31-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_11c0219cc5" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id82_content_4", + "outputarea_id82" + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "%%logica BabyNamesSample,TopNameByYear,PlotNames,Graph,TotalBabies\n", + "\n", + "# Main predicate: TopNameByYear\n", + "\n", + "# Connecting predicate to a table.\n", + "BabyNames(..r) :- `bigquery-public-data.usa_names.usa_1910_current`(..r);\n", + "\n", + "# Extracting an arbitrary sample from the table.\n", + "@Limit(BabyNamesSample, 10);\n", + "BabyNamesSample(..r) :- BabyNames(..r); \n", + "\n", + "NameCountByYear(name: , year:) += number :-\n", + " BabyNames(name:, year:, number:);\n", + "\n", + "# Finding most popular name for each year.\n", + "@OrderBy(TopNameByYear, \"year\");\n", + "TopNameByYear(year) ArgMax= name -> NameCountByYear(name:, year:);\n", + "\n", + "# Names we would like to plot popularity for.\n", + "PlotNames(name: TopNameByYear()) distinct;\n", + "\n", + "# Get graph of popularity for top names.\n", + "@OrderBy(Graph, \"name\", \"year\");\n", + "Graph(name:, year:, count: NameCountByYear(name:, year:)) :-\n", + " PlotNames(name:);\n", + "\n", + "# Taking a look at total number of babies of time.\n", + "@OrderBy(TotalBabies, \"year\");\n", + "TotalBabies(year:) += number :- BabyNames(year:, number:);\n", + "\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 634 + }, + "executionInfo": { + "elapsed": 927, + "status": "ok", + "timestamp": 1600709890378, + "user": { + "displayName": "Evgeny Skvortsov", + "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhiQjODaOVLfYnUuWS9rB3LRntzJDM0hqElzsUkdQ=s64", + "userId": "11510585406840398626" + }, + "user_tz": 420 + }, + "id": "mPAHeDfihehJ", + "outputId": "b50ebba8-763c-4fb5-985f-c931533f114b" + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmkAAAEvCAYAAAAemFY+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdd1RU19rA4d+ZAYbemzRBpSjSVLBFJfZeYoqmGGOapphmcvOlm27KTTHG9GvUxJKYWGLssTdEBMQGKh1RpJcZmGHO98eMKAEEEUVxP2u5HPbZZ5/3eG/gZVdJlmUEQRAEQRCEG4uitQMQBEEQBEEQ6hJJmiAIgiAIwg1IJGmCIAiCIAg3IJGkCYIgCIIg3IBEkiYIgiAIgnADEkmaIAiCIAjCDciktQNoac7OzrKvr29rhyEIgiAIgtCogwcPnpdl2aW+a20uSfP19SU2Nra1wxAEQRAEQWiUJEnpDV0Tw52CIAiCIAg3IJGkCYIgCIIg3IBEkiYIgiAIgnADanNz0gRBEARBuH60Wi1ZWVloNJrWDuWGZm5ujpeXF6ampk2+RyRpgiAIgiA0W1ZWFjY2Nvj6+iJJUmuHc0OSZZn8/HyysrLw8/Nr8n1iuFMQBEEQhGbTaDQ4OTmJBO0yJEnCycnpinsbG03SJEn6SZKkc5IkJV1S5ihJ0iZJklKMfzsYyyVJkr6UJOmkJEmJkiR1u+SeB431UyRJevCS8u6SJB023vOlZPxfuaFnCIIgCIJwYxEJWuOa82/UlJ60BcDwf5W9DGyRZdkf2GL8GmAE4G/88xgw3xiYI/Am0BOIAt68JOmaDzx6yX3DG3mGIAiCIAhCDUmSuP/++2u+1ul0uLi4MHr06FaM6uo1mqTJsrwDKPhX8TjgZ+Pnn4Hxl5QvlA32AfaSJLUDhgGbZFkukGW5ENgEDDdes5VleZ8syzKw8F9t1fcMQRAEQRCEGlZWViQlJaFWqwHYtGkTnp6eV9SGTqe7FqFdlebOSXOTZfmM8XMu4Gb87AlkXlIvy1h2ufKsesov9wxBEJpIr9FQtns3ht+BBEEQ2q6RI0eydu1aAJYsWcLkyZNrrsXExNC7d28iIiLo06cPJ06cAGDBggWMHTuWgQMHMmjQIKZMmcLKlStr7rvvvvtYtWrV9X2RS1z1wgFjD9g1/QnQ2DMkSXpMkqRYSZJi8/LyrmUognBTKd20mcyHH6Fsy5bWDkUQBOGamjRpEkuXLkWj0ZCYmEjPnj1rrgUFBbFz504OHTrE22+/zSuvvFJzLS4ujt9//53t27fz8MMPs2DBAgCKi4vZs2cPo0aNut6vUqO5W3CclSSpnSzLZ4xDlueM5dmA9yX1vIxl2UD0v8q3Gcu96ql/uWfUIcvyd8B3AD169BBdBoJgVF1SDMC5zz7HOjoayUTsuiMIwrUze80RjuaUtGibXTxseXNMcKP1QkNDSUtLY8mSJYwcObLWteLiYh588EFSUlKQJAmtVltzbciQITg6OgIwYMAAnnjiCfLy8lixYgUTJ07EpBW/bza3J201cGGF5oPAqkvKpxhXefYCio1DlhuAoZIkORgXDAwFNhivlUiS1Mu4qnPKv9qq7xmCIDSRbFzuXXXqFMWXdOELgiC0RWPHjmXWrFm1hjoBXn/9dW6//XaSkpJYs2ZNra0wrKysatWdMmUKixcv5n//+x/Tpk27LnE3pNH0UJKkJRh6wZwlScrCsErzQ2C5JEkPA+nA3cbqfwMjgZNABfAQgCzLBZIkvQMcMNZ7W5blC4sRnsCwgtQCWGf8w2WeIQhCE+nVhm9E5mGh5M39CttRo1BYWLRyVIIgtFVN6fG6lqZNm4a9vT0hISFs27atpry4uLhmIcGF4cyGTJ06laioKNzd3enSpcs1jLZxjSZpsixPbuDSoHrqysCTDbTzE/BTPeWxQNd6yvPre4YgCE0na9RIZma4zZpF+gNTKFi8GOdHH23tsARBEK4JLy8vZs6cWaf8pZde4sEHH+Tdd99tdI6Zm5sbnTt3Zvz41t9UQmprq7569Oghx8bGtnYYgnBDyH37HUrWriVg/z4yp8+g4uBBOm3aiNLevrVDEwShjTh27BidO3du7TBaTEVFBSEhIcTFxWFnZ9eibdf3byVJ0kFZlnvUV18cCyUIbZheo0EyDm+6PP8c+rIyzn/3fStHJQiCcGPavHkznTt35umnn27xBK05xFIvQWjDZI0ahbk5AOYBAdiNH0/h4sU43n8fph4erRydIAjCjWXw4MGkp6e3dhg1RE+aILRhevXFnjQAl6efAiBv3rzWCkkQBEFoIpGkCUIbpteoa63mNPXwwO6OCZT8tZbqsrJWjEwQBEFojEjSBKENkysuDndeYDduHHJlJaUbN7VSVIIgCEJTiCRNENqwao2aUkVVrTKL8HBMvb0pXrO6laISBEEQmkIkaYLQhpWWnGdPwUFOFJyoKZMkCbsxY6jYtx/t2QZPWxMEQbhpKJVKwsPD6dq1K2PGjKGoqOiy9aOjo7ma7brS0tL49ddfm31/U4kkTRDaMF1FOZWm8E/mP7XKbceMBlmmZO3aVopMEASh5VhYWBAfH09SUhKOjo7Mu4aLo3Q6nUjSBEG4OnpZj6SpotIUtmVuq3VN5eeHeWgoxWvWtE5wgiAI10jv3r3Jzs4GID4+nl69ehEaGsqECRMoLCysqbdo0aKa3reYmBgAysvLmTZtGlFRUURERLBqleHY8AULFjB27FgGDhzIoEGDePnll9m5cyfh4eF89tln1+xdRJImCG1USmEKZloZKxtHjuYfJbc8t9Z1uzFjqDx2DE1ycitFKAiC0LKqq6vZsmULY8eOBQyHpc+ZM4fExERCQkKYPXt2Td2Kigri4+P5+uuvaw5Sf++99xg4cCAxMTFs3bqVF198kfLycgDi4uL4/fff2b59Ox9++CH9+vUjPj6e55577pq9j9jMVhDaqJjMPfTQQ1T7fszjL3Zk7eDuwLtrrtuOHMHZDz+kZM1fmL/wfCtGWj91aRVKUwVm5uLblCDcNNa9DLmHW7ZN9xAY8eFlq6jVasLDw8nOzqZz584MGTKE4uJiioqKGDBgAAAPPvggd911V809kycbjibv378/JSUlFBUVsXHjRlavXs0nn3wCgEajISMjA4AhQ4bg6OjYsu/WCNGTJghtVFzmfgB8XP3xsfFha+bWWtdNnJywuq0vxX/9hazXt0aIDSo4U84vb+3jtw9i0ZRrWzscQRBucBfmpKWnpyPLcpPmpEmSVOdrWZZZsWIF8fHxxMfHk5GRUXPWppWV1TWJ/XLEr6iC0Abp9DqO5MQBoLS0JNo7miXHl1ChrcDS1LKmnt2YseTMmkVFbCxWUVGtFW4tpQUa1nwZj0IhUZKv5u/5iYx9JhwTU2VrhyYIQmMa6fG61iwtLfnyyy8ZP348TzzxBA4ODuzcuZN+/fqxaNGiml41gGXLlnH77beza9cu7OzssLOzY9iwYcydO5e5c+ciSRKHDh0iIiKiznNsbGwoLS295u8jetIEoQ06ln8MfUUFAFL2HqK9+qPVa9mTs6dWPZtBA1FYWlJygywg0JRrWTM3gSq1jjEzwxk8tQtnThaz+X/HkPVya4cnCMJNICIigtDQUJYsWcLPP//Miy++SGhoKPHx8bzxxhs19czNzYmIiGD69On8+OOPALz++utotVpCQ0MJDg7m9ddfr/cZoaGhKJVKwsLCrunCAdGTJght0P7c/ZgZRwkVR5cRUTEeWzNbtmZuZXD7wTX1FBYW2AwZQsn6Dbi99hoKlaqVIgZtVTVr5yVQkqdmzNNhuHjb4OJtQ1lBJXv+OMnuP1Tcdqd/q8UnCMKNq+xfx9ytueQXz3379tWpv23btnrbsbCw4Ntvv61TPnXqVKZOnVrztampKf/880+dei1N9KQJQhsUcyaGjuZeACiUMibJG+nv1Z8dWTuo1lfXqms7dgz60lLKtm9vjVABqK7Ws+H7JHJTSxjycBc8Ax1qroUP8Sbkdi8SNmeS8E9mq8UoCIJwvYkkTRDaGG21lkPnDhFqbeh1kkxkOPE30V7RFFUWkZCXUKu+Vc+eSCoV6rhDrREuADuXJpN+OJ8BkwPpGOFa65okSdx2lz8dwl3Y9VsKZ04Vt1KUgiAI15dI0gShjUk8n4imWkNnvWElksKnGxSl09fMGROFSZ2NbSUTE1QdO1LZSvulJW3P4sjOHLoN86Frf8966ygUEoMf6oKZSsnR3TnXOUJBEITWIZI0QWhjYs7EICHRyXh2naL/TACsT28jyj2qzlYcAKqAgFbZ1DY7uZCdy1JoH+JEz3EdL1vXVKWkQ4QLp+POodNWX7auIAhCWyCSNEFoY/bn7ifIMQjz3BQAJJ8w8IiAE+uI9o4mrSSN1OLUWveoAgOpPn8eXUHBdYuz5Lya9d8lYedqwZBpwSgUUqP3BES5U6WpJi0x/zpEKAiC0LpEkiYIbYhapyYxL5Gebj3Qnz0FGFZwEjACsmKJduwKwPbM2osEVAGG+WvXa8hTW1nN3/MPo6+WGTkjFJVF0xaaewY6YGlnRnJMbuOVBUEQbnJiCw5BaEPiz8Wj1WuJMnNGrqwCLFCYm0PgCNj2Pu2y4glyDGJ58nJG+I3AzcoNAPOAAMCQpFn16tWiMe1YcoKs5CKs7MywsldhZaciL7OUgpwyRj0Vhr2bZeONGCkUEv493Di8PQtNuRZzK9MWjVUQhJuXtbV1na04bnaiJ00Q2pCY3BhMJBO6lZxHX20YPpTMzQ1n39l6QfJ6/hP5H/LV+UxZN4X0knQAlM7OKB0d0Zw40aLxFJ2t4PD2bJQmEtrKarKTC4nflEHWsQL6TOxE+2CnK24zIMoNvU7m9KG8Fo1VEAThRiOSNEFoQ2JyYwh2DsYqYz+ymTOSmRmSUgmSBIHD4dQ/9HAK5qfhP6HWqZmybgpH848iSRKqgAAqk1NaNJ7D27JQKCVGPxXGnf/pwYPv92X6V9E8+vkAwgf7NKtNFx8b7N0sxZCnIAh1lJWVMWjQILp160ZISAirVq0CIC0tjaCgIKZOnUpAQAD33Xcfmzdvpm/fvvj7+xMTEwNAeXk506ZNIyoqioiIiJr7jxw5QlRUFOHh4YSGhpKS0rLfKxsikjRBaCM0Og1Hzh8h0rUbZOxDb9EOycLiYoXAEaCtgNQdBDsFs3DEQlRKFdM2TONA7gFUAf5UnjyJXF135eS5inO8t+89Ht/0OK/uepXPD37OL8d+YVP6Jsq15fXGU6XWcWzvGTr1cMXK7uJJBpJCwlTV/HM4JUkiIMqN7JQiygo1TbpHHCklCLcGc3Nz/vzzT+Li4ti6dSsvvPACsmz47//kyZO88MILHD9+nOPHj/Prr7+ya9cuPvnkE95//30A3nvvPQYOHEhMTAxbt27lxRdfpLy8nG+++YZnnnmG+Ph4YmNj8fLyui7vI+akCUIbkVmaSbVcjT9mUFWGXuWMwqLyYgXffmBmDSfWQcAwfO18WTRiEY9vepzpm6bzolk3wtRqqjIyUPn5AVBWVcZPST+x6OgidLKOAIcAThWdIl+dj07WAeBo7sgjIY9wd+DdqJQXk7Fje8+g1VQTert3i7+rf6QbMWtSST5wlm5D21+2bnZyIX/PP0yvcR0Iib4+31gF4VY1J2YOxwuOt2ibQY5B/CfqP02qK8syr7zyCjt27EChUJCdnc3Zs2cB8PPzIyQkBIDg4GAGDRqEJEmEhISQlpYGwMaNG1m9ejWffPIJABqNhoyMDHr37s17771HVlYWd9xxB/7+1+eIOpGkCUIbkVGSAUD7ojMAyEo7FOaXbFVhooKOAyF5Pej1oFDgZuXGzyN+Zvbe2fye8w9hwCsLH8B1xBhcLF1YkLSAwspCRviO4On2o/DOPAhyOnp1OkWlGZzSnOdbe/jowEcsivuKGZ6DGOM3Cn21lkMbtFi7VHIg4zNCVKNo365HTSiyLCNJjW+50RB7V0vc/GxJjrl8klal1rF5wVG0ldXsWJpMtU7f7GFWQRBufL/88gt5eXkcPHgQU1NTfH190WgMPe6qS84mVigUNV8rFAp0OsMvnbIss2LFCgIDA2u127lzZ3r27MnatWsZOXIk3377LQMHDrzm7yOSNEFoI9JLDYsAfM4cBZcg9Gfl2sOdYBjyPLYazsSDZzcA7FR2/Df6vxRH5JG9YAChxXZ8cWKZYZWoexTPd3+eYHMXmNcT1AVg6YTC3gdH1xAcbdoRWZrD3oKjfKko4o2MNXycugrH4mBGFE9nk/9yTqUewubUbyweuYgObhGUFeSzYNYTjHjyBTp2j2r2+/pHurFreQr5OWU4eVjXlOdlpKGytMTW2ZWdy5MpL6xk/AvdSNySye7fT1Kt09N9uG+znysIQsOa2uN1rRQXF+Pq6oqpqSlbt24lPT39iu4fNmwYc+fOZe7cuUiSxKFDh4iIiOD06dN06NCBmTNnkpGRQWJiokjSBEFouoySDBxVDticjoGwSehjCwzbb1zKfyhICkNvmjFJu8DOzoXzPj4M0nVi4j3LOFN+hk72nZAAlt0PVeUwYw+4Bdd5dm+gl7aSLceWsCt7N84ZQ1BYVvHioMFY6nrzbOJcntjwCIvv3EDOoVgqy8s5+NefV5ek9XBj9+8nSYk5i9N4Q5KWlniIlXNmI0kK/HuP4nSiN5GjOuHRyR53P1s2LzjGvpWn0VfLRI7ya/azW4K6rIriPDXaymq0mmq0ldUoTRR07OZyVb2MgnAr0ul0qFQq7rvvPsaMGUNISAg9evQgKCjoitp5/fXXefbZZwkNDUWv1+Pn58dff/3F8uXLWbRoEaampri7u/PKK69cozepTSRpgtBGpJek42PuBFUJ4Hsbsno5Cst/7UFm5Qw+vSHmO+hwO7TvXeuyKiCAyhMnsDazxt/MOOcicTkc/wuGvF1vgnaBZKpicOhUurncxZJV+4kc24Ee4cMBmFeUxbTMlTz912TuyugHQObRwxTkZOHo0bx5Ypa2ZngHOXBszxm8uzgi63NY9fG7OHp6Y+vcjmM7/sTEzAlXn2cBUCgVDH6oCwqlRMyaVLSV1fQa1wGF8vqvnyor1LDk7Riq1Lo61ya+1B33DnbXPSZBuJkdOXKEjh074uzszN69e+utk5SUVPN5wYIFNZ99fX1rrllYWPDtt9/Wuffll1/m5Zdfbtmgm0Cs7hSENiKjJAMfvbEHpn1f9Gp13eFOgLFzwdIJFo6FxN9qXVIFBFCVkYFerTYUlJyBv18Eryjo/VST4ji8NQuliYLgfh41ZV0HvsMchTtHy85wKv4AHbpFolAqSdy8nrizcby661Um/TWJT2M/Zd+ZfVRVVzXpWZFj/FAoJf74aD2/vf0GlvZOTHzlbcxsRqOym4iFrQl/fPA6a7/8mCqNGoVCYtCUznTp58GhjRms+Ogg+dnXf/PL3SsMw67DH+vKhBe6cfcrkdz1f4Y5e9nJhdc9HkG4mX3zzTdMnjyZd999t7VDaXEiSROENqBCW8E59TnalxWCcyBYu6LXqOsOdwI4dYSHNxkSrz8egW1zwLhEXRUYALJM5clThrK/ngWdBsbPB0Xj22ZUVmg5vu8M/pGuWNiYXbygUHD7hMU8m6NAoZU51q4AZYA7+zatZNraB9mcvhkzpRmLjy3m0Y2PctvS23h6y9MknU9q+GGAu58dwx/1QK5aiYyKyspRbF6QRmrCefreNYiHPvuaXhMnc3z3dvb9sQwwbAESfW8gQx8JpiRfw/L3DxD7dyrV1fqm/4NfhewThZyMPUe3oT507OaKh789Lj42uLa3xdHDipzkousShyC0FdOnT+fo0aMMHTq0tUNpcWK4UxDagMzSTAB88tPAfzwAslqDZFFPkgZg6QgP/AlrnoFt70PBKRj4Oub+F87wPIFFdaJh7tqwD8C5U5PiOL43F12Vvv5tN2zb4e8wgX3E8nvVVpxtVAyrcuN5kzHcGdkPS2t3KlwCicmNYVf2LjambWT23tn8Nua3um0ZFeRk8+dHb2JmqeKel94l5WAlh7dl4RlgT/ggbySFRN+776PkXC5xf68ifMhIbF1ckSTD8VJegQ7sWJbM/tWpnDqUx8ApnXHxtmnSuzaHvlrPzuXJ2DiZ021Y3VWpHv72nNiXi75a3yrDsIIg3FhEkiYIbUBaSRoA7dWl0C4MAL1Gg8LiMudimpjB+K/BqQP88y4kLsNUaYVkYkfl3/OhUzL49IGe05scx4n9ubj42ODiU3+ik5ZVjJerJW8X5tG5Ss82U1vM/tmJ5el5AFje8QPRoXcR7R2Nj40PH8d+THpJOu1t6yY0x3ZtY/MP81CYmHLPmx/g7O2DWwfoPrw9piolkuLi5Pu+k6aQvG83O5f8zKiZL9aUW9iYMeyRrvh3z2PbkhP89kEsEUN9iBzli4lp8zfcbUjSjmzys8sZ8XgIJmZ12/fwtydpezZ5mWW4+dq2+PMFQbi5iF/VBKENuLBHmo9WBw6+AMjqBoY7LyVJ0P9FeHwnjP4MqccUVC7maFKzQaGAcV8Z/m6Cgpxy8jJKCezpXu/1iuIizp4+id+A8YyOfIaOPWcQ2qsb2Wo7zg9fYNhsd+UMOL0NgKG+hqGLjWkba7VTpVGz/uvP+XvuJzj7+PHAh5/j7H0xibOwMauTANk6u9B99HiO795O7snkOrF1iHDh3jd7EtjTjbj16Sx79wA5KS077FhRUsX+1al4d3bAL9y53joe/vYAYshTEARAJGmC0Cakl6TjbGKFlSyDgy+yToes1TY83Plv7UKhxzQY8SGqPiOprHSCl1IN89ea6ERMLpJCwj/Srd7raYmHAPDt1hOiX4bBbxE85TWUJiYkHj8H9ywGZ39Yej/kHsbdyp1wl3A2pG2oaeNc2mkWv/wsR3ZsodfESdzz5gfYOrs2Kb7IsXdiaWfPtkU/1hwTcylzK1MGPdiFMTPDqNbp+fPTOLb/egJtVd1jshpTpdbVeca+VafQVVbT756ABrfYsLJTYe9mSU6KWDwgCIJI0gShTcgozaC9whIkJdh6oTfusK0wr2d1ZyPMAwKozs9Hl5/feGUjWS+THJOLd2dHLG3N6q2TFn8QSzt7XH071JRZ2trRKaoPR7f/g1ZhDvf9Dua2yIvuJG3PBvpmeOK87Tw/v/YM306fwqL/zERbqeHu19+j7933o1A2fUhSZWlJn7vuJfv4EU7G7muwnk8XJya9HkXYQG+Sdmbz5ydxlBVWNlj/347vO8P3z+3gxxd28scnB9n26wli/07l2J4zhA7yxsHd6rL3e3SyI+dkMXpx3qggNJm1tXWdsm+++YaFCxdeUTvR0dHExsa2VFhXTSRpgtAGpJek014P2HmB0gTZuIWGoqk9aZdQGY9DqUyuOyzYkJyTRZQVVBLYs/5eNFmvJy0hDt/QCKR/DZ+GDRlBZUU5J/buoly2ZL/rk/yQ2J4VX8ylfGsSHufNKdQU0j60G7dNmsIDc77EOzj0it8LIGTgMBw9vdn5y/+o1mkbrGdmbsJtd/szckYoRWcr+O3DA5xLL2m0/fzsMrb/cgI3P1v8exj+LU7GnmX/6lSsbM2IHOnbaBseAQ5UqXWtsjWIILQl06dPZ8qUKa0dxlURCwcE4SZXVlVGgaYAn2rrmvloF3rS6t0nrRGqgAAANMnJWPXp06R7kvfnYqpS4hfuUu/1s6mnUJeW4Bvevc41r85dcfTwYvvin9j03Vz01dX4dPKnf+UWOnTvyTQ7PWpdBc+OffaK3+XfFEolA+6fxp9zZpOwaT3dRoy5bH2/UGcmvtSdtfMS+eOTOAY92Lkm+fq3Ko2O9d8lYWZhwojpIVjZGc4FlGWZ8qJKlCYKzCwa/5Z76by0a7nSVBDaurfeegtra2tmzZpFdHQ0PXv2ZOvWrRQVFfHjjz/Sr18/1Go1Dz30EAkJCQQFBaG+sEckMGPGDA4cOIBarebOO+9k9uzZ1/0dRE+aINzkLpzZ2b4s/2KSVmHsSWvGcKeJoyNKZ2cqTzStJ02nreZkXB4dIlwwrWfFIhiGOpEk2odG1LkmSRKR4+7ExMSEiOFjeOizb7jrvXkEDrsb0+Q1DHPvxYnCE6QVp13xu9THL6IHPl1D2fv7r1QUNz5B38nTmjtf7oGLtw0bfzjC3pWn6sxTk2WZrYuPU3yugqGPBNckaBfez9rBvPa+cZdh42iOjZN5iy9cEIRbnU6nIyYmhs8//7wm4Zo/fz6WlpYcO3aM2bNnc/DgwZr67733HrGxsSQmJrJ9+3YSExOve8xX1ZMmSdJzwCOADBwGHgLaAUsBJ+Ag8IAsy1WSJKmAhUB3IB+4R5blNGM7/wc8DFQDM2VZ3mAsHw58ASiBH2RZ/vBq4hWEtqhmZWdpwcWVnZrmD3eCYV5aU4c70xLzqVLrGlzVCZCaEIebXycsbes/7qhr9GC6Rg+uXdhjGuz+ksHns5kDbEzfyGOhjzX1FRokSRIDH5rOwpdmsvXn72ttydEQS1szxj8XwbYlJ4hbn07y/lx6ju1AYE93JIVE0vZsTsaeo9f4DngGOFx1jJ7+9qQdzkeWZXGOp3BTyX3/fSqPHW/RNlWdg3BvgbMy77jjDgC6d+9OWloaADt27GDmzJkAhIaGEhp6cSrF8uXL+e6779DpdJw5c4ajR4/Wun49NLsnTZIkT2Am0EOW5a4YEqlJwBzgM1mWOwGFGJIvjH8XGss/M9ZDkqQuxvuCgeHA15IkKSVJUgLzgBFAF2Cysa4gtHmrT60msySzSXXTSww9ad66i9tv6NXG4c5m9KSB8QzPkyeRqxtf2Xhify5WdmZ4BtafnGjKyziTchy/8G71Xm+Qgy8EDMM94TciXMJqrfK8Wk5ePvSccDfHd2/ndNyBJt2jNFUwaEpnxj8fgaWtGVt+PsbyDw5weFsWu35LoX1XJ7oNrbufW3N4BNijKddScKa8RdoTBAFUKkMPt1KpRKere27upVJTU/nkk0/YsmULiYmJjBo1Co1xGsn1dLVz0kwAC0mStIAlcAYYCNxrvP4z8BYwHxhn/AzwO/CVZPgVcRywVJblSiBVkqSTQJSx3klZlk8DSJK01Fj36FXGLAg3tG2Z23h1169pwYAAACAASURBVKsEOwXz66hfUUiX/10qoyQDNzM7LOSMS+akGXvSLJuXpJkHByNXVqI5egyLkK4N1lOXVZGRlE/oIG8Uivp7fDKSEpD1enzD6s5Ha1Tko5A8kaEqd+bkbSC1OBU/O78rb6cePSfcRfK+XWz6YR5TP/ka1b8Po2+AZ4ADd/6nBykHz7Jv5Wl2LE3G2lHF4Kldam2gezUunZfm5FF31Zog3Khaosfreurfvz+//vorAwcOJCkpqWZIs6SkBCsrK+zs7Dh79izr1q0jOjr6usfX7J40WZazgU+ADAzJWTGG4c0iWZYvpKhZgKfxsyeQabxXZ6zvdGn5v+5pqLwOSZIekyQpVpKk2Ly8vOa+kiC0OrVOzYcxH2Jtas2R/COsPb220XvSS9NprzRu61Az3HlhC47mDXda9e0DkkTZju2XrXcy9hx6vdzgqk4wzEdTWVrRzj/wygPpOBAcOzAkLR6ou7Ht1VCamDL08ZmUFeSza+nPV3SvpJAIiHTnvrd6cfsDQYydGY65tWmLxWbrbIGVvYqck2JemiA0RUVFBV5eXjV//vvf/zbpvhkzZlBWVkbnzp1544036N7d8MtkWFgYERERBAUFce+999K3b99rGX6Dmt2TJkmSA4aeLT+gCPgNw3DldSfL8nfAdwA9evQQmwsJN63vE78nuyybH4f+yKcHP+XLQ18ypP0QzE0aTrYySjIYLFmDyg4sDEOOFxYONGd1JxgWD5iHhlC2fQcuTz7ZYL0T+3Nx8rTC2av+VYgVJcWc2LuTjt17XtGeZjUUCujxMG4bX6VbxBA2pm/k8bDHr7ydBngEBBExfDSH1v9FUJ8BeAZd2YwKpamCLn09WiyeCyRJwsPfnuwThWJemiA0gV6vv+z1bdu21Xx2dnaumZNmYWHB0qVL671nwYIFLRRd813N6s7BQKosy3myLGuBP4C+gL0kSReSPy8g2/g5G/AGMF63w7CAoKb8X/c0VC4IbVJqcSoLjixgdIfRRLWLYlaPWeSW57Lo6KIG7ymuLKaosoj2VVXg4GM45olLhjub2ZMGYD1gAJrDhxvc1LbkvJqzqSUERDW8YGDfH0vRVlbSa+KkZsdBxH1gYsHQymqSC5N5a89b/Pfgf/km4Rt+PvIzu7N3N79t4LZJU7B1dmHjt1+iq6q6qrZakoe/PRUlVRSfUzdeWRCENulqkrQMoJckSZbGuWWDMMwX2wrcaazzILDK+Hm18WuM1/+RDeemrAYmSZKkkiTJD/AHYoADgL8kSX6SJJlhWFyw+iriFYQblizLvL//fVRKFS/0eAGASPdIBnoP5IfDP3Befb7e+2pWdpYX1Qx1AsjGhQOKZvakgSFJQ5Yp27mz3utphw0xdWhgb7Sis7kkbFxHyO1DcfTwanYcWDhAyJ0MO7mPTnZ+bMnYwi9Hf2Fe/Dw+if2E6ZunMz9+fr1HPTWFmbkFgx95koKcLGJW/db8OFuYZ4BhXlp2sjgiShBuVVczJ20/hgUAcRi231BgGHL8D/C8cQGAE/Cj8ZYfASdj+fPAy8Z2jgDLMSR464EnZVmuNs5bewrYABwDlhvrCkKbsyF9A/vO7OPpiKdxtrh4+PZz3Z+jqrqKefHz6r0vrSQNgPZFZ2olaRd60qSr6Ekz79IFExcXyrbXPy8tLfE89m6W2LvVP+F+19KFKEyU9L7r3nqvX5GoR3GuquBPt2HsnLSTgw8cJO6BOHZN2sW4juP4OuFrPjrwEXr58kMeDfEL705A734cWP0HpQX1J8TXm72bJRY2pmJemiDcwq5qM1tZlt+UZTlIluWusiw/IMtypSzLp2VZjpJluZMsy3cZV20iy7LG+HUn4/XTl7TznizLHWVZDpRled0l5X/LshxgvPbe1cQqCDeqcm05H8d8TGfHztwTeE+ta752vkwKmsQfKX+QUphS596M0gwkJLw15f/qSVMjmZkhNWcemJEkSVgN6E/5rt3I2tpHKFWpdWQnF+Eb6lzvvbmnUjixZwc9Ro3H2sGx2THUaBcG3j3hwA9gnHtiqjDFTmXH233f5v7O97P42GLe2P0GOv3ll9Y3pP+9DyLrq9m9bPHVx9sCJEnCM8CBrOOFyOIcT0G4JYkTBwShlf2U9BN56jxe6/UaSkXdpGp62HSsTK34NPbTOtfSS9LxMHfEDGr3pKk1zV40cCnr/v3Rl5ZScehQrfKMowXoq2X8Qp3q3CPLMjt//R8WNrb0GDPxqmOoEfkoFJyG42tqFSskBS9FvsQT4U+w6tQqZm2fRVX1lc8ts3N1J3z4GI5s38K5tNON33AdtA9xoqK4irzM0tYORRCEViCSNEFoZQdyDxDuGk6oS/07Wdup7JgeOp3dObtZc6p2gpJRkoGPia3hC4eL+4fpNeqrWjRwgVWfvmBqSvmOHbXK0w6fR2VpgnuHuicIpCXEkZGUSK+Jk5q891iTBI8HtxBYOwsqCmpdkiSJGWEzeDnqZbZkbOHONXey5tSaK+5V6zXhHsytrNm++Kdmz3FrSe27OiFJkJpwYwzBCoJwfYkkTRBakSzLJBcmE+hw+T3E7u18L93duvPOvnc4XXS65t6Mkgx8MAEksLu4GFpWa65q0cAFSmsrLHt0rzUvTa+XSU/KxyfYCYWy9rcQvb6anb/8DztXN8KGjLjq59cOxhQmzAd1Iax9od4q93W+j7kD56KUlLyy6xXG/DmGFckr0FZr663/b+bW1vSeOImMw/GkJcS1ZPTNYmFthntHu5pFGoIg1E+SJO6///6ar3U6HS4uLowePRqA1atX8+GHDZ8smZaWRteuDW/cfSUWLFjAU0891SJtiSRNEFpRTnkO5dpyAhwDLlvPRGHCR/0/wsLEghe2v4Bap6awspBSbSnttVqw8wKTiwd469XqFhnuBMMqz8qUk2izDTvgnE0tQVOmxa+e+Wgn9uwkLyONvpOmoDRpuc1da7iHQPR/4MgfkPRHvVWivaNZMXYFX9z+BXYqO97a+xYj/xzZ5APaw4aOxN69HdsX/Yi+CcdiXWu+oc6czyyjtOD6H0kjCDcLKysrkpKSUKsNi6Y2bdqEp+fF/e/Hjh3Lyy+/3FrhNZtI0gShFSUXGA4xD3C4fJIG4Grpygf9PuBU0Sne3/9+zfYb7StKa81Hg5Yb7gSw7j8AgFJjb1pa4nkUCgmf4NoLAmRZ5uDalTh6eBHUu1+LPLtefZ8Dj26G3rSyc/VWUUgKBvoMZMmoJXwz+BvKq8r5JPaTJjWvNDGl/70PkZ+VQdK2TS0ZebNcSIbTEkVvmiBczsiRI1m71nBKy5IlS5g8eXLNtUt7t86ePcuECRMICwsjLCyMPXv2AFBdXc2jjz5KcHAwQ4cOrUn4vv/+eyIjIwkLC2PixIlUVFQAkJeXx8SJE4mMjCQyMpLdu69uz8b6iCRNEFpRcqEhSfO39699oYHds/t49OGx0MdYeXIl8xPmA+BTnAv2tQ/2Ngx3tkySZubni6mPT82QZ9rh87Tzt0NlWbun7EzKcc6ePknEiLFIimv4rUVpAhO+BW0FrHkGLjN3TJIk+nr25eGQh9metZ0DuU07TL1TVG88Aruwe9liqjStu5msg7sVdq4WIkkThEZMmjSJpUuXotFoSExMpGfPnvXWmzlzJgMGDCAhIYG4uDiCg4MBSElJ4cknn+TIkSPY29uzYsUKAO644w4OHDhAQkICnTt35scfDTuLPfPMMzz33HMcOHCAFStW8Mgjj7T4O13tAeuCIFyF5MJkvG28sTS9ZIJ9+Xn4fiBEPQZ96s5rmBE2g7hzcezJ2YNSUuJZnFFPT5oGpVPdlZfNIUkS1gMGULR8OUXZRRTklNP3zk516sWtW4PK0oou/W9vkedelksADHwdNr4KCUshfPJlq9/X+T6WnljKp7GfNunQekmSuG3SAyyf/X+cPhhDUN8BLRn9FfMLdSZxWxZVGh1m5uLbtnDj2rk8mfOZZS3aprO3Nf3ubny0ITQ0lLS0NJYsWcLIkSMbrPfPP/+wcOFCAJRKJXZ2dhQWFuLn50d4eDgA3bt3rzk6Kikpiddee42ioiLKysoYNmwYAJs3b+bo0aM17ZaUlFBW1rLvLnrSBKEVJRcm1x3q3PQGFKXDjo+hsu5/8EqFkjn95uBk7oSXhSumUCdJk9UtN9wJhnlpcmUlKWsNW3H8e3+00oLzpOzfTdfbh2Bm3jJz4RrVawb49IG/X4TcpMtWNTcx5+mIpzmSf4QNaRua1LxnUBdUllZkHElsiWivim+oM3qdTObRgsYrC8ItbOzYscyaNavWUGdTqVSqms9KpRKdzrA6fOrUqXz11VccPnyYN998E43GMD9Ur9ezb98+4uPjiY+PJzs7G2tr65Z5ESPxK9kt7NiZEuZvO8X/jQyind11+sEq1FDr1GSUZjDC75JVkGm7IP4X6DQETm6CQ4sMyci/uFi68NOwn6g4vQWO7K/bk6ZWI7XQcCeAZWQPJAsL0pIKsHfzxN619tYaiZvWodfrCR82usWe2SiFEiZ+Dz8MgV/uhIc3gb13g9VH+Y1i4ZGFfBH3BYN8BmGmNGuwLoBCocSrSwiZSa2fpLXraIfK0oTUxPN07Oba2uEIQoOa0uN1LU2bNg17e3tCQkJqHap+qUGDBjF//nyeffZZqqurG+39Ki0tpV27dmi1Wn755ZeaBQlDhw5l7ty5vPjiiwDEx8fX9MS1FNGTdovSVut5blk8qxNyuPvbvWQWVDT53ti0Al798zDqqtZf+XYzO110Gr2sv9iTpquCv54Hex+4eyH49Ia986CB7SM62Hegq9Y4d62e4U5FC/ZoKVQqzHreRl6lbZ1eNF1VFQmb19OxexT2bg0ftn5N2HnB/b9DVQUsnlhn/7RLKRVKnu/xPNll2Sw9vrRJzft0DaXo7BlK8upfoHC9KJQK2oc4kX44H704fUAQGuTl5cXMmTMvW+eLL75g69athISE0L1791pDlvV555136NmzJ3379iUoKKim/MsvvyQ2NpbQ0FC6dOnCN9980yLvcCnRk3aL+nFXKsdzS3l2sD//253G3d/u5ddHe+HnbHXZ+2LTCpjyUwwVVdVYqUx4ZWTn6xRx23Nh0UBNkrZ3Lpw/AfcuBzNL6PssLLkHjvwJoXfX30hhGphagVXtxElWq1tkn7RLlQQNQD6uxMutdnJ+Yu9O1CXFRAwf06LPazK3YJj0Cyy+A5beCw/8CaaXvHtFAZxJAL/+9PHoQ1+Pvnyb+C3jOo3DTlV3M94LjuUf4zfNZpyBjKQEut4+5Nq/y2X4hjiTvP8suaeL8ehk36qxCMKNpr7esOjoaKKjowHDkOXUqVMBcHNzY9WqVXXqJyVdnDYxa9asms8zZsxgxoy6IxrOzs4sW7asTvmlz7paoiftFpRZUMHnm5MZ0sWNZwcHsOTRXlTq9Nz97V5SzjZ8/MzB9EIe/CkGdztzRoe244edp0nMEoc/N1dyYTIWJhZ42XhBQSps/wg6j4EAw6RU/IeCSxDs/qLhFYyFaYZeNEmqKZJ1OmSttkWHOwHOmXhjoi3HOuPiEVGyLBP392qcvHzw6RrWos+7In79DCs+M/bBH49C/inY+zUsGA0fd4JF4w1z/DAcWl9aVcp3id812FxsbizTNkzjr+KtSFYqMpISrtebNMiwebAkVnkKwi1EJGm3GFmWeXVlEkpJYvZYw7LjLh62LHusFwCTvttHbFpBnSNx4jOLmPpTDK625ix5tBfvTQjB2VrFS78noq2uf7sI4fKSC5Pxt/dHgWSY/K4wgeFzLlZQKKDPTDibBCe31N9IYXq9Q51Aiw53yrJMTmYVzpp01Hsv7gWUc+IY59JOETF8NNIliWKr6HoHDP8Ajq2Bud1gw/8ZVsre9iwEjTYkaTnxBDoGMsF/AguPLuSFbS9wtvxsrWa2Zmxl+ubpuFq6EuQUxFnnKjKSElr9mCiVhQke/vYiSROEW4hI0m4xaxLPsCM5j1nDAvGwv/hD3N/NhuWP98bMRMGd3+yl1wdbmPVbAqvis9l98jxTftyPg5UZvz7aEzdbc+wsTHlnfFeO55by3Y4b4zDqm8mF46D8Hfzh2GrDIoHbXwE7z9oVQ+4Cm3aw+/P6GjH2pP17jzTDvl4X9klrieSiOE9NeXEV7u1MKN+7D9m46iluvXHbjX4Dr/oZLaLXDBj9GQx9D2Yegif3waA3YNxXYOkMf04HXSWv9nyVpyOeZnvWdsauHMvCIwvR6XWsPrWa57Y9h7+9PwuGL+BO/ztJsT1PeVEhBdlZrf12+IU5U5hbQdHZps8hFQTh5iWStFtIcYWWt9ccIdTLjim9fetc93O2Yu3MfsyZGEIPX0c2HzvLM0vjue+H/dhamLLksV61VoEOC3ZnZIg7X2xJ4VRey+4N09blqfMoqiwyzEeL/QkcO0DU43UrmphBrycgbSdkH6x9rfw8aMsb7EmTzC1Yn5RL6FsbOXmu4WHspshJMQxre0f5oi8rQ334MBUlxTXbbpi24HYfV63HNMP+co4dLpZZOMDYuZB3DLZ9gJnSjMdCH+PPcX/S3a07H8d+zNiVY3l116tEukfyw7AfcDB3YIjvEM45VwGQkRTfSi90kW+IYe7hyYNnG6kpCEJbIJK0W8iH649RWKHl/QkhKBX1D005WplxT6QP8+7txsHXhrDqyb68My6Y36b3xtO+7vDZW2ODsTBV8vKKRLHq7ArULBqw7QAZ+w1bbigbWMfTfSqo7GD3l7XLC9MMf9ez/QaAZGHOV1tTKK3U8caqI1fVo5aTUoSFjSkeQ3qCJFG+ew/piYeQ9XoC+1zDI6BaUsBQiHjAMMcv03DygLeNN/MGzeOz6M+o1lczwncE8wbNw8rUsIDG0dyRkE5RVFjKN8S8NFtnC9p3dSJ+cyaVFU07NF4QhJuXSNJuEdlFapYeyOTB3r509Wx4RdullAqJMG97Hujt2+A+aq425rw6qjMH0gr5ZX/6ZdtLyi7mg7+PoRNz2C4eB6WpAJ0afPs2XNncFiKnwdFVsP7/oCTHUN5AkiYbe9JSinUkZZcQ5evInlP5/JV4ptnx5iQX4dHJHhMHB8xDQijfvZv0xHjMraxx61D39IEb1rD3wdYTVs4ArTGZlSQGtx/M+onr+WjAR3X2TxvpN5Isx3LSkuLR61t/25meYztQWaHj0KaM1g5FEIRrTCRpt4iVh7KRZXior2+Lt31Xdy/6+TvzwbrjpOeX11unvFLHjF8O8u2O06yMz2nxGG42yYXJuFu5Y5djXCnZ/jJJGsBtz0PYZNj/LXwRBn89B+nGCfz2PrWq6isMycdfJwpxtDLjfw9F0tXTlnfXHqWsUnfFsZbkqykt0OARYNj2wapvHyoSE0lPjMO7aygKhfKK22w15raG+Wn5KbDyCUhcDic3Q84hpOJMKM2F4mwoyjAkwaW5DPQZSL5LNTq1hry01NZ+A1x8bOjUw5WEf7KoKKlq7XAE4YagVCoJDw8nODiYsLAwPv30U/QNnIHcmNjY2Ab3WvP19eX8+eu3eEckabcAWZb581A2kb4OeDtaNn7DFZIkiTkTQ1EqJF5YnkB1PcOec9YfJ6tQjae9BXP/Sbnle9NqjoNK223YZuNf+5zVYW4LE+bDzDgIvw8OLYaD/zMsKjCt3cupNx4Ivje7jPt7tcdKZcI747pytqSSL7ekXHGsF+ajefg7AGDdpw/lJgrKCgtoHxJxxe21ug7RhlWzR/4wbNexeCJ8Fw2fh8CngfBZF8PnL8Lg00Cszh6jY2h3AFIT41oz8ho9x3SgWqvn4Lq01g5FEG4IFhYWxMfHc+TIETZt2sS6deuYPXt2s9rq0aMHX375ZeMVrwORpN0CkrJLOHmujAkRXtfsGR72FsweG0xseiHf76y92nPPqfMs3JvO1D6+zB4bTHp+BX8cyr5msdzotNVaUotSCbDrBJn7G+9Fu5SDL4z5HJ5JgN5PQZ+n61S5MNypMzPngV6GlZ8RPg5MivTmp12pJF9mL7z65CQXobIywcnDME/LIiyMfEfDkHn70JswSQMY+g68lApPxcK0DTDpV8PCglH/hTFfGD6PnQuSEk6sY3jXcRRaV5EUt7O1IwfA3s2Szr3dSdqZTUm+urXDEYQbiqurK9999x1fffUVsiyTlpZGv3796NatG926dWPPnj0ATJo0ibVr19bcN3XqVH7//Xe2bdvG6NGGI+7y8/MZOnQowcHBPPLII9d9Kx5x4sAt4M9D2ZgpFYwKaXdNnzMhwpNNR8/y343JDAhwoXM7W8ordbz0eyK+Tpa8NCwIc1MFoV52zP0nhQkRnpgqb73fE04Xn0Yn6wjADKrKLj8frSG2HjDsvXovlRUbVtoOCPHCxebigcEvDQ9iXVIub6xKYsmjvZq8r1l2imE+mmRcbCKZmVHo6Y6lpuL6HwPVkiwdDX/wb7jOocVw6h9ui36Z31z02J9Ko1qnRWliet3CbEjkaD9O7D/LgbVpDJrSeid/VGv1nNifS0FOOXpZRq6WaxYROXla4eHvgJOHVc3/fwTheujQoQPV1dWcO3cOV1dXNm3ahLm5OSkpKUyePJnY2Fjuueceli9fzqhRo6iqqmLLli3Mnz+f/fv317Qze/ZsbrvtNt544w3Wrl3Ljz/+eF3fQyRpbZyuWs/qhBwGBrliZ3ltf7BIksS747tyIG0nzy2LZ9VTfflg3TGyi9Qsf7w3FmaGuUvPDvZn2oJYVhzMYlKUTyOttj01KztL8wwF7W9r0fZjjmUTCNx9W+3kw9HKjJeGB/Lqn0msTshhXLhn/Q1coqywkpI8NSEDLtat1unIk7W4F5ZQlZmJmXfDh5rf9DoOhG0fYlpZikdwMFLqKdKOH6Zj126tHRnWDuZ0jfYkcUsmEUN8cGxX/5FumjItCVszObozh8Ce7vSa0BFFCyRMuqpqju7OIW5DBuVFlZiqlCiUEgqlhKSQ0FfLHN1lmH+qsjShXSd73DvYYutkgbWDCmtHc6zszFDcgr+otWVbF3zHufSW3TvTtX0Hbp/6WLPv12q1PPXUU8THx6NUKklONnwPHjFiBM888wyVlZWsX7+e/v37Y/Gv4/R27NjBH3/8AcCoUaNwcHBo/os0g0jS2ridJ89zvqySCd0a/4HcEpysVcyZGMLDP8cyfdFBtp7I4+Hb/Ij0daypc3ugK2He9sz95yR3dPPCzOTW+iadUpiCmcKM9tlHwKkT2Li1WNtVOj2HknMJBPx9XOpcnxTpw/LYLP7vj8M4WJrRP6BunUvlpBQC4OF/8azIMydPoNXpcC5TU757D2aT7mmx+G84HW6HbR9A6nZu73MHe/76iN1719wQSRpA92HtObozh30rTzHg3kAsbMxqErDy4kriN2WQtDMHXWU1Lj42HNqUQX5OGUMfDkbVzF/aNOVaju89w6GNGVSUVOHhb8+gqZ3xCnSo0ztbcl5NzskiclKKyEkuqnNagqSQsHOxwMnTGmdva5y9rHHxscHKToUgXI3Tp0+jVCpxdXVl9uzZuLm5kZCQgF6vx9y4r6O5uTnR0dFs2LCBZcuWMWnSpFaOui6RpLVxKw9lY2dhSnTg5X8Yt6RBnd2YFOnN0gOZdHC2YtbQwFrXJUni2cH+PPS/A/x+MIt7e95avWnJhcl0tO+ISdJeCJ7Qom3/lZiDtsKwG72inrM7lQqJ76d058GfDjBtwQE+vTvssj1q2SlFmJkrcfa2qSlLT4xHkhS4WdtSvns3Do0kaa+tPIyTlYrnhgQ0861akWd3UNnCqa30Gv0Z6x3moE1IoFqnQ2nS+t8+LWzMCB/iw4G/UklNOI8kgbm1KZa2ZhSerUCulvGPdKPbsPY4eVpzZGc2O5Ym8/ucg4ycEYKDu6H3rbJCS0rsOZJjctFV6fHoZI9HgD0enewxtzaloqSK1IQ8Th/KI+t4IXq9jGegA0MfCcYzoOGeBVtnC2ydLQjqZZhqUanWUVagoaywkrJCDaX5GgpzK8jLKOFU3DnAcAzt4Ie6EBB1Ew+l38KupserpeTl5TF9+nSeeuopJEmiuLgYLy8vFAoFP//8M9XVF7fSueeee/jhhx+IjY1lwYIFddrq378/v/76K6+99hrr1q2jsLDwOr6JSNLaBL1eJimnmBBPu1q/yZZV6thwJJeJ3bxQmVzfbRJeG90FgPt7ta8Z5rxUdIAL4d72zNt6kju731q9acmFyfRxCILKEvBtuaFOWZb5YWcqw1USkpkZkrL+/81dbcxZ9ngvHv05lmeWxlNQXsVDff3qrZuTXES7Tva1hsfSDx/CrWMnHP2tKFm/AVmnQ2ogYTmYXsjifRlYmCp5pJ8fNuatP5friihNwK8/nNqKUlLg2L0L+s3H+eHVJ5n84rvYOl+/X34aEjnSFxcfG8oKNFSUVNX8adfJnvDB3ti5XFzRHdzPEwd3K9Z/d5jf5xwkaowfuaeKSU04T7VOj4O7JZa2ZiTtzCbhn0wAbJ3NKc3XIMtg62JB2GBvOnV3xbW97RXHqrIwQeVpjZOndZ1rVWod57PL2LPiJNuXJOPh74C1g+hRE5pGrVYTHh6OVqvFxMSEBx54gOeffx6AJ554gokTJ7Jw4UKGDx+OldXFqQFDhw7lgQceYNy4cZiZmdVp980332Ty5MkEBwfTp08ffHyub6eCSNLagC//SeHzzSn8P3vnHR1F+TXgZ3bTe++VFAiQUJIQWuhNQUAQEJHyw66AInZR5MOOigoqYKEISu9I7y2UhJAAgfTee6873x8bAiEBAmyyG9jnnJwks+97507Kzp1bR3W245uxPuhoym/Oey+nU14lY0wLhTpvxUBbg6/H+tzxdUEQmD3Yk6l/nWPDhSSe7+58x7WPErnluWSVZeFpUNsA9n4qO+9Bcl4ZV9MKeddcC0H37sPVjXQ0WTW9G2+uu8j8nVfJLq7gnSFt6xn5JQUV5GeUdi7xgQAAIABJREFU4tXzZsFJRWkJ6dGRdBs1Dn0TS/I3bqIsPBy9Lo1Xef5w4Dq6mlLKqmrYeSmtdXpN3frDtV2QG8vr079gVtmzuJ5NZtV7M3jyjTm4+Xart7yitJSi7EwsnFxaRD1BIuDqc48WLrdg52HCMx/4sWdpOCc3RKGjr0n7QDvadbfB0skQQRCoqZKRkVBIamQ+mQmFeAbY4NbFCnN7/SYXnNwvWroa2LmbMGhae9Z/fo4ja64xYoZPs51PzaPFrd6x2/Hw8CAsLKzu+2+++abua01NTXJzc+ut79evH/369QPA3Nyc/fv3K1bZ+0BtpLVy4rNL+PVoDO5WBuy4lEpsVgnLp/hia6zLtospOJnp0dWpZRMdm0ofDwt8nU35+ZC80lNf+9H/c7ycfRkAj7x0eTuN2weqPwQXEuRvNNbaIGnCLE0dTSm/TvJl7rZwfjkSQ0JOKV+P9cGg9vdQ1x/N82Y+WuKVMESZDGefzujbOYJUSvHRY40aaadjsjkVncMnI9qz/nwi6y8ktVIjrXZ4fMxhtLu9xIdTFzFdeyIDQjXY9u3/4Tviaew9vUiOuEzytStkxcchijKemv0Bnt0VWxSiKIzMdRnzri85KcVYOhoivc2TLdWUyEOe7iZ3kNB8mFjr0WOMGyfWRxFxOo32vexaXAc1alSFxyfG9AgiiiLzdlxBSyph7YsB/D7Zj9isYp5afIo94WmcislmdBd7lX0SFQSBj570IrOogmXHFVsNpKpsvL4RU21TuiSH3bGqUxRF/j4TT3Tm/Q2tD07Iw1BbAyOhpklGGshz1L582pv3hrXlv/A0Ri05WddHLS0qHw1tKZZO9fPRNLV1sPNsh9TEBD1/f4r272/QO0gURb7fH4mNkQ6TApwY7+fIpaR8rqc/3KB3pWDWBkycIeYwAC7GLswe9BGb/GORdHUieNdWdvzwJWGH9qGtp0/3sROwdHLhyOo/qCxX3R5mmlpSbFyNGxhoqoB3XwfsPU04uTGKotxyZaujRo3SUL3/TjVNZt+VdI5FZjF7sCfWRjoMam/N1jd6oa8t5bW1IYiivHeZKuPrbMoIH1uWH48hrUB1b2iKIKEwgWPJx5jg0B+dsrw79kfbHprKJ9uvMGfjpftqnHghPo/OTiaI5eUIek2fLCEIAq/3c2fNiwEUlFUxaskptl1MISUqH1s3Y6RSCTKZSGp+GdEXg7H08KK4EqpqZBgOGUxlXByV0dH1ZB69nkVwQh4zB7qjoyllTFcHNKUC688nNVkvlcJtAMSdgBr5UPOn3J7iqbajWWFzEp+3pjFxwUJmrFjH+E+/pOe4SQx88Q2Kc7IJ2rJeyYq3TgSJwIApXiDC4dURLd5AVI0aVUFtpLVSSiqqmb/zKu1sDJna42Y+l6e1Idvf6MXAdlYM62CDq0XjvZNUifeHtUMmwsJ915WtSrOy5uoaNCQaTBBqQ0iN5KNlF1cwf+cVjHQ0uJSUz9HrWU2SXVhexfWMInydTRHLy5rsSbuVnm4W7J4ViLe9MR/+G0puaglni0sYsugYXp/uZeiC7ZRkpbMuVZdO/7cfj4/3MDxEiigI5O69mbMhiiLf7b+Ok5ke4/3kPdTM9LUY3N6arReTqahW/pDy+8ZtAFQWQfKFukMfdvsQV2NXvkhcgpajZb0Gt/ZtvejQdxDBu7aRk9JKDVMlY2ShS8+x7iRfy+PysYefUJIWU8CW74L557Mgtv94kQMrrnB6SzQRp1MRGxllp0aNKqA20lopPx+OIq2gnC+e7ojGbc0gTfS0+HOaP0sn+ypJu/vD0UyP6b1c2RKSQlhyvrLVaRYKKgrYHrOdJ12fxCI5BIwdwbRhscT8nVcpqahh3cs9cDTTZdHByCZ5ES4m5iOK4Odshqy0rNH2G03B2kiHf14KYHpbebFAtFiFk5k+U3o4M8tLPm917FMD+GREe+YM9iTAz5Orps6E/7uNs7E5gLxg5UpqIW8O9Kg3UWK8nyN5pVUcvJr5QLopFdc+IEgg9kjdIT1NPRb2XUhxVTHfnvu2wZY+k6ahqa3N4RXL1J6gB6RDoB2O7c04vi6SjV9fIPRg4n2HP0sLKzm08ipbFgZTlFOOqa0+1ZU1pEUVcOlwEodXXyPiTFozXYEaNQ/Ho5+p/QgSmVHEnyfiGO/ngK+z2b03tAJe7+/GxgtJfL47gvUvN31kUWthc9RmyqrLmOz1PJweDu6DGqw5cDWDnZdSeXuwJ+3tjJjZ34P3NodxKCKTQe3v3vA2OD4XiQCdnUzILC9HavbgfxcaUgk+ohZJ+hr8837vupylnT9sR2ZqxuQnAur9foKTR6D3xxKmL9rF4EG+nInJwc1Sn9G3hdoDPSyxM9Zh/YUkhvs074gyhaNrIu+ZFnMY+n9Ud9jT1JMp7afwe/jvTO04lQ7mHepe0zM2odeE5zm8YhlRZ0+pbBGBKiMIAkNf6siV4ylEB2dyalM0pzZFY9PGGHdfK9y6WmJg2vgDSU2VjMvHUzi3M5bqKhldhznjO8wZLZ2btz1RJrLu83NcPpaCV0/bR+59R03rR+1Ja2WIosgn2y5joKPBB08ob16fojHS0WT2YE/OxeWy70oGIL/WkMQ8Fuy6ypwNl6iukSlZywejSlbF2oi1BNgE0LZGhNLsBvloheVVzN0WTjsbQ17t6wbA013tcTbXa5I37UJCHl62RhhoayCWlSG5RwuOu1FRWkVcaDaeftZ1BlpRTjbRF87iEdCrwY3M+9nRALypmczfQQlEZRbz9uC2SG8bPSSVCDzj58iJqCxS8lth/qHbAEgJhrL63t7pHadjqm3KouBFDX5PnQY/iaWzq8oXEagy2roadB3qzPiP/Jk0vzsBI9tQVVHNyY1RrPrwNJu/DSb0YCK5aSXEhWVzZms0W74L5vfZxzm5MQobN2MmfhpAj9Fu9Qw0kOe+dexjT1ZiEZnxrbCoRU09DAwa9t97UG4MW1c2ak9aK+Ofc4mcjcvl6zHemOk3bLzXmnnW35FVp+P5ak8EIYl57A5LIyW/DKlEoEYmEuhh0cA70xo4EH+AzNJMPu3+KRz7FqTa4Daw3pqv/rtGVlEFyyf71TX21ZRKmDnAg3c2XmL/1QyGdmi8A3t1jYzQpHzG+ToAICsvR3jAcCdAdHAmNdUy2va46e0K3r0NUZThO3x0g/VaDvbodOhAQHIYG799jQsJeTzRsXFdx/k6sPhwFJsuJPPmoLsMNldF2vSHY99A3HFoP7LusIGWAa90eoWvz33N6dTT9LK/aYBLpFIGTn+NdfPe47/F32Hp3AZEGTKZDEEQ8OrdH3OHR3j2qYIxsdbD70kX/J50IS+9hJiQLKJDbnrYACRSAUsnQzr2s8e5gzkO7RqOq7qVtt1tOLM1hvBjyVi7tm+pS1GjpkmoPWmtiOS8Ur7cHUFvdwsm+D96b+waUgkfD/ciIaeUv07G4WltwPfjOhEydzBtrQ1ZciQaWStL8BVFkb+v/o2LkQuB5RVwZQsEzqnXH+1MTA7/nkvkxcA2dHKs35dqdGc7XC30WXQg8o7Xfi29iNLKGnxr56PKysqQ6Dy4J+16UDqmNnpYOctbb5QXFxN2aB9tewRibNV42NVwyBDKw8LopF3Bq33vPMDb0UyPXm4WbAxOanW/Sxz8QMuwrhXHrYzzHIe9gT2LghchE+t7fO3btcd3+GhiLpwlaPO/nN26kQs7t3Bu2ybWf/Y+2UkJLXUFjxSmNvr4PenCs3O7MWl+d/pNasvTc7rw0qI+PPO+H72f8cDRy+yeIUwtHQ3adrch+kImZcWVLaS9muaiuLiYgQMH0rVrV7y9vdm+fXvda6tXr8bHx4dOnToxefJkAOLj4xkwYAA+Pj4MHDiQxMTEuvUHDx7Ez88PT09Pdu3a1eLXAmojrdUgiiIfbglHBL4a4/3I5k70a2vF9jd6cWHuIFb8rxtjfR0w1tNkxgB3ojOL2XM5Xdkq3hehWaFczrnM823HI/nvXflA9d5v1Vvz48FI7E10mT2o4WxLDamEWQPduZZexL4rjV/7hXh5E1tfZ3nTYnm488E8afmZpaTFFNCux838nEsH/qOqvAz/kWPvuM9wyGAAig4cuOc5xvs7kpxXxuoz8Q+ko9KQasoLCKIOQE11vZe0pFrM6jKL63nX2R27u8HWflNe5O1/dzBn/S7eXreD2f9s53+LfkOiocGmz+eSl/bw1YuPMybWenQItMfOwxSNRsbQ3YuOfe2pqZYRcVpdQNDa0dHRYevWrYSEhHDkyBHmzJmDKIpcuXKFzz//nMOHD3Pp0iV++uknAGbOnMnUqVMJCwtj0qRJzJo1q05WfHw8586dY/fu3bz66quUl7d8zz51uLOVsP58EieislkwuiOOZk3vgdUaud2bBPBkR2sWWeqz+HAUT3S0uaOnRtVYfWU1RlpGPJUSDXnxMHUnaNycR5icV8rZuFzeHuzZ6IxTgJGd7Fl8OJpFByMZ2qHhtV9IyMPWWAd7E13E6mrEqqp7joW6E9eD0hEE6oZbV1VWELJnBy6dfbFyaXPHfdqurmh7eFC4fz9mU6bc9RzDOtgQ6GHBZzuvcjm1kAWjOt7x2lWOLs/D9d0QvhE6T6z30jDXYay8spIlF5cw1GUoWtL66QiCpP4zsamtPePmfs76+R+yYcHHPPvZ1xhbqYeKKwNzOwPsPEy4cjyFLoOcEFrJ+4sqkr8zhsrUEoXK1LLTx+QptyatFUWRjz76iOPHjyORSEhJSSEjI4PDhw8zbtw4LCzkI9TMaourzpw5w5YtWwCYPHky7733Xp2s8ePHI5FI8PDwoE2bNly7do3OnTsr9NruhdqT1gpIzS/ji90RdG9jxqRurXCszsNy6P+Qfu/Jpz6FXEsv4mBEhnL0kMkg6zqErIbtM2DlCMiOvuPyc2nnOJh4kAmOg9E78wv4PCv3xNzC9tBU4O5Nh6USgbcGeRKZUcyWiw09LsEJeXVeNFl5BcADhTtFmcj1oHQcvMzqBltfPXaI0oJ8ut3Fi3YDw8GDKQsOoTo7+67rtDQkrPxfN2YN9GBzSDKjfzl139MVlEbbJ8DGG44vBFn9fm8SQcJs39mklqSy7tq6Jokzd3DimY8XUF1ezsYFH1OUc/efnZrmo2Nfewqzy0m4kqNsVdQ8BGvXriUrK4vg4GBCQ0OxtrZ+YA/Y7RErZUSw1J40FedGmLNaJvLt2E6txoNUj4oiiNoPEbugIBm6vQQdx4KkCd6TS+vhxPegqUffsy8z3ngOiw8bM7i9dcv9w4gi7HkPwtZDeYH8mK6pvPv85unwwkHQqO81Ka0q5dPTn+Jk6MRLUWdBSx+GfH6bWJEtIcn4u5je0zs6wtuWv07G8c3eawzraFM3XzMlv4y0gnL8boQ6aysIHyTcmRqVT1FuOd1Hyz1mMlkNF3ZuxcbdE4f23vfcbzh0CNm//krRwUOYPjvhrmulEoG3B3vi52zKW+tDGbXkJJ+N7MDIznZoa6iwV00QoO/7sP55uLwZfMbXe7mHXQ962PZgefhyutl2o51Zu3uKtHJpw9iPF/Dv/73P4g+m8+J3y7AybmUtSh4B2nS2RM9Ii8vHU3DxbvrAejX1aarHq7koKCjAysoKTU1Njhw5QkKCPOdzwIABPP3007z99tuYm5uTm5uLmZkZPXv2ZN26dUyePJm1a9cSGBhYJ2vjxo1MnTqVuLg4YmNjadu2bYtfj9qTpuJsCk7mWGQW7w9ri5N5KwhzymogP1FeAXf+D1g7Dr5tA5umy4+V58OWl+DXHnB5i9w7dSdSQmDHTHAJhJkhCJaefF35NW3SdnM0smmd+BXCtd1wbrncCzbqF5hxAd6Lg6eXQdolOLygwZYfQ34ktTiV/7MKRDfhNAyeDwaW9daEpxQQk1XC010c7qmCRCLw2cgOZBVVsOTwTe/djXw0v1uKBgCEB/CkXQtKQ1NHimtnuZ5RZ0+Tn5FGt5HPNMkg1vb0RNPZiaL9+++59gZ9PC3ZPas3XrZGvLspDL8FB3lz3UX2Xk6jrFJFJxO0HQ5WHeSVurKGOr7r/y4A43aO48MTH5JSfO98s3CNeA53SEW7UMahU5sVrrKaeyPVkNC+tx0Jl3MozFa3S2ltVFdXo62tzaRJk7hw4QLe3t6sXr2adu3kD0odOnTg448/pm/fvnTq1Im3334bgMWLF7NixQp8fHz4+++/63LVAJycnOjWrRtPPPEES5cuRecBJrk8LA/lSRMEwQT4A+gIiMB04DqwHnAB4oHxoijmCfJ3+Z+AJ4FSYJooiiG1cqYCc2vFfi6K4qra477ASkAX+A94U3yMWncXlFXx9Z5r+DqbMqWHi7LVuUlFEVzZCkUZUJJ186MwRW6gyW5JqjZxAv+XwGsEOAYAAkTsgKNfwab/gdVC6PseeI2s71kryoB1k8DAGsatAn1zmLoL/p3ITwm/8sdOGf08v25+b1p1JRz4BCzbwTMrQXrLv4zXCPD9H5z+Wd5Dy60/AOfTz/PvtX953rYPvid+Acfu0KVhntaWkBS0pBKGezfNa9LZ0YSxXR3462Qcz/o74mKhT0hCHnpaUtrZyCsxbxhp9+tJq6qoISYkC3dfKzS1pIiiyLntmzC1tcfNP6BJMgRBwGjIEHL+WkFNfj5Sk4a5hY1ha6zLupe7cyIqm72X09l/NZ3toanoaEqYO7w9z3dvOJlBqUgk0Pdd2DhN/n/g/Uy9lz1MPfhvzH/8Gf4nayPWsi9+HxPbTeQl75cw0Wn4M9kXv4/3j79Pp7YdEYPziLl6Uf4uqabF6RBoR/DeBK6cSKHH0+7KVkfNfXDlyhXc3NywsLDgzJkzja6ZOnUqU6dOrXfM2dmZw4cbVmyvXLmyOdS8bx7Wk/YTsFcUxXZAJyAC+AA4JIqiB3Co9nuAJwCP2o+Xgd8ABEEwA+YBAUA3YJ4gCKa1e34DXrpl37CH1LdVsfhQFLmllcwf2UG1wpwnF8k9XEc+h7B1kB4mN8xsO0HPmfDUTzBlO7x5Cd4Mg2FfgnNPuREmkUCH0fDaaRj7pzxkuHEaLPGH4FVQXSH/2DBZ7nV7dq3cQAPQMULy/GYSrQbwYvFSEv99C7GqmZ94z/8OubEw5Iv6BtoNhn4JFp6w9VUoyZGHOU99iqOmETOD/gUTZ3jmT/l130JVjYydl1IZ6GWFsZ5mQ7l34P1hbdGUCnzxXwQgLxro7GhSNxpMrM29uN9mtrGhWVRV1NCuhw2iTEbIfzvIjIvB76kxSJoSlq7FcPBgqKmh6OjR+zq/hlRC/3ZWfPOMD+c/HsQ/LwXQzsaIHw9GqmYTY69RcsP9+MJGvcFGWkbM9p3Nrqd3MbzNcNZErGHwpsF8fPJjLmZerGt6uzd+L+8ffx8fSx9+fXIZ1eY6FCemqsdIKQkDUx1cfSyIOJ2mnufZili6dCkTJ07k888/v/fiVsYDe9IEQTAG+gDTAERRrAQqBUEYBfSrXbYKOAq8D4wCVtd6woIEQTARBMG2du0BURRza+UeAIYJgnAUMBJFMaj2+GpgNLDnQXVuTcRkFbPydDwT/BzpaG+sbHVuUlMFF9eA+2C5AXVLpeJ9IZHKPRAdnoaInXDyB9g5C458CZaekHQWnlkBtj7192nqYPXCOjZ/M4WxkSuJ++IAG+zfx7RtbwJczRutDH1gSnPlzUvdB4FHwzFOAGjpyY3NPwbCjpn85OJFcnEyK9Iy0Gv3FIz+VZ6Pdhsno7LJKam8a8FAY1gZ6TBjgAff7L3G3svpRKQVMqP/zSd+WZncSLvfcOe1M2kYWeggEbL555MFpEdH4tTRh/Z9BtyXHJ2OHdGwsaHowEFMRjdsfNsUNKQSerpZ8Grfal5dE8ypmBz6elree2NLIpFAn3dh8wsQsV3+d9wINvo2LOi1gKntp7L22lr+i/2PHTE7cDN2o4ddD/699i+dLDvx66Bf0dfUx8TVCVnoNeLyY2ljqtzcnscVN19LYkOzyEgoxMZVhd571dyRV199lVdffVXZajQLD+NJcwWygBWCIFwUBOEPQRD0AWtRFG80m0kHbnS/tAeSbtmfXHvsbseTGzn+WPDF7gh0NaXMGdLyiYp3JXIfFGeA/wsPbqDdikQq96y9fAwmbwPLtvLctcA50HFMo1t0tLXp9eYqDvotxVijmndT3oT9nzD+lyPsvJT68Drd4OjXUFHcIOG/AbY+FPf/iK0pR/kncgOTCorw6/EujFvZqIEGsOViCiZ6mvRra3Xfak3v7YKzuR5zNoQiE6lrYgsgKysF7i/cWVZUSVJEGlLhOGvnvk1hViZPzJjDM3O/QEOz6V4+kLeZMBw0iJKTJ5GVlt7X3tvp384SIx0NtjdS0aoSdHha7kU99u3dcysBd1N35vWYx5HxR5jfcz76mvqsiVhTz0AD8OoQgHa1lFOXD7bEFahpBKf25ggCJISrqzzVKJ+HMdI0gK7Ab6IodgFKuBnaBKDWa9bsPmNBEF4WBOGCIAgXsrJaMKG8mThyPZPD1zKZOdAdS0MFGEKKJHglGNrKPWmKRBDkOV1Td8Db12DAJ3ddbmOsw6AREzF75wISv//xssZuDul+xJYjZxUTKsqKlBc++E4Dq8ZnpMYWxLLy8kpe2PcCgbGr+dTSHPeqamYNXCTPWbpDvlxReRX7r6Qzwse2bgTU/aCtIeXjJ70oqaxBEKCL003v4Y1wp3AfCa4xFxOoKFhFetQpugwbwf8WLaV9YP8HzvczHDQIsaKC4hMnH2j/DbQ1pDzpbcu+K+mUVlbfe0NLI5HKvWmZV+V5lk1AT1OPMR5jWDt8Lf89/R+/D/m9zkAD6ODdA4BrV841i8pq7o2OviY2bsbEh6vboahRPg9jpCUDyaIonq39fhNyoy2jNoxJ7efM2tdTgFtnGTnUHrvbcYdGjjdAFMXloij6iaLoZ2mpYmGR+6SqRsbnu67iaqHPtJ6uylanPvlJEH0QukxuPD9LURjZ3tHAaYCOEYxYBJO3YUcG3bI3E5KYf+9992L/XLkXrP9Hjb78X+x/jNo2iu+DvyevIo8pHaawYvDvbJh4HL07hL5usOdyOhXVsiZVdd6Jwe2t6d/Wkq5Ophjp3PR23Qh3SvSaXgl8fvtqEMsZP/9bBkx7BR39hxtSrOfni9TEpEnTB+7FqM72lFTWcOCqknrj3YuOY+W5afvnyr2u94GjkWODhrfm9o6IWhLy4xIbjJdS03K4eFuQnVRMcV6FslVR85jzwEaaKIrpQJIgCDficQOBq8AO4Eb5xFTgxuCsHcAUQU53oKA2LLoPGCIIgmltwcAQYF/ta4WCIHSvrQydcousR5a/zyQQk1XC3OFeD+RlaVYu/i3/3HWycvVoDLf+yNoMZIzGKVadink4WdEHIWof9HkH9Bv2S0ooTGD+mfl0serCgWcOsGXkFmb7zsbPrjua+vd+SNgakoKLuR5dnR48f04QBJZN9mPti/UrL+v6pDXRkxYXGkxu8kXMnfri0LZxj+F966ahgcHAARQfPYpY+XCzEANczbA11qlr+qtySKTyQpmCJDjyxb3XiyKU5EDGFYg9BmX1HygEiQR9J1uMc+Fa7rVmUlrNvXD2lhcrJVxWe9PUKJeHtQJmAmsFQQgDOgNfAl8DgwVBiAIG1X4P8hYasUA08DvwOkBtwcAC4Hztx//dKCKoXfNH7Z4YHvGigbySSn48GEmghwUD2t1/rlKzUlMNIX+D+0B5Ww0VRKPrc1iTS/6VQ6QXPOCMtfRweU83c3cIaJiIWllTybvH3kVDosE3gd9go39/Y3wSc0oJisthdBf7h24foqUhQUezfuXl/RQOVJWXc2D5LwgSMzr2H/lQutyO4aBByIqLKTl79t6L74JEIjCykx3HI7PILVHR4ddO3cHvBQj6DZKDG74uinDkK/ihAyywhIVt4LeesHokLO4qr2q+JafNrV0XTIu0CEo81YIXoeZWzGz1MTTTIeGyOi+ttWBg8GARABcXF7LvMSXlVlauXMmMGTMA+Oyzz/juu+8e6LxN5aGMNFEUQ2vDjD6iKI4WRTFPFMUcURQHiqLoIYrioBsGlyjnDVEU3URR9BZF8cItcv4SRdG99mPFLccviKLYsXbPjEe9R9rxqCwKy6t5e7Cn6g1Qjz4IRanyHC1VxfMJZFpGjJYcZ01Qwv3vz4qE1aNBywCe39JoYcSi4EVE5Ebwea/PsTW4v67wqfllTPnrLHqaUp7xffBQ5924vXCgqrycy0cPUlnesFXJ6U3/UJSTiabeIBy8FJsmoN+zJxI9PYoOPHwC/KjO9lTLRHaHqag3DWDQPHmu5o6Z8groG4gi7Hkfjn0NVu2gxxsw7Gt55fLE9fLCg52z5NXBtQaeW/uuSESBsMunlXQxagRBwNnbnKSIXKqrVLSpsprHAhWLpz3exGWXIAjgZWukbFUaErwS9K3AU4Vb1WnqIPEew3CNC2w7e53y+3lzzYuH1aNAkMCUHWDasIHqkcQjrIlYwySvSfR36n9fqiXnlTJh+Rlyiiv5+8UAHEybZ3qEWF6OoKWFIJV72K4cO8S+335k5ZzXiQm+6dXKjI8lePc2LJwD0DZwxtLJUKF6SLS1MejXl6JDhxBrHu4m52VriKe1AdtUNeQJoGMMw7+DzCtwqrZjuUwGu96Cc8ug+xswaZN88kT31+SVy22Hwf/2wJjfoTAV/hgAO2Zh20beeiMnNo6qWw0+NS2Ki7cF1ZUyUiMVkOOqpsVIS0ujT58+dO7cmY4dO3LixAkAXnvtNfz8/OjQoQPz5s2rt+fbb7/F29ubbt26ER0tn+iSlZXF2LFj8ff3x9/fn1On7u7Z/v333/H396dTp06MHTuW0oesbr+B2khTIeKzS7Az1m0QwlI6hanyHK0uz4P0/loytDidJqItlhNQfqpBO46sogpm/BPCL0ei61eAFqbCqpFQVQpTtoFFw07j6SUzUMmaAAAgAElEQVTpfHL6E7zMvHjb9+37Uikxp5QJy4IoKK1izYsBdHUyvfemB0RWVo5wSyPb7KQENHV00dLRZdu3C9jx/ZcUZmeyf9lidA2NkOoEYutujFSq+LcCw0GDqMnJoezixYeSIwgCozrbE5yQR2KOYt74moV2w6H9KHlLjqzrsGOG/OGm99sw9IvGi2EEQT7/c+YF+WSOkFXoZV9Ey8wYk1yBS1mXWvwy1Mix9zRBQ1NCvDrk2ar4559/GDp0KKGhoVy6dInOnTsD8MUXX3DhwgXCwsI4duwYYWFhdXuMjY0JDw9nxowZvPXWWwC8+eabzJ49m/Pnz7N582ZefPHFu553zJgxnD9/nkuXLuHl5cWff/6pkOtRD1hXIeKyS3C1aLyvllK5uAZEGXRtONpI5XAMQDR14fnC08w9PYJnfB0QBIFT0dm8tT6U7OIKdoWlUVJRzbsDnRGi9sOhBfLGtVO3g3WHBiJLq0p559g7VNVUsbDvwgYVeXcjPruEib8HUVpZwz8vdW/2xsSy8rJ6RQM5KYlYOrkwft6XXNi5laDN64gJPouspoZBL73NyU0y2vdqHqNRv09fBE1Nig4cRM/P76Fkjepsx8J919kemsLMgR4K0rAZeGIhxB6F3wdAZTH0+1A+kP1e6QvahjBkgbw4J/oAjm07kHcxh7PpZ/GzebifnZoHQ0NLioOXGQnh2YjjPVQvBUVF2bNnD+np6QqVaWNjwxNPPNGktf7+/kyfPp2qqipGjx5dZ6Rt2LCB5cuXU11dTVpaGlevXsXHR94sfeLEiXWfZ8+eDcDBgwe5evVqndzCwkKKi+9cwX358mXmzp1Lfn4+xcXFDB069IGu9XbUnjQVQRRF4rJLcLFQsSHq1RUQshra9AMzFWsJ0hiCgNBpIp1rwslLjSUoNpcf9l/n+T/PYqyryX8zezG3QzbOJ9+n4mt32DBFPot00gaw920grqy6jFmHZxGeHc6CXguoqTDn9+OxTFh2hs7/t59fjkRTc4fxMUeuZ/LM0jOUV9XwbwsYaABi6W1GWlIi5g6OSDU0CXh6PFO//xXXLv506DsQPRO5QWrv2TxGmtRAH/1evSg6cOChe9c5mOrRzcWMbaEpqj0yydBaPiqsshgGzoN+HzS9nYymLrj2gaj9OLXtiH65BhejG59BqKZlcO5oTmF2OXnpKuzBVVOPPn36cPz4cezt7Zk2bRqrV68mLi6O7777jkOHDhEWFsbw4cMpL79ZXHarAX7ja5lMRlBQEKGhoYSGhpKSknLX4oRp06axZMkSwsPDmTdvXj35D4Pak6Yi5JVWUVhejavFw/WoUiiiCLvnyNsLPPWjsrVpOj4TEI5+xQSdIKatsKKiWsY4Xwf+r48+upufwCvzKhVauuyq9KOqwzgmjHsOoZEwbnl1ObMOz+Jc+jn6mM7k681axGYdA6CttSHe9sYs3HedI9cy+WF8Z5zM5QZ2WWUNX/4Xwd9BCbS1NmTJc13wsFZsztedkJXfDHeWFhZQVlSIucPN/DoTaxtGvzsXgGP/XEdTW4qlU/P9zRkOHkTx0aNURESg0779Q8ka1cWOj7deZv/VDIZ2uL+q2haly/PQ9knQM7v32ttxHwxR+7G1lHvUM2NiKK0qRU9TxR7eHhOcO9a24gjPwcxWBaMcKkhTPV7NRUJCAg4ODrz00ktUVFQQEhJCp06d0NfXx9jYmIyMDPbs2UO/fv3q9qxfv54PPviA9evX06OHvKH0kCFDWLx4Me+++y4AoaGhdV65xigqKsLW1paqqirWrl2Lvb1iBiSpjTQVIS5b7kZ1VSVP2vk/5OGXPu/K51e2FsxcwakHk7NOs6xkJD+M78QYixRY9TTIauDp5Wh5jeDif7GsCUokziia94e1qzfEvqKmgreOvMXZtLMYFD3Hrgg7ernrMKW7MwO9rHE000MURbaHpvLJ9ss88dNx5o3sgJeNEW+uv0hsVgkv9nblnaFtWzTHUCwvqxuunpOcCIC5g2Oja1Mi87B1N0HSDPloNzAYMAAkEgr3739oI+2pTnasOh3PK38H82JvV94d1hZtDRXL37zBgxhoIJ8RuwcsK64jSKWY5WsQnBFMoEOgYvVT0yQMzXQwdzAgPjybLkNUs/WQmvocPXqUhQsXoqmpiYGBAatXr8bV1ZUuXbrQrl07HB0d6dWrV709eXl5+Pj4oK2tzb///gvAzz//zBtvvIGPjw/V1dX06dOHpUuX3vG8CxYsICAgAEtLSwICAigqKlLI9QgqHTp4APz8/MQLFy7ce6GKsSk4mXc2XuLwnL60sVQBb1r8KXkfJ/dB8Oy/8oHSrYngVbBzFpXTD6JVkADbXgdjB3huQ11hwLWca7y//0+ii8+jIZrgZuJGP9dO9HbqyPKw3zmVepKKtLFYiIF8PdaHPncY8p2SX8acDaEExeYiCGBtqMP34zvRy71hI9zmJn7ic0h0dXD66y9C9+3m0F+/8fKvKzE0r69LaWElK947SY+n3eg6tGElqyJJnP4CFbGxuB/Yj3Cfs0Bvp6yyhi/+u8qaoETa2xrx88QuuFupwP+LIvm5K5i1Yc1VR8LzLmM5fSjv+L+jbK0eW4K2xRCyP5EXvuuNtp6KF04piYiICLy8FNMM+1GnsZ+VIAjBoig2mnzayu68jy5x2cVIJQKOZirgSctPkudqmbrCmOWtz0AD+dB2qTZa21+DzS+Agx+8eJBCIyvWXVvH+J3jGbdrHEnVh+hg4Y6elkBk8TF+v7qQqXuncir1JOVpTzPWcwx7Z/e5o4EGYG+iyz8vdufTEe15rpsTe98KVIqBBiArK6trZJuTkoiWrh4GZuYN1qVE5gHNl492K2ZTp1Cdnk7hf/89tCxdLSmfj/bm9yl+pBeWM2LxCTacT1KAliqExxCIP4G9uwcWhdqcTQ1StkaPNS4+FogykcSrufderEaNglGHO1WE+OxSHE110WzG0FOTqCyFdc9BTSVM/Ffe/0nJHEg4wNGko8zrMa/plZU6xvKWCFe2QKfn4KmfKBWrmbBjLMnFybQza8eH3T5keJvhGGvLrzG7qJx/QsLYERFMZaU2n4956q7G2a1IJALTeyu/sEIsu1k4kJOchLmDY6NVaamR+WjqNG8+2g30+/RB28ODnD//wmjkSIVUyQ1ub00nh0Bmbwjlvc1huFnp4+v8gCFGVcNjEJz9DRsjGZJqyEyMo6CioO7vVE3LYuVihK6hJjHBmXj4WStbHTWPGWojTUWIVYX2G2lhsPdD+Wik59aDxcO3OiiqLOJC+gXOpp/lbNpZssuyGesxlufbP4+F7r29TTtjdjL31FxkogwrPSve7Ppm008+7Cvo8DR4PQWCwPLgX0kuTuaXgb/Qx6FPg+UWhjrM6tuNWX273c8lqhSy8nIEvZs5aW26+je6LiUyD7tmzke7gSAImE2fTtqHH1Jy8iQGgYrJr7Iy0mH5ZD8G/3CMj7ZcZtes3sp/yFEEzr1BQxfbGnlTTcs8LUIyQu67gbIaxSCRCHgG2BB+JJmyokp0DZvegkeNmoflEXhHa/2IokhCTgkuyjLScmJg0wuwLBAyLsPIxeD5YD1eqmXVhGaGsuTiEibtnkTvdb2ZdWQWmyM3Y6lrSVerrvx1+S+GbR7G50Gfk1KcckdZ26O38/HJj/Gz9mNEmxH8dfkvwrPCm66MoQ20HwmCQGxBLKuurmKk28hGDbRHBVl5ORIdXUoLCygtyMfcoWGyc2lhJXnppdh5PviA9/vFePiTaFhbk/PnXwqVq6+twfxRHbmeUcQfJ+IUKltpaOqAayDG6cfQNTLCulCX8xnnla3VY41XD1tkNSKR5zKUrYqaxwy1J00FyCyqoLSyhjYtbaRVFMOBTyFkFUi1IHAO9JwFune/ee+N38t3579DX1MfC10LzHXNsdS1JK0kjaC0IIoqi5AIEjpadOQl75cIsA2gk2WnulBlfEE8K66sYHPUZjZFbmKA0wCedH2SQIdAtKXyeZlbo7Yy7/Q8AmwD+HnAz1TLqjmffp65p+ay4akNdeuagiiKfBn0Jboauvc9LaC1IZaVIdHVITdFnqfVmJHWkvloNxC0tDCbMpnMhd9RdvkKuh0bNg1+UAa3t2ZIe2t+OhTJCB9b1cjrfFg8hiBE7cfWeSj5CSVcSG99xVCPEub2Bli5GHH1VCo+AxzUjW3VtBhqI00FiM0qAWh5T9rJH+DCX+D/grzNhuG9e09F50Xz6alPcTB0wMXIhazSLMKzwskuy8ZY25jBzoPpadeT7rbd75hD42Lswvye83mt02usubqGnbE7OZBwAANNAwY4DcBW35ZlYcvoadeTn/r/hI6GPMdqfs/5vHrwVX4N/ZXZvrObfJl74/dyNv0sHwd8jLluwyT6RwWxuhqxshJBR+eu7TeSInLl+WiOLVsVaTJ+PNm//kbuX39i/8MPCpX92cgODP7hGJ9uv8xf0/xb/020tuWNs5mM2PAakpOj1HlpSqZ9L1uOrr1OZkIR1i4qOF9ZzSOJ2khTAeJzao008xY00iqK4fyf8nyt4d83aUtpVSlzjs1BT0OPZYOWYanXtKT6O2Gjb8M7/u/wlu9bnEs/x564PRxKOERRVRG97XvzY/8f63nMetn3YqzHWFZeWclAp4H4WMpHeoiiyLXcawSlBdHdtjte5jfLm0uqSlh4fiFeZl6M8xz3UPqqOlUp8tCxpo0NOclJaOroYmhe/3cUeS6diFNptO9l2yL5aLciNTTE5NkJ5K5YieXbyWg5OChMtp2JLm8PacuCXVf5Lzyd4T62CpOtFMxcwdwdZyEKALssHXVempJx97Pm5IYoIk6lqo00FeWLL77gn3/+QSqVIpFIWLZsGQEBAfclY9q0aYwYMYJnnnmm3vHU1FRmzZrFpk2bFKnyPVHnpKkAcdklaGlIsDPRvfdiRXFxDZTnQ6+mJeKLosj/Bf0fcQVxfNPnm4c20G5FQ6JBT7ueLOi1gKMTjrJi6Ap+7v9zoyHNd/zewUrPirmn5pJUmMSKyysYs2MM43eN54fgHxi/azwv7nuRE8knEEWRX0N/Jbssm7nd5yKVqGjjUwVRES1PNNd2dycnObFBZWfClRwOrYzA3tOEwGc9laKj2ZQpIJWSu3KVwmVP7eFMBzsj5u+8QmF5lcLltzjugzHLPo2huQUOOfrqvDQlo62rgZuvFVHnM6iqrFG2Ompu48yZM+zatYuQkBDCwsI4ePAgjo6NN/J+EOzs7FrcQAO1kaYSxGWX4Gymh1TSQiGammoI+gWcesj7hzWBzVGb2R27m9c7v06A7f09mdwPWlIt/Gz80GxkTBOAgZYB83vMJ64gjie3PskPwT+gr6nPJ90/Yc+YPbzt+zZxhXG8fuh1Rm8fzdqItYzxGFPndXuUqYiSG2labjeMtJv5aOlxBexdFo6ZvT5PvuaDRgtOQbgVTWtrjIcPJ3/zZqrz8hQqW0Mq4cunvckqruCng1EKla0UPAYh1JTj6mqDXY4uwalqI03ZePW0pbK8htiQTGWrouY20tLSsLCwQFtb/nBvYWGBnZ0dhw4dokuXLnh7ezN9+nQqKioAcHFx4b333sPb25tu3boRXfuQC3D8+HF69uxJmzZt6gyz+Ph4OnbsWPd1YGAgXbt2pWvXrpw+fbrZrkttpKkA8S3dfiNiB+QnQs+ZTVp+LfcaX539ip52PXnZ5+VmVu7e9LTvyQfdPuAVn1fY9fQu1jy5hvFtx+Ng6MD/Ov6PvWP28mXvL9GQaGCuY85bXd9StsotQkV0NBq2tlQioyQ/r85Iy0svYfeSMPSMtBgxoxNausrNcjB/YTpieTk5y39XuOxOjiaM83VgTVACmYWKGXCsNGpbcbgY5CGtEsmJjaewslDZWj3W2HmYYGypy9VTacpWRc1tDBkyhKSkJDw9PXn99dc5duwY5eXlTJs2jfXr1xMeHk51dTW//fZb3R5jY2PCw8OZMWMGb7118z6RlpbGyZMn2bVrFx988EGDc1lZWXHgwAFCQkJYv349s2bNarbrUuekKZkamUhCTikD2lm1zAlFEU4vBjM38Lz7INyCigL2xe/jj/A/MNEx4avAr5AIqmHXT/KadMfXNKWaPOX2FCPajEAmyh75MOcNKmJi0HZ3Jzf5RmWnI6WFlez4KRRBKjDyzc7oGze9Kra50PbwwHjsGHL//huTcc+g3aaNQuXP6O/B5pAUlh6L5dOnHm5eqFLR1AHXPjhlXACJXV1eWj/HfsrW7LFFEATa9bTl7PZY8jNLMbF6BCqJFUxk5AKKiiMUKtPQwAtPz0/uusbAwIDg4GBOnDjBkSNHmDBhAh9++CGurq54esrTO6ZOncovv/xSZ5BNnDix7vPs2TeL0UaPHo1EIqF9+/ZkZDRsu1JVVcWMGTMIDQ1FKpUSGRmpqEttgGrccR9jUvPLqKyRtZwnLeEUpIZAzxkNxj3VyGoorizmePJx5hydQ/8N/VkQtAB9TX1+7PcjZjqtq6O7IAiPjYEm1tRQGRtbl48GYOHgTOS5dIrzKhjxhg/GlqpzQ7GaPRuJjg4ZX36FoucHO5nr8XQXe9aeTSCzqJV701wD0S6Mxta1DQ7ZupxPV4c8lU277rYIAlw7rfamqRpSqZR+/foxf/58lixZwrZt2+66/tac3Vu/vhEyBRp9f1q0aBHW1tZcunSJCxcuUFlZqQDtG0ftSVMycdkt3H7j9GLQM4dOE9kTt4efQn6isLKQ8upyqmQ3k61NtU0Z33Y8I91G4mXm1fpbGjziVCUlIVZU1Blpmto6GJpbkJkQgYGpNlbOqlWNpmFujuXMGWR89TXFR45iOECxVYsz+ruz9WIKy4/FMndEK/amOfcCwNXBiNQYLULiz0HjQyTUtBAGpto4dTDn2pk0uo1sg6SlcolbCffyeDUX169fRyKR4OEhn5QTGhqKm5sb+/fvJzo6Gnd3d/7++2/69u1bt2f9+vV88MEHrF+/nh49ejT5XAUFBTg4OCCRSFi1ahU1Nc1XSKI20pTMjfYbLeJJy7oOkXuh34dsjd/LvNPz8DL3op9jP3SkOuho6KCroYuzkTO97HrdMXlfjepRV9np4U7OzouY2TsiSCRkJRZh6WSoZO0ax/S558jbsJGMr75Cv1dPJNqKC8W6WOgzqrMda84m8EpfNywNlR/mfSBsfEDLEBe9bE4DJVFJFFYWYqSlWkb344ZXT1v2Ls8h6Wouzh0f3d6LrYni4mJmzpxJfn4+GhoauLu7s3z5ciZOnMi4ceOorq7G39+fV199tW5PXl4ePj4+aGtr8++//zb5XK+//jpjx45l9erVDBs2DH395rt/q400JROXXYKelhSrlriJnFkCGjqsN7Pk89Of0sO2Bz8N+AldjRZs/aGmWaiIjgFAq40bOUkJOPt0obKsmvyMUtoGqOZQaEFTE+uPPiTphRfJXbkKi1cUW5Qyc4AH2y6m8PuJWD560uveG1QRqQY4dcc6LxgNfWfsstV5aaqAi7cF2noaXD+brjbSVARfX99GqywHDhzIxYsXG93z7rvv8s0339Q7tnLlynrfFxcXA/Jq0MuXLwPg4eFBWFhY3ZrbZSgSdU6akonLLsHFXL/5w4mVJXBpPavb9uLziz/Sz6EfiwcuVhtojwgV0dFo2NlSJYgU5+ViZu9IVmIRAJYqFuq8FYNevTAcPIjspUupSk9XqGxXC31Gdbbn7zMJZBdXKFR2i+LSC0nOdVzbd8A+W5fzaeeUrdFjj1RTgoe/NbGhWVSWVStbHTWPMGojTcnEZ5fgatkCoc6ks/xhoM3C0igGOw/mh34/3Nf8SzWqTUV0tLyys3Zmp4WjM5kJciPNSkXDnTewev8DkMnIXPidwmXPGOBORXUNv5+IVbjsFsO5NwBtbHXRrZBy5ZraSFMF2na3oaZKRrS6Z1qrJD4+HgsLC2WrcU/URpoSqaqRkZRXhmsLjINKjd7PT2YmDHUcyLd9vlXnmz1C3Kzs9CA76ebMzqzEQgzMtNE11FKyhndHy8Ee8xemU7h7N2XhlxUq283SgKc62fH3mQRyS5qvAqtZsesMmvq4aKUCUBmTru6XpgJYuxhhYq3H9SDFeoDVqLkVtZGmRJJyS6mRiS1SNLA/9QQAb/rPQUOiTkV8lKhMTESsrKz1pCWioa2NkYUVmQlFKlfVeSfMpr+A1NSUrEWLFC575gB3SitrWH0mXuGyWwSpJjgFYJB1Dn1bK+yydLiY0XiOjZqWQxAE2gbYkBqVT2F2mbLVUfOIojbSlEiLtd+oKmNvVQ4dNE1wNFTcLDM1qkFljLxoQNvdjZzkJMztHaksr6EgqwwrZ9UOdd5AaqCP+SsvU3L6NCVBQQqV7W5lyMB2Vvx9JoHyqlY6c9G5F2RexdO7M1a52uyN3K1sjdQAnrVFOdfPqr1papoHtZGmRG4Yac3tSUuK2ssVbU2G2vZq1vOoUQ517Tfc3MhOTsT8lqIBK6fW4UkDMJ04EQ1bWzJ/WKTwBrcvBLqSU1LJ1ospCpXbYrjI89LcrDWRigLhISdIL1EbBsrGyFwX+7YmXA9KV/jfrBo1oDbSlEp8TgnGupqY6jVvfti+qC0ADPWe1qznUaMcKqKi0bSzo1IUKc7JxvyWogFV7ZHWGBJtbSzfeJ3ysDCKDx1SqOwebczpYGfEHydikcla4c3Urito6GJPHBra2jika/PPtX+UrZUaoG2ALQVZZWTEqfMElYlUKqVz5851H19//bWyVVIIaiNNicRll+Bi0fztN/bnX8VHJsXOol2znkeNcqiIjkbLw52MOLlHzcrVjcyEIowsdNAxaF0FIsajR6Pl6krmjz8iKrCLtyAIvBTYhpisEo5FZilMbouhoQWO/mgkn8YzoBdumUZsubqJkqoSZWv22OPW1RINTQnX1AUESkVXV5fQ0NC6j8YGo7dG1EaaEonPLqVNM4c6E3KjiaCSIUZtm/U8apSDWF1NZVwc2u7uZMTKjTTrNu5kJRZi2YpCnTcQNDSwfHMWldExFOzcqVDZw31ssTXWab3tOJx7Q/plvLr5IamUYZJSw9aorcrW6rFHS0eDNl0sib6QQXVrzXl8hHFxceHDDz+kc+fO+Pn5ERISwtChQ3Fzc2Pp0qUAHD16lL59+zJq1CjatGnDBx98wNq1a+nWrRve3t7E1Ob97ty5k4CAALp06cKgQYMaHb6uaNRGmpLIK6kkJb8MD2uDZj3PvsurABjqNqJZz6NGOVQmJckrO93kRpqxlTWCoENhdnmrKRq4HcMhQ9Bp357sxUsQFTi4WFMqYVpPF07H5HAltUBhclsMl16AiJNBEfompnTJsWNNxBqqZepmqsqmbXcbKkqriQ/LUbYqjy1lZWX1wp3r16+ve83JyYnQ0FACAwOZNm0amzZtIigoiHnz5tWtuXTpEkuXLiUiIoK///6byMhIzp07x4svvsjixYsB6N27N0FBQVy8eJFnn32Wb7/9ttmvS92LQUmEJucD0NnRpFnPsy/lGJ3LK7DxeLJZz6NGOdw6szPj6G6s23iQdSMfrZUaaYJEguXs2SS99BJ569ZjNmWywmQ/282Jnw9F8ceJOBZN6KwwuS2CvR9ItZEknqZtzz6U7ttFVl4ahxIPMdRlqLK1e6xxaGeGvrEW14LScPe1UrY6SuWTqGQuFyu2JUlHA10WeDjcdc2NcGdjjBw5EgBvb2+Ki4sxNDTE0NAQbW1t8vPl92J/f39sbW0BcHNzY8iQIXV7jhw5AkBycjITJkwgLS2NyspKXF1dFXJ9d0PtSVMSoYn5SATwcWg+Iy22IJbIyjyGCoagr54v9yhSWWukiVZWFGSkY93GncxEeQKzpWPrNNIA9Hv3Qr9nD7J+/JHKhASFyTXW1WSCvxM7L6WSVtDKeltp6oCDH8SfpH1gf8SaGrrk2bP6ymp1ZaGSkUgE2gfakxCeQ0pknrLVUXMb2try6ToSiaTu6xvfV1dX11tz+7pb18ycOZMZM2YQHh7OsmXLKC8vb3bd1Z40JRGalI+ntSEG2s33K9gXuwdBFBls073ZzqFGuVREx6Bpb09WRhogz0eLOF2EsaUuOvqtq2jgVgRBwPaLL4gdNZqUd9/DZe0aBE3FXM//ermw8nQcq04n8METrayYxrkXnPgOK1sLTO0c6JRdyfLs84RmhdLFqouytXus6TLEiWun0zi+LpLxH/sjlT6ePpB7ebxaMwUFBdjb2wOwatWqFjnn4/lXpGREUSQ0Kb/ZQ537Y3bSpaIC6zYDm/U8apTHjZmd6bFRAFi7upOZUNRqQ523omlri+38zygPCyPr118VJtfRTI8nvG1ZdTqekMRW5vVw6QWiDCHpHF69+1IZn4l1tTGrrrTMDUPNndHUkhL4rCe5qSWEHUpWtjqPHbfnpDVHdednn33GuHHj8PX1bbG5n2pPmhKIyy6hoKyKLk7NZ6RF50UTXZLCh8Wl8qdvNY8cYnU1lbGx6PfuRWZsNMbWNohoUZRbjne/R+Np1uiJJyg+foKcZcsx6NULPT8/hcidN6I9V1IKmPrXOf59qTsd7Y0VIrfZcegGGrpwbSdevT/m9Ia1DK/wZ0XiIXbE7GCk20hla/hY4+pjgYuPBed2x+Hhb4WBqY6yVXpsqLlDy574+Pi6r6dNm8a0adMavNavXz/69etXd/zo0aN1X9/62qhRoxg1apSCNG4aak+aEghNulE0YKowmTJRRlpxGmfTzrIpchPfB3+PAAzRtgZDa4WdR43qUJmYhFhVhba7B+mx0fWKBlprZWdjWH/8MZoODqS89x41hYppGGplpMPal7pjpKPJ5D/PEplRpBC5zY6WHviMh7CNmBhqYevZDpPYCvxt/Pn45McsubhEnZ+mZALHe4BM5OTGKGWrouYRQO1JUwIXE/PR15LibqWY9hvhWeG8cuAViqpu3mg0JZqMKq3EwqKZ7aMAACAASURBVKm/Qs6hRvWoiJbfBEQ7WwqzMug0+Im6SQMWrWjSwL2QGuhj/91C4ic+R/pn87H7/juFNIC2N9Fl7YsBjF92hkl/nGXDKz2afUSbQgh4BUJWwf+zd97hUVRfA35nN5uy2fTeewKEXhI6SO8oRZqK0lQUVMSO8vvsHUVFQEAIIE1Beu+dJBAIoYSSSkJ6r5vd+f7YiCABUjYkgXmfZx+SO/eeObNsZs+ce8qZ5TTu3J19S+bzqf8cflUtZ8G5BcTnxfNBi3cwMjDC2FS/JX40ZWoOrfidyH27MDDSyTc2VWGkUuHZvDWt+g9CJpPr9ZwNDXNbE9r09+TkpuvER2XgHiglbUlUH8mTVgdEJGTTws0SuUw/nQaWXViGTCZjdofZLOqziF3DdxHacwmfpNy81fNP4tHjn8bq2YIWAEcfP9Li87B0UGJk8mg9f5k0b47dtFfJ3baN1C+/RFSr9SLX09aUlZOC0WhFxv12gvM3cuq/J8ohEDy7wKnfCAjqgEwu58qxI3wU9CFTVU9T9GcoC18aT8g70ykpLNTbaXPTUlk9+x1Ob9+ET9tg/II6YOfpjaFSSX5GOgdCfmPdJx+Qm94AOzromVa93bF0UHJodbRU4FaiRjxad/IGQLFaw8XkXKZ09daLvKziLPbG72VMozGM8B/x74HI8krkHh31ch6J+kdh+GkUrq6k3kgAdO2g9q88i5Nv7Sak1BU2kydTlp5B5rIQiiLP4zLnexQONd/K93MwY/nEIMb+dpJBPx3B1cqEno3s6dHYgfbe1hgZ1EPPUPCLsOYZlDeP4dmiNef27iDq4F4Kc7LxMbXlsmsG3gkpbF7wHSPe+LDGp7sWfoodv3yPVqtlyJvv4xd0531FFEUuHNrH3iXzCXn7VXpNeoVGHbvW+LwNFblCRtfR/mz6MYLTO+MJGlT79bQkHk1qbKQJgiAHwoAboigOEgTBC1gN2ADhwLOiKJYKgmAEhABtgAxglCiKseUy3gMmAhpguiiKO8vH+wE/AnJgkSiKDb5j6vkbOZRpRb1ldm6+tpkybRnDrFtC2BJIDIfEUEiPBisvsHg0Asgl7iRv/34KjhzBbsYMLly/iqWjE4hG5GeVNOj6aPdDkMtxnPUBJq1akvzhR8QMG47Ld99i2r7mJWYCnS3YM6Mbuy+ksO9SCmvCElh2PA4rpYKNr3TG3UaphyvQI/79wcINTi6gRe/ZxEVG4NakOYHde+HVsg2RmeeZ+8sMZCdOcmDnGrr3HVUpsWWlpeSk3qQoP4/i/HyK8/NIuX6FiJ1bsff0YfAb7+o+a/9BEAQCu/XEJaAJ237+lq0/fs3106EEdOiCysoalbUNJubmj9VWqFtja/za2nN6Rxz+7RywdKhnnyGJBoE+PGmvAReBfxoFfgXMEUVxtSAI89EZX7+W/5sliqKvIAijy+eNEgShCTAaCAScgT2CIPiXy/oF6A0kAqGCIGwSRfGCHnSuM24lDeghs1MURdZfWU8LlQe+y0fqBk2swbUdNBsBjaRWUI8i2qIiUj75FENfH2yeH0/KjJdw8g0gM1nXbNvapQHEVdUAi4EDMW7UiMTprxE/YSL2b87AZuLEGsu1MzNibLA7Y4PdKSrVcDA6jZdWhLMlMomp3X31oLkekRtAu0mwZzbe/ZW8vuLOHp4t7Vvy9rRfWP7RDE6EhGDs7kD7xt3vKzLuXAQ75v9Afkb6Xcea9+rHE+OnYGBoeF8Zlo5OjP6/rzmxfjUn/lrDxcP7bx0TZDJsXNzo9swEPFu2qfy1NmA6jfQj7nwGh1ZfZvD0lnqJpZR4vKhRTJogCK7AQGBR+e8C0AP4s3zKMuDJ8p+Hlv9O+fGe5fOHAqtFUSwRRTEGuAoElb+uiqJ4XRTFUnTeuYeb+1oLnEnIxsXSBHuzmqdmn007y7WcawwrKgMzJ5h+Bt6+DuPWQre3waGJHjSWqG+kz/sVdVISTrNnU1RcRG5aKg4+fv8aaU6PtpEGYOTjg9faNZj17k3qN99ScPKUXuWbGMrp19SRxk7mHIqupzFWrZ8DA2M4tbDCw41sG/Ps21+AABt//IJjCUcrnKcuKWbf7wv487NZZGqyOdk6j9Cuas71MyR6pA03JniT1NGMxKKkSqklk8vpOHIcLy1cztjPvmPIzA/oOeFlgp8ciaasjL++mM3Wud9QmJNd7UtvKJhaGNH+SR8SLmZxNSy1rtV5pFGp7k6SmT9/PiEhIXWgjf6oqSftB+Bt4J/9FRsgWxTFfzr+JgIu5T+7AAkAoiiWCYKQUz7fBThxm8zb1yT8Zzy4IiUEQZgCTAFdI9X6TER8tl68aADrr6xHaWBCv5jT0HYSWOsnzk2i/lJy5QoZv/+OxbBhKNu1IzYiHNAVsY2NKkBhLEdlZfQAKY8GMlNTnL/6kutRUdz85GO8N2zQW1eCf+jmb8eiw9fJLymr1e4g1UJprSvHcXYN9Jyt+/0/NPJsSY+JL3N4/nwWLnifG8+9ygi/Ebc8OjevRrPtl+/JSkrkZiMD9nvGMShgKGqtmtzSXHJLcrlReJ3dYfv5NuxbPMw96ObajSDHIJQKJQqZAoVcgUKmwFXlilLx75ae0twCpfmd9eeCh43m1N9rOblhHbER4XR9dgJNu/d+pD1MgV1duHQ8mSPrruAeaI2RsuF2AmlovPTSS3WtQo2p9l1HEIRBQKooiuGCIHTXn0pVRxTFhcBCgLZt29bb1KzUvGJuZBfxQifPGsvKL81nR+wOBpj5oSy7DM2G11xBiXqNqNWS/L//Q65SYf/WTABSYnQZng7ePpzeHY21k+kj/YX3X2TGxjh88D6JL08lMyREL9uet9PN3475B69x7Go6fQId9SpbLwS9CKdD4MwK6DS94ilPDOJm1AXEI4c4NWcB0bI/sFfYoi1VU5CZiYmVJeeekBGlSuT77j/S1fXugP+k/CQOJh7kYMJBVl1aRciFu70TlkaWTG42mdGNRmMov3tbVK1Rk6/Jp+PIcQR06Mru335m1/y5ROzYSusBQwjo0OWB26kNEZlMoNvYAP78MoyTG6/TdUxAXav02PC///0PlUrFzJkz+e2331i4cCGlpaX4+vqyfPlylEolzz//PCYmJpw5c4bU1FSWLFlCSEgIx48fJzg4mKVLl9bpNdTk0bATMEQQhAGAMbqYtB8BS0EQDMq9aa7AjfL5NwA3IFEQBAPAAl0CwT/j/3D7mnuNN0gi4nXufX10GtgRu4OisiKGZaXrEgScW9dYpkT9JmfDBorCw3H67DMMrHSFkG9eu4KVkzNGSlMykwvwaPr41WQye+IJVD16kPbLPMwHDkThqD9jqo2HFaaGcg5dSaufRppjU/DoDKd+02V8GlTsRe038VWEMhGjpMvEFiWQLhQQ6NmcRh3aMc9gM+liNvN7zKetY8UdHZxVzoxpNIYxjcZQoC4gOiuaUk0pZdoy1Fo1xWXFrL+ynm/CvmHFxRW80vIVBnkPolRbyrEbx9gdv5uDCQcp05axcuBK/F39GTX7C6IO7SNs83p2zJvDweWLad6rH8179cfEzAx1cTGlxcWoi4swMlVhbmtXm+9krWLvYU6z7q6cO5BIQAcnHDzNH7xIQq8MGzaMyZMnAzBr1iwWL17MtGnTAMjKyuL48eNs2rSJIUOGcPToURYtWkS7du2IiIigZcuWdaZ3tY00URTfA94DKPekzRRFcZwgCOuAEehiyMYDG8uXbCr//Xj58X2iKIqCIGwC/hAE4Xt0iQN+wClAAPzKs0VvoEsuGFtdfesDEQnZGMgEAp1r3oJm/ZX1+Jp70uzcEejyJjxG3pPHgdQff0SdkIhgbITMyBjB2IicP//CpG0bLJ568ta8lJirOPs3pjhfTVFu6WMRj1YRDu+/x/WBg0j58itcf5ijN7mGBjI6+Nhy4HIaoijWTy9lp9fgj5GwfBiMXgEmd3cyMTRRMvj1dwCIzYnlg6MfsCdtJ8aCMcaCMYv7LCbQJrBSpzNVmFbYzL2fVz+OJx3nh9M/MOvoLH49+yuZxZkUlRVhYWRBL49eHLlxhLcOvsWqgatQKpQ07d6LwG49iT9/ljM7tnDy73Wc3LD2LtkyuZxOo56l3eBhCLKGWd4zeIg3V0+ncmDlJQZPa4nS/NHzGgL83+YoLiTppzPIPzRxNmf24Mp9Pu/F+fPnmTVrFtnZ2eTn59O3b99bxwYPHowgCDRr1gwHBweaNWsGQGBgILGxsQ3TSLsP7wCrBUH4FDgDLC4fXwwsFwThKpCJzuhCFMUoQRDWAheAMuAVURQ1AIIgvArsRFeCY4koilG1oO9D40x8Nk2czTFW1CwNPTormsj0SN6274wgaqHpiAcvkmgwlCYkkPHrfOS2tggyGdqSEsTiYmTmZjjNnn3rS6owN4e89DQc+w3+N2nA+fE00gxdXbF96UXSfpxL/tERqDrpr19ttwA79lxMISa9AG87/Vbw1wv+fWDYIvj7ZVjSD8b9CZZu95zuaeHJsn7LWBq1lP3x+/mk0yd4W+onnrWDcweCnYLZFbeLtZfX0tmlM708etHWoS0GMgNOJJ9gyq4pfHnqSz7u9DGgK9/h0awlHs1akpN6k8vHjwCgMDbG0NgEhbExl44e5PAfS0mIOke/qW9gaqm/lnoPC0MTA7qNCWD7gkiWvX8U/yBHWvRwxdb10SyZU994/vnn+fvvv2nRogVLly69oz+nkZHOAy2TyW79/M/vZWVl/xX1UNGLkSaK4gHgQPnP19FlZv53TjEw8h7rPwM+q2B8G7BNHzrWNRqtyLnEbIa3qXndsg1XNqCQKRh0IxocmoJ9Iz1oKFFfKDh6DACPkBCMvO9dBDPl+lUAHLx9H6vMznthPXEi2X//Tconn6LctBGZnuKbuvnpttkORafVTyMNoPlIXY/e1c/Aol4wbh04Nb/ndAOZAZOaTWJSs0l6V0UmyOjn2Y9+nv3uOtbeqT2Tmk3it8jfCHYKZqD3wDuOW9g7EjT07odOv6COnNuzgwPLfiPk7WkMeHUmHs3rzrtRXbxb2jF2djDn9idy6Xgyl44l4xJgScte7ng0tamfntoqUlOPV22Rl5eHk5MTarWalStX4uLi8uBF9YB6lq706HI1NZ+CUk2Ni9heyrzE31f/podje6yOrtRldUk8UuQcOcw1XzeubVpbXlRU9yorLcXC3gFrZzesXVxJj48FwN7Ll5jziSiMHp/MzoqQGRriOOtDEiZPJu3HH7GfOVMvX3ruNkq8bE05GJ3G853qceV4r64wYQesHAG/D4BRIeDTo661uoupLacSlhLGx8c/ppltM9zNH5yRLwgCLXr3xzmgMVt++Io/P/8Q71ZtcfINwMHHDwdv37sySesrVo6mdBsTQPAQby4cSSLyQCJbfzmHnbsZ7QZ54dns0TDWHjaFhYW4uv7rBJkxY8Ydxz/55BOCg4Oxs7MjODiYvLy8/4qolwj1vk9dFWnbtq0YFhZW12rcxepT8by7PpL9M7tXu4lzRGoEU/dMRalQssSmM+6H5sBr58DKQ8/aStQVqdevsuHNV8k3NMDKyRljlRkmZuYYm6qQKxRkp9wk80YCBdlZANi4uvP8d/PY+MMZSos1jHy34sDvx4nkj2aTvXYt1s8/j/07b+vlC+9/m6JYHRpPxEd9ahyuUOvkJsHKkZB2GZ6arytsXc9Izk9mxOYRuKhcWDFgRYXZoPdCXVzM0bXLuX4mnKykxFvjFvYOdH9uMr7tat6B4mGi0WiJPnmTsG2x5KYX64y1gZ54NrdtMMbaxYsXady4cV2r0SCo6L0SBCFcFMUKb96SJ+0hcfRaBlZKBZ7VbC9zPOk4r+1/DXulPQt7L8R5+UhwDZIMtEcEUavl9PbNHFq5BIUA/fsMocnEKfecX1yQT+aNRFRWutpYmUkFuD+GmZ0V4fi/2QiGhmQuXYomLxenjz9GkNfMsOrmb8fSY7GExWbR2c9WT5rWEubO8MI2WDUW/poIBWnQ/uW61uoOnFROfNzpY17f/zqTdk2ir2dfurh0qZRXTWFsTPfnJtP9ucmUFBaQGnONlOtXuXDkABu//ZT2w0bRYeTYBtOCSi6X0bijM/7BjkSfTCFseyzbfo2kdV93OjxVzzpdSDx0JCPtIZCaW8yO88k8096jWk9Ge+P38tbBt/Cy8GJB7wXY5qVDynno/3UtaCvxsCnMyWb7vDnERoTjam1HQGQYAcOfvu8aY1MVzv66WMTiAjWFj3Fm538RZDIcPngfubk56fPmoc3Lx/nbb2oUoxbsbY2hXMbB6NT6b6QBGFvAM3/B+smw413IT9GFRtQjz0xP9568G/Quqy+t5stTX/IlX+Jh7kF7p/YoDZSUaksp0ZRQqinFWeXMlOZTUMjuLARrpDTFLbA5boHNadl3EHsWz+PE+jWkXL/KgGlvYVxBFfr6is5Yc8I/yJ7wX89xfW8Cbo2tcW10d5FiiccHyUh7CKw4GU+ZVmR8B88qr918bTMfHv2QQNtA5vWch4WRBRxfAIIMAp/Sv7ISD509i+aRGBVJz4lTsVgcAk2aILesfOyilDRwN4IgYDd9GnILc1K++JLEl/JxnfcLMuPqtWNTGhoQ5GXNweg0Phj44Pn1AoUxjFwK22bCkTmQnwqDfwR5/al4P67xOMY1HkdCbgKHbxzm8I3DbLq2Ca2oxVBuiKHMEEO5IckFyURnRvNNt2/uuTVqYGhI35dew9HHn/1LF7Ly/Tfo/+oM7Dy8UBjVvA3fw0AURfK2x+J8Ix9nlQElS6PICHJE1cYBQ3ezBrP9KaE/JCOtlikp0/DHyTh6BNjjWcVYtHXR6/jk+CcEOQYxt8dcXcsVrRbO/6kLElbZ15LWEg+L4vx8roWfolW/QTRr35no19/C9qUXqyQjM+nxLr9xP6zHj0emUpH8wSyyVq3G5oXnqy2rm78dn227SHJOEU4WJvpTsjaRyWHg96ByhAOfQ06iznCroIVUXeJm7sZY87GMbVxxKcw/Lv7BF6e+4PX9rzPniTkYyStOkBEEgZZ9BmDn4cXmOV+w6sO3AJ3nWWVtg8rGlsCuPWjUqVutXUt1EUWRnM3XyT+WhKqjM4UmBmTuiEURepOiUzeRWxmh6uyCaTtHZIb1byu33tYRrEdUJwegYVYFbEBsPptMen4pL1QxK2zlxZV8fPxjOrt05ueeP//bE+/8X5B5HVo9WwvaSjxsrpw6hlZTRqNO3Sg4cQK0WkyrWOMrK7ngsc/svB+Ww4ejbNeOzJAQRLW62nK6+v9biqNBIQjQ/R148leIPw6/PQEpF+paqyoxtvFYPurwEUduHGHa3mkUlRXdd75LQGOe+/on+k19g86jnyOgUzcsHJzISUlm69xv2Pf7AjRl1f8s6BtRK5K98ZrOQOvigsVgb5x7e6Dt5sb2LDXqIEfkFkbkbL7Oza9Cyd0fj7aobut33Y6xsTEZGRnVMkIeF0RRJCMjA+MqevMlT1otIooivx+Nwc9eRSffygd1Lzm/hDnhc+jh1uNO935ZKez/FByaQeCwWtJa4mFy6egBrJyccfD25WbISmSmppg0v3d9q4rITC7A6jHr2VlVrCdOIPGll8ndvh2LIUOqJcPfQYWjuTGHotMZ1e7BAe71jpZjwcYP1pTXUhu2ABoP1h0TRciOh8RQnZfNqzvcr7J/aQFkJ0BOgm5ddjwUpkNxDhTn6v4tyQONGkQNaDW6f82cYPgisKt6/8qR/iNRyBR8dPQjXtn7Cj/3+PmOhu7/RWluQWC3nneMaTUaDq38nfCtf5Mae41Br797K/mmrtAZaFcpOHkTVTdXLPp53vpbbjvQk7jzGew7epPRHwVhkVlM3oEEcnfGkXcgEfOe7ph1rXntzZri6upKYmIiaWkN7AHmIWNsbHxHmZDKIBlptUhYXBZRSbl89lTTSn2BiqLI/HPzmRcxj/6e/fmsy2d3BsqeXgZZsbqK4g20NYrEv+RnZhAfFUmH4aMBKDhyBGX79giKqsUMZSYV4B5Yv7av6huqrl0x9PEhY/ESzMtbwFQVQRDoHmDH1nPJlJRpMDKof1tOD8StHUw5AGvG6Yy1Vs9CUZbOOMtP+XeejR+0fwlajAHD8m30vJsQtUHnzU8MvVOuTAGmdrqEBWNzXSiGjQ/IDUGQ6+5XghwubYXFvWHUSvDqUmX1n/R9EoVMwftH3mf8jvF81+27SmWE3lJTLqf7c5Nw9PFj54K5rHjvdQa/8R4uAXVTPkIURbI3X6Pg5E3Murti3tfzjs+mXC6j94QmrPkslH0hlxj0SnNsX2hK6Y18cnfHkbMtBlGtxbxn3T40KBQKvLzqcQ3BBoxkpNUivx+NwcJEwbBWlbOcTySfYF7EPIb4DOHjjh8jvz2FvCQfDn4NHp3At1ctaSzxMLl8/AiIIo06dUMdF4f6xg2sJ06okox/MzsbThZbXSDIZNhMeIHkD2ZRcOxYtdtGDWjmxOrQBA5cTqNvfWy4XhnMneD5bbDlDTizHKy8wLs7uLYD17aQfhVO/AJb34S9H0PzUZB2CWKPgKjVefK7vwc2vmDhBpbuoHKo3INj5zd0NdyWPwVDf4EWo6qs/kDvgZgZmvHe4fd4esvTfNzxY/p49qmSjEadumHj6s6m7z5n7f+9x+j/+wonv6p792pKwbEkCo4no+rscpeB9g9WjqZ0Gu7LodXRHFx1mW5jAjB0UWHzXBOy1kWTuzsOQSGrFx41Cf0juWNqiRvZReyMSmF0kBsmlQzyPJZ0DIVMwYftP7zTQAM4+SsUpNa7NHqJ6nPp6AHsvXywdnYl/+hRAFSdO1dJxuPes7MqmA8ejIGdHZmLl1RbRkcfG2xMDdl0NkmPmtUBCmN46leYlQqvRcCwhRA0GZxb6VpMTd4PE3aC9xMQukiXcNBlJrxyCl4+At3f1RXJdQ/WGX2V9exbecDEXeDeHjZMgQNf6bZaq0hX1678OfhPfCx9ePPgm3x+8nNKNaVVkmHn4cXYz7/HxNyc/csWPvR4qqJLmWRvuY5xExssBnjd17vbtJsLrft6EHU4iYOro3VB+jIBqxH+mDS3JWdbDPnHG/hnUqJCJE9aLbH8eByiKPJs+8oXmw29GUpzu+YYG/wnsLAwE47OhYABupuiRIMnK/kGN69doeszOs9ZwdFjKNzcMHSv2rZFVrmRZuVUvSLJjxMyQ0Osnn2WtO+/p/jiRYyrUSHdQC5jQDMn1oUnUFBShqlRA7+FGtwj2UQQdIaUe3tQF4GBsf4eDk0s4Zn1sGmaLuM0OQJ6fwK2VSvc6qRyYmnfpcw5PYflF5YTkRpBB+cOWBpZ3noZyY3IU+eRV5pHfmk+eeo87EzsaGbXDH8rf0xUZnQa9Qy75s8l+sQRAjpUfQu2OqhvFpC56hIKJ1OsRwcgyO7/3gqCQPsnvQGR0zvjEQToOtofQS5gPSqAjDJd4oFgIMO0XQP18EpUSAO/w9RPiko1rDoVT99AR1ytKvflmV+az8XMi0xpXkGV+cPf6YJwe36kZ00l6opLxw6BINCoY1dEtZrCEycwHzK4ynIyk3SZnWbWDaMOVF1jNXoUGfPnk7Hkd1y+qV4x6CEtnVl+Io49F1MY2rJhNGmuEYpaKDdiYKhrWeXQROdN+yUI2oyHbu/qGsXfTmEmlJXoPHb/VU2u4O12b9PGoQ3fhH5DyIUQyrT3znoUEBDRecyM5EY0tm5MS7uWWLu5c2jlUnzaBGNQg6LHlUGTV0r60igEQzk24wMrXU5DZ6j5IGrhzO54BEGgyyg/BLkMm7GNSA+5QNb6KwgGMpStpPJMjwqSkVYLHIxOI6dIXSUv2unU02hFLW0d/tO+KycRTv2mC+C1l3qjPQqIosjFIwdxbRSImY0thWFhaAsLq1x6A8ozOx2VUmZnJZGbm2M5ciSZK1ZgP+MNFE53f/E/iDbuVjhZGLMpIunxMNJqC0GATq/p7m0Hv4LwpXB2DQRN0h1PidKVCskr38bz7AKtx+syUhV3PpT0dO9JT/eeiKJIYVkh2SXZZBdnU6IpwczQ7NbLxMCE5IJkItMiOZd+jvPp51l+cTlBAX4E7CnizI7NtBsyvNYuWVuoJmP5BbQFauxebI6BRdXK5giCQIdhPoiiSMSeBOQGAp1G+CEYyLB9tjHpv0eRue4ygkKGSdMG0BlD4oFIRlotEBqbiZGBjLaelc+4C7sZhkKmoLndf8ov7PsUEHUxIBKPBKmx18lKSqTNgKEAung0uRzT4KpvZWcmF+DeRMrsrArW458jc8UKMpeF4PDuO1VeL5MJDG7hzO9HY8guLMVSWbuel0celT0M/A7aT9UlKhz9UZctatdIlwHqEKjzpJ1ZAesngbEltBgNwS+CtfcdogRBwFRhiqnCFBdVxQa0i8oFF5UL/bz6AXAw4SBvHHgDBxc3jq9fTWD3XijNLfR6ieqbBeQfS6LwTCpimRabcY0xdDWrlixBEOg43BdNmc5Qs3VVEdDeCUGh88ylL44kY9UlbJ5rgkmAdG9o6EiJA7VAaGwmLd0sMTSo/NsblhJGM9tmmBjctrUQcxjOroIOr0iN1B8hLh09iEwux7+9znNWePIUxk0DkZubV0lOcYGawhwps7OqKJydMR8wgOy1aynLyqqWjCEtnFFrRLafv6ln7R5jbHzg6WXw1jX4IFmXoDBsoc7b1u1tmB4Bz/4NPj0gbAn80h72fwHq4hqdtptbN3544gcO+yZTWlzEwTVL9XM9QPHlTNJ+O0fKD6cpOJ2KsqU99tNb19jLJQgCnUf64uJvyf6Vl0mLzwNAZiTH9oWmKBxNyVh+keJr2fq4DIk6RDLS9ExBSRlRSbm0q4IXLb80nwsZF2jreNtWZ1kJbHkdrDyh69v6V1SiThC1Wi4dO4Rni9aYmJmjLSmhODISZZu2D178H6Skgepj++IUtEVFZC75vVrrA53N8bY19n7efgAAIABJREFUZXNDz/Ksj5jaVtxfVCYDnydg5O/w2jndtufBL2Fee7i6p0an7OralU+Hfs8V9wKi9u4m9npUjeSJokju/njSf4+iLKMY836eOL0XhNVwPwz11GNXJpfRZ1JTTFQKts+PpDhf10FBZmKA7YSmGNgYk7EsipK4XL2cT6JukIw0PXM6PguNVqSdV+WNtDOpZ9CIGto5tvt38MgcyLiq2wYwlL6EHxVizoaTn5F+q3dgcWQkolqNsm2bKsuSym9UHyNfX8z79ydz5UrKMjOrvF4QBAa1cOb49QxSc2vmyZGoBuZOMGKxzrMmk8OK4bBqLOz+CHa8p6vxtmkabJ0JJ36FK3sgM0bX+eAedHbpzJiJ76OWa1k89z2yi6vnhRK1uh6cuTvjMGlph+PMtph3d0Nuqv/G9kpzQ/q92IyC3BJ2LT6PVqtLipCbKrCb2Ay5mSHpi8+TszuuXrWRkqg8kpGmZ0Jjs5AJ0NrdstJrwlLCMJAZ0MKuhW4gLVqX0dl0hFS49hGitLiIvYvnY+XkjG9QBwAKw8IBMGnVqsryMpMLMDCSY2YlZXZWB9tXpiIWFZG5pHp104a0cEYUYcu5ZD1rJlFpfJ6Al4/BE7Mg9jCcXKCLXYvaAFd2w7m1sONdWDkc5raEzxxh/RQoSK9QXPeA3vgP7Y9lspavP51IobqwSuqIZVoy11zW9eDs5Iz10wEIVQh7qQ4OnuZ0GxNAwsUsTm68fmtcbm6I7ZTmGPlakrc3nuSvTumMtcL607NU4sFIiQN6JjQmkybO5pgZV/6pKezmbfFooqirBK4wgX5f1KKmEg+bw38sIzc9lVH/+xKFoS6rq/B0OIa+PhhYWVVJVmlRGVfDUnHwNH9gjSWJijHy8cF84EAyV/6B9YQJGFhXLcja115FEydzNp1NYkJnqSVOnWFgBN3e0r3+iyjqDLKMq7pXcgSEL9MZcH0/1yUg/CczevjT0wjJyoB9YXzx5QQ+fC8EQ4MHJ4doSzRkrLhAyZVszPt5YtbN9aFlXTfp5ExKbC6nd8ahtDCk+RO6cxtYGGH7XBNKk/LJ2xtP3t548o/cwLyXO6rOLlJWeANA8qTpkdIyLWcSsmjrUfmbfYG6gKiMqH9Lb0T8AXFHoPfHuqwniUeCxAvnidi5hVb9BuHaKBAAUaOh6PSZasWjndoaQ2FeKR2e8tG3qo8VtlOnIpaUkLF4cbXWD27hTERCNvEZVfO4SDwkBAFUduDRAVo/qwsfeemwrqXV3y/p2lNlxd617NkpszFr3xjL8/l8MWcKWlF739NoS8pIX3KekqvZWA33w7y720M3gLo+7Y9nMxuOrL3Czt+iKL1te9PQWYXNs02wf601Rl4W5GyNIeuvK4ia+1+XRN0jGWl6JCoph2K1lqAqxKNFpEb8G49WmAm7ZoFbe2j1XC1qKvEwUZcUs3PBj1jYO9Bl9Phb4yXR0Wjz86scj5aRlM+5fYk06eSMg2fVMkIl7sTI2wvzQQPJ+mMVZRkZVV4/uIWuztqGMzf0rZpEbWHfWNfyasC3ukbx8zrA9QN3TBEEgcmvfYWihTuqsHS+/uXVe7aN0pZqSF8aRWlCLtZjG9VZxX+5QsaAl5vT4SkfrkeksfbzUNIS8u6YY+hkis34Jpj1cKMwLIX0pVFoi6VYtfqMZKTpkdBYXQByVTI7Q2+GYiCUx6Nd3ARFmdD/q8r3wpOo9xxds4Lsm8n0efE1FMb/xo8Vhp8GQNm6daVliaLI4TXRGBrLy9vESNQU25df1nnTFlXdm+ZqpaRHI3uWHI0hp0iK9WkwyGS6XqWvnNRl0K9+BpLP3jFFkMl45Z250MgexeF4fpr/FqL2Ts+TtlRDxrIoSmNzsR4VgLKZ3UO8iLsRZAKt+3rw5ButKCvV8NdX4Zw/dOMOA1MQBCz6eGI1wp+Sazmk/nqWsmwp+aW+IlkCeuRUTBZetqbYmVW+inRoSihNbZuiVCgh9gioHMCpRS1qKfEwSYq+RPi2jbTo3R/3pncWKi4MD8PAyQmFS+Wr1l8NT+XG5WzaD/XGRCUVUdUHRl5eWAweTNaqVZSlpVV5/cw+AeQUqVl46FotaCdRq1i4wrg/wdgCVozQZYDehlxuwGuzFlDiZ4H6wCUW/t80ivJ0JS1EtZaM5RcouZ6D1dMBKFvUn/AUZz9Lnv4gCGd/Sw7+cZm/vz9Dxo38O+aYtnXAdkIgmuwSUn+JQJ1SUEfaStwPyUjTE1qtSFhcJm09Kh8AXqgu5EL6Bd1WpyhC7FHw6KS/RsYSdUppUSE7fv0BMxtbuo574Y5joihSFBaOsk3ltzpLi8s4+udVbN1UNOkitSPSJ7ZTX0ZUq8lYXPVMzybO5gxp4cySI7FSOY6GiIULPLseNKWwYhjk32moGygUvPm/JSQGK8mJjmXJWy9z4+KFW0kCVsP9MK2HvTKV5oYMfrUF3ccFkJlUwJrPQjmy9golt8WqGftaYT+1BSCQviQKTW5J3SksUSGSkaYnrqXlk12orlJ9tIjUCMrEMl3SQOZ1XY86z861qKXEw0LUatn28/dk30yi38tvYGhyZ607dWIiZWlpKNtUfqszfHssBdkldBsTgEzK6NQrhh4et7oQaHJyqrx+Rm9/1BotP+27WgvaSdQ6dgEwdi3kJsMfI6HkTq+TkYERH06dT2gPDdmleSTND6X4chaWT/li2rZuYtAqgyATCOziwrj/a0+TTk6c3Z/AytknuHY69dYchYMpts8Hoi1Sk77sAtqSe9eSk3j4SEaanjhVHo8WVJV+nSlhGAgGtLRvCXFHdYOSkfZIcPyvVVwLO0H35ybdtc0Jt9VHq6QnLT0xj4g9CTTq4Iijt377CkrosJk4AW1hIVmr11R5raetKaOD3Fh1Kl7K9GyouAfruhkkn4M/X4D/xJ9ZG1vz+dC5tPIaiqOxF6HpO4hMOFA3ulYRY5WC7uMaMfLdtqgsjdix8DyhW2NuxaoZuqiwHtsYdVI+masuIWorTpKQePhIRpqeCI3JxM7MCA+byncHCL0ZSqBt4L/xaKZ2YOtfi1pKPAyunDrG8T9XEditF636Da5wTmF4GDILC4x8fR8oL+tmAZvmnsVEpaDDUw+eL1E9jBs1wrRzZzKXL0dbUvVtn+k9/DCQC3y/+3ItaCfxUAjor0vcurILQn+745C2pAyLDUU0K/Tje+flRDrHcGzdSqIO7q0jZauOvYc5w99qQ0B7R05tjmHP7xcoU+s8ZyaNrLEc4kPxpUyyN1+7ZzarxMNFMtL0RGhsFu08rSpdGyerOIvI9EiCHIOkeLRHiPT4WLb/MgdHX396TZp6z89DUVg4ytatER6QxZuTVsTGHyJAFBn6RiuU5lKyQG1iM2kimvR0cjZurPJae3NjXujkxcazSVxMlvolNljaTQLf3rB7NqTrtq+1xWWkLz5PaVwuNqMb0apXF/7yiqTQyYhdC+YSf/5cHStdeeQKGT3HNyZ4qDfRp1LY9EMERXmlAKg6OKPq4kLB8WTyj0hlZeoDkpGmB5Kyi7iRXVSl0hu743ajETX09ewL2XGQmyhtdTZwivLz+PvbTzE0Nmbomx9gYFixQVWWkUFpbOwD49HyMovZ+MMZytQahr7eCitHqUdnbaMMDsY4MJDMJb8jaqoem/NSVx/MjAz4dqfkTWuwCAIM+Qmt3JKiFd+RveUqqT+dofRGPjZjG6NsYc9zgc/xYafZbGkeS65pGRu+/ZiMxIS61rzSCIJA2/6e9JkUSGp8Hn9+FUbWTV12p0V/L0wCbcjZGkPa4khKE/MeIE2iNpGMND1Qnfpo22O2423hjb+Vv26rEyQjrQGj1WrYNvcb8jPSGfLm+6isbe45tzD8wfFoBTklbPzhDCUFaoZMb4mNi0rvOkvcjSAI2EyaSGlsLHn79lV5vYVSwUvdfdh7KZWw2Ko3bpeoe4qjs0hZdpOk3IVk3BxL/rEbyMwNsR0fiElT21vzRviPYNHgpYR1KiVPW8CKT9+iIDurDjWvOn5tHXhyRivUJRrWf3uatPg8BJmA9ZhGWAz0Rn0jn9SfI8hYeRF1mhRrWRdIRpoeCI3NRGVkQGOnylV/TylIITwlnH5e/XTbYbFHQWkDdo1qWVOJ2uL4uj+IPXuaHhNewtm/8X3nFoWHIxgZYRIYWOHxMrWGzXMjKMgpZdC0lth7SF0FHiZmvXujcHMjY9GiasXlPN/RE1uVEd/svCzF9TQwtIVqMtdcRltchlkPD2z9t+JiNAb7IQLG/neXV2pm14xlo9dws489xTm5/PrhyxTlNSzPk6OXBcNmtkFhKGfD96e5EZ2FYCDDrIsLjm+3w6ynO8WXM0mZE07GigsUhKegyS+ta7UfGyQjrYZkF5ZyMDqN1h5WyCtZFmFn7E5ERPp79tcNxB6R4tEaMNfCT3Ji/RqaPtGH5j37PXB+YfhpTJo3R7jHduiZXfFk3Cig76RAnHykTM6HjWBggPULz1N89hxF5V7PqqA0NGBaD19OxmRy5Gp6LWgoUVvk7olHW6jGZlxjLHp7YDz6bQRTFWx4EcoqTiaxNrbmh7GLEYY2Q5uex7z3p1CYW/UyLnWJpYOSYW+1QWVpxOafzhJzTve5lRkbYNHbA8e326Hq6EJJXB5Z66JJ/uwkqfMiyN0XL7WVqmUkI60GXEnJY+gvR0nJKeH5jh6VXrcjdgeNrRvjaeEJWXGQEy9tdTZQsm4msf3n73Hw9qXnhJceOF9bUEDxxYuY3KNfZ3ZqIeHb4/Bta49nM9sK50jUPpZPPYXcyqparaIARge54WJpInnTGhDqmwXkn0jCNNgJQ+fy8AKlNQz5GVIvwKZpUFaxB8lAZsBbo75EPSSAsvQcFn4wtcFtfaqsjHhqZmtsnE3ZPj+SyyeSbx2TqwyxHOSN03tB2E9rhXlPd0StSO6uONLmn5WK4NYikpFWTfZeTOGpeccoKNGwakowPRo5VGpdQm4CkemR9Pcq96L9Ux/No1MtaSpRW6iLi9n07WcIMhlDZrx/z0SB2yk8fRo0GpSt7zbSRFHk8OpoZAYCnUf41YbKEpVEZmKC1TPjyD9wgJIrV6q83shAzmu9/DiXmMOuCym1oKGEPhFFkayN15AZG2De+z8P3P594IlZcG4NrBwBxRV7yQRB4N1R35A90J2S9CyWzJpGflbDiks0URky9I1WOPtZsmfpRXYuOk9Bzr8GmCATMHRRYd7LA4dXW2E7sSllmSWkzjuLOlWKWasNJCOtioiiyK8HrjEpJAxPWyWbXu1EG4/KJwzsiN0BQD/P8m2x2KNgYgX2TWpDXYlaQhRFdi38ifTEeAZOfwtzu8q1hcndth2ZSoWyXdu7jl07nUb8hUyCB3tjaln5/q8StYPV2LEIRkZkLl9RrfXDWrngbWfKd7suo5GKg9Zris6lUxqTg3lfT+SmirsndHsLhs7TPVQv7gvZFWdyymVy/jfmRxL72VCQmcnSWa8RuW8XUQf3cuHwfi4ePUjMmTC02vpb1d/Q2IDBr7YgaLAXMRHp/DH7BOf2J6Kt4DNs7GeF3YvNEcu0pM0/S0mcVHpG3xjUtQINjU+3XmTxkRgGNXfimxEtMDGUV2n9tphttLJvhZPKSTcQe1jnRXtAvSyJ+sXxP//g0tGDdB79HJ4tKtfaSVtSQt7u3Zj17o3M2PiOY6XFZRxZdwVbNxXNukt9OesDBlZWWAwZTM7Gjdi98ToGVpXvywtgIJfxRi9/pq06w+azSTzZSvp/rY9oSzTkbLuOwkWFabv7tHhqNQ7MnWHtc7CoF4xbC04t7ppmJDfiizG/Ml0zHr99GexaMPeuOQ7efvSaNBVHn4fvMQ/LKSCtVE1fWwtk94iDlitktBvohV87Bw6tuszhNdFcOp5Mx2E+uPhbIdwWf23oosL+5RakLzlP+qJIrMc2wqTx3dntBQUFXL58mQsXLhAfH8/w4cMJCAiotet8VJAsgyoyqLkTb/UN4KcxrapsoF3JusLV7Kv/etGyE3Q10qR4tAZF+Na/dR0FuvciaOiISq/LP3gQbX4+5oMG3nXs1JYYCnLK+3LKpT/L+oLVM88ilpSQve7Paq0f2MyJxk7mzNkTjVqjffACiYdO3v4ENDmlWA7xucP4qBCfJ2DCDpAZwJL+up2QClAZqvh6zAJODJWxoWcKXjPHMOGHBTz//a/0f/VN8jPTWfnBDPYs/pXigvwKZdQGoigy9UIcL5yPpX94NEey7p+JammvZPD0lvSZFEhBdgkbf4hg2fvHOPLnFVLjcm/FWxrYmGD3cgsMHJRkhFwgd0/crdZS0dHRLFu2jG+//ZZNmzaRnp6OiYkJW7Zsobi4+K5zarVl5OaeIz5+CRkZh/T/JjQwJE9aFWnlbkUr96o9Uf/DjtgdyAQZfTz76AakeLQGR+S+XRwIWYR/cCf6vDjtgR0Dbid3y1bktraYBgffMZ6emM+5fYk06ews9eWsZxgH+KNs356sP/7A5oXnERQVbIXdB5lMYGYffyYuC2NdWCJjg91rSVOJ6lCWWUze4USUrewxqmypG4dAmLQHQobAypHw7Hpwb3/XNFsTW5YNXsGMgzOYfeFLEuUZvNrqVWxc3PBpE8TRNSuI2LmVKyeP0nXcCzTu0h2ZrGoP/lXlUkEx8cWlPGlvSWhOASMirtHT2pxZPk40VplUuEYQBPzaOuDZzJbYc+lEh6YQuT+Rs3sSsHRQ0nG4L17NbZGrDLGb0pzsDVfJ3RNPSWwuhoNdWLt2LSqVis6dO+Pn5I3puRLiIq+ySRHG3r17GThwICUlqdy8+TdZ2SfJzg5Do/nXcLWx6Yaf7weYmvrU6ntTX5Ee2R8SoiiyPWY7QY5B2JqUZ+3FHgFjC90fvUS95/Lxw+xa+BOeLdswYPrMKt1QNXl55B84gHn//ggGdz4bhW6NwcjEgA5PPp43ofqO9XPPUXbzJnl79lRrfY9G9rR2t+TrnZe4kCTF7NQn8g4nAmDRz7NqC82dYPxm3b8rhkPCqQqnWRpbsqDXAob7Dee3yN+YeXAmRWVFGClN6fHCi4z7/HvM7ezZMW8Oy9+ezrXwk7WaDbwrXff5+5+vC0eCGzPL24nQ3Hx6hl7m46tJlGjv7e1VGMnxa+fAwKnNeeHrzjzxTCPkBgLb5p3j0JpoytQaZIZyrJ72x2q4HyWxuexesBGNRsPYwU/TKtMN2YpEiqMycHVzo0mZK6Ghp4iM/IXjJ3pz9dpXFBUl4Og4hKaBP9Kp4xH8fD8gOzuck6cGEH3lM9Tqx+/vp9pGmiAIboIg7BcE4YIgCFGCILxWPm4tCMJuQRCulP9rVT4uCIIwVxCEq4IgnBMEofVtssaXz78iCML428bbCIIQWb5mrlDZxpj1kAsZF0jIS/g3q1MU/62PVstPTxI15/qZULb99C0uAU0YMuM95AZV86jk7d6DWFqKxX+2OtUlGuLPZ+DXzgHjigKWJeocVfduKNzdyQxZXq31giAwZ1RLTBRyxi06QVRSw6qh9aiiKVBTGJaCsqU9cotqJOqYOeoMNZW9zlBLrLimnkKuYHaH2cxsO5M9cXsYv308BxMOUqYtw8Hbl7GffMvA196mTF3K319/wqqP3iLxwvkaXl3F7MzIoaWZEkcjBSZyGa96OHCifRPGOtkwLyGVQeFXiC64ewvyvxibKmjS2ZmR77ajRQ83Ivcn8udX4WTdLEAQBEzbOWLyvA8XtQn4lTlSuvg6hWfTUHXUFci1m9Kc9kGetGy+h9S07zFTBdI+eDcd2u+iUcAnODgMQqOwR207FseWO1DbPc/JhJ38dXws59KiiCksIa6ohPiiEnLUj3adNqG6VrsgCE6AkyiKpwVBMAPCgSeB54FMURS/FAThXcBKFMV3BEEYAEwDBgDBwI+iKAYLgmANhAFtAbFcThtRFLMEQTgFTAdOAtuAuaIobr+fXm3bthXDwsKqdU21yacnPuWvK39x4OkDWBhZQEoU/NoRBnwLQZPrWj2J+1CYm8Pi6ZOxdHTi6Y8+x0hZ9R6a8RMmUpqQgM+unXc0Xb92OpUdC88z9I1WuAZUbxtdovbJDAkh5fMv8Fy3FpNmzaolIy6jgDELT1Co1rBiYjBNXaSt7bokd188ubvicHijNQqHGvTFzbkBSwdAYRaM3wjOre459UDCAf7v+P+RXpSOg9KBp/yeYpjvMJxUTmjKyog6sIfjf/5BflYmNq7ueLduh3frdjj7N0Ymr9nDfGqJmubHonjHy5E3PO9OkNiRlsOMy/EUabTM9nVhvLMNlfWLxEams3fZRcpKNXQZ5U+TTs5s2bKF06dPMz5gCBZKM8y6uSI3N0IUReLifuV6zFzQGHL5SnN81E/R++WnEBQ6v1F8UQlDTl/lZqn6gecWgCYqYzpZmtHZSkV7SxXmBvpxfKTllWCrMqz0+1BdBEEIF0Xx7pR/amCkVXCSjcDP5a/uoigmlxtyB0RRDBAEYUH5z6vK518Guv/zEkXxxfLxBcCB8td+URQblY+PuX3evaiPRtq17GsM3zScp/yeYnaH2brBvZ/Ake/hzcu6JzGJesuBkN84vW0z47/9BRtXtyqvL0tL40q37ti8OAX7116749iuxVEkXMzkha86SQkD9RhNfj5Xu3VH1aMHLt98XW058RmFjPntBPklZaycJBlqdYWo1pL81SkUzirsJjStucDsBJ2hVpwLL2y7bwiLWqvmUMIh1l1Zx7EbxwDo5NKJYX7D6O7aHTRazu/bxdXQ4yRejEKr0WBsqsKjRWu8W7fDs0VrlOZV/9ysTMrgzcsJ7GsXQJN7xJ+llKh5/VI8+zPz6G1jzrcBbjgYVc7DX5BTwp7fL5B4KYvGT9hw5PJGWrVqxeDBg+88R8oWzke9hr1df/z9Z7Nu0RZiUhMYY98br2dbk2ciZ/DpK6SWljHb1xnj8rhfAcgvuEJM7DwsLdvj6Pw0WlEkqUTN0ax8wnILKNGKyIBeNua86eVICzNlld+nmPQCdkXdZNeFFE7HZ7FtepdKt3ysLvcz0vSSOCAIgifQCp3Hy0EUxX9KFd8E/qny6gLcXlwmsXzsfuOJFYw3KERR5ItTX6BUKJneavo/g3D+L/DqKhlo9ZzctFQidm4lsHvPahloALnbd4BWi8WgQXeMa9RaYiPT8W1jLxlo9Ry5SoXF8GFkrVqN/VszUdhX7+/W3UbJ6intGb3wBGN/O8HHQ5vSJ9ABpaGUw/UwKYxIRZuvxqyrnr5SLN10W59L+kPIk/DCdrD1rXCqQqagp0dPenr05Eb+DTZc2cDfV/9mxoEZWBlZMdB7IMOChzGy32BKCguJizzD9dOhxJwJ4/KxQwiCDEc/f3xaB+HRvBV2Hl7IDR78+dmZnoOrsYLGpsb3nONgpGBlc28WJ6bz2fUkup66xP/5OjPK0fqB3iRTCyMGT2/JodXRnAjfj6iETp3urFwgihqux8zF1NSPpk1/RBDkDH5mGD/P/Zk9qSfp8EMBHz7hTJxGzeoWPnS0Uv3nLEFcEw8RG/cNTV3ccHDUhY/M8IRijZbw3AIOZOaxPCmDvmHR9LU1501PR5qXG2uiKJJcoia6sBilTEaQpU5+QUkZS47EsOlsEldSdUkLgc7mvN7THyvlg4uU1yY1vjMIgqAC/gJeF0Ux9/b/SFEURUEQar2KoyAIU4ApAO7u9St7am/8Xk4mn+S9oPewMi7fzkqOgKwY6DKjbpWTeCDH1q0EQaDDiLHVlpGzdQtGjRtj5HNnYkDCpUzUxRp8WkmGekPA+plnyFq+guzVq7GbPr3actysdYba+N9P8fqaCJSGcno3cWBoS2e6+NmhkAz2WkXUiuQdTkThZIqRj6X+BFt5wnMb4ff+EDIUJmwHy/t/H7moXHi11au83OJljicfZ/2V9ay+vJoVF1fQ3a0777R7B//gTvgHd0LUakm5fpXrZ0K5fjqMI6tDOLI6BAMjI5x8A3D2b4xLQGNcA5uhMLwzxq5Qo+VQVh7jnB68hSkTBCa72dHDxow3LyXw+qUENqZm802AG67G9zdYZDKBZn1tORidgnGBE0dXxtF3shmGxjpTIyVlC4WF12ja9GcEQbclaWFhwYBBA9i0eTOvBBRztayUd1IKCG5X8bm8vF4jM+s4ly5/gLl5C0xMXAEwlsvoZGVGJyszpnk4sCgxjQUJafQJi6aLlYoijZbowmJyy/5NjnjCSkWXIjnL9l8jJbeE9t7WjA1uQu8mDrhaVd0LVxvUaLtTEAQFsAXYKYri9+Vjl5G2OwEoKiviyb+fxNTQlLWD1mIgK7eJd82CE7/CzCu63nAS9ZL0+FiWvT2NNgOfpPuzE6slozQ+nmt9+mL/1kxsJt4pY1/IRa6dTmXCN12QK6Qv5oZAwtRXKDp9Gt+9e5CZ1iCOCdBqRU7FZrIxIoltkcnkFKmxMzNi1eRgfO3N9KSxxH8pupRJxtIorEcFoKyNB6Tkc7BsEJhY62qqmd2nQG4FZBVnsS56HYsiF6EVtUxuNpkXmr6AofxOo6UgO4vEi+e5cfkCSZcvkhp7HVGrxdDEBL+gjjTq3B33ps2RyeTsTM9hfGQMa1v40NW68p8trSiy9EY6n15PRgBe93BgtJM1doYKEhISiIiIwNraGh8fHxwcHBAEgQ0bNhAVFUX/DqM5+Wc8du5mDHylBcYqGSdO9kUuNyao3WYE4c573kcXY1l4M5vOcZdpGnsRa0HFEx260bRX27vq1xUVJXDy1CBUKn9at1qFTFaxvylHXcaixHT+SsnC0UiBv6kxAabG+CuN2HUtnZA9VxGzS7G2NeG7p5rzhE/d9EuulZi08kzLZeiSBF6/bfwbIOO2xAFrURTfFgRhIPAq/yYOzBVFMag8cSAc+Cfb8zS6xIHMChIHfhJFcdv/s3fecVLU5x9/b++7t9d75wpw9CpVEFQEe48aa2Js0SRqNIlJNDGJ0URXeSjzAAAgAElEQVRNYvkFKyYWVIoNRAkISu9wvde9uru3vczM749FEKVzdxT3/XrNa+81OzPfZ3fnZj7zPN/neQ5n16kk0p7f/jzP7XiOl899mbHJYyMrJQmeLom0gfrBOyfXwCiHZdETj9Jcuptb/zEfnen45iR0Pf88nc88S/7/VqJKSdm3XhREXnngSzKHxDLr5mgJltMF77ZtNFxz7UFF94kQDIt8UdnJg+/tJN6oYfGdk465WHaUo6Pz/3YS7vaR/MBYZP3ltWzaFPGmxWTADUvBdHS9nb+JzWPjiU1PsKJhBZmmTB4c9yCT0yYjlx3c5qDfR2t5KeXr1lC14SuCPi+GGCt5o8fzSlox67UxLHDXoVOr0RpNmGLjMMbFY4yN+47n7ds0+gI8WNnM/3pcKIFir4PM6j1ku+wEBJFOUww9CSnYE1Pp8vm52KDkN+dMpXFXN5/+ezd6i5qJ19XT0PobhpU8T0LC7H3HFiWJpxvaeaLOxg9T43gsJ4mda7fw5dovsYtuRmjyOOe82RiGJx4g1my2pewpvY+srJ+Ql/vzo5rc3+kK8FlZO8v32Fhd2YlVryZ/ZCJr9SJmlZLHC9K5NGngE7j6S6RNBtYAu4Cv/YcPExFU7wCZQANw5V7BJSOSVHAe4AVukiRp895j3bx3X4A/SpL0yt71Y4BXAR3wCXC3dASDTxWR1upu5cLFF3J2xtn8ddpf97/RtBFemgWXvAjDrz55BkY5LM3le3j7tw8y+eobGH/Jlcd9nJq5c1HGWMl648DyDc3lPSx5ejvn/7iE3JEJJ2pulAGk8ZZb8ZeVkf/ZCuT6vg2JrK7s5Icvb+TqsRn8+bJhfXrsKBBscdPxj21Y5uRgmprev4PVrYk0ZJfJYfRNcNbdkbpqx8hXLV/xp41/or63nlhtLNPSpzEtYxoTUyaiVx38/AsHg9Ru20TZmlU0lu7k75ffTWZLLfM+O7hjQGsyY01OITYtg9jUdGLTMojPyMKSmLRP/DQ3N/PGqjWslFRUJmXiV6lJUClwhAVCe+/KsT43EmDXGcnVabgnK5FJPgUrXthG6pSHMFrimDTlw33HdITC3F3WyIruXi5LsvJMUSbKvUIsFAjx0ZuL2V6/hxTByizTGByjU6kxK6lod1HR7mJPcwt2nwqtUsCo1WHQqNGrlVh0KmIN6n2LUi5jdWUnWxrtSBKkW3VcNCKVH0/Lw6xVUeb28WBlMxudHh7OTeHuzMR+z+j8JgOS3XmqcKqItJ+t+hlrW9ay9OKlJBu+4e7+5EHY/ArcXw3a/s0YiXJ8SJLEW799EGd7G7c8829U2kNPtD0cofZ2qqdNJ/GXDxJ3440HvLf6zQrK17Vx85NTUEU9JqcV3q3baLj2WhLvv5+4W27u8+M/sayc51bV8MzVI7hoxGmXK3VK0/1mOf7yHlIeGodcOwDJGl1VsOYp2PlOpB7myOtg0r1gzTqmwwSFIJ81fMaq5lWsbV6LK+RCLVczPWM6t5bcSnFc8SH33eL0cMHWKv5ZlMFFVgOhYAC/24Wruwt3Tzeu7i5cXZ3Y21roaW3G47Dv29cUn0DmkOEkFhbz6catKFUqJk+ezNCRI/nM4eWjzkgywoQYI2PMBqxKOYFgkM97/Tzd0M5ut49MrZq56gaynH9BWnsJY8++nCFT0tjl8nLL7npaA0F+l5/GLWnxBxVG27dt5/2lH7EhmEWFEPFyaZRyBiUZKUg0YpBX0dG9Fb+gRqUdjqTMwOkN0+MJ0uMN4vBGyngMTjEze0gS5w5JpijZ9J2xAqLIfeVNvN9u54bUOB4flL5PMPY3/Z7dGeVA9nTvYUXDCu4acdeBAk0UYM9iGDQrKtBOYao3rqO1opRzbr3juAUagHfjJgD0Y8cesF4SJWq3d5I1JC4q0E5D9KNGYpg0ie6XXsJ6zdV97k372awCNtX38PD7uxiaZiEv4dsZblGOB9cXzfh2dGI6O2NgBBpA/CC45AWY9iB8+QxsXRBZZj4CE++Co2wrp1aomZM7hzm5cwiJIba1b2Nl00qWVC/h04ZPmZo+ldtKbmNE4ojv7Lu8y4lCBufEW1CplKi0WvRmC7GpB/ck+j1u7K0ttNdW07hnBzVbNrC5qoaw2Yq1roydtXsoe1uDSqtjtsHAyHPnkp+/vy2WTqtlrlbLBQkWVnT38kyDjed6U0D2NHHjIbu8iYJeB+8bwsSqlSweOYgxlkPP7xRiM/lMNY42X4DhylYmysIMw0LJkBzSzy5EJhuJzzeJisrf0N39H8zmERQXPY7RGGneHhZEfCEBk/bwpUQ0cjn/LM4kTaPiH40dtAVCvDAkC8MJ1qc7UaKetH5g/q75PLP1Gb646ov9GZ0QcX+/NhcufwWGXnryDIxySBp2bmfxXx8jJjmF6/709FGlth+Ktt/+jt6PP6Zg/Tpk3/hHb6tx8v5ftzDr5sEUjDu2ScVRTg32edMeeIC4m2/q8+O3OX3MeWYNSWYti++chFYVFfMngntdK44lNeiGxRN7VREyxUlqXuNsgU8egPIPIW9mRMCdQBkmV9DFW+Vv8Xrp6zgCDsYlj2N4wnDMajMmtQmj2sivWxKwKmX8PV+NVqFFo9AQr4tHqzy6B9DamhpeX7CAQcmJpGgUBP0+Qn4/oYCPADvorPCRO3wGM276MXrLd7Nlm5v/w1eVT9Od/izr/Ums6uwlIIecjhB3d6kYOjiOrKHxWBIOrN0WFkT+sbKaf6ysIjVGxxOXDMbTsIuKsnK6eroBsCiNDBs9nGmzzkahUNDe/gGVVY8RDrvJy72PzMxb9mWRHguvtnTxcGUzJSYdbwzLJUHdv91gouHOAeb2FbfT7m1n0UWLDnzjw/tgx1uRUKf6xDLDovQ9tVs3sfRvj2NNSePyXz2GIebEJpDWzLkAdUYGGS++cMD6L9+tYueqZm756xTUuqgz+3Sl8eZb8FdUkL/i0z73pgH8r7yDm17dxHUTMvnDxcfX5SAKeDbasL9fhXZwHHE/KOq/ZIGjRZJg88uw/GHQmCLzk/NnntAhvSEvCysX8t+y/2Lz2hClyDRxQZlIT+pTGOxvoHct37e9XCYnx5xDYWwhxbHFFMUVURxbHOmG8w3C4TDPP/88oihyxx13oFLtFyvtHR+ze/fdICnpKrXgqMhgylV3UTx5OjKZjN7enTQ0/puOjmVYLCMZPeptZDIZAVFkfXknlDpp3tWDo90LgDXFQN6oBPJHJWJN0XPTq5tZXdnJpSPT+P1FQw7whPX09LD7081UllXQLOsmxZjAlddejTU1jmCwm/KK39DZuRyLZQyDi59Arz+28DJEPJC/qGjizWG5DD2OorjHQlSkDSBhMcykNycxL28ev57w6/1vCGF4qgByp8PlL58s86IcgqoNX/HhM0+QkJXNZQ8/etzZnF8T7uqiavIUEn/xc+JuvXXfekmSWPDrdcSmGJh71/ATNTvKScS7dSsN1/6g37xpAH/4sJT5a+t487YJTMyL65cxzmQ82zqwv1OBZpCV+BsGI1OeQqVu2kvh3ZuhswzG3BwJf8blHXm/IyBJEt6wF1fQxZP13bzREeL5HD8xch8BIYAv7KPF3UJFTwVlPWW0e9v37ZttzmZI/BBK4kvIMedQvrmcxm2NpE1LgzjQq/RkmbPIMqbTVHoLMpmSmJjRtLa+iyRIdJVa0KuHkjDMiTewE6XSRFrqtWRm3opaffByU44OLw27uqnd3klrtQMkaE5Q8GbIzb2Tcrl33qHn24W7fWx5by2ftaxHiYI5hdMZPHcMcpMKW/sSKit/hyQJ5Oc/RFrqNcecDOAVRPQDIOqjc9IGkPKecrxhL2OSvvV9160GbzcMiYY5TzXK1q7ik3/9jeT8Ai795e/QGk58DpB3c6TZ8rfno9lqe3F1+xkzJ/uEx4hyctGPGoXhrIn756bpDt5q50T4+exCPi1t5+FFu/jkp1OiYc9jYJ9Ay7UQf33xqSXQAJIGw20rYcUjsOWViHctbyaM+1Fk3rL8+H5rmUyGQWWgK6xkYVc7lydZuST70J6kHn8P5d3l7Onew66uXWxs28hHtR9hDBk5p+UcWg2tvNf4HjTu3+csQ4grY0N86M2iQJvBvBEL6W1/C5n8XZCtwdGtJNQ5nKGjf05O3lmHFUcxiXpiZuoZPjMDjzNA5ZZ2bv28lARBhuKjVt7a7qJgXBKDxiZhij0wRKuM0zH+R7PIrCjinfcW8n7FCprK6pg0dRLJMy/CGjOesrJfUlHxGzo7llFU9Pi+4rdHw0AItCMR9aT1Ma/teY0nNz/JyitWkqDfW1pBkuC/V0Lj+kgBW9XxT0aP0rdsW/4hK195kfTiIVzywCOodX3j1rY99gccixZRuGE9sr0hgnBIYOGfNuP3hLj2dxPQREOdpz3eLVto+MF1JPz0HuJ/8pN+GWNtVRfXvbSBO8/O4/5zi/pljDMJSZTo/awB18omNLkW4m4cgvxUT9Bx2WDLaxGh5rZFOhVM+imMvAGUx9eW6KZdday2u/hqfDHJR9l/82tsbhvvvvkuzk4nl994OQmxCRhUBlxBF/WOSuwVd+KTGVgaKGRj2ybkMjkzMmdwZc5MspQKmrf2svWjD3Hbe0jKzWfSVdeTM2L0UY397y9q+ePHZcy/ZhSJPQKVG2201/WCDFJyLegtauQKOQqFDLlChilOR8n0NFCILF74PmXVFSSKZkYkFDHmhrNRmbW0tL5JdfWfAcjPe5C0tGu+U0z3ZBINdw4gd39+N3W9dXx4yYf7V+5cCO/fCrP/CGfdddJsi7IfSRT54r+vsvmD98kbM54L7rkflabvxHPthRehjI8n8+WX9q1b+24VOz5rYt7dw8kcEg1dnSk033sfrhUryHzpJQwTxvfLGD9/ZwdLtrfwwd2T+73Z8+mMGBSwL6zEt6sL/ZgkrBfnn3oetMMhhCJJBeueg+aNkVZT0x+GksuPybP2RY+LK3fU8HBuCvdkHb6QbiAQYMOGDdjtdnw+H16vF4/HQ3d3N3PmzGHcuHEHbF9f/wI1tX9l9Ki3iYkZQ1NvEwsrF/J+9fs4A07yLHncPuJ2ZqSeTfmaVWxa+i4OWxuDp87g7B/+CK3x0JEKuyfItL/+j1FZVl69af+4jg4vVZvaqd/ZRSggIAoSoiAhCCLe3iAanZLR52czdFoqW3ds4cuVa+n1udCjoXhoEYMmFaMLeqmvf4ywsBOvNxNb2ywKCyczbNgwYmL6sD3YcRAVaQOEKIlMfmsys7Nm87uzfhdZ6e6Af42DuHy4eflxu7Cj9B3hUIhlz/2diq++YPjsC5hx04+Q9+HvErbbqZp4Fgn3/pT4228H9hevLZmWxtRrCvtsrCgnH8Htof7KKxEcDnLee/eAzhJ9hd0T5Jy/rSY9Vs/7PzkLxQDVbzqdEJwBul4vJdTqxnJ+DsYpaQNakLRPkSSo/gw+/z3YdkFCMcz4FRRecMSyHSFRYuamCgKiyOpxRWgPE7Krra1lyZIlOJ1OjEYjer0enU6HXq8nKSmJqVOnIv/GeKGQk6/WTSfGMobhw/99wLH8YT/L65fzyu5XqHHWUGgt5K6RdzEp6Sw2LnqbDYsXojdbOOe2u8gfc/CHmd8t3cPr6+pZdu9UCpKO3L5KkiRKK2vZsLgOX52cgM7NhvQPKYvdwIjewYzrGU2XzP3NPUhNqyMnZxMymYCtLZempqGkpAxl2LBhDB06FLV64BuqR0XaAFHRU8HlH1zO45MfZ17evMjKd26AimVw+xpIiN6cTzZ+t5slT/6B5rLdTLn2RsZeeFmfX8hdn39O8513kfWfN9CPHk3AG+KtxzaiVCu48ldjo7XRzkACtbXUX3El6txcst5YgFxz+DY7x8OS7S389K3t/HbeYG6alNPnxz9dCff48e7owP1VK1JAJPaaQnTFZ4inWhShbAms/CN0V4E1B8bdBiN+ALqDe3/mN3fy66oWXhmazfkJB98mGAyyYsUKNm3aRGxsLBdffDGZmYdvBg9QXf0XGhr/zfhxH+2rQ/ZtBFHgk/pPeG77czS5miiJL+GyQZeR7DZS9eZSuhsbKJo0jWnX3Ywxdv/vVNvpZvbfv+CKMRn86dLDZzMLosCKxhW8svsVSrtLAchxDWFy06UYnPGgFFHGC+jiRbJ7BXo9dnymAP+JX0yNsoEElZJrki3kyFqRAXZ7IdVVBWg06cybN4/8/Pwjfhd9SVSkDRD/KfsPf974Zz697FNSjCmRwrULfwgzfwtTfnZSbIqyH5+rl3d+/xD2thbOveM+iidN65dx2v/0Z+xvvUXBpo3I1WpWvLKHqk0dXPbAaJKyo6GqM5XeFStoufseYq64gpTHHu3z40uSxE2vbmJjXQ/L751KRmz/lgU4lRG9Iby7uvBu6yBY3wuAOttMzEX5qFPOwPJGQjgi1jb8HzStB5UBhl8FE+6IFMzdS3cwzFkbyhhu0vH28LyDPoA2NjayaNEi7HY7EyZMYMaMGUflPfL721i3fiaJieczZPBTR9w+JIb4oOYDXtjxAm2eNgAUooyzmtLJLZMjlysYOutcJl/6A/RmCz96fTNfVnex6v6zSTAd/CHHH/azpHoJr+55lWZ3M9nmbK4qvIpRSaMYZB2EEiV1O7torXTQ2eSiq9lN0BcmVy1niEGBQqekawYs16xhed1yAkEbF1iVjNH5kCPh88XjdukwmfMZMng6lphBmIyDUSr795yKirQB4merfsaerj0sv3w5eLrhufFgToNbPwdFdJL4ySTg9bDwsV/R3dTIxQ88Qtaw71bm7ivqLr0MudFI1uuvUbW5nU/n72Hs3BzGzY16P850Ov7+NN0vvkjyY49iveKKPj9+s93LeU+vQa9W8M9rRzEu5+BlDc5kfKXd2N+tRPSGUSbq0I9MRD88EWXs9yQhq3U7bPw/2PUuiGEYeytM/yWSzsoDlc38t62blWOLKDR89/vYsWMHS5YswWw2c/HFF5OdnX1UQ3q9dVRWPkqPfT0TJ6w4pgxJURJpdjVT5aiiyh5Zahv2kLzDT26LAVRyXKOn8Hr7EH4wyczZwwJ0+jrp9HZiD9hxBpw4A04cAQdt7jZcIRfD4odx89CbmZ4xHcVhpqpIkoSr20/ZV21ULK9nnFmNUZLQj0nCeEEWX3Wt473K99jWtopJxiDFej0JSGgUbmSyiDYaPWohMTGjjvrzHg9RkTYASJLE9HemMzltMn+c/Ed479aIJ+3HqyFpyIDbE2U/Ib+fdx9/BFt1JRfd/ytyR4498k7HieByUTl+AvE/+Qmaa27hncc3YUnUc+n9o1CcAuncUfoXSRBo+tGP8W7cSPoLz2OcNKnPxyi39fKTN7bS2OPll+cVceuUnNN37tUxIIVEnJ/U4f6qFVWqAeslg1ClG78Xn/2guDth1Z/o3f4O76bNY0HOdZRJBm5Lj+exQQeKKEmSWLVqFatXryYnJ4crr7wS3RFKxkiShN2+jqbmV+nqWolMpiIv7+dkZd562P2OBkmSKO8pZ9mW96n/dDP/k65EksFE8SXq05zY4vzI5QosGgsxmhhiNDFYNBZitbHMzZ3L6KTRx/y7N+7p5rOXS8mVSeQpZShjtcRdU4Q6w0S7p50Paj9gbctadnTuwOjXMdk1mCSFnOFTL+Xskeed8Gc+HFGRNgDUOmq5aMlF/P6s33OpNh1emgXTH4LpvxxwW6LsJxwMsuiJR2navZO59z5AwYTJ/Tqee/Vqmn58O6nzX2bZagWubj9XPDQGS8L3NzT1fUNwOGi48SaCNTWkPfsMprPP7vMxev0hHli4k2V7bJw3JJm/XjHsiL0JT2dCHV563iwn1ObBOCkVy/k5p1fWZj+ww+XltZYuFtl68EkwzFXB9b0buLpgCKrBF4IxUgIqHA6zZMkSdu3axYgRI5g7dy7KI7S7czq3Ul7xCG53GSpVLOlpPyAt7QdoNAl9+hkkSeLHC7bweVk715k2Y63YgeAPordaKZ58NpmDSzDEWDHEWNFbYpCfYB9NV4+f5f/eTajRxYRYNSpBwnJudiTJZG8yjjfkZXvHdta1raOstIzHLn0sMn2pH4mKtAHgnYp3eGz9Y3x0yUdkrv83rH8eHqyLtP2IctyEAn62LfuQ1spy0osGkz18FHEZWQc8RYmigL21lZ6WJuRKJRqdHrVej1qrY9WC+dRs3sB5d9zHkGkn1nrlaOh48km6Xnud1vv+Q8XGTi64cxjZJfH9Pm6UUwvB4aDx1tvwV1SQ9tSTmGfP7vMxJEli/po6/rysnNQYLZePymDW4CSKU0xnjHdJDAp41rXS+1kjMrUc6xWF6Iq+fyHerwmLEh93OZnf3MlGpwe9Qs4liTFcnxLHCNuaSDZoRynI5JAzFV/Bhby5W6CxuZUZM2YwZcqUI54bXd2r2LXrTtTqeHKy7yQp6SIUir5PhAF45cs6fv9BKb++oJhbp+QSCgao3bKR0i9WUr9jK6Ig7N9YJkNnMu9dTOhMZrRGM6a4OJLzC0jJLzyqTjFCWGTd+zWU/a+JEUYlKQoZqjwL8VcXoTANfGYnREXagPDAFw+w2baZz6/4HNm/xoM5FW5YPOB2nCkI4RA7P1/OhvffxuOwY4pLwNXdCYAxNo6sYSNRKJV01tfR2VhPOBg45LFm3vwTRpx7wYDYXX/V1TRqB7NLN5kxF2Qzfl7ugIwb5dRDcLlo+tGP8e3cSepf/oJlbv+cgxvrevjLsnK2NtqRJEi36jinOIkLhqUwJst6Wgq2iDhrw/VFM6InhLbQivWyQSjM/SMWTnU8gsDLzV282tJFSyBEllbNLenxXJ0Sh1n5De+SJEH7HtizCPa8z9KeXLYzmEuSWiiZMAOKLgDdoXsS22xLKS27H6OhkBEjXkat7r8HzB1NDi5/4SumFSTw7xvGfOc89bl6sbe14nHa8TrsuO2RV5+rF5+7F7/Lhc/twutwIO3tVWpNSSU5v5CckWPIHzP+sLUve9o8bFxai7Cnm6E6OagVxF1RgHFY33oLj4aoSOtnJEninIXnMDppNE+U3A7PjoTz/gITbh9QO84EJEmi9IuVfLXwv/R2tpNWNITJV19PevFQers6qd+xlYYdW2nYvR2AxKxcEnNyScjKJT4jC0mSCPq8BHxegl5vRNCV9F+SwDcRvV42zbiCrSPvI31wPBfcORx5tJ7V9xrR46HpJ3fg3bSJ5N/+lpirruw30dTpCvB5WTsrSttZW91FICwyKNHIteMzuXRkOhZ9/4RDm3q8vPJlPS5/iNFZVsZkW8mNNx7zuS96Q4Q6vATqnLjXtiJ6QmgKrJhnZqLJ+v5mRW92erirrIF6X5DJMUZuy0jgnDgziiOcR7a2Nl548UUmpEqc510EjgaQqyBvBgy9DIrngnp/1mJT8wIqK39PTMw4hg97EaWy/6JATl+IC55dgyTBR/dMJkZ//B6soN9He00VrVUV2KoraK0sx+t0oNbpKJgwhSFTZ5BWNBjZIerLdTa52PluFSmtbswKGWKGidTrilFaBu6BICrS+pmm3ibmLJrDr8f/mqscdlj2INyzDWKjXpRjweOws+z5p6nfvoWk3HwmX3U9WcNHHfSm9vV5eyp5Cbo+X8viBTZUcbFc9egUtIYzd45QlKNH9PlovvsePGvXoh8/nuRf/wrNoEFH3vEE8ATCfLSzjf9sbGRHkwONUs7cYalcPjqd8TmxffLwUNPp5vlVNSze1oJMBkaNErs3BECMXsXIjBgyY/UkmrUkmjQkmrXkxhv2lQ4R/WHc69sI1DoJ2zwIvcF9x46KMwiKIk/Vt/OPhnZStSqeKcpkkvXohJMkSbz++uvYbDbuuecedFottG7d62FbDM4mUBth8EVIw66kjh3U1T9LfPw5DB3ybL+FN7+27fY3tvB5WQfv3D6RUZmH9uwd1/FFkeay3exZvZLKDV8S8vuwJCYx+oKLKZlxLspDlBtpKe+h9j/lZATDyOQyDGdnEjczE5mi/+8xUZHWzyyqWsQjXz3C4osWk7f059DbCndtHFAbTndqtmxg+fPPEPL7mXb9LQyfPeeUEmBHwucOsuhXn+L0qbjkZyNJLko82SZFOYWQBAHHO+/Q8fQziB4PsddfT/ydd6Iw9n9Nrz2tTv67oZHF21rwBAWSzVouHJHKRSNSGZxixuENUdbWS2lbL+U2F0aNknOHJDMuJ/Y7nQ18QYH1dd28u6WZj3e1oVHKuWZcJj+amkuyWUttl4ct9Xa2NNjZ3uSg1enD5Q8fcIyLhiZzrzUGzZYORG8YVYoBVbIBVbIeZVLkb2XM9zOs+TVlbh93lTWwx+3n2pRYfp+fhkl59JPmKyoqePPNNzn//PMZP/5b1f1FERrXwY438VUvpixHhj1GTYqQRVH2g8izp/Vrf+n/+6KGxz8u51dzirltav86MkJ+P9Wb1rF9xSe0VpRiiLEyZt6lDD/nfFTa735GISyy84NaxC9bSVLKCJtUpNw8FE3KoVtZ9QVRkdbP/Grtr1jTvIbVF3+I7IlcmPATmP3YgNpwuhIK+Fm94CV2rPiEhOxcLrj7fuLSM062WceE2+5n6d+34rS5GCNbz9gXf3uyTYpyihK22+n8299wvPseyvh4Uv7wGMZp/VNU+dt4g2E+K+tg6fYWVlV0EhYlLDoVTl9o3zbxRg0uf4hAWCTeqGbW4GRmFCVS3+VhdWUnG+t7CIZFjBol10/M4pbJOcQbDy+ofEGBTleAjh4vLV80kVPVSyxy6kwKMi7MJ7sk+kDzTaq9fmZtqsSgkPNUUQbnxluOaX9BEHjuuecAuOOOO1AcJCNSkkRaWv4baTouiQyyJ5FaWoos7AeVHnKmQu70SDtDa06k4ftxNnr/JmuqOvnhyxs5b2gy/7r24FGS/kCSJJpLd7Huvbdo2rMTndnC8HPOI2PIMFLyC78j2BwdHna+UkpClw/j1YVkjD58/9MTJZ7B/HwAACAASURBVCrS+ol2TzvvVb3H66WvMzFlIn9Pmh5pA3Xjx5Dd9/WRzhQCXg/1O7ZRu2UDtdu34He7GDP3EiZddT1K1ekVInR0eFn69HZ8Dg8lW55l5Pw/oSsZerLNinKK49u5k7ZHfkugooKEn95D3I9/PKCeY7snyMe729jZ5CQ3wUBxipniFDMJJg2eQJhVFZ18sruNleUdeIORDLuCJCNTByUwtSCBcTmxaFVH9uxIkkSw0YV3czvenZ1IAQF5tpmPLTKeLG0hJEjMHpzE+SUpzChKxKj5fhf9DokSc7dW0ugL8vnYQlK1xy6M1q9fz7Jly7jmmmsoLPxu6yafr5GysoewO9YTGzuF4qLH0WpTIeSD+rVQ9Wlksdfv30kmB3M6pAyD/JmQNxOsWcdkV1OPl3n/XEuiScOiOyZhOEm/dUt5KesXvU39jq0gScjkchKz80grGkzhxCmkFhQBkXO3pdJOemH/ZxNHRVofIkkSG2wbeLv8bf7X9D9ESWRS2iQeGPsAOf/7K5R/CPfXRjsMfANvrxNbTSW26ipaynfTXLYHURDQmszkjhhNycxzSS8+/YRNV7Obpc9uRwoLDNvyNMklaWT8858n26wopwmiz0fbbx6h98MPMc2eTeqfHkduOLVaGvlDAlsb7WTHGUiNOXzx028ieEJ4Ntnwbm4n3OVDppKjK4nHMC4ZTXbEM9Th8vPi6lqWbG+lyx1ArZQzdVA8swYnkWDSoJTLUcplKBVyEkwacuJPre+mP3iiro2/1bczf0g2cxMP3nfzcHi9Xp599llSUlK44YYbDhD+oZCd+vrnaWpegFyupmDQr0hJueLgDweSBO4OsNdBTy307H1t2hCZzwYQNygi2AbNgqzJhw2R+oIClz7/FS12L0vvmkz2KfBb+j1u2qoqaCkvpaViD7aqSsKhIGlFQxh30eXkjBh9yGSDviYq0vqQR9c9ysLKhVg0Fi7Nv5QrCq4gw5wRifM/OSjiIr78pX4b/1RBFAX8bjdepwNfrxNvrxOfy0XA48bvceN3u/G5eulsqKW3syOyk0xGQkYWOSPHkDtqHCkFhcgP09LjVKajoZelz2xHqVYw2bqT0CvPkrNkMdqDPLlGiXIoJEmi55VX6XjySTR5eaT/65+oj6LR9alKqN2De20rnm0dEBZRZ5sxjElCVxKP/BCeE0GU2NJgZ9luG8t2t9Hq9B90u5GZMVwzLpO5w1LQq8+8h+AtTg8Xbqvi0iQr/yg+Ni/V1yxbtoz169dz++23k5ycDIAg+GlqepWGxhcIhz2kpFxGbu69aDXJxz6AJEFXJVR/DjWfRzxvYT8odZA7LSLYCs4DS/o3dpH46Vvb+WBnKy/fOJazC0/N8HbQ72P3yk/Z/NFiXF2dxKVnMvbCyyiaNA3FEYr/nihRkdaHbOvYRrOrmdnZs9F8MwOmeTPMnwmXzodhfd+z72QjigK26irqd2ylfscWbDVVSKJ40G2Vag1agwGt0URceibJeYNIzisgMTcPtfbon8ZPVXpaPSx6aisqjYJ5t+bScfkFGKZNJf3vfz/ZpkU5TXGv/ZKWn/8cgNTH/4hpZv8XXu4rJEkiUO3A9UUzgSoHKOUYRiVinJSKKunYPCaSJFHT6cYdEBBEkZAgERYkym29vLmxkZpODyaNkotGpjI2OxajRolBo8SoUaJVKfCHBNyBMG5/GE8wjNMXossVoNMdpMsdoNsdIChErlsyZMhkEd3hCwn4ggKeYBhvUEAll5GfaCQ/0URBkpFBSUYKk82kWrT9Epb2hAXO2VxBSJJYObbowNpnR0lrayvz589nxIgRXHjhhQB0d6+mrPxhAgEb8fEzycv9BUZjQd8Z/s0QaeXySJkPmQJGXgfTHgRLGvPX1PKHj8q4/9xC7jw7v+/G7ieEcJiKdWvYtPQ9uhrrueI3j5M5dFi/jhkVaQPByj/Amqfg/hrQn/4VsX2uXjrqammvq8ZWU0nT7p34PW6QyUjOG0TGkGEYrXHoLRb05hj0ZjM6swWN3nDIFOczAWenj0VPbkGS4JJfjCLw2r/oeeVVcj9YiiYv72SbF+U0JtjYSMu99+EvLSXmmqtJevBB5AfJQDuVCNQ7cS6vJ1jXi9ysxjgxFcO4ZBT9UH5GkiQ2N9h5c0MjH+1qIxA++EPit5HJIFavJt6oId6kRqtUIO093td3P71agU6lxKBRoFMr8AcFqjvdVLW76XDtL5Rt0iopTjZTlGKiOMXM0FQLBclGNMchqr7JAxVNLGjt5r0R+ZxlPfZMwkAgwIsvvkg4HOb2229Hp9PR0PACNbVPYTQUUFDwO6zWcSdk4xGRJOiqgs0vwaaXQK5gW+HPuGJbCTOLE3nhumPvt3kykSSJ5rLdpBcP7Xe7oyJtIHhhMqhNcPMnAz/2MRLweulqaqC7qQG7rZWgz0vQ5yPo9xHy+3F22PaHKAFzQhIZg0vIHj6SrGEjj6r1xpmI2x5g0VNbCPjCXPKzUVjUPqpnzcY0exZpTzxxss2LcgYgBoN0/v1pel55Bc2gfFKfegptQR96PvqIYIub3k/r8VfYkZtUmGdkYhibPGD9NN2BMDanH08gjCcQxh0I4wsJaFUKTHu9awaNErNOSaxejVJx/HY5vSGqOlyU21yU23opb4v87Q5ESouoFDIKkkyUpFkoTjGTl2AkL9FAsvnovG7Lu5z8cFcdd2Qk8kh+6nHZuHjxYrZv386NN95IenoCZWUP0tH5CUlJ8ygu+hMKxQBHMOwNuD77K3O2jkZEwcdjtmBJyolki8blQ2wOKL/fZVa+yeFE2pkX2D8ZOFvAtgvO+f3JtuSgCOEwtds2UfbF/7DVVuHq6tz3nkKlQqM3oNbqUOl0qLU6UvILGTH7AhJz8kjMyUNnjPYf9bmDLH1mGz5XiIvuG0lcmhHb488ihUIk3HnnyTYvyhmCXK0m6cEHMJx1Fq0PPUT95VeQ9PDDWK++6mSbBoAUEnF8XItnXRsynRLL+dkYJqYiVw/s3FKjRkl+Yv/Wrvoai17FmOxYxmTvj5CIokST3cvull52tTjZ3eLkk9023trUtG8bvVpBboKBkRlWJuXHMTE3/jtdH9619fCz8iaGGnU8mHscc8SAXbt2sX37dqZOnUpioozNWy7H46kmP/8hMjNuOSneKykmk18Lt9BCK+/kf4al9iPYtf++g0wBmRMjbaqK5oA1e8BtPF2IetL6gs0vw4f3wR0bILFoYMc+DD2tLexetYI9qz7D63RgsMaSMbiE+Iws4jOziM/IxhyfMGAZLKcrPW0ePp2/G0eHj3l3DSet0EqotZWa887HPG8uqX/848k2McoZSLi7m9ZfPoRnzRpif/hDEh+4H9lBal4NFKFOLz3/LSfU5sE4KRXzrCzk2uhz/tdIkkSHK0BNh5uaLg81HW6qO9xsbbTjDQrIZDA01cJZeXEUp5j4UhFmQbeDSTFGXhqaTYzq2L/Lnp4e5s//B5mZTgYPDtDdsxq5XMPQoc8QFzu5Hz7l0fHelmZ+vnAHP5tVwD0z93bX8DuhuyaytO+OzGPrKI28l1QSKVulUINcERFxcgXoYiOlPmIyI4vmzHQYRMOd/YkQhv9cFklR/umOyASIAUISRTrqa6nfsZXWyjICXi8hv59QwEfQ78dj70Eml5M7ahwlM2aRM2IM8pN4kT/dkESJXatb+Or9alRqBbNuGUzm4DgkUaTxxpvw7d5N3gdLUaWlnWxTo5yhSIJA+5//gn3BAkyzziH1iSeQ6wY2dCVJEt6tHTiWVCNTyrFeWYiu6PSfdztQBMMiO5odfFndxZfVXWxrceAtjkFM0aNs8TCoI0RenIEEU6R9VoJJQ6JJg0mrQq9WRBaNEqM6Er6VyWRIkkR7+yds2vw3tNoG5HIRtTqBhIRZZGX+CJ3u5BUEr+vyMPfZNQxJs/DmbRO+07XiALproOJjKP8YbDtBDIMogCSAdJA5h1oLaMyg0kUWpQ5MSZGqCsdRu+1UISrS+oNwEHa+BWv+FqklM/V+mPHrfh0y6PPS09pCd3Mjjbt3UL9jK16nA4C49Ez0ZgsqrRaVVodaq8WakkbxlLMxWqMX1GPFbQ+wckEZTaU9ZA6JY8YNRRj2NtztfuklOv76JCl//AMxl112ki2N8n2g5/XXaf/Tn9GWlJDx/HMo4+L6dTxJlAh3+wi1uPHt6ca3qwt1joW4qwtRDGDj6TONJn+Q23fXs8Xl5VKdgdxegQqbm6YebyT71BPkcLdklUJGYZydy/LfItNYis9nRFRPYWTJ9aQnjUUmO7lRkWBY5LLnv6LJ7uWTn04hxXICDxSSBJ4ucDRGskYdjeBshqAHwr5IZmnIC9210Nsc2ScuPyLWEgpBZwVdTORVHx8pC3KKJi5ERVpfEvLD9jdg7dORon4pw2HqA1A4B/owbOjq7qK1spy2qnI6G2rpaW3B3dO9732tyUz2sJFkDx9F9vBRGGL6tknt9xUhJFK2ro31i2sQQiKTrhjEkCmp++Z1+MvKqLvyKkzTp5P27DOnVbZSlNMb12ef0fKL+1HGx5P297+hKynp0+NLooRnfRu+3V0EW9xIgUinAZlKjmlaOqYZmcj6oDH79xGvIPKvxnb+1diBDBnPFmcy7yDFakOCSLc7SKcrgCsQwhsQ8IYEfMEwbp8btX8ByYr3EAQFDfXDWdk8jQ3BSF29omQTE3IjodTsOAM58QYSTJoBuUYFwgIf7Ghj/ppaym0uXrx+NOcOOb45dsfM11ml1Z/trd32ZUTEfRtDImRNhKxJkHUWJA7p03v2iRAVaX3J4jsjIi19HEx7APLP6TN13l5bzcal79FaUYqrp5ugSkPAFIMpI4ukhASSExNJS04hKS0dTVIK7SGBtkCItkAIR0ggSaMiU6smU6fGqlTsc4v3hgW6QwL2UBi9Qk68WolVqUQZveDuIxQQKF3byrYVjXgcAZJzLcz8YTExSfp924h+P3WXXY7Y20vO0iUorVFhHGVg8e3aRdMddyB0dmE6/zwS770XddaJh3jC3T56FlYSrO9FlWJAnWVGnWZElWZElaRHdgLZkd9nJEniw04nv6tuoSUQ4qLEGH6Tl0r6MbR7kiSJrq4VlFc8SjDYRnt7Lk7HOcyZczXJaensbHayvqabDXU9bG7owR/aHyY0qBXkJxoZlWVlXHYsY3Nij9hr9Viwe4L8Z0MDr61roNMVoCjZxB1n53Ph8OPLUu0TwkHwdoPPDn4H+BzgaoOmjdDwFTgbI9upTZE2VykjIHVExOESlx+ZCzfAREVaX9JRFmmXkTO1z8SZ3+1mzdsLeLu2iR3DzsIbE4dLpSF4CNe1SiYjdITfzaiQo1fI6QmFCR9kUxlgVSmIVSnRyuVo5DLUchlauRy1XIZKJkMjl6OS7V+vU8jRyWXoFXIMCgWJaiXJGhXJGhVxKiXy09Cr5HeH2P1FCztWNuF3h0griGH0+dmkF1m/8wRq+8Mfsb/xBhnz52OcHO3NGuXkILjd9Lz8Mt2vvIoUCmG98kri7/gJyvj4Yz6WJEl4NthwflwLchkx8/LQj0qMeoiPA0GSqPMFqPFGllpvgJ0uLzvdPoYYtTyWn37MNdC83joqKh+lp+cLvF4rtTXjGT78CiZPnozyIFXww4JIq8NPXbeH+i4PdV0eym29bG9y7BNvufEGilPNJJm0JJk1JJm1JJo1FCSZjkrAuQNhPi9r56Odbayq7CQYFplakMBtU3KYnB9/6p87jsaIWGveBG07IpUZwnu7XKgMkDw0ItiSh0VeE4tB0b89paMi7RRFkiRKv1jJmx99xCcjptGSksUgnZrhZgPxaiUJahUJ6oiIcgsCXkHEHRbwCCJmpYKUvQIpVaPGolRgC4Zo9AVo9Adp9AXxiyJxKiVxaiWxKiVWlRKfINIVCtMVDNEdEugJhQmIIgFBwi+KBCWJgCgSFCVCkkRIlAiIkfe8gsihykcqZZCkVpGhVZP+jSVh79ixewWhRak4JcRcZ6OLXauaqdzUjhASyRoax+jzs0nJsxx0e/eaNTTd9iOsN1xP8sMPD7C1UaJ8l3BnJ53PPYfjnYXIVCpMM87GPHcuhsmTkR9FQelQpxfH0hoCVQ40g2KwXlaAMiY63+xYkCSJbb1e3u+ws6TDQWcwvO+9OJWSPL2Gy5KsXJcah+IYrnuC4KWu/l80Ns5HEBTU1ZagUs1i3ryLiT8OMR4Mi+xqcbKpvodNdT3UdXmw9frxBoUDtks2axmaZmZomoWhqRaGplmw6lVUdbjZ3eJkZXnHPmGWZNZw/tAUrhmXSWHyaZx1KYShqwJat0eSF74WbkF35P2bPomER/uRqEg7BWku281H773Du7FZ7C4aRYxCzkM5qUyyQ8AdIuAJ4/eE8HtDBH1hwgGBUFAkHBQIBwW+3ZFJoZQRm2IgPsNEQqaJ+HQjWoMKSZQIBQVCAYGQX8DrCuJxBPYtAW8YnUmF3qxBb1FjsGjQGlWotQpUmsgi3xvqkKSIcPMJIi5BpCMQwhYMYQtEltZAiGZ/kOZAkLZACOEgp5ZGLmOQXkuRQUvh3iVXryFFrcJwglW7j4TfE6JhVxd71rTSVuNEqZZTOD6ZkunpxKUd+gk3UFNDw3XXo4yPJ/vdhcg10RtZlFOHQF0dPa+9hmvZcgSHA7nZjPnc2ZjOOw/92LHfEWzBJheuVU34SruRqeRY5uRgGJ9y6ntATiFsgRCvt3bxfrudel8QjVzGOXFmZsWZKdBHrmnHWlJDkiTc7lJstiXYbEsIhrro7MinqWks06dfxOjRo5H38RwqdyBMe6+fNoefsjYnWxrs7Gxx0uo4eP/UGJ2Kc4cmcfnoDEZnWpGfqVNmRDHSUN62AwadC5r+rckXFWmnCD5B5NOyCt7btpNdKj22hDQUMhnXmi1MqwjQsqmDkH//k41cLkNjVKHRKVGq5ag0CpRqBUqVHLniwH+OUECku8WNx7G/hYlSJSccOnTrFIVKjkavxO8OIR5MUX1jO4UyMqZcLkOukKFQylHrlKh1CtRaJWqdEoNFTUySAWuyHmOiDocSukNhugIhOjxBOn1BWv0hqgNBqoNBbOHwAeNY9noHU/bOrcvSacjSqcnUqMnUqrEcpKmyJEoEAwIBb4iQX9hnm1KtQKGS43UGqN/ZTf2uLtpqnEiihDleS8n0dIompqA9QvuaYH09DdffgIRE9oIFqLOzD7t9lCgnCykUwrNuHc4PP8T92eeIXi8yvR7DWRMxTJ2GOmsMvl1uAtUOZFolxokpGCelojCeuW3c+pp6X4B/NXbwdlsPIUlistXIpUlW5sRbsBxHnTOAQKCd1rZ3sdmW4vVWA0o8nhyqq3JJSprE3LlzsVgO7uE/ViRJoscTpMXho6HbS2OPl4ZuDw3dXqo63PR4gvu2NWmVJBg1KBVyXP4QNqd/XxuttBgdIzJjGJEeQ0asnkSzZl/5kBNtkfV9JCrSBhBJkljn8PBRp4PuUBhnWMARCNHt89EaFgnLFchFgQIhyAi5hbxtbuQ1bpRqOfmjEimYkIwlXofWqEKlURzz063PFaSzyUVnowu/O7TXG6ZEpYmIPJ1JjSFGgyFGg0a/t+aOKOH3hvA6g3icAQKeMEF/OOJ9CwgE/QJiWEQUJERRQhREhJBIMCAQ9IUJ+sIEfGG8zuABYk+jV0ZElF84qK1+lYxOswKHUU6vTo5LL8djUtJrkNOjleFVHfjZdQERq0ck1icR5xNRhyTCITFy4ZB9vY2EISBi8EvoAyImn4gmDHFpRrKHxZE9LJ6kLPNRZakFm5tpuO56pECArAWvo8k/9ZsDR4kCIPp8uNetx71qC4H6MArrYOQ6K1LQhUzegLZQh37EEDTFg1EYj60J+vcNSZLY6fbxfGMHSzscqOQyrkqO5c7MRLJ0x+9VF8UQTc2vUVf3DILgRacbTltrBmVlenS6eGbNmkVJSckx3wMkSaLZ7qO0rZfS1l6qO9zYev3YnH46XfsbzH9NvFFDVpyeQYlGCpJMkSXZSILxwMxQX1BgT6uT7U0OtjU52N7ooMXx3SzKeKOawmQThUmRHqdFySYGJZrQDXBXitOJqEgbALqDYd6x9fBGazc1vgBaJGKCflQeFwq3E23AR4zfyyRrAvn+bNq3uxDCIolZJgZPTmXQmCTUutO7ercoiPR2+XG0e7G3e3F2+lAoZGj0SjR6FWqdcq/w5IBaQKGAEAntukP4PSECnhBypZygVk6PTkaXBtqVYEPAJhOxyUS6FBLCUV67jHI56To1qRrVAfPk4vbO07Psbbgc3jsHLyxJCD3d9D76KFq7nfw/P05cwSAMCgWqM9W9H+WMQfSH8Wy04dncTrjDC3IZ6jQVUrCeUO06fHt2Em5t27e9wmpFlZqKKi0NVWoqcrMJBBEkEUkQQZJQWK0oExNQJSWhTEpCEROD5Pcj+v2IXh+S3wdyOXK9ft8i0+kgFIps4/MjBfwgk6NOT0N2FHPmTiaSJFHq8fNBh4OlHQ5qfQEMCjk3psXzo/QEkjQnNpHc7thERcUjeDyVGI2TaGwcz57dneh0OiZPnsy4ceNQqb47RkgQ8YUEfMHI0u0J0NjjpbHbR5M94hUrt7lw+SNRCrkMsuIMpFi0JJm/XjSkWHRkxenJjNVj0Bz/fafHE6TV4aPTFaDD5aejN0CT3UuFzUVFu+uATNO0GB15iUbyEgzkJhhJNu8v3htv1KAeoL6vpyJRkdaHvN7SxbIu5z63ryRBSJLY5PQQlCRGaJUUbvofKRtWYlSrSR5UiDk+B4lkOpsNODvCqLUKCscnM3hKKvHpp/GEy5OIIEkERQkZkSRbOTJEJBwhYW9iRCQ5whYM0+oP0hoI0bJ3vlxP6OCevaNBI5dh2JvdqpPLkZAQpIg9YUlCLpOhk0cya79etN/IjtXKZahkcsJfJ2js/RxKmYxEtZIkTSRZJFGtInFv8ohJIY/OF4pyRMI9ftxfteLZZEMKCKizzOhHJqIriUfxrbB+uKsL/549+CsqCbW0EGpt3fcq+ffOR5LJ9teREo7/f+Y7KJWos7LQ5OejyctDlZaGIi4WZVwcCmssyrjYAeuq4AkL7HT7aAuE6AiE6AiG6QiG2NrrpdYXQA5MshqZlxDDhYkxx9W66Zt4vXXU1f8Lm20Rcnk8ba3TqazUoVarmThxIhMnTkSr1QIRQbaz2cGaqkingh1Nzu94wb5GJoMkk5bMWD0FyUYGp1gYnGqmMOnkebAEUaKxx0t5W8SbV9PppqbTQ02n+zsJCxAJr1p0qgMWAG9Q2CdM/Xuv3XKZLHJ67n2VyUDG3r8BnVqBRafCrN1/LKNWiUGjxKiJvBrUCrQqBTq1Ap0qshi1SlQnodxMVKT1Ic83drC4wx45IWDfSTHCpGdM3W4aF/wfSo2GQROuJuDPpK26l1BAABmk5FoonpRK/uhEVJqo6/dkERYlHOFIZmvP3pC0DFDKZAQ3b6L31dcQwmFMv/j/9s49RpLjvu+fX1V3z8zu3u7e3oP3IE93lEhIpETJCiXRghTJDixLsg07sA04diLBMmADRgwHsB3LiIEoMSLbSpCng0SCYkSGDSuI48AyLIeWnRgCJFMSKUsUHxJ1fIi8B/fudm/fO9PdVb/8UdUzs8fdI5fk7s4e6wMUqh/V1dW/qen+9q8e/SvUp0+z6vxgdK3zrDrPalw3CFbCsUbAK6zHkbDrLsbe040jZJuRs1mc2qRlDIUIpSqXy2rT6VLaRjgchdvxVs6xGB9v5UxmFk8QiY1Y3HD+eL5chNwIRTzvmLUcyAyT1jKZWQ5kMY7CMonC/UG92KN8cpH1R8JXARBh7K7DTLzzZorrDIbZClUNgswOulqoKn55mXp2lmr2EvWlS7jFRUy7hbQ7mE4HabdAFb+2hl9bQ9fX8WvrSJ4jnTam3cG0W2hV0Xv8CXqPP0559izlM8/wnFFQgJmaIj92jPzYMbITx8lvugl7cAZ7cJrs4EHszEzw1hXFIOT5db9DrKpcrR1fW1rjiwsr/M3CCl9fXtvwn2sZ4WiR8+pOix84OsX7Dk9zeJO+sNvB+x6XLv0FTz/z+ywv34+q5eKF13P2iTvQA6fonLgdO3mEnhdWujUrZc3iWsXXnllgpVcjAnednOItp2eYHsv7wmKssEyPFZyaGePkdId2vj+eKarK7FLwvF1e7vXD3GrJ4nq1IQjhQ/WNkGrnoSXGe/CqeA35KcMxrJX1hny61+mbfS0TrSAWD47nTHcK/vkP3cFtN+2sMyWJtB1mef4Kf/Hx/8RTX3uAgyfvoKrfTV22mb5pjJtfe5BbXjvDidunn7eTemLvqOfmePZf/gbL995L+w1v4MRH/xWt227b1TJ4Va5Wjkvl4I3+cllzuR/XcfLikuUt3qg3o2WEyuuW06dcixDm2ZvMbL9Z+FAR4nFryOM8elkUfuPWcCCKvYksLIc59Qbew1GYduVGwK1WdB+Zo/fEIr2nFnFXw0AhaWeMv/UYE28/sa+m0fC9HvXly7i5Oer5edz8PPWVOerZZ6kuXKR69lmqixfxi4vXzWe9aPH0sZNcOXKU+cNHmTt0iLnpQ1yZnOJqZ4z5sQmudsap47eLM+94/eoyb/Vd7m5lnCosRzPLZFFgWgWSZSAGjISP2ovBdNqYAwew4+P95lrva5xboa6XqetlqnqRqpyn27vC3Nx3WLj6JM7fjzFrzC0f5r4n38mj869jOTvKbNdS+cHzd7wInpyJVsZEO+fOE5O84zWHefurDzE9NtrNw6NOr3as9hyrvZqVXs1qr2Y1eua60Uu3VjqWuzUL6yWLaxUL6xULayX/+sffyKuPpNGdLxs7LdJmnzjL+W89wvz5c1y9eI758+dYuTqPsTnFxLtReT23vukIb/nBMxy5ZXvqW1Wh9pt+u00al10TO48vPVo6tPJo7TEti+lkSDtLn295WBOIZgAAE3ZJREFUAahz1FfmWPvyl5j96G/iV1Y4/Au/wKEP/XS4SY8wK7XjQq9ixTmsCBawEsRQO044PBaFUiOQnIY57yofvIFLzrFce5Zqx1LtWInry3F5oXbMl8HjOBfD6jbE4TDt6DUcbvqdzCzTmWU6txzMMqbyZj0LcWaZyi1TWeg3+ErtD+jXa9YfnmPtwcv0zi6AV8x4Tuv0JMWZKVqnJ8mPTyB2dOzjfcnS0oOo1hjbwZo2xrQxJkfVoVrjtUZ9jTEtsnySPDuAMZsLTN/t4hYWKOfneWJ+kUeW1/iWh8ck51tZi3NZgQ69CBj1HOqtM7O+yqFul5nuOjPddQ511zhz8Ryve/jr5OfPo70eKop2wI+DH9N+rG3QNvj20P5xxU+APxDWtbX181MVnl68hb+9eA+PLnwXT6xM4BUm2xl33TzNnScmufPkFHeemOT0ofHrf4g8cUOzr0WaiLwX+A+ABT6pqr91vfQ7LdLu/fh/4aH/+2fYvEPROQxykLqaRLLbuPVNr+EtP3iGo6+a3HCMOkVrh1+tqee7uPku9fx6WF6u8GsVfq3Gr1VsOrnYi0BaFilsEGtWQiyAgtYedQreow4kFyS3SGaQ3IQ4E7BDy5t4QiQ3mCKepzBIYTEt2z+3KUwQnE4H5wRMJ8OMZZixHDOWhXO+RE+LVhXV7CxaVYQOg+Fcfm2d6uIF6gsXwpv5hQtUs7PUs7PUV670+9rslfdsv6GxWbWKffBKr6w6x7IL4i6IPU83NrUO4tDcG5p8w1x7i7Vjoa5ZqIIgfD4BOB6FXSahidkQmpgzafoJGiasjV/ECP0GB8txf2b76cateY7HD6DnlTKWs1ZlKrM71gSsqviVinpunfpKuCf41Qq/Xod7wmpFdWkNnGIPtujcdYSxu46QnxgfuSZp70vm57/ApUt/zuUrn6Oul7adhzEtsuwAPS24qIe5qEe5qEe4wHGe1ps5z3FKglfJ4DnGJU7JM9yiT3FSn+Qwl5jmKlMsYYZ8x8YUGDNGZsdQFO9LVEuc66FablWcgAqWNlY7ZHUHWxZoN6O7blhZNyzVGYsyRqUtulWbS5enOLdyiG/bk1xphakzzixe4G1LT/GOfIW7ZiyyuoZbXMQtLeEWF8F77NQUZmoSOzWFnZzCjI9jOh3MWAfpdDDtTmjSzXOkyMOLpLUgEl/iQ5C8CE3RrRbSaoe0eR48gtYiWRaahZvYWsQY1HtwDnUuxKqYogj5jPhL635n34o0EbHAY8D3AeeArwD/QFUf2eqYnRZpf/Xf7+fRL14EM8bUkTFmjo8zc3yMM6+ZZhKle36O9WcvUs7P4esy3AxwIA5vS3y2jsvW8MUaOtHDd9ZxxQouW8bZZWqzvMlZldBYFUZaKR4jOYY2xnSwEt5SxVvwNsROEJ9jfI5ogfgC4zKEAkOGkGPIEQps3UKqAlO3kKoFVYbUBioBZ6E2SHO/Uw3lcQZTt9DaIl5AX8oDQ0EciEeMggFEgy4UAaNRYEYbhF5YaHcdv7KCW1nBr62F/T7u9x403GhETGi6yDLsxAHMWBsZa2En2tipCezMNK1bbwWVIKidD8LSefAaxKXT0PTRiNh8KBQ2LlsQ0G6NX3f4bh0+Ui0EERyFrFgJ3s/S4XsOLR14kCyK5ZgvmUGsBA+JDcuNJ1XCaIkgup2GctaxvJXHNx7WGBP7bqAazGfYKMpzE77PaCSUwxoQQV3w0lJHoV37vue2H9dDdvIx9MtuwA5eEFClP+pG6J8TK1QGllVZEM+SKguiLKEsG1gUZckoy6LU1/RHqYBVA+tGWRNYRVmLYfMpObdPgWeSiklKxqVCcDHUCI4MR44jF0eOp6Cmrb4fWt6TeU+tDqdNrHgHXk2oe1hAKMRRGEdLagrjyXMhnzhANjaBzTpY0yIzllbsX5iLkBlDSYsebUoKulrgJcMgZEawYkLzdDymECiMYPCUrqLnqxC7Cq8eIxI9s8FDW7pmf0npK0pX0qu7lL5HWfcofY/V7iy1r1Bp0x67ldbYGZAC7x1OHc7XKB4hCF4jgmBYj31EF2tYcMKiy7jixzbY/5BZ59ZskdPZAqftHKftFV6VLzNuc4xtYUwMkiOSISZDJANVnFsbCquAhGOk6B8XPHnT5HkIxkxQVRmrq46lpR5LS0tcuXKF2dlLXLg8x3K3oqcZy7Rh4ihla4qFuuDxqyXdWmlb4btPdHjXsYK3ZyvMzD5N+fR3qL7zNNWlWez4RBRk09jJSTCCX1rCLSz2xZtfXcWvr6Prm3wsfLcxJoi1KPYky4LIy7IoGotBXOShD2KnjbTaIW53MO32oH9ip/3cF38x4fhWgWm1kKIV7g39+0Z8/jmPujoIydqBal+0Sh7FqzHxGKXROJJlUahmSBaasAMDDSRZFsrZjmVv745A3c8i7buBj6jq98f1XwNQ1d/c6pidFml//Qc/Rzn95WbYQNioArZCsnXEvvBRUOoFXxb4skVdFtS9HFflaBQ8G6qwEreHSivGI9YhmUOsw1gHRpEYEEWMwxgfYhvTmZf391YvqDN4Z9HaoM5uCEIoSxBdGi/Eot6CWtAMVQNNIMTSrHsb99lokSgeov2bN8jgVRBELXiDaNY/VoQo/mIZPBCFpaiJ+Ta/5QaT93fpZiJj6FeKZw+JpDlaNyTduBbOLWqQoEqDEBePio/59McQDy3HUUw6fMawv8k/OBKHCy6DMjWVShRRH2I0CGS1Ib3aaBeCeLYVamowcfJhb4Hw2wk2iMVY5zCx7NrcXOGbKzOs+SzWg3h90qSRsNicD4caF/PxYFyIJQQRjxoP4vox4vv59G0Sz+VFKcVQiaUyGRU5JQUVBT0Kas0pyam0oNICUDJqMqmxOAyeHi26dOjSZp0OleZ4NSgWVYOqwYnBq8HFoxwGJxkV2aCLwobqJRuiDbEOgnBtfbuGjVVqY9zs36zeNi9ADO1r0l2b73aIZY7vWbHaaXML2DD3TrNkJYjGVhSOhcCEwAEjHBCYNEImQZhr01F86OGrqn2zeVXiuxVeofaesvaUTqmcp3JK5ZTax+l2fBD9w3mqxvkg+yYJ95saS0lzv9jIkQMtzhwa53XHD/A9rz3KPbceetk68qv3/elOtKpDa0FdoVUVvF7DYkRByxIteyF9t4eWvfjiWaO1Q+s6LDsP3sVpVnwQSZkFY8PLE4JWJVqW+F4P7ZVoXaN1BTEfrUN5tCwHca8X0jdlXlvrr+9HTn/6D+m86U07eo7ribRR92GeBJ4ZWj8HvO3aRCLys8DPApw6dWpHC7S8CCsSv53WPDhFcS6jrgpcE+ocfLhx48NbsjqLq3PqGNRbjIYfIQcyY8iGRif1b2fNqJWNFx3fRJshyIJ4xahHfAgAmmWotagxqLXx5uzAekQcGIexNdbW2KxGTBUEn/j44G0ejtB/2Eu4JYqpgRIxFSIVIjViaiSrkdxhTB0aHNSgSP9BLOIQ8TEukShKgojzA9HQDxrTENOE+Nr3i5e79eflyG47eWz2jH0+nu8ZvR10i2UIDyrvw41bxGOM3zRdSLvxt/gf9/0STy296kWWar/hYgDokYYKgeD7ryEy7EZlUH9KoDe0d+u8wlHX6tBmb3OO5nwGxYjHxuVMFGvCt4YzEwbVBF1iMGYQMpvRKnLarZx2UdBuFRwYazPZzphoZxyIUzucmhnj9OFxJl7CXGPPhxiDxLnn9jPqfRBw3e6m3kH1vi/ygtArY+uJBA9/06TbNNlGrxgQhGNV9UVj/+HQHAODZtzaRU+cH9yo+l2BqoG47Pbw3XWy4yd2wTpbM+oi7QWhqp8APgHBk7aT5/qhn//4hnXvPd45xBis3R9DoG9kwmirCud6OFfifQ39t1/T91KqOryvUfV47zYReKGZtC+Ah/7sgyQ6GPbtff8tXKQRMwNv33AeEs/vXI33dSyHYkyGiOnHTT4hDxNfmH0sczifV481tp8+BEW18QM0zcMylJfEe1gQz0Rvovcu2mtgG5Ei9ud5rtxQrVGtYjmbsg6mbvA+lOFjJ9bo1dEDaBrP4+AhPTzVgzTzHg09hvseDhT1A29g84ISPCoSPYkDG/cf6NL3ceJ9420MsRXBmtisZ5pyDLwyfS/NkPAMv1XzkhQfojFXI4O0jddn2APUXDNNWWRwPo1NuCb2uRMRmimbNtgD7Q8GCecfuOmCB2kw+Cgz4VNuTdxcn/ODaQuMhP0iYdk09h96fl379wg2MM+p1xKNJfFFzvS93DEvkQ0esGGadE2aa71lzfkaITX8v2q+aXltPz0RIcsysizrH5PYG8SY0Leu04GDB/e6OPuGURdp54FbhtZvjttGhuaGkRgNjMkwJiPPd2cyzMTzc/ToXpcgkUgk9iejri6+AtwmImdEpAB+AvjMHpcpkUgkEolEYscZaU+aqtYi8o+BewlTcPyuqj68x8VKJBKJRCKR2HFGWqQBqOpngc/udTkSiUQikUgkdpNRb+5MJBKJRCKReEWSRFoikUgkEonECJJEWiKRSCQSicQIkkRaIpFIJBKJxAiSRFoikUgkEonECJJEWiKRSCQSicQIkkRaIpFIJBKJxAgi134/bb8jIpeB7+x1OUaYw8CVvS7EK4xk890n2Xz3STbffZLNd5+dsPmrVPXIZjtuOJGWuD4icr+q3r3X5XglkWy++ySb7z7J5rtPsvnus9s2T82diUQikUgkEiNIEmmJRCKRSCQSI0gSaa88PrHXBXgFkmy++ySb7z7J5rtPsvnus6s2T33SEolEIpFIJEaQ5ElLJBKJRCKRGEGSSNvniMjvisglEXloaNsbReRvROQbIvKnIjIZt3+fiDwQtz8gIt87dMzfidvPish/FBHZi+vZD2zH5kP7T4nIioj88tC294rIt6LNP7yb17Df2K7NReSuuO/huL8dt6d6/gLZ5r0lF5FPxe2PisivDR2T6vkLRERuEZH/JyKPxLr7i3H7jIh8TkS+HeODcbvEenxWRB4UkTcP5fXBmP7bIvLBvbqmUedF2Pynoq2/ISJfFJE3DuX18td1VU1hHwfg7wJvBh4a2vYV4F1x+UPAb8Tl7wJOxOXXA+eHjvkycA8gwJ8D79vraxvVsB2bD+3/I+B/Ar8c1y3wOHArUABfB+7Y62sb1bDNep4BDwJvjOuHABuXUz3fGZv/JPDpuDwGPAWcTvV82zY/Drw5Lh8AHgPuAD4GfDhu/zDw23H5/bEeS6zXX4rbZ4AnYnwwLh/c6+sbxfAibP72xpbA+4ZsviN1PXnS9jmq+nlg/prNtwOfj8ufA340pv1bVb0Qtz8MdESkJSLHgUlVvU9Dbfs94Ed2vvT7k+3YHEBEfgR4kmDzhrcCZ1X1CVUtgU8DP7xjhd7nbNPm7wEeVNWvx2PnVNWler49tmlzBcZFJAM6QAksker5tlDVi6r61bi8DDwKnCTY7FMx2acY1NsfBn5PA/cB07Gefz/wOVWdV9WrhN/qvbt4KfuG7dpcVb8YbQpwH3BzXN6Rup5E2o3Jwwwqx48Dt2yS5keBr6pqj1Ahzw3tOxe3JV44m9pcRCaAXwX+xTXpTwLPDK0nm2+frer57YCKyL0i8lUR+adxe6rnL52tbP5HwCpwEXga+DeqOk+q5y8aETlNaP34EnCTql6Mu54FborLW9k32f1F8AJtPszPEDyZsEM2TyLtxuRDwM+LyAME9205vFNE7gR+G/i5PSjbjcpWNv8I8O9UdWWvCnYDs5XNM+AdwE/F+O+LyN/bmyLecGxl87cCDjgBnAF+SURu3Zsi7n/iy93/Av6Jqi4N74te4DQtw8vMdm0uIt9DEGm/upPlynYy88TeoKrfJDT5ICK3Az/Q7BORm4H/DXxAVR+Pm88zcNkSl8/vTmlvDK5j87cBPyYiHwOmAS8iXeABNno4k823yXVsfg74vKpeifs+S+hb9fukev6SuI7NfxL4P6paAZdE5AvA3QTPQqrn20BEcoJY+ANV/eO4eVZEjqvqxdiceSluP8/m9j0PvPua7X+9k+Xez2zT5ojIXcAnCX1a5+LmrX6Ll0TypN2AiMjRGBvg14H/GtengT8jdIb8QpM+unSXROSeONrtA8Cf7HrB9zFb2VxV36mqp1X1NPDvgY+q6u8QOmDfJiJnRKQAfgL4zJ4Ufp+ylc2Be4E3iMhY7CP1LuCRVM9fOtex+dPA98Z944RO7N8k1fNtEevlfwMeVdV/O7TrM0AzQvODDOrtZ4APxFGe9wCLsZ7fC7xHRA7GUYnvidsS17Bdm4vIKeCPgX+kqo8Npd+Zur7XIytSeMkjU/6Q0A+kIngQfgb4RcIIlceA32IwafGvE/qNfG0oHI377gYeIoxO+Z3mmBRems2vOe4jxNGdcf39Mf3jwD/b6+sa5bBdmwP/kNB/6iHgY0PbUz3fAZsDE4TRyw8DjwC/MpRPqucv3ObvIDSrPTh0j34/YYTyXwHfBv4SmInpBfjP0bbfAO4eyutDwNkYfnqvr21Uw4uw+SeBq0Np7x/K62Wv6+mLA4lEIpFIJBIjSGruTCQSiUQikRhBkkhLJBKJRCKRGEGSSEskEolEIpEYQZJISyQSiUQikRhBkkhLJBKJRCKRGEGSSEskEolEIpEYQZJISyQSiUQikRhBkkhLJBKJRCKRGEH+P7dga9LwvC4ZAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light", + "tags": [] + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light", + "tags": [] + }, + "output_type": "display_data" + } + ], + "source": [ + "from matplotlib import pyplot\n", + "\n", + "pyplot.figure(figsize=(10,5))\n", + "for name in PlotNames['name']:\n", + " g = Graph[Graph['name'] == name]\n", + " pyplot.plot(g['year'], g['count'], label=name)\n", + "\n", + "_ = pyplot.legend(loc='best')\n", + "\n", + "pyplot.figure(figsize=(10,5))\n", + "_ = pyplot.plot(TotalBabies['year'],\n", + " TotalBabies['logica_value'],\n", + " label='Total babies')\n", + "_ = pyplot.legend(loc='best')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "S7gEFDte_g-Y" + }, + "source": [ + "## APPENDIX" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4Rl4rBws_jbC" + }, + "source": [ + "### Assignment and Equality\n", + "\n", + "It is unusual that we are using the same operator `==` for both assignment and comparison.\n", + "\n", + "This happens because in Logica what `==` stands for is determined from the context.\n", + "\n", + "Consider a simple toy table T and a defined predicate DoubleT." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 239, + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH0=", + "headers": [ + [ + "content-type", + "text/css" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgaCxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9ZnVuY3Rpb24oYSl7dmFyIGI9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmYVtTeW1ib2wuaXRlcmF0b3JdO3JldHVybiBiP2IuY2FsbChhKTp7bmV4dDphYShhKX19LGw9dGhpc3x8c2VsZixjYT1mdW5jdGlvbigpe30sZGE9ZnVuY3Rpb24oYSl7YS5CYT12b2lkIDA7YS5SPWZ1bmN0aW9uKCl7cmV0dXJuIGEuQmE/YS5CYTphLkJhPW5ldyBhfX0sZWE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7aWYoIm9iamVjdCI9PWIpaWYoYSl7aWYoYSBpbnN0YW5jZW9mIEFycmF5KXJldHVybiJhcnJheSI7aWYoYSBpbnN0YW5jZW9mIE9iamVjdClyZXR1cm4gYjt2YXIgYz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk7aWYoIltvYmplY3QgV2luZG93XSI9PWMpcmV0dXJuIm9iamVjdCI7CmlmKCJbb2JqZWN0IEFycmF5XSI9PWN8fCJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGgmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5zcGxpY2UmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoInNwbGljZSIpKXJldHVybiJhcnJheSI7aWYoIltvYmplY3QgRnVuY3Rpb25dIj09Y3x8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmNhbGwmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoImNhbGwiKSlyZXR1cm4iZnVuY3Rpb24ifWVsc2UgcmV0dXJuIm51bGwiO2Vsc2UgaWYoImZ1bmN0aW9uIj09YiYmInVuZGVmaW5lZCI9PXR5cGVvZiBhLmNhbGwpcmV0dXJuIm9iamVjdCI7cmV0dXJuIGJ9LGZhPWZ1bmN0aW9uKGEpe3JldHVybiJhcnJheSI9PWVhKGEpfSxoYT1mdW5jdGlvbihhKXt2YXIgYj1lYShhKTtyZXR1cm4iYXJyYXkiPT1ifHwib2JqZWN0Ij09CmImJiJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGh9LGlhPWZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PWVhKGEpfSxtPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBhO3JldHVybiJvYmplY3QiPT1iJiZudWxsIT1hfHwiZnVuY3Rpb24iPT1ifSxqYT0iY2xvc3VyZV91aWRfIisoMUU5Kk1hdGgucmFuZG9tKCk+Pj4wKSxrYT0wLGxhPWZ1bmN0aW9uKGEsYil7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe3ZhciBkPWMuc2xpY2UoKTtkLnB1c2guYXBwbHkoZCxhcmd1bWVudHMpO3JldHVybiBhLmFwcGx5KHRoaXMsZCl9fSxuPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe31jLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLmk9Yi5wcm90b3R5cGU7YS5wcm90b3R5cGU9bmV3IGM7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YX07dmFyIG1hLG5hPXtlYjoiYWN0aXZlZGVzY2VuZGFudCIsamI6ImF0b21pYyIsa2I6ImF1dG9jb21wbGV0ZSIsbWI6ImJ1c3kiLHBiOiJjaGVja2VkIixxYjoiY29saW5kZXgiLHZiOiJjb250cm9scyIseGI6ImRlc2NyaWJlZGJ5IixBYjoiZGlzYWJsZWQiLENiOiJkcm9wZWZmZWN0IixEYjoiZXhwYW5kZWQiLEViOiJmbG93dG8iLEdiOiJncmFiYmVkIixLYjoiaGFzcG9wdXAiLE1iOiJoaWRkZW4iLE9iOiJpbnZhbGlkIixQYjoibGFiZWwiLFFiOiJsYWJlbGxlZGJ5IixSYjoibGV2ZWwiLFdiOiJsaXZlIixrYzoibXVsdGlsaW5lIixsYzoibXVsdGlzZWxlY3RhYmxlIixwYzoib3JpZW50YXRpb24iLHFjOiJvd25zIixyYzoicG9zaW5zZXQiLHRjOiJwcmVzc2VkIix4YzoicmVhZG9ubHkiLHpjOiJyZWxldmFudCIsQWM6InJlcXVpcmVkIixFYzoicm93aW5kZXgiLEhjOiJzZWxlY3RlZCIsSmM6InNldHNpemUiLExjOiJzb3J0IixaYzoidmFsdWVtYXgiLCRjOiJ2YWx1ZW1pbiIsYWQ6InZhbHVlbm93IiwKYmQ6InZhbHVldGV4dCJ9O3ZhciBvYT1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkIGluIGEpYi5jYWxsKGMsYVtkXSxkLGEpfSxwYT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyBpbiBhKWlmKGFbY109PWIpcmV0dXJuITA7cmV0dXJuITF9LHFhPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsIT09YSYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfSxzYT1mdW5jdGlvbihhKXt2YXIgYj17fSxjO2ZvcihjIGluIGEpYlthW2NdXT1jO3JldHVybiBifSx0YT0iY29uc3RydWN0b3IgaGFzT3duUHJvcGVydHkgaXNQcm90b3R5cGVPZiBwcm9wZXJ0eUlzRW51bWVyYWJsZSB0b0xvY2FsZVN0cmluZyB0b1N0cmluZyB2YWx1ZU9mIi5zcGxpdCgiICIpLHVhPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8dGEubGVuZ3RoO2YrKyljPQp0YVtmXSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZCxjKSYmKGFbY109ZFtjXSl9fTt2YXIgdmE9e2ZiOiJhbGVydCIsZ2I6ImFsZXJ0ZGlhbG9nIixoYjoiYXBwbGljYXRpb24iLGliOiJhcnRpY2xlIixsYjoiYmFubmVyIixuYjoiYnV0dG9uIixvYjoiY2hlY2tib3giLHJiOiJjb2x1bW5oZWFkZXIiLHNiOiJjb21ib2JveCIsdGI6ImNvbXBsZW1lbnRhcnkiLHViOiJjb250ZW50aW5mbyIsd2I6ImRlZmluaXRpb24iLHliOiJkaWFsb2ciLHpiOiJkaXJlY3RvcnkiLEJiOiJkb2N1bWVudCIsRmI6ImZvcm0iLEhiOiJncmlkIixJYjoiZ3JpZGNlbGwiLEpiOiJncm91cCIsTGI6ImhlYWRpbmciLE5iOiJpbWciLFNiOiJsaW5rIixUYjoibGlzdCIsVWI6Imxpc3Rib3giLFZiOiJsaXN0aXRlbSIsWGI6ImxvZyIsWWI6Im1haW4iLFpiOiJtYXJxdWVlIiwkYjoibWF0aCIsYWM6Im1lbnUiLGJjOiJtZW51YmFyIixjYzoibWVudWl0ZW0iLGRjOiJtZW51aXRlbWNoZWNrYm94IixlYzoibWVudWl0ZW1yYWRpbyIsbWM6Im5hdmlnYXRpb24iLG5jOiJub3RlIixvYzoib3B0aW9uIiwKc2M6InByZXNlbnRhdGlvbiIsdWM6InByb2dyZXNzYmFyIix2YzoicmFkaW8iLHdjOiJyYWRpb2dyb3VwIix5YzoicmVnaW9uIixCYzoicm93IixDYzoicm93Z3JvdXAiLERjOiJyb3doZWFkZXIiLEZjOiJzY3JvbGxiYXIiLEdjOiJzZWFyY2giLEljOiJzZXBhcmF0b3IiLEtjOiJzbGlkZXIiLE1jOiJzcGluYnV0dG9uIixOYzoic3RhdHVzIixPYzoidGFiIixQYzoidGFibGlzdCIsUWM6InRhYnBhbmVsIixSYzoidGV4dGJveCIsU2M6InRleHRpbmZvIixUYzoidGltZXIiLFVjOiJ0b29sYmFyIixWYzoidG9vbHRpcCIsV2M6InRyZWUiLFhjOiJ0cmVlZ3JpZCIsWWM6InRyZWVpdGVtIn07dmFyIHdhPWZ1bmN0aW9uKGEpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsd2EpO2Vsc2V7dmFyIGI9RXJyb3IoKS5zdGFjaztiJiYodGhpcy5zdGFjaz1iKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSl9O24od2EsRXJyb3IpO3dhLnByb3RvdHlwZS5uYW1lPSJDdXN0b21FcnJvciI7dmFyIHhhO3ZhciB5YT1mdW5jdGlvbihhLGIpe2E9YS5zcGxpdCgiJXMiKTtmb3IodmFyIGM9IiIsZD1hLmxlbmd0aC0xLGU9MDtlPGQ7ZSsrKWMrPWFbZV0rKGU8Yi5sZW5ndGg/YltlXToiJXMiKTt3YS5jYWxsKHRoaXMsYythW2RdKX07bih5YSx3YSk7eWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjsKdmFyIHphPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSJBc3NlcnRpb24gZmFpbGVkIjtpZihjKXtlKz0iOiAiK2M7dmFyIGY9ZH1lbHNlIGEmJihlKz0iOiAiK2EsZj1iKTt0aHJvdyBuZXcgeWEoIiIrZSxmfHxbXSk7fSxxPWZ1bmN0aW9uKGEsYixjKXthfHx6YSgiIixudWxsLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX0sQWE9ZnVuY3Rpb24oYSxiLGMpe20oYSkmJjE9PWEubm9kZVR5cGV8fHphKCJFeHBlY3RlZCBFbGVtZW50IGJ1dCBnb3QgJXM6ICVzLiIsW2VhKGEpLGFdLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKX0sQ2E9ZnVuY3Rpb24oYSxiLGMsZCl7YSBpbnN0YW5jZW9mIGJ8fHphKCJFeHBlY3RlZCBpbnN0YW5jZW9mICVzIGJ1dCBnb3QgJXMuIixbQmEoYiksQmEoYSldLGMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpKX0sQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZgpGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTpudWxsPT09YT8ibnVsbCI6dHlwZW9mIGF9O3ZhciBEYT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3EobnVsbCE9YS5sZW5ndGgpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKCJzdHJpbmciPT09dHlwZW9mIGEpcmV0dXJuInN0cmluZyIhPT10eXBlb2YgYnx8MSE9Yi5sZW5ndGg/LTE6YS5pbmRleE9mKGIsMCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspaWYoYyBpbiBhJiZhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX0scj1BcnJheS5wcm90b3R5cGUuZm9yRWFjaD9mdW5jdGlvbihhLGIsYyl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsYyl9OmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9YS5sZW5ndGgsZT0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZj0wO2Y8ZDtmKyspZiBpbiBlJiZiLmNhbGwoYyxlW2ZdLGYsYSl9LEVhPUFycmF5LnByb3RvdHlwZS5maWx0ZXI/CmZ1bmN0aW9uKGEsYil7cShudWxsIT1hLmxlbmd0aCk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD1bXSxlPTAsZj0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZz0wO2c8YztnKyspaWYoZyBpbiBmKXt2YXIgaz1mW2ddO2IuY2FsbCh2b2lkIDAsayxnLGEpJiYoZFtlKytdPWspfXJldHVybiBkfSxGYT1BcnJheS5wcm90b3R5cGUuZXZlcnk/ZnVuY3Rpb24oYSxiKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmV2ZXJ5LmNhbGwoYSxiLHZvaWQgMCl9OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWEubGVuZ3RoLGQ9InN0cmluZyI9PT10eXBlb2YgYT9hLnNwbGl0KCIiKTphLGU9MDtlPGM7ZSsrKWlmKGUgaW4gZCYmIWIuY2FsbCh2b2lkIDAsZFtlXSxlLGEpKXJldHVybiExO3JldHVybiEwfSxHYT1mdW5jdGlvbihhLGIpe3JldHVybiAwPD0KRGEoYSxiKX0sSGE9ZnVuY3Rpb24oYSxiKXtiPURhKGEsYik7dmFyIGM7aWYoYz0wPD1iKXEobnVsbCE9YS5sZW5ndGgpLEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhLGIsMSk7cmV0dXJuIGN9LElhPWZ1bmN0aW9uKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGFyZ3VtZW50cyl9LEphPWZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDA8Yil7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX0sTGE9ZnVuY3Rpb24oYSxiLGMsZCl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShhLEthKGFyZ3VtZW50cywxKSl9LEthPWZ1bmN0aW9uKGEsYixjKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gMj49YXJndW1lbnRzLmxlbmd0aD9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsYixjKX07dmFyIE1hPVN0cmluZy5wcm90b3R5cGUudHJpbT9mdW5jdGlvbihhKXtyZXR1cm4gYS50cmltKCl9OmZ1bmN0aW9uKGEpe3JldHVybi9eW1xzXHhhMF0qKFtcc1xTXSo/KVtcc1x4YTBdKiQvLmV4ZWMoYSlbMV19LE5hPS8mL2csT2E9LzwvZyxQYT0vPi9nLFFhPS8iL2csUmE9LycvZyxTYT0vXHgwMC9nLFRhPS9bXHgwMCY8PiInXS8sdD1mdW5jdGlvbihhLGIpe3JldHVybi0xIT1hLmluZGV4T2YoYil9LFVhPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE8Yj8tMTphPmI/MTowfTt2YXIgdTthOnt2YXIgVmE9bC5uYXZpZ2F0b3I7aWYoVmEpe3ZhciBXYT1WYS51c2VyQWdlbnQ7aWYoV2Epe3U9V2E7YnJlYWsgYX19dT0iIn07LyoKCiBDb3B5cmlnaHQgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzLgogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKKi8KdmFyIFhhPWZ1bmN0aW9uKGEpe1RhLnRlc3QoYSkmJigtMSE9YS5pbmRleE9mKCImIikmJihhPWEucmVwbGFjZShOYSwiJmFtcDsiKSksLTEhPWEuaW5kZXhPZigiPCIpJiYoYT1hLnJlcGxhY2UoT2EsIiZsdDsiKSksLTEhPWEuaW5kZXhPZigiPiIpJiYoYT1hLnJlcGxhY2UoUGEsIiZndDsiKSksLTEhPWEuaW5kZXhPZignIicpJiYoYT1hLnJlcGxhY2UoUWEsIiZxdW90OyIpKSwtMSE9YS5pbmRleE9mKCInIikmJihhPWEucmVwbGFjZShSYSwiJiMzOTsiKSksLTEhPWEuaW5kZXhPZigiXHgwMCIpJiYoYT1hLnJlcGxhY2UoU2EsIiYjMDsiKSkpO3JldHVybiBhfTt2YXIgWWE9ZnVuY3Rpb24oYSl7WWFbIiAiXShhKTtyZXR1cm4gYX07WWFbIiAiXT1jYTt2YXIgJGE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1aYTtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsYSk/Y1thXTpjW2FdPWIoYSl9O3ZhciBhYj10KHUsIk9wZXJhIiksdj10KHUsIlRyaWRlbnQiKXx8dCh1LCJNU0lFIiksYmI9dCh1LCJFZGdlIikseD10KHUsIkdlY2tvIikmJiEodCh1LnRvTG93ZXJDYXNlKCksIndlYmtpdCIpJiYhdCh1LCJFZGdlIikpJiYhKHQodSwiVHJpZGVudCIpfHx0KHUsIk1TSUUiKSkmJiF0KHUsIkVkZ2UiKSx5PXQodS50b0xvd2VyQ2FzZSgpLCJ3ZWJraXQiKSYmIXQodSwiRWRnZSIpLHo9dCh1LCJNYWNpbnRvc2giKSxjYj1mdW5jdGlvbigpe3ZhciBhPWwuZG9jdW1lbnQ7cmV0dXJuIGE/YS5kb2N1bWVudE1vZGU6dm9pZCAwfSxkYjsKYTp7dmFyIGViPSIiLGZiPWZ1bmN0aW9uKCl7dmFyIGE9dTtpZih4KXJldHVybi9ydjooW15cKTtdKykoXCl8OykvLmV4ZWMoYSk7aWYoYmIpcmV0dXJuL0VkZ2VcLyhbXGRcLl0rKS8uZXhlYyhhKTtpZih2KXJldHVybi9cYig/Ok1TSUV8cnYpWzogXShbXlwpO10rKShcKXw7KS8uZXhlYyhhKTtpZih5KXJldHVybi9XZWJLaXRcLyhcUyspLy5leGVjKGEpO2lmKGFiKXJldHVybi8oPzpWZXJzaW9uKVsgXC9dPyhcUyspLy5leGVjKGEpfSgpO2ZiJiYoZWI9ZmI/ZmJbMV06IiIpO2lmKHYpe3ZhciBnYj1jYigpO2lmKG51bGwhPWdiJiZnYj5wYXJzZUZsb2F0KGViKSl7ZGI9U3RyaW5nKGdiKTticmVhayBhfX1kYj1lYn0KdmFyIGhiPWRiLFphPXt9LEE9ZnVuY3Rpb24oYSl7cmV0dXJuICRhKGEsZnVuY3Rpb24oKXtmb3IodmFyIGI9MCxjPU1hKFN0cmluZyhoYikpLnNwbGl0KCIuIiksZD1NYShTdHJpbmcoYSkpLnNwbGl0KCIuIiksZT1NYXRoLm1heChjLmxlbmd0aCxkLmxlbmd0aCksZj0wOzA9PWImJmY8ZTtmKyspe3ZhciBnPWNbZl18fCIiLGs9ZFtmXXx8IiI7ZG97Zz0vKFxkKikoXEQqKSguKikvLmV4ZWMoZyl8fFsiIiwiIiwiIiwiIl07az0vKFxkKikoXEQqKSguKikvLmV4ZWMoayl8fFsiIiwiIiwiIiwiIl07aWYoMD09Z1swXS5sZW5ndGgmJjA9PWtbMF0ubGVuZ3RoKWJyZWFrO2I9VWEoMD09Z1sxXS5sZW5ndGg/MDpwYXJzZUludChnWzFdLDEwKSwwPT1rWzFdLmxlbmd0aD8wOnBhcnNlSW50KGtbMV0sMTApKXx8VWEoMD09Z1syXS5sZW5ndGgsMD09a1syXS5sZW5ndGgpfHxVYShnWzJdLGtbMl0pO2c9Z1szXTtrPWtbM119d2hpbGUoMD09Yil9cmV0dXJuIDA8PWJ9KX0saWI7CmliPWwuZG9jdW1lbnQmJnY/Y2IoKTp2b2lkIDA7dmFyIGpiPSF2fHw5PD1OdW1iZXIoaWIpO3ZhciBsYj1mdW5jdGlvbihhLGIpe29hKGIsZnVuY3Rpb24oYyxkKXtjJiYib2JqZWN0Ij09dHlwZW9mIGMmJmMuZGQmJihjPWMuY2QoKSk7InN0eWxlIj09ZD9hLnN0eWxlLmNzc1RleHQ9YzoiY2xhc3MiPT1kP2EuY2xhc3NOYW1lPWM6ImZvciI9PWQ/YS5odG1sRm9yPWM6a2IuaGFzT3duUHJvcGVydHkoZCk/YS5zZXRBdHRyaWJ1dGUoa2JbZF0sYyk6MD09ZC5sYXN0SW5kZXhPZigiYXJpYS0iLDApfHwwPT1kLmxhc3RJbmRleE9mKCJkYXRhLSIsMCk/YS5zZXRBdHRyaWJ1dGUoZCxjKTphW2RdPWN9KX0sa2I9e2NlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjb2xzcGFuOiJjb2xTcGFuIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGhlaWdodDoiaGVpZ2h0IixtYXhsZW5ndGg6Im1heExlbmd0aCIsbm9uY2U6Im5vbmNlIixyb2xlOiJyb2xlIixyb3dzcGFuOiJyb3dTcGFuIix0eXBlOiJ0eXBlIix1c2VtYXA6InVzZU1hcCIsdmFsaWduOiJ2QWxpZ24iLAp3aWR0aDoid2lkdGgifSxtYj1mdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChrKXtrJiZiLmFwcGVuZENoaWxkKCJzdHJpbmciPT09dHlwZW9mIGs/YS5jcmVhdGVUZXh0Tm9kZShrKTprKX1mb3IodmFyIGU9MjtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXTtpZighaGEoZil8fG0oZikmJjA8Zi5ub2RlVHlwZSlkKGYpO2Vsc2V7YTp7aWYoZiYmIm51bWJlciI9PXR5cGVvZiBmLmxlbmd0aCl7aWYobShmKSl7dmFyIGc9ImZ1bmN0aW9uIj09dHlwZW9mIGYuaXRlbXx8InN0cmluZyI9PXR5cGVvZiBmLml0ZW07YnJlYWsgYX1pZihpYShmKSl7Zz0iZnVuY3Rpb24iPT10eXBlb2YgZi5pdGVtO2JyZWFrIGF9fWc9ITF9cihnP0phKGYpOmYsZCl9fX0sbmI9ZnVuY3Rpb24oYSxiKXtiPVN0cmluZyhiKTsiYXBwbGljYXRpb24veGh0bWwreG1sIj09PWEuY29udGVudFR5cGUmJihiPWIudG9Mb3dlckNhc2UoKSk7cmV0dXJuIGEuY3JlYXRlRWxlbWVudChiKX0sb2I9ZnVuY3Rpb24oYSl7YSYmCmEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpfSxwYj1mdW5jdGlvbihhLGIpe2lmKCFhfHwhYilyZXR1cm4hMTtpZihhLmNvbnRhaW5zJiYxPT1iLm5vZGVUeXBlKXJldHVybiBhPT1ifHxhLmNvbnRhaW5zKGIpO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbilyZXR1cm4gYT09Ynx8ISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNik7Zm9yKDtiJiZhIT1iOyliPWIucGFyZW50Tm9kZTtyZXR1cm4gYj09YX0scWI9ZnVuY3Rpb24oYSl7cShhLCJOb2RlIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4iKTtyZXR1cm4gOT09YS5ub2RlVHlwZT9hOmEub3duZXJEb2N1bWVudHx8YS5kb2N1bWVudH0scmI9ZnVuY3Rpb24oYSxiKXtiP2EudGFiSW5kZXg9MDooYS50YWJJbmRleD0tMSxhLnJlbW92ZUF0dHJpYnV0ZSgidGFiSW5kZXgiKSl9LHNiPWZ1bmN0aW9uKGEpe3JldHVybiB2JiYhQSgiOSIpPyhhPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKSwKbnVsbCE9YSYmYS5zcGVjaWZpZWQpOmEuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpfSx0Yj1mdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgYSYmMDw9YSYmMzI3Njg+YX0sdWI9ZnVuY3Rpb24oYSl7dGhpcy5hPWF8fGwuZG9jdW1lbnR8fGRvY3VtZW50fTt1Yi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBhP3RoaXMuYS5nZXRFbGVtZW50QnlJZChhKTphfTsKdWIucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuYSxlPWFyZ3VtZW50cyxmPVN0cmluZyhlWzBdKSxnPWVbMV07aWYoIWpiJiZnJiYoZy5uYW1lfHxnLnR5cGUpKXtmPVsiPCIsZl07Zy5uYW1lJiZmLnB1c2goJyBuYW1lPSInLFhhKGcubmFtZSksJyInKTtpZihnLnR5cGUpe2YucHVzaCgnIHR5cGU9IicsWGEoZy50eXBlKSwnIicpO3ZhciBrPXt9O3VhKGssZyk7ZGVsZXRlIGsudHlwZTtnPWt9Zi5wdXNoKCI+Iik7Zj1mLmpvaW4oIiIpfWY9bmIoZCxmKTtnJiYoInN0cmluZyI9PT10eXBlb2YgZz9mLmNsYXNzTmFtZT1nOmZhKGcpP2YuY2xhc3NOYW1lPWcuam9pbigiICIpOmxiKGYsZykpOzI8ZS5sZW5ndGgmJm1iKGQsZixlKTtyZXR1cm4gZn07dmFyIHZiPWZ1bmN0aW9uKGEsYil7Yj8ocShwYSh2YSxiKSwiTm8gc3VjaCBBUklBIHJvbGUgIitiKSxhLnNldEF0dHJpYnV0ZSgicm9sZSIsYikpOmEucmVtb3ZlQXR0cmlidXRlKCJyb2xlIil9LHhiPWZ1bmN0aW9uKGEsYixjKXtmYShjKSYmKGM9Yy5qb2luKCIgIikpO3ZhciBkPXdiKGIpOyIiPT09Y3x8dm9pZCAwPT1jPyhtYXx8KG1hPXthdG9taWM6ITEsYXV0b2NvbXBsZXRlOiJub25lIixkcm9wZWZmZWN0OiJub25lIixoYXNwb3B1cDohMSxsaXZlOiJvZmYiLG11bHRpbGluZTohMSxtdWx0aXNlbGVjdGFibGU6ITEsb3JpZW50YXRpb246InZlcnRpY2FsIixyZWFkb25seTohMSxyZWxldmFudDoiYWRkaXRpb25zIHRleHQiLHJlcXVpcmVkOiExLHNvcnQ6Im5vbmUiLGJ1c3k6ITEsZGlzYWJsZWQ6ITEsaGlkZGVuOiExLGludmFsaWQ6ImZhbHNlIn0pLGM9bWEsYiBpbiBjP2Euc2V0QXR0cmlidXRlKGQsY1tiXSk6YS5yZW1vdmVBdHRyaWJ1dGUoZCkpOmEuc2V0QXR0cmlidXRlKGQsCmMpfSx3Yj1mdW5jdGlvbihhKXtxKGEsIkFSSUEgYXR0cmlidXRlIGNhbm5vdCBiZSBlbXB0eS4iKTtxKHBhKG5hLGEpLCJObyBzdWNoIEFSSUEgYXR0cmlidXRlICIrYSk7cmV0dXJuImFyaWEtIithfTt2YXIgeWI9T2JqZWN0LmZyZWV6ZXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O3ZhciBDPWZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVTt0aGlzLko9dGhpcy5KfTtDLnByb3RvdHlwZS5VPSExO0MucHJvdG90eXBlLk49ZnVuY3Rpb24oKXt0aGlzLlV8fCh0aGlzLlU9ITAsdGhpcy51KCkpfTt2YXIgemI9ZnVuY3Rpb24oYSxiKXthLlU/YigpOihhLkp8fChhLko9W10pLGEuSi5wdXNoKGIpKX07Qy5wcm90b3R5cGUudT1mdW5jdGlvbigpe2lmKHRoaXMuSilmb3IoO3RoaXMuSi5sZW5ndGg7KXRoaXMuSi5zaGlmdCgpKCl9O3ZhciBBYj1mdW5jdGlvbihhKXthJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5OJiZhLk4oKX07dmFyIEJiPWZ1bmN0aW9uKGEpe3JldHVybiJzdHJpbmciPT10eXBlb2YgYS5jbGFzc05hbWU/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sRD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6QmIoYSkubWF0Y2goL1xTKy9nKXx8W119LENiPWZ1bmN0aW9uKGEsYil7InN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZT9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxEYj1mdW5jdGlvbihhLGIpe3JldHVybiBhLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5jb250YWlucyhiKTpHYShEKGEpLGIpfSxFYj1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFEYihhLGIpKXt2YXIgYz1CYihhKTtDYihhLGMrKDA8Yy5sZW5ndGg/IiAiK2I6YikpfX0sRmI9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClyKGIsCmZ1bmN0aW9uKGUpe0ViKGEsZSl9KTtlbHNle3ZhciBjPXt9O3IoRChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7cihiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPTA8Yi5sZW5ndGg/IiAiK2Q6ZDtDYihhLGIpfX0sR2I9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6RGIoYSxiKSYmQ2IoYSxFYShEKGEpLGZ1bmN0aW9uKGMpe3JldHVybiBjIT1ifSkuam9pbigiICIpKX0sSGI9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9yKGIsZnVuY3Rpb24oYyl7R2IoYSxjKX0pOkNiKGEsRWEoRChhKSxmdW5jdGlvbihjKXtyZXR1cm4hR2EoYixjKX0pLmpvaW4oIiAiKSl9O3ZhciBJYj0hdnx8OTw9TnVtYmVyKGliKSxKYj0hdnx8OTw9TnVtYmVyKGliKSxLYj12JiYhQSgiOSIpLExiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e2wuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsY2EsYiksbC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjYSxiKX1jYXRjaChjKXt9cmV0dXJuIGF9KCk7dmFyIEU9ZnVuY3Rpb24oYSxiKXt0aGlzLnR5cGU9YTt0aGlzLmE9dGhpcy50YXJnZXQ9Yjt0aGlzLmg9ITE7dGhpcy5LYT0hMH07RS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuaD0hMH07RS5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3RoaXMuS2E9ITF9O3ZhciBGPXtMOiJtb3VzZWRvd24iLE06Im1vdXNldXAiLGFhOiJtb3VzZWNhbmNlbCIsaGM6Im1vdXNlbW92ZSIsamM6Im1vdXNlb3ZlciIsaWM6Im1vdXNlb3V0IixmYzoibW91c2VlbnRlciIsZ2M6Im1vdXNlbGVhdmUifTt2YXIgRz1mdW5jdGlvbihhLGIpe0UuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy5hPXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5jPTA7dGhpcy5BPXRoaXMubWV0YUtleT10aGlzLnNoaWZ0S2V5PXRoaXMuYWx0S2V5PXRoaXMuY3RybEtleT0hMTt0aGlzLnBvaW50ZXJJZD0wO3RoaXMucG9pbnRlclR5cGU9IiI7dGhpcy5iPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMuYT1iO2lmKGI9YS5yZWxhdGVkVGFyZ2V0KXtpZih4KXthOnt0cnl7WWEoYi5ub2RlTmFtZSk7dmFyIGU9ITA7YnJlYWsgYX1jYXRjaChmKXt9ZT0KITF9ZXx8KGI9bnVsbCl9fWVsc2UibW91c2VvdmVyIj09Yz9iPWEuZnJvbUVsZW1lbnQ6Im1vdXNlb3V0Ij09YyYmKGI9YS50b0VsZW1lbnQpO3RoaXMucmVsYXRlZFRhcmdldD1iO2Q/KHRoaXMuY2xpZW50WD12b2lkIDAhPT1kLmNsaWVudFg/ZC5jbGllbnRYOmQucGFnZVgsdGhpcy5jbGllbnRZPXZvaWQgMCE9PWQuY2xpZW50WT9kLmNsaWVudFk6ZC5wYWdlWSx0aGlzLnNjcmVlblg9ZC5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1kLnNjcmVlbll8fDApOih0aGlzLmNsaWVudFg9dm9pZCAwIT09YS5jbGllbnRYP2EuY2xpZW50WDphLnBhZ2VYLHRoaXMuY2xpZW50WT12b2lkIDAhPT1hLmNsaWVudFk/YS5jbGllbnRZOmEucGFnZVksdGhpcy5zY3JlZW5YPWEuc2NyZWVuWHx8MCx0aGlzLnNjcmVlblk9YS5zY3JlZW5ZfHwwKTt0aGlzLmJ1dHRvbj1hLmJ1dHRvbjt0aGlzLmM9YS5rZXlDb2RlfHwwO3RoaXMua2V5PWEua2V5fHwiIjt0aGlzLmN0cmxLZXk9YS5jdHJsS2V5O3RoaXMuYWx0S2V5PQphLmFsdEtleTt0aGlzLnNoaWZ0S2V5PWEuc2hpZnRLZXk7dGhpcy5tZXRhS2V5PWEubWV0YUtleTt0aGlzLkE9ej9hLm1ldGFLZXk6YS5jdHJsS2V5O3RoaXMucG9pbnRlcklkPWEucG9pbnRlcklkfHwwO3RoaXMucG9pbnRlclR5cGU9InN0cmluZyI9PT10eXBlb2YgYS5wb2ludGVyVHlwZT9hLnBvaW50ZXJUeXBlOk1iW2EucG9pbnRlclR5cGVdfHwiIjt0aGlzLmI9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnRoaXMuZygpfX07bihHLEUpO3ZhciBOYj15YihbMSw0LDJdKSxNYj15Yih7MjoidG91Y2giLDM6InBlbiIsNDoibW91c2UifSksT2I9ZnVuY3Rpb24oYSl7cmV0dXJuIEliPzA9PWEuYi5idXR0b246ImNsaWNrIj09YS50eXBlPyEwOiEhKGEuYi5idXR0b24mTmJbMF0pfTtHLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7Ry5pLmouY2FsbCh0aGlzKTt0aGlzLmIuc3RvcFByb3BhZ2F0aW9uP3RoaXMuYi5zdG9wUHJvcGFnYXRpb24oKTp0aGlzLmIuY2FuY2VsQnViYmxlPSEwfTsKRy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe0cuaS5nLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5iO2lmKGEucHJldmVudERlZmF1bHQpYS5wcmV2ZW50RGVmYXVsdCgpO2Vsc2UgaWYoYS5yZXR1cm5WYWx1ZT0hMSxLYil0cnl7aWYoYS5jdHJsS2V5fHwxMTI8PWEua2V5Q29kZSYmMTIzPj1hLmtleUNvZGUpYS5rZXlDb2RlPS0xfWNhdGNoKGIpe319O3ZhciBQYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKDFFNipNYXRoLnJhbmRvbSgpfDApLFFiPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW1BiXSl9LFJiPTA7dmFyIFNiPWZ1bmN0aW9uKGEsYixjLGQsZSl7dGhpcy5saXN0ZW5lcj1hO3RoaXMuYT1udWxsO3RoaXMuc3JjPWI7dGhpcy50eXBlPWM7dGhpcy5jYXB0dXJlPSEhZDt0aGlzLm1hPWU7dGhpcy5rZXk9KytSYjt0aGlzLlg9dGhpcy5oYT0hMX0sVGI9ZnVuY3Rpb24oYSl7YS5YPSEwO2EubGlzdGVuZXI9bnVsbDthLmE9bnVsbDthLnNyYz1udWxsO2EubWE9bnVsbH07dmFyIFViPWZ1bmN0aW9uKGEpe3RoaXMuc3JjPWE7dGhpcy5hPXt9O3RoaXMuYj0wfTtVYi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS50b1N0cmluZygpO2E9dGhpcy5hW2ZdO2F8fChhPXRoaXMuYVtmXT1bXSx0aGlzLmIrKyk7dmFyIGc9VmIoYSxiLGQsZSk7LTE8Zz8oYj1hW2ddLGN8fChiLmhhPSExKSk6KGI9bmV3IFNiKGIsdGhpcy5zcmMsZiwhIWQsZSksYi5oYT1jLGEucHVzaChiKSk7cmV0dXJuIGJ9Owp2YXIgV2I9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLnR5cGU7YyBpbiBhLmEmJkhhKGEuYVtjXSxiKSYmKFRiKGIpLDA9PWEuYVtjXS5sZW5ndGgmJihkZWxldGUgYS5hW2NdLGEuYi0tKSl9LFhiPWZ1bmN0aW9uKGEsYixjLGQsZSl7YT1hLmFbYi50b1N0cmluZygpXTtiPS0xO2EmJihiPVZiKGEsYyxkLGUpKTtyZXR1cm4tMTxiP2FbYl06bnVsbH0sVmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuWCYmZi5saXN0ZW5lcj09YiYmZi5jYXB0dXJlPT0hIWMmJmYubWE9PWQpcmV0dXJuIGV9cmV0dXJuLTF9O3ZhciBZYj0iY2xvc3VyZV9sbV8iKygxRTYqTWF0aC5yYW5kb20oKXwwKSxaYj17fSwkYj0wLGJjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZCYmZC5vbmNlKXJldHVybiBhYyhhLGIsYyxkLGUpO2lmKGZhKGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyliYyhhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9Y2MoYyk7cmV0dXJuIFFiKGEpP2RjKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOmVjKGEsYixjLCExLGQsZSl9LGVjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGc9bShlKT8hIWUuY2FwdHVyZTohIWUsaz1mYyhhKTtrfHwoYVtZYl09az1uZXcgVWIoYSkpO2M9ay5hZGQoYixjLGQsZyxmKTtpZihjLmEpcmV0dXJuIGM7ZD1nYygpO2MuYT1kO2Quc3JjPWE7ZC5saXN0ZW5lcj1jO2lmKGEuYWRkRXZlbnRMaXN0ZW5lcilMYnx8KGU9Zyksdm9pZCAwPT09ZSYmKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksCmQsZSk7ZWxzZSBpZihhLmF0dGFjaEV2ZW50KWEuYXR0YWNoRXZlbnQoaGMoYi50b1N0cmluZygpKSxkKTtlbHNlIGlmKGEuYWRkTGlzdGVuZXImJmEucmVtb3ZlTGlzdGVuZXIpcSgiY2hhbmdlIj09PWIsIk1lZGlhUXVlcnlMaXN0IG9ubHkgaGFzIGEgY2hhbmdlIGV2ZW50IiksYS5hZGRMaXN0ZW5lcihkKTtlbHNlIHRocm93IEVycm9yKCJhZGRFdmVudExpc3RlbmVyIGFuZCBhdHRhY2hFdmVudCBhcmUgdW5hdmFpbGFibGUuIik7JGIrKztyZXR1cm4gY30sZ2M9ZnVuY3Rpb24oKXt2YXIgYT1pYyxiPUpiP2Z1bmN0aW9uKGMpe3JldHVybiBhLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKX06ZnVuY3Rpb24oYyl7Yz1hLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKTtpZighYylyZXR1cm4gY307cmV0dXJuIGJ9LGFjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZmEoYikpe2Zvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWFjKGEsYltmXSxjLGQsZSk7cmV0dXJuIG51bGx9Yz1jYyhjKTtyZXR1cm4gUWIoYSk/CmEuaC5hZGQoU3RyaW5nKGIpLGMsITAsbShkKT8hIWQuY2FwdHVyZTohIWQsZSk6ZWMoYSxiLGMsITAsZCxlKX0samM9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihmYShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylqYyhhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPWNjKGMpLFFiKGEpPyhhPWEuaCxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5hJiYoZj1hLmFbYl0sYz1WYihmLGMsZCxlKSwtMTxjJiYoVGIoZltjXSkscShudWxsIT1mLmxlbmd0aCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSwwPT1mLmxlbmd0aCYmKGRlbGV0ZSBhLmFbYl0sYS5iLS0pKSkpOmEmJihhPWZjKGEpKSYmKGM9WGIoYSxiLGMsZCxlKSkmJmtjKGMpfSxrYz1mdW5jdGlvbihhKXtpZigibnVtYmVyIiE9PXR5cGVvZiBhJiZhJiYhYS5YKXt2YXIgYj1hLnNyYztpZihRYihiKSlXYihiLmgsYSk7ZWxzZXt2YXIgYz1hLnR5cGUsZD1hLmE7Yi5yZW1vdmVFdmVudExpc3RlbmVyPwpiLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KGhjKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7JGItLTsoYz1mYyhiKSk/KFdiKGMsYSksMD09Yy5iJiYoYy5zcmM9bnVsbCxiW1liXT1udWxsKSk6VGIoYSl9fX0saGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gWmI/WmJbYV06WmJbYV09Im9uIithfSxtYz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMDtpZihhPWZjKGEpKWlmKGI9YS5hW2IudG9TdHJpbmcoKV0pZm9yKGI9Yi5jb25jYXQoKSxhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBmPWJbYV07ZiYmZi5jYXB0dXJlPT1jJiYhZi5YJiYoZj1sYyhmLGQpLGU9ZSYmITEhPT1mKX1yZXR1cm4gZX0sbGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5tYXx8YS5zcmM7YS5oYSYma2MoYSk7cmV0dXJuIGMuY2FsbChkLGIpfSxpYz1mdW5jdGlvbihhLApiKXtpZihhLlgpcmV0dXJuITA7aWYoIUpiKXtpZighYilhOntiPVsid2luZG93IiwiZXZlbnQiXTtmb3IodmFyIGM9bCxkPTA7ZDxiLmxlbmd0aDtkKyspaWYoYz1jW2JbZF1dLG51bGw9PWMpe2I9bnVsbDticmVhayBhfWI9Y31kPWI7Yj1uZXcgRyhkLHRoaXMpO2M9ITA7aWYoISgwPmQua2V5Q29kZXx8dm9pZCAwIT1kLnJldHVyblZhbHVlKSl7YTp7dmFyIGU9ITE7aWYoMD09ZC5rZXlDb2RlKXRyeXtkLmtleUNvZGU9LTE7YnJlYWsgYX1jYXRjaChnKXtlPSEwfWlmKGV8fHZvaWQgMD09ZC5yZXR1cm5WYWx1ZSlkLnJldHVyblZhbHVlPSEwfWQ9W107Zm9yKGU9Yi5hO2U7ZT1lLnBhcmVudE5vZGUpZC5wdXNoKGUpO2E9YS50eXBlO2ZvcihlPWQubGVuZ3RoLTE7IWIuaCYmMDw9ZTtlLS0pe2IuYT1kW2VdO3ZhciBmPW1jKGRbZV0sYSwhMCxiKTtjPWMmJmZ9Zm9yKGU9MDshYi5oJiZlPGQubGVuZ3RoO2UrKyliLmE9ZFtlXSxmPW1jKGRbZV0sYSwhMSxiKSxjPWMmJmZ9cmV0dXJuIGN9cmV0dXJuIGxjKGEsCm5ldyBHKGIsdGhpcykpfSxmYz1mdW5jdGlvbihhKXthPWFbWWJdO3JldHVybiBhIGluc3RhbmNlb2YgVWI/YTpudWxsfSxuYz0iX19jbG9zdXJlX2V2ZW50c19mbl8iKygxRTkqTWF0aC5yYW5kb20oKT4+PjApLGNjPWZ1bmN0aW9uKGEpe3EoYSwiTGlzdGVuZXIgY2FuIG5vdCBiZSBudWxsLiIpO2lmKGlhKGEpKXJldHVybiBhO3EoYS5oYW5kbGVFdmVudCwiQW4gb2JqZWN0IGxpc3RlbmVyIG11c3QgaGF2ZSBoYW5kbGVFdmVudCBtZXRob2QuIik7YVtuY118fChhW25jXT1mdW5jdGlvbihiKXtyZXR1cm4gYS5oYW5kbGVFdmVudChiKX0pO3JldHVybiBhW25jXX07dmFyIG9jPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9e319O24ob2MsQyk7CnZhciBwYz1bXSxIPWZ1bmN0aW9uKGEsYixjLGQpe2ZhKGMpfHwoYyYmKHBjWzBdPWMudG9TdHJpbmcoKSksYz1wYyk7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWJjKGIsY1tlXSxkfHxhLmhhbmRsZUV2ZW50LCExLGEuYnx8YSk7aWYoIWYpYnJlYWs7YS5hW2Yua2V5XT1mfXJldHVybiBhfSxxYz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoZmEoYykpZm9yKHZhciBnPTA7ZzxjLmxlbmd0aDtnKyspcWMoYSxiLGNbZ10sZCxlLGYpO2Vsc2UgZD1kfHxhLmhhbmRsZUV2ZW50LGU9bShlKT8hIWUuY2FwdHVyZTohIWUsZj1mfHxhLmJ8fGEsZD1jYyhkKSxlPSEhZSxjPVFiKGIpP1hiKGIuaCxTdHJpbmcoYyksZCxlLGYpOmI/KGI9ZmMoYikpP1hiKGIsYyxkLGUsZik6bnVsbDpudWxsLGMmJihrYyhjKSxkZWxldGUgYS5hW2Mua2V5XSk7cmV0dXJuIGF9LHJjPWZ1bmN0aW9uKGEpe29hKGEuYSxmdW5jdGlvbihiLGMpe3RoaXMuYS5oYXNPd25Qcm9wZXJ0eShjKSYma2MoYil9LAphKTthLmE9e319O29jLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7b2MuaS51LmNhbGwodGhpcyk7cmModGhpcyl9O29jLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJFdmVudEhhbmRsZXIuaGFuZGxlRXZlbnQgbm90IGltcGxlbWVudGVkIik7fTt2YXIgST1mdW5jdGlvbigpe0MuY2FsbCh0aGlzKTt0aGlzLmg9bmV3IFViKHRoaXMpO3RoaXMuTWE9dGhpczt0aGlzLnBhPW51bGx9O24oSSxDKTtJLnByb3RvdHlwZVtQYl09ITA7SS5wcm90b3R5cGUucmE9ZnVuY3Rpb24oYSl7dGhpcy5wYT1hfTtJLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjLGQpe2pjKHRoaXMsYSxiLGMsZCl9Owp2YXIgdWM9ZnVuY3Rpb24oYSxiKXtzYyhhKTt2YXIgYz1hLnBhO2lmKGMpe3ZhciBkPVtdO2Zvcih2YXIgZT0xO2M7Yz1jLnBhKWQucHVzaChjKSxxKDFFMz4rK2UsImluZmluaXRlIGxvb3AiKX1hPWEuTWE7Yz1iLnR5cGV8fGI7InN0cmluZyI9PT10eXBlb2YgYj9iPW5ldyBFKGIsYSk6YiBpbnN0YW5jZW9mIEU/Yi50YXJnZXQ9Yi50YXJnZXR8fGE6KGU9YixiPW5ldyBFKGMsYSksdWEoYixlKSk7ZT0hMDtpZihkKWZvcih2YXIgZj1kLmxlbmd0aC0xOyFiLmgmJjA8PWY7Zi0tKXt2YXIgZz1iLmE9ZFtmXTtlPXRjKGcsYywhMCxiKSYmZX1iLmh8fChnPWIuYT1hLGU9dGMoZyxjLCEwLGIpJiZlLGIuaHx8KGU9dGMoZyxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLmgmJmY8ZC5sZW5ndGg7ZisrKWc9Yi5hPWRbZl0sZT10YyhnLGMsITEsYikmJmU7cmV0dXJuIGV9OwpJLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7SS5pLnUuY2FsbCh0aGlzKTtpZih0aGlzLmgpe3ZhciBhPXRoaXMuaCxiPTAsYztmb3IoYyBpbiBhLmEpe2Zvcih2YXIgZD1hLmFbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixUYihkW2VdKTtkZWxldGUgYS5hW2NdO2EuYi0tfX10aGlzLnBhPW51bGx9O3ZhciBkYz1mdW5jdGlvbihhLGIsYyxkLGUpe3NjKGEpO3JldHVybiBhLmguYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LHRjPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5oLmFbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGc9YltmXTtpZihnJiYhZy5YJiZnLmNhcHR1cmU9PWMpe3ZhciBrPWcubGlzdGVuZXIscD1nLm1hfHxnLnNyYztnLmhhJiZXYihhLmgsZyk7ZT0hMSE9PWsuY2FsbChwLGQpJiZlfX1yZXR1cm4gZSYmMCE9ZC5LYX0sc2M9ZnVuY3Rpb24oYSl7cShhLmgsIkV2ZW50IHRhcmdldCBpcyBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgY2FsbCB0aGUgc3VwZXJjbGFzcyAoZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpIGNvbnN0cnVjdG9yPyIpfTt2YXIgeGM9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKHkmJiFBKCI1MjUiKSlyZXR1cm4hMDtpZih6JiZlKXJldHVybiB2YyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZigheCl7Im51bWJlciI9PT10eXBlb2YgYiYmKGI9d2MoYikpO3ZhciBnPTE3PT1ifHwxOD09Ynx8eiYmOTE9PWI7aWYoKCFjfHx6KSYmZ3x8eiYmMTY9PWImJihkfHxmKSlyZXR1cm4hMX1pZigoeXx8YmIpJiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1pZih2JiZkJiZiPT1hKXJldHVybiExO3N3aXRjaChhKXtjYXNlIDEzOnJldHVybiB4P2Z8fGU/ITE6IShjJiZkKTohMDtjYXNlIDI3OnJldHVybiEoeXx8YmJ8fHgpfXJldHVybiB4JiYoZHx8ZXx8Zik/ITE6dmMoYSl9LHZjPWZ1bmN0aW9uKGEpe2lmKDQ4PD1hJiY1Nz49YXx8Cjk2PD1hJiYxMDY+PWF8fDY1PD1hJiY5MD49YXx8KHl8fGJiKSYmMD09YSlyZXR1cm4hMDtzd2l0Y2goYSl7Y2FzZSAzMjpjYXNlIDQzOmNhc2UgNjM6Y2FzZSA2NDpjYXNlIDEwNzpjYXNlIDEwOTpjYXNlIDExMDpjYXNlIDExMTpjYXNlIDE4NjpjYXNlIDU5OmNhc2UgMTg5OmNhc2UgMTg3OmNhc2UgNjE6Y2FzZSAxODg6Y2FzZSAxOTA6Y2FzZSAxOTE6Y2FzZSAxOTI6Y2FzZSAyMjI6Y2FzZSAyMTk6Y2FzZSAyMjA6Y2FzZSAyMjE6Y2FzZSAxNjM6Y2FzZSA1ODpyZXR1cm4hMDtjYXNlIDE3MzpyZXR1cm4geDtkZWZhdWx0OnJldHVybiExfX0sd2M9ZnVuY3Rpb24oYSl7aWYoeClhPXljKGEpO2Vsc2UgaWYoeiYmeSlzd2l0Y2goYSl7Y2FzZSA5MzphPTkxfXJldHVybiBhfSx5Yz1mdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSA2MTpyZXR1cm4gMTg3O2Nhc2UgNTk6cmV0dXJuIDE4NjtjYXNlIDE3MzpyZXR1cm4gMTg5O2Nhc2UgMjI0OnJldHVybiA5MTtjYXNlIDA6cmV0dXJuIDIyNDsKZGVmYXVsdDpyZXR1cm4gYX19O3ZhciBKPWZ1bmN0aW9uKGEsYil7SS5jYWxsKHRoaXMpO2EmJnpjKHRoaXMsYSxiKX07bihKLEkpO2g9Si5wcm90b3R5cGU7aC5TPW51bGw7aC5uYT1udWxsO2guQ2E9bnVsbDtoLm9hPW51bGw7aC53PS0xO2guRj0tMTtoLnVhPSExOwp2YXIgQWM9ezM6MTMsMTI6MTQ0LDYzMjMyOjM4LDYzMjMzOjQwLDYzMjM0OjM3LDYzMjM1OjM5LDYzMjM2OjExMiw2MzIzNzoxMTMsNjMyMzg6MTE0LDYzMjM5OjExNSw2MzI0MDoxMTYsNjMyNDE6MTE3LDYzMjQyOjExOCw2MzI0MzoxMTksNjMyNDQ6MTIwLDYzMjQ1OjEyMSw2MzI0NjoxMjIsNjMyNDc6MTIzLDYzMjQ4OjQ0LDYzMjcyOjQ2LDYzMjczOjM2LDYzMjc1OjM1LDYzMjc2OjMzLDYzMjc3OjM0LDYzMjg5OjE0NCw2MzMwMjo0NX0sQmM9e1VwOjM4LERvd246NDAsTGVmdDozNyxSaWdodDozOSxFbnRlcjoxMyxGMToxMTIsRjI6MTEzLEYzOjExNCxGNDoxMTUsRjU6MTE2LEY2OjExNyxGNzoxMTgsRjg6MTE5LEY5OjEyMCxGMTA6MTIxLEYxMToxMjIsRjEyOjEyMywiVSswMDdGIjo0NixIb21lOjM2LEVuZDozNSxQYWdlVXA6MzMsUGFnZURvd246MzQsSW5zZXJ0OjQ1fSxDYz0heXx8QSgiNTI1IiksRGM9eiYmeDsKSi5wcm90b3R5cGUuYT1mdW5jdGlvbihhKXtpZih5fHxiYilpZigxNz09dGhpcy53JiYhYS5jdHJsS2V5fHwxOD09dGhpcy53JiYhYS5hbHRLZXl8fHomJjkxPT10aGlzLncmJiFhLm1ldGFLZXkpdGhpcy5GPXRoaXMudz0tMTstMT09dGhpcy53JiYoYS5jdHJsS2V5JiYxNyE9YS5jP3RoaXMudz0xNzphLmFsdEtleSYmMTghPWEuYz90aGlzLnc9MTg6YS5tZXRhS2V5JiY5MSE9YS5jJiYodGhpcy53PTkxKSk7Q2MmJiF4YyhhLmMsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGEuYWx0S2V5LGEubWV0YUtleSk/dGhpcy5oYW5kbGVFdmVudChhKToodGhpcy5GPXdjKGEuYyksRGMmJih0aGlzLnVhPWEuYWx0S2V5KSl9O0oucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dGhpcy5GPXRoaXMudz0tMTt0aGlzLnVhPWEuYWx0S2V5fTsKSi5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5iLGM9Yi5hbHRLZXk7aWYodiYmImtleXByZXNzIj09YS50eXBlKXt2YXIgZD10aGlzLkY7dmFyIGU9MTMhPWQmJjI3IT1kP2Iua2V5Q29kZTowfWVsc2UoeXx8YmIpJiYia2V5cHJlc3MiPT1hLnR5cGU/KGQ9dGhpcy5GLGU9MDw9Yi5jaGFyQ29kZSYmNjMyMzI+Yi5jaGFyQ29kZSYmdmMoZCk/Yi5jaGFyQ29kZTowKTphYiYmIXk/KGQ9dGhpcy5GLGU9dmMoZCk/Yi5rZXlDb2RlOjApOigia2V5cHJlc3MiPT1hLnR5cGU/KERjJiYoYz10aGlzLnVhKSxiLmtleUNvZGU9PWIuY2hhckNvZGU/MzI+Yi5rZXlDb2RlPyhkPWIua2V5Q29kZSxlPTApOihkPXRoaXMuRixlPWIuY2hhckNvZGUpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkseiYmNjM9PWUmJjIyND09ZCYmKGQ9MTkxKSk7dmFyIGY9ZD13YyhkKTtkPzYzMjMyPD0KZCYmZCBpbiBBYz9mPUFjW2RdOjI1PT1kJiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBCYyYmKGY9QmNbYi5rZXlJZGVudGlmaWVyXSk7eCYmQ2MmJiJrZXlwcmVzcyI9PWEudHlwZSYmIXhjKGYsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KXx8KGE9Zj09dGhpcy53LHRoaXMudz1mLGI9bmV3IEVjKGYsZSxhLGIpLGIuYWx0S2V5PWMsdWModGhpcyxiKSl9O0oucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTsKdmFyIHpjPWZ1bmN0aW9uKGEsYixjKXthLm9hJiZGYyhhKTthLlM9YjthLm5hPWJjKGEuUywia2V5cHJlc3MiLGEsYyk7YS5DYT1iYyhhLlMsImtleWRvd24iLGEuYSxjLGEpO2Eub2E9YmMoYS5TLCJrZXl1cCIsYS5iLGMsYSl9LEZjPWZ1bmN0aW9uKGEpe2EubmEmJihrYyhhLm5hKSxrYyhhLkNhKSxrYyhhLm9hKSxhLm5hPW51bGwsYS5DYT1udWxsLGEub2E9bnVsbCk7YS5TPW51bGw7YS53PS0xO2EuRj0tMX07Si5wcm90b3R5cGUudT1mdW5jdGlvbigpe0ouaS51LmNhbGwodGhpcyk7RmModGhpcyl9O3ZhciBFYz1mdW5jdGlvbihhLGIsYyxkKXtHLmNhbGwodGhpcyxkKTt0aGlzLnR5cGU9ImtleSI7dGhpcy5jPWE7dGhpcy5yZXBlYXQ9Y307bihFYyxHKTt2YXIgR2M9eD8iTW96VXNlclNlbGVjdCI6eXx8YmI/IldlYmtpdFVzZXJTZWxlY3QiOm51bGwsSGM9ZnVuY3Rpb24oYSxiKXtiPWI/bnVsbDphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7aWYoR2Mpe3ZhciBjPSJub25lIjthLnN0eWxlJiYoYS5zdHlsZVtHY109Yyk7aWYoYil7YT0wO2Zvcih2YXIgZDtkPWJbYV07YSsrKWQuc3R5bGUmJihkLnN0eWxlW0djXT1jKX19ZWxzZSBpZih2fHxhYilpZihjPSJvbiIsYS5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyksYilmb3IoYT0wO2Q9YlthXTthKyspZC5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyl9O3ZhciBJYz1mdW5jdGlvbigpe307ZGEoSWMpO0ljLnByb3RvdHlwZS5hPTA7dmFyIEs9ZnVuY3Rpb24oYSl7SS5jYWxsKHRoaXMpO3RoaXMuaj1hfHx4YXx8KHhhPW5ldyB1Yik7dGhpcy5xYT1KYzt0aGlzLlk9bnVsbDt0aGlzLm09ITE7dGhpcy5hPW51bGw7dGhpcy5BPXZvaWQgMDt0aGlzLmc9dGhpcy5jPXRoaXMuYj1udWxsO3RoaXMuR2E9ITF9O24oSyxJKTtLLnByb3RvdHlwZS5PYT1JYy5SKCk7CnZhciBKYz1udWxsLEtjPWZ1bmN0aW9uKGEsYil7c3dpdGNoKGEpe2Nhc2UgMTpyZXR1cm4gYj8iZGlzYWJsZSI6ImVuYWJsZSI7Y2FzZSAyOnJldHVybiBiPyJoaWdobGlnaHQiOiJ1bmhpZ2hsaWdodCI7Y2FzZSA0OnJldHVybiBiPyJhY3RpdmF0ZSI6ImRlYWN0aXZhdGUiO2Nhc2UgODpyZXR1cm4gYj8ic2VsZWN0IjoidW5zZWxlY3QiO2Nhc2UgMTY6cmV0dXJuIGI/ImNoZWNrIjoidW5jaGVjayI7Y2FzZSAzMjpyZXR1cm4gYj8iZm9jdXMiOiJibHVyIjtjYXNlIDY0OnJldHVybiBiPyJvcGVuIjoiY2xvc2UifXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBzdGF0ZSIpO30sTGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuWXx8KGEuWT0iOiIrKGEuT2EuYSsrKS50b1N0cmluZygzNikpfSxNYz1mdW5jdGlvbihhLGIpe2lmKGEuYiYmYS5iLmcpe3ZhciBjPWEuYi5nLGQ9YS5ZO2QgaW4gYyYmZGVsZXRlIGNbZF07cWEoYS5iLmcsYixhKX1hLlk9Yn07Sy5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9Owp2YXIgTmM9ZnVuY3Rpb24oYSl7YT1hLmE7cShhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cmV0dXJuIGF9LE9jPWZ1bmN0aW9uKGEpe2EuQXx8KGEuQT1uZXcgb2MoYSkpO3JldHVybiBxKGEuQSl9O0sucHJvdG90eXBlLnJhPWZ1bmN0aW9uKGEpe2lmKHRoaXMuYiYmdGhpcy5iIT1hKXRocm93IEVycm9yKCJNZXRob2Qgbm90IHN1cHBvcnRlZCIpO0suaS5yYS5jYWxsKHRoaXMsYSl9O0sucHJvdG90eXBlLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPW5iKHRoaXMuai5hLCJESVYiKX07CnZhciBQYz1mdW5jdGlvbihhLGIpe2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiJiZhLnhhKGIpKXthLkdhPSEwO3ZhciBjPXFiKGIpO2EuaiYmYS5qLmE9PWN8fChhLmo9Yj9uZXcgdWIocWIoYikpOnhhfHwoeGE9bmV3IHViKSk7YS52YShiKTthLkQoKX1lbHNlIHRocm93IEVycm9yKCJJbnZhbGlkIGVsZW1lbnQgdG8gZGVjb3JhdGUiKTt9O2g9Sy5wcm90b3R5cGU7aC54YT1mdW5jdGlvbigpe3JldHVybiEwfTtoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hfTtoLkQ9ZnVuY3Rpb24oKXt0aGlzLm09ITA7UWModGhpcyxmdW5jdGlvbihhKXshYS5tJiZhLmYoKSYmYS5EKCl9KX07aC5QPWZ1bmN0aW9uKCl7UWModGhpcyxmdW5jdGlvbihhKXthLm0mJmEuUCgpfSk7dGhpcy5BJiZyYyh0aGlzLkEpO3RoaXMubT0hMX07CmgudT1mdW5jdGlvbigpe3RoaXMubSYmdGhpcy5QKCk7dGhpcy5BJiYodGhpcy5BLk4oKSxkZWxldGUgdGhpcy5BKTtRYyh0aGlzLGZ1bmN0aW9uKGEpe2EuTigpfSk7IXRoaXMuR2EmJnRoaXMuYSYmb2IodGhpcy5hKTt0aGlzLmI9dGhpcy5hPXRoaXMuZz10aGlzLmM9bnVsbDtLLmkudS5jYWxsKHRoaXMpfTtoLnNhPWZ1bmN0aW9uKGEsYil7dGhpcy50YShhLFJjKHRoaXMpLGIpfTsKaC50YT1mdW5jdGlvbihhLGIsYyl7cSghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLm0mJihjfHwhdGhpcy5tKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZigwPmJ8fGI+UmModGhpcykpdGhyb3cgRXJyb3IoIkNoaWxkIGNvbXBvbmVudCBpbmRleCBvdXQgb2YgYm91bmRzIik7dGhpcy5nJiZ0aGlzLmN8fCh0aGlzLmc9e30sdGhpcy5jPVtdKTtpZihhLmI9PXRoaXMpe3ZhciBkPUxjKGEpO3RoaXMuZ1tkXT1hO0hhKHRoaXMuYyxhKX1lbHNlIHFhKHRoaXMuZyxMYyhhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuYiYmYS5ZKXt2YXIgZT1hLmI7ZD1hLlk7ZS5nJiZkPyhlPWUuZyxkPShudWxsIT09ZSYmZCBpbiBlP2VbZF06dm9pZCAwKXx8bnVsbCk6ZD1udWxsfWlmKGQmJmEuYiE9dGhpcyl0aHJvdyBFcnJvcigiVW5hYmxlIHRvIHNldCBwYXJlbnQgY29tcG9uZW50Iik7CmEuYj10aGlzO0suaS5yYS5jYWxsKGEsdGhpcyk7TGEodGhpcy5jLGIsMCxhKTtpZihhLm0mJnRoaXMubSYmYS5iPT10aGlzKWM9dGhpcy5qYSgpLGI9Yy5jaGlsZE5vZGVzW2JdfHxudWxsLGIhPWEuZigpJiZjLmluc2VydEJlZm9yZShhLmYoKSxiKTtlbHNlIGlmKGMpe3RoaXMuYXx8dGhpcy5pYSgpO2M9TCh0aGlzLGIrMSk7Yj10aGlzLmphKCk7Yz1jP2MuYTpudWxsO2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTthLmF8fGEuaWEoKTtiP2IuaW5zZXJ0QmVmb3JlKGEuYSxjfHxudWxsKTphLmouYS5ib2R5LmFwcGVuZENoaWxkKGEuYSk7YS5iJiYhYS5iLm18fGEuRCgpfWVsc2UgdGhpcy5tJiYhYS5tJiZhLmEmJmEuYS5wYXJlbnROb2RlJiYxPT1hLmEucGFyZW50Tm9kZS5ub2RlVHlwZSYmYS5EKCl9O2guamE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hfTsKdmFyIFNjPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEucWEpe3ZhciBiPWEubT9hLmE6YS5qLmEuYm9keTthOnt2YXIgYz1xYihiKTtpZihjLmRlZmF1bHRWaWV3JiZjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihjPWMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpKSl7Yz1jLmRpcmVjdGlvbnx8Yy5nZXRQcm9wZXJ0eVZhbHVlKCJkaXJlY3Rpb24iKXx8IiI7YnJlYWsgYX1jPSIifWEucWE9InJ0bCI9PShjfHwoYi5jdXJyZW50U3R5bGU/Yi5jdXJyZW50U3R5bGUuZGlyZWN0aW9uOm51bGwpfHxiLnN0eWxlJiZiLnN0eWxlLmRpcmVjdGlvbil9cmV0dXJuIGEucWF9LFJjPWZ1bmN0aW9uKGEpe3JldHVybiBhLmM/YS5jLmxlbmd0aDowfSxMPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuYz9hLmNbYl18fG51bGw6bnVsbH0sUWM9ZnVuY3Rpb24oYSxiLGMpe2EuYyYmcihhLmMsYixjKX0sVGM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jJiZiP0RhKGEuYyxiKTotMX07dmFyIFZjPWZ1bmN0aW9uKGEsYil7aWYoIWEpdGhyb3cgRXJyb3IoIkludmFsaWQgY2xhc3MgbmFtZSAiK2EpO2lmKCFpYShiKSl0aHJvdyBFcnJvcigiSW52YWxpZCBkZWNvcmF0b3IgZnVuY3Rpb24gIitiKTtVY1thXT1ifSxXYz17fSxVYz17fTt2YXIgWGM9ZnVuY3Rpb24oYSl7dGhpcy5oPWF9O2RhKFhjKTt2YXIgWWM9ZnVuY3Rpb24oYSxiKXthJiYoYS50YWJJbmRleD1iPzA6LTEpfSwkYz1mdW5jdGlvbihhLGIsYyl7Yy5pZCYmTWMoYixjLmlkKTt2YXIgZD1hLmIoKSxlPSExLGY9RChjKTtmJiZyKGYsZnVuY3Rpb24oZyl7Zz09ZD9lPSEwOmcmJnRoaXMuZyhiLGcsZCl9LGEpO2V8fEViKGMsZCk7WmMoYixjKTtyZXR1cm4gY307WGMucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiLGMpe2I9PWMrIi1kaXNhYmxlZCI/YS5aKCExKTpiPT1jKyItaG9yaXpvbnRhbCI/YWQoYSwiaG9yaXpvbnRhbCIpOmI9PWMrIi12ZXJ0aWNhbCImJmFkKGEsInZlcnRpY2FsIil9Owp2YXIgWmM9ZnVuY3Rpb24oYSxiKXtpZihiKWZvcih2YXIgYz1iLmZpcnN0Q2hpbGQsZDtjJiZjLnBhcmVudE5vZGU9PWI7KXtkPWMubmV4dFNpYmxpbmc7aWYoMT09Yy5ub2RlVHlwZSl7YTp7dmFyIGU9YztxKGUpO2U9RChlKTtmb3IodmFyIGY9MCxnPWUubGVuZ3RoO2Y8ZztmKyspe3ZhciBrPWVbZl07aWYoaz1rIGluIFVjP1VjW2tdKCk6bnVsbCl7ZT1rO2JyZWFrIGF9fWU9bnVsbH1lJiYoZS5hPWMsYS5pc0VuYWJsZWQoKXx8ZS5aKCExKSxhLnNhKGUpLFBjKGUsYykpfWVsc2UgYy5ub2RlVmFsdWUmJiIiIT1NYShjLm5vZGVWYWx1ZSl8fGIucmVtb3ZlQ2hpbGQoYyk7Yz1kfX0sYmQ9ZnVuY3Rpb24oYSxiKXtiPWIuZigpO3EoYiwiVGhlIGNvbnRhaW5lciBET00gZWxlbWVudCBjYW5ub3QgYmUgbnVsbC4iKTtIYyhiLHgpO3YmJihiLmhpZGVGb2N1cz0hMCk7KGE9YS5oKSYmdmIoYixhKX07WGMucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKWGMucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5iKCksYz1bYiwiaG9yaXpvbnRhbCI9PWEuSD9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgTT1mdW5jdGlvbigpe30sY2Q7ZGEoTSk7dmFyIGRkPXtidXR0b246InByZXNzZWQiLGNoZWNrYm94OiJjaGVja2VkIixtZW51aXRlbToic2VsZWN0ZWQiLG1lbnVpdGVtY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtcmFkaW86ImNoZWNrZWQiLHJhZGlvOiJjaGVja2VkIix0YWI6InNlbGVjdGVkIix0cmVlaXRlbToic2VsZWN0ZWQifTtNLnByb3RvdHlwZS5oPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLmouYigiRElWIixlZCh0aGlzLGEpLmpvaW4oIiAiKSxhLmJhKX07dmFyIGdkPWZ1bmN0aW9uKGEsYixjKXtpZihhPWEuZj9hLmYoKTphKXt2YXIgZD1bYl07diYmIUEoIjciKSYmKGQ9ZmQoRChhKSxiKSxkLnB1c2goYikpOyhjP0ZiOkhiKShhLGQpfX07Ck0ucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiKXtiLmlkJiZNYyhhLGIuaWQpO2ImJmIuZmlyc3RDaGlsZD9oZChhLGIuZmlyc3RDaGlsZC5uZXh0U2libGluZz9KYShiLmNoaWxkTm9kZXMpOmIuZmlyc3RDaGlsZCk6YS5iYT1udWxsO3ZhciBjPTAsZD10aGlzLmEoKSxlPXRoaXMuYSgpLGY9ITEsZz0hMSxrPSExLHA9SmEoRChiKSk7cihwLGZ1bmN0aW9uKEIpe2Z8fEIhPWQ/Z3x8QiE9ZT9jfD1pZCh0aGlzLEIpOmc9ITA6KGY9ITAsZT09ZCYmKGc9ITApKTsxPT1pZCh0aGlzLEIpJiYoQWEoYiksc2IoYikmJnRiKGIpJiZyYihiLCExKSl9LHRoaXMpO2Eubz1jO2Z8fChwLnB1c2goZCksZT09ZCYmKGc9ITApKTtnfHxwLnB1c2goZSk7KGE9YS53YSkmJnAucHVzaC5hcHBseShwLGEpO2lmKHYmJiFBKCI3Iikpe3ZhciB3PWZkKHApOzA8dy5sZW5ndGgmJihwLnB1c2guYXBwbHkocCx3KSxrPSEwKX1mJiZnJiYhYSYmIWt8fENiKGIscC5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIGpkPWZ1bmN0aW9uKGEsYil7aWYoYT1hLmgoKSl7cShiLCJUaGUgZWxlbWVudCBwYXNzZWQgYXMgYSBmaXJzdCBwYXJhbWV0ZXIgY2Fubm90IGJlIG51bGwuIik7dmFyIGM9Yi5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDthIT1jJiZ2YihiLGEpfX0sa2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYztpZihhLnYmMzImJihjPWEuZigpKSl7aWYoIWImJmEubyYzMil7dHJ5e2MuYmx1cigpfWNhdGNoKGQpe31hLm8mMzImJmEuRmEobnVsbCl9KHNiKGMpJiZ0YihjKSkhPWImJnJiKGMsYil9fSxsZD1mdW5jdGlvbihhLGIsYyl7Y2R8fChjZD17MToiZGlzYWJsZWQiLDg6InNlbGVjdGVkIiwxNjoiY2hlY2tlZCIsNjQ6ImV4cGFuZGVkIn0pO3EoYSwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO2I9Y2RbYl07dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDtkJiYoZD1kZFtkXXx8YixiPSJjaGVja2VkIj09Ynx8InNlbGVjdGVkIj09CmI/ZDpiKTtiJiZ4YihhLGIsYyl9O00ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250cm9sIn07CnZhciBlZD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuYSgpLGQ9W2NdLGU9YS5hKCk7ZSE9YyYmZC5wdXNoKGUpO2M9Yi5vO2ZvcihlPVtdO2M7KXt2YXIgZj1jJi1jO2UucHVzaChtZChhLGYpKTtjJj1+Zn1kLnB1c2guYXBwbHkoZCxlKTsoYT1iLndhKSYmZC5wdXNoLmFwcGx5KGQsYSk7diYmIUEoIjciKSYmZC5wdXNoLmFwcGx5KGQsZmQoZCkpO3JldHVybiBkfSxmZD1mdW5jdGlvbihhLGIpe3ZhciBjPVtdO2ImJihhPUlhKGEsW2JdKSk7cihbXSxmdW5jdGlvbihkKXshRmEoZCxsYShHYSxhKSl8fGImJiFHYShkLGIpfHxjLnB1c2goZC5qb2luKCJfIikpfSk7cmV0dXJuIGN9LG1kPWZ1bmN0aW9uKGEsYil7YS5ifHxuZChhKTtyZXR1cm4gYS5iW2JdfSxpZD1mdW5jdGlvbihhLGIpe2Euanx8KGEuYnx8bmQoYSksYS5qPXNhKGEuYikpO2E9cGFyc2VJbnQoYS5qW2JdLDEwKTtyZXR1cm4gaXNOYU4oYSk/MDphfSxuZD1mdW5jdGlvbihhKXt2YXIgYj1hLmEoKSxjPSF0KGIucmVwbGFjZSgvXHhhMHxccy9nLAoiICIpLCIgIik7cShjLCJDb250cm9sUmVuZGVyZXIgaGFzIGFuIGludmFsaWQgY3NzIGNsYXNzOiAnIitiKyInIik7YS5iPXsxOmIrIi1kaXNhYmxlZCIsMjpiKyItaG92ZXIiLDQ6YisiLWFjdGl2ZSIsODpiKyItc2VsZWN0ZWQiLDE2OmIrIi1jaGVja2VkIiwzMjpiKyItZm9jdXNlZCIsNjQ6YisiLW9wZW4ifX07dmFyIE49ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO2lmKCFiKXtiPXRoaXMuY29uc3RydWN0b3I7Zm9yKHZhciBkO2I7KXtkPWJbamFdfHwoYltqYV09KytrYSk7aWYoZD1XY1tkXSlicmVhaztiPWIuaT9iLmkuY29uc3RydWN0b3I6bnVsbH1iPWQ/aWEoZC5SKT9kLlIoKTpuZXcgZDpudWxsfXRoaXMuQj1iO3RoaXMuYmE9dm9pZCAwIT09YT9hOm51bGx9O24oTixLKTtoPU4ucHJvdG90eXBlO2guYmE9bnVsbDtoLm89MDtoLnY9Mzk7aC5LPTA7aC5JYT0hMDtoLndhPW51bGw7aC55YT0hMDtoLmlhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CLmModGhpcyk7dGhpcy5hPWE7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmeGIoYSwiaGlkZGVuIiwhMCkpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hPXRoaXMuQi5nKHRoaXMsYSk7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5JYT0ibm9uZSIhPWEuc3R5bGUuZGlzcGxheX07CmguRD1mdW5jdGlvbigpe04uaS5ELmNhbGwodGhpcyk7dmFyIGE9TmModGhpcyk7cSh0aGlzKTtxKGEpO3RoaXMuaXNWaXNpYmxlKCl8fHhiKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fGxkKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy52JjgmJmxkKGEsOCwhISh0aGlzLm8mOCkpO3RoaXMudiYxNiYmbGQoYSwxNiwhISh0aGlzLm8mMTYpKTt0aGlzLnYmNjQmJmxkKGEsNjQsISEodGhpcy5vJjY0KSk7YT10aGlzLkI7U2ModGhpcykmJmdkKHRoaXMuZigpLGEuYSgpKyItcnRsIiwhMCk7dGhpcy5pc0VuYWJsZWQoKSYma2QodGhpcyx0aGlzLmlzVmlzaWJsZSgpKTtpZih0aGlzLnYmLTImJih0aGlzLnlhJiZvZCh0aGlzLCEwKSx0aGlzLnYmMzImJihhPXRoaXMuZigpKSkpe3ZhciBiPXRoaXMuV3x8KHRoaXMuVz1uZXcgSik7emMoYixhKTtIKEgoSChPYyh0aGlzKSxiLCJrZXkiLHRoaXMuZmEpLGEsImZvY3VzIix0aGlzLk5hKSxhLCJibHVyIiwKdGhpcy5GYSl9fTt2YXIgb2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYz1PYyhhKSxkPWEuZigpO2I/KEgoSChIKEgoYyxkLEYuTCxhLmthKSxkLFtGLk0sRi5hYV0sYS5sYSksZCwibW91c2VvdmVyIixhLkFhKSxkLCJtb3VzZW91dCIsYS56YSksYS5lYSE9Y2EmJkgoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fEgoYyxkLCJkYmxjbGljayIsYS5KYSksYS5nYXx8KGEuZ2E9bmV3IHBkKGEpLHpiKGEsbGEoQWIsYS5nYSkpKSkpOihxYyhxYyhxYyhxYyhjLGQsRi5MLGEua2EpLGQsW0YuTSxGLmFhXSxhLmxhKSxkLCJtb3VzZW92ZXIiLGEuQWEpLGQsIm1vdXNlb3V0IixhLnphKSxhLmVhIT1jYSYmcWMoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fHFjKGMsZCwiZGJsY2xpY2siLGEuSmEpLEFiKGEuZ2EpLGEuZ2E9bnVsbCkpfTsKTi5wcm90b3R5cGUuUD1mdW5jdGlvbigpe04uaS5QLmNhbGwodGhpcyk7dGhpcy5XJiZGYyh0aGlzLlcpO3RoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJmtkKHRoaXMsITEpfTtOLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7Ti5pLnUuY2FsbCh0aGlzKTt0aGlzLlcmJih0aGlzLlcuTigpLGRlbGV0ZSB0aGlzLlcpO2RlbGV0ZSB0aGlzLkI7dGhpcy5nYT10aGlzLndhPXRoaXMuYmE9bnVsbH07dmFyIGhkPWZ1bmN0aW9uKGEsYil7YS5iYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm8mMSl9OwpOLnByb3RvdHlwZS5aPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYjtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0VuYWJsZWQmJiFiLmlzRW5hYmxlZCgpfHwhTyh0aGlzLDEsIWEpfHwoYXx8KHFkKHRoaXMsITEpLFAodGhpcywhMSkpLHRoaXMuaXNWaXNpYmxlKCkmJmtkKHRoaXMsYSksUSh0aGlzLDEsIWEsITApKX07CnZhciBQPWZ1bmN0aW9uKGEsYil7TyhhLDIsYikmJlEoYSwyLGIpfSxxZD1mdW5jdGlvbihhLGIpe08oYSw0LGIpJiZRKGEsNCxiKX0scmQ9ZnVuY3Rpb24oYSxiKXtPKGEsOCxiKSYmUShhLDgsYil9LHNkPWZ1bmN0aW9uKGEsYil7TyhhLDY0LGIpJiZRKGEsNjQsYil9LFE9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIWQmJjE9PWIpYS5aKCFjKTtlbHNlIGlmKGEudiZiJiZjIT0hIShhLm8mYikpe3ZhciBlPWEuQjtpZihkPWEuZigpKShlPW1kKGUsYikpJiZnZChhLGUsYyksbGQoZCxiLGMpO2Eubz1jP2Eub3xiOmEubyZ+Yn19LHRkPWZ1bmN0aW9uKGEsYixjKXtpZihhLm0mJmEubyZiJiYhYyl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTshYyYmYS5vJmImJlEoYSxiLCExKTthLnY9Yz9hLnZ8YjphLnYmfmJ9LFI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hISgyNTUmYikmJiEhKGEudiZiKX0sTz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuISEoYS52JmIpJiYhIShhLm8mCmIpIT1jJiYoIShhLksmYil8fHVjKGEsS2MoYixjKSkpJiYhYS5VfTtoPU4ucHJvdG90eXBlO2guQWE9ZnVuY3Rpb24oYSl7KCFhLnJlbGF0ZWRUYXJnZXR8fCFwYih0aGlzLmYoKSxhLnJlbGF0ZWRUYXJnZXQpKSYmdWModGhpcywiZW50ZXIiKSYmdGhpcy5pc0VuYWJsZWQoKSYmUih0aGlzLDIpJiZQKHRoaXMsITApfTtoLnphPWZ1bmN0aW9uKGEpe2EucmVsYXRlZFRhcmdldCYmcGIodGhpcy5mKCksYS5yZWxhdGVkVGFyZ2V0KXx8IXVjKHRoaXMsImxlYXZlIil8fChSKHRoaXMsNCkmJnFkKHRoaXMsITEpLFIodGhpcywyKSYmUCh0aGlzLCExKSl9O2guZWE9Y2E7Cmgua2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSxPYihhKSYmISh5JiZ6JiZhLmN0cmxLZXkpKSl7Uih0aGlzLDQpJiZxZCh0aGlzLCEwKTt2YXIgYjtpZihiPXRoaXMuQil7dmFyIGM7Yj10aGlzLnYmMzImJihjPXRoaXMuZigpKT9zYihjKSYmdGIoYyk6ITF9YiYmdGhpcy5mKCkuZm9jdXMoKX0hT2IoYSl8fHkmJnomJmEuY3RybEtleXx8YS5nKCl9O2gubGE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSx0aGlzLm8mNCYmdWQodGhpcyxhKSYmUih0aGlzLDQpJiZxZCh0aGlzLCExKSl9O2guSmE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmdWQodGhpcyxhKX07CnZhciB1ZD1mdW5jdGlvbihhLGIpe2lmKFIoYSwxNikpe3ZhciBjPSEoYS5vJjE2KTtPKGEsMTYsYykmJlEoYSwxNixjKX1SKGEsOCkmJnJkKGEsITApO1IoYSw2NCkmJnNkKGEsIShhLm8mNjQpKTtjPW5ldyBFKCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuQT1iLkEpO3JldHVybiB1YyhhLGMpfTtOLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe1IodGhpcywzMikmJk8odGhpcywzMiwhMCkmJlEodGhpcywzMiwhMCl9O04ucHJvdG90eXBlLkZhPWZ1bmN0aW9uKCl7Uih0aGlzLDQpJiZxZCh0aGlzLCExKTtSKHRoaXMsMzIpJiZPKHRoaXMsMzIsITEpJiZRKHRoaXMsMzIsITEpfTsKTi5wcm90b3R5cGUuZmE9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJjEzPT1hLmMmJnVkKHRoaXMsYSk/KGEuZygpLGEuaigpLCEwKTohMX07aWYoIWlhKE4pKXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBjbGFzcyAiK04pO2lmKCFpYShNKSl0aHJvdyBFcnJvcigiSW52YWxpZCByZW5kZXJlciBjbGFzcyAiK00pO3ZhciB2ZD1OW2phXXx8KE5bamFdPSsra2EpO1djW3ZkXT1NO1ZjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIHBkPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9ITE7dGhpcy5jPW5ldyBvYyh0aGlzKTt6Yih0aGlzLGxhKEFiLHRoaXMuYykpO2E9TmModGhpcy5iKTtIKEgoSCh0aGlzLmMsYSxGLkwsdGhpcy5oKSxhLEYuTSx0aGlzLmopLGEsImNsaWNrIix0aGlzLmcpfTtuKHBkLEMpO3ZhciB3ZD0hdnx8OTw9TnVtYmVyKGliKTsKcGQucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXt0aGlzLmE9ITF9O3BkLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7dGhpcy5hPSEwfTt2YXIgeGQ9ZnVuY3Rpb24oYSxiKXtpZighd2QpcmV0dXJuIGEuYnV0dG9uPTAsYS50eXBlPWIsYTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudHMiKTtjLmluaXRNb3VzZUV2ZW50KGIsYS5idWJibGVzLGEuY2FuY2VsYWJsZSxhLnZpZXd8fG51bGwsYS5kZXRhaWwsYS5zY3JlZW5YLGEuc2NyZWVuWSxhLmNsaWVudFgsYS5jbGllbnRZLGEuY3RybEtleSxhLmFsdEtleSxhLnNoaWZ0S2V5LGEubWV0YUtleSwwLGEucmVsYXRlZFRhcmdldHx8bnVsbCk7cmV0dXJuIGN9OwpwZC5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXtpZih0aGlzLmEpdGhpcy5hPSExO2Vsc2V7dmFyIGI9YS5iLGM9Yi5idXR0b24sZD1iLnR5cGUsZT14ZChiLCJtb3VzZWRvd24iKTt0aGlzLmIua2EobmV3IEcoZSxhLmEpKTtlPXhkKGIsIm1vdXNldXAiKTt0aGlzLmIubGEobmV3IEcoZSxhLmEpKTt3ZHx8KGIuYnV0dG9uPWMsYi50eXBlPWQpfX07cGQucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt0aGlzLmI9bnVsbDtwZC5pLnUuY2FsbCh0aGlzKX07dmFyIFM9ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO3RoaXMuZGE9Ynx8WGMuUigpO3RoaXMuSD1hfHwidmVydGljYWwifTtuKFMsSyk7aD1TLnByb3RvdHlwZTtoLkRhPW51bGw7aC5jYT1udWxsO2guZGE9bnVsbDtoLkg9bnVsbDtoLlQ9ITA7aC5PPSEwO2gubD0tMTtoLnM9bnVsbDtoLlY9ITE7aC5JPW51bGw7dmFyIHlkPWZ1bmN0aW9uKGEpe3JldHVybiBhLkRhfHxhLmYoKX07aD1TLnByb3RvdHlwZTtoLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPXRoaXMuai5iKCJESVYiLHRoaXMuZGEuYyh0aGlzKS5qb2luKCIgIikpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKGEpe3JldHVybiJESVYiPT1hLnRhZ05hbWV9O2gudmE9ZnVuY3Rpb24oYSl7dGhpcy5hPSRjKHRoaXMuZGEsdGhpcyxhKTsibm9uZSI9PWEuc3R5bGUuZGlzcGxheSYmKHRoaXMuVD0hMSl9OwpoLkQ9ZnVuY3Rpb24oKXtTLmkuRC5jYWxsKHRoaXMpO1FjKHRoaXMsZnVuY3Rpb24oYil7Yi5tJiZ6ZCh0aGlzLGIpfSx0aGlzKTt2YXIgYT10aGlzLmYoKTtiZCh0aGlzLmRhLHRoaXMpO0FkKHRoaXMsdGhpcy5UKTtIKEgoSChIKEgoSChIKEgoT2ModGhpcyksdGhpcywiZW50ZXIiLHRoaXMuV2EpLHRoaXMsImhpZ2hsaWdodCIsdGhpcy5YYSksdGhpcywidW5oaWdobGlnaHQiLHRoaXMuY2IpLHRoaXMsIm9wZW4iLHRoaXMuWWEpLHRoaXMsImNsb3NlIix0aGlzLlVhKSxhLEYuTCx0aGlzLlNhKSxxYihhKSxbRi5NLEYuYWFdLHRoaXMuVmEpLGEsW0YuTCxGLk0sRi5hYSwibW91c2VvdmVyIiwibW91c2VvdXQiLCJjb250ZXh0bWVudSJdLHRoaXMuVGEpO0JkKHRoaXMpfTt2YXIgQmQ9ZnVuY3Rpb24oYSl7dmFyIGI9T2MoYSksYz15ZChhKTtIKEgoSChiLGMsImZvY3VzIixhLkhhKSxjLCJibHVyIixhLlFhKSxhLmNhfHwoYS5jYT1uZXcgSih5ZChhKSkpLCJrZXkiLGEuUmEpfTtoPVMucHJvdG90eXBlOwpoLlA9ZnVuY3Rpb24oKXtDZCh0aGlzLC0xKTt0aGlzLnMmJnNkKHRoaXMucywhMSk7dGhpcy5WPSExO1MuaS5QLmNhbGwodGhpcyl9O2gudT1mdW5jdGlvbigpe1MuaS51LmNhbGwodGhpcyk7dGhpcy5jYSYmKHRoaXMuY2EuTigpLHRoaXMuY2E9bnVsbCk7dGhpcy5kYT10aGlzLnM9dGhpcy5JPXRoaXMuRGE9bnVsbH07aC5XYT1mdW5jdGlvbigpe3JldHVybiEwfTsKaC5YYT1mdW5jdGlvbihhKXt2YXIgYj1UYyh0aGlzLGEudGFyZ2V0KTtpZigtMTxiJiZiIT10aGlzLmwpe3ZhciBjPUwodGhpcyx0aGlzLmwpO2MmJlAoYywhMSk7dGhpcy5sPWI7Yz1MKHRoaXMsdGhpcy5sKTt0aGlzLlYmJnFkKGMsITApO3RoaXMucyYmYyE9dGhpcy5zJiYoYy52JjY0P3NkKGMsITApOnNkKHRoaXMucywhMSkpfWI9dGhpcy5mKCk7cShiLCJUaGUgRE9NIGVsZW1lbnQgZm9yIHRoZSBjb250YWluZXIgY2Fubm90IGJlIG51bGwuIik7bnVsbCE9YS50YXJnZXQuZigpJiZ4YihiLCJhY3RpdmVkZXNjZW5kYW50IixhLnRhcmdldC5mKCkuaWQpfTtoLmNiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT1MKHRoaXMsdGhpcy5sKSYmKHRoaXMubD0tMSk7YT10aGlzLmYoKTtxKGEsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnJlbW92ZUF0dHJpYnV0ZSh3YigiYWN0aXZlZGVzY2VuZGFudCIpKX07CmguWWE9ZnVuY3Rpb24oYSl7KGE9YS50YXJnZXQpJiZhIT10aGlzLnMmJmEuYj09dGhpcyYmKHRoaXMucyYmc2QodGhpcy5zLCExKSx0aGlzLnM9YSl9O2guVWE9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMucyYmKHRoaXMucz1udWxsKTt2YXIgYj10aGlzLmYoKSxjPWEudGFyZ2V0LmYoKTtiJiZhLnRhcmdldC5vJjImJmMmJihhPSIiLGMmJihhPWMuaWQscShhLCJUaGUgYWN0aXZlIGVsZW1lbnQgc2hvdWxkIGhhdmUgYW4gaWQuIikpLHhiKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEpKX07aC5TYT1mdW5jdGlvbihhKXt0aGlzLk8mJih0aGlzLlY9ITApO3ZhciBiPXlkKHRoaXMpO2ImJnNiKGIpJiZ0YihiKT9iLmZvY3VzKCk6YS5nKCl9O2guVmE9ZnVuY3Rpb24oKXt0aGlzLlY9ITF9OwpoLlRhPWZ1bmN0aW9uKGEpe2E6e3ZhciBiPWEudGFyZ2V0O2lmKHRoaXMuSSlmb3IodmFyIGM9dGhpcy5mKCk7YiYmYiE9PWM7KXt2YXIgZD1iLmlkO2lmKGQgaW4gdGhpcy5JKXtiPXRoaXMuSVtkXTticmVhayBhfWI9Yi5wYXJlbnROb2RlfWI9bnVsbH1pZihiKXN3aXRjaChhLnR5cGUpe2Nhc2UgRi5MOmIua2EoYSk7YnJlYWs7Y2FzZSBGLk06Y2FzZSBGLmFhOmIubGEoYSk7YnJlYWs7Y2FzZSAibW91c2VvdmVyIjpiLkFhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3V0IjpiLnphKGEpO2JyZWFrO2Nhc2UgImNvbnRleHRtZW51IjpiLmVhKGEpfX07aC5IYT1mdW5jdGlvbigpe307aC5RYT1mdW5jdGlvbigpe0NkKHRoaXMsLTEpO3RoaXMuVj0hMTt0aGlzLnMmJnNkKHRoaXMucywhMSl9OwpoLlJhPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmlzRW5hYmxlZCgpJiZ0aGlzLmlzVmlzaWJsZSgpJiYoMCE9UmModGhpcyl8fHRoaXMuRGEpJiZEZCh0aGlzLGEpPyhhLmcoKSxhLmooKSwhMCk6ITF9Owp2YXIgRGQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1MKGEsYS5sKTtpZihjJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5mYSYmYy5mYShiKXx8YS5zJiZhLnMhPWMmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLnMuZmEmJmEucy5mYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuYyl7Y2FzZSAyNzp5ZChhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpFZChhKTticmVhaztjYXNlIDM1OkZkKGEpO2JyZWFrO2Nhc2UgMzg6aWYoInZlcnRpY2FsIj09YS5IKUdkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9IZChhKTpHZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoInZlcnRpY2FsIj09YS5IKUhkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9HZChhKTpIZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSx6ZD1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZigpO2M9Yy5pZHx8KGMuaWQ9TGMoYikpO2EuSXx8KGEuST17fSk7YS5JW2NdPWJ9O1MucHJvdG90eXBlLnNhPWZ1bmN0aW9uKGEsYil7Q2EoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtTLmkuc2EuY2FsbCh0aGlzLGEsYil9O1MucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEsYixjKXtDYShhLE4pO2EuS3w9MjthLkt8PTY0O3RkKGEsMzIsITEpO2EubSYmMCE9YS55YSYmb2QoYSwhMSk7YS55YT0hMTt2YXIgZD1hLmI9PXRoaXM/VGModGhpcyxhKTotMTtTLmkudGEuY2FsbCh0aGlzLGEsYixjKTthLm0mJnRoaXMubSYmemQodGhpcyxhKTthPWQ7LTE9PWEmJihhPVJjKHRoaXMpKTthPT10aGlzLmw/dGhpcy5sPU1hdGgubWluKFJjKHRoaXMpLTEsYik6YT50aGlzLmwmJmI8PXRoaXMubD90aGlzLmwrKzphPHRoaXMubCYmYj50aGlzLmwmJnRoaXMubC0tfTsKdmFyIGFkPWZ1bmN0aW9uKGEsYil7aWYoYS5mKCkpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5IPWJ9O1MucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O3ZhciBBZD1mdW5jdGlvbihhLGIpe2EuVD1iO3ZhciBjPWEuZigpO2MmJihjLnN0eWxlLmRpc3BsYXk9Yj8iIjoibm9uZSIsWWMoeWQoYSksYS5PJiZhLlQpKX07Uy5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT307Uy5wcm90b3R5cGUuWj1mdW5jdGlvbihhKXt0aGlzLk8hPWEmJnVjKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5PPSEwLFFjKHRoaXMsZnVuY3Rpb24oYil7Yi5MYT9kZWxldGUgYi5MYTpiLlooITApfSkpOihRYyh0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5aKCExKTpiLkxhPSEwfSksdGhpcy5WPXRoaXMuTz0hMSksWWMoeWQodGhpcyksYSYmdGhpcy5UKSl9Owp2YXIgQ2Q9ZnVuY3Rpb24oYSxiKXsoYj1MKGEsYikpP1AoYiwhMCk6LTE8YS5sJiZQKEwoYSxhLmwpLCExKX0sRWQ9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LFJjKGEpLTEpfSxGZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiAwPmI/Yy0xOmJ9LDApfSxIZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7cmV0dXJuKGIrMSklY30sYS5sKX0sR2Q9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe2ItLTtyZXR1cm4gMD5iP2MtMTpifSxhLmwpfSxJZD1mdW5jdGlvbihhLGIsYyl7Yz0wPmM/VGMoYSxhLnMpOmM7dmFyIGQ9UmMoYSk7Yz1iLmNhbGwoYSxjLGQpO2Zvcih2YXIgZT0wO2U8PWQ7KXt2YXIgZj1MKGEsYyksZztpZihnPWYpZz1mLmlzVmlzaWJsZSgpJiZmLmlzRW5hYmxlZCgpJiYhIShmLnYmMik7aWYoZyl7YS5FYShjKTticmVha31lKys7Yz1iLmNhbGwoYSxjLGQpfX07ClMucHJvdG90eXBlLkVhPWZ1bmN0aW9uKGEpe0NkKHRoaXMsYSl9O3ZhciBUPWZ1bmN0aW9uKCl7fTtuKFQsTSk7ZGEoVCk7VC5wcm90b3R5cGUuYT1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYiJ9O1QucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXtyZXR1cm4idGFiIn07VC5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYj1ULmkuYy5jYWxsKHRoaXMsYSk7KGE9YS5QYSkmJmImJihiLnRpdGxlPWF8fCIiKTtyZXR1cm4gYn07VC5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIpe2I9VC5pLmcuY2FsbCh0aGlzLGEsYik7dmFyIGM9Yi50aXRsZXx8IiI7YyYmKGEuUGE9Yyk7YS5vJjgmJihjPWEuYikmJmlhKGMuRykmJihRKGEsOCwhMSksYy5HKGEpKTtyZXR1cm4gYn07dmFyIEpkPWZ1bmN0aW9uKGEsYixjKXtOLmNhbGwodGhpcyxhLGJ8fFQuUigpLGMpO3RkKHRoaXMsOCwhMCk7dGhpcy5LfD05fTtuKEpkLE4pO1ZjKCJnb29nLXRhYiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEpkKG51bGwpfSk7dmFyIFU9ZnVuY3Rpb24oKXt0aGlzLmg9InRhYmxpc3QifTtuKFUsWGMpO2RhKFUpO1UucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWItYmFyIn07VS5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIsYyl7dGhpcy5qfHwodGhpcy5hfHxLZCh0aGlzKSx0aGlzLmo9c2EodGhpcy5hKSk7dmFyIGQ9dGhpcy5qW2JdO2Q/KGFkKGEsTGQoZCkpLGEuQj1kKTpVLmkuZy5jYWxsKHRoaXMsYSxiLGMpfTtVLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPVUuaS5jLmNhbGwodGhpcyxhKTt0aGlzLmF8fEtkKHRoaXMpO2IucHVzaCh0aGlzLmFbYS5CXSk7cmV0dXJuIGJ9O3ZhciBLZD1mdW5jdGlvbihhKXt2YXIgYj1hLmIoKTthLmE9e3RvcDpiKyItdG9wIixib3R0b206YisiLWJvdHRvbSIsc3RhcnQ6YisiLXN0YXJ0IixlbmQ6YisiLWVuZCJ9fTt2YXIgVj1mdW5jdGlvbihhLGIsYyl7YT1hfHwidG9wIjthZCh0aGlzLExkKGEpKTt0aGlzLkI9YTtTLmNhbGwodGhpcyx0aGlzLkgsYnx8VS5SKCksYyk7TWQodGhpcyl9O24oVixTKTtoPVYucHJvdG90eXBlO2guQz1udWxsO2guRD1mdW5jdGlvbigpe1YuaS5ELmNhbGwodGhpcyk7TWQodGhpcyl9O2gudT1mdW5jdGlvbigpe1YuaS51LmNhbGwodGhpcyk7dGhpcy5DPW51bGx9O2guRWE9ZnVuY3Rpb24oYSl7Vi5pLkVhLmNhbGwodGhpcyxhKTt0aGlzLkcoTCh0aGlzLGEpKX07aC5HPWZ1bmN0aW9uKGEpe2E/cmQoYSwhMCk6dGhpcy5DJiZyZCh0aGlzLkMsITEpfTsKdmFyIE5kPWZ1bmN0aW9uKGEsYil7aWYoYiYmYj09YS5DKXtmb3IodmFyIGM9VGMoYSxiKSxkPWMtMTtiPUwoYSxkKTtkLS0pe3ZhciBlPWI7aWYoZS5pc1Zpc2libGUoKSYmZS5pc0VuYWJsZWQoKSl7YS5HKGIpO3JldHVybn19Zm9yKGMrPTE7Yj1MKGEsYyk7YysrKWlmKGQ9YixkLmlzVmlzaWJsZSgpJiZkLmlzRW5hYmxlZCgpKXthLkcoYik7cmV0dXJufWEuRyhudWxsKX19O2g9Vi5wcm90b3R5cGU7aC5hYj1mdW5jdGlvbihhKXt0aGlzLkMmJnRoaXMuQyE9YS50YXJnZXQmJnJkKHRoaXMuQywhMSk7dGhpcy5DPWEudGFyZ2V0fTtoLmJiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT10aGlzLkMmJih0aGlzLkM9bnVsbCl9O2guWmE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guJGE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guSGE9ZnVuY3Rpb24oKXtMKHRoaXMsdGhpcy5sKXx8Q2QodGhpcyxUYyh0aGlzLHRoaXMuQ3x8TCh0aGlzLDApKSl9Owp2YXIgTWQ9ZnVuY3Rpb24oYSl7SChIKEgoSChPYyhhKSxhLCJzZWxlY3QiLGEuYWIpLGEsInVuc2VsZWN0IixhLmJiKSxhLCJkaXNhYmxlIixhLlphKSxhLCJoaWRlIixhLiRhKX0sTGQ9ZnVuY3Rpb24oYSl7cmV0dXJuInN0YXJ0Ij09YXx8ImVuZCI9PWE/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O1ZjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBWfSk7ZnVuY3Rpb24gT2QoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIFBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgZz1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIrZyk7Zm9yKHZhciBrPVtdLHA9YmEoYyksdz1wLm5leHQoKTshdy5kb25lO3c9cC5uZXh0KCkpe3c9dy52YWx1ZTt2YXIgQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKQi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO0IudGV4dENvbnRlbnQ9dztmLmFwcGVuZENoaWxkKEIpO2sucHVzaChCKX0iYm90dG9tIiE9ZyYmZS5hcHBlbmRDaGlsZChmKTtwPW51bGw7aWYoInRvcCI9PWd8fCJib3R0b20iPT1nKXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTsidG9wIj09ZyYmcCYmZS5hcHBlbmRDaGlsZChwKTtCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0IuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciByYT1bXTtjPWJhKGMpO2Zvcih3PWMubmV4dCgpOyF3LmRvbmU7dz1jLm5leHQoKSl3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHcuaWQ9ZS5pZCsiX2NvbnRlbnRfIityYS5sZW5ndGgsdy5zdHlsZS5kaXNwbGF5PSJub25lIixCLmFwcGVuZENoaWxkKHcpLHJhLnB1c2godyk7ZS5hcHBlbmRDaGlsZChCKTsiYm90dG9tIj09ZyYmKHAmJgplLmFwcGVuZENoaWxkKHApLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBYPW5ldyBWKGcpO1BjKFgsZik7dmFyIFk9LTE7ZGMoWCwic2VsZWN0IixmdW5jdGlvbihaKXtaPWsuaW5kZXhPZihaLnRhcmdldC5mKCkpO1ohPVkmJigwPD1ZJiZZPHJhLmxlbmd0aCYmKHJhW1ldLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFk9LTEpLDA8PVomJlo8cmEubGVuZ3RoJiYoWT1aLHJhW1ldLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksWC5HKEwoWCxZKSkpfSk7WC5HKEwoWCxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFope1guRyhMKFgsWikpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChPZChhKSl9LFFkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sVz1sOwpRZFswXWluIFd8fCJ1bmRlZmluZWQiPT10eXBlb2YgVy5leGVjU2NyaXB0fHxXLmV4ZWNTY3JpcHQoInZhciAiK1FkWzBdKTtmb3IodmFyIFJkO1FkLmxlbmd0aCYmKFJkPVFkLnNoaWZ0KCkpOylRZC5sZW5ndGh8fHZvaWQgMD09PVBkP1dbUmRdJiZXW1JkXSE9PU9iamVjdC5wcm90b3R5cGVbUmRdP1c9V1tSZF06Vz1XW1JkXT17fTpXW1JkXT1QZDt9KS5jYWxsKHRoaXMpOwovLyBjbGFuZy1mb3JtYXQgb24K", + "headers": [ + [ + "content-type", + "application/javascript" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + } + } + }, + "executionInfo": { + "elapsed": 67526, + "status": "ok", + "timestamp": 1600709675598, + "user": { + "displayName": "Evgeny Skvortsov", + "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhiQjODaOVLfYnUuWS9rB3LRntzJDM0hqElzsUkdQ=s64", + "userId": "11510585406840398626" + }, + "user_tz": 420 + }, + "id": "FWQ2VRPICTjC", + "outputId": "068bc32f-ca6b-4cc8-bc39-0fd9a69698a6" + }, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b5245b70-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id54\", \"tabNames\": [\"T\", \"DoubleT\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_d688783f78" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b524a2ec-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id54\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_293c257ca1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b525ebe8-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b06710dcaa" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_2", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b5262874-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id54_content_2\");\n", + "//# sourceURL=js_0ed834b1b1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_2", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b526854e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b5262874-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_d3e4128f50" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_2", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b526d8c8-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id54\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_120c9de96b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_2", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running T\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"b528f0c2-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b525ebe8-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_a4348600b0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_2", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b52a7190-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_aa413774b8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_0", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b52abc7c-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id54_content_0\");\n", + "//# sourceURL=js_17bc7b89ab" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_0", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b52b09ac-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b52abc7c-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_8c52ac857e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_0", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b52b5100-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id54\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_697f203b63" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_0", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_0", + "outputarea_id54", + "outputarea_id55", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_0", + "outputarea_id54", + "outputarea_id55", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_0", + "outputarea_id54", + "outputarea_id55", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b52cdd22-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id55\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_e82f072d96" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_0", + "outputarea_id54", + "outputarea_id55", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b52d2912-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id55\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_271883a42a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_0", + "outputarea_id54", + "outputarea_id55", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b52e5472-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_dbc40994be" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_0", + "id55_content_0", + "outputarea_id54", + "outputarea_id55", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b52e9392-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id55_content_0\");\n", + "//# sourceURL=js_ab542fb0c4" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_0", + "id55_content_0", + "outputarea_id54", + "outputarea_id55", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b52ee612-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b52e9392-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_cb794e0c13" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_0", + "id55_content_0", + "outputarea_id54", + "outputarea_id55", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b52f251e-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id55\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_da0f0db3d7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_0", + "id55_content_0", + "outputarea_id54", + "outputarea_id55", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mT_sql\u001b[0m variable.\n", + "SELECT * FROM (\n", + " \n", + " SELECT\n", + " 1 AS col0,\n", + " \"apple\" AS col1\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 2 AS col0,\n", + " \"banana\" AS col1\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 3 AS col0,\n", + " \"orange\" AS col1\n", + " \n", + ") ;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"b5304ade-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b52e5472-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_95d8e3bf40" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_0", + "id55_content_0", + "outputarea_id54", + "outputarea_id55", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b5319f24-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b52a7190-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_b1c4c8d900" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_0", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b53338fc-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_95f11aea5c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_2", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b53373da-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id54_content_2\");\n", + "//# sourceURL=js_49d30484ad" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_2", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b533b818-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b53373da-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_4a2bf05897" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_2", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b5340700-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id54\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_91545dca52" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_2", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b6988af8-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b53338fc-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_d6a9d94d85" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_2", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b69b28ee-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_d94a94d6d6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_0", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b69b7db2-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id54_content_0\");\n", + "//# sourceURL=js_ba497872e8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_0", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b69bcd6c-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b69b7db2-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_5920b6b200" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_0", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b69c133a-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id54\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_4d0ec37730" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_0", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b69d2dce-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_f7ba21acc7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_0", + "id55_content_1", + "outputarea_id54", + "outputarea_id55", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b69d7ae0-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id55_content_1\");\n", + "//# sourceURL=js_15f3b7bb58" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_0", + "id55_content_1", + "outputarea_id54", + "outputarea_id55", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b69dc0ae-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b69d7ae0-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_3f2a4bde37" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_0", + "id55_content_1", + "outputarea_id54", + "outputarea_id55", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b69e060e-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id55\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_d1fc3124d9" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_0", + "id55_content_1", + "outputarea_id54", + "outputarea_id55", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mT\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1
01apple
12banana
23orange
\n", + "
" + ], + "text/plain": [ + " col0 col1\n", + "0 1 apple\n", + "1 2 banana\n", + "2 3 orange" + ] + }, + "metadata": { + "tags": [ + "id54_content_0", + "id55_content_1", + "outputarea_id54", + "outputarea_id55", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b6a18a68-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b69d2dce-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_3bcd92f355" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_0", + "id55_content_1", + "outputarea_id54", + "outputarea_id55", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b6a31018-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b69b28ee-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_86a2a2d8c3" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_0", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b6a4ef64-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_9e1e273d7f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_2", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b6a553e6-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id54_content_2\");\n", + "//# sourceURL=js_92cedd9ec7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_2", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b6a5b0de-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b6a553e6-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_49bd088d05" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_2", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b6a5f062-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id54\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_89a1a59ebb" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_2", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running DoubleT\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"b6a8a3a2-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b6a4ef64-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_4694fc52b6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_2", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b6aacde4-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_5ee70cf90b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_1", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b6ab3392-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id54_content_1\");\n", + "//# sourceURL=js_7bb6b49622" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_1", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b6ab88ec-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b6ab3392-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_27b919da3b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_1", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b6abe102-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id54\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_c0b988947e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_1", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_1", + "outputarea_id54", + "outputarea_id56", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_1", + "outputarea_id54", + "outputarea_id56", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_1", + "outputarea_id54", + "outputarea_id56", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b6adf3de-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id56\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_2df4b052db" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_1", + "outputarea_id54", + "outputarea_id56", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b6ae3ea2-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id56\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_a5631020d6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_1", + "outputarea_id54", + "outputarea_id56", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b6af91c6-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_6401642b83" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_1", + "id56_content_0", + "outputarea_id54", + "outputarea_id56", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b6afd492-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id56_content_0\");\n", + "//# sourceURL=js_33e8148bcd" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_1", + "id56_content_0", + "outputarea_id54", + "outputarea_id56", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b6b02802-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b6afd492-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_fe191d2e01" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_1", + "id56_content_0", + "outputarea_id54", + "outputarea_id56", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b6b07852-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id56\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_bbcbdb531a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_1", + "id56_content_0", + "outputarea_id54", + "outputarea_id56", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mDoubleT_sql\u001b[0m variable.\n", + "WITH t_0_T AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 1 AS col0,\n", + " \"apple\" AS col1\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 2 AS col0,\n", + " \"banana\" AS col1\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 3 AS col0,\n", + " \"orange\" AS col1\n", + " \n", + ") )\n", + "SELECT\n", + " ((2) * (T.col0)) AS col0,\n", + " T.col1 AS col1\n", + "FROM\n", + " t_0_T AS T;\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"b6b190f2-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b6af91c6-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_76aa4f5f21" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_1", + "id56_content_0", + "outputarea_id54", + "outputarea_id56", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b6b2f24e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b6aacde4-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_deadbb4af3" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_1", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b6b594ae-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_fe900a1986" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_2", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b6b5ecb0-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id54_content_2\");\n", + "//# sourceURL=js_24f490412d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_2", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b6b63e18-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b6b5ecb0-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_4fe0b3c23d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_2", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b6b68bfc-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id54\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_a60e9a59f8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_2", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b74c2810-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b6b594ae-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_bfa1bb180b" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_2", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b74f0710-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_489d7c0d49" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_1", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b74f59ae-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id54_content_1\");\n", + "//# sourceURL=js_5e270e422e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_1", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b74fbe9e-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b74f59ae-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_3c58504ce7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_1", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b75050e8-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id54\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_7415f82004" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_1", + "outputarea_id54" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b751ce50-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_e67fe088df" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_1", + "id56_content_1", + "outputarea_id54", + "outputarea_id56", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b7520aaa-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id56_content_1\");\n", + "//# sourceURL=js_946373d8a0" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_1", + "id56_content_1", + "outputarea_id54", + "outputarea_id56", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b75242fe-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b7520aaa-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_31f360085e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_1", + "id56_content_1", + "outputarea_id54", + "outputarea_id56", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b75274f4-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id56\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_74d49a75bd" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_1", + "id56_content_1", + "outputarea_id54", + "outputarea_id56", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mDoubleT\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1
02apple
14banana
26orange
\n", + "
" + ], + "text/plain": [ + " col0 col1\n", + "0 2 apple\n", + "1 4 banana\n", + "2 6 orange" + ] + }, + "metadata": { + "tags": [ + "id54_content_1", + "id56_content_1", + "outputarea_id54", + "outputarea_id56", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b7553b62-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b751ce50-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_691197718f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_1", + "id56_content_1", + "outputarea_id54", + "outputarea_id56", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b7561744-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b74f0710-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_0bf3ab80d6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id54_content_1", + "outputarea_id54" + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "%%logica T, DoubleT\n", + "\n", + "T(1, \"apple\");\n", + "T(2, \"banana\");\n", + "T(3, \"orange\");\n", + "\n", + "DoubleT(d, y) :- T(x, y), d == 2 * x;" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5ih459asCl1K" + }, + "source": [ + "Here it appears that we are **assigning** variable $d$ a value of $2 * x$.\n", + "\n", + "But now consider the following usage:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 177, + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH0=", + "headers": [ + [ + "content-type", + "text/css" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgaCxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9ZnVuY3Rpb24oYSl7dmFyIGI9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmYVtTeW1ib2wuaXRlcmF0b3JdO3JldHVybiBiP2IuY2FsbChhKTp7bmV4dDphYShhKX19LGw9dGhpc3x8c2VsZixjYT1mdW5jdGlvbigpe30sZGE9ZnVuY3Rpb24oYSl7YS5CYT12b2lkIDA7YS5SPWZ1bmN0aW9uKCl7cmV0dXJuIGEuQmE/YS5CYTphLkJhPW5ldyBhfX0sZWE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7aWYoIm9iamVjdCI9PWIpaWYoYSl7aWYoYSBpbnN0YW5jZW9mIEFycmF5KXJldHVybiJhcnJheSI7aWYoYSBpbnN0YW5jZW9mIE9iamVjdClyZXR1cm4gYjt2YXIgYz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk7aWYoIltvYmplY3QgV2luZG93XSI9PWMpcmV0dXJuIm9iamVjdCI7CmlmKCJbb2JqZWN0IEFycmF5XSI9PWN8fCJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGgmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5zcGxpY2UmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoInNwbGljZSIpKXJldHVybiJhcnJheSI7aWYoIltvYmplY3QgRnVuY3Rpb25dIj09Y3x8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmNhbGwmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoImNhbGwiKSlyZXR1cm4iZnVuY3Rpb24ifWVsc2UgcmV0dXJuIm51bGwiO2Vsc2UgaWYoImZ1bmN0aW9uIj09YiYmInVuZGVmaW5lZCI9PXR5cGVvZiBhLmNhbGwpcmV0dXJuIm9iamVjdCI7cmV0dXJuIGJ9LGZhPWZ1bmN0aW9uKGEpe3JldHVybiJhcnJheSI9PWVhKGEpfSxoYT1mdW5jdGlvbihhKXt2YXIgYj1lYShhKTtyZXR1cm4iYXJyYXkiPT1ifHwib2JqZWN0Ij09CmImJiJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGh9LGlhPWZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PWVhKGEpfSxtPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBhO3JldHVybiJvYmplY3QiPT1iJiZudWxsIT1hfHwiZnVuY3Rpb24iPT1ifSxqYT0iY2xvc3VyZV91aWRfIisoMUU5Kk1hdGgucmFuZG9tKCk+Pj4wKSxrYT0wLGxhPWZ1bmN0aW9uKGEsYil7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe3ZhciBkPWMuc2xpY2UoKTtkLnB1c2guYXBwbHkoZCxhcmd1bWVudHMpO3JldHVybiBhLmFwcGx5KHRoaXMsZCl9fSxuPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe31jLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLmk9Yi5wcm90b3R5cGU7YS5wcm90b3R5cGU9bmV3IGM7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YX07dmFyIG1hLG5hPXtlYjoiYWN0aXZlZGVzY2VuZGFudCIsamI6ImF0b21pYyIsa2I6ImF1dG9jb21wbGV0ZSIsbWI6ImJ1c3kiLHBiOiJjaGVja2VkIixxYjoiY29saW5kZXgiLHZiOiJjb250cm9scyIseGI6ImRlc2NyaWJlZGJ5IixBYjoiZGlzYWJsZWQiLENiOiJkcm9wZWZmZWN0IixEYjoiZXhwYW5kZWQiLEViOiJmbG93dG8iLEdiOiJncmFiYmVkIixLYjoiaGFzcG9wdXAiLE1iOiJoaWRkZW4iLE9iOiJpbnZhbGlkIixQYjoibGFiZWwiLFFiOiJsYWJlbGxlZGJ5IixSYjoibGV2ZWwiLFdiOiJsaXZlIixrYzoibXVsdGlsaW5lIixsYzoibXVsdGlzZWxlY3RhYmxlIixwYzoib3JpZW50YXRpb24iLHFjOiJvd25zIixyYzoicG9zaW5zZXQiLHRjOiJwcmVzc2VkIix4YzoicmVhZG9ubHkiLHpjOiJyZWxldmFudCIsQWM6InJlcXVpcmVkIixFYzoicm93aW5kZXgiLEhjOiJzZWxlY3RlZCIsSmM6InNldHNpemUiLExjOiJzb3J0IixaYzoidmFsdWVtYXgiLCRjOiJ2YWx1ZW1pbiIsYWQ6InZhbHVlbm93IiwKYmQ6InZhbHVldGV4dCJ9O3ZhciBvYT1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkIGluIGEpYi5jYWxsKGMsYVtkXSxkLGEpfSxwYT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyBpbiBhKWlmKGFbY109PWIpcmV0dXJuITA7cmV0dXJuITF9LHFhPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsIT09YSYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfSxzYT1mdW5jdGlvbihhKXt2YXIgYj17fSxjO2ZvcihjIGluIGEpYlthW2NdXT1jO3JldHVybiBifSx0YT0iY29uc3RydWN0b3IgaGFzT3duUHJvcGVydHkgaXNQcm90b3R5cGVPZiBwcm9wZXJ0eUlzRW51bWVyYWJsZSB0b0xvY2FsZVN0cmluZyB0b1N0cmluZyB2YWx1ZU9mIi5zcGxpdCgiICIpLHVhPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8dGEubGVuZ3RoO2YrKyljPQp0YVtmXSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZCxjKSYmKGFbY109ZFtjXSl9fTt2YXIgdmE9e2ZiOiJhbGVydCIsZ2I6ImFsZXJ0ZGlhbG9nIixoYjoiYXBwbGljYXRpb24iLGliOiJhcnRpY2xlIixsYjoiYmFubmVyIixuYjoiYnV0dG9uIixvYjoiY2hlY2tib3giLHJiOiJjb2x1bW5oZWFkZXIiLHNiOiJjb21ib2JveCIsdGI6ImNvbXBsZW1lbnRhcnkiLHViOiJjb250ZW50aW5mbyIsd2I6ImRlZmluaXRpb24iLHliOiJkaWFsb2ciLHpiOiJkaXJlY3RvcnkiLEJiOiJkb2N1bWVudCIsRmI6ImZvcm0iLEhiOiJncmlkIixJYjoiZ3JpZGNlbGwiLEpiOiJncm91cCIsTGI6ImhlYWRpbmciLE5iOiJpbWciLFNiOiJsaW5rIixUYjoibGlzdCIsVWI6Imxpc3Rib3giLFZiOiJsaXN0aXRlbSIsWGI6ImxvZyIsWWI6Im1haW4iLFpiOiJtYXJxdWVlIiwkYjoibWF0aCIsYWM6Im1lbnUiLGJjOiJtZW51YmFyIixjYzoibWVudWl0ZW0iLGRjOiJtZW51aXRlbWNoZWNrYm94IixlYzoibWVudWl0ZW1yYWRpbyIsbWM6Im5hdmlnYXRpb24iLG5jOiJub3RlIixvYzoib3B0aW9uIiwKc2M6InByZXNlbnRhdGlvbiIsdWM6InByb2dyZXNzYmFyIix2YzoicmFkaW8iLHdjOiJyYWRpb2dyb3VwIix5YzoicmVnaW9uIixCYzoicm93IixDYzoicm93Z3JvdXAiLERjOiJyb3doZWFkZXIiLEZjOiJzY3JvbGxiYXIiLEdjOiJzZWFyY2giLEljOiJzZXBhcmF0b3IiLEtjOiJzbGlkZXIiLE1jOiJzcGluYnV0dG9uIixOYzoic3RhdHVzIixPYzoidGFiIixQYzoidGFibGlzdCIsUWM6InRhYnBhbmVsIixSYzoidGV4dGJveCIsU2M6InRleHRpbmZvIixUYzoidGltZXIiLFVjOiJ0b29sYmFyIixWYzoidG9vbHRpcCIsV2M6InRyZWUiLFhjOiJ0cmVlZ3JpZCIsWWM6InRyZWVpdGVtIn07dmFyIHdhPWZ1bmN0aW9uKGEpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsd2EpO2Vsc2V7dmFyIGI9RXJyb3IoKS5zdGFjaztiJiYodGhpcy5zdGFjaz1iKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSl9O24od2EsRXJyb3IpO3dhLnByb3RvdHlwZS5uYW1lPSJDdXN0b21FcnJvciI7dmFyIHhhO3ZhciB5YT1mdW5jdGlvbihhLGIpe2E9YS5zcGxpdCgiJXMiKTtmb3IodmFyIGM9IiIsZD1hLmxlbmd0aC0xLGU9MDtlPGQ7ZSsrKWMrPWFbZV0rKGU8Yi5sZW5ndGg/YltlXToiJXMiKTt3YS5jYWxsKHRoaXMsYythW2RdKX07bih5YSx3YSk7eWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjsKdmFyIHphPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSJBc3NlcnRpb24gZmFpbGVkIjtpZihjKXtlKz0iOiAiK2M7dmFyIGY9ZH1lbHNlIGEmJihlKz0iOiAiK2EsZj1iKTt0aHJvdyBuZXcgeWEoIiIrZSxmfHxbXSk7fSxxPWZ1bmN0aW9uKGEsYixjKXthfHx6YSgiIixudWxsLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX0sQWE9ZnVuY3Rpb24oYSxiLGMpe20oYSkmJjE9PWEubm9kZVR5cGV8fHphKCJFeHBlY3RlZCBFbGVtZW50IGJ1dCBnb3QgJXM6ICVzLiIsW2VhKGEpLGFdLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKX0sQ2E9ZnVuY3Rpb24oYSxiLGMsZCl7YSBpbnN0YW5jZW9mIGJ8fHphKCJFeHBlY3RlZCBpbnN0YW5jZW9mICVzIGJ1dCBnb3QgJXMuIixbQmEoYiksQmEoYSldLGMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpKX0sQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZgpGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTpudWxsPT09YT8ibnVsbCI6dHlwZW9mIGF9O3ZhciBEYT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3EobnVsbCE9YS5sZW5ndGgpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKCJzdHJpbmciPT09dHlwZW9mIGEpcmV0dXJuInN0cmluZyIhPT10eXBlb2YgYnx8MSE9Yi5sZW5ndGg/LTE6YS5pbmRleE9mKGIsMCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspaWYoYyBpbiBhJiZhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX0scj1BcnJheS5wcm90b3R5cGUuZm9yRWFjaD9mdW5jdGlvbihhLGIsYyl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsYyl9OmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9YS5sZW5ndGgsZT0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZj0wO2Y8ZDtmKyspZiBpbiBlJiZiLmNhbGwoYyxlW2ZdLGYsYSl9LEVhPUFycmF5LnByb3RvdHlwZS5maWx0ZXI/CmZ1bmN0aW9uKGEsYil7cShudWxsIT1hLmxlbmd0aCk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD1bXSxlPTAsZj0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmEsZz0wO2c8YztnKyspaWYoZyBpbiBmKXt2YXIgaz1mW2ddO2IuY2FsbCh2b2lkIDAsayxnLGEpJiYoZFtlKytdPWspfXJldHVybiBkfSxGYT1BcnJheS5wcm90b3R5cGUuZXZlcnk/ZnVuY3Rpb24oYSxiKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmV2ZXJ5LmNhbGwoYSxiLHZvaWQgMCl9OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWEubGVuZ3RoLGQ9InN0cmluZyI9PT10eXBlb2YgYT9hLnNwbGl0KCIiKTphLGU9MDtlPGM7ZSsrKWlmKGUgaW4gZCYmIWIuY2FsbCh2b2lkIDAsZFtlXSxlLGEpKXJldHVybiExO3JldHVybiEwfSxHYT1mdW5jdGlvbihhLGIpe3JldHVybiAwPD0KRGEoYSxiKX0sSGE9ZnVuY3Rpb24oYSxiKXtiPURhKGEsYik7dmFyIGM7aWYoYz0wPD1iKXEobnVsbCE9YS5sZW5ndGgpLEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhLGIsMSk7cmV0dXJuIGN9LElhPWZ1bmN0aW9uKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGFyZ3VtZW50cyl9LEphPWZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDA8Yil7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX0sTGE9ZnVuY3Rpb24oYSxiLGMsZCl7cShudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShhLEthKGFyZ3VtZW50cywxKSl9LEthPWZ1bmN0aW9uKGEsYixjKXtxKG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gMj49YXJndW1lbnRzLmxlbmd0aD9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsYixjKX07dmFyIE1hPVN0cmluZy5wcm90b3R5cGUudHJpbT9mdW5jdGlvbihhKXtyZXR1cm4gYS50cmltKCl9OmZ1bmN0aW9uKGEpe3JldHVybi9eW1xzXHhhMF0qKFtcc1xTXSo/KVtcc1x4YTBdKiQvLmV4ZWMoYSlbMV19LE5hPS8mL2csT2E9LzwvZyxQYT0vPi9nLFFhPS8iL2csUmE9LycvZyxTYT0vXHgwMC9nLFRhPS9bXHgwMCY8PiInXS8sdD1mdW5jdGlvbihhLGIpe3JldHVybi0xIT1hLmluZGV4T2YoYil9LFVhPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE8Yj8tMTphPmI/MTowfTt2YXIgdTthOnt2YXIgVmE9bC5uYXZpZ2F0b3I7aWYoVmEpe3ZhciBXYT1WYS51c2VyQWdlbnQ7aWYoV2Epe3U9V2E7YnJlYWsgYX19dT0iIn07LyoKCiBDb3B5cmlnaHQgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzLgogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKKi8KdmFyIFhhPWZ1bmN0aW9uKGEpe1RhLnRlc3QoYSkmJigtMSE9YS5pbmRleE9mKCImIikmJihhPWEucmVwbGFjZShOYSwiJmFtcDsiKSksLTEhPWEuaW5kZXhPZigiPCIpJiYoYT1hLnJlcGxhY2UoT2EsIiZsdDsiKSksLTEhPWEuaW5kZXhPZigiPiIpJiYoYT1hLnJlcGxhY2UoUGEsIiZndDsiKSksLTEhPWEuaW5kZXhPZignIicpJiYoYT1hLnJlcGxhY2UoUWEsIiZxdW90OyIpKSwtMSE9YS5pbmRleE9mKCInIikmJihhPWEucmVwbGFjZShSYSwiJiMzOTsiKSksLTEhPWEuaW5kZXhPZigiXHgwMCIpJiYoYT1hLnJlcGxhY2UoU2EsIiYjMDsiKSkpO3JldHVybiBhfTt2YXIgWWE9ZnVuY3Rpb24oYSl7WWFbIiAiXShhKTtyZXR1cm4gYX07WWFbIiAiXT1jYTt2YXIgJGE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1aYTtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsYSk/Y1thXTpjW2FdPWIoYSl9O3ZhciBhYj10KHUsIk9wZXJhIiksdj10KHUsIlRyaWRlbnQiKXx8dCh1LCJNU0lFIiksYmI9dCh1LCJFZGdlIikseD10KHUsIkdlY2tvIikmJiEodCh1LnRvTG93ZXJDYXNlKCksIndlYmtpdCIpJiYhdCh1LCJFZGdlIikpJiYhKHQodSwiVHJpZGVudCIpfHx0KHUsIk1TSUUiKSkmJiF0KHUsIkVkZ2UiKSx5PXQodS50b0xvd2VyQ2FzZSgpLCJ3ZWJraXQiKSYmIXQodSwiRWRnZSIpLHo9dCh1LCJNYWNpbnRvc2giKSxjYj1mdW5jdGlvbigpe3ZhciBhPWwuZG9jdW1lbnQ7cmV0dXJuIGE/YS5kb2N1bWVudE1vZGU6dm9pZCAwfSxkYjsKYTp7dmFyIGViPSIiLGZiPWZ1bmN0aW9uKCl7dmFyIGE9dTtpZih4KXJldHVybi9ydjooW15cKTtdKykoXCl8OykvLmV4ZWMoYSk7aWYoYmIpcmV0dXJuL0VkZ2VcLyhbXGRcLl0rKS8uZXhlYyhhKTtpZih2KXJldHVybi9cYig/Ok1TSUV8cnYpWzogXShbXlwpO10rKShcKXw7KS8uZXhlYyhhKTtpZih5KXJldHVybi9XZWJLaXRcLyhcUyspLy5leGVjKGEpO2lmKGFiKXJldHVybi8oPzpWZXJzaW9uKVsgXC9dPyhcUyspLy5leGVjKGEpfSgpO2ZiJiYoZWI9ZmI/ZmJbMV06IiIpO2lmKHYpe3ZhciBnYj1jYigpO2lmKG51bGwhPWdiJiZnYj5wYXJzZUZsb2F0KGViKSl7ZGI9U3RyaW5nKGdiKTticmVhayBhfX1kYj1lYn0KdmFyIGhiPWRiLFphPXt9LEE9ZnVuY3Rpb24oYSl7cmV0dXJuICRhKGEsZnVuY3Rpb24oKXtmb3IodmFyIGI9MCxjPU1hKFN0cmluZyhoYikpLnNwbGl0KCIuIiksZD1NYShTdHJpbmcoYSkpLnNwbGl0KCIuIiksZT1NYXRoLm1heChjLmxlbmd0aCxkLmxlbmd0aCksZj0wOzA9PWImJmY8ZTtmKyspe3ZhciBnPWNbZl18fCIiLGs9ZFtmXXx8IiI7ZG97Zz0vKFxkKikoXEQqKSguKikvLmV4ZWMoZyl8fFsiIiwiIiwiIiwiIl07az0vKFxkKikoXEQqKSguKikvLmV4ZWMoayl8fFsiIiwiIiwiIiwiIl07aWYoMD09Z1swXS5sZW5ndGgmJjA9PWtbMF0ubGVuZ3RoKWJyZWFrO2I9VWEoMD09Z1sxXS5sZW5ndGg/MDpwYXJzZUludChnWzFdLDEwKSwwPT1rWzFdLmxlbmd0aD8wOnBhcnNlSW50KGtbMV0sMTApKXx8VWEoMD09Z1syXS5sZW5ndGgsMD09a1syXS5sZW5ndGgpfHxVYShnWzJdLGtbMl0pO2c9Z1szXTtrPWtbM119d2hpbGUoMD09Yil9cmV0dXJuIDA8PWJ9KX0saWI7CmliPWwuZG9jdW1lbnQmJnY/Y2IoKTp2b2lkIDA7dmFyIGpiPSF2fHw5PD1OdW1iZXIoaWIpO3ZhciBsYj1mdW5jdGlvbihhLGIpe29hKGIsZnVuY3Rpb24oYyxkKXtjJiYib2JqZWN0Ij09dHlwZW9mIGMmJmMuZGQmJihjPWMuY2QoKSk7InN0eWxlIj09ZD9hLnN0eWxlLmNzc1RleHQ9YzoiY2xhc3MiPT1kP2EuY2xhc3NOYW1lPWM6ImZvciI9PWQ/YS5odG1sRm9yPWM6a2IuaGFzT3duUHJvcGVydHkoZCk/YS5zZXRBdHRyaWJ1dGUoa2JbZF0sYyk6MD09ZC5sYXN0SW5kZXhPZigiYXJpYS0iLDApfHwwPT1kLmxhc3RJbmRleE9mKCJkYXRhLSIsMCk/YS5zZXRBdHRyaWJ1dGUoZCxjKTphW2RdPWN9KX0sa2I9e2NlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjb2xzcGFuOiJjb2xTcGFuIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGhlaWdodDoiaGVpZ2h0IixtYXhsZW5ndGg6Im1heExlbmd0aCIsbm9uY2U6Im5vbmNlIixyb2xlOiJyb2xlIixyb3dzcGFuOiJyb3dTcGFuIix0eXBlOiJ0eXBlIix1c2VtYXA6InVzZU1hcCIsdmFsaWduOiJ2QWxpZ24iLAp3aWR0aDoid2lkdGgifSxtYj1mdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChrKXtrJiZiLmFwcGVuZENoaWxkKCJzdHJpbmciPT09dHlwZW9mIGs/YS5jcmVhdGVUZXh0Tm9kZShrKTprKX1mb3IodmFyIGU9MjtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXTtpZighaGEoZil8fG0oZikmJjA8Zi5ub2RlVHlwZSlkKGYpO2Vsc2V7YTp7aWYoZiYmIm51bWJlciI9PXR5cGVvZiBmLmxlbmd0aCl7aWYobShmKSl7dmFyIGc9ImZ1bmN0aW9uIj09dHlwZW9mIGYuaXRlbXx8InN0cmluZyI9PXR5cGVvZiBmLml0ZW07YnJlYWsgYX1pZihpYShmKSl7Zz0iZnVuY3Rpb24iPT10eXBlb2YgZi5pdGVtO2JyZWFrIGF9fWc9ITF9cihnP0phKGYpOmYsZCl9fX0sbmI9ZnVuY3Rpb24oYSxiKXtiPVN0cmluZyhiKTsiYXBwbGljYXRpb24veGh0bWwreG1sIj09PWEuY29udGVudFR5cGUmJihiPWIudG9Mb3dlckNhc2UoKSk7cmV0dXJuIGEuY3JlYXRlRWxlbWVudChiKX0sb2I9ZnVuY3Rpb24oYSl7YSYmCmEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpfSxwYj1mdW5jdGlvbihhLGIpe2lmKCFhfHwhYilyZXR1cm4hMTtpZihhLmNvbnRhaW5zJiYxPT1iLm5vZGVUeXBlKXJldHVybiBhPT1ifHxhLmNvbnRhaW5zKGIpO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbilyZXR1cm4gYT09Ynx8ISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNik7Zm9yKDtiJiZhIT1iOyliPWIucGFyZW50Tm9kZTtyZXR1cm4gYj09YX0scWI9ZnVuY3Rpb24oYSl7cShhLCJOb2RlIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4iKTtyZXR1cm4gOT09YS5ub2RlVHlwZT9hOmEub3duZXJEb2N1bWVudHx8YS5kb2N1bWVudH0scmI9ZnVuY3Rpb24oYSxiKXtiP2EudGFiSW5kZXg9MDooYS50YWJJbmRleD0tMSxhLnJlbW92ZUF0dHJpYnV0ZSgidGFiSW5kZXgiKSl9LHNiPWZ1bmN0aW9uKGEpe3JldHVybiB2JiYhQSgiOSIpPyhhPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKSwKbnVsbCE9YSYmYS5zcGVjaWZpZWQpOmEuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpfSx0Yj1mdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgYSYmMDw9YSYmMzI3Njg+YX0sdWI9ZnVuY3Rpb24oYSl7dGhpcy5hPWF8fGwuZG9jdW1lbnR8fGRvY3VtZW50fTt1Yi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBhP3RoaXMuYS5nZXRFbGVtZW50QnlJZChhKTphfTsKdWIucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuYSxlPWFyZ3VtZW50cyxmPVN0cmluZyhlWzBdKSxnPWVbMV07aWYoIWpiJiZnJiYoZy5uYW1lfHxnLnR5cGUpKXtmPVsiPCIsZl07Zy5uYW1lJiZmLnB1c2goJyBuYW1lPSInLFhhKGcubmFtZSksJyInKTtpZihnLnR5cGUpe2YucHVzaCgnIHR5cGU9IicsWGEoZy50eXBlKSwnIicpO3ZhciBrPXt9O3VhKGssZyk7ZGVsZXRlIGsudHlwZTtnPWt9Zi5wdXNoKCI+Iik7Zj1mLmpvaW4oIiIpfWY9bmIoZCxmKTtnJiYoInN0cmluZyI9PT10eXBlb2YgZz9mLmNsYXNzTmFtZT1nOmZhKGcpP2YuY2xhc3NOYW1lPWcuam9pbigiICIpOmxiKGYsZykpOzI8ZS5sZW5ndGgmJm1iKGQsZixlKTtyZXR1cm4gZn07dmFyIHZiPWZ1bmN0aW9uKGEsYil7Yj8ocShwYSh2YSxiKSwiTm8gc3VjaCBBUklBIHJvbGUgIitiKSxhLnNldEF0dHJpYnV0ZSgicm9sZSIsYikpOmEucmVtb3ZlQXR0cmlidXRlKCJyb2xlIil9LHhiPWZ1bmN0aW9uKGEsYixjKXtmYShjKSYmKGM9Yy5qb2luKCIgIikpO3ZhciBkPXdiKGIpOyIiPT09Y3x8dm9pZCAwPT1jPyhtYXx8KG1hPXthdG9taWM6ITEsYXV0b2NvbXBsZXRlOiJub25lIixkcm9wZWZmZWN0OiJub25lIixoYXNwb3B1cDohMSxsaXZlOiJvZmYiLG11bHRpbGluZTohMSxtdWx0aXNlbGVjdGFibGU6ITEsb3JpZW50YXRpb246InZlcnRpY2FsIixyZWFkb25seTohMSxyZWxldmFudDoiYWRkaXRpb25zIHRleHQiLHJlcXVpcmVkOiExLHNvcnQ6Im5vbmUiLGJ1c3k6ITEsZGlzYWJsZWQ6ITEsaGlkZGVuOiExLGludmFsaWQ6ImZhbHNlIn0pLGM9bWEsYiBpbiBjP2Euc2V0QXR0cmlidXRlKGQsY1tiXSk6YS5yZW1vdmVBdHRyaWJ1dGUoZCkpOmEuc2V0QXR0cmlidXRlKGQsCmMpfSx3Yj1mdW5jdGlvbihhKXtxKGEsIkFSSUEgYXR0cmlidXRlIGNhbm5vdCBiZSBlbXB0eS4iKTtxKHBhKG5hLGEpLCJObyBzdWNoIEFSSUEgYXR0cmlidXRlICIrYSk7cmV0dXJuImFyaWEtIithfTt2YXIgeWI9T2JqZWN0LmZyZWV6ZXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O3ZhciBDPWZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVTt0aGlzLko9dGhpcy5KfTtDLnByb3RvdHlwZS5VPSExO0MucHJvdG90eXBlLk49ZnVuY3Rpb24oKXt0aGlzLlV8fCh0aGlzLlU9ITAsdGhpcy51KCkpfTt2YXIgemI9ZnVuY3Rpb24oYSxiKXthLlU/YigpOihhLkp8fChhLko9W10pLGEuSi5wdXNoKGIpKX07Qy5wcm90b3R5cGUudT1mdW5jdGlvbigpe2lmKHRoaXMuSilmb3IoO3RoaXMuSi5sZW5ndGg7KXRoaXMuSi5zaGlmdCgpKCl9O3ZhciBBYj1mdW5jdGlvbihhKXthJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5OJiZhLk4oKX07dmFyIEJiPWZ1bmN0aW9uKGEpe3JldHVybiJzdHJpbmciPT10eXBlb2YgYS5jbGFzc05hbWU/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sRD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6QmIoYSkubWF0Y2goL1xTKy9nKXx8W119LENiPWZ1bmN0aW9uKGEsYil7InN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZT9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxEYj1mdW5jdGlvbihhLGIpe3JldHVybiBhLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5jb250YWlucyhiKTpHYShEKGEpLGIpfSxFYj1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFEYihhLGIpKXt2YXIgYz1CYihhKTtDYihhLGMrKDA8Yy5sZW5ndGg/IiAiK2I6YikpfX0sRmI9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClyKGIsCmZ1bmN0aW9uKGUpe0ViKGEsZSl9KTtlbHNle3ZhciBjPXt9O3IoRChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7cihiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPTA8Yi5sZW5ndGg/IiAiK2Q6ZDtDYihhLGIpfX0sR2I9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6RGIoYSxiKSYmQ2IoYSxFYShEKGEpLGZ1bmN0aW9uKGMpe3JldHVybiBjIT1ifSkuam9pbigiICIpKX0sSGI9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9yKGIsZnVuY3Rpb24oYyl7R2IoYSxjKX0pOkNiKGEsRWEoRChhKSxmdW5jdGlvbihjKXtyZXR1cm4hR2EoYixjKX0pLmpvaW4oIiAiKSl9O3ZhciBJYj0hdnx8OTw9TnVtYmVyKGliKSxKYj0hdnx8OTw9TnVtYmVyKGliKSxLYj12JiYhQSgiOSIpLExiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e2wuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsY2EsYiksbC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjYSxiKX1jYXRjaChjKXt9cmV0dXJuIGF9KCk7dmFyIEU9ZnVuY3Rpb24oYSxiKXt0aGlzLnR5cGU9YTt0aGlzLmE9dGhpcy50YXJnZXQ9Yjt0aGlzLmg9ITE7dGhpcy5LYT0hMH07RS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuaD0hMH07RS5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3RoaXMuS2E9ITF9O3ZhciBGPXtMOiJtb3VzZWRvd24iLE06Im1vdXNldXAiLGFhOiJtb3VzZWNhbmNlbCIsaGM6Im1vdXNlbW92ZSIsamM6Im1vdXNlb3ZlciIsaWM6Im1vdXNlb3V0IixmYzoibW91c2VlbnRlciIsZ2M6Im1vdXNlbGVhdmUifTt2YXIgRz1mdW5jdGlvbihhLGIpe0UuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy5hPXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5jPTA7dGhpcy5BPXRoaXMubWV0YUtleT10aGlzLnNoaWZ0S2V5PXRoaXMuYWx0S2V5PXRoaXMuY3RybEtleT0hMTt0aGlzLnBvaW50ZXJJZD0wO3RoaXMucG9pbnRlclR5cGU9IiI7dGhpcy5iPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMuYT1iO2lmKGI9YS5yZWxhdGVkVGFyZ2V0KXtpZih4KXthOnt0cnl7WWEoYi5ub2RlTmFtZSk7dmFyIGU9ITA7YnJlYWsgYX1jYXRjaChmKXt9ZT0KITF9ZXx8KGI9bnVsbCl9fWVsc2UibW91c2VvdmVyIj09Yz9iPWEuZnJvbUVsZW1lbnQ6Im1vdXNlb3V0Ij09YyYmKGI9YS50b0VsZW1lbnQpO3RoaXMucmVsYXRlZFRhcmdldD1iO2Q/KHRoaXMuY2xpZW50WD12b2lkIDAhPT1kLmNsaWVudFg/ZC5jbGllbnRYOmQucGFnZVgsdGhpcy5jbGllbnRZPXZvaWQgMCE9PWQuY2xpZW50WT9kLmNsaWVudFk6ZC5wYWdlWSx0aGlzLnNjcmVlblg9ZC5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1kLnNjcmVlbll8fDApOih0aGlzLmNsaWVudFg9dm9pZCAwIT09YS5jbGllbnRYP2EuY2xpZW50WDphLnBhZ2VYLHRoaXMuY2xpZW50WT12b2lkIDAhPT1hLmNsaWVudFk/YS5jbGllbnRZOmEucGFnZVksdGhpcy5zY3JlZW5YPWEuc2NyZWVuWHx8MCx0aGlzLnNjcmVlblk9YS5zY3JlZW5ZfHwwKTt0aGlzLmJ1dHRvbj1hLmJ1dHRvbjt0aGlzLmM9YS5rZXlDb2RlfHwwO3RoaXMua2V5PWEua2V5fHwiIjt0aGlzLmN0cmxLZXk9YS5jdHJsS2V5O3RoaXMuYWx0S2V5PQphLmFsdEtleTt0aGlzLnNoaWZ0S2V5PWEuc2hpZnRLZXk7dGhpcy5tZXRhS2V5PWEubWV0YUtleTt0aGlzLkE9ej9hLm1ldGFLZXk6YS5jdHJsS2V5O3RoaXMucG9pbnRlcklkPWEucG9pbnRlcklkfHwwO3RoaXMucG9pbnRlclR5cGU9InN0cmluZyI9PT10eXBlb2YgYS5wb2ludGVyVHlwZT9hLnBvaW50ZXJUeXBlOk1iW2EucG9pbnRlclR5cGVdfHwiIjt0aGlzLmI9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnRoaXMuZygpfX07bihHLEUpO3ZhciBOYj15YihbMSw0LDJdKSxNYj15Yih7MjoidG91Y2giLDM6InBlbiIsNDoibW91c2UifSksT2I9ZnVuY3Rpb24oYSl7cmV0dXJuIEliPzA9PWEuYi5idXR0b246ImNsaWNrIj09YS50eXBlPyEwOiEhKGEuYi5idXR0b24mTmJbMF0pfTtHLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7Ry5pLmouY2FsbCh0aGlzKTt0aGlzLmIuc3RvcFByb3BhZ2F0aW9uP3RoaXMuYi5zdG9wUHJvcGFnYXRpb24oKTp0aGlzLmIuY2FuY2VsQnViYmxlPSEwfTsKRy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe0cuaS5nLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5iO2lmKGEucHJldmVudERlZmF1bHQpYS5wcmV2ZW50RGVmYXVsdCgpO2Vsc2UgaWYoYS5yZXR1cm5WYWx1ZT0hMSxLYil0cnl7aWYoYS5jdHJsS2V5fHwxMTI8PWEua2V5Q29kZSYmMTIzPj1hLmtleUNvZGUpYS5rZXlDb2RlPS0xfWNhdGNoKGIpe319O3ZhciBQYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKDFFNipNYXRoLnJhbmRvbSgpfDApLFFiPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW1BiXSl9LFJiPTA7dmFyIFNiPWZ1bmN0aW9uKGEsYixjLGQsZSl7dGhpcy5saXN0ZW5lcj1hO3RoaXMuYT1udWxsO3RoaXMuc3JjPWI7dGhpcy50eXBlPWM7dGhpcy5jYXB0dXJlPSEhZDt0aGlzLm1hPWU7dGhpcy5rZXk9KytSYjt0aGlzLlg9dGhpcy5oYT0hMX0sVGI9ZnVuY3Rpb24oYSl7YS5YPSEwO2EubGlzdGVuZXI9bnVsbDthLmE9bnVsbDthLnNyYz1udWxsO2EubWE9bnVsbH07dmFyIFViPWZ1bmN0aW9uKGEpe3RoaXMuc3JjPWE7dGhpcy5hPXt9O3RoaXMuYj0wfTtVYi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS50b1N0cmluZygpO2E9dGhpcy5hW2ZdO2F8fChhPXRoaXMuYVtmXT1bXSx0aGlzLmIrKyk7dmFyIGc9VmIoYSxiLGQsZSk7LTE8Zz8oYj1hW2ddLGN8fChiLmhhPSExKSk6KGI9bmV3IFNiKGIsdGhpcy5zcmMsZiwhIWQsZSksYi5oYT1jLGEucHVzaChiKSk7cmV0dXJuIGJ9Owp2YXIgV2I9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLnR5cGU7YyBpbiBhLmEmJkhhKGEuYVtjXSxiKSYmKFRiKGIpLDA9PWEuYVtjXS5sZW5ndGgmJihkZWxldGUgYS5hW2NdLGEuYi0tKSl9LFhiPWZ1bmN0aW9uKGEsYixjLGQsZSl7YT1hLmFbYi50b1N0cmluZygpXTtiPS0xO2EmJihiPVZiKGEsYyxkLGUpKTtyZXR1cm4tMTxiP2FbYl06bnVsbH0sVmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuWCYmZi5saXN0ZW5lcj09YiYmZi5jYXB0dXJlPT0hIWMmJmYubWE9PWQpcmV0dXJuIGV9cmV0dXJuLTF9O3ZhciBZYj0iY2xvc3VyZV9sbV8iKygxRTYqTWF0aC5yYW5kb20oKXwwKSxaYj17fSwkYj0wLGJjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZCYmZC5vbmNlKXJldHVybiBhYyhhLGIsYyxkLGUpO2lmKGZhKGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyliYyhhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9Y2MoYyk7cmV0dXJuIFFiKGEpP2RjKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOmVjKGEsYixjLCExLGQsZSl9LGVjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGc9bShlKT8hIWUuY2FwdHVyZTohIWUsaz1mYyhhKTtrfHwoYVtZYl09az1uZXcgVWIoYSkpO2M9ay5hZGQoYixjLGQsZyxmKTtpZihjLmEpcmV0dXJuIGM7ZD1nYygpO2MuYT1kO2Quc3JjPWE7ZC5saXN0ZW5lcj1jO2lmKGEuYWRkRXZlbnRMaXN0ZW5lcilMYnx8KGU9Zyksdm9pZCAwPT09ZSYmKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksCmQsZSk7ZWxzZSBpZihhLmF0dGFjaEV2ZW50KWEuYXR0YWNoRXZlbnQoaGMoYi50b1N0cmluZygpKSxkKTtlbHNlIGlmKGEuYWRkTGlzdGVuZXImJmEucmVtb3ZlTGlzdGVuZXIpcSgiY2hhbmdlIj09PWIsIk1lZGlhUXVlcnlMaXN0IG9ubHkgaGFzIGEgY2hhbmdlIGV2ZW50IiksYS5hZGRMaXN0ZW5lcihkKTtlbHNlIHRocm93IEVycm9yKCJhZGRFdmVudExpc3RlbmVyIGFuZCBhdHRhY2hFdmVudCBhcmUgdW5hdmFpbGFibGUuIik7JGIrKztyZXR1cm4gY30sZ2M9ZnVuY3Rpb24oKXt2YXIgYT1pYyxiPUpiP2Z1bmN0aW9uKGMpe3JldHVybiBhLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKX06ZnVuY3Rpb24oYyl7Yz1hLmNhbGwoYi5zcmMsYi5saXN0ZW5lcixjKTtpZighYylyZXR1cm4gY307cmV0dXJuIGJ9LGFjPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZmEoYikpe2Zvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWFjKGEsYltmXSxjLGQsZSk7cmV0dXJuIG51bGx9Yz1jYyhjKTtyZXR1cm4gUWIoYSk/CmEuaC5hZGQoU3RyaW5nKGIpLGMsITAsbShkKT8hIWQuY2FwdHVyZTohIWQsZSk6ZWMoYSxiLGMsITAsZCxlKX0samM9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihmYShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylqYyhhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPWNjKGMpLFFiKGEpPyhhPWEuaCxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5hJiYoZj1hLmFbYl0sYz1WYihmLGMsZCxlKSwtMTxjJiYoVGIoZltjXSkscShudWxsIT1mLmxlbmd0aCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSwwPT1mLmxlbmd0aCYmKGRlbGV0ZSBhLmFbYl0sYS5iLS0pKSkpOmEmJihhPWZjKGEpKSYmKGM9WGIoYSxiLGMsZCxlKSkmJmtjKGMpfSxrYz1mdW5jdGlvbihhKXtpZigibnVtYmVyIiE9PXR5cGVvZiBhJiZhJiYhYS5YKXt2YXIgYj1hLnNyYztpZihRYihiKSlXYihiLmgsYSk7ZWxzZXt2YXIgYz1hLnR5cGUsZD1hLmE7Yi5yZW1vdmVFdmVudExpc3RlbmVyPwpiLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KGhjKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7JGItLTsoYz1mYyhiKSk/KFdiKGMsYSksMD09Yy5iJiYoYy5zcmM9bnVsbCxiW1liXT1udWxsKSk6VGIoYSl9fX0saGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gWmI/WmJbYV06WmJbYV09Im9uIithfSxtYz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMDtpZihhPWZjKGEpKWlmKGI9YS5hW2IudG9TdHJpbmcoKV0pZm9yKGI9Yi5jb25jYXQoKSxhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBmPWJbYV07ZiYmZi5jYXB0dXJlPT1jJiYhZi5YJiYoZj1sYyhmLGQpLGU9ZSYmITEhPT1mKX1yZXR1cm4gZX0sbGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5tYXx8YS5zcmM7YS5oYSYma2MoYSk7cmV0dXJuIGMuY2FsbChkLGIpfSxpYz1mdW5jdGlvbihhLApiKXtpZihhLlgpcmV0dXJuITA7aWYoIUpiKXtpZighYilhOntiPVsid2luZG93IiwiZXZlbnQiXTtmb3IodmFyIGM9bCxkPTA7ZDxiLmxlbmd0aDtkKyspaWYoYz1jW2JbZF1dLG51bGw9PWMpe2I9bnVsbDticmVhayBhfWI9Y31kPWI7Yj1uZXcgRyhkLHRoaXMpO2M9ITA7aWYoISgwPmQua2V5Q29kZXx8dm9pZCAwIT1kLnJldHVyblZhbHVlKSl7YTp7dmFyIGU9ITE7aWYoMD09ZC5rZXlDb2RlKXRyeXtkLmtleUNvZGU9LTE7YnJlYWsgYX1jYXRjaChnKXtlPSEwfWlmKGV8fHZvaWQgMD09ZC5yZXR1cm5WYWx1ZSlkLnJldHVyblZhbHVlPSEwfWQ9W107Zm9yKGU9Yi5hO2U7ZT1lLnBhcmVudE5vZGUpZC5wdXNoKGUpO2E9YS50eXBlO2ZvcihlPWQubGVuZ3RoLTE7IWIuaCYmMDw9ZTtlLS0pe2IuYT1kW2VdO3ZhciBmPW1jKGRbZV0sYSwhMCxiKTtjPWMmJmZ9Zm9yKGU9MDshYi5oJiZlPGQubGVuZ3RoO2UrKyliLmE9ZFtlXSxmPW1jKGRbZV0sYSwhMSxiKSxjPWMmJmZ9cmV0dXJuIGN9cmV0dXJuIGxjKGEsCm5ldyBHKGIsdGhpcykpfSxmYz1mdW5jdGlvbihhKXthPWFbWWJdO3JldHVybiBhIGluc3RhbmNlb2YgVWI/YTpudWxsfSxuYz0iX19jbG9zdXJlX2V2ZW50c19mbl8iKygxRTkqTWF0aC5yYW5kb20oKT4+PjApLGNjPWZ1bmN0aW9uKGEpe3EoYSwiTGlzdGVuZXIgY2FuIG5vdCBiZSBudWxsLiIpO2lmKGlhKGEpKXJldHVybiBhO3EoYS5oYW5kbGVFdmVudCwiQW4gb2JqZWN0IGxpc3RlbmVyIG11c3QgaGF2ZSBoYW5kbGVFdmVudCBtZXRob2QuIik7YVtuY118fChhW25jXT1mdW5jdGlvbihiKXtyZXR1cm4gYS5oYW5kbGVFdmVudChiKX0pO3JldHVybiBhW25jXX07dmFyIG9jPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9e319O24ob2MsQyk7CnZhciBwYz1bXSxIPWZ1bmN0aW9uKGEsYixjLGQpe2ZhKGMpfHwoYyYmKHBjWzBdPWMudG9TdHJpbmcoKSksYz1wYyk7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWJjKGIsY1tlXSxkfHxhLmhhbmRsZUV2ZW50LCExLGEuYnx8YSk7aWYoIWYpYnJlYWs7YS5hW2Yua2V5XT1mfXJldHVybiBhfSxxYz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoZmEoYykpZm9yKHZhciBnPTA7ZzxjLmxlbmd0aDtnKyspcWMoYSxiLGNbZ10sZCxlLGYpO2Vsc2UgZD1kfHxhLmhhbmRsZUV2ZW50LGU9bShlKT8hIWUuY2FwdHVyZTohIWUsZj1mfHxhLmJ8fGEsZD1jYyhkKSxlPSEhZSxjPVFiKGIpP1hiKGIuaCxTdHJpbmcoYyksZCxlLGYpOmI/KGI9ZmMoYikpP1hiKGIsYyxkLGUsZik6bnVsbDpudWxsLGMmJihrYyhjKSxkZWxldGUgYS5hW2Mua2V5XSk7cmV0dXJuIGF9LHJjPWZ1bmN0aW9uKGEpe29hKGEuYSxmdW5jdGlvbihiLGMpe3RoaXMuYS5oYXNPd25Qcm9wZXJ0eShjKSYma2MoYil9LAphKTthLmE9e319O29jLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7b2MuaS51LmNhbGwodGhpcyk7cmModGhpcyl9O29jLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJFdmVudEhhbmRsZXIuaGFuZGxlRXZlbnQgbm90IGltcGxlbWVudGVkIik7fTt2YXIgST1mdW5jdGlvbigpe0MuY2FsbCh0aGlzKTt0aGlzLmg9bmV3IFViKHRoaXMpO3RoaXMuTWE9dGhpczt0aGlzLnBhPW51bGx9O24oSSxDKTtJLnByb3RvdHlwZVtQYl09ITA7SS5wcm90b3R5cGUucmE9ZnVuY3Rpb24oYSl7dGhpcy5wYT1hfTtJLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjLGQpe2pjKHRoaXMsYSxiLGMsZCl9Owp2YXIgdWM9ZnVuY3Rpb24oYSxiKXtzYyhhKTt2YXIgYz1hLnBhO2lmKGMpe3ZhciBkPVtdO2Zvcih2YXIgZT0xO2M7Yz1jLnBhKWQucHVzaChjKSxxKDFFMz4rK2UsImluZmluaXRlIGxvb3AiKX1hPWEuTWE7Yz1iLnR5cGV8fGI7InN0cmluZyI9PT10eXBlb2YgYj9iPW5ldyBFKGIsYSk6YiBpbnN0YW5jZW9mIEU/Yi50YXJnZXQ9Yi50YXJnZXR8fGE6KGU9YixiPW5ldyBFKGMsYSksdWEoYixlKSk7ZT0hMDtpZihkKWZvcih2YXIgZj1kLmxlbmd0aC0xOyFiLmgmJjA8PWY7Zi0tKXt2YXIgZz1iLmE9ZFtmXTtlPXRjKGcsYywhMCxiKSYmZX1iLmh8fChnPWIuYT1hLGU9dGMoZyxjLCEwLGIpJiZlLGIuaHx8KGU9dGMoZyxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLmgmJmY8ZC5sZW5ndGg7ZisrKWc9Yi5hPWRbZl0sZT10YyhnLGMsITEsYikmJmU7cmV0dXJuIGV9OwpJLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7SS5pLnUuY2FsbCh0aGlzKTtpZih0aGlzLmgpe3ZhciBhPXRoaXMuaCxiPTAsYztmb3IoYyBpbiBhLmEpe2Zvcih2YXIgZD1hLmFbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixUYihkW2VdKTtkZWxldGUgYS5hW2NdO2EuYi0tfX10aGlzLnBhPW51bGx9O3ZhciBkYz1mdW5jdGlvbihhLGIsYyxkLGUpe3NjKGEpO3JldHVybiBhLmguYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LHRjPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5oLmFbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGc9YltmXTtpZihnJiYhZy5YJiZnLmNhcHR1cmU9PWMpe3ZhciBrPWcubGlzdGVuZXIscD1nLm1hfHxnLnNyYztnLmhhJiZXYihhLmgsZyk7ZT0hMSE9PWsuY2FsbChwLGQpJiZlfX1yZXR1cm4gZSYmMCE9ZC5LYX0sc2M9ZnVuY3Rpb24oYSl7cShhLmgsIkV2ZW50IHRhcmdldCBpcyBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgY2FsbCB0aGUgc3VwZXJjbGFzcyAoZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpIGNvbnN0cnVjdG9yPyIpfTt2YXIgeGM9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKHkmJiFBKCI1MjUiKSlyZXR1cm4hMDtpZih6JiZlKXJldHVybiB2YyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZigheCl7Im51bWJlciI9PT10eXBlb2YgYiYmKGI9d2MoYikpO3ZhciBnPTE3PT1ifHwxOD09Ynx8eiYmOTE9PWI7aWYoKCFjfHx6KSYmZ3x8eiYmMTY9PWImJihkfHxmKSlyZXR1cm4hMX1pZigoeXx8YmIpJiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1pZih2JiZkJiZiPT1hKXJldHVybiExO3N3aXRjaChhKXtjYXNlIDEzOnJldHVybiB4P2Z8fGU/ITE6IShjJiZkKTohMDtjYXNlIDI3OnJldHVybiEoeXx8YmJ8fHgpfXJldHVybiB4JiYoZHx8ZXx8Zik/ITE6dmMoYSl9LHZjPWZ1bmN0aW9uKGEpe2lmKDQ4PD1hJiY1Nz49YXx8Cjk2PD1hJiYxMDY+PWF8fDY1PD1hJiY5MD49YXx8KHl8fGJiKSYmMD09YSlyZXR1cm4hMDtzd2l0Y2goYSl7Y2FzZSAzMjpjYXNlIDQzOmNhc2UgNjM6Y2FzZSA2NDpjYXNlIDEwNzpjYXNlIDEwOTpjYXNlIDExMDpjYXNlIDExMTpjYXNlIDE4NjpjYXNlIDU5OmNhc2UgMTg5OmNhc2UgMTg3OmNhc2UgNjE6Y2FzZSAxODg6Y2FzZSAxOTA6Y2FzZSAxOTE6Y2FzZSAxOTI6Y2FzZSAyMjI6Y2FzZSAyMTk6Y2FzZSAyMjA6Y2FzZSAyMjE6Y2FzZSAxNjM6Y2FzZSA1ODpyZXR1cm4hMDtjYXNlIDE3MzpyZXR1cm4geDtkZWZhdWx0OnJldHVybiExfX0sd2M9ZnVuY3Rpb24oYSl7aWYoeClhPXljKGEpO2Vsc2UgaWYoeiYmeSlzd2l0Y2goYSl7Y2FzZSA5MzphPTkxfXJldHVybiBhfSx5Yz1mdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSA2MTpyZXR1cm4gMTg3O2Nhc2UgNTk6cmV0dXJuIDE4NjtjYXNlIDE3MzpyZXR1cm4gMTg5O2Nhc2UgMjI0OnJldHVybiA5MTtjYXNlIDA6cmV0dXJuIDIyNDsKZGVmYXVsdDpyZXR1cm4gYX19O3ZhciBKPWZ1bmN0aW9uKGEsYil7SS5jYWxsKHRoaXMpO2EmJnpjKHRoaXMsYSxiKX07bihKLEkpO2g9Si5wcm90b3R5cGU7aC5TPW51bGw7aC5uYT1udWxsO2guQ2E9bnVsbDtoLm9hPW51bGw7aC53PS0xO2guRj0tMTtoLnVhPSExOwp2YXIgQWM9ezM6MTMsMTI6MTQ0LDYzMjMyOjM4LDYzMjMzOjQwLDYzMjM0OjM3LDYzMjM1OjM5LDYzMjM2OjExMiw2MzIzNzoxMTMsNjMyMzg6MTE0LDYzMjM5OjExNSw2MzI0MDoxMTYsNjMyNDE6MTE3LDYzMjQyOjExOCw2MzI0MzoxMTksNjMyNDQ6MTIwLDYzMjQ1OjEyMSw2MzI0NjoxMjIsNjMyNDc6MTIzLDYzMjQ4OjQ0LDYzMjcyOjQ2LDYzMjczOjM2LDYzMjc1OjM1LDYzMjc2OjMzLDYzMjc3OjM0LDYzMjg5OjE0NCw2MzMwMjo0NX0sQmM9e1VwOjM4LERvd246NDAsTGVmdDozNyxSaWdodDozOSxFbnRlcjoxMyxGMToxMTIsRjI6MTEzLEYzOjExNCxGNDoxMTUsRjU6MTE2LEY2OjExNyxGNzoxMTgsRjg6MTE5LEY5OjEyMCxGMTA6MTIxLEYxMToxMjIsRjEyOjEyMywiVSswMDdGIjo0NixIb21lOjM2LEVuZDozNSxQYWdlVXA6MzMsUGFnZURvd246MzQsSW5zZXJ0OjQ1fSxDYz0heXx8QSgiNTI1IiksRGM9eiYmeDsKSi5wcm90b3R5cGUuYT1mdW5jdGlvbihhKXtpZih5fHxiYilpZigxNz09dGhpcy53JiYhYS5jdHJsS2V5fHwxOD09dGhpcy53JiYhYS5hbHRLZXl8fHomJjkxPT10aGlzLncmJiFhLm1ldGFLZXkpdGhpcy5GPXRoaXMudz0tMTstMT09dGhpcy53JiYoYS5jdHJsS2V5JiYxNyE9YS5jP3RoaXMudz0xNzphLmFsdEtleSYmMTghPWEuYz90aGlzLnc9MTg6YS5tZXRhS2V5JiY5MSE9YS5jJiYodGhpcy53PTkxKSk7Q2MmJiF4YyhhLmMsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGEuYWx0S2V5LGEubWV0YUtleSk/dGhpcy5oYW5kbGVFdmVudChhKToodGhpcy5GPXdjKGEuYyksRGMmJih0aGlzLnVhPWEuYWx0S2V5KSl9O0oucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dGhpcy5GPXRoaXMudz0tMTt0aGlzLnVhPWEuYWx0S2V5fTsKSi5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5iLGM9Yi5hbHRLZXk7aWYodiYmImtleXByZXNzIj09YS50eXBlKXt2YXIgZD10aGlzLkY7dmFyIGU9MTMhPWQmJjI3IT1kP2Iua2V5Q29kZTowfWVsc2UoeXx8YmIpJiYia2V5cHJlc3MiPT1hLnR5cGU/KGQ9dGhpcy5GLGU9MDw9Yi5jaGFyQ29kZSYmNjMyMzI+Yi5jaGFyQ29kZSYmdmMoZCk/Yi5jaGFyQ29kZTowKTphYiYmIXk/KGQ9dGhpcy5GLGU9dmMoZCk/Yi5rZXlDb2RlOjApOigia2V5cHJlc3MiPT1hLnR5cGU/KERjJiYoYz10aGlzLnVhKSxiLmtleUNvZGU9PWIuY2hhckNvZGU/MzI+Yi5rZXlDb2RlPyhkPWIua2V5Q29kZSxlPTApOihkPXRoaXMuRixlPWIuY2hhckNvZGUpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkpOihkPWIua2V5Q29kZXx8dGhpcy5GLGU9Yi5jaGFyQ29kZXx8MCkseiYmNjM9PWUmJjIyND09ZCYmKGQ9MTkxKSk7dmFyIGY9ZD13YyhkKTtkPzYzMjMyPD0KZCYmZCBpbiBBYz9mPUFjW2RdOjI1PT1kJiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBCYyYmKGY9QmNbYi5rZXlJZGVudGlmaWVyXSk7eCYmQ2MmJiJrZXlwcmVzcyI9PWEudHlwZSYmIXhjKGYsdGhpcy53LGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KXx8KGE9Zj09dGhpcy53LHRoaXMudz1mLGI9bmV3IEVjKGYsZSxhLGIpLGIuYWx0S2V5PWMsdWModGhpcyxiKSl9O0oucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTsKdmFyIHpjPWZ1bmN0aW9uKGEsYixjKXthLm9hJiZGYyhhKTthLlM9YjthLm5hPWJjKGEuUywia2V5cHJlc3MiLGEsYyk7YS5DYT1iYyhhLlMsImtleWRvd24iLGEuYSxjLGEpO2Eub2E9YmMoYS5TLCJrZXl1cCIsYS5iLGMsYSl9LEZjPWZ1bmN0aW9uKGEpe2EubmEmJihrYyhhLm5hKSxrYyhhLkNhKSxrYyhhLm9hKSxhLm5hPW51bGwsYS5DYT1udWxsLGEub2E9bnVsbCk7YS5TPW51bGw7YS53PS0xO2EuRj0tMX07Si5wcm90b3R5cGUudT1mdW5jdGlvbigpe0ouaS51LmNhbGwodGhpcyk7RmModGhpcyl9O3ZhciBFYz1mdW5jdGlvbihhLGIsYyxkKXtHLmNhbGwodGhpcyxkKTt0aGlzLnR5cGU9ImtleSI7dGhpcy5jPWE7dGhpcy5yZXBlYXQ9Y307bihFYyxHKTt2YXIgR2M9eD8iTW96VXNlclNlbGVjdCI6eXx8YmI/IldlYmtpdFVzZXJTZWxlY3QiOm51bGwsSGM9ZnVuY3Rpb24oYSxiKXtiPWI/bnVsbDphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7aWYoR2Mpe3ZhciBjPSJub25lIjthLnN0eWxlJiYoYS5zdHlsZVtHY109Yyk7aWYoYil7YT0wO2Zvcih2YXIgZDtkPWJbYV07YSsrKWQuc3R5bGUmJihkLnN0eWxlW0djXT1jKX19ZWxzZSBpZih2fHxhYilpZihjPSJvbiIsYS5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyksYilmb3IoYT0wO2Q9YlthXTthKyspZC5zZXRBdHRyaWJ1dGUoInVuc2VsZWN0YWJsZSIsYyl9O3ZhciBJYz1mdW5jdGlvbigpe307ZGEoSWMpO0ljLnByb3RvdHlwZS5hPTA7dmFyIEs9ZnVuY3Rpb24oYSl7SS5jYWxsKHRoaXMpO3RoaXMuaj1hfHx4YXx8KHhhPW5ldyB1Yik7dGhpcy5xYT1KYzt0aGlzLlk9bnVsbDt0aGlzLm09ITE7dGhpcy5hPW51bGw7dGhpcy5BPXZvaWQgMDt0aGlzLmc9dGhpcy5jPXRoaXMuYj1udWxsO3RoaXMuR2E9ITF9O24oSyxJKTtLLnByb3RvdHlwZS5PYT1JYy5SKCk7CnZhciBKYz1udWxsLEtjPWZ1bmN0aW9uKGEsYil7c3dpdGNoKGEpe2Nhc2UgMTpyZXR1cm4gYj8iZGlzYWJsZSI6ImVuYWJsZSI7Y2FzZSAyOnJldHVybiBiPyJoaWdobGlnaHQiOiJ1bmhpZ2hsaWdodCI7Y2FzZSA0OnJldHVybiBiPyJhY3RpdmF0ZSI6ImRlYWN0aXZhdGUiO2Nhc2UgODpyZXR1cm4gYj8ic2VsZWN0IjoidW5zZWxlY3QiO2Nhc2UgMTY6cmV0dXJuIGI/ImNoZWNrIjoidW5jaGVjayI7Y2FzZSAzMjpyZXR1cm4gYj8iZm9jdXMiOiJibHVyIjtjYXNlIDY0OnJldHVybiBiPyJvcGVuIjoiY2xvc2UifXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBzdGF0ZSIpO30sTGM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuWXx8KGEuWT0iOiIrKGEuT2EuYSsrKS50b1N0cmluZygzNikpfSxNYz1mdW5jdGlvbihhLGIpe2lmKGEuYiYmYS5iLmcpe3ZhciBjPWEuYi5nLGQ9YS5ZO2QgaW4gYyYmZGVsZXRlIGNbZF07cWEoYS5iLmcsYixhKX1hLlk9Yn07Sy5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9Owp2YXIgTmM9ZnVuY3Rpb24oYSl7YT1hLmE7cShhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cmV0dXJuIGF9LE9jPWZ1bmN0aW9uKGEpe2EuQXx8KGEuQT1uZXcgb2MoYSkpO3JldHVybiBxKGEuQSl9O0sucHJvdG90eXBlLnJhPWZ1bmN0aW9uKGEpe2lmKHRoaXMuYiYmdGhpcy5iIT1hKXRocm93IEVycm9yKCJNZXRob2Qgbm90IHN1cHBvcnRlZCIpO0suaS5yYS5jYWxsKHRoaXMsYSl9O0sucHJvdG90eXBlLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPW5iKHRoaXMuai5hLCJESVYiKX07CnZhciBQYz1mdW5jdGlvbihhLGIpe2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiJiZhLnhhKGIpKXthLkdhPSEwO3ZhciBjPXFiKGIpO2EuaiYmYS5qLmE9PWN8fChhLmo9Yj9uZXcgdWIocWIoYikpOnhhfHwoeGE9bmV3IHViKSk7YS52YShiKTthLkQoKX1lbHNlIHRocm93IEVycm9yKCJJbnZhbGlkIGVsZW1lbnQgdG8gZGVjb3JhdGUiKTt9O2g9Sy5wcm90b3R5cGU7aC54YT1mdW5jdGlvbigpe3JldHVybiEwfTtoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hfTtoLkQ9ZnVuY3Rpb24oKXt0aGlzLm09ITA7UWModGhpcyxmdW5jdGlvbihhKXshYS5tJiZhLmYoKSYmYS5EKCl9KX07aC5QPWZ1bmN0aW9uKCl7UWModGhpcyxmdW5jdGlvbihhKXthLm0mJmEuUCgpfSk7dGhpcy5BJiZyYyh0aGlzLkEpO3RoaXMubT0hMX07CmgudT1mdW5jdGlvbigpe3RoaXMubSYmdGhpcy5QKCk7dGhpcy5BJiYodGhpcy5BLk4oKSxkZWxldGUgdGhpcy5BKTtRYyh0aGlzLGZ1bmN0aW9uKGEpe2EuTigpfSk7IXRoaXMuR2EmJnRoaXMuYSYmb2IodGhpcy5hKTt0aGlzLmI9dGhpcy5hPXRoaXMuZz10aGlzLmM9bnVsbDtLLmkudS5jYWxsKHRoaXMpfTtoLnNhPWZ1bmN0aW9uKGEsYil7dGhpcy50YShhLFJjKHRoaXMpLGIpfTsKaC50YT1mdW5jdGlvbihhLGIsYyl7cSghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLm0mJihjfHwhdGhpcy5tKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZigwPmJ8fGI+UmModGhpcykpdGhyb3cgRXJyb3IoIkNoaWxkIGNvbXBvbmVudCBpbmRleCBvdXQgb2YgYm91bmRzIik7dGhpcy5nJiZ0aGlzLmN8fCh0aGlzLmc9e30sdGhpcy5jPVtdKTtpZihhLmI9PXRoaXMpe3ZhciBkPUxjKGEpO3RoaXMuZ1tkXT1hO0hhKHRoaXMuYyxhKX1lbHNlIHFhKHRoaXMuZyxMYyhhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuYiYmYS5ZKXt2YXIgZT1hLmI7ZD1hLlk7ZS5nJiZkPyhlPWUuZyxkPShudWxsIT09ZSYmZCBpbiBlP2VbZF06dm9pZCAwKXx8bnVsbCk6ZD1udWxsfWlmKGQmJmEuYiE9dGhpcyl0aHJvdyBFcnJvcigiVW5hYmxlIHRvIHNldCBwYXJlbnQgY29tcG9uZW50Iik7CmEuYj10aGlzO0suaS5yYS5jYWxsKGEsdGhpcyk7TGEodGhpcy5jLGIsMCxhKTtpZihhLm0mJnRoaXMubSYmYS5iPT10aGlzKWM9dGhpcy5qYSgpLGI9Yy5jaGlsZE5vZGVzW2JdfHxudWxsLGIhPWEuZigpJiZjLmluc2VydEJlZm9yZShhLmYoKSxiKTtlbHNlIGlmKGMpe3RoaXMuYXx8dGhpcy5pYSgpO2M9TCh0aGlzLGIrMSk7Yj10aGlzLmphKCk7Yz1jP2MuYTpudWxsO2lmKGEubSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTthLmF8fGEuaWEoKTtiP2IuaW5zZXJ0QmVmb3JlKGEuYSxjfHxudWxsKTphLmouYS5ib2R5LmFwcGVuZENoaWxkKGEuYSk7YS5iJiYhYS5iLm18fGEuRCgpfWVsc2UgdGhpcy5tJiYhYS5tJiZhLmEmJmEuYS5wYXJlbnROb2RlJiYxPT1hLmEucGFyZW50Tm9kZS5ub2RlVHlwZSYmYS5EKCl9O2guamE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hfTsKdmFyIFNjPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEucWEpe3ZhciBiPWEubT9hLmE6YS5qLmEuYm9keTthOnt2YXIgYz1xYihiKTtpZihjLmRlZmF1bHRWaWV3JiZjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihjPWMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpKSl7Yz1jLmRpcmVjdGlvbnx8Yy5nZXRQcm9wZXJ0eVZhbHVlKCJkaXJlY3Rpb24iKXx8IiI7YnJlYWsgYX1jPSIifWEucWE9InJ0bCI9PShjfHwoYi5jdXJyZW50U3R5bGU/Yi5jdXJyZW50U3R5bGUuZGlyZWN0aW9uOm51bGwpfHxiLnN0eWxlJiZiLnN0eWxlLmRpcmVjdGlvbil9cmV0dXJuIGEucWF9LFJjPWZ1bmN0aW9uKGEpe3JldHVybiBhLmM/YS5jLmxlbmd0aDowfSxMPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuYz9hLmNbYl18fG51bGw6bnVsbH0sUWM9ZnVuY3Rpb24oYSxiLGMpe2EuYyYmcihhLmMsYixjKX0sVGM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jJiZiP0RhKGEuYyxiKTotMX07dmFyIFZjPWZ1bmN0aW9uKGEsYil7aWYoIWEpdGhyb3cgRXJyb3IoIkludmFsaWQgY2xhc3MgbmFtZSAiK2EpO2lmKCFpYShiKSl0aHJvdyBFcnJvcigiSW52YWxpZCBkZWNvcmF0b3IgZnVuY3Rpb24gIitiKTtVY1thXT1ifSxXYz17fSxVYz17fTt2YXIgWGM9ZnVuY3Rpb24oYSl7dGhpcy5oPWF9O2RhKFhjKTt2YXIgWWM9ZnVuY3Rpb24oYSxiKXthJiYoYS50YWJJbmRleD1iPzA6LTEpfSwkYz1mdW5jdGlvbihhLGIsYyl7Yy5pZCYmTWMoYixjLmlkKTt2YXIgZD1hLmIoKSxlPSExLGY9RChjKTtmJiZyKGYsZnVuY3Rpb24oZyl7Zz09ZD9lPSEwOmcmJnRoaXMuZyhiLGcsZCl9LGEpO2V8fEViKGMsZCk7WmMoYixjKTtyZXR1cm4gY307WGMucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiLGMpe2I9PWMrIi1kaXNhYmxlZCI/YS5aKCExKTpiPT1jKyItaG9yaXpvbnRhbCI/YWQoYSwiaG9yaXpvbnRhbCIpOmI9PWMrIi12ZXJ0aWNhbCImJmFkKGEsInZlcnRpY2FsIil9Owp2YXIgWmM9ZnVuY3Rpb24oYSxiKXtpZihiKWZvcih2YXIgYz1iLmZpcnN0Q2hpbGQsZDtjJiZjLnBhcmVudE5vZGU9PWI7KXtkPWMubmV4dFNpYmxpbmc7aWYoMT09Yy5ub2RlVHlwZSl7YTp7dmFyIGU9YztxKGUpO2U9RChlKTtmb3IodmFyIGY9MCxnPWUubGVuZ3RoO2Y8ZztmKyspe3ZhciBrPWVbZl07aWYoaz1rIGluIFVjP1VjW2tdKCk6bnVsbCl7ZT1rO2JyZWFrIGF9fWU9bnVsbH1lJiYoZS5hPWMsYS5pc0VuYWJsZWQoKXx8ZS5aKCExKSxhLnNhKGUpLFBjKGUsYykpfWVsc2UgYy5ub2RlVmFsdWUmJiIiIT1NYShjLm5vZGVWYWx1ZSl8fGIucmVtb3ZlQ2hpbGQoYyk7Yz1kfX0sYmQ9ZnVuY3Rpb24oYSxiKXtiPWIuZigpO3EoYiwiVGhlIGNvbnRhaW5lciBET00gZWxlbWVudCBjYW5ub3QgYmUgbnVsbC4iKTtIYyhiLHgpO3YmJihiLmhpZGVGb2N1cz0hMCk7KGE9YS5oKSYmdmIoYixhKX07WGMucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKWGMucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5iKCksYz1bYiwiaG9yaXpvbnRhbCI9PWEuSD9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgTT1mdW5jdGlvbigpe30sY2Q7ZGEoTSk7dmFyIGRkPXtidXR0b246InByZXNzZWQiLGNoZWNrYm94OiJjaGVja2VkIixtZW51aXRlbToic2VsZWN0ZWQiLG1lbnVpdGVtY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtcmFkaW86ImNoZWNrZWQiLHJhZGlvOiJjaGVja2VkIix0YWI6InNlbGVjdGVkIix0cmVlaXRlbToic2VsZWN0ZWQifTtNLnByb3RvdHlwZS5oPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLmouYigiRElWIixlZCh0aGlzLGEpLmpvaW4oIiAiKSxhLmJhKX07dmFyIGdkPWZ1bmN0aW9uKGEsYixjKXtpZihhPWEuZj9hLmYoKTphKXt2YXIgZD1bYl07diYmIUEoIjciKSYmKGQ9ZmQoRChhKSxiKSxkLnB1c2goYikpOyhjP0ZiOkhiKShhLGQpfX07Ck0ucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiKXtiLmlkJiZNYyhhLGIuaWQpO2ImJmIuZmlyc3RDaGlsZD9oZChhLGIuZmlyc3RDaGlsZC5uZXh0U2libGluZz9KYShiLmNoaWxkTm9kZXMpOmIuZmlyc3RDaGlsZCk6YS5iYT1udWxsO3ZhciBjPTAsZD10aGlzLmEoKSxlPXRoaXMuYSgpLGY9ITEsZz0hMSxrPSExLHA9SmEoRChiKSk7cihwLGZ1bmN0aW9uKEIpe2Z8fEIhPWQ/Z3x8QiE9ZT9jfD1pZCh0aGlzLEIpOmc9ITA6KGY9ITAsZT09ZCYmKGc9ITApKTsxPT1pZCh0aGlzLEIpJiYoQWEoYiksc2IoYikmJnRiKGIpJiZyYihiLCExKSl9LHRoaXMpO2Eubz1jO2Z8fChwLnB1c2goZCksZT09ZCYmKGc9ITApKTtnfHxwLnB1c2goZSk7KGE9YS53YSkmJnAucHVzaC5hcHBseShwLGEpO2lmKHYmJiFBKCI3Iikpe3ZhciB3PWZkKHApOzA8dy5sZW5ndGgmJihwLnB1c2guYXBwbHkocCx3KSxrPSEwKX1mJiZnJiYhYSYmIWt8fENiKGIscC5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIGpkPWZ1bmN0aW9uKGEsYil7aWYoYT1hLmgoKSl7cShiLCJUaGUgZWxlbWVudCBwYXNzZWQgYXMgYSBmaXJzdCBwYXJhbWV0ZXIgY2Fubm90IGJlIG51bGwuIik7dmFyIGM9Yi5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDthIT1jJiZ2YihiLGEpfX0sa2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYztpZihhLnYmMzImJihjPWEuZigpKSl7aWYoIWImJmEubyYzMil7dHJ5e2MuYmx1cigpfWNhdGNoKGQpe31hLm8mMzImJmEuRmEobnVsbCl9KHNiKGMpJiZ0YihjKSkhPWImJnJiKGMsYil9fSxsZD1mdW5jdGlvbihhLGIsYyl7Y2R8fChjZD17MToiZGlzYWJsZWQiLDg6InNlbGVjdGVkIiwxNjoiY2hlY2tlZCIsNjQ6ImV4cGFuZGVkIn0pO3EoYSwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO2I9Y2RbYl07dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoInJvbGUiKXx8bnVsbDtkJiYoZD1kZFtkXXx8YixiPSJjaGVja2VkIj09Ynx8InNlbGVjdGVkIj09CmI/ZDpiKTtiJiZ4YihhLGIsYyl9O00ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250cm9sIn07CnZhciBlZD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuYSgpLGQ9W2NdLGU9YS5hKCk7ZSE9YyYmZC5wdXNoKGUpO2M9Yi5vO2ZvcihlPVtdO2M7KXt2YXIgZj1jJi1jO2UucHVzaChtZChhLGYpKTtjJj1+Zn1kLnB1c2guYXBwbHkoZCxlKTsoYT1iLndhKSYmZC5wdXNoLmFwcGx5KGQsYSk7diYmIUEoIjciKSYmZC5wdXNoLmFwcGx5KGQsZmQoZCkpO3JldHVybiBkfSxmZD1mdW5jdGlvbihhLGIpe3ZhciBjPVtdO2ImJihhPUlhKGEsW2JdKSk7cihbXSxmdW5jdGlvbihkKXshRmEoZCxsYShHYSxhKSl8fGImJiFHYShkLGIpfHxjLnB1c2goZC5qb2luKCJfIikpfSk7cmV0dXJuIGN9LG1kPWZ1bmN0aW9uKGEsYil7YS5ifHxuZChhKTtyZXR1cm4gYS5iW2JdfSxpZD1mdW5jdGlvbihhLGIpe2Euanx8KGEuYnx8bmQoYSksYS5qPXNhKGEuYikpO2E9cGFyc2VJbnQoYS5qW2JdLDEwKTtyZXR1cm4gaXNOYU4oYSk/MDphfSxuZD1mdW5jdGlvbihhKXt2YXIgYj1hLmEoKSxjPSF0KGIucmVwbGFjZSgvXHhhMHxccy9nLAoiICIpLCIgIik7cShjLCJDb250cm9sUmVuZGVyZXIgaGFzIGFuIGludmFsaWQgY3NzIGNsYXNzOiAnIitiKyInIik7YS5iPXsxOmIrIi1kaXNhYmxlZCIsMjpiKyItaG92ZXIiLDQ6YisiLWFjdGl2ZSIsODpiKyItc2VsZWN0ZWQiLDE2OmIrIi1jaGVja2VkIiwzMjpiKyItZm9jdXNlZCIsNjQ6YisiLW9wZW4ifX07dmFyIE49ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO2lmKCFiKXtiPXRoaXMuY29uc3RydWN0b3I7Zm9yKHZhciBkO2I7KXtkPWJbamFdfHwoYltqYV09KytrYSk7aWYoZD1XY1tkXSlicmVhaztiPWIuaT9iLmkuY29uc3RydWN0b3I6bnVsbH1iPWQ/aWEoZC5SKT9kLlIoKTpuZXcgZDpudWxsfXRoaXMuQj1iO3RoaXMuYmE9dm9pZCAwIT09YT9hOm51bGx9O24oTixLKTtoPU4ucHJvdG90eXBlO2guYmE9bnVsbDtoLm89MDtoLnY9Mzk7aC5LPTA7aC5JYT0hMDtoLndhPW51bGw7aC55YT0hMDtoLmlhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CLmModGhpcyk7dGhpcy5hPWE7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmeGIoYSwiaGlkZGVuIiwhMCkpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpoLnZhPWZ1bmN0aW9uKGEpe3RoaXMuYT1hPXRoaXMuQi5nKHRoaXMsYSk7amQodGhpcy5CLGEpO0hjKGEsIXYmJiFhYik7dGhpcy5JYT0ibm9uZSIhPWEuc3R5bGUuZGlzcGxheX07CmguRD1mdW5jdGlvbigpe04uaS5ELmNhbGwodGhpcyk7dmFyIGE9TmModGhpcyk7cSh0aGlzKTtxKGEpO3RoaXMuaXNWaXNpYmxlKCl8fHhiKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fGxkKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy52JjgmJmxkKGEsOCwhISh0aGlzLm8mOCkpO3RoaXMudiYxNiYmbGQoYSwxNiwhISh0aGlzLm8mMTYpKTt0aGlzLnYmNjQmJmxkKGEsNjQsISEodGhpcy5vJjY0KSk7YT10aGlzLkI7U2ModGhpcykmJmdkKHRoaXMuZigpLGEuYSgpKyItcnRsIiwhMCk7dGhpcy5pc0VuYWJsZWQoKSYma2QodGhpcyx0aGlzLmlzVmlzaWJsZSgpKTtpZih0aGlzLnYmLTImJih0aGlzLnlhJiZvZCh0aGlzLCEwKSx0aGlzLnYmMzImJihhPXRoaXMuZigpKSkpe3ZhciBiPXRoaXMuV3x8KHRoaXMuVz1uZXcgSik7emMoYixhKTtIKEgoSChPYyh0aGlzKSxiLCJrZXkiLHRoaXMuZmEpLGEsImZvY3VzIix0aGlzLk5hKSxhLCJibHVyIiwKdGhpcy5GYSl9fTt2YXIgb2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYz1PYyhhKSxkPWEuZigpO2I/KEgoSChIKEgoYyxkLEYuTCxhLmthKSxkLFtGLk0sRi5hYV0sYS5sYSksZCwibW91c2VvdmVyIixhLkFhKSxkLCJtb3VzZW91dCIsYS56YSksYS5lYSE9Y2EmJkgoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fEgoYyxkLCJkYmxjbGljayIsYS5KYSksYS5nYXx8KGEuZ2E9bmV3IHBkKGEpLHpiKGEsbGEoQWIsYS5nYSkpKSkpOihxYyhxYyhxYyhxYyhjLGQsRi5MLGEua2EpLGQsW0YuTSxGLmFhXSxhLmxhKSxkLCJtb3VzZW92ZXIiLGEuQWEpLGQsIm1vdXNlb3V0IixhLnphKSxhLmVhIT1jYSYmcWMoYyxkLCJjb250ZXh0bWVudSIsYS5lYSksdiYmKEEoOSl8fHFjKGMsZCwiZGJsY2xpY2siLGEuSmEpLEFiKGEuZ2EpLGEuZ2E9bnVsbCkpfTsKTi5wcm90b3R5cGUuUD1mdW5jdGlvbigpe04uaS5QLmNhbGwodGhpcyk7dGhpcy5XJiZGYyh0aGlzLlcpO3RoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJmtkKHRoaXMsITEpfTtOLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7Ti5pLnUuY2FsbCh0aGlzKTt0aGlzLlcmJih0aGlzLlcuTigpLGRlbGV0ZSB0aGlzLlcpO2RlbGV0ZSB0aGlzLkI7dGhpcy5nYT10aGlzLndhPXRoaXMuYmE9bnVsbH07dmFyIGhkPWZ1bmN0aW9uKGEsYil7YS5iYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm8mMSl9OwpOLnByb3RvdHlwZS5aPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYjtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0VuYWJsZWQmJiFiLmlzRW5hYmxlZCgpfHwhTyh0aGlzLDEsIWEpfHwoYXx8KHFkKHRoaXMsITEpLFAodGhpcywhMSkpLHRoaXMuaXNWaXNpYmxlKCkmJmtkKHRoaXMsYSksUSh0aGlzLDEsIWEsITApKX07CnZhciBQPWZ1bmN0aW9uKGEsYil7TyhhLDIsYikmJlEoYSwyLGIpfSxxZD1mdW5jdGlvbihhLGIpe08oYSw0LGIpJiZRKGEsNCxiKX0scmQ9ZnVuY3Rpb24oYSxiKXtPKGEsOCxiKSYmUShhLDgsYil9LHNkPWZ1bmN0aW9uKGEsYil7TyhhLDY0LGIpJiZRKGEsNjQsYil9LFE9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIWQmJjE9PWIpYS5aKCFjKTtlbHNlIGlmKGEudiZiJiZjIT0hIShhLm8mYikpe3ZhciBlPWEuQjtpZihkPWEuZigpKShlPW1kKGUsYikpJiZnZChhLGUsYyksbGQoZCxiLGMpO2Eubz1jP2Eub3xiOmEubyZ+Yn19LHRkPWZ1bmN0aW9uKGEsYixjKXtpZihhLm0mJmEubyZiJiYhYyl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTshYyYmYS5vJmImJlEoYSxiLCExKTthLnY9Yz9hLnZ8YjphLnYmfmJ9LFI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hISgyNTUmYikmJiEhKGEudiZiKX0sTz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuISEoYS52JmIpJiYhIShhLm8mCmIpIT1jJiYoIShhLksmYil8fHVjKGEsS2MoYixjKSkpJiYhYS5VfTtoPU4ucHJvdG90eXBlO2guQWE9ZnVuY3Rpb24oYSl7KCFhLnJlbGF0ZWRUYXJnZXR8fCFwYih0aGlzLmYoKSxhLnJlbGF0ZWRUYXJnZXQpKSYmdWModGhpcywiZW50ZXIiKSYmdGhpcy5pc0VuYWJsZWQoKSYmUih0aGlzLDIpJiZQKHRoaXMsITApfTtoLnphPWZ1bmN0aW9uKGEpe2EucmVsYXRlZFRhcmdldCYmcGIodGhpcy5mKCksYS5yZWxhdGVkVGFyZ2V0KXx8IXVjKHRoaXMsImxlYXZlIil8fChSKHRoaXMsNCkmJnFkKHRoaXMsITEpLFIodGhpcywyKSYmUCh0aGlzLCExKSl9O2guZWE9Y2E7Cmgua2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSxPYihhKSYmISh5JiZ6JiZhLmN0cmxLZXkpKSl7Uih0aGlzLDQpJiZxZCh0aGlzLCEwKTt2YXIgYjtpZihiPXRoaXMuQil7dmFyIGM7Yj10aGlzLnYmMzImJihjPXRoaXMuZigpKT9zYihjKSYmdGIoYyk6ITF9YiYmdGhpcy5mKCkuZm9jdXMoKX0hT2IoYSl8fHkmJnomJmEuY3RybEtleXx8YS5nKCl9O2gubGE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmKFIodGhpcywyKSYmUCh0aGlzLCEwKSx0aGlzLm8mNCYmdWQodGhpcyxhKSYmUih0aGlzLDQpJiZxZCh0aGlzLCExKSl9O2guSmE9ZnVuY3Rpb24oYSl7dGhpcy5pc0VuYWJsZWQoKSYmdWQodGhpcyxhKX07CnZhciB1ZD1mdW5jdGlvbihhLGIpe2lmKFIoYSwxNikpe3ZhciBjPSEoYS5vJjE2KTtPKGEsMTYsYykmJlEoYSwxNixjKX1SKGEsOCkmJnJkKGEsITApO1IoYSw2NCkmJnNkKGEsIShhLm8mNjQpKTtjPW5ldyBFKCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuQT1iLkEpO3JldHVybiB1YyhhLGMpfTtOLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe1IodGhpcywzMikmJk8odGhpcywzMiwhMCkmJlEodGhpcywzMiwhMCl9O04ucHJvdG90eXBlLkZhPWZ1bmN0aW9uKCl7Uih0aGlzLDQpJiZxZCh0aGlzLCExKTtSKHRoaXMsMzIpJiZPKHRoaXMsMzIsITEpJiZRKHRoaXMsMzIsITEpfTsKTi5wcm90b3R5cGUuZmE9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXNWaXNpYmxlKCkmJnRoaXMuaXNFbmFibGVkKCkmJjEzPT1hLmMmJnVkKHRoaXMsYSk/KGEuZygpLGEuaigpLCEwKTohMX07aWYoIWlhKE4pKXRocm93IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCBjbGFzcyAiK04pO2lmKCFpYShNKSl0aHJvdyBFcnJvcigiSW52YWxpZCByZW5kZXJlciBjbGFzcyAiK00pO3ZhciB2ZD1OW2phXXx8KE5bamFdPSsra2EpO1djW3ZkXT1NO1ZjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIHBkPWZ1bmN0aW9uKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmI9YTt0aGlzLmE9ITE7dGhpcy5jPW5ldyBvYyh0aGlzKTt6Yih0aGlzLGxhKEFiLHRoaXMuYykpO2E9TmModGhpcy5iKTtIKEgoSCh0aGlzLmMsYSxGLkwsdGhpcy5oKSxhLEYuTSx0aGlzLmopLGEsImNsaWNrIix0aGlzLmcpfTtuKHBkLEMpO3ZhciB3ZD0hdnx8OTw9TnVtYmVyKGliKTsKcGQucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXt0aGlzLmE9ITF9O3BkLnByb3RvdHlwZS5qPWZ1bmN0aW9uKCl7dGhpcy5hPSEwfTt2YXIgeGQ9ZnVuY3Rpb24oYSxiKXtpZighd2QpcmV0dXJuIGEuYnV0dG9uPTAsYS50eXBlPWIsYTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudHMiKTtjLmluaXRNb3VzZUV2ZW50KGIsYS5idWJibGVzLGEuY2FuY2VsYWJsZSxhLnZpZXd8fG51bGwsYS5kZXRhaWwsYS5zY3JlZW5YLGEuc2NyZWVuWSxhLmNsaWVudFgsYS5jbGllbnRZLGEuY3RybEtleSxhLmFsdEtleSxhLnNoaWZ0S2V5LGEubWV0YUtleSwwLGEucmVsYXRlZFRhcmdldHx8bnVsbCk7cmV0dXJuIGN9OwpwZC5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXtpZih0aGlzLmEpdGhpcy5hPSExO2Vsc2V7dmFyIGI9YS5iLGM9Yi5idXR0b24sZD1iLnR5cGUsZT14ZChiLCJtb3VzZWRvd24iKTt0aGlzLmIua2EobmV3IEcoZSxhLmEpKTtlPXhkKGIsIm1vdXNldXAiKTt0aGlzLmIubGEobmV3IEcoZSxhLmEpKTt3ZHx8KGIuYnV0dG9uPWMsYi50eXBlPWQpfX07cGQucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt0aGlzLmI9bnVsbDtwZC5pLnUuY2FsbCh0aGlzKX07dmFyIFM9ZnVuY3Rpb24oYSxiLGMpe0suY2FsbCh0aGlzLGMpO3RoaXMuZGE9Ynx8WGMuUigpO3RoaXMuSD1hfHwidmVydGljYWwifTtuKFMsSyk7aD1TLnByb3RvdHlwZTtoLkRhPW51bGw7aC5jYT1udWxsO2guZGE9bnVsbDtoLkg9bnVsbDtoLlQ9ITA7aC5PPSEwO2gubD0tMTtoLnM9bnVsbDtoLlY9ITE7aC5JPW51bGw7dmFyIHlkPWZ1bmN0aW9uKGEpe3JldHVybiBhLkRhfHxhLmYoKX07aD1TLnByb3RvdHlwZTtoLmlhPWZ1bmN0aW9uKCl7dGhpcy5hPXRoaXMuai5iKCJESVYiLHRoaXMuZGEuYyh0aGlzKS5qb2luKCIgIikpfTtoLmphPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZigpfTtoLnhhPWZ1bmN0aW9uKGEpe3JldHVybiJESVYiPT1hLnRhZ05hbWV9O2gudmE9ZnVuY3Rpb24oYSl7dGhpcy5hPSRjKHRoaXMuZGEsdGhpcyxhKTsibm9uZSI9PWEuc3R5bGUuZGlzcGxheSYmKHRoaXMuVD0hMSl9OwpoLkQ9ZnVuY3Rpb24oKXtTLmkuRC5jYWxsKHRoaXMpO1FjKHRoaXMsZnVuY3Rpb24oYil7Yi5tJiZ6ZCh0aGlzLGIpfSx0aGlzKTt2YXIgYT10aGlzLmYoKTtiZCh0aGlzLmRhLHRoaXMpO0FkKHRoaXMsdGhpcy5UKTtIKEgoSChIKEgoSChIKEgoT2ModGhpcyksdGhpcywiZW50ZXIiLHRoaXMuV2EpLHRoaXMsImhpZ2hsaWdodCIsdGhpcy5YYSksdGhpcywidW5oaWdobGlnaHQiLHRoaXMuY2IpLHRoaXMsIm9wZW4iLHRoaXMuWWEpLHRoaXMsImNsb3NlIix0aGlzLlVhKSxhLEYuTCx0aGlzLlNhKSxxYihhKSxbRi5NLEYuYWFdLHRoaXMuVmEpLGEsW0YuTCxGLk0sRi5hYSwibW91c2VvdmVyIiwibW91c2VvdXQiLCJjb250ZXh0bWVudSJdLHRoaXMuVGEpO0JkKHRoaXMpfTt2YXIgQmQ9ZnVuY3Rpb24oYSl7dmFyIGI9T2MoYSksYz15ZChhKTtIKEgoSChiLGMsImZvY3VzIixhLkhhKSxjLCJibHVyIixhLlFhKSxhLmNhfHwoYS5jYT1uZXcgSih5ZChhKSkpLCJrZXkiLGEuUmEpfTtoPVMucHJvdG90eXBlOwpoLlA9ZnVuY3Rpb24oKXtDZCh0aGlzLC0xKTt0aGlzLnMmJnNkKHRoaXMucywhMSk7dGhpcy5WPSExO1MuaS5QLmNhbGwodGhpcyl9O2gudT1mdW5jdGlvbigpe1MuaS51LmNhbGwodGhpcyk7dGhpcy5jYSYmKHRoaXMuY2EuTigpLHRoaXMuY2E9bnVsbCk7dGhpcy5kYT10aGlzLnM9dGhpcy5JPXRoaXMuRGE9bnVsbH07aC5XYT1mdW5jdGlvbigpe3JldHVybiEwfTsKaC5YYT1mdW5jdGlvbihhKXt2YXIgYj1UYyh0aGlzLGEudGFyZ2V0KTtpZigtMTxiJiZiIT10aGlzLmwpe3ZhciBjPUwodGhpcyx0aGlzLmwpO2MmJlAoYywhMSk7dGhpcy5sPWI7Yz1MKHRoaXMsdGhpcy5sKTt0aGlzLlYmJnFkKGMsITApO3RoaXMucyYmYyE9dGhpcy5zJiYoYy52JjY0P3NkKGMsITApOnNkKHRoaXMucywhMSkpfWI9dGhpcy5mKCk7cShiLCJUaGUgRE9NIGVsZW1lbnQgZm9yIHRoZSBjb250YWluZXIgY2Fubm90IGJlIG51bGwuIik7bnVsbCE9YS50YXJnZXQuZigpJiZ4YihiLCJhY3RpdmVkZXNjZW5kYW50IixhLnRhcmdldC5mKCkuaWQpfTtoLmNiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT1MKHRoaXMsdGhpcy5sKSYmKHRoaXMubD0tMSk7YT10aGlzLmYoKTtxKGEsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnJlbW92ZUF0dHJpYnV0ZSh3YigiYWN0aXZlZGVzY2VuZGFudCIpKX07CmguWWE9ZnVuY3Rpb24oYSl7KGE9YS50YXJnZXQpJiZhIT10aGlzLnMmJmEuYj09dGhpcyYmKHRoaXMucyYmc2QodGhpcy5zLCExKSx0aGlzLnM9YSl9O2guVWE9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMucyYmKHRoaXMucz1udWxsKTt2YXIgYj10aGlzLmYoKSxjPWEudGFyZ2V0LmYoKTtiJiZhLnRhcmdldC5vJjImJmMmJihhPSIiLGMmJihhPWMuaWQscShhLCJUaGUgYWN0aXZlIGVsZW1lbnQgc2hvdWxkIGhhdmUgYW4gaWQuIikpLHhiKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEpKX07aC5TYT1mdW5jdGlvbihhKXt0aGlzLk8mJih0aGlzLlY9ITApO3ZhciBiPXlkKHRoaXMpO2ImJnNiKGIpJiZ0YihiKT9iLmZvY3VzKCk6YS5nKCl9O2guVmE9ZnVuY3Rpb24oKXt0aGlzLlY9ITF9OwpoLlRhPWZ1bmN0aW9uKGEpe2E6e3ZhciBiPWEudGFyZ2V0O2lmKHRoaXMuSSlmb3IodmFyIGM9dGhpcy5mKCk7YiYmYiE9PWM7KXt2YXIgZD1iLmlkO2lmKGQgaW4gdGhpcy5JKXtiPXRoaXMuSVtkXTticmVhayBhfWI9Yi5wYXJlbnROb2RlfWI9bnVsbH1pZihiKXN3aXRjaChhLnR5cGUpe2Nhc2UgRi5MOmIua2EoYSk7YnJlYWs7Y2FzZSBGLk06Y2FzZSBGLmFhOmIubGEoYSk7YnJlYWs7Y2FzZSAibW91c2VvdmVyIjpiLkFhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3V0IjpiLnphKGEpO2JyZWFrO2Nhc2UgImNvbnRleHRtZW51IjpiLmVhKGEpfX07aC5IYT1mdW5jdGlvbigpe307aC5RYT1mdW5jdGlvbigpe0NkKHRoaXMsLTEpO3RoaXMuVj0hMTt0aGlzLnMmJnNkKHRoaXMucywhMSl9OwpoLlJhPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmlzRW5hYmxlZCgpJiZ0aGlzLmlzVmlzaWJsZSgpJiYoMCE9UmModGhpcyl8fHRoaXMuRGEpJiZEZCh0aGlzLGEpPyhhLmcoKSxhLmooKSwhMCk6ITF9Owp2YXIgRGQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1MKGEsYS5sKTtpZihjJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5mYSYmYy5mYShiKXx8YS5zJiZhLnMhPWMmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLnMuZmEmJmEucy5mYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuYyl7Y2FzZSAyNzp5ZChhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpFZChhKTticmVhaztjYXNlIDM1OkZkKGEpO2JyZWFrO2Nhc2UgMzg6aWYoInZlcnRpY2FsIj09YS5IKUdkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9IZChhKTpHZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoInZlcnRpY2FsIj09YS5IKUhkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZigiaG9yaXpvbnRhbCI9PWEuSClTYyhhKT9HZChhKTpIZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSx6ZD1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZigpO2M9Yy5pZHx8KGMuaWQ9TGMoYikpO2EuSXx8KGEuST17fSk7YS5JW2NdPWJ9O1MucHJvdG90eXBlLnNhPWZ1bmN0aW9uKGEsYil7Q2EoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtTLmkuc2EuY2FsbCh0aGlzLGEsYil9O1MucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEsYixjKXtDYShhLE4pO2EuS3w9MjthLkt8PTY0O3RkKGEsMzIsITEpO2EubSYmMCE9YS55YSYmb2QoYSwhMSk7YS55YT0hMTt2YXIgZD1hLmI9PXRoaXM/VGModGhpcyxhKTotMTtTLmkudGEuY2FsbCh0aGlzLGEsYixjKTthLm0mJnRoaXMubSYmemQodGhpcyxhKTthPWQ7LTE9PWEmJihhPVJjKHRoaXMpKTthPT10aGlzLmw/dGhpcy5sPU1hdGgubWluKFJjKHRoaXMpLTEsYik6YT50aGlzLmwmJmI8PXRoaXMubD90aGlzLmwrKzphPHRoaXMubCYmYj50aGlzLmwmJnRoaXMubC0tfTsKdmFyIGFkPWZ1bmN0aW9uKGEsYil7aWYoYS5mKCkpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5IPWJ9O1MucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O3ZhciBBZD1mdW5jdGlvbihhLGIpe2EuVD1iO3ZhciBjPWEuZigpO2MmJihjLnN0eWxlLmRpc3BsYXk9Yj8iIjoibm9uZSIsWWMoeWQoYSksYS5PJiZhLlQpKX07Uy5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT307Uy5wcm90b3R5cGUuWj1mdW5jdGlvbihhKXt0aGlzLk8hPWEmJnVjKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5PPSEwLFFjKHRoaXMsZnVuY3Rpb24oYil7Yi5MYT9kZWxldGUgYi5MYTpiLlooITApfSkpOihRYyh0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5aKCExKTpiLkxhPSEwfSksdGhpcy5WPXRoaXMuTz0hMSksWWMoeWQodGhpcyksYSYmdGhpcy5UKSl9Owp2YXIgQ2Q9ZnVuY3Rpb24oYSxiKXsoYj1MKGEsYikpP1AoYiwhMCk6LTE8YS5sJiZQKEwoYSxhLmwpLCExKX0sRWQ9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LFJjKGEpLTEpfSxGZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiAwPmI/Yy0xOmJ9LDApfSxIZD1mdW5jdGlvbihhKXtJZChhLGZ1bmN0aW9uKGIsYyl7cmV0dXJuKGIrMSklY30sYS5sKX0sR2Q9ZnVuY3Rpb24oYSl7SWQoYSxmdW5jdGlvbihiLGMpe2ItLTtyZXR1cm4gMD5iP2MtMTpifSxhLmwpfSxJZD1mdW5jdGlvbihhLGIsYyl7Yz0wPmM/VGMoYSxhLnMpOmM7dmFyIGQ9UmMoYSk7Yz1iLmNhbGwoYSxjLGQpO2Zvcih2YXIgZT0wO2U8PWQ7KXt2YXIgZj1MKGEsYyksZztpZihnPWYpZz1mLmlzVmlzaWJsZSgpJiZmLmlzRW5hYmxlZCgpJiYhIShmLnYmMik7aWYoZyl7YS5FYShjKTticmVha31lKys7Yz1iLmNhbGwoYSxjLGQpfX07ClMucHJvdG90eXBlLkVhPWZ1bmN0aW9uKGEpe0NkKHRoaXMsYSl9O3ZhciBUPWZ1bmN0aW9uKCl7fTtuKFQsTSk7ZGEoVCk7VC5wcm90b3R5cGUuYT1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYiJ9O1QucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXtyZXR1cm4idGFiIn07VC5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYj1ULmkuYy5jYWxsKHRoaXMsYSk7KGE9YS5QYSkmJmImJihiLnRpdGxlPWF8fCIiKTtyZXR1cm4gYn07VC5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIpe2I9VC5pLmcuY2FsbCh0aGlzLGEsYik7dmFyIGM9Yi50aXRsZXx8IiI7YyYmKGEuUGE9Yyk7YS5vJjgmJihjPWEuYikmJmlhKGMuRykmJihRKGEsOCwhMSksYy5HKGEpKTtyZXR1cm4gYn07dmFyIEpkPWZ1bmN0aW9uKGEsYixjKXtOLmNhbGwodGhpcyxhLGJ8fFQuUigpLGMpO3RkKHRoaXMsOCwhMCk7dGhpcy5LfD05fTtuKEpkLE4pO1ZjKCJnb29nLXRhYiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEpkKG51bGwpfSk7dmFyIFU9ZnVuY3Rpb24oKXt0aGlzLmg9InRhYmxpc3QifTtuKFUsWGMpO2RhKFUpO1UucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWItYmFyIn07VS5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIsYyl7dGhpcy5qfHwodGhpcy5hfHxLZCh0aGlzKSx0aGlzLmo9c2EodGhpcy5hKSk7dmFyIGQ9dGhpcy5qW2JdO2Q/KGFkKGEsTGQoZCkpLGEuQj1kKTpVLmkuZy5jYWxsKHRoaXMsYSxiLGMpfTtVLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPVUuaS5jLmNhbGwodGhpcyxhKTt0aGlzLmF8fEtkKHRoaXMpO2IucHVzaCh0aGlzLmFbYS5CXSk7cmV0dXJuIGJ9O3ZhciBLZD1mdW5jdGlvbihhKXt2YXIgYj1hLmIoKTthLmE9e3RvcDpiKyItdG9wIixib3R0b206YisiLWJvdHRvbSIsc3RhcnQ6YisiLXN0YXJ0IixlbmQ6YisiLWVuZCJ9fTt2YXIgVj1mdW5jdGlvbihhLGIsYyl7YT1hfHwidG9wIjthZCh0aGlzLExkKGEpKTt0aGlzLkI9YTtTLmNhbGwodGhpcyx0aGlzLkgsYnx8VS5SKCksYyk7TWQodGhpcyl9O24oVixTKTtoPVYucHJvdG90eXBlO2guQz1udWxsO2guRD1mdW5jdGlvbigpe1YuaS5ELmNhbGwodGhpcyk7TWQodGhpcyl9O2gudT1mdW5jdGlvbigpe1YuaS51LmNhbGwodGhpcyk7dGhpcy5DPW51bGx9O2guRWE9ZnVuY3Rpb24oYSl7Vi5pLkVhLmNhbGwodGhpcyxhKTt0aGlzLkcoTCh0aGlzLGEpKX07aC5HPWZ1bmN0aW9uKGEpe2E/cmQoYSwhMCk6dGhpcy5DJiZyZCh0aGlzLkMsITEpfTsKdmFyIE5kPWZ1bmN0aW9uKGEsYil7aWYoYiYmYj09YS5DKXtmb3IodmFyIGM9VGMoYSxiKSxkPWMtMTtiPUwoYSxkKTtkLS0pe3ZhciBlPWI7aWYoZS5pc1Zpc2libGUoKSYmZS5pc0VuYWJsZWQoKSl7YS5HKGIpO3JldHVybn19Zm9yKGMrPTE7Yj1MKGEsYyk7YysrKWlmKGQ9YixkLmlzVmlzaWJsZSgpJiZkLmlzRW5hYmxlZCgpKXthLkcoYik7cmV0dXJufWEuRyhudWxsKX19O2g9Vi5wcm90b3R5cGU7aC5hYj1mdW5jdGlvbihhKXt0aGlzLkMmJnRoaXMuQyE9YS50YXJnZXQmJnJkKHRoaXMuQywhMSk7dGhpcy5DPWEudGFyZ2V0fTtoLmJiPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PT10aGlzLkMmJih0aGlzLkM9bnVsbCl9O2guWmE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guJGE9ZnVuY3Rpb24oYSl7TmQodGhpcyxhLnRhcmdldCl9O2guSGE9ZnVuY3Rpb24oKXtMKHRoaXMsdGhpcy5sKXx8Q2QodGhpcyxUYyh0aGlzLHRoaXMuQ3x8TCh0aGlzLDApKSl9Owp2YXIgTWQ9ZnVuY3Rpb24oYSl7SChIKEgoSChPYyhhKSxhLCJzZWxlY3QiLGEuYWIpLGEsInVuc2VsZWN0IixhLmJiKSxhLCJkaXNhYmxlIixhLlphKSxhLCJoaWRlIixhLiRhKX0sTGQ9ZnVuY3Rpb24oYSl7cmV0dXJuInN0YXJ0Ij09YXx8ImVuZCI9PWE/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O1ZjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBWfSk7ZnVuY3Rpb24gT2QoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIFBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgZz1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIrZyk7Zm9yKHZhciBrPVtdLHA9YmEoYyksdz1wLm5leHQoKTshdy5kb25lO3c9cC5uZXh0KCkpe3c9dy52YWx1ZTt2YXIgQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKQi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO0IudGV4dENvbnRlbnQ9dztmLmFwcGVuZENoaWxkKEIpO2sucHVzaChCKX0iYm90dG9tIiE9ZyYmZS5hcHBlbmRDaGlsZChmKTtwPW51bGw7aWYoInRvcCI9PWd8fCJib3R0b20iPT1nKXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTsidG9wIj09ZyYmcCYmZS5hcHBlbmRDaGlsZChwKTtCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0IuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciByYT1bXTtjPWJhKGMpO2Zvcih3PWMubmV4dCgpOyF3LmRvbmU7dz1jLm5leHQoKSl3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHcuaWQ9ZS5pZCsiX2NvbnRlbnRfIityYS5sZW5ndGgsdy5zdHlsZS5kaXNwbGF5PSJub25lIixCLmFwcGVuZENoaWxkKHcpLHJhLnB1c2godyk7ZS5hcHBlbmRDaGlsZChCKTsiYm90dG9tIj09ZyYmKHAmJgplLmFwcGVuZENoaWxkKHApLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBYPW5ldyBWKGcpO1BjKFgsZik7dmFyIFk9LTE7ZGMoWCwic2VsZWN0IixmdW5jdGlvbihaKXtaPWsuaW5kZXhPZihaLnRhcmdldC5mKCkpO1ohPVkmJigwPD1ZJiZZPHJhLmxlbmd0aCYmKHJhW1ldLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFk9LTEpLDA8PVomJlo8cmEubGVuZ3RoJiYoWT1aLHJhW1ldLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksWC5HKEwoWCxZKSkpfSk7WC5HKEwoWCxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFope1guRyhMKFgsWikpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChPZChhKSl9LFFkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sVz1sOwpRZFswXWluIFd8fCJ1bmRlZmluZWQiPT10eXBlb2YgVy5leGVjU2NyaXB0fHxXLmV4ZWNTY3JpcHQoInZhciAiK1FkWzBdKTtmb3IodmFyIFJkO1FkLmxlbmd0aCYmKFJkPVFkLnNoaWZ0KCkpOylRZC5sZW5ndGh8fHZvaWQgMD09PVBkP1dbUmRdJiZXW1JkXSE9PU9iamVjdC5wcm90b3R5cGVbUmRdP1c9V1tSZF06Vz1XW1JkXT17fTpXW1JkXT1QZDt9KS5jYWxsKHRoaXMpOwovLyBjbGFuZy1mb3JtYXQgb24K", + "headers": [ + [ + "content-type", + "application/javascript" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + } + } + }, + "executionInfo": { + "elapsed": 68493, + "status": "ok", + "timestamp": 1600709676575, + "user": { + "displayName": "Evgeny Skvortsov", + "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhiQjODaOVLfYnUuWS9rB3LRntzJDM0hqElzsUkdQ=s64", + "userId": "11510585406840398626" + }, + "user_tz": 420 + }, + "id": "kJs7Wf9sC5bA", + "outputId": "a529307c-178b-4dea-919c-7b6c8f6c0921" + }, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id57" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id57" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id57" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b75ed4a6-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id57\", \"tabNames\": [\"MyFruit\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_23a2c6bb0a" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id57" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b75f188a-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id57\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_bc7ffc30cd" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "outputarea_id57" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b7605d6c-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_cfd823a813" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_1", + "outputarea_id57" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b760ab28-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id57_content_1\");\n", + "//# sourceURL=js_0f61234b54" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_1", + "outputarea_id57" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b760e9a8-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b760ab28-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_e666a03c1e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_1", + "outputarea_id57" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b761394e-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id57\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_af43e29e90" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_1", + "outputarea_id57" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running MyFruit\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"b764b2ea-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b7605d6c-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_7761447c1d" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_1", + "outputarea_id57" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b76639e4-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_0511ceeeae" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_0", + "outputarea_id57" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b7668c46-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id57_content_0\");\n", + "//# sourceURL=js_0c5ba4d26c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_0", + "outputarea_id57" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b766d7e6-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b7668c46-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_70cca8d091" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_0", + "outputarea_id57" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b7671e2c-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id57\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_c6b4be8eaf" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_0", + "outputarea_id57" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_0", + "outputarea_id57", + "outputarea_id58", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_0", + "outputarea_id57", + "outputarea_id58", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_0", + "outputarea_id57", + "outputarea_id58", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b7692582-fc30-11ea-b2c3-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id58\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_d3f8fdb844" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_0", + "outputarea_id57", + "outputarea_id58", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b769659c-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id58\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_5d2fcb2c87" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_0", + "outputarea_id57", + "outputarea_id58", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b76aa006-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_0365df4226" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_0", + "id58_content_0", + "outputarea_id57", + "outputarea_id58", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b76adcf6-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id58_content_0\");\n", + "//# sourceURL=js_fc535ef4ef" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_0", + "id58_content_0", + "outputarea_id57", + "outputarea_id58", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b76b55b4-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b76adcf6-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_46c0f0c86e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_0", + "id58_content_0", + "outputarea_id57", + "outputarea_id58", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b76b9d9e-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id58\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_4ce9075c92" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_0", + "id58_content_0", + "outputarea_id57", + "outputarea_id58", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following query is stored at \u001b[1mMyFruit_sql\u001b[0m variable.\n", + "WITH t_0_T AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 1 AS col0,\n", + " \"apple\" AS col1\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 2 AS col0,\n", + " \"banana\" AS col1\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 3 AS col0,\n", + " \"orange\" AS col1\n", + " \n", + ") )\n", + "SELECT\n", + " T.col1 AS col0\n", + "FROM\n", + " t_0_T AS T\n", + "WHERE\n", + " 6 = ((2) * (T.col0));\n" + ] + }, + { + "data": { + "application/javascript": [ + "window[\"b76cb67a-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b76aa006-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_8438be50a8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_0", + "id58_content_0", + "outputarea_id57", + "outputarea_id58", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b76de144-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b76639e4-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_94d6cb577e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_0", + "outputarea_id57" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b76f4dcc-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_2ac18bdf5f" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_1", + "outputarea_id57" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b76fa06a-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id57_content_1\");\n", + "//# sourceURL=js_27995c03e6" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_1", + "outputarea_id57" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b76fef48-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b76fa06a-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_8bbd4684aa" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_1", + "outputarea_id57" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b7702ecc-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id57\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_e8de783e31" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_1", + "outputarea_id57" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b7ef5986-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b76f4dcc-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_1b8e0e28bb" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_1", + "outputarea_id57" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b7f3629c-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b536d64c1e" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_0", + "outputarea_id57" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b7f3a892-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id57_content_0\");\n", + "//# sourceURL=js_6df6e278fc" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_0", + "outputarea_id57" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b7f402ba-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b7f3a892-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_9addd3ba51" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_0", + "outputarea_id57" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b7f45030-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id57\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_6297522ef8" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_0", + "outputarea_id57" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b7f631ca-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_d2d9ea2eee" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_0", + "id58_content_1", + "outputarea_id57", + "outputarea_id58", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b7f69228-fc30-11ea-b2c3-0242ac1c0002\"] = document.querySelector(\"#id58_content_1\");\n", + "//# sourceURL=js_fbd573ab65" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_0", + "id58_content_1", + "outputarea_id57", + "outputarea_id58", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b7f6f8a8-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b7f69228-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_a3701c7f51" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_0", + "id58_content_1", + "outputarea_id57", + "outputarea_id58", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b7f747f4-fc30-11ea-b2c3-0242ac1c0002\"] = window[\"id58\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_bf71f05b7c" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_0", + "id58_content_1", + "outputarea_id57", + "outputarea_id58", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The following table is stored at \u001b[1mMyFruit\u001b[0m variable.\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0
0orange
\n", + "
" + ], + "text/plain": [ + " col0\n", + "0 orange" + ] + }, + "metadata": { + "tags": [ + "id57_content_0", + "id58_content_1", + "outputarea_id57", + "outputarea_id58", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b7f9f724-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b7f631ca-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_f8f0ae43c1" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_0", + "id58_content_1", + "outputarea_id57", + "outputarea_id58", + "user_output" + ] + }, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "window[\"b7fb2ffe-fc30-11ea-b2c3-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"b7f3629c-fc30-11ea-b2c3-0242ac1c0002\"]);\n", + "//# sourceURL=js_eaccd726a7" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [ + "id57_content_0", + "outputarea_id57" + ] + }, + "output_type": "display_data" + } + ], + "source": [ + "%%logica MyFruit\n", + "\n", + "T(1, \"apple\");\n", + "T(2, \"banana\");\n", + "T(3, \"orange\");\n", + "\n", + "DoubleT(d, y) :- T(x, y), d == 2 * x;\n", + "\n", + "MyFruit(f) :- DoubleT(6, f);" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "LteIm06wDNng" + }, + "source": [ + "Here when `MyFruit` is querried the expression `d == 2 * x` appears to be a condition for filtering rows of T.\n", + "\n", + "Thusly there is not a clear difference between equality and assignment and they are not differentiated in the syntax." + ] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [], + "last_runtime": { + "build_target": "", + "kind": "local" + }, + "name": "Logica tutorial.ipynb", + "provenance": [ + { + "file_id": "1qi6YHknaimK8Op4dflr3w5PEDFvCy8Nb", + "timestamp": 1601528598793 + }, + { + "file_id": "/piper/depot/google3/experimental/users/evgenys/colab/Logica_tutorial.ipynb?workspaceId=evgenys:logic::citc", + "timestamp": 1599843520549 + }, + { + "file_id": "1LhabnKqWVinhTxnTcCC1UIzpzwIAJCQ1", + "timestamp": 1599787431613 + }, + { + "file_id": "1Hq65A3fneFLi-I8KO-17bG_OoCFGTrch", + "timestamp": 1599784204766 + } + ], + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/vim/ftdetect/logica.vim b/vim/ftdetect/logica.vim new file mode 100644 index 0000000..e2e3fd0 --- /dev/null +++ b/vim/ftdetect/logica.vim @@ -0,0 +1,16 @@ +" Copyright 2020 Google LLC +" +" Licensed under the Apache License, Version 2.0 (the "License"); +" you may not use this file except in compliance with the License. +" You may obtain a copy of the License at +" +" http://www.apache.org/licenses/LICENSE-2.0 +" +" Unless required by applicable law or agreed to in writing, software +" distributed under the License is distributed on an "AS IS" BASIS, +" WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +" See the License for the specific language governing permissions and +" limitations under the License. + +au BufRead,BufNewFile *.l set filetype=logica + diff --git a/vim/syntax/logica.vim b/vim/syntax/logica.vim new file mode 100644 index 0000000..bbf7e1d --- /dev/null +++ b/vim/syntax/logica.vim @@ -0,0 +1,77 @@ +" Copyright 2020 Google LLC +" +" Licensed under the Apache License, Version 2.0 (the "License"); +" you may not use this file except in compliance with the License. +" You may obtain a copy of the License at +" +" http://www.apache.org/licenses/LICENSE-2.0 +" +" Unless required by applicable law or agreed to in writing, software +" distributed under the License is distributed on an "AS IS" BASIS, +" WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +" See the License for the specific language governing permissions and +" limitations under the License. + +" Vim syntax file +" Language: Logica + +if exists("b:current_syntax") + finish +endif + +syntax case match + +syntax region logicaComment start=+/\*+ end=+\*/+ +syntax match logicaComment +#.*$+ +syntax match logicaAnnotation +@[_a-zA-Z$][_a-zA-Z0-9$]*\>+ +syntax match logicaString +"\(\\"\|[^"]\)*"+ + +" Symbol +syntax match logicaSymbol +'[_a-zA-Z$][_a-zA-Z0-9$]*+ + +" Global variables +syntax match logicaGlobal +[A-Z$][_a-zA-Z0-9$]*+ +syntax match logicaGlobal +\^[a-z][_a-zA-Z0-9$]*+ + +" Local variables +syntax match logicaVariable +[a-z][_a-zA-Z0-9$]*+ + +" Wildcard Variables +syntax match logicaWildcard +_[_a-zA-Z0-9$]*+ + +" Fields +syntax match logicaField +\.[0-9a-zA-Z_$]\++ +syntax match logicaField +\.?[0-9a-zA-Z_$]\++ + +" Integers +syntax match logicaInteger +0\|[1-9][0-9]*+ +syntax match logicaInteger +0x[0-9a-fA-F]\++ + +syntax keyword logicaNull null +syntax keyword logicaBoolean true false +syntax keyword logicaKeyword combine +syntax keyword logicaKeyword distinct import as +syntax keyword logicaGoal if then else +syntax keyword logicaKeyword in + +let b:current_syntax = "logica" + +" Highlighting Links + +hi def link logicaGlobal Type +hi def link logicaVariable Identifier +hi def link logicaWildcard Identifier + +hi def link logicaSymbol Constant +hi def link logicaBoolean Boolean +hi def link logicaInteger Number +hi def link logicaNull Constant +hi def link logicaKeyword Keyword +hi def link logicaGoal Conditional +hi def link logicaReserved Error +hi def link logicaField Special + +hi def link logicaString String +hi def link logicaRawString String +hi def link logicaComment Comment +hi def link logicaAnnotation Define