From 246560570e68d9bb0ee8d342c0e6febde9afcc6c Mon Sep 17 00:00:00 2001 From: Pete Boysen Date: Thu, 31 Dec 2015 11:35:54 -0600 Subject: [PATCH] added web resources --- demo.css | 24 + img.png | Bin 0 -> 289 bytes index.html | 62 + prosemirror-widgets.io/.project | 11 - prosemirror-widgets.io/LICENSE | 662 -- prosemirror-widgets.io/README.md | 25 - widgets-built.js | 14331 +++++++++++++++++++++++++++++ 7 files changed, 14417 insertions(+), 698 deletions(-) create mode 100644 demo.css create mode 100644 img.png create mode 100644 index.html delete mode 100644 prosemirror-widgets.io/.project delete mode 100644 prosemirror-widgets.io/LICENSE delete mode 100644 prosemirror-widgets.io/README.md create mode 100644 widgets-built.js diff --git a/demo.css b/demo.css new file mode 100644 index 0000000..f5fd799 --- /dev/null +++ b/demo.css @@ -0,0 +1,24 @@ +body { + font-family: Georgia; + margin: 0 1em +} + +textarea { + width: 100%; + border: 1px solid silver; + min-height: 40em; + padding: 4px 8px; +} + +.left, .right { + width: 50%; + float: left; +} + +.full { + max-width: 50em; +} + +.marked { + background: #ff6 +} diff --git a/img.png b/img.png new file mode 100644 index 0000000000000000000000000000000000000000..bdf5b5570db4773544df589b0a78e9c7caf370b2 GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}NPtg>E0F$w#upblI8`srl_A%g zr8R+nZkf!)Y|$-CnjYLb^Z)<<;sCboJ(^YFT-jdC9}l?wJMHsequrJ+^%;ed*0qhh zfaY?Q1o;IsShgMg%plVDe`Vrs&1j%#k*AAeh=e5TK~66RLlKq@KELgDG<>&TuE2Gz z&r`v3i|mt$EEld#l5Kbs5tMx}O6qkBi%?M*L&F*dhM5Z%OlaiRn_(2|nBV7jGhO}G z?tZ_YwSO7)@0TpwS$TT;_iwMBoc!k@l>7VVb(={Hx1?@OcDa4fUgWd6pU_Jm9iZ(D Mp00i_>zopr0L + + +ProseMirror Widgets Examples + + + + + +

ProseMirror Widget Examples

+ +

Caution: These are prototypes which have bugs and need UX and CSS work. Deal with it.

+ +
+ +

In ThinkSpace, +faculty use CKEditor to build content in multiple pages called phases which are +linked together forming a complex problem for students to solve. +CKEditor is great but has typical HTML editor problems and takes work to add new widgets to insert. Enter ProseMirror. +

+

+The above ProseMirror editor displays a number of widgets which can be inserted into HTML. +Insert the desired widget and supply the attributes requested. Tab between fields and press Enter to insert the element. +If you don't supply an attribute nothing will be created. +For most widgets, click on the widget to change the attributes. +

+ +

A brief description of the widgets are shown below:

+ + +

Finally, ThinkSpace supports team-based learning. The ProseMirror collaboration capabilities are +ideal for student teams to interact on documents.

+ +

This is exciting!

+

Source

+

Pete Boysen

+ + + + + diff --git a/prosemirror-widgets.io/.project b/prosemirror-widgets.io/.project deleted file mode 100644 index c548c10..0000000 --- a/prosemirror-widgets.io/.project +++ /dev/null @@ -1,11 +0,0 @@ - - - prosemirror-widgets.io - - - - - - - - diff --git a/prosemirror-widgets.io/LICENSE b/prosemirror-widgets.io/LICENSE deleted file mode 100644 index 9591157..0000000 --- a/prosemirror-widgets.io/LICENSE +++ /dev/null @@ -1,662 +0,0 @@ - GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU Affero General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a "Source" link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU AGPL, see -. - diff --git a/prosemirror-widgets.io/README.md b/prosemirror-widgets.io/README.md deleted file mode 100644 index e686028..0000000 --- a/prosemirror-widgets.io/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# prosemirror-widgets -A collection of widgets for use in the ProseMirror Editor - -In [ThinkSpace](http://www.thinkspace.org), -faculty use CKEditor to build content in multiple pages called phases which are -linked together forming a complex problem for students to solve. CKEditor is great but has typical HTML editor problems and takes work to add new widgets to insert. **Enter ProseMirror**. - -The above ProseMirror editor displays a number of widgets which can be inserted into HTML. Insert the desired widget and supply the attributes requested. Tab between fields and press Enter to insert the element. *If you don't supply an attribute nothing will be created.* For most widgets, click on the widget to change the attributes. - -A brief description of the widgets are shown below: - -* **Textfield, Textarea, Checkbox and Select** are used by faculty to prompt for questions in the process of solving a problem. -* **InlineMath and BlockMath** uses MathJax to display equations. We need these for scientific and engineering problems. -* **Spreadsheet** displays an Excel-like experience for business and engineeroring. Handsontable is used for integration. It also demonstrates how many well-formed javascript toolkits can be used to provide new capabilities. -* **IFrame** lets you embed websites, youTube, GoogleMaps... -* **MultipleChoice, CheckList and Scale** form the basis for a Test/Survey/Quiz/Exam document schema. Creating MultipleChoice and CheckList were cumbersome in CKEditor because each individual checkbox and radiobutton had to be inserted. It it now as easy as a bulletlist. It is also easier to enter than GoogleForms and allows the insertion of media in answers which faculty need. - -Finally, ThinkSpace supports **team-based learning**. The ProseMirror collaboration capabilities are -ideal for student teams to interact on documents. - -This is exciting! - -[Pete Boysen](mailto: pboysen@iastate.edu) - - diff --git a/widgets-built.js b/widgets-built.js new file mode 100644 index 0000000..56d56ba --- /dev/null +++ b/widgets-built.js @@ -0,0 +1,14331 @@ +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= from.depth && pos.shorten(from.depth).cmp(from) == 0) { + if (from.depth == 0) return pm.sel.pollForUpdate(); + pos = from.shorten(); + } + + pm.setNodeSelection(pos); + pm.focus(); + e.preventDefault(); +} + +function defParamsClick(type) { + type.prototype.handleClick = function (pm, e, path, node) { + var menu = pm.mod.menuBar.menu; + var cmd = pm.commands["insert" + type.name]; + if (menu && cmd) { + selectClickedNode(pm, e); + menu.enter((0, _prosemirrorDistMenuMenu.readParams)(cmd)); + return true; + } else return false; + }; +} + +},{"../../../prosemirror/dist/edit/selection":33,"../../../prosemirror/dist/menu/menu":37,"../../../prosemirror/dist/model":45}],3:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _prosemirrorDistModel = require("../../../prosemirror/dist/model"); + +var _prosemirrorDistDom = require("../../../prosemirror/dist/dom"); + +var _utils = require("../utils"); + +var BlockMath = (function (_Block) { + _inherits(BlockMath, _Block); + + function BlockMath() { + _classCallCheck(this, BlockMath); + + _get(Object.getPrototypeOf(BlockMath.prototype), "constructor", this).apply(this, arguments); + } + + return BlockMath; +})(_prosemirrorDistModel.Block); + +exports.BlockMath = BlockMath; + +BlockMath.attributes = { + tex: new _prosemirrorDistModel.Attribute({ "default": "" }) +}; + +(0, _utils.defParser)(BlockMath, "div", "widgets-blockmath"); + +BlockMath.prototype.serializeDOM = function (node) { + if (node.rendered) { + node.rendered = node.rendered.cloneNode(true); + } else { + node.rendered = (0, _prosemirrorDistDom.elt)("div", { "class": "widgets-blockmath" }, "\\[" + node.attrs.tex + "\\]"); + // wait until node is attached to document to render + MathJax.Hub.Queue(["Delay", MathJax.Callback, 100], ["Typeset", MathJax.Hub, node.rendered]); + } + return node.rendered; +}; + +BlockMath.register("command", { + name: "insertBlockMath", + label: "BlockMath", + run: function run(pm, tex) { + return pm.tr.replaceSelection(this.create({ tex: tex })).apply(_utils.andScroll); + }, + params: [{ label: "Latex Expression", type: "text" }], + prefillParams: function prefillParams(pm) { + var node = pm.selection.node; + + if (node) return [node.attrs.tex]; + } +}); + +(0, _utils.defParamsClick)(BlockMath); + +(0, _prosemirrorDistDom.insertCSS)("\n\n.widgets-blockmath {}\n\n"); + +},{"../../../prosemirror/dist/dom":19,"../../../prosemirror/dist/model":45,"../utils":2}],4:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _prosemirrorDistModel = require("../../../prosemirror/dist/model"); + +var _prosemirrorDistDom = require("../../../prosemirror/dist/dom"); + +var _input = require("./input"); + +var _utils = require("../utils"); + +var CheckBox = (function (_Input) { + _inherits(CheckBox, _Input); + + function CheckBox() { + _classCallCheck(this, CheckBox); + + _get(Object.getPrototypeOf(CheckBox.prototype), "constructor", this).apply(this, arguments); + } + + return CheckBox; +})(_input.Input); + +exports.CheckBox = CheckBox; + +CheckBox.attributes = { + name: new _prosemirrorDistModel.Attribute(), + type: new _prosemirrorDistModel.Attribute({ "default": "checkbox" }), + value: new _prosemirrorDistModel.Attribute({ "default": 1 }), + "class": new _prosemirrorDistModel.Attribute({ "default": "widgets-checkbox" }) +}; + +(0, _utils.defParser)(CheckBox, "input", "widgets-checkbox"); + +// Checkbox inherits serializer from input + +CheckBox.register("command", { + name: "insertCheckBox", + label: "CheckBox", + run: function run(pm, name, label, loc) { + return pm.tr.replaceSelection(this.create({ name: name, label: label, loc: loc })).apply(_utils.andScroll); + }, + params: [{ label: "Name", type: "text" }], + prefillParams: function prefillParams(pm) { + var node = pm.selection.node; + + if (node) return [node.attrs.name, node.attrs.label, node.attrs.loc]; + } +}); + +(0, _utils.defParamsClick)(CheckBox); + +(0, _prosemirrorDistDom.insertCSS)("\n\n.widgets-checkbox {}\n\n"); + +},{"../../../prosemirror/dist/dom":19,"../../../prosemirror/dist/model":45,"../utils":2,"./input":10}],5:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _prosemirrorDistModel = require("../../../prosemirror/dist/model"); + +var _prosemirrorDistDom = require("../../../prosemirror/dist/dom"); + +var _utils = require("../utils"); + +var CheckItem = (function (_Paragraph) { + _inherits(CheckItem, _Paragraph); + + function CheckItem() { + _classCallCheck(this, CheckItem); + + _get(Object.getPrototypeOf(CheckItem.prototype), "constructor", this).apply(this, arguments); + } + + _createClass(CheckItem, [{ + key: "create", + value: function create(attrs, content, marks) { + if (attrs.value > 0) content = [this.schema.node("checkbox", attrs)]; + return _get(Object.getPrototypeOf(CheckItem.prototype), "create", this).call(this, attrs, content, marks); + } + }], [{ + key: "kind", + get: function get() { + return "."; + } + }]); + + return CheckItem; +})(_prosemirrorDistModel.Paragraph); + +exports.CheckItem = CheckItem; + +CheckItem.attributes = { + name: new _prosemirrorDistModel.Attribute(), + value: new _prosemirrorDistModel.Attribute() +}; + +var CheckList = (function (_Block) { + _inherits(CheckList, _Block); + + function CheckList() { + _classCallCheck(this, CheckList); + + _get(Object.getPrototypeOf(CheckList.prototype), "constructor", this).apply(this, arguments); + } + + _createClass(CheckList, null, [{ + key: "contains", + get: function get() { + return "checkitem"; + } + }]); + + return CheckList; +})(_prosemirrorDistModel.Block); + +exports.CheckList = CheckList; + +CheckList.attributes = { + name: new _prosemirrorDistModel.Attribute(), + layout: new _prosemirrorDistModel.Attribute({ "default": "vertical" }) +}; + +(0, _utils.defParser)(CheckItem, "div", "widgets-checkitem"); +(0, _utils.defParser)(CheckList, "div", "widgets-checklist"); + +CheckItem.prototype.serializeDOM = function (node, s) { + return s.renderAs(node, "p", { + name: node.attrs.name + "-" + node.attrs.value, + value: node.attrs.value, + "class": "widgets-checkitem" + }); +}; + +CheckList.prototype.serializeDOM = function (node, s) { + return s.renderAs(node, "div", { + name: node.attrs.name, + layout: node.attrs.layout, + "class": "widgets-checklist" + }); +}; + +CheckItem.register("command", { + name: "splitCheckitem", + label: "Split the current checkitem", + run: function run(pm) { + var _pm$selection = pm.selection; + var node = _pm$selection.node; + var from = _pm$selection.from; + var to = _pm$selection.to; + + if (node && node.isBlock || from.path.length < 2 || !_prosemirrorDistModel.Pos.samePath(from.path, to.path)) return false; + var toParent = from.shorten(), + grandParent = pm.doc.path(toParent.path); + console.log(grandParent.type.name); + if (grandParent.type.name != "checklist") return false; + return pm.tr["delete"](from, to).split(from, 1, pm.schema.nodes.checkitem, { name: grandParent.attrs.name, value: grandParent.size }).apply(_utils.andScroll); + }, + key: "Enter(50)" +}); + +CheckList.register("command", { + name: "insertCheckList", + label: "CheckList", + run: function run(pm, name, layout) { + var chkitem = pm.schema.nodes.checkitem.create({ name: name, value: 0 }); + return pm.tr.replaceSelection(this.create({ name: name + "-0", layout: layout }, chkitem)).apply(_utils.andScroll); + }, + params: [{ label: "Name", type: "text" }, { label: "Layout (vertical, horizontal)", type: "select", options: [{ value: "horizontal", label: "horizontal" }, { value: "vertical", label: "vertical" }] }], + prefillParams: function prefillParams(pm) { + var node = pm.selection.node; + + if (node) return [node.attrs.name, node.attrs.layout]; + } +}); + +CheckItem.register("command", { + name: "splitCheckItem", + label: "Split the current checkitem", + run: function run(pm) { + var _pm$selection2 = pm.selection; + var node = _pm$selection2.node; + var from = _pm$selection2.from; + var to = _pm$selection2.to; + + if (node && node.isBlock || from.path.length < 2 || !_prosemirrorDistModel.Pos.samePath(from.path, to.path)) return false; + var toParent = from.shorten(), + grandParent = pm.doc.path(toParent.path); + return pm.tr["delete"](from, to).split(from, 1, pm.schema.nodes.checkitem, { + name: grandParent.attrs.name + "-" + grandParent.size, + value: grandParent.size }).apply(_utils.andScroll); + }, + key: "Enter(50)" +}); + +CheckItem.register("command", { + name: "deleteCheckItem", + label: "delete this checkitem or checklist", + run: function run(pm) { + var _pm$selection3 = pm.selection; + var head = _pm$selection3.head; + var empty = _pm$selection3.empty; + + if (!empty || head.offset > 1) return false; + // Find the node before this one + var before = undefined, + cut = undefined; + for (var i = head.path.length - 1; !before && i >= 0; i--) { + if (head.path[i] > 0) { + cut = head.shorten(i); + before = pm.doc.path(cut.path).child(cut.offset - 1); + } + }var mc = pm.doc.path(cut.path).child(cut.offset); + // if top choice, delete whole question if only one choice + if (mc.type.name == "checkitem") { + return pm.tr["delete"](cut, cut.move(1)).apply(_utils.andScroll); + } else { + // don't delete question if more than one choice + if (mc.size == 1) { + return pm.tr["delete"](cut, cut.move(1)).apply(_utils.andScroll); + } else return false; + } + }, + key: ["Backspace(50)", "Mod-Backspace(50)"] +}); + +(0, _prosemirrorDistDom.insertCSS)("\n\n.widgets-checkitem {}\n.widgets-checklist {}\n\n"); + +},{"../../../prosemirror/dist/dom":19,"../../../prosemirror/dist/model":45,"../utils":2}],6:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _prosemirrorDistModel = require("../../../prosemirror/dist/model"); + +var _prosemirrorDistDom = require("../../../prosemirror/dist/dom"); + +var _utils = require("../utils"); + +var IFrame = (function (_Block) { + _inherits(IFrame, _Block); + + function IFrame() { + _classCallCheck(this, IFrame); + + _get(Object.getPrototypeOf(IFrame.prototype), "constructor", this).apply(this, arguments); + } + + return IFrame; +})(_prosemirrorDistModel.Block); + +exports.IFrame = IFrame; + +IFrame.attributes = { + src: new _prosemirrorDistModel.Attribute({ "default": "" }), + width: new _prosemirrorDistModel.Attribute({ "default": 200 }), + height: new _prosemirrorDistModel.Attribute({ "default": 200 }) +}; + +(0, _utils.defParser)(IFrame, "iframe", "widgets-iframe"); + +IFrame.prototype.serializeDOM = function (node, s) { + return s.renderAs(node, "iframe", { + src: node.attrs.src, + width: node.attrs.width, + height: node.attrs.height, + content: "text/html;charset=UTF-8", + "class": "iframe", + frameborder: "1", + allowfullscreen: "1" + }); +}; + +IFrame.register("command", { + name: "insertIFrame", + label: "show websites, youTube, GoogleMaps,...", + run: function run(pm, src, width, height) { + return pm.tr.replaceSelection(this.create({ src: src, width: width, height: height })).apply(_utils.andScroll); + }, + params: [{ label: "Link (website, youTube, Google Maps ...)", type: "text" }, { label: "Width in pixels", type: "text", "default": 200 }, { label: "Height in pixels", type: "text", "default": 200 }], + prefillParams: function prefillParams(pm) { + var node = pm.selection.node; + + if (node) return [node.attrs.src, node.attrs.width, node.attrs.height]; + } +}); + +(0, _utils.defParamsClick)(IFrame); + +(0, _prosemirrorDistDom.insertCSS)("\n\n.widgets-iframe {}\n\n"); + +},{"../../../prosemirror/dist/dom":19,"../../../prosemirror/dist/model":45,"../utils":2}],7:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _prosemirrorDistModel = require("../../../prosemirror/dist/model"); + +var _prosemirrorDistDom = require("../../../prosemirror/dist/dom"); + +var _utils = require("../utils"); + +var Image = (function (_Inline) { + _inherits(Image, _Inline); + + function Image() { + _classCallCheck(this, Image); + + _get(Object.getPrototypeOf(Image.prototype), "constructor", this).apply(this, arguments); + } + + return Image; +})(_prosemirrorDistModel.Inline); + +exports.Image = Image; + +Image.attributes = { + src: new _prosemirrorDistModel.Attribute(), + alt: new _prosemirrorDistModel.Attribute({ "default": "" }), + title: new _prosemirrorDistModel.Attribute({ "default": "" }), + "class": new _prosemirrorDistModel.Attribute({ "default": "widgets-img" }) +}; + +(0, _utils.defParser)(Image, "img", "widgets-img"); + +Image.prototype.serializeDOM = function (node, s) { + return s.renderAs(node, "img", node.attrs); +}; + +Image.register("command", { + name: "insertImage", + label: "Insert image", + run: function run(pm, src, alt, title) { + return pm.tr.replaceSelection(this.create({ src: src, title: title, alt: alt })).apply(_utils.andScroll); + }, + params: [{ label: "Image URL", type: "text" }, { label: "Description / alternative text", type: "text", "default": "" }, { label: "Title", type: "text", "default": "" }], + select: function select(pm) { + return pm.doc.path(pm.selection.from.path).type.canContainType(this); + }, + prefillParams: function prefillParams(pm) { + var node = pm.selection.node; + + if (node && node.type == this) return [node.attrs.src, node.attrs.alt, node.attrs.title]; + } +}); + +(0, _utils.defParamsClick)(Image); + +(0, _prosemirrorDistDom.insertCSS)("\n\n.widgets-image {}\n\n"); + +},{"../../../prosemirror/dist/dom":19,"../../../prosemirror/dist/model":45,"../utils":2}],8:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _blockmath = require("./blockmath"); + +Object.defineProperty(exports, "BlockMath", { + enumerable: true, + get: function get() { + return _blockmath.BlockMath; + } +}); + +var _checkbox = require("./checkbox"); + +Object.defineProperty(exports, "CheckBox", { + enumerable: true, + get: function get() { + return _checkbox.CheckBox; + } +}); + +var _checklist = require("./checklist"); + +Object.defineProperty(exports, "CheckList", { + enumerable: true, + get: function get() { + return _checklist.CheckList; + } +}); +Object.defineProperty(exports, "CheckItem", { + enumerable: true, + get: function get() { + return _checklist.CheckItem; + } +}); + +var _iframe = require("./iframe"); + +Object.defineProperty(exports, "IFrame", { + enumerable: true, + get: function get() { + return _iframe.IFrame; + } +}); + +var _inlinemath = require("./inlinemath"); + +Object.defineProperty(exports, "InlineMath", { + enumerable: true, + get: function get() { + return _inlinemath.InlineMath; + } +}); + +var _input = require("./input"); + +Object.defineProperty(exports, "Input", { + enumerable: true, + get: function get() { + return _input.Input; + } +}); + +var _multiplechoice = require("./multiplechoice"); + +Object.defineProperty(exports, "MultipleChoice", { + enumerable: true, + get: function get() { + return _multiplechoice.MultipleChoice; + } +}); +Object.defineProperty(exports, "Choice", { + enumerable: true, + get: function get() { + return _multiplechoice.Choice; + } +}); + +var _radiobutton = require("./radiobutton"); + +Object.defineProperty(exports, "RadioButton", { + enumerable: true, + get: function get() { + return _radiobutton.RadioButton; + } +}); + +var _scale = require("./scale"); + +Object.defineProperty(exports, "Scale", { + enumerable: true, + get: function get() { + return _scale.Scale; + } +}); + +var _select = require("./select"); + +Object.defineProperty(exports, "Select", { + enumerable: true, + get: function get() { + return _select.Select; + } +}); + +var _textarea = require("./textarea"); + +Object.defineProperty(exports, "TextArea", { + enumerable: true, + get: function get() { + return _textarea.TextArea; + } +}); + +var _textfield = require("./textfield"); + +Object.defineProperty(exports, "TextField", { + enumerable: true, + get: function get() { + return _textfield.TextField; + } +}); + +var _image = require("./image"); + +Object.defineProperty(exports, "Image", { + enumerable: true, + get: function get() { + return _image.Image; + } +}); + +var _spreadsheet = require("./spreadsheet"); + +Object.defineProperty(exports, "SpreadSheet", { + enumerable: true, + get: function get() { + return _spreadsheet.SpreadSheet; + } +}); + +var _widget = require("./widget"); + +Object.defineProperty(exports, "Widget", { + enumerable: true, + get: function get() { + return _widget.Widget; + } +}); + +},{"./blockmath":3,"./checkbox":4,"./checklist":5,"./iframe":6,"./image":7,"./inlinemath":9,"./input":10,"./multiplechoice":11,"./radiobutton":12,"./scale":13,"./select":14,"./spreadsheet":15,"./textarea":16,"./textfield":17,"./widget":18}],9:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _prosemirrorDistModel = require("../../../prosemirror/dist/model"); + +var _prosemirrorDistDom = require("../../../prosemirror/dist/dom"); + +var _utils = require("../utils"); + +var InlineMath = (function (_Inline) { + _inherits(InlineMath, _Inline); + + function InlineMath() { + _classCallCheck(this, InlineMath); + + _get(Object.getPrototypeOf(InlineMath.prototype), "constructor", this).apply(this, arguments); + } + + return InlineMath; +})(_prosemirrorDistModel.Inline); + +exports.InlineMath = InlineMath; + +InlineMath.attributes = { + tex: new _prosemirrorDistModel.Attribute({ "default": "" }) +}; + +(0, _utils.defParser)(InlineMath, "span", "widgets-inlinemath"); + +InlineMath.prototype.serializeDOM = function (node) { + if (node.rendered) { + node.rendered = node.rendered.cloneNode(true); + } else { + node.rendered = (0, _prosemirrorDistDom.elt)("span", { "class": "widgets-inlinemath" }, " \\(" + node.attrs.tex + "\\) "); + // wait until node is attached to document to render + MathJax.Hub.Queue(["Delay", MathJax.Callback, 100], ["Typeset", MathJax.Hub, node.rendered]); + } + return node.rendered; +}; + +InlineMath.register("command", { + name: "insertInlineMath", + label: "InlineMath", + run: function run(pm, tex) { + return pm.tr.replaceSelection(this.create({ tex: tex })).apply(_utils.andScroll); + }, + params: [{ label: "Latex Expression", type: "text" }], + prefillParams: function prefillParams(pm) { + var node = pm.selection.node; + + if (node) return [node.attrs.tex]; + } +}); + +(0, _utils.defParamsClick)(InlineMath); + +(0, _prosemirrorDistDom.insertCSS)("\n\n.widgets-inlinemath {}\n\n"); + +},{"../../../prosemirror/dist/dom":19,"../../../prosemirror/dist/model":45,"../utils":2}],10:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _prosemirrorDistModel = require("../../../prosemirror/dist/model"); + +var _prosemirrorDistDom = require("../../../prosemirror/dist/dom"); + +var _utils = require("../utils"); + +var Input = (function (_Inline) { + _inherits(Input, _Inline); + + function Input() { + _classCallCheck(this, Input); + + _get(Object.getPrototypeOf(Input.prototype), "constructor", this).apply(this, arguments); + } + + return Input; +})(_prosemirrorDistModel.Inline); + +exports.Input = Input; + +Input.attributes = { + name: new _prosemirrorDistModel.Attribute(), + type: new _prosemirrorDistModel.Attribute({ "default": "text" }), + value: new _prosemirrorDistModel.Attribute() +}; + +(0, _utils.defParser)(Input, "widgets-input"); + +Input.prototype.serializeDOM = function (node, s) { + return s.renderAs(node, "input", node.attrs); +}; + +(0, _prosemirrorDistDom.insertCSS)("\n\t\t\n.widgets-input {}\n\n"); + +},{"../../../prosemirror/dist/dom":19,"../../../prosemirror/dist/model":45,"../utils":2}],11:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _prosemirrorDistModel = require("../../../prosemirror/dist/model"); + +var _prosemirrorDistDom = require("../../../prosemirror/dist/dom"); + +var _utils = require("../utils"); + +var Choice = (function (_Paragraph) { + _inherits(Choice, _Paragraph); + + function Choice() { + _classCallCheck(this, Choice); + + _get(Object.getPrototypeOf(Choice.prototype), "constructor", this).apply(this, arguments); + } + + _createClass(Choice, [{ + key: "create", + value: function create(attrs, content, marks) { + if (attrs.value > 0) content = [this.schema.node("radiobutton", attrs)]; + return _get(Object.getPrototypeOf(Choice.prototype), "create", this).call(this, attrs, content, marks); + } + }], [{ + key: "kind", + get: function get() { + return "."; + } + }]); + + return Choice; +})(_prosemirrorDistModel.Paragraph); + +exports.Choice = Choice; + +Choice.attributes = { + name: new _prosemirrorDistModel.Attribute(), + value: new _prosemirrorDistModel.Attribute() +}; + +var MultipleChoice = (function (_Block) { + _inherits(MultipleChoice, _Block); + + function MultipleChoice() { + _classCallCheck(this, MultipleChoice); + + _get(Object.getPrototypeOf(MultipleChoice.prototype), "constructor", this).apply(this, arguments); + } + + _createClass(MultipleChoice, null, [{ + key: "contains", + get: function get() { + return "choice"; + } + }]); + + return MultipleChoice; +})(_prosemirrorDistModel.Block); + +exports.MultipleChoice = MultipleChoice; + +MultipleChoice.attributes = { + name: new _prosemirrorDistModel.Attribute() +}; + +(0, _utils.defParser)(Choice, "p", "widgets-choice"); +(0, _utils.defParser)(MultipleChoice, "div", "widgets-multiplechoice"); + +Choice.prototype.serializeDOM = function (node, s) { + return s.renderAs(node, "p", { name: node.attrs.name, value: node.attrs.value, "class": "widgets-choice" }); +}; + +MultipleChoice.prototype.serializeDOM = function (node, s) { + return s.renderAs(node, "div", { name: node.attrs.name, "class": "widgets-multiplechoice" }); +}; + +Choice.register("command", { + name: "splitChoice", + label: "Split the current choice", + run: function run(pm) { + var _pm$selection = pm.selection; + var node = _pm$selection.node; + var from = _pm$selection.from; + var to = _pm$selection.to; + + if (node && node.isBlock || from.path.length < 2 || !_prosemirrorDistModel.Pos.samePath(from.path, to.path)) return false; + var toParent = from.shorten(), + grandParent = pm.doc.path(toParent.path); + if (grandParent.type.name != "multiplechoice") return false; + return pm.tr["delete"](from, to).split(from, 1, pm.schema.nodes.choice, { name: grandParent.attrs.name, value: grandParent.size }).apply(_utils.andScroll); + }, + key: "Enter(50)" +}); + +Choice.register("command", { + name: "deleteChoice", + label: "delete this choice or multiplechoice", + run: function run(pm) { + var _pm$selection2 = pm.selection; + var head = _pm$selection2.head; + var empty = _pm$selection2.empty; + + if (!empty || head.offset > 1) return false; + // Find the node before this one + var before = undefined, + cut = undefined; + for (var i = head.path.length - 1; !before && i >= 0; i--) { + if (head.path[i] > 0) { + cut = head.shorten(i); + before = pm.doc.path(cut.path).child(cut.offset - 1); + } + }var mc = pm.doc.path(cut.path).child(cut.offset); + // if top choice, delete whole question if only one choice + if (mc.type.name == "choice") { + return pm.tr["delete"](cut, cut.move(1)).apply(); + } else { + // don't delete question if more than one choice + if (mc.size == 1) { + return pm.tr["delete"](cut, cut.move(1)).apply(); + } else return false; + } + }, + key: ["Backspace(50)", "Mod-Backspace(50)"] +}); + +MultipleChoice.register("command", { + name: "insertMultipleChoice", + label: "MultipleChoice", + run: function run(pm, name) { + var _pm$selection3 = pm.selection; + var from = _pm$selection3.from; + var to = _pm$selection3.to; + var head = _pm$selection3.head; + + var choice = pm.schema.node("choice", { name: name, value: 0 }); + var tr = pm.tr.replaceSelection(this.create({ name: name }, choice)).apply(_utils.andScroll); + //find path of next sibling + var len = from.path.length - 1; + var sib = from.path[len] + 1; + pm.setTextSelection(new _prosemirrorDistModel.Pos(from.path.splice(0, len).concat(sib), 0)); + return tr; + }, + select: function select(pm) { + console.log("select"); + return pm.doc.path(pm.selection.from.path).type.canContainType(this); + }, + params: [{ label: "Name", type: "text" }], + prefillParams: function prefillParams(pm) { + var node = pm.selection.node; + + if (node) return [node.attrs.name]; + } +}); + +(0, _prosemirrorDistDom.insertCSS)("\n\n.widgets-choice {}\n.widgets-multiplechoice {}\n\n"); + +},{"../../../prosemirror/dist/dom":19,"../../../prosemirror/dist/model":45,"../utils":2}],12:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _prosemirrorDistModel = require("../../../prosemirror/dist/model"); + +var _prosemirrorDistDom = require("../../../prosemirror/dist/dom"); + +var _utils = require("../utils"); + +var _input = require("./input"); + +var RadioButton = (function (_Input) { + _inherits(RadioButton, _Input); + + function RadioButton() { + _classCallCheck(this, RadioButton); + + _get(Object.getPrototypeOf(RadioButton.prototype), "constructor", this).apply(this, arguments); + } + + return RadioButton; +})(_input.Input); + +exports.RadioButton = RadioButton; + +RadioButton.attributes = { + name: new _prosemirrorDistModel.Attribute(), + type: new _prosemirrorDistModel.Attribute({ "default": "radio" }), + value: new _prosemirrorDistModel.Attribute(), + "class": new _prosemirrorDistModel.Attribute({ "default": "widgets-radiobutton" }) +}; + +(0, _utils.defParser)(RadioButton, "input", "widgets-radiobutton"); + +// inherits serializer from input + +(0, _prosemirrorDistDom.insertCSS)("\n\n.widgets-radiobutton {}\n\n"); + +},{"../../../prosemirror/dist/dom":19,"../../../prosemirror/dist/model":45,"../utils":2,"./input":10}],13:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _prosemirrorDistModel = require("../../../prosemirror/dist/model"); + +var _prosemirrorDistDom = require("../../../prosemirror/dist/dom"); + +var _utils = require("../utils"); + +var Scale = (function (_Block) { + _inherits(Scale, _Block); + + function Scale() { + _classCallCheck(this, Scale); + + _get(Object.getPrototypeOf(Scale.prototype), "constructor", this).apply(this, arguments); + } + + return Scale; +})(_prosemirrorDistModel.Block); + +exports.Scale = Scale; + +Scale.attributes = { + name: new _prosemirrorDistModel.Attribute(), + startvalue: new _prosemirrorDistModel.Attribute({ "default": "1" }), + startlabel: new _prosemirrorDistModel.Attribute({ "default": "low" }), + endvalue: new _prosemirrorDistModel.Attribute({ "default": "10" }), + endlabel: new _prosemirrorDistModel.Attribute({ "default": "high" }) +}; + +(0, _utils.defParser)(Scale, "div", "scale"); + +Scale.prototype.serializeDOM = function (node) { + var dom = (0, _prosemirrorDistDom.elt)("div", { "class": "widgets-scale" }); + dom.appendChild((0, _prosemirrorDistDom.elt)("span", null, node.attrs.startlabel + " ")); + var startVal = Number(node.attrs.startvalue); + var endVal = Number(node.attrs.endvalue); + if (startVal < endVal) for (var i = startVal; i <= endVal; i++) { + dom.appendChild((0, _prosemirrorDistDom.elt)("span", { "class": "widgets-scaleitem" }, (0, _prosemirrorDistDom.elt)("input", { name: node.attrs.name, type: "radio", value: i }), i.toString())); + } else for (var i = startVal; i >= endVal; i--) { + dom.appendChild((0, _prosemirrorDistDom.elt)("span", { "class": "widgets-scaleitem" }, (0, _prosemirrorDistDom.elt)("input", { name: node.attrs.name, type: "radio", value: i }), i.toString())); + } + dom.appendChild((0, _prosemirrorDistDom.elt)("span", null, " " + node.attrs.endlabel)); + return dom; +}; + +Scale.register("command", { + name: "insertScale", + label: "Scale", + run: function run(pm, name, startvalue, startlabel, endvalue, endlabel) { + return pm.tr.replaceSelection(this.create({ name: name, startvalue: startvalue, startlabel: startlabel, endvalue: endvalue, endlabel: endlabel })).apply(_utils.andScroll); + }, + params: [{ label: "Name", type: "text" }, { label: "Start value", type: "text", "default": 1 }, { label: "Start label", type: "text", "default": "min" }, { label: "End value", type: "text", "default": 10 }, { label: "End label", type: "text", "default": "max" }], + prefillParams: function prefillParams(pm) { + var node = pm.selection.node; + + if (node) return [node.attrs.name, node.attrs.startvalue, node.attrs.startlabel, node.attrs.endvalue, node.attrs.endlabel]; + } +}); + +(0, _utils.defParamsClick)(Scale); + +(0, _prosemirrorDistDom.insertCSS)("\n\n.widgets-scaleitem {}\t\t\n.widgets-scale {}\n\n"); + +},{"../../../prosemirror/dist/dom":19,"../../../prosemirror/dist/model":45,"../utils":2}],14:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _prosemirrorDistModel = require("../../../prosemirror/dist/model"); + +var _prosemirrorDistDom = require("../../../prosemirror/dist/dom"); + +var _utils = require("../utils"); + +var Select = (function (_Inline) { + _inherits(Select, _Inline); + + function Select() { + _classCallCheck(this, Select); + + _get(Object.getPrototypeOf(Select.prototype), "constructor", this).apply(this, arguments); + } + + return Select; +})(_prosemirrorDistModel.Inline); + +exports.Select = Select; + +Select.attributes = { + name: new _prosemirrorDistModel.Attribute(), + options: new _prosemirrorDistModel.Attribute(), + multiple: new _prosemirrorDistModel.Attribute({ "default": "single" }) +}; + +(0, _utils.defParser)(Select, "select", "widgets-select"); + +Select.prototype.serializeDOM = function (node) { + var selection = node.attrs.multiple == "multiple"; + var select = (0, _prosemirrorDistDom.elt)("select", { name: node.attrs.name, "class": "widgets-select", size: 1, multiple: selection }); + node.attrs.options.split(",").map(function (option) { + select.appendChild((0, _prosemirrorDistDom.elt)("option", { value: option.trim() }, option)); + }); + return select; +}; + +Select.register("command", { + name: "insertSelect", + label: "Select", + run: function run(pm, name, options, multiple) { + return pm.tr.replaceSelection(this.create({ name: name, options: options, multiple: multiple })).apply(_utils.andScroll); + }, + params: [{ label: "Name", type: "text" }, { label: "Options (comma separated)", type: "text" }, { label: "Selection (single or multiple)", type: "select", options: [{ value: "multiple", label: "multiple" }, { value: "single", label: "single" }] }], + prefillParams: function prefillParams(pm) { + var node = pm.selection.node; + + if (node) { + return [node.attrs.name, node.attrs.options, node.attrs.multiple]; + } + } +}); + +(0, _utils.defParamsClick)(Select); + +(0, _prosemirrorDistDom.insertCSS)("\n\n.widgets-select {}\n\n"); + +},{"../../../prosemirror/dist/dom":19,"../../../prosemirror/dist/model":45,"../utils":2}],15:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _prosemirrorDistModel = require("../../../prosemirror/dist/model"); + +var _prosemirrorDistDom = require("../../../prosemirror/dist/dom"); + +var _utils = require("../utils"); + +var SpreadSheet = (function (_Block) { + _inherits(SpreadSheet, _Block); + + function SpreadSheet() { + _classCallCheck(this, SpreadSheet); + + _get(Object.getPrototypeOf(SpreadSheet.prototype), "constructor", this).apply(this, arguments); + } + + return SpreadSheet; +})(_prosemirrorDistModel.Block); + +exports.SpreadSheet = SpreadSheet; + +SpreadSheet.attributes = { + data: new _prosemirrorDistModel.Attribute({ "default": "" }) +}; + +(0, _utils.defParser)(SpreadSheet, "div", "widgets-spreadsheet"); + +SpreadSheet.prototype.serializeDOM = function (node) { + if (node.rendered) { + node.rendered = node.rendered.cloneNode(true); + } else { + node.rendered = (0, _prosemirrorDistDom.elt)("div", { + id: "spreadsheet", + "class": "widgets-spreadsheet" + }); + // wait until node is attached to document to render + window.setTimeout(function () { + var data = [["", "Ford", "Volvo", "Toyota", "Honda"], ["2014", 10, 11, 12, 13], ["2015", 20, 11, 14, 13], ["2016", 30, 15, 12, 13]]; + + var container = document.getElementById('spreadsheet'); + var hot = new Handsontable(container, { + data: data, + minSpareRows: 1, + rowHeaders: true, + colHeaders: true, + contextMenu: true + }); + }, 100); + } + return node.rendered; +}; + +SpreadSheet.register("command", { + name: "insertSpreadSheet", + label: "SpreadSheet", + run: function run(pm, data) { + return pm.tr.replaceSelection(this.create({ data: data })).apply(_utils.andScroll); + }, + params: [{ label: "Link to data csv (fixed for demo)", type: "text", "default": "cars.csv" }], + prefillParams: function prefillParams(pm) { + var node = pm.selection.node; + + if (node) return [node.attrs.data]; + } +}); + +(0, _utils.defParamsClick)(SpreadSheet); + +(0, _prosemirrorDistDom.insertCSS)("\n\n.widgets-spreadsheet {}\n\n"); + +},{"../../../prosemirror/dist/dom":19,"../../../prosemirror/dist/model":45,"../utils":2}],16:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _prosemirrorDistModel = require("../../../prosemirror/dist/model"); + +var _prosemirrorDistDom = require("../../../prosemirror/dist/dom"); + +var _utils = require("../utils"); + +var TextArea = (function (_Block) { + _inherits(TextArea, _Block); + + function TextArea() { + _classCallCheck(this, TextArea); + + _get(Object.getPrototypeOf(TextArea.prototype), "constructor", this).apply(this, arguments); + } + + return TextArea; +})(_prosemirrorDistModel.Block); + +exports.TextArea = TextArea; + +TextArea.attributes = { + name: new _prosemirrorDistModel.Attribute(), + rows: new _prosemirrorDistModel.Attribute(), + cols: new _prosemirrorDistModel.Attribute(), + "class": new _prosemirrorDistModel.Attribute({ "default": "widgets-textarea" }) +}; + +(0, _utils.defParser)(TextArea, "input", "widgets-textarea"); + +TextArea.prototype.serializeDOM = function (node, s) { + return s.renderAs(node, "textarea", node.attrs); +}; + +TextArea.register("command", { + name: "insertTextArea", + label: "TextArea", + run: function run(pm, name, rows, cols) { + return pm.tr.replaceSelection(this.create({ name: name, rows: rows, cols: cols })).apply(_utils.andScroll); + }, + params: [{ label: "Name", type: "text" }, { label: "Rows", type: "text", "default": "4" }, { label: "Columns", type: "text", "default": "20" }], + prefillParams: function prefillParams(pm) { + var node = pm.selection.node; + + if (node) return [node.attrs.name, node.attrs.rows, node.attrs.cols]; + } +}); + +(0, _utils.defParamsClick)(TextArea); + +(0, _prosemirrorDistDom.insertCSS)("\n\n.widgets-textarea {}\n\n"); + +},{"../../../prosemirror/dist/dom":19,"../../../prosemirror/dist/model":45,"../utils":2}],17:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _prosemirrorDistModel = require("../../../prosemirror/dist/model"); + +var _prosemirrorDistDom = require("../../../prosemirror/dist/dom"); + +var _input = require("./input"); + +var _utils = require("../utils"); + +var TextField = (function (_Input) { + _inherits(TextField, _Input); + + function TextField() { + _classCallCheck(this, TextField); + + _get(Object.getPrototypeOf(TextField.prototype), "constructor", this).apply(this, arguments); + } + + return TextField; +})(_input.Input); + +exports.TextField = TextField; + +TextField.attributes = { + name: new _prosemirrorDistModel.Attribute(), + type: new _prosemirrorDistModel.Attribute({ "default": "text" }), + size: new _prosemirrorDistModel.Attribute({ "default": "20" }), + "class": new _prosemirrorDistModel.Attribute({ "default": "widgets-textfield" }) +}; + +(0, _utils.defParser)(TextField, "input", "widgets-textfield"); + +// serializer inherits from input + +TextField.register("command", { + name: "insertTextField", + label: "TextField", + run: function run(pm, name, size) { + return pm.tr.replaceSelection(this.create({ name: name, size: size })).apply(_utils.andScroll); + }, + params: [{ label: "Name", type: "text" }, { label: "Size", type: "text", "default": "20" }], + prefillParams: function prefillParams(pm) { + var node = pm.selection.node; + + if (node) return [node.attrs.name, node.attrs.size]; + } +}); + +(0, _utils.defParamsClick)(TextField); + +(0, _prosemirrorDistDom.insertCSS)("\n\n.widgets-textfield {}\n\n"); + +},{"../../../prosemirror/dist/dom":19,"../../../prosemirror/dist/model":45,"../utils":2,"./input":10}],18:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _prosemirrorDistMenuMenu = require("../../../prosemirror/dist/menu/menu"); + +var _prosemirrorDistModel = require("../../../prosemirror/dist/model"); + +var _prosemirrorDistDom = require("../../../prosemirror/dist/dom"); + +var widgets = ["Image", "TextField", "TextArea", "CheckBox", "Select", "IFrame", "InlineMath", "BlockMath", "SpreadSheet", "MultipleChoice", "Scale", "CheckList"]; + +var insertWidget = widgets.map(function (w) { + return { + value: "insert" + w, + display: function display() { + return (0, _prosemirrorDistDom.elt)("span", null, w); + } + }; +}); + +var Widget = (function (_Textblock) { + _inherits(Widget, _Textblock); + + function Widget() { + _classCallCheck(this, Widget); + + _get(Object.getPrototypeOf(Widget.prototype), "constructor", this).apply(this, arguments); + } + + return Widget; +})(_prosemirrorDistModel.Textblock); + +exports.Widget = Widget; + +Widget.register("command", { + name: "insertWidget", + label: "Insert...", + select: function select(pm) { + return true; + }, + params: [{ name: "Widget type", type: "select", options: insertWidget, defaultLabel: "Insert..." }], + run: function run(pm, type) { + var menu = pm.mod.menuBar.menu; + var cmd = pm.commands[type]; + if (menu && cmd) menu.enter((0, _prosemirrorDistMenuMenu.readParams)(cmd)); + }, + display: "select", + menuGroup: "block", + menuRank: 99 +}); + +},{"../../../prosemirror/dist/dom":19,"../../../prosemirror/dist/menu/menu":37,"../../../prosemirror/dist/model":45}],19:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.elt = elt; +exports.requestAnimationFrame = requestAnimationFrame; +exports.rmClass = rmClass; +exports.addClass = addClass; +exports.contains = contains; +exports.insertCSS = insertCSS; + +function elt(tag, attrs) { + var result = document.createElement(tag); + if (attrs) for (var _name in attrs) { + if (_name == "style") result.style.cssText = attrs[_name];else if (attrs[_name] != null) result.setAttribute(_name, attrs[_name]); + } + + for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { + args[_key - 2] = arguments[_key]; + } + + for (var i = 0; i < args.length; i++) { + add(args[i], result); + }return result; +} + +function add(value, target) { + if (typeof value == "string") value = document.createTextNode(value); + if (Array.isArray(value)) { + for (var i = 0; i < value.length; i++) { + add(value[i], target); + } + } else { + target.appendChild(value); + } +} + +var reqFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame; + +function requestAnimationFrame(f) { + if (reqFrame) reqFrame(f);else setTimeout(f, 10); +} + +var ie_upto10 = /MSIE \d/.test(navigator.userAgent); +var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent); + +var browser = { + mac: /Mac/.test(navigator.platform), + ie_upto10: ie_upto10, + ie_11up: ie_11up, + ie: ie_upto10 || ie_11up, + gecko: /gecko\/\d/i.test(navigator.userAgent) +}; + +exports.browser = browser; +function classTest(cls) { + return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*"); +} + +function rmClass(node, cls) { + var current = node.className; + var match = classTest(cls).exec(current); + if (match) { + var after = current.slice(match.index + match[0].length); + node.className = current.slice(0, match.index) + (after ? match[1] + after : ""); + } +} + +function addClass(node, cls) { + var current = node.className; + if (!classTest(cls).test(current)) node.className += (current ? " " : "") + cls; +} + +function contains(parent, child) { + // Android browser and IE will return false if child is a text node. + if (child.nodeType != 1) child = child.parentNode; + return child && parent.contains(child); +} + +function insertCSS(css) { + var style = document.createElement("style"); + style.textContent = css; + document.head.insertBefore(style, document.head.firstChild); +} + +},{}],20:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _selection = require("./selection"); + +var _dom = require("../dom"); + +var _keys = require("./keys"); + +function nothing() {} + +function ensureSelection(pm) { + if (pm.selection.node) { + var found = (0, _selection.findSelectionNear)(pm.doc, pm.selection.from, 1, true); + if (found) (0, _selection.setDOMSelectionToPos)(pm, found.head); + } + return false; +} + +// A backdrop keymap used to make sure we always suppress keys that +// have a dangerous default effect, even if the commands they are +// bound to return false, and to make sure that cursor-motion keys +// find a cursor (as opposed to a node selection) when pressed. + +var keys = { + "Esc": nothing, + "Enter": nothing, + "Mod-Enter": nothing, + "Shift-Enter": nothing, + "Backspace": nothing, + "Delete": nothing, + "Mod-B": nothing, + "Mod-I": nothing, + "Mod-Backspace": nothing, + "Mod-Delete": nothing, + "Shift-Backspace": nothing, + "Shift-Delete": nothing, + "Shift-Mod-Backspace": nothing, + "Shift-Mod-Delete": nothing, + "Mod-Z": nothing, + "Mod-Y": nothing, + "Shift-Mod-Z": nothing, + "Ctrl-D": nothing, + "Ctrl-H": nothing, + "Ctrl-Alt-Backspace": nothing, + "Alt-D": nothing, + "Alt-Delete": nothing, + "Alt-Backspace": nothing, + + "Mod-A": ensureSelection +};["Left", "Right", "Up", "Down", "Home", "End", "PageUp", "PageDown"].forEach(function (key) { + keys[key] = keys["Shift-" + key] = keys["Mod-" + key] = keys["Shift-Mod-" + key] = keys["Alt-" + key] = keys["Shift-Alt-" + key] = ensureSelection; +});["Left", "Mod-Left", "Right", "Mod-Right", "Up", "Down"].forEach(function (key) { + return delete keys[key]; +}); + +if (_dom.browser.mac) keys["Ctrl-F"] = keys["Ctrl-B"] = keys["Ctrl-P"] = keys["Ctrl-N"] = keys["Alt-F"] = keys["Alt-B"] = keys["Ctrl-A"] = keys["Ctrl-E"] = keys["Ctrl-V"] = keys["goPageUp"] = ensureSelection; + +var captureKeys = new _keys.Keymap(keys); +exports.captureKeys = captureKeys; + +},{"../dom":19,"./keys":29,"./selection":33}],21:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.isWordChar = isWordChar; +exports.charCategory = charCategory; +exports.isExtendingChar = isExtendingChar; +var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/; + +// Extending unicode characters. A series of a non-extending char + +// any number of extending chars is treated as a single unit as far +// as editing and measuring is concerned. This is not fully correct, +// since some scripts/fonts/browsers also treat other configurations +// of code points as a group. +var extendingChar = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/; + +function isWordChar(ch) { + return (/\w/.test(ch) || isExtendingChar(ch) || ch > "\x80" && (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)) + ); +} + +/** + * Get the category of a given character. Either a "space", + * a character that can be part of a word ("word"), or anything else ("other"). + * + * @param {string} ch The character. + * @return {string} + */ + +function charCategory(ch) { + return (/\s/.test(ch) ? "space" : isWordChar(ch) ? "word" : "other" + ); +} + +function isExtendingChar(ch) { + return ch.charCodeAt(0) >= 768 && extendingChar.test(ch); +} + +},{}],22:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _slicedToArray = (function () { + function sliceIterator(arr, i) { + var _arr = [];var _n = true;var _d = false;var _e = undefined;try { + for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value);if (i && _arr.length === i) break; + } + } catch (err) { + _d = true;_e = err; + } finally { + try { + if (!_n && _i["return"]) _i["return"](); + } finally { + if (_d) throw _e; + } + }return _arr; + }return function (arr, i) { + if (Array.isArray(arr)) { + return arr; + } else if (Symbol.iterator in Object(arr)) { + return sliceIterator(arr, i); + } else { + throw new TypeError("Invalid attempt to destructure non-iterable instance"); + } + }; +})(); + +var _createClass = (function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); + } + }return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; + }; +})(); + +exports.defineParamHandler = defineParamHandler; +exports.initCommands = initCommands; +exports.defaultKeymap = defaultKeymap; + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { "default": obj }; +} + +function _toConsumableArray(arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];return arr2; + } else { + return Array.from(arr); + } +} + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +var _model = require("../model"); + +var _transform = require("../transform"); + +var _dom = require("../dom"); + +var _utilSortedinsert = require("../util/sortedinsert"); + +var _utilSortedinsert2 = _interopRequireDefault(_utilSortedinsert); + +var _char = require("./char"); + +var _keys = require("./keys"); + +var _selection = require("./selection"); + +var _options = require("./options"); + +var paramHandlers = Object.create(null); + +var empty = []; + +// FIXME document individual commands + +// ;; A command is a named piece of functionality that can be bound to +// a key, shown in the menu, or otherwise exposed to the user. +// +// The commands available in a given editor are gathered from the +// [registries](#registries) given to the editor, and the node and +// mark types in its [schema](#Schema.registry). Use the +// [`register`](#NodeType.register) method with `"command"` as the +// name and a `CommandSpec` as value to define a new command. + +var Command = (function () { + function Command(spec, self) { + _classCallCheck(this, Command); + + // :: string The name of the command. + this.name = spec.name; + if (!this.name) throw new Error("Trying to define a command without a name"); + // :: CommandSpec The command's specifying object. + this.spec = spec; + this.self = self; + } + + // ;; #path=CommandSpec #kind=interface #toc=false + // Commands are defined using objects that specify various aspects of + // the command. The only properties that _must_ appear in a command + // spec are [`name`](#CommandSpec.name) and [`run`](#CommandSpec.run). + // You should probably also give your commands a `label`. + + // :: string #path=CommandSpec.name + // The name of the command, which will be its key in + // `ProseMirror.commands`, and the thing passed to + // [`execCommand`](#ProseMirror.execCommand). + + // :: string #path=CommandSpec.label + // A user-facing label for the command. This will be used, among other + // things. as the tooltip title for the command's menu item. If there + // is no `label`, the command's `name` will be used instead. + + // :: (pm: ProseMirror, ...params: [any]) → ?bool #path=CommandSpec.run + // The function that executes the command. If the command has + // [parameters](#CommandSpec.params), their values are passed as + // arguments. For commands [registered](#NodeType.register) on node or + // mark types, `this` will be bound to the node or mark type when this + // function is ran. Should return `false` when the command could not + // be executed. + + // :: [CommandParam] #path=CommandSpec.params + // The parameters that this command expects. + + // :: (pm: ProseMirror) → bool #path=CommandSpec.select + // The function used to [select](#Command.select) the command. `this` + // will again be bound to a node or mark type, when available. + + // :: (pm: ProseMirror) → bool #path=CommandSpec.active + // The function used to determine whether the command is + // [active](#Command.active). `this` refers to the associated node or + // mark type. + + // :: union #path=CommandSpec.key + // The default key binding or bindings for this command. + + // :: union #path=CommandSpec.pcKey + // Default key binding or bindings specific to non-Mac platforms. + + // :: union #path=CommandSpec.macKey + // Default key binding or bindings specific to the Mac platform. + + // FIXME document menu and icon properties + + // ;; #path=CommandParam #kind=interface #toc=false + // The parameters that a command can take are specified using objects + // with the following properties: + + // :: string #path=CommandParam.label + // The user-facing name of the parameter. Shown to the user when + // prompting for this parameter. + + // :: string #path=CommandParam.type + // The type of the parameter. Supported types are `"text"` and `"select"`. + + // :: any #path=CommandParam.default + // A default value for the parameter. + + // :: (string, (pm: ProseMirror, cmd: Command, callback: (?[any]))) + // Register a parameter handler, which is a function that prompts the + // user to enter values for a command's [parameters](#CommandParam), and + // calls a callback with the values received. See also the + // [`commandParamHandler` option](#commandParamHandler). + + // :: (ProseMirror, ?[any]) → ?bool + // Execute this command. If the command takes + // [parameters](#Command.params), they can be passed as second + // argument here, or omitted, in which case a [parameter + // handler](#defineParamHandler) will be called to prompt the user + // for values. + // + // Returns the value returned by the command spec's [`run` + // method](#CommandSpec.run), or `false` if the command could not be + // ran. + + _createClass(Command, [{ + key: "exec", + value: function exec(pm, params) { + var _this = this; + + var run = this.spec.run; + if (!this.params.length) return run.call(this.self, pm); + if (params) return run.call.apply(run, [this.self, pm].concat(_toConsumableArray(params))); + var handler = getParamHandler(pm); + if (!handler) return false; + handler(pm, this, function (params) { + if (params) run.call.apply(run, [_this.self, pm].concat(_toConsumableArray(params))); + }); + } + + // :: (ProseMirror) → bool + // Ask this command whether it is currently relevant, given the + // editor's document and selection. If the command does not define a + // [`select`](#CommandSpec.select) method, this always returns true. + }, { + key: "select", + value: function select(pm) { + var f = this.spec.select; + return f ? f.call(this.self, pm) : true; + } + + // :: (ProseMirror) → bool + // Ask this command whether it is “active”. This is mostly used to + // style inline mark icons (such as strong) differently when the + // selection contains such marks. + }, { + key: "active", + value: function active(pm) { + var f = this.spec.active; + return f ? f.call(this.self, pm) : false; + } + + // :: [CommandParam] + // Get the list of parameters that this command expects. + }, { + key: "params", + get: function get() { + return this.spec.params || empty; + } + + // :: string + // Get the label for this command. + }, { + key: "label", + get: function get() { + return this.spec.label || this.name; + } + }]); + + return Command; +})(); + +exports.Command = Command; + +function defineParamHandler(name, handler) { + paramHandlers[name] = handler; +} + +function getParamHandler(pm) { + var option = pm.options.commandParamHandler; + if (option && paramHandlers[option]) return paramHandlers[option]; +} + +function initCommands(pm) { + var result = Object.create(null); + pm.registry("command", function (spec, type) { + result[spec.name] = new Command(spec, type); + }); + return result; +} + +function defaultKeymap(pm) { + var bindings = {}; + function add(command, key) { + if (Array.isArray(key)) { + for (var i = 0; i < key.length; i++) { + add(command, key[i]); + } + } else if (key) { + var _d$$exec = /^(.+?)(?:\((\d+)\))?$/.exec(key); + + var _d$$exec2 = _slicedToArray(_d$$exec, 3); + + var _ = _d$$exec2[0]; + var _name = _d$$exec2[1]; + var _d$$exec2$2 = _d$$exec2[2]; + var rank = _d$$exec2$2 === undefined ? 50 : _d$$exec2$2; + + (0, _utilSortedinsert2["default"])(bindings[_name] || (bindings[_name] = []), { command: command, rank: rank }, function (a, b) { + return a.rank - b.rank; + }); + } + } + for (var _name2 in pm.commands) { + var cmd = pm.commands[_name2]; + add(_name2, cmd.spec.key); + add(_name2, _dom.browser.mac ? cmd.spec.macKey : cmd.spec.pcKey); + } + + for (var key in bindings) { + bindings[key] = bindings[key].map(function (b) { + return b.command; + }); + }return new _keys.Keymap(bindings); +} + +var andScroll = { scrollIntoView: true }; + +_model.HardBreak.register("command", { + name: "insertHardBreak", + label: "Insert hard break", + run: function run(pm) { + var _pm$selection = pm.selection; + var node = _pm$selection.node; + var from = _pm$selection.from; + + if (node && node.isBlock) return false;else if (pm.doc.path(from.path).type.isCode) return pm.tr.typeText("\n").apply(andScroll);else return pm.tr.replaceSelection(this.create()).apply(andScroll); + }, + key: ["Mod-Enter", "Shift-Enter"] +}); + +function markActive(pm, type) { + var sel = pm.selection; + if (sel.empty) return type.isInSet(pm.activeMarks());else return pm.doc.rangeHasMark(sel.from, sel.to, type); +} + +function canAddInline(pm, type) { + var _pm$selection2 = pm.selection; + var from = _pm$selection2.from; + var to = _pm$selection2.to; + var empty = _pm$selection2.empty; + + if (empty) return !type.isInSet(pm.activeMarks()) && pm.doc.path(from.path).type.canContainMark(type); + var can = false; + pm.doc.nodesBetween(from, to, function (node) { + if (can || node.isTextblock && !node.type.canContainMark(type)) return false; + if (node.isInline && !type.isInSet(node.marks)) can = true; + }); + return can; +} + +function markApplies(pm, type) { + var _pm$selection3 = pm.selection; + var from = _pm$selection3.from; + var to = _pm$selection3.to; + + var relevant = false; + pm.doc.nodesBetween(from, to, function (node) { + if (node.isTextblock) { + if (node.type.canContainMark(type)) relevant = true; + return false; + } + }); + return relevant; +} + +function generateMarkCommands(type, name, labelName, spec) { + if (!labelName) labelName = name; + var cap = name.charAt(0).toUpperCase() + name.slice(1); + type.register("command", { + name: "set" + cap, + label: "Set " + labelName, + run: function run(pm) { + pm.setMark(this, true); + }, + select: function select(pm) { + return canAddInline(pm, this); + }, + icon: { from: name } + }); + type.register("command", { + name: "unset" + cap, + label: "Remove " + labelName, + run: function run(pm) { + pm.setMark(this, false); + }, + select: function select(pm) { + return markActive(pm, this); + }, + icon: { from: name } + }); + var command = { + name: name, + label: "Toggle " + labelName, + run: function run(pm) { + pm.setMark(this, null); + }, + active: function active(pm) { + return markActive(pm, this); + }, + select: function select(pm) { + return markApplies(pm, this); + } + }; + for (var prop in spec) { + command[prop] = spec[prop]; + }type.register("command", command); +} + +generateMarkCommands(_model.StrongMark, "strong", null, { + menuGroup: "inline", menuRank: 20, + icon: { + width: 805, height: 1024, + path: "M317 869q42 18 80 18 214 0 214-191 0-65-23-102-15-25-35-42t-38-26-46-14-48-6-54-1q-41 0-57 5 0 30-0 90t-0 90q0 4-0 38t-0 55 2 47 6 38zM309 442q24 4 62 4 46 0 81-7t62-25 42-51 14-81q0-40-16-70t-45-46-61-24-70-8q-28 0-74 7 0 28 2 86t2 86q0 15-0 45t-0 45q0 26 0 39zM0 950l1-53q8-2 48-9t60-15q4-6 7-15t4-19 3-18 1-21 0-19v-37q0-561-12-585-2-4-12-8t-25-6-28-4-27-2-17-1l-2-47q56-1 194-6t213-5q13 0 39 0t38 0q40 0 78 7t73 24 61 40 42 59 16 78q0 29-9 54t-22 41-36 32-41 25-48 22q88 20 146 76t58 141q0 57-20 102t-53 74-78 48-93 27-100 8q-25 0-75-1t-75-1q-60 0-175 6t-132 6z" + }, + key: "Mod-B" +}); + +generateMarkCommands(_model.EmMark, "em", "emphasis", { + menuGroup: "inline", menuRank: 21, + icon: { + width: 585, height: 1024, + path: "M0 949l9-48q3-1 46-12t63-21q16-20 23-57 0-4 35-165t65-310 29-169v-14q-13-7-31-10t-39-4-33-3l10-58q18 1 68 3t85 4 68 1q27 0 56-1t69-4 56-3q-2 22-10 50-17 5-58 16t-62 19q-4 10-8 24t-5 22-4 26-3 24q-15 84-50 239t-44 203q-1 5-7 33t-11 51-9 47-3 32l0 10q9 2 105 17-1 25-9 56-6 0-18 0t-18 0q-16 0-49-5t-49-5q-78-1-117-1-29 0-81 5t-69 6z" + }, + key: "Mod-I" +}); + +generateMarkCommands(_model.CodeMark, "code", null, { + menuGroup: "inline", menuRank: 22, + icon: { + width: 896, height: 1024, + path: "M608 192l-96 96 224 224-224 224 96 96 288-320-288-320zM288 192l-288 320 288 320 96-96-224-224 224-224-96-96z" + }, + key: "Mod-`" +}); + +_model.LinkMark.register("command", { + name: "unlink", + label: "Unlink", + run: function run(pm) { + pm.setMark(this, false); + }, + select: function select(pm) { + return markActive(pm, this); + }, + active: function active() { + return true; + }, + menuGroup: "inline", menuRank: 30, + icon: { from: "link" } +}); + +_model.LinkMark.register("command", { + name: "link", + label: "Add link", + run: function run(pm, href, title) { + pm.setMark(this, true, { href: href, title: title }); + }, + params: [{ label: "Target", type: "text" }, { label: "Title", type: "text", "default": "" }], + select: function select(pm) { + return markApplies(pm, this) && !markActive(pm, this); + }, + menuGroup: "inline", menuRank: 30, + icon: { + width: 951, height: 1024, + path: "M832 694q0-22-16-38l-118-118q-16-16-38-16-24 0-41 18 1 1 10 10t12 12 8 10 7 14 2 15q0 22-16 38t-38 16q-8 0-15-2t-14-7-10-8-12-12-10-10q-18 17-18 41 0 22 16 38l117 118q15 15 38 15 22 0 38-14l84-83q16-16 16-38zM430 292q0-22-16-38l-117-118q-16-16-38-16-22 0-38 15l-84 83q-16 16-16 38 0 22 16 38l118 118q15 15 38 15 24 0 41-17-1-1-10-10t-12-12-8-10-7-14-2-15q0-22 16-38t38-16q8 0 15 2t14 7 10 8 12 12 10 10q18-17 18-41zM941 694q0 68-48 116l-84 83q-47 47-116 47-69 0-116-48l-117-118q-47-47-47-116 0-70 50-119l-50-50q-49 50-118 50-68 0-116-48l-118-118q-48-48-48-116t48-116l84-83q47-47 116-47 69 0 116 48l117 118q47 47 47 116 0 70-50 119l50 50q49-50 118-50 68 0 116 48l118 118q48 48 48 116z" + } +}); + +_model.Image.register("command", { + name: "insertImage", + label: "Insert image", + run: function run(pm, src, alt, title) { + return pm.tr.replaceSelection(this.create({ src: src, title: title, alt: alt })).apply(andScroll); + }, + params: [{ label: "Image URL", type: "text" }, { label: "Description / alternative text", type: "text", "default": "" }, { label: "Title", type: "text", "default": "" }], + select: function select(pm) { + return pm.doc.path(pm.selection.from.path).type.canContainType(this); + }, + menuGroup: "inline", menuRank: 40, + icon: { + width: 1097, height: 1024, + path: "M365 329q0 45-32 77t-77 32-77-32-32-77 32-77 77-32 77 32 32 77zM950 548v256h-804v-109l182-182 91 91 292-292zM1005 146h-914q-7 0-12 5t-5 12v694q0 7 5 12t12 5h914q7 0 12-5t5-12v-694q0-7-5-12t-12-5zM1097 164v694q0 37-26 64t-64 26h-914q-37 0-64-26t-26-64v-694q0-37 26-64t64-26h914q37 0 64 26t26 64z" + }, + prefillParams: function prefillParams(pm) { + var node = pm.selection.node; + + if (node && node.type == this) return [node.attrs.src, node.attrs.alt, node.attrs.title]; + } +}); + +/** + * Get an offset moving backward from a current offset inside a node. + * + * @param {Object} parent The parent node. + * @param {int} offset Offset to move from inside the node. + * @param {string} by Size to delete by. Either "char" or "word". + */ +function moveBackward(parent, offset, by) { + if (by != "char" && by != "word") throw new Error("Unknown motion unit: " + by); + + var cat = null, + counted = 0; + for (;;) { + if (offset == 0) return offset; + + var _parent$chunkBefore = parent.chunkBefore(offset); + + var start = _parent$chunkBefore.start; + var node = _parent$chunkBefore.node; + + if (!node.isText) return cat ? offset : offset - 1; + + if (by == "char") { + for (var i = offset - start; i > 0; i--) { + if (!(0, _char.isExtendingChar)(node.text.charAt(i - 1))) return offset - 1; + offset--; + } + } else if (by == "word") { + // Work from the current position backwards through text of a singular + // character category (e.g. "cat" of "#!*") until reaching a character in a + // different category (i.e. the end of the word). + for (var i = offset - start; i > 0; i--) { + var nextCharCat = (0, _char.charCategory)(node.text.charAt(i - 1)); + if (cat == null || counted == 1 && cat == "space") cat = nextCharCat;else if (cat != nextCharCat) return offset; + offset--; + counted++; + } + } + } +} + +_options.defaultRegistry.register("command", { + name: "deleteSelection", + label: "Delete the selection", + run: function run(pm) { + return pm.tr.replaceSelection().apply(andScroll); + }, + key: ["Backspace(10)", "Delete(10)", "Mod-Backspace(10)", "Mod-Delete(10)"], + macKey: ["Ctrl-H(10)", "Alt-Backspace(10)", "Ctrl-D(10)", "Ctrl-Alt-Backspace(10)", "Alt-Delete(10)", "Alt-D(10)"] +}); + +function deleteBarrier(pm, cut) { + var around = pm.doc.path(cut.path); + var before = around.child(cut.offset - 1), + after = around.child(cut.offset); + if (before.type.canContainContent(after.type) && pm.tr.join(cut).apply(andScroll) !== false) return; + + var conn = undefined; + if (after.isTextblock && (conn = before.type.findConnection(after.type))) { + var tr = pm.tr, + end = cut.move(1); + tr.step("ancestor", cut, end, null, { types: [before.type].concat(_toConsumableArray(conn)), + attrs: [before.attrs].concat(_toConsumableArray(conn.map(function () { + return null; + }))) }); + tr.join(end); + tr.join(cut); + if (tr.apply(andScroll) !== false) return; + } + + var selAfter = (0, _selection.findSelectionFrom)(pm.doc, cut, 1); + return pm.tr.lift(selAfter.from, selAfter.to).apply(andScroll); +} + +_options.defaultRegistry.register("command", { + name: "joinBackward", + label: "Join with the block above", + run: function run(pm) { + var _pm$selection4 = pm.selection; + var head = _pm$selection4.head; + var empty = _pm$selection4.empty; + + if (!empty || head.offset > 0) return false; + + // Find the node before this one + var before = undefined, + cut = undefined; + for (var i = head.path.length - 1; !before && i >= 0; i--) { + if (head.path[i] > 0) { + cut = head.shorten(i); + before = pm.doc.path(cut.path).child(cut.offset - 1); + } + } // If there is no node before this, try to lift + if (!before) return pm.tr.lift(head).apply(andScroll); + + // If the node doesn't allow children, delete it + if (before.type.contains == null) return pm.tr["delete"](cut.move(-1), cut).apply(andScroll); + + // Apply the joining algorithm + return deleteBarrier(pm, cut); + }, + key: ["Backspace(30)", "Mod-Backspace(30)"] +}); + +_options.defaultRegistry.register("command", { + name: "deleteCharBefore", + label: "Delete a character before the cursor", + run: function run(pm) { + var _pm$selection5 = pm.selection; + var head = _pm$selection5.head; + var empty = _pm$selection5.empty; + + if (!empty || head.offset == 0) return false; + var from = moveBackward(pm.doc.path(head.path), head.offset, "char"); + return pm.tr["delete"](new _model.Pos(head.path, from), head).apply(andScroll); + }, + key: "Backspace(60)", + macKey: "Ctrl-H(40)" +}); + +_options.defaultRegistry.register("command", { + name: "deleteWordBefore", + label: "Delete the word before the cursor", + run: function run(pm) { + var _pm$selection6 = pm.selection; + var head = _pm$selection6.head; + var empty = _pm$selection6.empty; + + if (!empty || head.offset == 0) return false; + var from = moveBackward(pm.doc.path(head.path), head.offset, "word"); + return pm.tr["delete"](new _model.Pos(head.path, from), head).apply(andScroll); + }, + key: "Mod-Backspace(40)", + macKey: "Alt-Backspace(40)" +}); + +function moveForward(parent, offset, by) { + if (by != "char" && by != "word") throw new Error("Unknown motion unit: " + by); + + var cat = null, + counted = 0; + for (;;) { + if (offset == parent.size) return offset; + + var _parent$chunkAfter = parent.chunkAfter(offset); + + var start = _parent$chunkAfter.start; + var node = _parent$chunkAfter.node; + + if (!node.isText) return cat ? offset : offset + 1; + + if (by == "char") { + for (var i = offset - start; i < node.text.length; i++) { + if (!(0, _char.isExtendingChar)(node.text.charAt(i + 1))) return offset + 1; + offset++; + } + } else if (by == "word") { + for (var i = offset - start; i < node.text.length; i++) { + var nextCharCat = (0, _char.charCategory)(node.text.charAt(i)); + if (cat == null || counted == 1 && cat == "space") cat = nextCharCat;else if (cat != nextCharCat) return offset; + offset++; + counted++; + } + } + } +} + +_options.defaultRegistry.register("command", { + name: "joinForward", + label: "Join with the block below", + run: function run(pm) { + var _pm$selection7 = pm.selection; + var head = _pm$selection7.head; + var empty = _pm$selection7.empty; + + if (!empty || head.offset < pm.doc.path(head.path).size) return false; + + // Find the node after this one + var after = undefined, + cut = undefined; + for (var i = head.path.length - 1; !after && i >= 0; i--) { + cut = head.shorten(i, 1); + var _parent = pm.doc.path(cut.path); + if (cut.offset < _parent.size) after = _parent.child(cut.offset); + } + + // If there is no node after this, there's nothing to do + if (!after) return false; + + // If the node doesn't allow children, delete it + if (after.type.contains == null) return pm.tr["delete"](cut, cut.move(1)).apply(andScroll); + + // Apply the joining algorithm + return deleteBarrier(pm, cut); + }, + key: ["Delete(30)", "Mod-Delete(30)"] +}); + +_options.defaultRegistry.register("command", { + name: "deleteCharAfter", + label: "Delete a character after the cursor", + run: function run(pm) { + var _pm$selection8 = pm.selection; + var head = _pm$selection8.head; + var empty = _pm$selection8.empty; + + if (!empty || head.offset == pm.doc.path(head.path).size) return false; + var to = moveForward(pm.doc.path(head.path), head.offset, "char"); + return pm.tr["delete"](head, new _model.Pos(head.path, to)).apply(andScroll); + }, + key: "Delete(60)", + macKey: "Ctrl-D(60)" +}); + +_options.defaultRegistry.register("command", { + name: "deleteWordAfter", + label: "Delete a character after the cursor", + run: function run(pm) { + var _pm$selection9 = pm.selection; + var head = _pm$selection9.head; + var empty = _pm$selection9.empty; + + if (!empty || head.offset == pm.doc.path(head.path).size) return false; + var to = moveForward(pm.doc.path(head.path), head.offset, "word"); + return pm.tr["delete"](head, new _model.Pos(head.path, to)).apply(andScroll); + }, + key: "Mod-Delete(40)", + macKey: ["Ctrl-Alt-Backspace(40)", "Alt-Delete(40)", "Alt-D(40)"] +}); + +function joinPointAbove(pm) { + var _pm$selection10 = pm.selection; + var node = _pm$selection10.node; + var from = _pm$selection10.from; + + if (node) return (0, _transform.joinableBlocks)(pm.doc, from) ? from : null;else return (0, _transform.joinPoint)(pm.doc, from, -1); +} + +_options.defaultRegistry.register("command", { + name: "joinUp", + label: "Join with above block", + run: function run(pm) { + var node = pm.selection.node; + var point = joinPointAbove(pm); + if (!point) return false; + pm.tr.join(point).apply(); + if (node) pm.setNodeSelection(point.move(-1)); + }, + select: function select(pm) { + return joinPointAbove(pm); + }, + menuGroup: "block", menuRank: 80, + icon: { + width: 800, height: 900, + path: "M0 75h800v125h-800z M0 825h800v-125h-800z M250 400h100v-100h100v100h100v100h-100v100h-100v-100h-100z" + }, + key: "Alt-Up" +}); + +function joinPointBelow(pm) { + var _pm$selection11 = pm.selection; + var node = _pm$selection11.node; + var to = _pm$selection11.to; + + if (node) return (0, _transform.joinableBlocks)(pm.doc, to) ? to : null;else return (0, _transform.joinPoint)(pm.doc, to, 1); +} + +_options.defaultRegistry.register("command", { + name: "joinDown", + label: "Join with below block", + run: function run(pm) { + var node = pm.selection.node; + var point = joinPointBelow(pm); + if (!point) return false; + pm.tr.join(point).apply(); + if (node) pm.setNodeSelection(point.move(-1)); + }, + select: function select(pm) { + return joinPointBelow(pm); + }, + key: "Alt-Down" +}); + +_options.defaultRegistry.register("command", { + name: "lift", + label: "Lift out of enclosing block", + run: function run(pm) { + var _pm$selection12 = pm.selection; + var from = _pm$selection12.from; + var to = _pm$selection12.to; + + return pm.tr.lift(from, to).apply(andScroll); + }, + select: function select(pm) { + var _pm$selection13 = pm.selection; + var from = _pm$selection13.from; + var to = _pm$selection13.to; + + return (0, _transform.canLift)(pm.doc, from, to); + }, + menuGroup: "block", menuRank: 75, + icon: { + width: 1024, height: 1024, + path: "M219 310v329q0 7-5 12t-12 5q-8 0-13-5l-164-164q-5-5-5-13t5-13l164-164q5-5 13-5 7 0 12 5t5 12zM1024 749v109q0 7-5 12t-12 5h-987q-7 0-12-5t-5-12v-109q0-7 5-12t12-5h987q7 0 12 5t5 12zM1024 530v109q0 7-5 12t-12 5h-621q-7 0-12-5t-5-12v-109q0-7 5-12t12-5h621q7 0 12 5t5 12zM1024 310v109q0 7-5 12t-12 5h-621q-7 0-12-5t-5-12v-109q0-7 5-12t12-5h621q7 0 12 5t5 12zM1024 91v109q0 7-5 12t-12 5h-987q-7 0-12-5t-5-12v-109q0-7 5-12t12-5h987q7 0 12 5t5 12z" + }, + key: "Alt-Left" +}); + +function isAtTopOfListItem(doc, from, to, listType) { + return _model.Pos.samePath(from.path, to.path) && from.path.length >= 2 && from.path[from.path.length - 1] == 0 && listType.canContain(doc.path(from.path.slice(0, from.path.length - 1))); +} + +function wrapCommand(type, name, labelName, isList, spec) { + var command = { + name: "wrap" + name, + label: "Wrap in " + labelName, + run: function run(pm) { + var _pm$selection14 = pm.selection; + var from = _pm$selection14.from; + var to = _pm$selection14.to; + var head = _pm$selection14.head;var doJoin = false; + if (isList && head && isAtTopOfListItem(pm.doc, from, to, this)) { + // Don't do anything if this is the top of the list + if (from.path[from.path.length - 2] == 0) return false; + doJoin = true; + } + var tr = pm.tr.wrap(from, to, this); + if (doJoin) tr.join(from.shorten(from.depth - 2)); + return tr.apply(andScroll); + }, + select: function select(pm) { + var _pm$selection15 = pm.selection; + var from = _pm$selection15.from; + var to = _pm$selection15.to; + var head = _pm$selection15.head; + + if (isList && head && isAtTopOfListItem(pm.doc, from, to, this) && from.path[from.path.length - 2] == 0) return false; + return (0, _transform.canWrap)(pm.doc, from, to, this); + } + }; + for (var key in spec) { + command[key] = spec[key]; + }type.register("command", command); +} + +wrapCommand(_model.BulletList, "BulletList", "bullet list", true, { + menuGroup: "block", menuRank: 40, + icon: { + width: 768, height: 896, + path: "M0 512h128v-128h-128v128zM0 256h128v-128h-128v128zM0 768h128v-128h-128v128zM256 512h512v-128h-512v128zM256 256h512v-128h-512v128zM256 768h512v-128h-512v128z" + }, + key: ["Alt-Right '*'", "Alt-Right '-'"] +}); + +wrapCommand(_model.OrderedList, "OrderedList", "ordered list", true, { + menuGroup: "block", menuRank: 41, + icon: { + width: 768, height: 896, + path: "M320 512h448v-128h-448v128zM320 768h448v-128h-448v128zM320 128v128h448v-128h-448zM79 384h78v-256h-36l-85 23v50l43-2v185zM189 590c0-36-12-78-96-78-33 0-64 6-83 16l1 66c21-10 42-15 67-15s32 11 32 28c0 26-30 58-110 112v50h192v-67l-91 2c49-30 87-66 87-113l1-1z" + }, + key: "Alt-Right '1'" +}); + +wrapCommand(_model.BlockQuote, "BlockQuote", "block quote", false, { + menuGroup: "block", menuRank: 45, + icon: { + width: 640, height: 896, + path: "M0 448v256h256v-256h-128c0 0 0-128 128-128v-128c0 0-256 0-256 256zM640 320v-128c0 0-256 0-256 256v256h256v-256h-128c0 0 0-128 128-128z" + }, + key: ["Alt-Right '>'", "Alt-Right '\"'"] +}); + +_options.defaultRegistry.register("command", { + name: "newlineInCode", + label: "Insert newline", + run: function run(pm) { + var _pm$selection16 = pm.selection; + var from = _pm$selection16.from; + var to = _pm$selection16.to; + var node = _pm$selection16.node;var block = undefined; + if (!node && _model.Pos.samePath(from.path, to.path) && (block = pm.doc.path(from.path)).type.isCode && to.offset < block.size) return pm.tr.typeText("\n").apply(andScroll);else return false; + }, + key: "Enter(10)" +}); + +_options.defaultRegistry.register("command", { + name: "createParagraphNear", + label: "Create a paragraph near the selected leaf block", + run: function run(pm) { + var _pm$selection17 = pm.selection; + var from = _pm$selection17.from; + var to = _pm$selection17.to; + var node = _pm$selection17.node; + + if (!node || !node.isBlock || node.type.contains) return false; + var side = from.offset ? to : from; + pm.tr.insert(side, pm.schema.defaultTextblockType().create()).apply(andScroll); + pm.setTextSelection(new _model.Pos(side.toPath(), 0)); + }, + key: "Enter(20)" +}); + +_options.defaultRegistry.register("command", { + name: "liftEmptyBlock", + label: "Move current block up", + run: function run(pm) { + var _pm$selection18 = pm.selection; + var head = _pm$selection18.head; + var empty = _pm$selection18.empty; + + if (!empty || head.offset > 0 || pm.doc.path(head.path).size) return false; + if (head.depth > 1) { + var shorter = head.shorten(); + if (shorter.offset > 0 && shorter.offset < pm.doc.path(shorter.path).size - 1 && pm.tr.split(shorter).apply() !== false) return; + } + return pm.tr.lift(head).apply(andScroll); + }, + key: "Enter(30)" +}); + +_options.defaultRegistry.register("command", { + name: "splitBlock", + label: "Split the current block", + run: function run(pm) { + var _pm$selection19 = pm.selection; + var from = _pm$selection19.from; + var to = _pm$selection19.to; + var node = _pm$selection19.node;var block = pm.doc.path(to.path); + if (node && node.isBlock) { + if (!from.offset) return false; + return pm.tr.split(from).apply(andScroll); + } else { + var type = to.offset == block.size ? pm.schema.defaultTextblockType() : null; + return pm.tr["delete"](from, to).split(from, 1, type).apply(andScroll); + } + }, + key: "Enter(60)" +}); + +_model.ListItem.register("command", { + name: "splitListItem", + label: "Split the current list item", + run: function run(pm) { + var _pm$selection20 = pm.selection; + var from = _pm$selection20.from; + var to = _pm$selection20.to; + var node = _pm$selection20.node; + + if (node && node.isBlock || from.path.length < 2 || !_model.Pos.samePath(from.path, to.path)) return false; + var toParent = from.shorten(), + grandParent = pm.doc.path(toParent.path); + if (grandParent.type != this) return false; + var nextType = to.offset == grandParent.child(toParent.offset).size ? pm.schema.defaultTextblockType() : null; + return pm.tr["delete"](from, to).split(from, 2, nextType).apply(andScroll); + }, + key: "Enter(50)" +}); + +function alreadyHasBlockType(doc, from, to, type, attrs) { + var found = false; + if (!attrs) attrs = {}; + doc.nodesBetween(from, to || from, function (node) { + if (node.isTextblock) { + if (node.hasMarkup(type, attrs)) found = true; + return false; + } + }); + return found; +} + +function blockTypeCommand(type, name, labelName, attrs, key) { + if (!attrs) attrs = {}; + type.register("command", { + name: name, + label: "Change to " + labelName, + run: function run(pm) { + var _pm$selection21 = pm.selection; + var from = _pm$selection21.from; + var to = _pm$selection21.to; + + return pm.tr.setBlockType(from, to, this, attrs).apply(andScroll); + }, + select: function select(pm) { + var _pm$selection22 = pm.selection; + var from = _pm$selection22.from; + var to = _pm$selection22.to; + var node = _pm$selection22.node; + + if (node) return node.isTextblock && !node.hasMarkup(this, attrs);else return !alreadyHasBlockType(pm.doc, from, to, this, attrs); + }, + key: key + }); +} + +blockTypeCommand(_model.Heading, "makeH1", "heading 1", { level: 1 }, "Mod-H '1'"); +blockTypeCommand(_model.Heading, "makeH2", "heading 2", { level: 2 }, "Mod-H '2'"); +blockTypeCommand(_model.Heading, "makeH3", "heading 3", { level: 3 }, "Mod-H '3'"); +blockTypeCommand(_model.Heading, "makeH4", "heading 4", { level: 4 }, "Mod-H '4'"); +blockTypeCommand(_model.Heading, "makeH5", "heading 5", { level: 5 }, "Mod-H '5'"); +blockTypeCommand(_model.Heading, "makeH6", "heading 6", { level: 6 }, "Mod-H '6'"); + +blockTypeCommand(_model.Paragraph, "makeParagraph", "paragraph", null, "Mod-P"); +blockTypeCommand(_model.CodeBlock, "makeCodeBlock", "code block", null, "Mod-\\"); + +_model.HorizontalRule.register("command", { + name: "insertHorizontalRule", + label: "Insert horizontal rule", + run: function run(pm) { + return pm.tr.replaceSelection(this.create()).apply(andScroll); + }, + key: "Mod-Space" +}); + +_options.defaultRegistry.register("command", { + name: "undo", + label: "Undo last change", + run: function run(pm) { + pm.scrollIntoView();return pm.history.undo(); + }, + select: function select(pm) { + return pm.history.canUndo(); + }, + menuGroup: "history", menuRank: 10, + icon: { + width: 1024, height: 1024, + path: "M761 1024c113-206 132-520-313-509v253l-384-384 384-384v248c534-13 594 472 313 775z" + }, + key: "Mod-Z" +}); + +_options.defaultRegistry.register("command", { + name: "redo", + label: "Redo last undone change", + run: function run(pm) { + pm.scrollIntoView();return pm.history.redo(); + }, + select: function select(pm) { + return pm.history.canRedo(); + }, + menuGroup: "history", menuRank: 20, + icon: { + width: 1024, height: 1024, + path: "M576 248v-248l384 384-384 384v-253c-446-10-427 303-313 509-280-303-221-789 313-775z" + }, + key: ["Mod-Y", "Shift-Mod-Z"] +}); + +_options.defaultRegistry.register("command", { + name: "textblockType", + label: "Change block type", + run: function run(pm, type) { + var _pm$selection23 = pm.selection; + var from = _pm$selection23.from; + var to = _pm$selection23.to; + + return pm.tr.setBlockType(from, to, type.type, type.attrs).apply(); + }, + select: function select(pm) { + var node = pm.selection.node; + + return !node || node.isTextblock; + }, + params: [{ label: "Type", type: "select", options: listTextblockTypes, "default": currentTextblockType, defaultLabel: "Type..." }], + display: "select", + menuGroup: "block", menuRank: 10 +}); + +_model.Paragraph.prototype.textblockTypes = [{ label: "Normal", rank: 10 }]; +_model.CodeBlock.prototype.textblockTypes = [{ label: "Code", rank: 20 }]; +_model.Heading.prototype.textblockTypes = [1, 2, 3, 4, 5, 6].map(function (n) { + return { label: "Head " + n, attrs: { level: n }, rank: 30 + n }; +}); + +function listTextblockTypes(pm) { + var cached = pm.schema.cached.textblockTypes; + if (cached) return cached; + + var found = []; + for (var _name3 in pm.schema.nodes) { + var type = pm.schema.nodes[_name3]; + if (!type.textblockTypes) continue; + for (var i = 0; i < type.textblockTypes.length; i++) { + var info = type.textblockTypes[i]; + (0, _utilSortedinsert2["default"])(found, { label: info.label, value: { type: type, attrs: info.attrs }, rank: info.rank }, function (a, b) { + return a.rank - b.rank; + }); + } + } + return pm.schema.cached.textblockTypes = found; +} + +function currentTextblockType(pm) { + var _pm$selection24 = pm.selection; + var from = _pm$selection24.from; + var to = _pm$selection24.to; + var node = _pm$selection24.node; + + if (!node || node.isInline) { + if (!_model.Pos.samePath(from.path, to.path)) return null; + node = pm.doc.path(from.path); + } else if (!node.isTextblock) { + return null; + } + var types = listTextblockTypes(pm); + for (var i = 0; i < types.length; i++) { + var tp = types[i], + val = tp.value; + if (node.hasMarkup(val.type, val.attrs)) return tp; + } +} + +function nodeAboveSelection(pm) { + var sel = pm.selection, + i = 0; + if (sel.node) return !!sel.from.depth && sel.from.shorten(); + for (; i < sel.head.depth && i < sel.anchor.depth; i++) if (sel.head.path[i] != sel.anchor.path[i]) break; + return i == 0 ? false : sel.head.shorten(i - 1); +} + +_options.defaultRegistry.register("command", { + name: "selectParentBlock", + label: "Select parent node", + run: function run(pm) { + var node = nodeAboveSelection(pm); + if (!node) return false; + pm.setNodeSelection(node); + }, + select: function select(pm) { + return nodeAboveSelection(pm); + }, + menuGroup: "block", menuRank: 90, + icon: { text: "⬚", style: "font-weight: bold; vertical-align: 20%" }, + key: "Esc" +}); + +function moveSelectionBlock(pm, dir) { + var _pm$selection25 = pm.selection; + var from = _pm$selection25.from; + var to = _pm$selection25.to; + var node = _pm$selection25.node; + + var side = dir > 0 ? to : from; + return (0, _selection.findSelectionFrom)(pm.doc, node && node.isBlock ? side : side.shorten(null, dir > 0 ? 1 : 0), dir); +} + +function selectBlockHorizontally(pm, dir) { + var _pm$selection26 = pm.selection; + var empty = _pm$selection26.empty; + var node = _pm$selection26.node; + var from = _pm$selection26.from; + var to = _pm$selection26.to; + + if (!empty && !node) return false; + + if (node && node.isInline) { + pm.setTextSelection(dir > 0 ? to : from); + return true; + } + + var parent = undefined; + if (!node && (parent = pm.doc.path(from.path)) && (dir > 0 ? from.offset < parent.size : from.offset)) { + var _ref = dir > 0 ? parent.chunkAfter(from.offset) : parent.chunkBefore(from.offset); + + var nextNode = _ref.node; + var start = _ref.start; + + if (nextNode.type.selectable && start == from.offset - (dir > 0 ? 0 : 1)) { + pm.setNodeSelection(dir < 0 ? from.move(-1) : from); + return true; + } + return false; + } + + var next = moveSelectionBlock(pm, dir); + if (next && (next instanceof _selection.NodeSelection || node)) { + pm.setSelectionDirect(next); + return true; + } + return false; +} + +_options.defaultRegistry.register("command", { + name: "selectBlockLeft", + label: "Move the selection onto or out of the block to the left", + run: function run(pm) { + var done = selectBlockHorizontally(pm, -1); + if (done) pm.scrollIntoView(); + return done; + }, + key: ["Left", "Mod-Left"] +}); + +_options.defaultRegistry.register("command", { + name: "selectBlockRight", + label: "Move the selection onto or out of the block to the right", + run: function run(pm) { + var done = selectBlockHorizontally(pm, 1); + if (done) pm.scrollIntoView(); + return done; + }, + key: ["Right", "Mod-Right"] +}); + +function selectBlockVertically(pm, dir) { + var _pm$selection27 = pm.selection; + var empty = _pm$selection27.empty; + var node = _pm$selection27.node; + var from = _pm$selection27.from; + var to = _pm$selection27.to; + + if (!empty && !node) return false; + + var leavingTextblock = true; + if (!node || node.isInline) leavingTextblock = (0, _selection.verticalMotionLeavesTextblock)(pm, dir > 0 ? to : from, dir); + + if (leavingTextblock) { + var next = moveSelectionBlock(pm, dir); + if (next && next instanceof _selection.NodeSelection) { + pm.setSelectionDirect(next); + if (!node) pm.sel.lastNonNodePos = from; + return true; + } + } + + if (!node) return false; + + if (node.isInline) { + (0, _selection.setDOMSelectionToPos)(pm, from); + return false; + } + + var last = pm.sel.lastNonNodePos; + var beyond = (0, _selection.findSelectionFrom)(pm.doc, dir < 0 ? from : to, dir); + if (last && beyond && _model.Pos.samePath(last.path, beyond.from.path)) { + (0, _selection.setDOMSelectionToPos)(pm, last); + return false; + } + pm.setSelectionDirect(beyond); + return true; +} + +_options.defaultRegistry.register("command", { + name: "selectBlockUp", + label: "Move the selection onto or out of the block above", + run: function run(pm) { + var done = selectBlockVertically(pm, -1); + if (done !== false) pm.scrollIntoView(); + return done; + }, + key: "Up" +}); + +_options.defaultRegistry.register("command", { + name: "selectBlockDown", + label: "Move the selection onto or out of the block below", + run: function run(pm) { + var done = selectBlockVertically(pm, 1); + if (done !== false) pm.scrollIntoView(); + return done; + }, + key: "Down" +}); + +},{"../dom":19,"../model":45,"../transform":57,"../util/sortedinsert":69,"./char":21,"./keys":29,"./options":31,"./selection":33}],23:[function(require,module,exports){ +"use strict"; + +var _dom = require("../dom"); + +(0, _dom.insertCSS)("\n\n.ProseMirror {\n border: 1px solid silver;\n position: relative;\n}\n\n.ProseMirror-content {\n padding: 4px 8px 4px 14px;\n white-space: pre-wrap;\n line-height: 1.2;\n}\n\n.ProseMirror-drop-target {\n position: absolute;\n width: 1px;\n background: #666;\n display: none;\n}\n\n.ProseMirror-content ul.tight p, .ProseMirror-content ol.tight p {\n margin: 0;\n}\n\n.ProseMirror-content ul, .ProseMirror-content ol {\n padding-left: 30px;\n cursor: default;\n}\n\n.ProseMirror-content blockquote {\n padding-left: 1em;\n border-left: 3px solid #eee;\n margin-left: 0; margin-right: 0;\n}\n\n.ProseMirror-content pre {\n white-space: pre-wrap;\n}\n\n.ProseMirror-selectednode {\n outline: 2px solid #8cf;\n}\n\n.ProseMirror-content p:first-child,\n.ProseMirror-content h1:first-child,\n.ProseMirror-content h2:first-child,\n.ProseMirror-content h3:first-child,\n.ProseMirror-content h4:first-child,\n.ProseMirror-content h5:first-child,\n.ProseMirror-content h6:first-child {\n margin-top: .3em;\n}\n\n/* Add space around the hr to make clicking it easier */\n\n.ProseMirror-content hr {\n position: relative;\n height: 6px;\n border: none;\n}\n\n.ProseMirror-content hr:after {\n content: \"\";\n position: absolute;\n left: 10px;\n right: 10px;\n top: 2px;\n border-top: 2px solid silver;\n}\n\n.ProseMirror-content img {\n cursor: default;\n}\n\n/* Make sure li selections wrap around markers */\n\n.ProseMirror-content li {\n position: relative;\n pointer-events: none; /* Don't do weird stuff with marker clicks */\n}\n.ProseMirror-content li > * {\n pointer-events: auto;\n}\n\nli.ProseMirror-selectednode {\n outline: none;\n}\n\nli.ProseMirror-selectednode:after {\n content: \"\";\n position: absolute;\n left: -32px;\n right: -2px; top: -2px; bottom: -2px;\n border: 2px solid #8cf;\n pointer-events: none;\n}\n\n"); + +},{"../dom":19}],24:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.applyDOMChange = applyDOMChange; +exports.textContext = textContext; +exports.textInContext = textInContext; + +var _model = require("../model"); + +var _parseDom = require("../parse/dom"); + +var _transformTree = require("../transform/tree"); + +var _selection = require("./selection"); + +function isAtEnd(node, pos, depth) { + for (var i = depth || 0; i < pos.path.length; i++) { + var n = pos.path[depth]; + if (n < node.size - 1) return false; + node = node.child(n); + } + return pos.offset == node.size; +} +function isAtStart(pos, depth) { + if (pos.offset > 0) return false; + for (var i = depth || 0; i < pos.path.length; i++) { + if (pos.path[depth] > 0) return false; + }return true; +} + +function parseNearSelection(pm) { + var dom = pm.content, + node = pm.doc; + var _pm$selection = pm.selection; + var from = _pm$selection.from; + var to = _pm$selection.to; + + for (var depth = 0;; depth++) { + var toNode = node.child(to.path[depth]); + var fromStart = isAtStart(from, depth + 1); + var toEnd = isAtEnd(toNode, to, depth + 1); + if (fromStart || toEnd || from.path[depth] != to.path[depth] || toNode.isTextblock) { + var startOffset = depth == from.depth ? from.offset : from.path[depth]; + if (fromStart && startOffset > 0) startOffset--; + var endOffset = depth == to.depth ? to.offset : to.path[depth] + 1; + if (toEnd && endOffset < node.size - 1) endOffset++; + var parsed = (0, _parseDom.fromDOM)(pm.schema, dom, { topNode: node.copy(), + from: startOffset, + to: dom.childNodes.length - (node.size - endOffset) }); + parsed = parsed.copy(node.content.slice(0, startOffset).append(parsed.content).append(node.content.slice(endOffset))); + for (var i = depth - 1; i >= 0; i--) { + var wrap = pm.doc.path(from.path.slice(0, i)); + parsed = wrap.replace(from.path[i], parsed); + } + return parsed; + } + node = toNode; + dom = (0, _selection.findByPath)(dom, from.path[depth], false); + } +} + +function applyDOMChange(pm) { + var updated = parseNearSelection(pm); + var changeStart = (0, _model.findDiffStart)(pm.doc.content, updated.content); + if (changeStart) { + var changeEnd = findDiffEndConstrained(pm.doc.content, updated.content, changeStart); + // Mark nodes touched by this change as 'to be redrawn' + pm.markRangeDirty(pm.doc.siblingRange(changeStart, changeEnd.a)); + + pm.tr.replace(changeStart, changeEnd.a, updated, changeStart, changeEnd.b).apply(); + return true; + } else { + return false; + } +} + +function offsetBy(first, second, pos) { + var same = (0, _transformTree.samePathDepth)(first, second); + var firstEnd = same == first.depth, + secondEnd = same == second.depth; + var off = (secondEnd ? second.offset : second.path[same]) - (firstEnd ? first.offset : first.path[same]); + var shorter = firstEnd ? pos.move(off) : pos.shorten(same, off); + if (secondEnd) return shorter;else return shorter.extend(new _model.Pos(second.path.slice(same), second.offset)); +} + +function findDiffEndConstrained(a, b, start) { + var end = (0, _model.findDiffEnd)(a, b); + if (!end) return end; + if (end.a.cmp(start) < 0) return { a: start, b: offsetBy(end.a, start, end.b) }; + if (end.b.cmp(start) < 0) return { a: offsetBy(end.b, start, end.a), b: start }; + return end; +} + +// Text-only queries for composition events + +function textContext(data) { + var range = getSelection().getRangeAt(0); + var start = range.startContainer, + end = range.endContainer; + if (start == end && start.nodeType == 3) { + var value = start.nodeValue, + lead = range.startOffset, + _end = range.endOffset; + if (data && _end >= data.length && value.slice(_end - data.length, _end) == data) lead = _end - data.length; + return { inside: start, lead: lead, trail: value.length - _end }; + } + + var sizeBefore = null, + sizeAfter = null; + var before = start.childNodes[range.startOffset - 1] || nodeBefore(start); + while (before.lastChild) before = before.lastChild; + if (before && before.nodeType == 3) { + var value = before.nodeValue; + sizeBefore = value.length; + if (data && value.slice(value.length - data.length) == data) sizeBefore -= data.length; + } + var after = end.childNodes[range.endOffset] || nodeAfter(end); + while (after.firstChild) after = after.firstChild; + if (after && after.nodeType == 3) sizeAfter = after.nodeValue.length; + + return { before: before, sizeBefore: sizeBefore, + after: after, sizeAfter: sizeAfter }; +} + +function textInContext(context, deflt) { + if (context.inside) { + var _val = context.inside.nodeValue; + return _val.slice(context.lead, _val.length - context.trail); + } else { + var before = context.before, + after = context.after, + val = ""; + if (!before) return deflt; + if (before.nodeType == 3) val = before.nodeValue.slice(context.sizeBefore); + var scan = scanText(before, after); + if (scan == null) return deflt; + val += scan; + if (after && after.nodeType == 3) { + var valAfter = after.nodeValue; + val += valAfter.slice(0, valAfter.length - context.sizeAfter); + } + return val; + } +} + +function nodeAfter(node) { + for (;;) { + var next = node.nextSibling; + if (next) { + while (next.firstChild) next = next.firstChild; + return next; + } + if (!(node = node.parentElement)) return null; + } +} + +function nodeBefore(node) { + for (;;) { + var prev = node.previousSibling; + if (prev) { + while (prev.lastChild) prev = prev.lastChild; + return prev; + } + if (!(node = node.parentElement)) return null; + } +} + +function scanText(start, end) { + var text = "", + cur = nodeAfter(start); + for (;;) { + if (cur == end) return text; + if (!cur) return null; + if (cur.nodeType == 3) text += cur.nodeValue; + cur = cur.firstChild || nodeAfter(cur); + } +} + +},{"../model":45,"../parse/dom":50,"../transform/tree":65,"./selection":33}],25:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.draw = draw; +exports.redraw = redraw; + +var _model = require("../model"); + +var _serializeDom = require("../serialize/dom"); + +var _dom = require("../dom"); + +var _main = require("./main"); + +// FIXME clean up threading of path and offset, maybe remove from DOM renderer entirely + +function options(path, ranges) { + return { + onRender: function onRender(node, dom, offset) { + if (!node.isText && node.type.contains == null) { + dom.contentEditable = false; + if (node.isBlock) dom.setAttribute("pm-leaf", "true"); + } + if (node.isBlock && offset != null) dom.setAttribute("pm-offset", offset); + if (node.isTextblock) adjustTrailingHacks(dom, node); + + return dom; + }, + renderInlineFlat: function renderInlineFlat(node, dom, offset) { + ranges.advanceTo(new _model.Pos(path, offset)); + var end = new _model.Pos(path, offset + node.width); + var nextCut = ranges.nextChangeBefore(end); + + var inner = dom, + wrapped = undefined; + for (var i = 0; i < node.marks.length; i++) { + inner = inner.firstChild; + }if (dom.nodeType != 1) { + dom = (0, _dom.elt)("span", null, dom); + if (!nextCut) wrapped = dom; + } + if (!wrapped && (nextCut || ranges.current.length)) { + wrapped = inner == dom ? dom = (0, _dom.elt)("span", null, inner) : inner.parentNode.appendChild((0, _dom.elt)("span", null, inner)); + } + + dom.setAttribute("pm-offset", offset); + if (node.type.contains == null) dom.setAttribute("pm-leaf", node.isText ? node.width : "true"); + + var inlineOffset = 0; + while (nextCut) { + var size = nextCut - offset; + var split = splitSpan(wrapped, size); + if (ranges.current.length) split.className = ranges.current.join(" "); + split.setAttribute("pm-inner-offset", inlineOffset); + inlineOffset += size; + offset += size; + ranges.advanceTo(new _model.Pos(path, offset)); + if (!(nextCut = ranges.nextChangeBefore(end))) wrapped.setAttribute("pm-inner-offset", inlineOffset); + } + + if (ranges.current.length) wrapped.className = ranges.current.join(" "); + return dom; + }, + document: document, path: path + }; +} + +function splitSpan(span, at) { + var textNode = span.firstChild, + text = textNode.nodeValue; + var newNode = span.parentNode.insertBefore((0, _dom.elt)("span", null, text.slice(0, at)), span); + textNode.nodeValue = text.slice(at); + return newNode; +} + +function draw(pm, doc) { + pm.content.textContent = ""; + pm.content.appendChild((0, _serializeDom.toDOM)(doc, options([], pm.ranges.activeRangeTracker()))); +} + +function adjustTrailingHacks(dom, node) { + var needs = node.size == 0 || node.lastChild.type.isBR ? "br" : !node.lastChild.isText && node.lastChild.type.contains == null ? "text" : null; + var last = dom.lastChild; + var has = !last || last.nodeType != 1 || !last.hasAttribute("pm-ignore") ? null : last.nodeName == "BR" ? "br" : "text"; + if (needs != has) { + if (has) dom.removeChild(last); + if (needs) dom.appendChild(needs == "br" ? (0, _dom.elt)("br", { "pm-ignore": "trailing-break" }) : (0, _dom.elt)("span", { "pm-ignore": "cursor-text" }, "")); + } +} + +function findNodeIn(iter, node) { + var copy = iter.copy(); + for (var child = undefined; child = copy.next().value;) { + if (child == node) return child; + } +} + +function movePast(dom) { + var next = dom.nextSibling; + dom.parentNode.removeChild(dom); + return next; +} + +function redraw(pm, dirty, doc, prev) { + var opts = options([], pm.ranges.activeRangeTracker()); + + function scan(dom, node, prev) { + var iNode = node.iter(), + iPrev = prev.iter(), + pChild = iPrev.next().value; + var domPos = dom.firstChild; + + for (var child = undefined; child = iNode.next().value;) { + var offset = iNode.offset - child.width, + matching = undefined, + reuseDOM = undefined; + if (!node.isTextblock) opts.path.push(offset); + + if (pChild == child) { + matching = pChild; + } else if (matching = findNodeIn(iPrev, child)) { + while (pChild != matching) { + pChild = iPrev.next().value; + domPos = movePast(domPos); + } + } + + if (matching && !dirty.get(matching)) { + reuseDOM = true; + } else if (pChild && !child.isText && child.sameMarkup(pChild) && dirty.get(pChild) != _main.DIRTY_REDRAW) { + reuseDOM = true; + var contentNode = domPos; + for (;;) { + var first = contentNode.firstChild; + if (!first || !first.hasAttribute || first.hasAttribute("pm-ignore") || first.hasAttribute("pm-offset")) break; + contentNode = first; + } + scan(contentNode, child, pChild); + } else { + var rendered = (0, _serializeDom.renderNodeToDOM)(child, opts, offset); + dom.insertBefore(rendered, domPos); + reuseDOM = false; + } + + if (reuseDOM) { + domPos.setAttribute("pm-offset", offset); + domPos = domPos.nextSibling; + pChild = iPrev.next().value; + } + if (!node.isTextblock) opts.path.pop(); + } + + while (pChild) { + domPos = movePast(domPos); + pChild = iPrev.next().value; + } + if (node.isTextblock) adjustTrailingHacks(dom, node); + } + scan(pm.content, doc, prev); +} + +},{"../dom":19,"../model":45,"../serialize/dom":53,"./main":30}],26:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = (function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); + } + }return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; + }; +})(); + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +var _model = require("../model"); + +var _transform = require("../transform"); + +var InvertedStep = function InvertedStep(step, version, id) { + _classCallCheck(this, InvertedStep); + + this.step = step; + this.version = version; + this.id = id; +}; + +var BranchRemapping = (function () { + function BranchRemapping(branch) { + _classCallCheck(this, BranchRemapping); + + this.branch = branch; + this.remap = new _transform.Remapping(); + this.version = branch.version; + this.mirrorBuffer = Object.create(null); + } + + _createClass(BranchRemapping, [{ + key: "moveToVersion", + value: function moveToVersion(version) { + while (this.version > version) this.addNextMap(); + } + }, { + key: "addNextMap", + value: function addNextMap() { + var found = this.branch.mirror[this.version]; + var mapOffset = this.branch.maps.length - (this.branch.version - this.version) - 1; + var id = this.remap.addToFront(this.branch.maps[mapOffset], this.mirrorBuffer[this.version]); + --this.version; + if (found != null) this.mirrorBuffer[found] = id; + return id; + } + }, { + key: "movePastStep", + value: function movePastStep(result) { + var id = this.addNextMap(); + if (result) this.remap.addToBack(result.map, id); + } + }]); + + return BranchRemapping; +})(); + +var workTime = 100, + pauseTime = 150; + +var CompressionWorker = (function () { + function CompressionWorker(doc, branch, callback) { + _classCallCheck(this, CompressionWorker); + + this.branch = branch; + this.callback = callback; + this.remap = new BranchRemapping(branch); + + this.doc = doc; + this.events = []; + this.maps = []; + this.version = this.startVersion = branch.version; + + this.i = branch.events.length; + this.timeout = null; + this.aborted = false; + } + + _createClass(CompressionWorker, [{ + key: "work", + value: function work() { + var _this = this; + + if (this.aborted) return; + + var endTime = Date.now() + workTime; + + for (;;) { + if (this.i == 0) return this.finish(); + var _event = this.branch.events[--this.i], + outEvent = []; + for (var j = _event.length - 1; j >= 0; j--) { + var _event$j = _event[j]; + var step = _event$j.step; + var stepVersion = _event$j.version; + var stepID = _event$j.id; + + this.remap.moveToVersion(stepVersion); + + var mappedStep = step.map(this.remap.remap); + if (mappedStep && isDelStep(step)) { + var extra = 0, + start = step.from; + while (j > 0) { + var next = _event[j - 1]; + if (next.version != stepVersion - 1 || !isDelStep(next.step) || start.cmp(next.step.to)) break; + extra += next.step.to.offset - next.step.from.offset; + start = next.step.from; + stepVersion--; + j--; + this.remap.addNextMap(); + } + if (extra > 0) { + var _start = mappedStep.from.move(-extra); + mappedStep = new _transform.Step("replace", _start, mappedStep.to, _start); + } + } + var result = mappedStep && mappedStep.apply(this.doc); + if (result) { + this.doc = result.doc; + this.maps.push(result.map.invert()); + outEvent.push(new InvertedStep(mappedStep, this.version, stepID)); + this.version--; + } + this.remap.movePastStep(result); + } + if (outEvent.length) { + outEvent.reverse(); + this.events.push(outEvent); + } + if (Date.now() > endTime) { + this.timeout = window.setTimeout(function () { + return _this.work(); + }, pauseTime); + return; + } + } + } + }, { + key: "finish", + value: function finish() { + if (this.aborted) return; + + this.events.reverse(); + this.maps.reverse(); + this.callback(this.maps.concat(this.branch.maps.slice(this.branch.maps.length - (this.branch.version - this.startVersion))), this.events); + } + }, { + key: "abort", + value: function abort() { + this.aborted = true; + window.clearTimeout(this.timeout); + } + }]); + + return CompressionWorker; +})(); + +function isDelStep(step) { + return step.type == "replace" && step.from.offset < step.to.offset && _model.Pos.samePath(step.from.path, step.to.path) && (!step.param || step.param.content.size == 0); +} + +var compressStepCount = 150; + +var Branch = (function () { + function Branch(maxDepth) { + _classCallCheck(this, Branch); + + this.maxDepth = maxDepth; + this.version = 0; + this.nextStepID = 1; + + this.maps = []; + this.mirror = Object.create(null); + this.events = []; + + this.stepsSinceCompress = 0; + this.compressing = null; + this.compressTimeout = null; + } + + _createClass(Branch, [{ + key: "clear", + value: function clear(force) { + if (force || !this.empty()) { + this.maps.length = this.events.length = this.stepsSinceCompress = 0; + this.mirror = Object.create(null); + this.abortCompression(); + } + } + }, { + key: "newEvent", + value: function newEvent() { + this.abortCompression(); + this.events.push([]); + while (this.events.length > this.maxDepth) this.events.shift(); + } + }, { + key: "addMap", + value: function addMap(map) { + if (!this.empty()) { + this.maps.push(map); + this.version++; + this.stepsSinceCompress++; + return true; + } + } + }, { + key: "empty", + value: function empty() { + return this.events.length == 0; + } + }, { + key: "addStep", + value: function addStep(step, map, id) { + this.addMap(map); + if (id == null) id = this.nextStepID++; + this.events[this.events.length - 1].push(new InvertedStep(step, this.version, id)); + } + }, { + key: "addTransform", + value: function addTransform(transform, ids) { + this.abortCompression(); + for (var i = 0; i < transform.steps.length; i++) { + var inverted = transform.steps[i].invert(transform.docs[i], transform.maps[i]); + this.addStep(inverted, transform.maps[i], ids && ids[i]); + } + } + }, { + key: "popEvent", + value: function popEvent(doc, allowCollapsing) { + this.abortCompression(); + var event = this.events.pop(); + if (!event) return null; + + var remap = new BranchRemapping(this), + collapsing = allowCollapsing; + var tr = new _transform.Transform(doc); + var ids = []; + + for (var i = event.length - 1; i >= 0; i--) { + var invertedStep = event[i], + step = invertedStep.step; + if (!collapsing || invertedStep.version != remap.version) { + collapsing = false; + remap.moveToVersion(invertedStep.version); + + step = step.map(remap.remap); + var result = step && tr.step(step); + if (result) { + ids.push(invertedStep.id); + if (this.addMap(result.map)) this.mirror[this.version] = invertedStep.version; + } + + if (i > 0) remap.movePastStep(result); + } else { + this.version--; + delete this.mirror[this.version]; + this.maps.pop(); + tr.step(step); + ids.push(invertedStep.id); + --remap.version; + } + } + if (this.empty()) this.clear(true); + return { transform: tr, ids: ids }; + } + }, { + key: "getVersion", + value: function getVersion() { + return { id: this.nextStepID, version: this.version }; + } + }, { + key: "findVersion", + value: function findVersion(version) { + for (var i = this.events.length - 1; i >= 0; i--) { + var _event2 = this.events[i]; + for (var j = _event2.length - 1; j >= 0; j--) { + var step = _event2[j]; + if (step.id == version.id) return { event: i, step: j };else if (step.id < version.id) return { event: i, step: j + 1 }; + } + } + } + }, { + key: "rebased", + value: function rebased(newMaps, rebasedTransform, positions) { + if (this.empty()) return; + this.abortCompression(); + + var startVersion = this.version - positions.length; + + // Update and clean up the events + out: for (var i = this.events.length - 1; i >= 0; i--) { + var _event3 = this.events[i]; + for (var j = _event3.length - 1; j >= 0; j--) { + var step = _event3[j]; + if (step.version <= startVersion) break out; + var off = positions[step.version - startVersion - 1]; + if (off == -1) { + _event3.splice(j--, 1); + } else { + var inv = rebasedTransform.steps[off].invert(rebasedTransform.docs[off], rebasedTransform.maps[off]); + _event3[j] = new InvertedStep(inv, startVersion + newMaps.length + off + 1, step.id); + } + } + } + + // Sync the array of maps + if (this.maps.length > positions.length) this.maps = this.maps.slice(0, this.maps.length - positions.length).concat(newMaps).concat(rebasedTransform.maps);else this.maps = rebasedTransform.maps.slice(); + + this.version = startVersion + newMaps.length + rebasedTransform.maps.length; + + this.stepsSinceCompress += newMaps.length + rebasedTransform.steps.length - positions.length; + } + }, { + key: "abortCompression", + value: function abortCompression() { + if (this.compressing) { + this.compressing.abort(); + this.compressing = null; + } + } + }, { + key: "needsCompression", + value: function needsCompression() { + return this.stepsSinceCompress > compressStepCount && !this.compressing; + } + }, { + key: "startCompression", + value: function startCompression(doc) { + var _this2 = this; + + this.compressing = new CompressionWorker(doc, this, function (maps, events) { + _this2.maps = maps; + _this2.events = events; + _this2.mirror = Object.create(null); + _this2.compressing = null; + _this2.stepsSinceCompress = 0; + }); + this.compressing.work(); + } + }]); + + return Branch; +})(); + +var compressDelay = 750; + +var History = (function () { + function History(pm) { + var _this3 = this; + + _classCallCheck(this, History); + + this.pm = pm; + + this.done = new Branch(pm.options.historyDepth); + this.undone = new Branch(pm.options.historyDepth); + + this.lastAddedAt = 0; + this.ignoreTransform = false; + + this.allowCollapsing = true; + + pm.on("transform", function (transform, options) { + return _this3.recordTransform(transform, options); + }); + } + + _createClass(History, [{ + key: "recordTransform", + value: function recordTransform(transform, options) { + if (this.ignoreTransform) return; + + if (options.addToHistory == false) { + for (var i = 0; i < transform.maps.length; i++) { + var map = transform.maps[i]; + this.done.addMap(map); + this.undone.addMap(map); + } + } else { + this.undone.clear(); + var now = Date.now(); + if (now > this.lastAddedAt + this.pm.options.historyEventDelay) this.done.newEvent(); + + this.done.addTransform(transform); + this.lastAddedAt = now; + } + this.maybeScheduleCompression(); + } + }, { + key: "undo", + value: function undo() { + return this.shift(this.done, this.undone); + } + }, { + key: "redo", + value: function redo() { + return this.shift(this.undone, this.done); + } + }, { + key: "canUndo", + value: function canUndo() { + return this.done.events.length > 0; + } + }, { + key: "canRedo", + value: function canRedo() { + return this.undone.events.length > 0; + } + }, { + key: "shift", + value: function shift(from, to) { + var event = from.popEvent(this.pm.doc, this.allowCollapsing); + if (!event) return false; + var transform = event.transform; + var ids = event.ids; + + this.ignoreTransform = true; + this.pm.apply(transform); + this.ignoreTransform = false; + + if (!transform.steps.length) return this.shift(from, to); + + if (to) { + to.newEvent(); + to.addTransform(transform, ids); + } + this.lastAddedAt = 0; + + return true; + } + }, { + key: "getVersion", + value: function getVersion() { + return this.done.getVersion(); + } + }, { + key: "backToVersion", + value: function backToVersion(version) { + var found = this.done.findVersion(version); + if (!found) return false; + var event = this.done.events[found.event]; + var combined = this.done.events.slice(found.event + 1).reduce(function (comb, arr) { + return comb.concat(arr); + }, event.slice(found.step)); + this.done.events.length = found.event + ((event.length = found.step) ? 1 : 0); + this.done.events.push(combined); + + this.shift(this.done); + } + }, { + key: "rebased", + value: function rebased(newMaps, rebasedTransform, positions) { + this.done.rebased(newMaps, rebasedTransform, positions); + this.undone.rebased(newMaps, rebasedTransform, positions); + this.maybeScheduleCompression(); + } + }, { + key: "maybeScheduleCompression", + value: function maybeScheduleCompression() { + this.maybeScheduleCompressionForBranch(this.done); + this.maybeScheduleCompressionForBranch(this.undone); + } + }, { + key: "maybeScheduleCompressionForBranch", + value: function maybeScheduleCompressionForBranch(branch) { + var _this4 = this; + + window.clearTimeout(branch.compressTimeout); + if (branch.needsCompression()) branch.compressTimeout = window.setTimeout(function () { + if (branch.needsCompression()) branch.startCompression(_this4.pm.doc); + }, compressDelay); + } + }]); + + return History; +})(); + +exports.History = History; + +},{"../model":45,"../transform":57}],27:[function(require,module,exports){ +// !! This module implements the ProseMirror editor. It contains +// functionality related to editing, selection, and integration with +// the browser. `ProseMirror` is the class you'll want to instantiate +// and interact with when using the editor. + +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _main = require("./main"); + +Object.defineProperty(exports, "ProseMirror", { + enumerable: true, + get: function get() { + return _main.ProseMirror; + } +}); + +var _options = require("./options"); + +Object.defineProperty(exports, "defineOption", { + enumerable: true, + get: function get() { + return _options.defineOption; + } +}); +Object.defineProperty(exports, "Registry", { + enumerable: true, + get: function get() { + return _options.Registry; + } +}); +Object.defineProperty(exports, "defaultRegistry", { + enumerable: true, + get: function get() { + return _options.defaultRegistry; + } +}); + +var _selection = require("./selection"); + +Object.defineProperty(exports, "Range", { + enumerable: true, + get: function get() { + return _selection.Range; + } +}); + +var _keys = require("./keys"); + +Object.defineProperty(exports, "Keymap", { + enumerable: true, + get: function get() { + return _keys.Keymap; + } +}); +Object.defineProperty(exports, "keyName", { + enumerable: true, + get: function get() { + return _keys.keyName; + } +}); +Object.defineProperty(exports, "keyNames", { + enumerable: true, + get: function get() { + return _keys.keyNames; + } +}); + +var _range = require("./range"); + +Object.defineProperty(exports, "MarkedRange", { + enumerable: true, + get: function get() { + return _range.MarkedRange; + } +}); + +var _commands = require("./commands"); + +Object.defineProperty(exports, "defineCommand", { + enumerable: true, + get: function get() { + return _commands.defineCommand; + } +}); +Object.defineProperty(exports, "defineParamHandler", { + enumerable: true, + get: function get() { + return _commands.defineParamHandler; + } +}); +Object.defineProperty(exports, "Command", { + enumerable: true, + get: function get() { + return _commands.Command; + } +}); + +},{"./commands":22,"./keys":29,"./main":30,"./options":31,"./range":32,"./selection":33}],28:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = (function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); + } + }return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; + }; +})(); + +exports.dispatchKey = dispatchKey; + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +var _model = require("../model"); + +var _parseDom = require("../parse/dom"); + +var _parseText = require("../parse/text"); + +var _dom = require("../dom"); + +var _serializeDom = require("../serialize/dom"); + +var _serializeText = require("../serialize/text"); + +var _parse = require("../parse"); + +var _keys = require("./keys"); + +var _capturekeys = require("./capturekeys"); + +var _domchange = require("./domchange"); + +var _selection = require("./selection"); + +var stopSeq = null; + +/** + * A collection of DOM events that occur within the editor, and callback functions + * to invoke when the event fires. + */ +var handlers = {}; + +var Input = (function () { + function Input(pm) { + var _this = this; + + _classCallCheck(this, Input); + + this.pm = pm; + + this.keySeq = null; + + // When the user is creating a composed character, + // this is set to a Composing instance. + this.composing = null; + this.shiftKey = this.updatingComposition = false; + this.skipInput = 0; + + this.draggingFrom = false; + + this.keymaps = []; + this.defaultKeymap = null; + + this.storedMarks = null; + + this.dropTarget = pm.wrapper.appendChild((0, _dom.elt)("div", { "class": "ProseMirror-drop-target" })); + + var _loop = function _loop(_event) { + var handler = handlers[_event]; + pm.content.addEventListener(_event, function (e) { + return handler(pm, e); + }); + }; + + for (var _event in handlers) { + _loop(_event); + } + + pm.on("selectionChange", function () { + return _this.storedMarks = null; + }); + } + + /** + * Dispatch a key press to the internal keymaps, which will override the default + * DOM behavior. + * + * @param {ProseMirror} pm The editor instance. + * @param {string} name The name of the key pressed. + * @param {KeyboardEvent} e + * @return {string} If the key name has a mapping and the callback is invoked ("handled"), + * if the key name needs to be combined in sequence with the next key ("multi"), + * if there is no mapping ("nothing"). + */ + + _createClass(Input, [{ + key: "maybeAbortComposition", + value: function maybeAbortComposition() { + if (this.composing && !this.updatingComposition) { + if (this.composing.finished) { + finishComposing(this.pm); + } else { + // Toggle selection to force end of composition + this.composing = null; + this.skipInput++; + var sel = getSelection(); + if (sel.rangeCount) { + var range = sel.getRangeAt(0); + sel.removeAllRanges(); + sel.addRange(range); + } + } + return true; + } + } + }]); + + return Input; +})(); + +exports.Input = Input; + +function dispatchKey(pm, name, e) { + var seq = pm.input.keySeq; + // If the previous key should be used in sequence with this one, modify the name accordingly. + if (seq) { + if ((0, _keys.isModifierKey)(name)) return true; + clearTimeout(stopSeq); + stopSeq = setTimeout(function () { + if (pm.input.keySeq == seq) pm.input.keySeq = null; + }, 50); + name = seq + " " + name; + } + + var handle = function handle(bound) { + if (bound === false) return "nothing"; + if (bound == "...") return "multi"; + if (bound == null) return false; + + var result = false; + if (Array.isArray(bound)) { + for (var i = 0; result === false && i < bound.length; i++) { + result = handle(bound[i]); + } + } else if (typeof bound == "string") { + result = pm.execCommand(bound); + } else { + result = bound(pm); + } + return result == false ? false : "handled"; + }; + + var result = undefined; + for (var i = 0; !result && i < pm.input.keymaps.length; i++) { + result = handle(pm.input.keymaps[i].map.lookup(name, pm)); + }if (!result) result = handle(pm.baseKeymap.lookup(name, pm)) || handle(_capturekeys.captureKeys.lookup(name)); + + // If the key should be used in sequence with the next key, store the keyname internally. + if (result == "multi") pm.input.keySeq = name; + + if (result == "handled" || result == "multi") e.preventDefault(); + + if (seq && !result && /\'$/.test(name)) { + e.preventDefault(); + return true; + } + return !!result; +} + +handlers.keydown = function (pm, e) { + if (e.keyCode == 16) pm.input.shiftKey = true; + if (pm.input.composing) return; + var name = (0, _keys.keyName)(e); + if (name && dispatchKey(pm, name, e)) return; + pm.sel.pollForUpdate(); +}; + +handlers.keyup = function (pm, e) { + if (e.keyCode == 16) pm.input.shiftKey = false; +}; + +function inputText(pm, range, text) { + if (range.empty && !text) return false; + var marks = pm.input.storedMarks || pm.doc.marksAt(range.from); + var tr = pm.tr; + tr.replaceWith(range.from, range.to, pm.schema.text(text, marks)).apply(); + pm.scrollIntoView(); + // :: () #path=ProseMirror#events#textInput + // Fired when the user types text into the editor. + pm.signal("textInput", text); +} + +handlers.keypress = function (pm, e) { + if (pm.input.composing || !e.charCode || e.ctrlKey && !e.altKey || _dom.browser.mac && e.metaKey) return; + var ch = String.fromCharCode(e.charCode); + if (dispatchKey(pm, "'" + ch + "'", e)) return; + var sel = pm.selection; + if (sel.node && sel.node.contains == null) { + pm.tr["delete"](sel.from, sel.to).apply(); + sel = pm.selection; + } + inputText(pm, sel, ch); + e.preventDefault(); +}; + +function selectClickedNode(pm, e) { + var pos = (0, _selection.selectableNodeAbove)(pm, e.target, { left: e.clientX, top: e.clientY }, true); + if (!pos) return pm.sel.pollForUpdate(); + + var _pm$selection = pm.selection; + var node = _pm$selection.node; + var from = _pm$selection.from; + + if (node && pos.depth >= from.depth && pos.shorten(from.depth).cmp(from) == 0) { + if (from.depth == 0) return pm.sel.pollForUpdate(); + pos = from.shorten(); + } + + pm.setNodeSelection(pos); + pm.focus(); + e.preventDefault(); +} + +var lastClick = 0; + +handlers.mousedown = function (pm, e) { + if (e.ctrlKey) return selectClickedNode(pm, e); + + pm.sel.pollForUpdate(); + + var now = Date.now(), + multi = now - lastClick < 500; + lastClick = now; + if (pm.input.shiftKey || multi) return; + + var x = e.clientX, + y = e.clientY, + moved = false; + var up = function up() { + removeEventListener("mouseup", up); + removeEventListener("mousemove", move); + if ((0, _selection.handleNodeClick)(pm, e)) return; + + var pos = !moved && (0, _selection.selectableNodeAbove)(pm, e.target, { left: e.clientX, top: e.clientY }); + if (pos) { + pm.setNodeSelection(pos); + pm.focus(); + } else { + pm.sel.pollForUpdate(); + } + }; + var move = function move(e) { + if (!moved && (Math.abs(x - e.clientX) > 4 || Math.abs(y - e.clientY) > 4)) moved = true; + pm.sel.pollForUpdate(); + }; + addEventListener("mouseup", up); + addEventListener("mousemove", move); +}; + +handlers.touchdown = function (pm) { + pm.sel.pollForUpdate(); +}; + +/** + * A class to track state while creating a composed character. + */ + +var Composing = function Composing(pm, data) { + _classCallCheck(this, Composing); + + this.finished = false; + this.context = (0, _domchange.textContext)(data); + this.data = data; + this.endData = null; + var range = pm.selection; + if (data) { + var path = range.head.path, + line = pm.doc.path(path).textContent; + var found = line.indexOf(data, range.head.offset - data.length); + if (found > -1 && found <= range.head.offset + data.length) range = new _selection.TextSelection(new _model.Pos(path, found), new _model.Pos(path, found + data.length)); + } + this.range = range; +}; + +handlers.compositionstart = function (pm, e) { + if (pm.input.maybeAbortComposition()) return; + + pm.flush(); + pm.input.composing = new Composing(pm, e.data); + var above = pm.selection.head.shorten(); + pm.markRangeDirty({ from: above, to: above.move(1) }); +}; + +handlers.compositionupdate = function (pm, e) { + var info = pm.input.composing; + if (info && info.data != e.data) { + info.data = e.data; + pm.input.updatingComposition = true; + inputText(pm, info.range, info.data); + pm.input.updatingComposition = false; + info.range = new _selection.TextSelection(info.range.from, info.range.from.move(info.data.length)); + } +}; + +handlers.compositionend = function (pm, e) { + var info = pm.input.composing; + if (info) { + pm.input.composing.finished = true; + pm.input.composing.endData = e.data; + setTimeout(function () { + if (pm.input.composing == info) finishComposing(pm); + }, 20); + } +}; + +function finishComposing(pm) { + var info = pm.input.composing; + var text = (0, _domchange.textInContext)(info.context, info.endData); + var range = (0, _selection.rangeFromDOMLoose)(pm); + pm.ensureOperation(); + pm.input.composing = null; + if (text != info.data) inputText(pm, info.range, text); + if (range && !range.eq(pm.sel.range)) pm.setSelectionDirect(range); +} + +handlers.input = function (pm) { + if (pm.input.skipInput) return --pm.input.skipInput; + + if (pm.input.composing) { + if (pm.input.composing.finished) finishComposing(pm); + return; + } + + pm.sel.stopPollingForUpdate(); + (0, _domchange.applyDOMChange)(pm); + pm.scrollIntoView(); +}; + +var lastCopied = null; + +handlers.copy = handlers.cut = function (pm, e) { + var _pm$selection2 = pm.selection; + var from = _pm$selection2.from; + var to = _pm$selection2.to; + var empty = _pm$selection2.empty; + + if (empty) return; + var fragment = pm.selectedDoc; + lastCopied = { doc: pm.doc, from: from, to: to, + html: (0, _serializeDom.toHTML)(fragment), + text: (0, _serializeText.toText)(fragment) }; + + if (e.clipboardData) { + e.preventDefault(); + e.clipboardData.clearData(); + e.clipboardData.setData("text/html", lastCopied.html); + e.clipboardData.setData("text/plain", lastCopied.text); + if (e.type == "cut" && !empty) pm.tr["delete"](from, to).apply(); + } +}; + +handlers.paste = function (pm, e) { + if (!e.clipboardData) return; + var sel = pm.selection; + var txt = e.clipboardData.getData("text/plain"); + var html = e.clipboardData.getData("text/html"); + if (html || txt) { + e.preventDefault(); + var doc = undefined, + from = undefined, + to = undefined; + if (pm.input.shiftKey && txt) { + doc = (0, _parseText.fromText)(pm.schema, txt); + } else if (lastCopied && (lastCopied.html == html || lastCopied.text == txt)) { + ;var _lastCopied = lastCopied; + doc = _lastCopied.doc; + from = _lastCopied.from; + to = _lastCopied.to; + } else if (html) { + doc = (0, _parseDom.fromHTML)(pm.schema, html); + } else { + doc = (0, _parse.parseFrom)(pm.schema, txt, (0, _parse.knownSource)("markdown") ? "markdown" : "text"); + } + pm.tr.replace(sel.from, sel.to, doc, from || (0, _selection.findSelectionAtStart)(doc).from, to || (0, _selection.findSelectionAtEnd)(doc).to).apply(); + pm.scrollIntoView(); + } +}; + +handlers.dragstart = function (pm, e) { + if (!e.dataTransfer) return; + + var fragment = pm.selectedDoc; + + e.dataTransfer.setData("text/html", (0, _serializeDom.toHTML)(fragment)); + e.dataTransfer.setData("text/plain", (0, _serializeText.toText)(fragment)); + pm.input.draggingFrom = true; +}; + +handlers.dragend = function (pm) { + return window.setTimeout(function () { + return pm.input.dragginFrom = false; + }, 50); +}; + +handlers.dragover = handlers.dragenter = function (pm, e) { + e.preventDefault(); + var cursorPos = pm.posAtCoords({ left: e.clientX, top: e.clientY }); + if (!cursorPos) return; + var coords = (0, _selection.coordsAtPos)(pm, cursorPos); + var rect = pm.wrapper.getBoundingClientRect(); + coords.top -= rect.top; + coords.right -= rect.left; + coords.bottom -= rect.top; + coords.left -= rect.left; + var target = pm.input.dropTarget; + target.style.display = "block"; + target.style.left = coords.left - 1 + "px"; + target.style.top = coords.top + "px"; + target.style.height = coords.bottom - coords.top + "px"; +}; + +handlers.dragleave = function (pm) { + return pm.input.dropTarget.style.display = ""; +}; + +handlers.drop = function (pm, e) { + pm.input.dropTarget.style.display = ""; + + if (!e.dataTransfer) return; + + var html = undefined, + txt = undefined, + doc = undefined; + if (html = e.dataTransfer.getData("text/html")) doc = (0, _parseDom.fromHTML)(pm.schema, html, { document: document });else if (txt = e.dataTransfer.getData("text/plain")) doc = (0, _parse.parseFrom)(pm.schema, txt, (0, _parse.knownSource)("markdown") ? "markdown" : "text"); + + if (doc) { + e.preventDefault(); + var insertPos = pm.posAtCoords({ left: e.clientX, top: e.clientY }); + if (!insertPos) return; + var tr = pm.tr; + if (pm.input.draggingFrom && !e.ctrlKey) { + tr.deleteSelection(); + insertPos = tr.map(insertPos).pos; + } + tr.replace(insertPos, insertPos, doc, (0, _selection.findSelectionAtStart)(doc).from, (0, _selection.findSelectionAtEnd)(doc).to).apply(); + pm.setTextSelection(insertPos, tr.map(insertPos).pos); + pm.focus(); + } +}; + +handlers.focus = function (pm) { + (0, _dom.addClass)(pm.wrapper, "ProseMirror-focused"); + // :: () #path=ProseMirror#events#focus + // Fired when the editor gains focus. + pm.signal("focus"); +}; + +handlers.blur = function (pm) { + (0, _dom.rmClass)(pm.wrapper, "ProseMirror-focused"); + // :: () #path=ProseMirror#events#blur + // Fired when the editor loses focus. + pm.signal("blur"); +}; + +},{"../dom":19,"../model":45,"../parse":51,"../parse/dom":50,"../parse/text":52,"../serialize/dom":53,"../serialize/text":55,"./capturekeys":20,"./domchange":24,"./keys":29,"./selection":33}],29:[function(require,module,exports){ +// From CodeMirror, should be factored into its own NPM module + +// declare_global: navigator +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = (function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); + } + }return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; + }; +})(); + +exports.keyName = keyName; +exports.isModifierKey = isModifierKey; +exports.normalizeKeyName = normalizeKeyName; + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +var mac = typeof navigator != "undefined" ? /Mac/.test(navigator.platform) : false; + +// :: Object +// A map from key codes to key names. +var keyNames = { + 3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt", + 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End", + 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert", + 46: "Delete", 59: ";", 61: "=", 91: "Mod", 92: "Mod", 93: "Mod", + 106: "*", 107: "=", 109: "-", 110: ".", 111: "/", 127: "Delete", + 173: "-", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", + 221: "]", 222: "'", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete", + 63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert" +}; + +exports.keyNames = keyNames; +// Number keys +for (var i = 0; i < 10; i++) { + keyNames[i + 48] = keyNames[i + 96] = String(i); +} // Alphabetic keys +for (var i = 65; i <= 90; i++) { + keyNames[i] = String.fromCharCode(i); +} // Function keys +for (var i = 1; i <= 12; i++) { + keyNames[i + 111] = keyNames[i + 63235] = "F" + i; +} // :: (KeyboardEvent) → ?string +// Find a name for the given keydown event. If the keycode in the +// event is not known, this will return `null`. Otherwise, it will +// return a string like `"Shift-Cmd-Ctrl-Alt-Home"`. The parts before +// the dashes give the modifiers (always in that order, if present), +// and the last word gives the key name, which one of the names in +// `keyNames`. +// +// The convention for keypress events is to use the pressed character +// between single quotes. Due to limitations in the browser API, +// keypress events can not have modifiers. + +function keyName(event) { + var base = keyNames[event.keyCode], + name = base; + if (name == null || event.altGraphKey) return null; + + if (event.altKey && base != "Alt") name = "Alt-" + name; + if (event.ctrlKey && base != "Ctrl") name = "Ctrl-" + name; + if (event.metaKey && base != "Cmd") name = "Cmd-" + name; + if (event.shiftKey && base != "Shift") name = "Shift-" + name; + return name; +} + +// :: (string) → bool +// Test whether the given key name refers to a modifier key. + +function isModifierKey(name) { + name = /[^-]*$/.exec(name)[0]; + return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod"; +} + +// :: (string) → string +// Normalize a sloppy key name, which may have modifiers in the wrong +// order or use shorthands for modifiers, to a properly formed key +// name. Used to normalize names provided in keymaps. +// +// Note that the modifier `mod` is a shorthand for `Cmd` on Mac, and +// `Ctrl` on other platforms. + +function normalizeKeyName(name) { + var parts = name.split(/-(?!'?$)/), + result = parts[parts.length - 1]; + var alt = undefined, + ctrl = undefined, + shift = undefined, + cmd = undefined; + for (var i = 0; i < parts.length - 1; i++) { + var mod = parts[i]; + if (/^(cmd|meta|m)$/i.test(mod)) cmd = true;else if (/^a(lt)?$/i.test(mod)) alt = true;else if (/^(c|ctrl|control)$/i.test(mod)) ctrl = true;else if (/^s(hift)$/i.test(mod)) shift = true;else if (/^mod$/i.test(mod)) { + if (mac) cmd = true;else ctrl = true; + } else throw new Error("Unrecognized modifier name: " + mod); + } + if (alt) result = "Alt-" + result; + if (ctrl) result = "Ctrl-" + result; + if (cmd) result = "Cmd-" + result; + if (shift) result = "Shift-" + result; + return result; +} + +// ;; A keymap binds a set of [key names](#keyName) to commands names +// or functions. + +var Keymap = (function () { + // :: (Object, ?Object) + // Construct a keymap using the bindings in `keys`, whose properties + // should be [key names](#keyName) or space-separated sequences of + // key names. In the second case, the binding will be for a + // multi-stroke key combination. + // + // When `options` has a property `call`, this will be a programmatic + // keymap, meaning that instead of looking keys up in its set of + // bindings, it will pass the key name to `options.call`, and use + // the return value of that calls as the resolved binding. + // + // `options.name` can be used to give the keymap a name, making it + // easier to [remove](#ProseMirror.removeKeymap) from an editor. + + function Keymap(keys, options) { + _classCallCheck(this, Keymap); + + this.options = options || {}; + this.bindings = Object.create(null); + if (keys) for (var keyname in keys) { + if (Object.prototype.hasOwnProperty.call(keys, keyname)) this.addBinding(keyname, keys[keyname]); + } + } + + // :: (string, any) + // Add a binding for the given key or key sequence. + + _createClass(Keymap, [{ + key: "addBinding", + value: function addBinding(keyname, value) { + var keys = keyname.split(/ +(?!\'$)/).map(normalizeKeyName); + for (var i = 0; i < keys.length; i++) { + var _name = keys.slice(0, i + 1).join(" "); + var val = i == keys.length - 1 ? value : "..."; + var prev = this.bindings[_name]; + if (!prev) this.bindings[_name] = val;else if (prev != val) throw new Error("Inconsistent bindings for " + _name); + } + } + + // :: (string) + // Remove the binding for the given key or key sequence. + }, { + key: "removeBinding", + value: function removeBinding(keyname) { + var keys = keyname.split(/ +(?!\'$)/).map(normalizeKeyName); + for (var i = keys.length - 1; i >= 0; i--) { + var _name2 = keys.slice(0, i).join(" "); + var val = this.bindings[_name2]; + if (val == "..." && !this.unusedMulti(_name2)) break;else if (val) delete this.bindings[_name2]; + } + } + }, { + key: "unusedMulti", + value: function unusedMulti(name) { + for (var binding in this.bindings) { + if (binding.length > name && binding.indexOf(name) == 0 && binding.charAt(name.length) == " ") return false; + }return true; + } + + // :: (string, ?any) → any + // Looks up the given key or key sequence in this keymap. Returns + // the value the key is bound to (which may be undefined if it is + // not bound), or the string `"..."` if the key is a prefix of a + // multi-key sequence that is bound by this keymap. + }, { + key: "lookup", + value: function lookup(key, context) { + return this.options.call ? this.options.call(key, context) : this.bindings[key]; + } + }]); + + return Keymap; +})(); + +exports.Keymap = Keymap; + +},{}],30:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _get = function get(_x4, _x5, _x6) { + var _again = true;_function: while (_again) { + var object = _x4, + property = _x5, + receiver = _x6;_again = false;if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) { + var parent = Object.getPrototypeOf(object);if (parent === null) { + return undefined; + } else { + _x4 = parent;_x5 = property;_x6 = receiver;_again = true;desc = parent = undefined;continue _function; + } + } else if ("value" in desc) { + return desc.value; + } else { + var getter = desc.get;if (getter === undefined) { + return undefined; + }return getter.call(receiver); + } + } +}; + +var _createClass = (function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); + } + }return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; + }; +})(); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { "default": obj }; +} + +function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; +} + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +require("./css"); + +var _model = require("../model"); + +var _transform = require("../transform"); + +var _utilSortedinsert = require("../util/sortedinsert"); + +var _utilSortedinsert2 = _interopRequireDefault(_utilSortedinsert); + +var _utilMap = require("../util/map"); + +var _utilEvent = require("../util/event"); + +var _dom = require("../dom"); + +var _serializeText = require("../serialize/text"); + +require("../parse/text"); + +var _parse = require("../parse"); + +var _serialize = require("../serialize"); + +var _options = require("./options"); + +var _selection2 = require("./selection"); + +var _draw = require("./draw"); + +var _input = require("./input"); + +var _history = require("./history"); + +var _commands = require("./commands"); + +var _range = require("./range"); + +var _keys = require("./keys"); + +// ;; This is the class used to represent instances of the editor. A +// ProseMirror editor holds a [document](#Node) and a +// [selection](#Selection), and displays an editable surface +// representing that document in the browser document. +// +// Contains event methods (`on`, etc) from the [event +// mixin](#EventMixin). + +var ProseMirror = (function () { + // :: (Object) + // Construct a new editor from a set of [options](#edit_options) + // and, if it has a [`place`](#place) option, add it to the + // document. + + function ProseMirror(opts) { + _classCallCheck(this, ProseMirror); + + opts = this.options = (0, _options.parseOptions)(opts); + // :: Schema + // The schema for this editor's document. + this.schema = opts.schema; + if (opts.doc == null) opts.doc = this.schema.node("doc", null, [this.schema.node("paragraph")]); + // :: DOMNode + // The editable DOM node containing the document. + this.content = (0, _dom.elt)("div", { "class": "ProseMirror-content" }); + // :: DOMNode + // The outer DOM element of the editor. + this.wrapper = (0, _dom.elt)("div", { "class": "ProseMirror" }, this.content); + this.wrapper.ProseMirror = this; + + if (opts.place && opts.place.appendChild) opts.place.appendChild(this.wrapper);else if (opts.place) opts.place(this.wrapper); + + this.setDocInner(opts.docFormat ? (0, _parse.parseFrom)(this.schema, opts.doc, opts.docFormat) : opts.doc); + (0, _draw.draw)(this, this.doc); + this.content.contentEditable = true; + if (opts.label) this.content.setAttribute("aria-label", opts.label); + + // :: Object + // A namespace where modules can store references to themselves + // associated with this editor instance. + this.mod = Object.create(null); + this.operation = null; + this.dirtyNodes = new _utilMap.Map(); // Maps node object to 1 (re-scan content) or 2 (redraw entirely) + this.flushScheduled = false; + + this.sel = new _selection2.SelectionState(this); + this.accurateSelection = false; + this.input = new _input.Input(this); + + // :: Object + // The commands available in the editor. + this.commands = (0, _commands.initCommands)(this); + this.commandKeys = Object.create(null); + + (0, _options.initOptions)(this); + } + + // :: (string, any) + // Update the value of the given [option](#edit_options). + + _createClass(ProseMirror, [{ + key: "setOption", + value: function setOption(name, value) { + (0, _options.setOption)(this, name, value); + } + + // :: (string) → any + // Get the current value of the given [option](#edit_options). + }, { + key: "getOption", + value: function getOption(name) { + return this.options[name]; + } + + // :: Selection + // Get the current selection. + }, { + key: "setTextSelection", + + // :: (Pos, ?Pos) + // Set the selection to a [text selection](#TextSelection) from + // `anchor` to `head`, or, if `head` is null, a cursor selection at + // `anchor`. + value: function setTextSelection(anchor, head) { + this.setSelection(new _selection2.TextSelection(anchor, head)); + } + + // :: (Pos) + // Set the selection to a node selection on the node after `pos`. + }, { + key: "setNodeSelection", + value: function setNodeSelection(pos) { + this.checkPos(pos, false); + var parent = this.doc.path(pos.path); + if (pos.offset >= parent.size) throw new Error("Trying to set a node selection at the end of a node"); + var node = parent.child(pos.offset); + if (!node.type.selectable) throw new Error("Trying to select a non-selectable node"); + this.input.maybeAbortComposition(); + this.sel.setAndSignal(new _selection2.NodeSelection(pos, pos.move(1), node)); + } + + // :: (Selection) + // Set the selection to the given selection object. + }, { + key: "setSelection", + value: function setSelection(selection) { + if (selection instanceof _selection2.TextSelection) { + this.checkPos(selection.head, true); + if (!selection.empty) this.checkPos(selection.anchor, true); + } else { + this.checkPos(selection.to, false); + } + this.setSelectionDirect(selection); + } + }, { + key: "setSelectionDirect", + value: function setSelectionDirect(selection) { + this.ensureOperation(); + this.input.maybeAbortComposition(); + if (!selection.eq(this.sel.range)) this.sel.setAndSignal(selection); + } + + // :: (any, ?string) + // Replace the editor's document. When `format` is given, it should + // be a [parsable format](#parse), and `value` should something in + // that format. If not, `value` should be a `Node`. + }, { + key: "setContent", + value: function setContent(value, format) { + if (format) value = (0, _parse.parseFrom)(this.schema, value, format); + this.setDoc(value); + } + + // :: (?string) → any + // Get the editor's content in a given format. When `format` is not + // given, a `Node` is returned. If it is given, it should be an + // existing [serialization format](#serialize). + }, { + key: "getContent", + value: function getContent(format) { + return format ? (0, _serialize.serializeTo)(this.doc, format) : this.doc; + } + }, { + key: "setDocInner", + value: function setDocInner(doc) { + if (doc.type != this.schema.nodes.doc) throw new Error("Trying to set a document with a different schema"); + // :: Node The current document. + this.doc = doc; + this.ranges = new _range.RangeStore(this); + this.history = new _history.History(this); + } + + // :: (Node, ?Selection) + // Set the editor's content, and optionally include a new selection. + }, { + key: "setDoc", + value: function setDoc(doc, sel) { + if (!sel) sel = (0, _selection2.findSelectionAtStart)(doc); + // :: (doc: Node, selection: Selection) #path=ProseMirror#events#beforeSetDoc + // Fired when [`setDoc`](#ProseMirror.setDoc) is called, before + // the document is actually updated. + this.signal("beforeSetDoc", doc, sel); + this.ensureOperation(); + this.setDocInner(doc); + this.sel.set(sel, true); + // :: (doc: Node, selection: Selection) #path=ProseMirror#events#setDoc + // Fired when [`setDoc`](#ProseMirror.setDoc) is called, after + // the document is updated. + this.signal("setDoc", doc, sel); + } + }, { + key: "updateDoc", + value: function updateDoc(doc, mapping, selection) { + this.ensureOperation(); + this.input.maybeAbortComposition(); + this.ranges.transform(mapping); + this.doc = doc; + this.sel.setAndSignal(selection || this.sel.range.map(doc, mapping)); + // :: () #path=ProseMirror#events#change + // Fired when the document has changed. See + // [`setDoc`](#ProseMirror.event_setDoc) and + // [`transform`](#ProseMirror.event_transform) for more specific + // change-related events. + this.signal("change"); + } + + // :: EditorTransform + // Create an editor- and selection-aware `Transform` for this editor. + }, { + key: "apply", + + // :: (Transform, ?Object) → ?Transform + // Apply a transformation (which you might want to create with the + // [`tr` getter](#ProseMirror.tr)) to the document in the editor. + // The following options are supported: + // + // **`selection`**`: ?Selection` + // : A new selection to set after the transformation is applied. + // + // **`scrollIntoView`**: ?bool + // : When true, scroll the selection into view on the next + // [redraw](#ProseMirror.flush). + // + // Returns the transform, or `false` if there were no steps in it. + value: function apply(transform) { + var options = arguments.length <= 1 || arguments[1] === undefined ? nullOptions : arguments[1]; + + if (transform.doc == this.doc) return false; + if (transform.docs[0] != this.doc && (0, _model.findDiffStart)(transform.docs[0], this.doc)) throw new Error("Applying a transform that does not start with the current document"); + + this.updateDoc(transform.doc, transform, options.selection); + // :: (Transform, Object) #path=ProseMirror#events#transform + // Signals that a (non-empty) transformation has been aplied to + // the editor. Passes the `Transform` and the options given to + // [`apply`](#ProseMirror.apply) as arguments to the handler. + this.signal("transform", transform, options); + if (options.scrollIntoView) this.scrollIntoView(); + return transform; + } + + // :: (Pos, ?bool) + // Verify that the given position is valid in the current document, + // and throw an error otherwise. When `textblock` is true, the position + // must also fall within a textblock node. + }, { + key: "checkPos", + value: function checkPos(pos, textblock) { + if (!this.doc.isValidPos(pos, textblock)) throw new Error("Position " + pos + " is not valid in current document"); + } + }, { + key: "ensureOperation", + value: function ensureOperation() { + return this.operation || this.startOperation(); + } + }, { + key: "startOperation", + value: function startOperation() { + var _this = this; + + this.sel.beforeStartOp(); + this.operation = new Operation(this); + if (!this.flushScheduled) { + (0, _dom.requestAnimationFrame)(function () { + _this.flushScheduled = false; + _this.flush(); + }); + this.flushScheduled = true; + } + return this.operation; + } + + // :: () + // Flush any pending changes to the DOM. When the document, + // selection, or marked ranges in an editor change, the DOM isn't + // updated immediately, but rather scheduled to be updated the next + // time the browser redraws the screen. This method can be used to + // force this to happen immediately. It can be useful when you, for + // example, want to measure where on the screen a part of the + // document ends up, immediately after changing the document. + }, { + key: "flush", + value: function flush() { + if (!document.body.contains(this.wrapper) || !this.operation) return; + // :: () #path=ProseMirror#events#flushing + // Fired when the editor is about to [flush](#ProseMirror.flush) + // an update to the DOM. + this.signal("flushing"); + var op = this.operation; + if (!op) return; + this.operation = null; + this.accurateSelection = true; + + var docChanged = op.doc != this.doc || this.dirtyNodes.size, + redrawn = false; + if (!this.input.composing && (docChanged || op.composingAtStart)) { + (0, _draw.redraw)(this, this.dirtyNodes, this.doc, op.doc); + this.dirtyNodes.clear(); + redrawn = true; + } + + if ((redrawn || !op.sel.eq(this.sel.range)) && !this.input.composing) this.sel.toDOM(op.focus); + + if (op.scrollIntoView !== false) (0, _selection2.scrollIntoView)(this, op.scrollIntoView); + // :: () #path=ProseMirror#events#draw + // Fired when the editor redrew its document in the DOM. + if (docChanged) this.signal("draw"); + // :: () #path=ProseMirror#events#flush + // Fired when the editor has finished + // [flushing](#ProseMirror.flush) an update to the DOM. If you + // need to respond to this with a DOM update of your own, use this + // event to read layout from the DOM, and + // [`flushed`](#ProseMirror.event_flushed) to update the DOM. + this.signal("flush"); + // :: () #path=ProseMirror#events#flushed + // Fired when the editor has finished + // [flushing](#ProseMirror.flush) an update to the DOM, after + // [`flush`](#ProseMirror.event_flush) has fired. + this.signal("flushed"); + this.accurateSelection = false; + } + + // :: (Keymap, ?number) + // Add a [keymap](#Keymap) to the editor. Keymaps added in this way + // are queried before the [base keymap](#keymap). + // The `rank` parameter can be used to control when they are queried + // relative to other maps added like this. Maps with a lower rank + // get queried first. + }, { + key: "addKeymap", + value: function addKeymap(map) { + var rank = arguments.length <= 1 || arguments[1] === undefined ? 50 : arguments[1]; + + (0, _utilSortedinsert2["default"])(this.input.keymaps, { map: map, rank: rank }, function (a, b) { + return a.rank - b.rank; + }); + } + + // :: (union) + // Remove the given keymap, or the keymap with the given name, from + // the editor. + }, { + key: "removeKeymap", + value: function removeKeymap(map) { + var maps = this.input.keymaps; + for (var i = 0; i < maps.length; ++i) { + if (maps[i].map == map || maps[i].map.options.name == map) { + maps.splice(i, 1); + return true; + } + } + } + }, { + key: "markRange", + + // :: (Pos, Pos, ?Object) → MarkedRange + // Create a marked range between the given positions. Marked ranges + // “track” the part of the document they point to—as the document + // changes, they are updated to move, grow, and shrink along with + // their content. + // + // `options` may be an object containing these properties: + // + // **`inclusiveLeft`**`: bool = false` + // : Whether the left side of the range is inclusive. When it is, + // content inserted at that point will become part of the range. + // When not, it will be outside of the range. + // + // **`inclusiveRight`**`: bool = false` + // : Whether the right side of the range is inclusive. + // + // **`removeWhenEmpty`**`: bool = true` + // : Whether the range should be forgotten when it becomes empty + // (because all of its content was deleted). + // + // **`className`**: string + // : A CSS class to add to the inline content that is part of this + // range. + value: function markRange(from, to, options) { + this.checkPos(from); + this.checkPos(to); + var range = new _range.MarkedRange(from, to, options); + this.ranges.addRange(range); + return range; + } + + // :: (MarkedRange) + // Remove the given range from the editor. + }, { + key: "removeRange", + value: function removeRange(range) { + this.ranges.removeRange(range); + } + + // :: (MarkType, ?bool, ?Object) + // Set (when `to` is true), unset (`to` is false), or toggle (`to` + // is null) the given mark type on the selection. When there is a + // non-empty selection, the marks of the selection are updated. When + // the selection is empty, the set of [active + // marks](#ProseMirror.activeMarks) is updated. + }, { + key: "setMark", + value: function setMark(type, to, attrs) { + var sel = this.selection; + if (sel.empty) { + var marks = this.activeMarks(); + if (to == null) to = !type.isInSet(marks); + if (to && !this.doc.path(sel.head.path).type.canContainMark(type)) return; + this.input.storedMarks = to ? type.create(attrs).addToSet(marks) : type.removeFromSet(marks); + // :: () #path=ProseMirror#events#activeMarkChange + // Fired when the set of [active marks](#ProseMirror.activeMarks) changes. + this.signal("activeMarkChange"); + } else { + if (to != null ? to : !this.doc.rangeHasMark(sel.from, sel.to, type)) this.apply(this.tr.addMark(sel.from, sel.to, type.create(attrs)));else this.apply(this.tr.removeMark(sel.from, sel.to, type)); + } + } + + // :: () → [Mark] + // Get the marks at the cursor. By default, this yields the marks + // associated with the content at the cursor, as per `Node.marksAt`. + // But `setMark` may have been used to change the set of active + // marks, in which case that set is returned. + }, { + key: "activeMarks", + value: function activeMarks() { + var head; + return this.input.storedMarks || ((head = this.selection.head) ? this.doc.marksAt(head) : []); + } + + // :: () + // Give the editor focus. + }, { + key: "focus", + value: function focus() { + if (this.operation) this.operation.focus = true;else this.sel.toDOM(true); + } + + // :: () → bool + // Query whether the editor has focus. + }, { + key: "hasFocus", + value: function hasFocus() { + if (this.sel.range instanceof _selection2.NodeSelection) return document.activeElement == this.content;else return (0, _selection2.hasFocus)(this); + } + + // :: () → Node + // Get the part of the document that falls within the selection. + }, { + key: "posAtCoords", + + // :: ({top: number, left: number}) → ?Pos + // If the given coordinates (which should be relative to the top + // left corner of the window—not the page) fall within the editable + // content, this method will return the document position that + // corresponds to those coordinates. + value: function posAtCoords(coords) { + return (0, _selection2.posAtCoords)(this, coords); + } + + // :: (Pos) → {top: number, left: number, bottom: number} + // Find the screen coordinates (relative to top left corner of the + // window) of the given document position. + }, { + key: "coordsAtPos", + value: function coordsAtPos(pos) { + this.checkPos(pos); + return (0, _selection2.coordsAtPos)(this, pos); + } + + // :: (?Pos) + // Scroll the given position, or the cursor position if `pos` isn't + // given, into view. + }, { + key: "scrollIntoView", + value: function scrollIntoView() { + var pos = arguments.length <= 0 || arguments[0] === undefined ? null : arguments[0]; + + if (pos) this.checkPos(pos); + this.ensureOperation(); + this.operation.scrollIntoView = pos; + } + + // :: (string, ?[any]) → bool + // Execute the named [command](#Command). If the command takes + // parameters and they are not passed here, the user will be + // prompted for them. + }, { + key: "execCommand", + value: function execCommand(name, params) { + var cmd = this.commands[name]; + return !!(cmd && cmd.exec(this, params) !== false); + } + + // :: (string) → ?string + // Return the name of the key that is bound to the given command, if + // any. + }, { + key: "keyForCommand", + value: function keyForCommand(name) { + var cached = this.commandKeys[name]; + if (cached !== undefined) return cached; + + var cmd = this.commands[name], + keymap = this.baseKeymap; + if (!cmd) return this.commandKeys[name] = null; + var key = cmd.spec.key || (_dom.browser.mac ? cmd.spec.macKey : cmd.spec.pcKey); + if (key) { + key = (0, _keys.normalizeKeyName)(Array.isArray(key) ? key[0] : key); + var deflt = keymap.bindings[key]; + if (Array.isArray(deflt) ? deflt.indexOf(name) > -1 : deflt == name) return this.commandKeys[name] = key; + } + for (var _key in keymap.bindings) { + var bound = keymap.bindings[_key]; + if (Array.isArray(bound) ? bound.indexOf(name) > -1 : bound == name) return this.commandKeys[name] = _key; + } + return this.commandKeys[name] = null; + } + }, { + key: "registry", + value: function registry(name, f) { + var _this2 = this; + + this.schema.registry(name, f); + this.options.registries.forEach(function (reg) { + var array = reg.registry[name]; + if (array) for (var i = 0; i < array.length; i++) f(array[i], _this2); + }); + } + }, { + key: "markRangeDirty", + value: function markRangeDirty(range) { + this.ensureOperation(); + var dirty = this.dirtyNodes; + var from = range.from, + to = range.to; + for (var depth = 0, node = this.doc;; depth++) { + var fromEnd = depth == from.depth, + toEnd = depth == to.depth; + if (!fromEnd && !toEnd && from.path[depth] == to.path[depth]) { + var child = node.child(from.path[depth]); + if (!dirty.has(child)) dirty.set(child, DIRTY_RESCAN); + node = child; + } else { + var _ret = (function () { + var start = fromEnd ? from.offset : from.path[depth]; + var end = toEnd ? to.offset : to.path[depth] + 1; + if (node.isTextblock) { + node.forEach(function (child, cStart, cEnd) { + if (cStart < end && cEnd > start) dirty.set(child, DIRTY_REDRAW); + }); + } else { + for (var i = node.iter(start, end), child = undefined; child = i.next().value;) { + dirty.set(child, DIRTY_REDRAW); + } + } + return "break"; + })(); + + if (_ret === "break") break; + } + } + } + }, { + key: "selection", + get: function get() { + if (!this.accurateSelection) this.ensureOperation(); + return this.sel.range; + } + }, { + key: "tr", + get: function get() { + return new EditorTransform(this); + } + }, { + key: "baseKeymap", + get: function get() { + return this.options.keymap || this.defaultKeymap || (this.defaultKeymap = (0, _commands.defaultKeymap)(this)); + } + }, { + key: "selectedDoc", + get: function get() { + var sel = this.selection; + return this.doc.sliceBetween(sel.from, sel.to); + } + + // :: () → string + // Get the text that falls within the selection. + }, { + key: "selectedText", + get: function get() { + return (0, _serializeText.toText)(this.selectedDoc); + } + }]); + + return ProseMirror; +})(); + +exports.ProseMirror = ProseMirror; +var DIRTY_RESCAN = 1, + DIRTY_REDRAW = 2; + +exports.DIRTY_RESCAN = DIRTY_RESCAN; +exports.DIRTY_REDRAW = DIRTY_REDRAW; +var nullOptions = {}; + +(0, _utilEvent.eventMixin)(ProseMirror); + +var Operation = function Operation(pm) { + _classCallCheck(this, Operation); + + this.doc = pm.doc; + this.sel = pm.sel.range; + this.scrollIntoView = false; + this.focus = false; + this.composingAtStart = !!pm.input.composing; +} + +// ;; #toc=false A selection-aware extension of `Transform`. Use +// `ProseMirror.tr` to create an instance. +; + +var EditorTransform = (function (_Transform) { + _inherits(EditorTransform, _Transform); + + function EditorTransform(pm) { + _classCallCheck(this, EditorTransform); + + _get(Object.getPrototypeOf(EditorTransform.prototype), "constructor", this).call(this, pm.doc); + this.pm = pm; + } + + // :: (?Object) → ?EditorTransform + // Apply the transformation. Returns the transform, or `false` it is + // was empty. + + _createClass(EditorTransform, [{ + key: "apply", + value: function apply(options) { + return this.pm.apply(this, options); + } + + // :: Selection + // Get the editor's current selection, [mapped](#Selection.map) + // through the steps in this transform. + }, { + key: "replaceSelection", + + // :: (?Node, ?bool) → EditorTransform + // Replace the selection with the given node, or delete it if `node` + // is null. When `inheritMarks` is true and the node is an inline + // node, it inherits the marks from the place where it is inserted. + value: function replaceSelection(node, inheritMarks) { + var _selection = this.selection; + var empty = _selection.empty; + var from = _selection.from; + var to = _selection.to; + var selNode = _selection.node;var parent = undefined; + if (node && node.isInline && inheritMarks !== false) { + var marks = empty ? this.pm.input.storedMarks : this.doc.marksAt(from); + node = node.type.create(node.attrs, node.text, marks); + } + + if (selNode && selNode.isTextblock && node && node.isInline) { + // Putting inline stuff onto a selected textblock puts it inside + from = new _model.Pos(from.toPath(), 0); + to = new _model.Pos(from.path, selNode.size); + } else if (selNode) { + // This node can not simply be removed/replaced. Remove its parent as well + while (from.depth && from.offset == 0 && (parent = this.doc.path(from.path)) && from.offset == parent.size - 1 && !parent.type.canBeEmpty && !(node && parent.type.canContain(node))) { + from = from.shorten(); + to = to.shorten(null, 1); + } + } else if (node && node.isBlock && this.doc.path(from.path.slice(0, from.depth - 1)).type.canContain(node)) { + // Inserting a block node into a textblock. Try to insert it above by splitting the textblock + this["delete"](from, to); + var _parent = this.doc.path(from.path); + if (from.offset && from.offset != _parent.size) this.split(from); + return this.insert(from.shorten(null, from.offset ? 1 : 0), node); + } + + if (node) return this.replaceWith(from, to, node);else return this["delete"](from, to); + } + + // :: () → EditorTransform + // Delete the selection. + }, { + key: "deleteSelection", + value: function deleteSelection() { + return this.replaceSelection(); + } + + // :: (string) → EditorTransform + // Replace the selection with a text node containing the given string. + }, { + key: "typeText", + value: function typeText(text) { + return this.replaceSelection(this.pm.schema.text(text), true); + } + }, { + key: "selection", + get: function get() { + return this.steps.length ? this.pm.selection.map(this) : this.pm.selection; + } + }]); + + return EditorTransform; +})(_transform.Transform); + +},{"../dom":19,"../model":45,"../parse":51,"../parse/text":52,"../serialize":54,"../serialize/text":55,"../transform":57,"../util/event":67,"../util/map":68,"../util/sortedinsert":69,"./commands":22,"./css":23,"./draw":25,"./history":26,"./input":28,"./keys":29,"./options":31,"./range":32,"./selection":33}],31:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = (function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); + } + }return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; + }; +})(); + +exports.defineOption = defineOption; +exports.parseOptions = parseOptions; +exports.initOptions = initOptions; +exports.setOption = setOption; + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +var _model = require("../model"); + +// ;; A registry is a namespace for [commands](#Commands), input +// rules, and so on. They provide a way to define commands and such in +// a scoped way, without having them show up on all your editors by +// default all of a sudden. See also the [`registries` +// option](#registries). + +var Registry = (function () { + // :: (string) + // Create a new registry with the given name. + + function Registry(name) { + _classCallCheck(this, Registry); + + this.name = name; + this.registry = Object.create(null); + } + + // :: Registry + // The registry in which built-in commands and input rules are + // registered. The default content of the `registries` option. + + // :: (string, *) + // Register a new item in this registry. + + _createClass(Registry, [{ + key: "register", + value: function register(name, value) { + ;(this.registry[name] || (this.registry[name] = [])).push(value); + } + }]); + + return Registry; +})(); + +exports.Registry = Registry; +var defaultRegistry = new Registry("default"); + +exports.defaultRegistry = defaultRegistry; + +var Option = function Option(defaultValue, update, updateOnInit) { + _classCallCheck(this, Option); + + this.defaultValue = defaultValue; + this.update = update; + this.updateOnInit = updateOnInit !== false; +}; + +var options = Object.create(null); + +// :: (string, any, (pm: ProseMirror, newValue: any, oldValue: any, init: bool), bool) +// Define a new option. The `update` handler will be called with the +// option's old and new value every time the option is +// [changed](#ProseMirror.setOption). When `updateOnInit` is true, it +// is also called on editor init, with null as the old value, and a fourth +// argument of true. + +function defineOption(name, defaultValue, update, updateOnInit) { + options[name] = new Option(defaultValue, update, updateOnInit); +} + +// :: Schema #path=schema #kind=option +// The [schema](#Schema) that the editor's document should use. +defineOption("schema", _model.defaultSchema, false); + +// :: any #path=doc #kind=option +// The starting document. Usually a `Node`, but can be in another +// format when the `docFormat` option is also specified. +defineOption("doc", null, function (pm, value) { + return pm.setDoc(value); +}, false); + +// :: ?string #path=docFormat #kind=option +// The format in which the `doc` option is given. Defaults to `null` +// (a raw `Node`). +defineOption("docFormat", null); + +// :: ?union #path=place #kind=option +// Determines the placement of the editor in the page. When `null`, +// the editor is not placed. When a DOM node is given, the editor is +// appended to that node. When a function is given, it is called +// with the editor's wrapping DOM node, and is expected to place it +// into the document. +defineOption("place", null); + +// :: Keymap #path=keymap #kind=option +// The base [keymap](#Keymap). When not given, a default keymap is +// synthesized from the default key bindings provided by the +// [commands](#Command) that are in scope for the editor. +defineOption("keymap", null); + +// :: [Registry] +// The set of [registries](#Registry) the editor should load items +// from. +defineOption("registries", [defaultRegistry], false); + +// :: number #path=historyDepth #kind=option +// The amount of history events that are collected before the oldest +// events are discarded. Defaults to 100. +defineOption("historyDepth", 100); + +// :: number #path=historyEventDelay #kind=option +// The amount of milliseconds that must pass between changes to +// start a new history event. Defaults to 500. +defineOption("historyEventDelay", 500); + +// :: string #path=commandParamHandler #kind=option +// The name of the handler used to prompt the user for [command +// parameters](#CommandParam). Only relevant when multiple such +// handlers are loaded, and you want to choose between them. +defineOption("commandParamHandler", "default"); + +// :: ?string #path=label #kind=option +// The label of the editor. When set, the editable DOM node gets an +// `aria-label` attribute with this value. +defineOption("label", null); + +function parseOptions(obj) { + var result = Object.create(null); + var given = obj ? [obj].concat(obj.use || []) : []; + outer: for (var opt in options) { + for (var i = 0; i < given.length; i++) { + if (opt in given[i]) { + result[opt] = given[i][opt]; + continue outer; + } + } + result[opt] = options[opt].defaultValue; + } + return result; +} + +function initOptions(pm) { + for (var opt in options) { + var desc = options[opt]; + if (desc.update && desc.updateOnInit) desc.update(pm, pm.options[opt], null, true); + } +} + +function setOption(pm, name, value) { + var desc = options[name]; + if (desc.update === false) throw new Error("Option '" + name + "' can not be changed"); + var old = pm.options[name]; + pm.options[name] = value; + if (desc.update) desc.update(pm, value, old, false); +} + +},{"../model":45}],32:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = (function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); + } + }return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; + }; +})(); + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +var _utilEvent = require("../util/event"); + +// ;; A [marked range](#ProseMirror.markRange). Includes the methods +// from the [event mixin](#EventMixin). + +var MarkedRange = (function () { + function MarkedRange(from, to, options) { + _classCallCheck(this, MarkedRange); + + this.options = options || {}; + // :: ?Pos + // The current start position of the range. Updated whenever the + // editor's document is changed. Set to `null` when the marked + // range is [removed](#ProseMirror.removeRange). + this.from = from; + // :: ?Pos + // The current end position of the range. Updated whenever the + // editor's document is changed. Set to `null` when the marked + // range is [removed](#ProseMirror.removeRange). + this.to = to; + } + + _createClass(MarkedRange, [{ + key: "remove", + value: function remove() { + // :: (from: Pos, to: Pos) #path=MarkedRange#events#removed + // Signalled when the marked range is removed from the editor. + this.signal("removed", this.from, this.to.max(this.from)); + this.from = this.to = null; + } + }]); + + return MarkedRange; +})(); + +exports.MarkedRange = MarkedRange; + +(0, _utilEvent.eventMixin)(MarkedRange); + +var RangeSorter = (function () { + function RangeSorter() { + _classCallCheck(this, RangeSorter); + + this.sorted = []; + } + + _createClass(RangeSorter, [{ + key: "find", + value: function find(at) { + var min = 0, + max = this.sorted.length; + for (;;) { + if (max < min + 10) { + for (var i = min; i < max; i++) { + if (this.sorted[i].at.cmp(at) >= 0) return i; + }return max; + } + var mid = min + max >> 1; + if (this.sorted[mid].at.cmp(at) > 0) max = mid;else min = mid; + } + } + }, { + key: "insert", + value: function insert(obj) { + this.sorted.splice(this.find(obj.at), 0, obj); + } + }, { + key: "remove", + value: function remove(at, range) { + var pos = this.find(at); + for (var dist = 0;; dist++) { + var leftPos = pos - dist - 1, + rightPos = pos + dist; + if (leftPos >= 0 && this.sorted[leftPos].range == range) { + this.sorted.splice(leftPos, 1); + return; + } else if (rightPos < this.sorted.length && this.sorted[rightPos].range == range) { + this.sorted.splice(rightPos, 1); + return; + } + } + } + }, { + key: "resort", + value: function resort() { + for (var i = 0; i < this.sorted.length; i++) { + var cur = this.sorted[i]; + var at = cur.at = cur.type == "open" ? cur.range.from : cur.range.to; + var pos = i; + while (pos > 0 && this.sorted[pos - 1].at.cmp(at) > 0) { + this.sorted[pos] = this.sorted[pos - 1]; + this.sorted[--pos] = cur; + } + } + } + }]); + + return RangeSorter; +})(); + +var RangeStore = (function () { + function RangeStore(pm) { + _classCallCheck(this, RangeStore); + + this.pm = pm; + this.ranges = []; + this.sorted = new RangeSorter(); + } + + _createClass(RangeStore, [{ + key: "addRange", + value: function addRange(range) { + this.ranges.push(range); + this.sorted.insert({ type: "open", at: range.from, range: range }); + this.sorted.insert({ type: "close", at: range.to, range: range }); + this.pm.markRangeDirty(range); + } + }, { + key: "removeRange", + value: function removeRange(range) { + var found = this.ranges.indexOf(range); + if (found > -1) { + this.ranges.splice(found, 1); + this.sorted.remove(range.from, range); + this.sorted.remove(range.to, range); + this.pm.markRangeDirty(range); + range.remove(); + } + } + }, { + key: "transform", + value: function transform(mapping) { + for (var i = 0; i < this.ranges.length; i++) { + var range = this.ranges[i]; + range.from = mapping.map(range.from, range.options.inclusiveLeft ? -1 : 1).pos; + range.to = mapping.map(range.to, range.options.inclusiveRight ? 1 : -1).pos; + var diff = range.from.cmp(range.to); + if (range.options.removeWhenEmpty !== false && diff >= 0) { + this.removeRange(range); + i--; + } else if (diff > 0) { + range.to = range.from; + } + } + this.sorted.resort(); + } + }, { + key: "activeRangeTracker", + value: function activeRangeTracker() { + return new RangeTracker(this.sorted.sorted); + } + }]); + + return RangeStore; +})(); + +exports.RangeStore = RangeStore; + +var RangeTracker = (function () { + function RangeTracker(sorted) { + _classCallCheck(this, RangeTracker); + + this.sorted = sorted; + this.pos = 0; + this.current = []; + } + + _createClass(RangeTracker, [{ + key: "advanceTo", + value: function advanceTo(pos) { + var next = undefined; + while (this.pos < this.sorted.length && (next = this.sorted[this.pos]).at.cmp(pos) <= 0) { + var className = next.range.options.className; + if (!className) continue; + if (next.type == "open") this.current.push(className);else this.current.splice(this.current.indexOf(className), 1); + this.pos++; + } + } + }, { + key: "nextChangeBefore", + value: function nextChangeBefore(pos) { + for (;;) { + if (this.pos == this.sorted.length) return null; + var next = this.sorted[this.pos]; + if (!next.range.options.className) this.pos++;else if (next.at.cmp(pos) >= 0) return null;else return next.at.offset; + } + } + }]); + + return RangeTracker; +})(); + +},{"../util/event":67}],33:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _get = function get(_x, _x2, _x3) { + var _again = true;_function: while (_again) { + var object = _x, + property = _x2, + receiver = _x3;_again = false;if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) { + var parent = Object.getPrototypeOf(object);if (parent === null) { + return undefined; + } else { + _x = parent;_x2 = property;_x3 = receiver;_again = true;desc = parent = undefined;continue _function; + } + } else if ("value" in desc) { + return desc.value; + } else { + var getter = desc.get;if (getter === undefined) { + return undefined; + }return getter.call(receiver); + } + } +}; + +var _createClass = (function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); + } + }return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; + }; +})(); + +exports.posFromDOM = posFromDOM; +exports.rangeFromDOMLoose = rangeFromDOMLoose; +exports.findByPath = findByPath; +exports.resolvePath = resolvePath; +exports.hasFocus = hasFocus; +exports.posAtCoords = posAtCoords; +exports.coordsAtPos = coordsAtPos; +exports.scrollIntoView = scrollIntoView; +exports.findSelectionFrom = findSelectionFrom; +exports.findSelectionNear = findSelectionNear; +exports.findSelectionAtStart = findSelectionAtStart; +exports.findSelectionAtEnd = findSelectionAtEnd; +exports.selectableNodeAbove = selectableNodeAbove; +exports.handleNodeClick = handleNodeClick; +exports.verticalMotionLeavesTextblock = verticalMotionLeavesTextblock; +exports.setDOMSelectionToPos = setDOMSelectionToPos; + +function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; +} + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +var _model = require("../model"); + +var _dom = require("../dom"); + +var SelectionState = (function () { + function SelectionState(pm) { + var _this = this; + + _classCallCheck(this, SelectionState); + + this.pm = pm; + + this.range = findSelectionAtStart(pm.doc); + this.lastNonNodePos = null; + + this.pollState = null; + this.pollTimeout = null; + this.lastAnchorNode = this.lastHeadNode = this.lastAnchorOffset = this.lastHeadOffset = null; + this.lastNode = null; + + pm.content.addEventListener("focus", function () { + return _this.receivedFocus(); + }); + } + + _createClass(SelectionState, [{ + key: "setAndSignal", + value: function setAndSignal(range, clearLast) { + this.set(range, clearLast); + // :: () #path=ProseMirror#events#selectionChange + // Indicates that the editor's selection has changed. + this.pm.signal("selectionChange"); + } + }, { + key: "set", + value: function set(range, clearLast) { + this.range = range; + if (!range.node) this.lastNonNodePos = null; + if (clearLast !== false) this.lastAnchorNode = null; + } + }, { + key: "pollForUpdate", + value: function pollForUpdate() { + var _this2 = this; + + if (this.pm.input.composing) return; + clearTimeout(this.pollTimeout); + this.pollState = "update"; + var n = 0, + check = function check() { + if (_this2.pm.input.composing) { + // Abort + } else if (_this2.pm.operation) { + _this2.pollTimeout = setTimeout(check, 20); + } else if (!_this2.readUpdate() && ++n == 1) { + _this2.pollTimeout = setTimeout(check, 50); + } else { + _this2.stopPollingForUpdate(); + } + }; + this.pollTimeout = setTimeout(check, 20); + } + }, { + key: "stopPollingForUpdate", + value: function stopPollingForUpdate() { + if (this.pollState == "update") { + this.pollState = null; + this.pollToSync(); + } + } + }, { + key: "domChanged", + value: function domChanged() { + var sel = getSelection(); + return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset || sel.focusNode != this.lastHeadNode || sel.focusOffset != this.lastHeadOffset; + } + }, { + key: "storeDOMState", + value: function storeDOMState() { + var sel = getSelection(); + this.lastAnchorNode = sel.anchorNode;this.lastAnchorOffset = sel.anchorOffset; + this.lastHeadNode = sel.focusNode;this.lastHeadOffset = sel.focusOffset; + } + }, { + key: "readUpdate", + value: function readUpdate() { + if (this.pm.input.composing || !hasFocus(this.pm) || !this.domChanged()) return false; + + var sel = getSelection(), + doc = this.pm.doc; + var anchor = posFromDOMInner(this.pm, sel.anchorNode, sel.anchorOffset); + var head = posFromDOMInner(this.pm, sel.focusNode, sel.focusOffset); + var newSel = findSelectionNear(doc, head, this.range.head && this.range.head.cmp(head) < 0 ? -1 : 1); + if (newSel instanceof TextSelection && doc.path(anchor.path).isTextblock) newSel = new TextSelection(anchor, newSel.head); + this.setAndSignal(newSel); + if (newSel instanceof NodeSelection || newSel.head.cmp(head) || newSel.anchor.cmp(anchor)) { + this.toDOM(); + } else { + this.clearNode(); + this.storeDOMState(); + } + return true; + } + }, { + key: "pollToSync", + value: function pollToSync() { + var _this3 = this; + + if (this.pollState) return; + this.pollState = "sync"; + var sync = function sync() { + if (document.activeElement != _this3.pm.content) { + _this3.pollState = null; + } else { + if (!_this3.pm.operation && !_this3.pm.input.composing) _this3.syncDOM(); + _this3.pollTimeout = setTimeout(sync, 200); + } + }; + this.pollTimeout = setTimeout(sync, 200); + } + }, { + key: "syncDOM", + value: function syncDOM() { + if (!this.pm.input.composing && hasFocus(this.pm) && this.domChanged()) this.toDOM(); + } + }, { + key: "toDOM", + value: function toDOM(takeFocus) { + if (this.range instanceof NodeSelection) this.nodeToDOM(takeFocus);else this.rangeToDOM(takeFocus); + } + }, { + key: "nodeToDOM", + value: function nodeToDOM(takeFocus) { + window.getSelection().removeAllRanges(); + if (takeFocus) this.pm.content.focus(); + var pos = this.range.from, + node = this.range.node; + var dom = resolvePath(this.pm.content, pos.toPath()); + if (dom == this.lastNode) return; + this.clearNode(); + addNodeSelection(node, dom); + this.lastNode = dom; + } + }, { + key: "clearNode", + value: function clearNode() { + if (this.lastNode) { + clearNodeSelection(this.lastNode); + this.lastNode = null; + return true; + } + } + }, { + key: "rangeToDOM", + value: function rangeToDOM(takeFocus) { + var sel = window.getSelection(); + if (!this.clearNode() && !hasFocus(this.pm)) { + if (!takeFocus) return; + // See https://bugzilla.mozilla.org/show_bug.cgi?id=921444 + else if (_dom.browser.gecko) this.pm.content.focus(); + } + if (!this.domChanged()) return; + + var range = document.createRange(); + var content = this.pm.content; + var anchor = DOMFromPos(content, this.range.anchor); + var head = DOMFromPos(content, this.range.head); + + if (sel.extend) { + range.setEnd(anchor.node, anchor.offset); + range.collapse(false); + } else { + if (this.range.anchor.cmp(this.range.head) > 0) { + var tmp = anchor;anchor = head;head = tmp; + } + range.setEnd(head.node, head.offset); + range.setStart(anchor.node, anchor.offset); + } + sel.removeAllRanges(); + sel.addRange(range); + if (sel.extend) sel.extend(head.node, head.offset); + this.storeDOMState(); + } + }, { + key: "receivedFocus", + value: function receivedFocus() { + if (!this.pollState) this.pollToSync(); + } + }, { + key: "beforeStartOp", + value: function beforeStartOp() { + if (this.pollState == "update" && this.readUpdate()) { + clearTimeout(this.pollTimeout); + this.stopPollingForUpdate(); + } else { + this.syncDOM(); + } + } + }]); + + return SelectionState; +})(); + +exports.SelectionState = SelectionState; + +function clearNodeSelection(dom) { + dom.classList.remove("ProseMirror-selectednode"); +} + +function addNodeSelection(_node, dom) { + dom.classList.add("ProseMirror-selectednode"); +} + +function windowRect() { + return { left: 0, right: window.innerWidth, + top: 0, bottom: window.innerHeight }; +} + +// ;; An editor selection. Can be one of two selection types: +// `TextSelection` and `NodeSelection`. Both have the properties +// listed here, but also contain more information (such as the +// selected [node](#NodeSelection.node) or the +// [head](#TextSelection.head) and [anchor](#TextSelection.anchor)). + +var Selection = function Selection() { + _classCallCheck(this, Selection); +}; + +exports.Selection = Selection; + +// :: Pos #path=Selection.prototype.from +// The start of the selection. + +// :: Pos #path=Selection.prototype.to +// The end of the selection. + +// :: bool #path=Selection.empty +// True if the selection is an empty text selection (head an anchor +// are the same). + +// :: (other: Selection) → bool #path=Selection.eq +// Test whether the selection is the same as another selection. + +// :: (doc: Node, mapping: Mappable) → Selection #path=Selection.map +// Map this selection through a [mappable](#Mappable) thing. `doc` +// should be the new document, to which we are mapping. + +// ;; #toc=false A text selection represents a classical editor +// selection, with a head (the moving side) and anchor (immobile +// side), both of which point into textblock nodes. It can be empty (a +// regular cursor position). + +var TextSelection = (function (_Selection) { + _inherits(TextSelection, _Selection); + + // :: (Pos, ?Pos) + // Construct a text selection. When `head` is not given, it defaults + // to `anchor`. + + function TextSelection(anchor, head) { + _classCallCheck(this, TextSelection); + + _get(Object.getPrototypeOf(TextSelection.prototype), "constructor", this).call(this); + // :: Pos + // The selection's immobile side (does not move when pressing + // shift-arrow). + this.anchor = anchor; + // :: Pos + // The selection's mobile side (the side that moves when pressing + // shift-arrow). + this.head = head || anchor; + } + + // ;; #toc=false A node selection is a selection that points at a + // single node. All nodes marked [selectable](#NodeType.selectable) + // can be the target of a node selection. In such an object, `from` + // and `to` point directly before and after the selected node. + + _createClass(TextSelection, [{ + key: "eq", + value: function eq(other) { + return other instanceof TextSelection && !other.head.cmp(this.head) && !other.anchor.cmp(this.anchor); + } + }, { + key: "map", + value: function map(doc, mapping) { + var head = mapping.map(this.head).pos; + if (!doc.path(head.path).isTextblock) return findSelectionNear(doc, head); + var anchor = mapping.map(this.anchor).pos; + return new TextSelection(doc.path(anchor.path).isTextblock ? anchor : head, head); + } + }, { + key: "inverted", + get: function get() { + return this.anchor.cmp(this.head) > 0; + } + }, { + key: "from", + get: function get() { + return this.inverted ? this.head : this.anchor; + } + }, { + key: "to", + get: function get() { + return this.inverted ? this.anchor : this.head; + } + }, { + key: "empty", + get: function get() { + return this.anchor.cmp(this.head) == 0; + } + }]); + + return TextSelection; +})(Selection); + +exports.TextSelection = TextSelection; + +var NodeSelection = (function (_Selection2) { + _inherits(NodeSelection, _Selection2); + + // :: (Pos, Pos, Node) + // Create a node selection. Does not verify the validity of its + // arguments. Use `ProseMirror.setNodeSelection` for an easier, + // error-checking way to create a node selection. + + function NodeSelection(from, to, node) { + _classCallCheck(this, NodeSelection); + + _get(Object.getPrototypeOf(NodeSelection.prototype), "constructor", this).call(this); + this.from = from; + this.to = to; + // :: Node The selected node. + this.node = node; + } + + _createClass(NodeSelection, [{ + key: "eq", + value: function eq(other) { + return other instanceof NodeSelection && !this.from.cmp(other.from); + } + }, { + key: "map", + value: function map(doc, mapping) { + var from = mapping.map(this.from, 1).pos; + var to = mapping.map(this.to, -1).pos; + if (_model.Pos.samePath(from.path, to.path) && from.offset == to.offset - 1) { + var node = doc.nodeAfter(from); + if (node.type.selectable) return new NodeSelection(from, to, node); + } + return findSelectionNear(doc, from); + } + }, { + key: "empty", + get: function get() { + return false; + } + }]); + + return NodeSelection; +})(Selection); + +exports.NodeSelection = NodeSelection; + +function pathFromDOM(pm, node) { + var path = []; + for (; node != pm.content;) { + var attr = node.getAttribute("pm-offset"); + if (attr) path.unshift(+attr); + node = node.parentNode; + } + return path; +} + +function widthFromDOM(dom) { + var attr = dom.getAttribute("pm-leaf"); + return attr && attr != "true" ? +attr : 1; +} + +function posFromDOMInner(pm, dom, domOffset, loose) { + if (!loose && pm.operation && pm.doc != pm.operation.doc) throw new Error("Fetching a position from an outdated DOM structure"); + + var extraOffset = 0, + tag = undefined; + for (;;) { + var adjust = 0; + if (dom.nodeType == 3) { + extraOffset += domOffset; + } else if (dom.hasAttribute("pm-offset") || dom == pm.content) { + break; + } else if (tag = dom.getAttribute("pm-inner-offset")) { + extraOffset += +tag; + adjust = -1; + } else if (domOffset && domOffset == dom.childNodes.length) { + adjust = 1; + } + + var _parent = dom.parentNode; + domOffset = adjust < 0 ? 0 : Array.prototype.indexOf.call(_parent.childNodes, dom) + adjust; + dom = _parent; + } + + var path = pathFromDOM(pm, dom); + if (dom.hasAttribute("pm-leaf")) return _model.Pos.from(path, extraOffset + (domOffset ? 1 : 0)); + + var offset = 0; + for (var i = domOffset - 1; i >= 0; i--) { + var child = dom.childNodes[i]; + if (child.nodeType == 3) { + if (loose) extraOffset += child.nodeValue.length; + } else if (tag = child.getAttribute("pm-offset")) { + offset = +tag + widthFromDOM(child); + break; + } else if (loose && !child.hasAttribute("pm-ignore")) { + extraOffset += child.textContent.length; + } + } + return new _model.Pos(path, offset + extraOffset); +} + +function posFromDOM(pm, node, offset) { + if (offset == null) { + offset = Array.prototype.indexOf.call(node.parentNode.childNodes, node); + node = node.parentNode; + } + return posFromDOMInner(pm, node, offset); +} + +function rangeFromDOMLoose(pm) { + if (!hasFocus(pm)) return null; + var sel = getSelection(); + return new TextSelection(posFromDOMInner(pm, sel.anchorNode, sel.anchorOffset, true), posFromDOMInner(pm, sel.focusNode, sel.focusOffset, true)); +} + +function findByPath(node, n, fromEnd) { + for (var ch = fromEnd ? node.lastChild : node.firstChild; ch; ch = fromEnd ? ch.previousSibling : ch.nextSibling) { + if (ch.nodeType != 1) continue; + var offset = ch.getAttribute("pm-offset"); + if (!offset) { + var found = findByPath(ch, n); + if (found) return found; + } else if (+offset == n) { + return ch; + } + } +} + +function resolvePath(parent, path) { + var node = parent; + for (var i = 0; i < path.length; i++) { + node = findByPath(node, path[i]); + if (!node) throw new Error("Failed to resolve path " + path.join("/")); + } + return node; +} + +function findByOffset(node, offset, after) { + function search(node) { + for (var ch = node.firstChild, i = 0, attr = undefined; ch; ch = ch.nextSibling, i++) { + if (ch.nodeType != 1) continue; + if (attr = ch.getAttribute("pm-offset")) { + var diff = offset - +attr, + width = widthFromDOM(ch); + if (diff >= 0 && (after ? diff <= width : diff < width)) return { node: ch, offset: i, innerOffset: diff }; + } else { + var result = search(ch); + if (result) return result; + } + } + } + return search(node); +} + +function leafAt(node, offset) { + for (;;) { + var child = node.firstChild; + if (!child) return { node: node, offset: offset }; + if (child.nodeType != 1) return { node: child, offset: offset }; + if (child.hasAttribute("pm-inner-offset")) { + var nodeOffset = 0; + for (;;) { + var nextSib = child.nextSibling, + nextOffset = undefined; + if (!nextSib || (nextOffset = +nextSib.getAttribute("pm-inner-offset")) >= offset) break; + child = nextSib; + nodeOffset = nextOffset; + } + offset -= nodeOffset; + } + node = child; + } +} + +/** + * Get a DOM element at a given position in the document. + * + * @param {Node} parent The parent DOM node. + * @param {Pos} pos The position in the document. + * @return {Object} The DOM node and character offset inside the node. + */ +function DOMFromPos(parent, pos) { + var dom = resolvePath(parent, pos.path); + var found = findByOffset(dom, pos.offset, true), + inner = undefined; + if (!found) return { node: dom, offset: 0 }; + if (found.node.getAttribute("pm-leaf") == "true" || !(inner = leafAt(found.node, found.innerOffset))) return { node: found.node.parentNode, offset: found.offset + (found.innerOffset ? 1 : 0) };else return inner; +} + +function hasFocus(pm) { + var sel = window.getSelection(); + return sel.rangeCount && (0, _dom.contains)(pm.content, sel.anchorNode); +} + +/** + * Given an x,y position on the editor, get the position in the document. + * + * @param {ProseMirror} pm Editor instance. + * @param {Object} coords The x, y coordinates. + * @return {Pos} + */ +// FIXME fails on the space between lines +// FIXME reformulate as selectionAtCoords? So that it can't return null + +function posAtCoords(pm, coords) { + var element = document.elementFromPoint(coords.left, coords.top + 1); + if (!(0, _dom.contains)(pm.content, element)) return null; + + var offset = undefined; + if (element.childNodes.length == 1 && element.firstChild.nodeType == 3) { + element = element.firstChild; + offset = offsetInTextNode(element, coords); + } else { + offset = offsetInElement(element, coords); + } + + return posFromDOM(pm, element, offset); +} + +function textRect(node, from, to) { + var range = document.createRange(); + range.setEnd(node, to); + range.setStart(node, from); + return range.getBoundingClientRect(); +} + +/** + * Given a position in the document model, get a bounding box of the character at + * that position, relative to the window. + * + * @param {ProseMirror} pm The editor instance. + * @param {Pos} pos + * @return {Object} The bounding box. + */ + +function coordsAtPos(pm, pos) { + var _DOMFromPos = DOMFromPos(pm.content, pos); + + var node = _DOMFromPos.node; + var offset = _DOMFromPos.offset; + + var side = undefined, + rect = undefined; + if (node.nodeType == 3) { + if (offset < node.nodeValue.length) { + rect = textRect(node, offset, offset + 1); + side = "left"; + } + if ((!rect || rect.left == rect.right) && offset) { + rect = textRect(node, offset - 1, offset); + side = "right"; + } + } else if (node.firstChild) { + if (offset < node.childNodes.length) { + var child = node.childNodes[offset]; + rect = child.nodeType == 3 ? textRect(child, 0, child.nodeValue.length) : child.getBoundingClientRect(); + side = "left"; + } + if ((!rect || rect.left == rect.right) && offset) { + var child = node.childNodes[offset - 1]; + rect = child.nodeType == 3 ? textRect(child, 0, child.nodeValue.length) : child.getBoundingClientRect(); + side = "right"; + } + } else { + rect = node.getBoundingClientRect(); + side = "left"; + } + var x = rect[side]; + return { top: rect.top, bottom: rect.bottom, left: x, right: x }; +} + +var scrollMargin = 5; + +function scrollIntoView(pm, pos) { + if (!pos) pos = pm.sel.range.head || pm.sel.range.from; + var coords = coordsAtPos(pm, pos); + for (var _parent2 = pm.content;; _parent2 = _parent2.parentNode) { + var atBody = _parent2 == document.body; + var rect = atBody ? windowRect() : _parent2.getBoundingClientRect(); + var moveX = 0, + moveY = 0; + if (coords.top < rect.top) moveY = -(rect.top - coords.top + scrollMargin);else if (coords.bottom > rect.bottom) moveY = coords.bottom - rect.bottom + scrollMargin; + if (coords.left < rect.left) moveX = -(rect.left - coords.left + scrollMargin);else if (coords.right > rect.right) moveX = coords.right - rect.right + scrollMargin; + if (moveX || moveY) { + if (atBody) window.scrollBy(moveX, moveY); + } else { + if (moveY) _parent2.scrollTop += moveY; + if (moveX) _parent2.scrollLeft += moveX; + } + if (atBody) break; + } +} + +function offsetInRects(coords, rects, strict) { + var y = coords.top; + var x = coords.left; + + var minY = 1e8, + minX = 1e8, + offset = 0; + for (var i = 0; i < rects.length; i++) { + var rect = rects[i]; + if (!rect || rect.top == rect.bottom) continue; + var dX = x < rect.left ? rect.left - x : x > rect.right ? x - rect.right : 0; + if (dX > minX) continue; + if (dX < minX) { + minX = dX;minY = 1e8; + } + var dY = y < rect.top ? rect.top - y : y > rect.bottom ? y - rect.bottom : 0; + if (dY < minY) { + minY = dY; + offset = x < (rect.left + rect.right) / 2 ? i : i + 1; + } + } + if (strict && (minX || minY)) return null; + return offset; +} + +function offsetInTextNode(text, coords, strict) { + var len = text.nodeValue.length; + var range = document.createRange(); + var rects = []; + for (var i = 0; i < len; i++) { + range.setEnd(text, i + 1); + range.setStart(text, i); + rects.push(range.getBoundingClientRect()); + } + return offsetInRects(coords, rects, strict); +} + +function offsetInElement(element, coords) { + var rects = []; + for (var child = element.firstChild; child; child = child.nextSibling) { + if (child.getBoundingClientRect) rects.push(child.getBoundingClientRect());else rects.push(null); + } + return offsetInRects(coords, rects); +} + +function findSelectionIn(doc, path, offset, dir, text) { + var node = doc.path(path); + if (node.isTextblock) return new TextSelection(new _model.Pos(path, offset)); + + for (var i = offset + (dir > 0 ? 0 : -1); dir > 0 ? i < node.size : i >= 0; i += dir) { + var child = node.child(i); + if (!text && child.type.contains == null && child.type.selectable) return new NodeSelection(new _model.Pos(path, i), new _model.Pos(path, i + 1), child); + path.push(i); + var inside = findSelectionIn(doc, path, dir < 0 ? child.size : 0, dir, text); + if (inside) return inside; + path.pop(); + } +} + +// FIXME we'll need some awareness of bidi motion when determining block start and end + +function findSelectionFrom(doc, pos, dir, text) { + for (var path = pos.path.slice(), offset = pos.offset;;) { + var found = findSelectionIn(doc, path, offset, dir, text); + if (found) return found; + if (!path.length) break; + offset = path.pop() + (dir > 0 ? 1 : 0); + } +} + +function findSelectionNear(doc, pos, bias, text) { + if (bias === undefined) bias = 1; + + var result = findSelectionFrom(doc, pos, bias, text) || findSelectionFrom(doc, pos, -bias, text); + if (!result) throw new Error("Searching for selection in invalid document " + doc); + return result; +} + +function findSelectionAtStart(node, path, text) { + if (path === undefined) path = []; + + return findSelectionIn(node, path.slice(), 0, 1, text); +} + +function findSelectionAtEnd(node, path, text) { + if (path === undefined) path = []; + + return findSelectionIn(node, path.slice(), node.size, -1, text); +} + +// ;; #path=NodeType #kind=class #noAnchor +// You can add several properties to [node types](#NodeType) to +// influence the way the editor interacts with them. + +// :: (node: Node, path: [number], dom: DOMNode, coords: {left: number, top: number}) → ?Pos +// #path=NodeType.prototype.countCoordsAsChild +// Specifies that, if this node is clicked, a child node might +// actually be meant. This is used to, for example, make clicking a +// list marker (which, in the DOM, is part of the list node) select +// the list item it belongs to. Should return null if the given +// coordinates don't refer to a child node, or the [position](#Pos) +// before thechild otherwise. + +function selectableNodeAbove(pm, dom, coords, liberal) { + for (; dom && dom != pm.content; dom = dom.parentNode) { + if (dom.hasAttribute("pm-offset")) { + var path = pathFromDOM(pm, dom), + node = pm.doc.path(path); + if (node.type.countCoordsAsChild) { + var result = node.type.countCoordsAsChild(node, path, dom, coords); + if (result) return result; + } + // Leaf nodes are implicitly clickable + if ((liberal || node.type.contains == null) && node.type.selectable) return _model.Pos.from(path); + if (!liberal) return null; + } + } +} + +// :: (pm: ProseMirror, event: MouseEvent, path: [number], node: Node) → bool +// #path=NodeType.prototype.handleClick +// If a node is directly clicked (that is, the click didn't land in a +// DOM node belonging to a child node), and its type has a +// `handleClick` method, that method is given a chance to handle the +// click. The method is called, and should return `false` if it did +// _not_ handle the click. +// +// The `event` passed is the event for `"mousedown"`, but calling +// `preventDefault` on it has no effect, since this method is only +// called after a corresponding `"mouseup"` has occurred and +// ProseMirror has determined that this is not a drag or multi-click +// event. + +function handleNodeClick(pm, event) { + for (var dom = event.target; dom && dom != pm.content; dom = dom.parentNode) { + if (dom.hasAttribute("pm-offset")) { + var path = pathFromDOM(pm, dom), + node = pm.doc.path(path); + return node.type.handleClick && node.type.handleClick(pm, event, path, node) !== false; + } + } +} + +function verticalMotionLeavesTextblock(pm, pos, dir) { + var dom = resolvePath(pm.content, pos.path); + var coords = coordsAtPos(pm, pos); + for (var child = dom.firstChild; child; child = child.nextSibling) { + if (child.nodeType != 1) continue; + var boxes = child.getClientRects(); + for (var i = 0; i < boxes.length; i++) { + var box = boxes[i]; + if (dir < 0 ? box.bottom < coords.top : box.top > coords.bottom) return false; + } + } + return true; +} + +function setDOMSelectionToPos(pm, pos) { + var _DOMFromPos2 = DOMFromPos(pm.content, pos); + + var node = _DOMFromPos2.node; + var offset = _DOMFromPos2.offset; + + var range = document.createRange(); + range.setEnd(node, offset); + range.setStart(node, offset); + var sel = getSelection(); + sel.removeAllRanges(); + sel.addRange(range); +} + +},{"../dom":19,"../model":45}],34:[function(require,module,exports){ +"use strict"; + +var _model = require("../model"); + +var _edit = require("../edit"); + +var _inputrules = require("./inputrules"); + +// :: bool #path=autoInput #kind=option +// When set to true, enables the input rules stored under the +// `"autoInput"` name in the editor's +// [`registry`](#ProseMirror.registry)—by default, these are things +// like smart quotes, and automatically wrapping a block in a list if +// you start it with `"1. "`. +(0, _edit.defineOption)("autoInput", false, function (pm, val) { + if (pm.mod.autoInput) { + pm.mod.autoInput.forEach(function (name) { + return (0, _inputrules.removeInputRule)(pm, name); + }); + pm.mod.autoInput = null; + } + if (val) { + pm.mod.autoInput = []; + pm.registry("autoInput", function (rule, type) { + pm.mod.autoInput.push(rule.name); + if (rule.handler.bind) rule = new _inputrules.InputRule(rule.name, rule.match, rule.filter, rule.handler.bind(type)); + (0, _inputrules.addInputRule)(pm, rule); + }); + } +}); + +_edit.defaultRegistry.register("autoInput", new _inputrules.InputRule("emDash", /--$/, "-", "—")); + +_edit.defaultRegistry.register("autoInput", new _inputrules.InputRule("openDoubleQuote", /\s(")$/, '"', "“")); + +_edit.defaultRegistry.register("autoInput", new _inputrules.InputRule("closeDoubleQuote", /"$/, '"', "”")); + +_edit.defaultRegistry.register("autoInput", new _inputrules.InputRule("openSingleQuote", /\s(')$/, "'", "‘")); + +_edit.defaultRegistry.register("autoInput", new _inputrules.InputRule("closeSingleQuote", /'$/, "'", "’")); + +_model.BlockQuote.register("autoInput", new _inputrules.InputRule("startBlockQuote", /^\s*> $/, " ", function (pm, _, pos) { + wrapAndJoin(pm, pos, this); +})); + +_model.OrderedList.register("autoInput", new _inputrules.InputRule("startOrderedList", /^(\d+)\. $/, " ", function (pm, match, pos) { + var order = +match[1]; + wrapAndJoin(pm, pos, this, { order: order || null }, function (node) { + return node.size + (node.attrs.order || 1) == order; + }); +})); + +_model.BulletList.register("autoInput", new _inputrules.InputRule("startBulletList", /^\s*([-+*]) $/, " ", function (pm, match, pos) { + var bullet = match[1]; + wrapAndJoin(pm, pos, this, null, function (node) { + return node.attrs.bullet == bullet; + }); +})); + +_model.CodeBlock.register("autoInput", new _inputrules.InputRule("startCodeBlock", /^```$/, "`", function (pm, _, pos) { + setAs(pm, pos, this, { params: "" }); +})); + +_model.Heading.register("autoInput", new _inputrules.InputRule("startHeading", /^(#{1,6}) $/, " ", function (pm, match, pos) { + setAs(pm, pos, this, { level: match[1].length }); +})); + +function wrapAndJoin(pm, pos, type) { + var attrs = arguments.length <= 3 || arguments[3] === undefined ? null : arguments[3]; + var predicate = arguments.length <= 4 || arguments[4] === undefined ? null : arguments[4]; + + var before = pos.shorten(); + var sibling = before.offset > 0 && pm.doc.path(before.path).child(before.offset - 1); + var join = sibling && sibling.type.name == type && (!predicate || predicate(sibling)); + var tr = pm.tr.wrap(pos, pos, type, attrs); + var delPos = tr.map(pos).pos; + tr["delete"](new _model.Pos(delPos.path, 0), delPos); + if (join) tr.join(before); + tr.apply(); +} + +function setAs(pm, pos, type, attrs) { + pm.tr.setBlockType(pos, pos, type, attrs)["delete"](new _model.Pos(pos.path, 0), pos).apply(); +} + +},{"../edit":27,"../model":45,"./inputrules":35}],35:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = (function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); + } + }return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; + }; +})(); + +exports.addInputRule = addInputRule; +exports.removeInputRule = removeInputRule; + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +var _model = require("../model"); + +var _edit = require("../edit"); + +// :: (ProseMirror, InputRule) +// Add the given [input rule](#InputRule) to an editor. From now on, +// whenever the rule's pattern is typed, its handler is activated. +// +// Note that the effect of an input rule can be canceled by pressing +// Backspace right after it happens. + +function addInputRule(pm, rule) { + if (!pm.mod.interpretInput) pm.mod.interpretInput = new InputRules(pm); + pm.mod.interpretInput.addRule(rule); +} + +// :: (ProseMirror, string) +// Remove the input rule with the given name (added earlier with +// `addInputRule`) from the editor. + +function removeInputRule(pm, name) { + var ii = pm.mod.interpretInput; + if (!ii) return; + ii.removeRule(name); + if (ii.rules.length == 0) { + ii.unregister(); + pm.mod.interpretInput = null; + } +} + +// ;; Input rules are regular expressions describing a piece of text +// that, when typed, causes something to happen. This might be +// changing two dashes into an emdash, wrapping a paragraph starting +// with `"> "` into a blockquote, or something entirely different. + +var InputRule = +// :: (string, RegExp, ?string, union) +// Create an input rule. Its name is used to identify it (to disable +// it). The rule applies when the user typed something and the text +// directly in front of the cursor matches `match`, which should +// probably end with `$`. You can optionally provide a filter, which +// should be a single character that always appears at the end of +// the match, and will be used to only apply the rule when there's +// an actual chance of it succeeding. +// +// The `handler` can be a string, in which case the matched text +// will simply be replaced by that string, or a function, which will +// be called with the match array produced by +// [`RegExp.exec`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec), +// and should produce the effect of the rule. +function InputRule(name, match, filter, handler) { + _classCallCheck(this, InputRule); + + this.name = name; + this.filter = filter; + this.match = match; + this.handler = handler; +}; + +exports.InputRule = InputRule; + +var InputRules = (function () { + function InputRules(pm) { + var _this = this; + + _classCallCheck(this, InputRules); + + this.pm = pm; + this.rules = []; + this.cancelVersion = null; + + pm.on("selectionChange", this.onSelChange = function () { + return _this.cancelVersion = null; + }); + pm.on("textInput", this.onTextInput = this.onTextInput.bind(this)); + pm.addKeymap(new _edit.Keymap({ Backspace: function Backspace(pm) { + return _this.backspace(pm); + } }, { name: "inputRules" }), 20); + } + + _createClass(InputRules, [{ + key: "unregister", + value: function unregister() { + this.pm.off("selectionChange", this.onSelChange); + this.pm.off("textInput", this.onTextInput); + this.pm.removeKeymap("inputRules"); + } + }, { + key: "addRule", + value: function addRule(rule) { + this.rules.push(rule); + } + }, { + key: "removeRule", + value: function removeRule(name) { + for (var i = 0; i < this.rules.length; i++) { + if (this.rules[i].name == name) { + this.rules.splice(i, 1); + return true; + } + } + } + }, { + key: "onTextInput", + value: function onTextInput(text) { + var pos = this.pm.selection.head; + if (!pos) return; + + var textBefore = undefined, + isCode = undefined; + var lastCh = text[text.length - 1]; + + for (var i = 0; i < this.rules.length; i++) { + var rule = this.rules[i], + match = undefined; + if (rule.filter && rule.filter != lastCh) continue; + if (textBefore == null) { + ; + var _getContext = getContext(this.pm.doc, pos); + + textBefore = _getContext.textBefore; + isCode = _getContext.isCode; + + if (isCode) return; + } + if (match = rule.match.exec(textBefore)) { + var startVersion = this.pm.history.getVersion(); + if (typeof rule.handler == "string") { + var offset = pos.offset - (match[1] || match[0]).length; + var start = new _model.Pos(pos.path, offset); + var marks = this.pm.doc.marksAt(pos); + this.pm.tr["delete"](start, pos).insert(start, this.pm.schema.text(rule.handler, marks)).apply(); + } else { + rule.handler(this.pm, match, pos); + } + this.cancelVersion = startVersion; + return; + } + } + } + }, { + key: "backspace", + value: function backspace() { + if (this.cancelVersion) { + this.pm.history.backToVersion(this.cancelVersion); + this.cancelVersion = null; + } else { + return false; + } + } + }]); + + return InputRules; +})(); + +function getContext(doc, pos) { + var parent = doc.path(pos.path); + var isCode = parent.type.isCode; + var textBefore = ""; + for (var i = parent.iter(0, pos.offset), child = undefined; child = i.next().value;) { + if (child.isText) textBefore += child.text;else textBefore = ""; + if (i.atEnd() && child.marks.some(function (st) { + return st.type.isCode; + })) isCode = true; + } + return { textBefore: textBefore, isCode: isCode }; +} + +},{"../edit":27,"../model":45}],36:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.getIcon = getIcon; + +var _dom = require("../dom"); + +var svgCollection = null; +var svgBuilt = Object.create(null); + +var SVG = "http://www.w3.org/2000/svg"; +var XLINK = "http://www.w3.org/1999/xlink"; + +function getIcon(name, data) { + var node = document.createElement("div"); + node.className = "ProseMirror-icon"; + if (data.path) { + if (!svgBuilt[name]) buildSVG(name, data); + var svg = node.appendChild(document.createElementNS(SVG, "svg")); + svg.style.width = data.width / data.height + "em"; + var use = svg.appendChild(document.createElementNS(SVG, "use")); + use.setAttributeNS(XLINK, "href", "#pm-icon-" + name); + } else { + node.textContent = data.text; + if (data.css) node.style.cssText = data.css; + } + return node; +} + +function buildSVG(name, data) { + if (!svgCollection) { + svgCollection = document.createElementNS(SVG, "svg"); + svgCollection.style.display = "none"; + document.body.insertBefore(svgCollection, document.body.firstChild); + } + var sym = document.createElementNS(SVG, "symbol"); + sym.id = "pm-icon-" + name; + sym.setAttribute("viewBox", "0 0 " + data.width + " " + data.height); + var path = sym.appendChild(document.createElementNS(SVG, "path")); + path.setAttribute("d", data.path); + svgCollection.appendChild(sym); + svgBuilt[name] = true; +} + +(0, _dom.insertCSS)("\n.ProseMirror-icon {\n display: inline-block;\n line-height: .8;\n vertical-align: middle;\n padding: 2px 8px;\n cursor: pointer;\n}\n\n.ProseMirror-icon-active {\n background: #666;\n border-radius: 4px;\n}\n\n.ProseMirror-icon svg {\n fill: currentColor;\n height: 1em;\n}\n"); + +},{"../dom":19}],37:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = (function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); + } + }return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; + }; +})(); + +exports.showSelectMenu = showSelectMenu; +exports.readParams = readParams; +exports.commandGroups = commandGroups; + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { "default": obj }; +} + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +var _tooltip = require("./tooltip"); + +var _dom = require("../dom"); + +var _edit = require("../edit"); + +var _utilSortedinsert = require("../util/sortedinsert"); + +var _utilSortedinsert2 = _interopRequireDefault(_utilSortedinsert); + +var _icons = require("./icons"); + +var Menu = (function () { + function Menu(pm, display) { + _classCallCheck(this, Menu); + + this.display = display; + this.stack = []; + this.pm = pm; + } + + _createClass(Menu, [{ + key: "show", + value: function show(content, displayInfo) { + this.stack.length = 0; + this.enter(content, displayInfo); + } + }, { + key: "reset", + value: function reset() { + this.stack.length = 0; + this.display.reset(); + } + }, { + key: "enter", + value: function enter(content, displayInfo) { + var _this = this; + + var pieces = [], + explore = function explore(value) { + if (Array.isArray(value)) { + for (var i = 0; i < value.length; i++) { + explore(value[i]); + }pieces.push(separator); + } else if (!value.select || value.select(_this.pm)) { + pieces.push(value); + } + }; + explore(content); + // Remove superfluous separators + for (var i = 0; i < pieces.length; i++) { + if (pieces[i] == separator && (i == 0 || i == pieces.length - 1 || pieces[i + 1] == separator)) pieces.splice(i--, 1); + }if (!pieces.length) return this.display.clear(); + + this.stack.push(pieces); + this.draw(displayInfo); + } + }, { + key: "draw", + value: function draw(displayInfo) { + var _this2 = this; + + var cur = this.stack[this.stack.length - 1]; + var rendered = (0, _dom.elt)("div", { "class": "ProseMirror-menu" }, cur.map(function (item) { + return renderItem(item, _this2); + })); + if (this.stack.length > 1) this.display.enter(rendered, function () { + return _this2.leave(); + }, displayInfo);else this.display.show(rendered, displayInfo); + } + }, { + key: "leave", + value: function leave() { + this.stack.pop(); + if (this.stack.length) this.draw();else this.display.reset(); + } + }, { + key: "active", + get: function get() { + return this.stack.length > 1; + } + }]); + + return Menu; +})(); + +exports.Menu = Menu; + +var TooltipDisplay = (function () { + function TooltipDisplay(tooltip, resetFunc) { + _classCallCheck(this, TooltipDisplay); + + this.tooltip = tooltip; + this.resetFunc = resetFunc; + } + + _createClass(TooltipDisplay, [{ + key: "clear", + value: function clear() { + this.tooltip.close(); + } + }, { + key: "reset", + value: function reset() { + if (this.resetFunc) this.resetFunc();else this.clear(); + } + }, { + key: "show", + value: function show(dom, info) { + this.tooltip.open(dom, info); + } + }, { + key: "enter", + value: function enter(dom, back, info) { + var button = (0, _dom.elt)("div", { "class": "ProseMirror-tooltip-back", title: "Back" }); + button.addEventListener("mousedown", function (e) { + e.preventDefault();e.stopPropagation(); + back(); + }); + this.show((0, _dom.elt)("div", { "class": "ProseMirror-tooltip-back-wrapper" }, dom, button), info); + } + }]); + + return TooltipDisplay; +})(); + +exports.TooltipDisplay = TooltipDisplay; + +function title(pm, command) { + var key = pm.keyForCommand(command.name); + return key ? command.label + " (" + key + ")" : command.label; +} + +function renderIcon(command, menu) { + var icon = resolveIcon(menu.pm, command); + if (command.active(menu.pm)) icon.className += " ProseMirror-icon-active"; + var dom = (0, _dom.elt)("span", { "class": "ProseMirror-menuicon", title: title(menu.pm, command) }, icon); + dom.addEventListener("mousedown", function (e) { + e.preventDefault();e.stopPropagation(); + if (!command.params.length) { + command.exec(menu.pm); + menu.reset(); + } else if (command.params.length == 1 && command.params[0].type == "select") { + showSelectMenu(menu.pm, command, dom); + } else { + menu.enter(readParams(command)); + } + }); + return dom; +} + +function resolveIcon(pm, command) { + for (;;) { + var icon = command.spec.icon; + if (!icon) break; + if (icon.from) { + command = pm.commands[icon.from]; + if (!command) break; + } else { + return (0, _icons.getIcon)(command.name, icon); + } + } + return (0, _icons.getIcon)("default", { text: "✘" }); +} + +function renderSelect(item, menu) { + var param = item.params[0]; + var value = !param["default"] ? null : param["default"].call ? param["default"](menu.pm) : param["default"]; + + var dom = (0, _dom.elt)("div", { "class": "ProseMirror-select ProseMirror-select-command-" + item.name, title: item.label }, !value ? param.defaultLabel || "Select..." : value.display ? value.display(value) : value.label); + dom.addEventListener("mousedown", function (e) { + e.preventDefault();e.stopPropagation(); + showSelectMenu(menu.pm, item, dom); + }); + return dom; +} + +function showSelectMenu(pm, item, dom) { + var param = item.params[0]; + var options = param.options.call ? param.options(pm) : param.options; + var menu = (0, _dom.elt)("div", { "class": "ProseMirror-select-menu" }, options.map(function (o) { + var dom = (0, _dom.elt)("div", null, o.display ? o.display(o) : o.label); + dom.addEventListener("mousedown", function (e) { + e.preventDefault(); + item.exec(pm, [o.value]); + finish(); + }); + return dom; + })); + var pos = dom.getBoundingClientRect(), + box = pm.wrapper.getBoundingClientRect(); + menu.style.left = pos.left - box.left - 2 + "px"; + menu.style.top = pos.top - box.top - 2 + "px"; + + var done = false; + function finish() { + if (done) return; + done = true; + document.body.removeEventListener("mousedown", finish); + document.body.removeEventListener("keydown", finish); + pm.wrapper.removeChild(menu); + } + document.body.addEventListener("mousedown", finish); + document.body.addEventListener("keydown", finish); + pm.wrapper.appendChild(menu); +} + +function renderItem(item, menu) { + var display = item.display || item.spec.display || "icon"; + if (display == "icon") return renderIcon(item, menu);else if (display == "select") return renderSelect(item, menu);else if (!display) throw new Error("Command " + item.name + " can not be shown in a menu");else return display.call(item, menu); +} + +function buildParamForm(pm, command) { + var prefill = command.spec.prefillParams && command.spec.prefillParams(pm); + var fields = command.params.map(function (param, i) { + var field = undefined, + name = "field_" + i; + var val = prefill ? prefill[i] : param["default"] || ""; + if (param.type == "text") field = (0, _dom.elt)("input", { name: name, type: "text", + placeholder: param.label, + value: val, + autocomplete: "off" });else if (param.type == "select") field = (0, _dom.elt)("select", { name: name }, (param.options.call ? param.options(pm) : param.options).map(function (o) { + return (0, _dom.elt)("option", { value: o.value, selected: o.value == val }, o.label); + }));else // FIXME more types + throw new Error("Unsupported parameter type: " + param.type); + return (0, _dom.elt)("div", null, field); + }); + return (0, _dom.elt)("form", null, fields); +} + +function gatherParams(pm, command, form) { + var bad = false; + var params = command.params.map(function (param, i) { + var val = form.elements["field_" + i].value; + if (val) return val; + if (param["default"] == null) bad = true;else return param["default"].call ? param["default"](pm) : param["default"]; + }); + return bad ? null : params; +} + +function paramForm(pm, command, callback) { + var form = buildParamForm(pm, command), + done = false; + + var finish = function finish(result) { + if (!done) { + done = true; + callback(result); + } + }; + + var submit = function submit() { + // FIXME error messages + finish(gatherParams(pm, command, form)); + }; + form.addEventListener("submit", function (e) { + e.preventDefault(); + submit(); + }); + form.addEventListener("keydown", function (e) { + if (e.keyCode == 27) { + finish(null); + } else if (e.keyCode == 13 && !(e.ctrlKey || e.metaKey || e.shiftKey)) { + e.preventDefault(); + submit(); + } + }); + // FIXME too hacky? + setTimeout(function () { + var input = form.querySelector("input, textarea"); + if (input) input.focus(); + }, 20); + + return form; +} + +function readParams(command) { + return { display: function display(menu) { + return paramForm(menu.pm, command, function (params) { + menu.pm.focus(); + if (params) { + command.exec(menu.pm, params); + menu.reset(); + } else { + menu.leave(); + } + }); + } }; +} + +var separator = { + display: function display() { + return (0, _dom.elt)("div", { "class": "ProseMirror-menuseparator" }); + } +}; + +function commandGroups(pm) { + for (var _len = arguments.length, names = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + names[_key - 1] = arguments[_key]; + } + + return names.map(function (group) { + var found = []; + for (var _name in pm.commands) { + var cmd = pm.commands[_name]; + if (cmd.spec.menuGroup && cmd.spec.menuGroup == group) (0, _utilSortedinsert2["default"])(found, cmd, function (a, b) { + return (a.spec.menuRank || 50) - (b.spec.menuRank || 50); + }); + } + return found; + }); +} + +function tooltipParamHandler(pm, command, callback) { + var tooltip = new _tooltip.Tooltip(pm, "center"); + tooltip.open(paramForm(pm, command, function (params) { + pm.focus(); + tooltip.close(); + callback(params); + })); +} + +(0, _edit.defineParamHandler)("default", tooltipParamHandler); +(0, _edit.defineParamHandler)("tooltip", tooltipParamHandler); + +// FIXME check for obsolete styles +(0, _dom.insertCSS)("\n\n.ProseMirror-menu {\n margin: 0 -4px;\n line-height: 1;\n white-space: pre;\n}\n.ProseMirror-tooltip .ProseMirror-menu {\n width: -webkit-fit-content;\n width: fit-content;\n}\n\n.ProseMirror-tooltip-back-wrapper {\n padding-left: 12px;\n}\n.ProseMirror-tooltip-back {\n position: absolute;\n top: 5px; left: 5px;\n cursor: pointer;\n}\n.ProseMirror-tooltip-back:after {\n content: \"«\";\n}\n\n.ProseMirror-menuicon {\n margin: 0 7px;\n}\n\n.ProseMirror-menuseparator {\n display: inline-block;\n}\n.ProseMirror-menuseparator:after {\n content: \"︙\";\n opacity: 0.5;\n padding: 0 4px;\n vertical-align: baseline;\n}\n\n.ProseMirror-select, .ProseMirror-select-menu {\n border: 1px solid #777;\n border-radius: 3px;\n font-size: 90%;\n}\n\n.ProseMirror-select {\n padding: 1px 12px 1px 4px;\n display: inline-block;\n vertical-align: middle;\n position: relative;\n cursor: pointer;\n margin: 0 8px;\n}\n\n.ProseMirror-select-command-textblockType {\n min-width: 3.2em;\n}\n\n.ProseMirror-select:after {\n content: \"▿\";\n color: #777;\n position: absolute;\n right: 4px;\n}\n\n.ProseMirror-select-menu {\n position: absolute;\n background: #444;\n color: white;\n padding: 2px 2px;\n z-index: 15;\n}\n.ProseMirror-select-menu div {\n cursor: pointer;\n padding: 0 1em 0 2px;\n}\n.ProseMirror-select-menu div:hover {\n background: #777;\n}\n\n"); + +},{"../dom":19,"../edit":27,"../util/sortedinsert":69,"./icons":36,"./tooltip":39}],38:[function(require,module,exports){ +"use strict"; + +var _createClass = (function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); + } + }return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; + }; +})(); + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +var _edit = require("../edit"); + +var _dom = require("../dom"); + +var _update = require("./update"); + +var _menu = require("./menu"); + +(0, _edit.defineOption)("menuBar", false, function (pm, value) { + if (pm.mod.menuBar) pm.mod.menuBar.detach(); + pm.mod.menuBar = value ? new MenuBar(pm, value) : null; +}); + +var BarDisplay = (function () { + function BarDisplay(container, resetFunc) { + _classCallCheck(this, BarDisplay); + + this.container = container; + this.resetFunc = resetFunc; + } + + _createClass(BarDisplay, [{ + key: "clear", + value: function clear() { + this.container.textContent = ""; + } + }, { + key: "reset", + value: function reset() { + this.resetFunc(); + } + }, { + key: "show", + value: function show(dom) { + this.clear(); + this.container.appendChild(dom); + } + }, { + key: "enter", + value: function enter(dom, back) { + var current = this.container.firstChild; + if (current) { + current.style.position = "absolute"; + current.style.opacity = "0.5"; + } + var backButton = (0, _dom.elt)("div", { "class": "ProseMirror-menubar-back" }); + backButton.addEventListener("mousedown", function (e) { + e.preventDefault();e.stopPropagation(); + back(); + }); + var added = (0, _dom.elt)("div", { "class": "ProseMirror-menubar-sliding" }, backButton, dom); + this.container.appendChild(added); + added.getBoundingClientRect(); // Force layout for transition + added.style.left = "0"; + added.addEventListener("transitionend", function () { + if (current && current.parentNode) current.parentNode.removeChild(current); + }); + } + }]); + + return BarDisplay; +})(); + +var MenuBar = (function () { + function MenuBar(pm, config) { + var _this = this; + + _classCallCheck(this, MenuBar); + + this.pm = pm; + + this.menuElt = (0, _dom.elt)("div", { "class": "ProseMirror-menubar-inner" }); + this.wrapper = (0, _dom.elt)("div", { "class": "ProseMirror-menubar" }, (0, _dom.elt)("div", { "class": "ProseMirror-menu", style: "visibility: hiffdden; z-index: 100" }, (0, _dom.elt)("span", { "class": "ProseMirror-menuicon" }, (0, _dom.elt)("div", { "class": "ProseMirror-icon" }, "x"))), this.menuElt); + pm.wrapper.insertBefore(this.wrapper, pm.wrapper.firstChild); + + this.update = new _update.MenuUpdate(pm, "selectionChange change activeMarkChange", function () { + return _this.prepareUpdate(); + }); + this.menu = new _menu.Menu(pm, new BarDisplay(this.menuElt, function () { + return _this.resetMenu(); + })); + + this.menuItems = config && config.items || (0, _menu.commandGroups)(pm, "inline", "block", "history"); + this.update.force(); + + this.floating = false; + if (config && config.float) { + this.updateFloat(); + this.scrollFunc = function () { + if (!document.body.contains(_this.pm.wrapper)) window.removeEventListener("scroll", _this.scrollFunc);else _this.updateFloat(); + }; + window.addEventListener("scroll", this.scrollFunc); + } + } + + _createClass(MenuBar, [{ + key: "detach", + value: function detach() { + this.update.detach(); + this.wrapper.parentNode.removeChild(this.wrapper); + + if (this.scrollFunc) window.removeEventListener("scroll", this.scrollFunc); + } + }, { + key: "prepareUpdate", + value: function prepareUpdate() { + var _this2 = this; + + var scrollCursor = this.prepareScrollCursor(); + return function () { + if (!_this2.menu.active) _this2.resetMenu(); + if (scrollCursor) scrollCursor(); + }; + } + }, { + key: "resetMenu", + value: function resetMenu() { + this.menu.show(this.menuItems); + } + }, { + key: "updateFloat", + value: function updateFloat() { + var editorRect = this.pm.wrapper.getBoundingClientRect(); + if (this.floating) { + if (editorRect.top >= 0 || editorRect.bottom < this.menuElt.offsetHeight + 10) { + this.floating = false; + this.menuElt.style.position = this.menuElt.style.left = this.menuElt.style.width = ""; + this.menuElt.style.display = ""; + } else { + var border = (this.pm.wrapper.offsetWidth - this.pm.wrapper.clientWidth) / 2; + this.menuElt.style.left = editorRect.left + border + "px"; + this.menuElt.style.display = editorRect.top > window.innerHeight ? "none" : ""; + } + } else { + if (editorRect.top < 0 && editorRect.bottom >= this.menuElt.offsetHeight + 10) { + this.floating = true; + var menuRect = this.menuElt.getBoundingClientRect(); + this.menuElt.style.left = menuRect.left + "px"; + this.menuElt.style.width = menuRect.width + "px"; + this.menuElt.style.position = "fixed"; + } + } + } + }, { + key: "prepareScrollCursor", + value: function prepareScrollCursor() { + var _this3 = this; + + if (!this.floating) return null; + var head = this.pm.selection.head; + if (!head) return null; + var cursorPos = this.pm.coordsAtPos(head); + var menuRect = this.menuElt.getBoundingClientRect(); + if (cursorPos.top < menuRect.bottom && cursorPos.bottom > menuRect.top) { + var _ret = (function () { + var scrollable = findWrappingScrollable(_this3.pm.wrapper); + if (scrollable) return { + v: function v() { + return scrollable.scrollTop -= menuRect.bottom - cursorPos.top; + } + }; + })(); + + if (typeof _ret === "object") return _ret.v; + } + } + }]); + + return MenuBar; +})(); + +function findWrappingScrollable(node) { + for (var cur = node.parentNode; cur; cur = cur.parentNode) { + if (cur.scrollHeight > cur.clientHeight) return cur; + } +} + +(0, _dom.insertCSS)("\n.ProseMirror-menubar {\n position: relative;\n margin-bottom: 3px;\n border-top-left-radius: inherit;\n border-top-right-radius: inherit;\n}\n\n.ProseMirror-menubar-inner {\n color: #666;\n padding: 1px 6px;\n top: 0; left: 0; right: 0;\n position: absolute;\n border-bottom: 1px solid silver;\n background: white;\n z-index: 10;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n overflow: hidden;\n border-top-left-radius: inherit;\n border-top-right-radius: inherit;\n}\n\n.ProseMirror-menubar .ProseMirror-icon-active {\n background: #eee;\n}\n\n.ProseMirror-menubar input[type=\"text\"],\n.ProseMirror-menubar textarea {\n background: #eee;\n color: black;\n border: none;\n outline: none;\n width: 100%;\n box-sizing: -moz-border-box;\n box-sizing: border-box;\n}\n\n.ProseMirror-menubar input[type=\"text\"] {\n padding: 0 4px;\n}\n\n.ProseMirror-menubar form {\n position: relative;\n padding: 2px 4px;\n}\n\n.ProseMirror-menubar .ProseMirror-blocktype {\n border: 1px solid #ccc;\n min-width: 4em;\n}\n.ProseMirror-menubar .ProseMirror-blocktype:after {\n color: #ccc;\n}\n\n.ProseMirror-menubar-sliding {\n -webkit-transition: left 0.2s ease-out;\n -moz-transition: left 0.2s ease-out;\n transition: left 0.2s ease-out;\n position: relative;\n left: 100%;\n width: 100%;\n box-sizing: -moz-border-box;\n box-sizing: border-box;\n padding-left: 16px;\n background: white;\n}\n\n.ProseMirror-menubar-back {\n position: absolute;\n height: 100%;\n margin-top: -1px;\n padding-bottom: 2px;\n width: 10px;\n left: 0;\n border-right: 1px solid silver;\n cursor: pointer;\n}\n.ProseMirror-menubar-back:after {\n content: \"«\";\n}\n\n"); + +},{"../dom":19,"../edit":27,"./menu":37,"./update":41}],39:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = (function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); + } + }return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; + }; +})(); + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +var _dom = require("../dom"); + +var prefix = "ProseMirror-tooltip"; + +var Tooltip = (function () { + function Tooltip(pm, dir) { + var _this = this; + + _classCallCheck(this, Tooltip); + + this.pm = pm; + this.dir = dir || "above"; + this.pointer = pm.wrapper.appendChild((0, _dom.elt)("div", { "class": prefix + "-pointer-" + this.dir + " " + prefix + "-pointer" })); + this.pointerWidth = this.pointerHeight = null; + this.dom = pm.wrapper.appendChild((0, _dom.elt)("div", { "class": prefix })); + this.dom.addEventListener("transitionend", function () { + if (_this.dom.style.opacity == "0") _this.dom.style.display = _this.pointer.style.display = ""; + }); + + this.isOpen = false; + this.lastLeft = this.lastRight = null; + } + + _createClass(Tooltip, [{ + key: "detach", + value: function detach() { + this.dom.parentNode.removeChild(this.dom); + this.pointer.parentNode.removeChild(this.pointer); + } + }, { + key: "getSize", + value: function getSize(node) { + var wrap = this.pm.wrapper.appendChild((0, _dom.elt)("div", { + "class": prefix, + style: "display: block; position: absolute" + }, node)); + var size = { width: wrap.offsetWidth, height: wrap.offsetHeight }; + wrap.parentNode.removeChild(wrap); + return size; + } + }, { + key: "open", + value: function open(node, pos) { + var left = this.lastLeft = pos ? pos.left : this.lastLeft; + var top = this.lastTop = pos ? pos.top : this.lastTop; + + var size = this.getSize(node); + + var around = this.pm.wrapper.getBoundingClientRect(); + + for (var child = this.dom.firstChild, next = undefined; child; child = next) { + next = child.nextSibling; + if (child != this.pointer) this.dom.removeChild(child); + } + this.dom.appendChild(node); + + this.dom.style.display = this.pointer.style.display = "block"; + + if (this.pointerWidth == null) { + this.pointerWidth = this.pointer.offsetWidth - 1; + this.pointerHeight = this.pointer.offsetHeight - 1; + } + + this.dom.style.width = size.width + "px"; + this.dom.style.height = size.height + "px"; + + var margin = 5; + if (this.dir == "above" || this.dir == "below") { + var tipLeft = Math.max(0, Math.min(left - size.width / 2, window.innerWidth - size.width)); + this.dom.style.left = tipLeft - around.left + "px"; + this.pointer.style.left = left - around.left - this.pointerWidth / 2 + "px"; + if (this.dir == "above") { + var tipTop = top - around.top - margin - this.pointerHeight - size.height; + this.dom.style.top = tipTop + "px"; + this.pointer.style.top = tipTop + size.height + "px"; + } else { + // below + var tipTop = top - around.top + margin; + this.pointer.style.top = tipTop + "px"; + this.dom.style.top = tipTop + this.pointerHeight + "px"; + } + } else if (this.dir == "left" || this.dir == "right") { + this.dom.style.top = top - around.top - size.height / 2 + "px"; + this.pointer.style.top = top - this.pointerHeight / 2 - around.top + "px"; + if (this.dir == "left") { + var pointerLeft = left - around.left - margin - this.pointerWidth; + this.dom.style.left = pointerLeft - size.width + "px"; + this.pointer.style.left = pointerLeft + "px"; + } else { + // right + var pointerLeft = left - around.left + margin; + this.dom.style.left = pointerLeft + this.pointerWidth + "px"; + this.pointer.style.left = pointerLeft + "px"; + } + } else if (this.dir == "center") { + var _top = Math.max(around.top, 0), + bottom = Math.min(around.bottom, window.innerHeight); + var fromTop = (bottom - _top - size.height) / 2; + this.dom.style.left = (around.width - size.width) / 2 + "px"; + this.dom.style.top = _top - around.top + fromTop + "px"; + } + + getComputedStyle(this.dom).opacity; + getComputedStyle(this.pointer).opacity; + this.dom.style.opacity = this.pointer.style.opacity = 1; + this.isOpen = true; + } + }, { + key: "close", + value: function close() { + if (this.isOpen) { + this.isOpen = false; + this.dom.style.opacity = this.pointer.style.opacity = 0; + } + } + }]); + + return Tooltip; +})(); + +exports.Tooltip = Tooltip; + +(0, _dom.insertCSS)("\n\n.ProseMirror-tooltip {\n position: absolute;\n display: none;\n box-sizing: border-box;\n -moz-box-sizing: border- box;\n overflow: hidden;\n\n -webkit-transition: width 0.4s ease-out, height 0.4s ease-out, left 0.4s ease-out, top 0.4s ease-out, opacity 0.2s;\n -moz-transition: width 0.4s ease-out, height 0.4s ease-out, left 0.4s ease-out, top 0.4s ease-out, opacity 0.2s;\n transition: width 0.4s ease-out, height 0.4s ease-out, left 0.4s ease-out, top 0.4s ease-out, opacity 0.2s;\n opacity: 0;\n\n border-radius: 5px;\n padding: 3px 7px;\n margin: 0;\n background: #444;\n border-color: #777;\n color: white;\n\n z-index: 5;\n}\n\n.ProseMirror-tooltip-pointer {\n content: \"\";\n position: absolute;\n display: none;\n width: 0; height: 0;\n\n -webkit-transition: left 0.4s ease-out, top 0.4s ease-out, opacity 0.2s;\n -moz-transition: left 0.4s ease-out, top 0.4s ease-out, opacity 0.2s;\n transition: left 0.4s ease-out, top 0.4s ease-out, opacity 0.2s;\n opacity: 0;\n\n z-index: 10;\n}\n\n.ProseMirror-tooltip-pointer-above {\n border-left: 6px solid transparent;\n border-right: 6px solid transparent;\n border-top: 6px solid #444;\n}\n\n.ProseMirror-tooltip-pointer-below {\n border-left: 6px solid transparent;\n border-right: 6px solid transparent;\n border-bottom: 6px solid #444;\n}\n\n.ProseMirror-tooltip-pointer-right {\n border-top: 6px solid transparent;\n border-bottom: 6px solid transparent;\n border-right: 6px solid #444;\n}\n\n.ProseMirror-tooltip-pointer-left {\n border-top: 6px solid transparent;\n border-bottom: 6px solid transparent;\n border-left: 6px solid #444;\n}\n\n.ProseMirror-tooltip input[type=\"text\"],\n.ProseMirror-tooltip textarea {\n background: #666;\n color: white;\n border: none;\n outline: none;\n}\n\n.ProseMirror-tooltip input[type=\"text\"] {\n padding: 0 4px;\n}\n\n"); + +},{"../dom":19}],40:[function(require,module,exports){ +"use strict"; + +var _createClass = (function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); + } + }return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; + }; +})(); + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +var _model = require("../model"); + +var _edit = require("../edit"); + +var _dom = require("../dom"); + +var _update = require("./update"); + +var _tooltip = require("./tooltip"); + +var _menu = require("./menu"); + +var classPrefix = "ProseMirror-tooltipmenu"; + +(0, _edit.defineOption)("tooltipMenu", false, function (pm, value) { + if (pm.mod.tooltipMenu) pm.mod.tooltipMenu.detach(); + pm.mod.tooltipMenu = value ? new TooltipMenu(pm, value) : null; +}); + +var TooltipMenu = (function () { + function TooltipMenu(pm, config) { + var _this = this; + + _classCallCheck(this, TooltipMenu); + + this.pm = pm; + this.inlineItems = config && config.inlineItems || (0, _menu.commandGroups)(pm, "inline"); + this.blockItems = config && config.blockItems || (0, _menu.commandGroups)(pm, "block"); + this.showLinks = config ? config.showLinks !== false : true; + this.selectedBlockMenu = config && config.selectedBlockMenu; + this.update = new _update.MenuUpdate(pm, "change selectionChange blur", function () { + return _this.prepareUpdate(); + }); + + this.tooltip = new _tooltip.Tooltip(pm, "above"); + this.menu = new _menu.Menu(pm, new _menu.TooltipDisplay(this.tooltip, function () { + return _this.update.force(); + })); + } + + /** + * Get the x and y coordinates at the top center of the current DOM selection. + * + * @return {Object} + */ + + _createClass(TooltipMenu, [{ + key: "detach", + value: function detach() { + this.update.detach(); + this.tooltip.detach(); + } + }, { + key: "prepareUpdate", + value: function prepareUpdate() { + var _this2 = this; + + if (this.menu.active) return null; + + var _pm$selection = this.pm.selection; + var empty = _pm$selection.empty; + var node = _pm$selection.node; + var from = _pm$selection.from; + var to = _pm$selection.to;var link = undefined; + if (!this.pm.hasFocus()) { + return function () { + return _this2.tooltip.close(); + }; + } else if (node && node.isBlock) { + var _ret = (function () { + var coords = topOfNodeSelection(_this2.pm); + return { + v: function v() { + return _this2.menu.show(_this2.blockItems, coords); + } + }; + })(); + + if (typeof _ret === "object") return _ret.v; + } else if (!empty) { + var _ret2 = (function () { + var coords = node ? topOfNodeSelection(_this2.pm) : topCenterOfSelection(); + var showBlock = _this2.selectedBlockMenu && _model.Pos.samePath(from.path, to.path) && from.offset == 0 && to.offset == _this2.pm.doc.path(from.path).size; + return { + v: function v() { + return _this2.menu.show(showBlock ? [_this2.inlineItems, _this2.blockItems] : _this2.inlineItems, coords); + } + }; + })(); + + if (typeof _ret2 === "object") return _ret2.v; + } else if (this.selectedBlockMenu && this.pm.doc.path(from.path).size == 0) { + var _ret3 = (function () { + var coords = _this2.pm.coordsAtPos(from); + return { + v: function v() { + return _this2.menu.show(_this2.blockItems, coords); + } + }; + })(); + + if (typeof _ret3 === "object") return _ret3.v; + } else if (this.showLinks && (link = this.linkUnderCursor())) { + var _ret4 = (function () { + var coords = _this2.pm.coordsAtPos(from); + return { + v: function v() { + return _this2.showLink(link, coords); + } + }; + })(); + + if (typeof _ret4 === "object") return _ret4.v; + } else { + return function () { + return _this2.tooltip.close(); + }; + } + } + }, { + key: "linkUnderCursor", + value: function linkUnderCursor() { + var head = this.pm.selection.head; + if (!head) return null; + var marks = this.pm.doc.marksAt(head); + return marks.reduce(function (found, m) { + return found || m.type.name == "link" && m; + }, null); + } + }, { + key: "showLink", + value: function showLink(link, pos) { + var node = (0, _dom.elt)("div", { "class": classPrefix + "-linktext" }, (0, _dom.elt)("a", { href: link.attrs.href, title: link.attrs.title }, link.attrs.href)); + this.tooltip.open(node, pos); + } + }]); + + return TooltipMenu; +})(); + +function topCenterOfSelection() { + var rects = window.getSelection().getRangeAt(0).getClientRects(); + var _rects$0 = rects[0]; + var left = _rects$0.left; + var right = _rects$0.right; + var top = _rects$0.top;var i = 1; + while (left == right && rects.length > i) { + ;var _rects = rects[i++]; + left = _rects.left; + right = _rects.right; + top = _rects.top; + } + for (; i < rects.length; i++) { + if (rects[i].top < rects[0].bottom - 1 && ( + // Chrome bug where bogus rectangles are inserted at span boundaries + i == rects.length - 1 || Math.abs(rects[i + 1].left - rects[i].left) > 1)) { + left = Math.min(left, rects[i].left); + right = Math.max(right, rects[i].right); + top = Math.min(top, rects[i].top); + } + } + return { top: top, left: (left + right) / 2 }; +} + +function topOfNodeSelection(pm) { + var selected = pm.content.querySelector(".ProseMirror-selectednode"); + if (!selected) return { left: 0, top: 0 }; + var box = selected.getBoundingClientRect(); + return { left: Math.min((box.left + box.right) / 2, box.left + 20), top: box.top }; +} + +(0, _dom.insertCSS)("\n\n.ProseMirror-tooltipmenu-linktext a {\n color: white;\n text-decoration: none;\n padding: 0 5px;\n}\n\n.ProseMirror-tooltipmenu-linktext a:hover {\n text-decoration: underline;\n}\n\n"); + +},{"../dom":19,"../edit":27,"../model":45,"./menu":37,"./tooltip":39,"./update":41}],41:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = (function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); + } + }return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; + }; +})(); + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +var MIN_FLUSH_DELAY = 200; +var UPDATE_TIMEOUT = 200; + +var MenuUpdate = (function () { + function MenuUpdate(pm, events, prepare) { + var _this = this; + + _classCallCheck(this, MenuUpdate); + + this.pm = pm; + this.prepare = prepare; + + this.mustUpdate = false; + this.updateInfo = null; + this.timeout = null; + this.lastFlush = 0; + + this.events = events.split(" "); + this.onEvent = this.onEvent.bind(this); + this.force = this.force.bind(this); + this.events.forEach(function (event) { + return pm.on(event, _this.onEvent); + }); + pm.on("flush", this.onFlush = this.onFlush.bind(this)); + pm.on("flushed", this.onFlushed = this.onFlushed.bind(this)); + } + + _createClass(MenuUpdate, [{ + key: "detach", + value: function detach() { + var _this2 = this; + + clearTimeout(this.timeout); + this.events.forEach(function (event) { + return _this2.pm.off(event, _this2.onEvent); + }); + this.pm.off("flush", this.onFlush); + this.pm.off("flushed", this.onFlushed); + } + }, { + key: "onFlush", + value: function onFlush() { + var now = Date.now(); + if (this.mustUpdate && now - this.lastFlush >= MIN_FLUSH_DELAY) { + this.lastFlush = now; + clearTimeout(this.timeout); + this.mustUpdate = false; + this.update = this.prepare(); + } + } + }, { + key: "onFlushed", + value: function onFlushed() { + if (this.update) { + this.update(); + this.update = null; + } + } + }, { + key: "onEvent", + value: function onEvent() { + this.mustUpdate = true; + clearTimeout(this.timeout); + this.timeout = setTimeout(this.force, UPDATE_TIMEOUT); + } + }, { + key: "force", + value: function force() { + if (this.pm.operation) { + this.onEvent(); + } else { + this.mustUpdate = false; + this.updateInfo = null; + this.lastFlush = Date.now(); + clearTimeout(this.timeout); + var update = this.prepare(); + if (update) update(); + } + } + }]); + + return MenuUpdate; +})(); + +exports.MenuUpdate = MenuUpdate; + +},{}],42:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = (function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); + } + }return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; + }; +})(); + +var _get = function get(_x, _x2, _x3) { + var _again = true;_function: while (_again) { + var object = _x, + property = _x2, + receiver = _x3;_again = false;if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) { + var parent = Object.getPrototypeOf(object);if (parent === null) { + return undefined; + } else { + _x = parent;_x2 = property;_x3 = receiver;_again = true;desc = parent = undefined;continue _function; + } + } else if ("value" in desc) { + return desc.value; + } else { + var getter = desc.get;if (getter === undefined) { + return undefined; + }return getter.call(receiver); + } + } +}; + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; +} + +var _schema = require("./schema"); + +// ;; #toc="Default schema" The default top-level document node type. + +var Doc = (function (_Block) { + _inherits(Doc, _Block); + + function Doc() { + _classCallCheck(this, Doc); + + _get(Object.getPrototypeOf(Doc.prototype), "constructor", this).apply(this, arguments); + } + + // ;; #toc=false The default blockquote node type. + + _createClass(Doc, null, [{ + key: "kind", + get: function get() { + return "."; + } + }]); + + return Doc; +})(_schema.Block); + +exports.Doc = Doc; + +var BlockQuote = (function (_Block2) { + _inherits(BlockQuote, _Block2); + + function BlockQuote() { + _classCallCheck(this, BlockQuote); + + _get(Object.getPrototypeOf(BlockQuote.prototype), "constructor", this).apply(this, arguments); + } + + // ;; #toc=false The default ordered list node type. Has a single attribute, + // `order`, which determines the number at which the list starts + // counting, and defaults to 1. + return BlockQuote; +})(_schema.Block); + +exports.BlockQuote = BlockQuote; + +var OrderedList = (function (_Block3) { + _inherits(OrderedList, _Block3); + + function OrderedList() { + _classCallCheck(this, OrderedList); + + _get(Object.getPrototypeOf(OrderedList.prototype), "constructor", this).apply(this, arguments); + } + + _createClass(OrderedList, null, [{ + key: "contains", + get: function get() { + return "list_item"; + } + }]); + + return OrderedList; +})(_schema.Block); + +exports.OrderedList = OrderedList; + +OrderedList.attributes = { order: new _schema.Attribute({ "default": "1" }) }; + +// ;; #toc=false The default bullet list node type. + +var BulletList = (function (_Block4) { + _inherits(BulletList, _Block4); + + function BulletList() { + _classCallCheck(this, BulletList); + + _get(Object.getPrototypeOf(BulletList.prototype), "constructor", this).apply(this, arguments); + } + + // ;; #toc=false The default list item node type. + + _createClass(BulletList, null, [{ + key: "contains", + get: function get() { + return "list_item"; + } + }]); + + return BulletList; +})(_schema.Block); + +exports.BulletList = BulletList; + +var ListItem = (function (_Block5) { + _inherits(ListItem, _Block5); + + function ListItem() { + _classCallCheck(this, ListItem); + + _get(Object.getPrototypeOf(ListItem.prototype), "constructor", this).apply(this, arguments); + } + + // ;; #toc=false The default horizontal rule node type. + + _createClass(ListItem, null, [{ + key: "kind", + get: function get() { + return "."; + } + }]); + + return ListItem; +})(_schema.Block); + +exports.ListItem = ListItem; + +var HorizontalRule = (function (_Block6) { + _inherits(HorizontalRule, _Block6); + + function HorizontalRule() { + _classCallCheck(this, HorizontalRule); + + _get(Object.getPrototypeOf(HorizontalRule.prototype), "constructor", this).apply(this, arguments); + } + + // ;; #toc=false The default heading node type. Has a single attribute + // `level`, which indicates the heading level, and defaults to 1. + + _createClass(HorizontalRule, null, [{ + key: "contains", + get: function get() { + return null; + } + }]); + + return HorizontalRule; +})(_schema.Block); + +exports.HorizontalRule = HorizontalRule; + +var Heading = (function (_Textblock) { + _inherits(Heading, _Textblock); + + function Heading() { + _classCallCheck(this, Heading); + + _get(Object.getPrototypeOf(Heading.prototype), "constructor", this).apply(this, arguments); + } + + return Heading; +})(_schema.Textblock); + +exports.Heading = Heading; + +Heading.attributes = { level: new _schema.Attribute({ "default": "1" }) }; + +// ;; #toc=false The default code block / listing node type. Only +// allows unmarked text nodes inside of it. + +var CodeBlock = (function (_Textblock2) { + _inherits(CodeBlock, _Textblock2); + + function CodeBlock() { + _classCallCheck(this, CodeBlock); + + _get(Object.getPrototypeOf(CodeBlock.prototype), "constructor", this).apply(this, arguments); + } + + // ;; #toc=false The default paragraph node type. + + _createClass(CodeBlock, [{ + key: "containsMarks", + get: function get() { + return false; + } + }, { + key: "isCode", + get: function get() { + return true; + } + }], [{ + key: "contains", + get: function get() { + return "text"; + } + }]); + + return CodeBlock; +})(_schema.Textblock); + +exports.CodeBlock = CodeBlock; + +var Paragraph = (function (_Textblock3) { + _inherits(Paragraph, _Textblock3); + + function Paragraph() { + _classCallCheck(this, Paragraph); + + _get(Object.getPrototypeOf(Paragraph.prototype), "constructor", this).apply(this, arguments); + } + + // ;; #toc=false The default inline image node type. Has these + // attributes: + // + // - **`src`** (required): The URL of the image. + // - **`alt`**: The alt text. + // - **`title`**: The title of the image. + + _createClass(Paragraph, [{ + key: "defaultTextblock", + get: function get() { + return true; + } + }]); + + return Paragraph; +})(_schema.Textblock); + +exports.Paragraph = Paragraph; + +var Image = (function (_Inline) { + _inherits(Image, _Inline); + + function Image() { + _classCallCheck(this, Image); + + _get(Object.getPrototypeOf(Image.prototype), "constructor", this).apply(this, arguments); + } + + return Image; +})(_schema.Inline); + +exports.Image = Image; + +Image.attributes = { + src: new _schema.Attribute(), + alt: new _schema.Attribute({ "default": "" }), + title: new _schema.Attribute({ "default": "" }) +}; + +// ;; #toc=false The default hard break node type. + +var HardBreak = (function (_Inline2) { + _inherits(HardBreak, _Inline2); + + function HardBreak() { + _classCallCheck(this, HardBreak); + + _get(Object.getPrototypeOf(HardBreak.prototype), "constructor", this).apply(this, arguments); + } + + // ;; #toc=false The default emphasis mark type. + + _createClass(HardBreak, [{ + key: "selectable", + get: function get() { + return false; + } + }, { + key: "isBR", + get: function get() { + return true; + } + }]); + + return HardBreak; +})(_schema.Inline); + +exports.HardBreak = HardBreak; + +var EmMark = (function (_MarkType) { + _inherits(EmMark, _MarkType); + + function EmMark() { + _classCallCheck(this, EmMark); + + _get(Object.getPrototypeOf(EmMark.prototype), "constructor", this).apply(this, arguments); + } + + // ;; #toc=false The default strong mark type. + + _createClass(EmMark, null, [{ + key: "rank", + get: function get() { + return 51; + } + }]); + + return EmMark; +})(_schema.MarkType); + +exports.EmMark = EmMark; + +var StrongMark = (function (_MarkType2) { + _inherits(StrongMark, _MarkType2); + + function StrongMark() { + _classCallCheck(this, StrongMark); + + _get(Object.getPrototypeOf(StrongMark.prototype), "constructor", this).apply(this, arguments); + } + + // ;; #toc=false The default link mark type. Has these attributes: + // + // - **`href`** (required): The link target. + // - **`title`**: The link's title. + + _createClass(StrongMark, null, [{ + key: "rank", + get: function get() { + return 52; + } + }]); + + return StrongMark; +})(_schema.MarkType); + +exports.StrongMark = StrongMark; + +var LinkMark = (function (_MarkType3) { + _inherits(LinkMark, _MarkType3); + + function LinkMark() { + _classCallCheck(this, LinkMark); + + _get(Object.getPrototypeOf(LinkMark.prototype), "constructor", this).apply(this, arguments); + } + + _createClass(LinkMark, null, [{ + key: "rank", + get: function get() { + return 53; + } + }]); + + return LinkMark; +})(_schema.MarkType); + +exports.LinkMark = LinkMark; + +LinkMark.attributes = { + href: new _schema.Attribute(), + title: new _schema.Attribute({ "default": "" }) +}; + +// ;; #toc=false The default code font mark type. + +var CodeMark = (function (_MarkType4) { + _inherits(CodeMark, _MarkType4); + + function CodeMark() { + _classCallCheck(this, CodeMark); + + _get(Object.getPrototypeOf(CodeMark.prototype), "constructor", this).apply(this, arguments); + } + + // :: SchemaSpec + // The specification for the default schema. + + _createClass(CodeMark, [{ + key: "isCode", + get: function get() { + return true; + } + }], [{ + key: "rank", + get: function get() { + return 101; + } + }]); + + return CodeMark; +})(_schema.MarkType); + +exports.CodeMark = CodeMark; +var defaultSpec = new _schema.SchemaSpec({ + doc: Doc, + blockquote: BlockQuote, + ordered_list: OrderedList, + bullet_list: BulletList, + list_item: ListItem, + horizontal_rule: HorizontalRule, + + paragraph: Paragraph, + heading: Heading, + code_block: CodeBlock, + + text: _schema.Text, + image: Image, + hard_break: HardBreak +}, { + em: EmMark, + strong: StrongMark, + link: LinkMark, + code: CodeMark +}); + +// :: Schema +// ProseMirror's default document schema. +var defaultSchema = new _schema.Schema(defaultSpec); +exports.defaultSchema = defaultSchema; + +},{"./schema":49}],43:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.findDiffStart = findDiffStart; +exports.findDiffEnd = findDiffEnd; + +var _pos = require("./pos"); + +// :: (Node, Node) → ?Pos +// Find the first position at which nodes `a` and `b` differ, or +// `null` if they are the same. + +function findDiffStart(a, b) { + var path = arguments.length <= 2 || arguments[2] === undefined ? [] : arguments[2]; + + var iA = a.iter(), + iB = b.iter(), + offset = 0; + for (;;) { + if (iA.atEnd() || iB.atEnd()) { + if (a.size == b.size) return null; + break; + } + + var childA = iA.next(), + childB = iB.next(); + if (childA == childB) { + offset += childA.width;continue; + } + + if (!childA.sameMarkup(childB)) break; + + if (childA.isText && childA.text != childB.text) { + for (var j = 0; childA.text[j] == childB.text[j]; j++) { + offset++; + }break; + } + + if (childA.size || childB.size) { + path.push(offset); + var inner = findDiffStart(childA.content, childB.content, path); + if (inner) return inner; + path.pop(); + } + offset += childA.width; + } + return new _pos.Pos(path, offset); +} + +// :: (Node, Node) → ?{a: Pos, b: Pos} +// Find the first position, searching from the end, at which nodes `a` +// and `b` differ, or `null` if they are the same. Since this position +// will not be the same in both nodes, an object with two separate +// positions is returned. + +function findDiffEnd(a, b) { + var pathA = arguments.length <= 2 || arguments[2] === undefined ? [] : arguments[2]; + var pathB = arguments.length <= 3 || arguments[3] === undefined ? [] : arguments[3]; + + var iA = a.reverseIter(), + iB = b.reverseIter(); + var offA = a.size, + offB = b.size; + + for (;;) { + if (iA.atEnd() || iB.atEnd()) { + if (a.size == b.size) return null; + break; + } + var childA = iA.next(), + childB = iB.next(); + if (childA == childB) { + offA -= childA.width;offB -= childB.width; + continue; + } + + if (!childA.sameMarkup(childB)) break; + + if (childA.isText && childA.text != childB.text) { + var same = 0, + minSize = Math.min(childA.text.length, childB.text.length); + while (same < minSize && childA.text[childA.text.length - same - 1] == childB.text[childB.text.length - same - 1]) { + same++;offA--;offB--; + } + break; + } + offA -= childA.width;offB -= childB.width; + if (childA.size || childB.size) { + pathA.push(offA);pathB.push(offB); + var inner = findDiffEnd(childA.content, childB.content, pathA, pathB); + if (inner) return inner; + pathA.pop();pathB.pop(); + } + } + return { a: new _pos.Pos(pathA, offA), b: new _pos.Pos(pathB, offB) }; +} + +},{"./pos":48}],44:[function(require,module,exports){ +// ;; A fragment is an abstract type used to represent a node's +// collection of child nodes. It tries to hide considerations about +// the actual way in which the child nodes are stored, so that +// different representations (nodes that only contain simple nodes +// versus nodes that also contain text) can be approached using the +// same API. +// +// Fragments are persistent data structures. That means you should +// _not_ mutate them or their content, but create new instances +// whenever needed. The API tries to make this easy. +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _get = function get(_x16, _x17, _x18) { + var _again = true;_function: while (_again) { + var object = _x16, + property = _x17, + receiver = _x18;_again = false;if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) { + var parent = Object.getPrototypeOf(object);if (parent === null) { + return undefined; + } else { + _x16 = parent;_x17 = property;_x18 = receiver;_again = true;desc = parent = undefined;continue _function; + } + } else if ("value" in desc) { + return desc.value; + } else { + var getter = desc.get;if (getter === undefined) { + return undefined; + }return getter.call(receiver); + } + } +}; + +var _createClass = (function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); + } + }return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; + }; +})(); + +function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; +} + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +var Fragment = (function () { + function Fragment() { + _classCallCheck(this, Fragment); + } + + _createClass(Fragment, [{ + key: "append", + + // :: (Fragment, number, number) → Fragment + // Create a fragment that combines this one with another fragment. + // Takes care of merging adjacent text nodes and can also merge + // “open” nodes at the boundary. `joinLeft` and `joinRight` give the + // depth to which the left and right fragments are open. If open + // nodes with the same markup are found on both sides, they are + // joined. If not, the open nodes are [closed](#Node.close). + value: function append(other) { + var joinLeft = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; + var joinRight = arguments.length <= 2 || arguments[2] === undefined ? 0 : arguments[2]; + + if (!this.size) return joinRight ? other.replace(0, other.firstChild.close(joinRight - 1, "start")) : other; + if (!other.size) return joinLeft ? this.replace(this.size - 1, this.lastChild.close(joinLeft - 1, "end")) : this; + return this.appendInner(other, joinLeft, joinRight); + } + + // :: string + // Concatenate all the text nodes found in this fragment and its + // children. + }, { + key: "toString", + + // :: () → string + // Return a debugging string that describes this fragment. + value: function toString() { + var str = ""; + this.forEach(function (n) { + return str += (str ? ", " : "") + n.toString(); + }); + return str; + } + + // :: (number, number, ?(Node) → Node) → [Node] + // Produce an array with the child nodes between the given + // boundaries, optionally mapping a function over them. + }, { + key: "toArray", + value: function toArray(from, to, f) { + if (from === undefined) from = 0; + if (to === undefined) to = this.size; + + var result = []; + for (var iter = this.iter(from, to), n = undefined; n = iter.next().value;) { + result.push(f ? f(n) : n); + }return result; + } + + // :: ((Node) → Node) → Fragment + // Produce a new Fragment by mapping all this fragment's children + // through a function. + }, { + key: "map", + value: function map(f) { + // FIXME join text nodes? + return Fragment.fromArray(this.toArray(undefined, undefined, f)); + } + + // :: ((Node) → bool) → bool + // Returns `true` if the given function returned `true` for any of + // the fragment's children. + }, { + key: "some", + value: function some(f) { + for (var iter = this.iter(), n = undefined; n = iter.next().value;) { + if (f(n)) return n; + } + } + }, { + key: "close", + value: function close(depth, side) { + var child = side == "start" ? this.firstChild : this.lastChild; + var closed = child.close(depth - 1, side); + if (closed == child) return this; + return this.replace(side == "start" ? 0 : this.size - 1, closed); + } + }, { + key: "nodesBetween", + value: function nodesBetween(from, to, f, path, parent) { + var moreFrom = from && from.depth > path.length, + moreTo = to && to.depth > path.length; + var start = moreFrom ? from.path[path.length] : from ? from.offset : 0; + var end = moreTo ? to.path[path.length] + 1 : to ? to.offset : this.size; + for (var iter = this.iter(start, end), node = undefined; node = iter.next().value;) { + var startOffset = iter.offset - node.width; + path.push(startOffset); + node.nodesBetween(moreFrom && startOffset == start ? from : null, moreTo && iter.offset == end ? to : null, f, path, parent); + path.pop(); + } + } + + // :: (?Pos, ?Pos) → Fragment + // Slice out the sub-fragment between the two given positions. + // `null` can be passed for either to indicate the slice should go + // all the way to the start or end of the fragment. + }, { + key: "sliceBetween", + value: function sliceBetween(from, to) { + var depth = arguments.length <= 2 || arguments[2] === undefined ? 0 : arguments[2]; + + var moreFrom = from && from.depth > depth, + moreTo = to && to.depth > depth; + var start = moreFrom ? from.path[depth] : from ? from.offset : 0; + var end = moreTo ? to.path[depth] + 1 : to ? to.offset : this.size; + var nodes = []; + for (var iter = this.iter(start, end), node = undefined; node = iter.next().value;) { + var passFrom = moreFrom && iter.offset - node.width == start ? from : null; + var passTo = moreTo && iter.offset == end ? to : null; + if (passFrom || passTo) node = node.sliceBetween(passFrom, passTo, depth + 1); + nodes.push(node); + } + return new this.constructor(nodes); + } + + // :: (Schema, Object) → Fragment + // Deserialize a fragment from its JSON representation. + }, { + key: "textContent", + get: function get() { + var text = ""; + this.forEach(function (n) { + return text += n.textContent; + }); + return text; + } + }], [{ + key: "fromJSON", + value: function fromJSON(schema, value) { + return value ? this.fromArray(value.map(schema.nodeFromJSON)) : emptyFragment; + } + + // :: ([Node]) → Fragment + // Build a fragment from an array of nodes. + }, { + key: "fromArray", + value: function fromArray(array) { + if (!array.length) return emptyFragment; + var hasText = false; + for (var i = 0; i < array.length; i++) { + if (array[i].isText) hasText = true; + }return new (hasText ? TextFragment : FlatFragment)(array); + } + + // :: (?union) → Fragment + // Create a fragment from something that can be interpreted as a set + // of nodes. For `null`, it returns the empty fragment. For a + // fragment, the fragment itself. For a node or array of nodes, a + // fragment containing those nodes. + }, { + key: "from", + value: function from(nodes) { + if (!nodes) return emptyFragment; + if (nodes instanceof Fragment) return nodes; + return this.fromArray(Array.isArray(nodes) ? nodes : [nodes]); + } + }]); + + return Fragment; +})(); + +exports.Fragment = Fragment; + +var iterEnd = { done: true }; + +var FlatIterator = (function () { + function FlatIterator(array, pos, end) { + _classCallCheck(this, FlatIterator); + + this.array = array; + this.pos = pos; + this.end = end; + } + + _createClass(FlatIterator, [{ + key: "copy", + value: function copy() { + return new this.constructor(this.array, this.pos, this.end); + } + }, { + key: "atEnd", + value: function atEnd() { + return this.pos == this.end; + } + }, { + key: "next", + value: function next() { + return this.pos == this.end ? iterEnd : this.array[this.pos++]; + } + }, { + key: "offset", + get: function get() { + return this.pos; + } + }]); + + return FlatIterator; +})(); + +var ReverseFlatIterator = (function (_FlatIterator) { + _inherits(ReverseFlatIterator, _FlatIterator); + + function ReverseFlatIterator() { + _classCallCheck(this, ReverseFlatIterator); + + _get(Object.getPrototypeOf(ReverseFlatIterator.prototype), "constructor", this).apply(this, arguments); + } + + // ;; #forward=Fragment + + _createClass(ReverseFlatIterator, [{ + key: "next", + value: function next() { + return this.pos == this.end ? iterEnd : this.array[--this.pos]; + } + }]); + + return ReverseFlatIterator; +})(FlatIterator); + +var FlatFragment = (function (_Fragment) { + _inherits(FlatFragment, _Fragment); + + function FlatFragment(content) { + _classCallCheck(this, FlatFragment); + + _get(Object.getPrototypeOf(FlatFragment.prototype), "constructor", this).call(this); + this.content = content; + } + + // :: Fragment + // An empty fragment. Intended to be reused whenever a node doesn't + // contain anything (rather than allocating a new empty fragment for + // each leaf node). + + // :: (?number, ?number) → Iterator + // Create a forward iterator over the content of the fragment. An + // explicit start and end offset can be given to have the iterator + // go over only part of the content. If an iteration bound falls + // within a text node, only the part that is within the bounds is + // yielded. + + _createClass(FlatFragment, [{ + key: "iter", + value: function iter() { + var start = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0]; + var end = arguments.length <= 1 || arguments[1] === undefined ? this.size : arguments[1]; + + return new FlatIterator(this.content, start, end); + } + + // :: (?number, ?number) → Iterator + // Create a reverse iterator over the content of the fragment. An + // explicit start and end offset can be given to have the iterator + // go over only part of the content. **Note**: `start` should be + // greater than `end`, when passed. + }, { + key: "reverseIter", + value: function reverseIter() { + var start = arguments.length <= 0 || arguments[0] === undefined ? this.size : arguments[0]; + var end = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; + + return new ReverseFlatIterator(this.content, start, end); + } + + // :: number + // The maximum offset in this fragment. + }, { + key: "child", + + // :: (number) → Node + // Get the child at the given offset. Might return a text node that + // stretches before and/or after the offset. + value: function child(off) { + if (off < 0 || off >= this.content.length) throw new Error("Offset " + off + " out of range"); + return this.content[off]; + } + + // :: ((node: Node, start: number, end: number)) + // Call the given function for each node in the fragment, passing it + // the node, its start offset, and its end offset. + }, { + key: "forEach", + value: function forEach(f) { + for (var i = 0; i < this.content.length; i++) { + f(this.content[i], i, i + 1); + } + } + + // :: (number) → {start: number, node: Node} + // Find the node before the given offset. Returns an object + // containing the node as well as its start index. Offset should be + // greater than zero. + }, { + key: "chunkBefore", + value: function chunkBefore(off) { + return { node: this.child(off - 1), start: off - 1 }; + } + + // :: (number) → {start: number, node: Node} + // Find the node after the given offset. Returns an object + // containing the node as well as its start index. Offset should be + // less than the fragment's size. + }, { + key: "chunkAfter", + value: function chunkAfter(off) { + return { node: this.child(off), start: off }; + } + + // :: (number, ?number) → Fragment + // Return a fragment with only the nodes between the given offsets. + // When `to` is not given, the slice will go to the end of the + // fragment. + }, { + key: "slice", + value: function slice(from) { + var to = arguments.length <= 1 || arguments[1] === undefined ? this.size : arguments[1]; + + if (from == to) return emptyFragment; + return new FlatFragment(this.content.slice(from, to)); + } + + // :: (number, Node) → Fragment + // Return a fragment in which the node at the given offset is + // replaced by the given node. The node, as well as the one it + // replaces, should not be text nodes. + }, { + key: "replace", + value: function replace(offset, node) { + if (node.isText) throw new Error("Argument to replace should be a non-text node"); + var copy = this.content.slice(); + copy[offset] = node; + return new FlatFragment(copy); + } + }, { + key: "appendInner", + value: function appendInner(other, joinLeft, joinRight) { + var last = this.content.length - 1, + content = this.content.slice(0, last); + var before = this.content[last], + after = other.firstChild; + if (joinLeft > 0 && joinRight > 0 && before.sameMarkup(after)) content.push(before.append(after.content, joinLeft - 1, joinRight - 1));else content.push(before.close(joinLeft - 1, "end"), after.close(joinRight - 1, "start")); + return Fragment.fromArray(content.concat(other.toArray(after.width))); + } + + // :: () → Object + // Create a JSON-serializeable representation of this fragment. + }, { + key: "toJSON", + value: function toJSON() { + return this.content.map(function (n) { + return n.toJSON(); + }); + } + }, { + key: "size", + get: function get() { + return this.content.length; + } + + // :: ?Node + // The first child of the fragment, or `null` if it is empty. + }, { + key: "firstChild", + get: function get() { + return this.content.length ? this.content[0] : null; + } + + // :: ?Node + // The last child of the fragment, or `null` if it is empty. + }, { + key: "lastChild", + get: function get() { + return this.content.length ? this.content[this.content.length - 1] : null; + } + }]); + + return FlatFragment; +})(Fragment); + +var emptyFragment = new FlatFragment([]); + +exports.emptyFragment = emptyFragment; + +var TextIterator = (function () { + function TextIterator(fragment, startOffset, endOffset) { + var pos = arguments.length <= 3 || arguments[3] === undefined ? -1 : arguments[3]; + + _classCallCheck(this, TextIterator); + + this.frag = fragment; + this.offset = startOffset; + this.pos = pos; + this.endOffset = endOffset; + } + + _createClass(TextIterator, [{ + key: "copy", + value: function copy() { + return new this.constructor(this.frag, this.offset, this.endOffset, this.pos); + } + }, { + key: "atEnd", + value: function atEnd() { + return this.offset == this.endOffset; + } + }, { + key: "next", + value: function next() { + if (this.pos == -1) { + var start = this.init(); + if (start) return start; + } + return this.offset == this.endOffset ? iterEnd : this.advance(); + } + }, { + key: "advance", + value: function advance() { + var node = this.frag.content[this.pos++], + end = this.offset + node.width; + if (end > this.endOffset) { + node = node.copy(node.text.slice(0, this.endOffset - this.offset)); + this.offset = this.endOffset; + return node; + } + this.offset = end; + return node; + } + }, { + key: "init", + value: function init() { + this.pos = 0; + var offset = 0; + while (offset < this.offset) { + var node = this.frag.content[this.pos++], + end = offset + node.width; + if (end == this.offset) break; + if (end > this.offset) { + var sliceEnd = node.width; + if (end > this.endOffset) { + sliceEnd = this.endOffset - offset; + end = this.endOffset; + } + node = node.copy(node.text.slice(this.offset - offset, sliceEnd)); + this.offset = end; + return node; + } + offset = end; + } + } + }]); + + return TextIterator; +})(); + +var ReverseTextIterator = (function (_TextIterator) { + _inherits(ReverseTextIterator, _TextIterator); + + function ReverseTextIterator() { + _classCallCheck(this, ReverseTextIterator); + + _get(Object.getPrototypeOf(ReverseTextIterator.prototype), "constructor", this).apply(this, arguments); + } + + _createClass(ReverseTextIterator, [{ + key: "advance", + value: function advance() { + var node = this.frag.content[--this.pos], + end = this.offset - node.width; + if (end < this.endOffset) { + node = node.copy(node.text.slice(this.endOffset - end)); + this.offset = this.endOffset; + return node; + } + this.offset = end; + return node; + } + }, { + key: "init", + value: function init() { + this.pos = this.frag.content.length; + var offset = this.frag.size; + while (offset > this.offset) { + var node = this.frag.content[--this.pos], + end = offset - node.width; + if (end == this.offset) break; + if (end < this.offset) { + if (end < this.endOffset) { + node = node.copy(node.text.slice(this.endOffset - end, this.offset - end)); + end = this.endOffset; + } else { + node = node.copy(node.text.slice(0, this.offset - end)); + } + this.offset = end; + return node; + } + offset = end; + } + } + }]); + + return ReverseTextIterator; +})(TextIterator); + +var TextFragment = (function (_Fragment2) { + _inherits(TextFragment, _Fragment2); + + function TextFragment(content, size) { + _classCallCheck(this, TextFragment); + + _get(Object.getPrototypeOf(TextFragment.prototype), "constructor", this).call(this); + this.content = content; + this.size = size || 0; + if (size == null) for (var i = 0; i < content.length; i++) { + this.size += content[i].width; + } + } + + _createClass(TextFragment, [{ + key: "iter", + value: function iter() { + var from = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0]; + var to = arguments.length <= 1 || arguments[1] === undefined ? this.size : arguments[1]; + + return new TextIterator(this, from, to); + } + }, { + key: "reverseIter", + value: function reverseIter() { + var from = arguments.length <= 0 || arguments[0] === undefined ? this.size : arguments[0]; + var to = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; + + return new ReverseTextIterator(this, from, to); + } + }, { + key: "child", + value: function child(off) { + if (off < 0 || off >= this.size) throw new Error("Offset " + off + " out of range"); + for (var i = 0, curOff = 0; i < this.content.length; i++) { + var child = this.content[i]; + curOff += child.width; + if (curOff > off) return child; + } + } + }, { + key: "forEach", + value: function forEach(f) { + for (var i = 0, off = 0; i < this.content.length; i++) { + var child = this.content[i]; + f(child, off, off += child.width); + } + } + }, { + key: "chunkBefore", + value: function chunkBefore(off) { + if (!off) throw new Error("No chunk before start of node"); + for (var i = 0, curOff = 0; i < this.content.length; i++) { + var child = this.content[i], + end = curOff + child.width; + if (end >= off) return { node: child, start: curOff }; + curOff = end; + } + } + }, { + key: "chunkAfter", + value: function chunkAfter(off) { + if (off == this.size) throw new Error("No chunk after end of node"); + for (var i = 0, curOff = 0; i < this.content.length; i++) { + var child = this.content[i], + end = curOff + child.width; + if (end > off) return { node: child, start: curOff }; + curOff = end; + } + } + }, { + key: "slice", + value: function slice() { + var from = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0]; + var to = arguments.length <= 1 || arguments[1] === undefined ? this.size : arguments[1]; + + if (from == to) return emptyFragment; + return new TextFragment(this.toArray(from, to)); + } + }, { + key: "replace", + value: function replace(off, node) { + if (node.isText) throw new Error("Argument to replace should be a non-text node"); + var curNode = undefined, + index = undefined; + for (var curOff = 0; curOff < off; index++) { + curNode = this.content[index]; + curOff += curNode.width; + } + if (curNode.isText) throw new Error("Can not replace text content with replace method"); + var copy = this.content.slice(); + copy[index] = node; + return new TextFragment(copy); + } + }, { + key: "appendInner", + value: function appendInner(other, joinLeft, joinRight) { + var last = this.content.length - 1, + content = this.content.slice(0, last); + var before = this.content[last], + after = other.firstChild; + var same = before.sameMarkup(after); + if (same && before.isText) content.push(before.copy(before.text + after.text));else if (same && joinLeft > 0 && joinRight > 0) content.push(before.append(after.content, joinLeft - 1, joinRight - 1));else content.push(before.close(joinLeft - 1, "end"), after.close(joinRight - 1, "start")); + return Fragment.fromArray(content.concat(other.toArray(after.width))); + } + }, { + key: "toJSON", + value: function toJSON() { + return this.content.map(function (n) { + return n.toJSON(); + }); + } + }, { + key: "firstChild", + get: function get() { + return this.size ? this.content[0] : null; + } + }, { + key: "lastChild", + get: function get() { + return this.size ? this.content[this.content.length - 1] : null; + } + }]); + + return TextFragment; +})(Fragment); + +if (typeof Symbol != "undefined") { + // :: () → Iterator + // A fragment is iterable, in the ES6 sense. + Fragment.prototype[Symbol.iterator] = function () { + return this.iter(); + }; + FlatIterator.prototype[Symbol.iterator] = TextIterator.prototype[Symbol.iterator] = function () { + return this; + }; +} + +},{}],45:[function(require,module,exports){ +// !! +// This module defines ProseMirror's document model, the data +// structure used to define and inspect content documents. It +// includes: +// +// * The [node](#Node) type that represents document elements +// +// * The [schema](#Schema) types used to tag and constrain the +// document structure +// +// * The data type for document [positions](#Pos) +// +// This module does not depend on the browser API being available +// (i.e. you can load it into any JavaScript environment). + +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _node = require("./node"); + +Object.defineProperty(exports, "Node", { + enumerable: true, + get: function get() { + return _node.Node; + } +}); + +var _fragment = require("./fragment"); + +Object.defineProperty(exports, "Fragment", { + enumerable: true, + get: function get() { + return _fragment.Fragment; + } +}); +Object.defineProperty(exports, "emptyFragment", { + enumerable: true, + get: function get() { + return _fragment.emptyFragment; + } +}); + +var _mark = require("./mark"); + +Object.defineProperty(exports, "Mark", { + enumerable: true, + get: function get() { + return _mark.Mark; + } +}); + +var _schema = require("./schema"); + +Object.defineProperty(exports, "SchemaSpec", { + enumerable: true, + get: function get() { + return _schema.SchemaSpec; + } +}); +Object.defineProperty(exports, "Schema", { + enumerable: true, + get: function get() { + return _schema.Schema; + } +}); +Object.defineProperty(exports, "SchemaError", { + enumerable: true, + get: function get() { + return _schema.SchemaError; + } +}); +Object.defineProperty(exports, "NodeType", { + enumerable: true, + get: function get() { + return _schema.NodeType; + } +}); +Object.defineProperty(exports, "Block", { + enumerable: true, + get: function get() { + return _schema.Block; + } +}); +Object.defineProperty(exports, "Textblock", { + enumerable: true, + get: function get() { + return _schema.Textblock; + } +}); +Object.defineProperty(exports, "Inline", { + enumerable: true, + get: function get() { + return _schema.Inline; + } +}); +Object.defineProperty(exports, "Text", { + enumerable: true, + get: function get() { + return _schema.Text; + } +}); +Object.defineProperty(exports, "MarkType", { + enumerable: true, + get: function get() { + return _schema.MarkType; + } +}); +Object.defineProperty(exports, "Attribute", { + enumerable: true, + get: function get() { + return _schema.Attribute; + } +}); + +var _defaultschema = require("./defaultschema"); + +Object.defineProperty(exports, "defaultSchema", { + enumerable: true, + get: function get() { + return _defaultschema.defaultSchema; + } +}); +Object.defineProperty(exports, "Doc", { + enumerable: true, + get: function get() { + return _defaultschema.Doc; + } +}); +Object.defineProperty(exports, "BlockQuote", { + enumerable: true, + get: function get() { + return _defaultschema.BlockQuote; + } +}); +Object.defineProperty(exports, "OrderedList", { + enumerable: true, + get: function get() { + return _defaultschema.OrderedList; + } +}); +Object.defineProperty(exports, "BulletList", { + enumerable: true, + get: function get() { + return _defaultschema.BulletList; + } +}); +Object.defineProperty(exports, "ListItem", { + enumerable: true, + get: function get() { + return _defaultschema.ListItem; + } +}); +Object.defineProperty(exports, "HorizontalRule", { + enumerable: true, + get: function get() { + return _defaultschema.HorizontalRule; + } +}); +Object.defineProperty(exports, "Paragraph", { + enumerable: true, + get: function get() { + return _defaultschema.Paragraph; + } +}); +Object.defineProperty(exports, "Heading", { + enumerable: true, + get: function get() { + return _defaultschema.Heading; + } +}); +Object.defineProperty(exports, "CodeBlock", { + enumerable: true, + get: function get() { + return _defaultschema.CodeBlock; + } +}); +Object.defineProperty(exports, "Image", { + enumerable: true, + get: function get() { + return _defaultschema.Image; + } +}); +Object.defineProperty(exports, "HardBreak", { + enumerable: true, + get: function get() { + return _defaultschema.HardBreak; + } +}); +Object.defineProperty(exports, "CodeMark", { + enumerable: true, + get: function get() { + return _defaultschema.CodeMark; + } +}); +Object.defineProperty(exports, "EmMark", { + enumerable: true, + get: function get() { + return _defaultschema.EmMark; + } +}); +Object.defineProperty(exports, "StrongMark", { + enumerable: true, + get: function get() { + return _defaultschema.StrongMark; + } +}); +Object.defineProperty(exports, "LinkMark", { + enumerable: true, + get: function get() { + return _defaultschema.LinkMark; + } +}); + +var _pos = require("./pos"); + +Object.defineProperty(exports, "Pos", { + enumerable: true, + get: function get() { + return _pos.Pos; + } +}); + +var _diff = require("./diff"); + +Object.defineProperty(exports, "findDiffStart", { + enumerable: true, + get: function get() { + return _diff.findDiffStart; + } +}); +Object.defineProperty(exports, "findDiffEnd", { + enumerable: true, + get: function get() { + return _diff.findDiffEnd; + } +}); + +},{"./defaultschema":42,"./diff":43,"./fragment":44,"./mark":46,"./node":47,"./pos":48,"./schema":49}],46:[function(require,module,exports){ +// ;; A mark is a piece of information that can be attached to a node, +// such as it being emphasized, in code font, or a link. It has a type +// and optionally a set of attributes that provide further information +// (such as the target of the link). Marks are created through a +// `Schema`, which controls which types exist and which +// attributes they have. +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = (function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); + } + }return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; + }; +})(); + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +var Mark = (function () { + function Mark(type, attrs) { + _classCallCheck(this, Mark); + + // :: MarkType + // The type of this mark. + this.type = type; + // :: Object + // The attributes associated with this mark. + this.attrs = attrs; + } + + // :: () → Object + // Convert this mark to a JSON-serializeable representation. + + _createClass(Mark, [{ + key: "toJSON", + value: function toJSON() { + if (this.type.instance) return this.type.name; + var obj = { _: this.type.name }; + for (var attr in this.attrs) { + obj[attr] = this.attrs[attr]; + }return obj; + } + + // :: ([Mark]) → [Mark] + // Given a set of marks, create a new set which contains this one as + // well, in the right position. If this mark or another of its type + // is already in the set, the set itself is returned. + }, { + key: "addToSet", + value: function addToSet(set) { + for (var i = 0; i < set.length; i++) { + var other = set[i]; + if (other.type == this.type) { + if (this.eq(other)) return set;else return set.slice(0, i).concat(this).concat(set.slice(i + 1)); + } + if (other.type.rank > this.type.rank) return set.slice(0, i).concat(this).concat(set.slice(i)); + } + return set.concat(this); + } + + // :: ([Mark]) → [Mark] + // Remove this mark from the given set, returning a new set. If this + // mark is not in the set, the set itself is returned. + }, { + key: "removeFromSet", + value: function removeFromSet(set) { + for (var i = 0; i < set.length; i++) if (this.eq(set[i])) return set.slice(0, i).concat(set.slice(i + 1)); + return set; + } + + // :: ([Mark]) → bool + // Test whether this mark is in the given set of marks. + }, { + key: "isInSet", + value: function isInSet(set) { + for (var i = 0; i < set.length; i++) { + if (this.eq(set[i])) return true; + }return false; + } + + // :: (Mark) → bool + // Test whether this mark has the same type and attributes as + // another mark. + }, { + key: "eq", + value: function eq(other) { + if (this == other) return true; + if (this.type != other.type) return false; + for (var attr in this.attrs) { + if (other.attrs[attr] != this.attrs[attr]) return false; + }return true; + } + + // :: ([Mark], [Mark]) → bool + // Test whether two sets of marks are identical. + }], [{ + key: "sameSet", + value: function sameSet(a, b) { + if (a == b) return true; + if (a.length != b.length) return false; + for (var i = 0; i < a.length; i++) { + if (!a[i].eq(b[i])) return false; + }return true; + } + + // :: (?union) → [Mark] + // Create a properly sorted mark set from null, a single mark, or an + // unsorted array of marks. + }, { + key: "setFrom", + value: function setFrom(marks) { + if (!marks || marks.length == 0) return empty; + if (marks instanceof Mark) return [marks]; + var copy = marks.slice(); + copy.sort(function (a, b) { + return a.type.rank - b.type.rank; + }); + return copy; + } + }]); + + return Mark; +})(); + +exports.Mark = Mark; + +var empty = []; + +},{}],47:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _get = function get(_x8, _x9, _x10) { + var _again = true;_function: while (_again) { + var object = _x8, + property = _x9, + receiver = _x10;_again = false;if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) { + var parent = Object.getPrototypeOf(object);if (parent === null) { + return undefined; + } else { + _x8 = parent;_x9 = property;_x10 = receiver;_again = true;desc = parent = undefined;continue _function; + } + } else if ("value" in desc) { + return desc.value; + } else { + var getter = desc.get;if (getter === undefined) { + return undefined; + }return getter.call(receiver); + } + } +}; + +var _createClass = (function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); + } + }return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; + }; +})(); + +function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; +} + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +var _fragment = require("./fragment"); + +var _mark = require("./mark"); + +var _pos = require("./pos"); + +var emptyArray = [], + emptyAttrs = Object.create(null); + +// ;; This class represents a node in the tree that makes up a +// ProseMirror document. So a document is an instance of `Node`, with +// children that are also instances of `Node`. +// +// Nodes are persistent data structures. Instead of changing them, you +// create new ones with the content you want. Old ones keep pointing +// at the old document shape. This is made cheaper by sharing +// structure between the old and new data as much as possible, which a +// tree shape like this (without back pointers) makes easy. +// +// **Never** directly mutate the properties of a `Node` object. + +var Node = (function () { + function Node(type, attrs, content, marks) { + _classCallCheck(this, Node); + + // :: NodeType + // The type of node that this is. + this.type = type; + + // :: Object + // An object mapping attribute names to string values. The kind of + // attributes allowed and required are determined by the node + // type. + this.attrs = attrs; + + // :: Fragment + // The node's content. + this.content = content || _fragment.emptyFragment; + + // :: [Mark] + // The marks (things like whether it is emphasized or part of a + // link) associated with this node. + this.marks = marks || emptyArray; + } + + // :: number + // The size of the node's content, which is the maximum offset in + // the node. For nodes that don't contain text, this is also the + // number of child nodes that the node has. + + _createClass(Node, [{ + key: "child", + + // :: (number) → Node + // Retrieve the child at the given offset. Note that this is **not** + // the appropriate way to loop over a node. `child`'s complexity may + // be non-constant for some nodes, and it will return the same node + // multiple times when calling it for different offsets within a + // text node. + value: function child(off) { + return this.content.child(off); + } + + // :: (?number, ?number) → Iterator + // Create an iterator over this node's children, optionally starting + // and ending at a given offset. + }, { + key: "iter", + value: function iter(start, end) { + return this.content.iter(start, end); + } + + // :: (?number, ?number) → Iterator + // Create a reverse iterator (iterating from the node's end towards + // its start) over this node's children, optionally starting and + // ending at a given offset. **Note**: if given, `start` should be + // greater than (or equal) to `end`. + }, { + key: "reverseIter", + value: function reverseIter(start, end) { + return this.content.reverseIter(start, end); + } + + // :: (number) → {start: number, node: Node} + // Find the node that sits before a given offset. Can be used to + // find out which text node covers a given offset. The `start` + // property of the return value is the starting offset of the + // returned node. It is an error to call this with offset 0. + }, { + key: "chunkBefore", + value: function chunkBefore(off) { + return this.content.chunkBefore(off); + } + + // :: (number) → {start: number, node: Node} + // Find the node that sits after a given offset. The `start` + // property of the return value is the starting offset of the + // returned node. It is an error to call this with offset + // corresponding to the end of the node. + }, { + key: "chunkAfter", + value: function chunkAfter(off) { + return this.content.chunkAfter(off); + } + + // :: ((node: Node, start: number, end: number)) + // Call the given function for each child node. The function will be + // given the node, as well as its start and end offsets, as + // arguments. + }, { + key: "forEach", + value: function forEach(f) { + this.content.forEach(f); + } + + // :: string + // Concatenate all the text nodes found in this fragment and its + // children. + }, { + key: "sameMarkup", + + // :: (Node) → bool + // Compare the markup (type, attributes, and marks) of this node to + // those of another. Returns `true` if both have the same markup. + value: function sameMarkup(other) { + return this.hasMarkup(other.type, other.attrs, other.marks); + } + + // :: (NodeType, ?Object, ?[Mark]) → bool + // Check whether this node's markup correspond to the given type, + // attributes, and marks. + }, { + key: "hasMarkup", + value: function hasMarkup(type, attrs, marks) { + return this.type == type && Node.sameAttrs(this.attrs, attrs || emptyAttrs) && _mark.Mark.sameSet(this.marks, marks || emptyArray); + } + }, { + key: "copy", + + // :: (?Fragment) → Node + // Create a new node with the same markup as this node, containing + // the given content (or empty, if no content is given). + value: function copy() { + var content = arguments.length <= 0 || arguments[0] === undefined ? null : arguments[0]; + + return new this.constructor(this.type, this.attrs, content, this.marks); + } + + // :: ([Mark]) → Node + // Create a copy of this node, with the given set of marks instead + // of the node's own marks. + }, { + key: "mark", + value: function mark(marks) { + return new this.constructor(this.type, this.attrs, this.content, marks); + } + + // :: (number, ?number) → Node + // Create a copy of this node with only the content between the + // given offsets. If `to` is not given, it defaults to the end of + // the node. + }, { + key: "slice", + value: function slice(from, to) { + return this.copy(this.content.slice(from, to)); + } + + // :: (number, number, Fragment) → Node + // Create a copy of this node with the content between the given + // offsets replaced by the given fragment. + }, { + key: "splice", + value: function splice(from, to, replace) { + return this.copy(this.content.slice(0, from).append(replace).append(this.content.slice(to))); + } + + // :: (Fragment, ?number, ?number) → Node + // [Append](#Fragment.append) the given fragment to this node's + // content, and create a new node with the result. + }, { + key: "append", + value: function append(fragment) { + var joinLeft = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; + var joinRight = arguments.length <= 2 || arguments[2] === undefined ? 0 : arguments[2]; + + return this.copy(this.content.append(fragment, joinLeft, joinRight)); + } + + // :: (number, Node) → Node + // Return a copy of this node with the child at the given offset + // replaced by the given node. **Note**: The offset should not fall + // within a text node. + }, { + key: "replace", + value: function replace(pos, node) { + return this.copy(this.content.replace(pos, node)); + } + + // :: ([number], Node) → Node + // Return a copy of this node with the descendant at `path` replaced + // by the given replacement node. This will copy as many sub-nodes as + // there are elements in `path`. + }, { + key: "replaceDeep", + value: function replaceDeep(path, node) { + var depth = arguments.length <= 2 || arguments[2] === undefined ? 0 : arguments[2]; + + if (depth == path.length) return node; + var pos = path[depth]; + return this.replace(pos, this.child(pos).replaceDeep(path, node, depth + 1)); + } + + // :: (number, string) → Node + // “Close” this node by making sure that, if it is empty, and is not + // allowed to be so, it has its default content inserted. When depth + // is greater than zero, sub-nodes at the given side (which can be + // `"start"` or `"end"`) are closed too. Returns itself if no work + // is necessary, or a closed copy if something did need to happen. + }, { + key: "close", + value: function close(depth, side) { + if (depth == 0 && this.size == 0 && !this.type.canBeEmpty) return this.copy(this.type.defaultContent()); + var closedContent = undefined; + if (depth > 0 && (closedContent = this.content.close(depth - 1, side)) != this.content) return this.copy(closedContent); + return this; + } + + // :: ([number]) → Node + // Get the descendant node at the given path, which is interpreted + // as a series of offsets into successively deeper nodes. + }, { + key: "path", + value: function path(_path) { + for (var i = 0, node = this; i < _path.length; node = node.child(_path[i]), i++) {} + return node; + } + + // :: (Pos) → Node + // Get the node after the given position. + }, { + key: "nodeAfter", + value: function nodeAfter(pos) { + return this.path(pos.path).child(pos.offset); + } + }, { + key: "pathNodes", + value: function pathNodes(path) { + var nodes = []; + for (var i = 0, node = this;; i++) { + nodes.push(node); + if (i == path.length) break; + node = node.child(path[i]); + } + return nodes; + } + + // :: (Pos, ?bool) → bool + // Checks whether the given position is valid in this node. When + // `requireTextblock` is true, only positions inside textblocks are + // considered valid. + }, { + key: "isValidPos", + value: function isValidPos(pos, requireTextblock) { + for (var i = 0, node = this;; i++) { + if (i == pos.path.length) { + if (requireTextblock && !node.isTextblock) return false; + return pos.offset <= node.size; + } else { + var n = pos.path[i]; + if (n >= node.size) return false; + node = node.child(n); + } + } + } + + // :: (Pos, Pos) → {from: Pos, to: Pos} + // Finds the narrowest sibling range (two positions that both point + // into the same node) that encloses the given positions. + }, { + key: "siblingRange", + value: function siblingRange(from, to) { + for (var i = 0, node = this;; i++) { + if (node.isTextblock) { + var path = from.path.slice(0, i - 1), + offset = from.path[i - 1]; + return { from: new _pos.Pos(path, offset), to: new _pos.Pos(path, offset + 1) }; + } + var fromEnd = i == from.path.length, + toEnd = i == to.path.length; + var left = fromEnd ? from.offset : from.path[i]; + var right = toEnd ? to.offset : to.path[i]; + if (fromEnd || toEnd || left != right) { + var path = from.path.slice(0, i); + return { from: new _pos.Pos(path, left), to: new _pos.Pos(path, right + (toEnd ? 0 : 1)) }; + } + node = node.child(left); + } + } + + // :: (?Pos, ?Pos, (node: Node, path: [number], parent: Node)) + // Iterate over all nodes between the given two positions, calling + // the callback with the node, the path towards it, and its parent + // node, as arguments. `from` and `to` may be `null` to denote + // starting at the start of the node or ending at its end. Note that + // the path passed to the callback is mutated as iteration + // continues, so if you want to preserve it, make a copy. + }, { + key: "nodesBetween", + value: function nodesBetween(from, to, f) { + var path = arguments.length <= 3 || arguments[3] === undefined ? [] : arguments[3]; + var parent = arguments.length <= 4 || arguments[4] === undefined ? null : arguments[4]; + + if (f(this, path, parent) === false) return; + this.content.nodesBetween(from, to, f, path, this); + } + + // :: (?Pos, ?Pos, (node: Node, path: [number], start: number, end: number, parent: Node)) + // Calls the given function for each inline node between the two + // given positions. Pass null for `from` or `to` to start or end at + // the start or end of the node. + }, { + key: "inlineNodesBetween", + value: function inlineNodesBetween(from, to, f) { + this.nodesBetween(from, to, function (node, path, parent) { + if (node.isInline) { + var last = path.length - 1; + f(node, path.slice(0, last), path[last], path[last] + node.width, parent); + } + }); + } + + // :: (?Pos, ?Pos) → Node + // Returns a copy of this node containing only the content between + // `from` and `to`. You can pass `null` for either of them to start + // or end at the start or end of the node. + }, { + key: "sliceBetween", + value: function sliceBetween(from, to) { + var depth = arguments.length <= 2 || arguments[2] === undefined ? 0 : arguments[2]; + + return this.copy(this.content.sliceBetween(from, to, depth)); + } + + // :: (Pos) → [Mark] + // Get the marks of the node before the given position or, if that + // position is at the start of a non-empty node, those of the node + // after it. + }, { + key: "marksAt", + value: function marksAt(pos) { + var parent = this.path(pos.path); + if (!parent.isTextblock || !parent.size) return emptyArray; + return parent.chunkBefore(pos.offset || 1).node.marks; + } + + // :: (?Pos, ?Pos, MarkType) → bool + // Test whether a mark of the given type occurs in this document + // between the two given positions. + }, { + key: "rangeHasMark", + value: function rangeHasMark(from, to, type) { + var found = false; + this.nodesBetween(from, to, function (node) { + if (type.isInSet(node.marks)) found = true; + }); + return found; + } + + // :: bool + // True when this is a block (non-inline node) + }, { + key: "toString", + + // :: () → string + // Return a string representation of this node for debugging + // purposes. + value: function toString() { + var name = this.type.name; + if (this.content.size) name += "(" + this.content.toString() + ")"; + return wrapMarks(this.marks, name); + } + + // :: () → Object + // Return a JSON-serializeable representation of this node. + }, { + key: "toJSON", + value: function toJSON() { + var obj = { type: this.type.name }; + for (var _ in this.attrs) { + obj.attrs = this.attrs; + break; + } + if (this.size) obj.content = this.content.toJSON(); + if (this.marks.length) obj.marks = this.marks.map(function (n) { + return n.toJSON(); + }); + return obj; + } + + // This is a hack to be able to treat a node object as an iterator result + }, { + key: "size", + get: function get() { + return this.content.size; + } + + // :: number + // The width of this node. Always 1 for non-text nodes, and the + // length of the text for text nodes. + }, { + key: "width", + get: function get() { + return 1; + } + }, { + key: "textContent", + get: function get() { + return this.content.textContent; + } + + // :: ?Node + // Returns this node's first child, or `null` if there are no + // children. + }, { + key: "firstChild", + get: function get() { + return this.content.firstChild; + } + + // :: ?Node + // Returns this node's last child, or `null` if there are no + // children. + }, { + key: "lastChild", + get: function get() { + return this.content.lastChild; + } + }, { + key: "isBlock", + get: function get() { + return this.type.isBlock; + } + + // :: bool + // True when this is a textblock node, a block node with inline + // content. + }, { + key: "isTextblock", + get: function get() { + return this.type.isTextblock; + } + + // :: bool + // True when this is an inline node (a text node or a node that can + // appear among text). + }, { + key: "isInline", + get: function get() { + return this.type.isInline; + } + + // :: bool + // True when this is a text node. + }, { + key: "isText", + get: function get() { + return this.type.isText; + } + }, { + key: "value", + get: function get() { + return this; + } + + // :: (Schema, Object) → Node + // Deserialize a node from its JSON representation. + }], [{ + key: "sameAttrs", + value: function sameAttrs(a, b) { + if (a == b) return true; + for (var prop in a) { + if (a[prop] !== b[prop]) return false; + }return true; + } + }, { + key: "fromJSON", + value: function fromJSON(schema, json) { + var type = schema.nodeType(json.type); + var content = json.text != null ? json.text : _fragment.Fragment.fromJSON(schema, json.content); + return type.create(json.attrs, content, json.marks && json.marks.map(schema.markFromJSON)); + } + }]); + + return Node; +})(); + +exports.Node = Node; + +if (typeof Symbol != "undefined") { + // :: () → Iterator + // A fragment is iterable, in the ES6 sense. + Node.prototype[Symbol.iterator] = function () { + return this.iter(); + }; +} + +// ;; #forward=Node + +var TextNode = (function (_Node) { + _inherits(TextNode, _Node); + + function TextNode(type, attrs, content, marks) { + _classCallCheck(this, TextNode); + + _get(Object.getPrototypeOf(TextNode.prototype), "constructor", this).call(this, type, attrs, null, marks); + // :: ?string + // For text nodes, this contains the node's text content. + this.text = content; + } + + _createClass(TextNode, [{ + key: "toString", + value: function toString() { + return wrapMarks(this.marks, JSON.stringify(this.text)); + } + }, { + key: "mark", + value: function mark(marks) { + return new TextNode(this.type, this.attrs, this.text, marks); + } + }, { + key: "toJSON", + value: function toJSON() { + var base = _get(Object.getPrototypeOf(TextNode.prototype), "toJSON", this).call(this); + base.text = this.text; + return base; + } + }, { + key: "textContent", + get: function get() { + return this.text; + } + }, { + key: "width", + get: function get() { + return this.text.length; + } + }]); + + return TextNode; +})(Node); + +exports.TextNode = TextNode; + +function wrapMarks(marks, str) { + for (var i = marks.length - 1; i >= 0; i--) { + str = marks[i].type.name + "(" + str + ")"; + }return str; +} + +},{"./fragment":44,"./mark":46,"./pos":48}],48:[function(require,module,exports){ +// ;; Instances of the `Pos` class represent positions in a document. +// A position an array of integers that describe a path to the target +// node (see `Node.path`) and an integer offset into that target node. + +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = (function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); + } + }return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; + }; +})(); + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +var Pos = (function () { + // :: (path: [number], number) + + function Pos(path, offset) { + _classCallCheck(this, Pos); + + // :: [number] The path to the target node. + this.path = path; + // :: number The offset into the target node. + this.offset = offset; + } + + // ;; Return a string representation of the path of the form + // `"0/2:10"`, where the numbers before the colon are the path, and + // the number after it is the offset. + + _createClass(Pos, [{ + key: "toString", + value: function toString() { + return this.path.join("/") + ":" + this.offset; + } + + // :: number + // The length of the position's path. + }, { + key: "max", + + // :: (Pos) → Pos + // Return the greater of two positions. + value: function max(other) { + return this.cmp(other) > 0 ? this : other; + } + + // :: (Pos) → Pos + // Return the lesser of two positions. + }, { + key: "mmin", + value: function mmin(other) { + return this.cmp(other) < 0 ? this : other; + } + + // :: ([number], [number]) → bool + // Compares two paths and returns true when they are the same. + }, { + key: "cmp", + + // :: (Pos) → number + // Compares this position to another position, and returns a number. + // Of this result number, only the sign is significant. It is + // negative if this position is less than the other one, zero if + // they are the same, and positive if this position is greater. + value: function cmp(other) { + if (other == this) return 0; + return Pos.cmp(this.path, this.offset, other.path, other.offset); + } + }, { + key: "shorten", + + // :: (?number, ?number) → Pos + // Create a position pointing into a parent of this position's + // target. When `to` is given, it determines the new length of the + // path. By default, the path becomes one shorter. The `offset` + // parameter can be used to determine where in this parent the + // position points. By default, it points before the old target. You + // can pass a negative or positive integer to move it backward or + // forward (**note**: this method performs no bounds checking). + value: function shorten() { + var to = arguments.length <= 0 || arguments[0] === undefined ? null : arguments[0]; + var offset = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; + + if (to >= this.depth) return this; + return Pos.shorten(this.path, to, offset); + } + + // :: (number) → Pos + // Create a position with an offset moved relative to this + // position's offset. For example moving `0/1:10` by `-2` yields + // `0/1:8`. + }, { + key: "move", + value: function move(by) { + return new Pos(this.path, this.offset + by); + } + + // :: (?number) → [number] + // Convert this position to an array of numbers (including its + // offset). Optionally pass an argument to adjust the value of the + // offset. + }, { + key: "toPath", + value: function toPath() { + var move = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0]; + + return this.path.concat(this.offset + move); + } + }, { + key: "extend", + value: function extend(pos) { + var path = this.path.slice(), + add = this.offset; + for (var i = 0; i < pos.path.length; i++) { + path.push(pos.path[i] + add); + add = 0; + } + return new Pos(path, pos.offset + add); + } + + // :: () → Object + // Convert the position to a JSON-safe representation. + }, { + key: "toJSON", + value: function toJSON() { + return this; + } + + // :: ([number], ?number) → Pos + // Build a position from an array of numbers (as in + // [`toPath`](#Pos.toPath)), taking the last element of the array as + // offset and optionally moving it by `move`. + }, { + key: "depth", + get: function get() { + return this.path.length; + } + }], [{ + key: "cmp", + value: function cmp(pathA, offsetA, pathB, offsetB) { + var lenA = pathA.length, + lenB = pathB.length; + for (var i = 0, end = Math.min(lenA, lenB); i < end; i++) { + var diff = pathA[i] - pathB[i]; + if (diff != 0) return diff; + } + if (lenA > lenB) return offsetB <= pathA[i] ? 1 : -1;else if (lenB > lenA) return offsetA <= pathB[i] ? -1 : 1;else return offsetA - offsetB; + } + }, { + key: "samePath", + value: function samePath(pathA, pathB) { + if (pathA.length != pathB.length) return false; + for (var i = 0; i < pathA.length; i++) { + if (pathA[i] !== pathB[i]) return false; + }return true; + } + }, { + key: "shorten", + value: function shorten(path) { + var to = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; + var offset = arguments.length <= 2 || arguments[2] === undefined ? 0 : arguments[2]; + + if (to == null) to = path.length - 1; + return new Pos(path.slice(0, to), path[to] + offset); + } + }, { + key: "from", + value: function from(array) { + var move = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; + + if (!array.length) throw new Error("Can't create a pos from an empty array"); + return new Pos(array.slice(0, array.length - 1), array[array.length - 1] + move); + } + + // :: (Object) → Pos + // Create a position from a JSON representation. + }, { + key: "fromJSON", + value: function fromJSON(json) { + return new Pos(json.path, json.offset); + } + }]); + + return Pos; +})(); + +exports.Pos = Pos; + +},{}],49:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _slicedToArray = (function () { + function sliceIterator(arr, i) { + var _arr = [];var _n = true;var _d = false;var _e = undefined;try { + for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value);if (i && _arr.length === i) break; + } + } catch (err) { + _d = true;_e = err; + } finally { + try { + if (!_n && _i["return"]) _i["return"](); + } finally { + if (_d) throw _e; + } + }return _arr; + }return function (arr, i) { + if (Array.isArray(arr)) { + return arr; + } else if (Symbol.iterator in Object(arr)) { + return sliceIterator(arr, i); + } else { + throw new TypeError("Invalid attempt to destructure non-iterable instance"); + } + }; +})(); + +var _createClass = (function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); + } + }return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; + }; +})(); + +var _get = function get(_x2, _x3, _x4) { + var _again = true;_function: while (_again) { + var object = _x2, + property = _x3, + receiver = _x4;_again = false;if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) { + var parent = Object.getPrototypeOf(object);if (parent === null) { + return undefined; + } else { + _x2 = parent;_x3 = property;_x4 = receiver;_again = true;desc = parent = undefined;continue _function; + } + } else if ("value" in desc) { + return desc.value; + } else { + var getter = desc.get;if (getter === undefined) { + return undefined; + }return getter.call(receiver); + } + } +}; + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; +} + +var _node = require("./node"); + +var _fragment = require("./fragment"); + +var _mark = require("./mark"); + +var _utilError = require("../util/error"); + +// ;; #toc=false The exception type used to signal schema-related +// errors. + +var SchemaError = (function (_ProseMirrorError) { + _inherits(SchemaError, _ProseMirrorError); + + function SchemaError() { + _classCallCheck(this, SchemaError); + + _get(Object.getPrototypeOf(SchemaError.prototype), "constructor", this).apply(this, arguments); + } + + return SchemaError; +})(_utilError.ProseMirrorError); + +exports.SchemaError = SchemaError; + +function findKinds(type, name, schema, override) { + function set(sub, sup) { + if (sub in schema.kinds) { + if (schema.kinds[sub] == sup) return; + SchemaError.raise("Inconsistent superkinds for kind " + sub + ": " + sup + " and " + schema.kinds[sub]); + } + if (schema.subKind(sub, sup)) SchemaError.raise("Conflicting kind hierarchy through " + sub + " and " + sup); + schema.kinds[sub] = sup; + } + + for (var cur = type;; cur = Object.getPrototypeOf(cur)) { + var curKind = override != null && cur == type ? override : cur.kind; + if (curKind != null) { + var _$$exec = /^(.*?)(\.)?$/.exec(curKind); + + var _$$exec2 = _slicedToArray(_$$exec, 3); + + var _ = _$$exec2[0]; + var kind = _$$exec2[1]; + var end = _$$exec2[2]; + + if (kind) { + set(name, kind); + name = kind; + } + if (end) { + set(name, null); + return; + } + } + } +} + +// ;; Node types are objects allocated once per `Schema` +// and used to tag `Node` instances with a type. They are +// instances of sub-types of this class, and contain information about +// the node type (its name, its allowed attributes, methods for +// serializing it to various formats, information to guide +// deserialization, and so on). + +var NodeType = (function () { + function NodeType(name, contains, attrs, schema) { + _classCallCheck(this, NodeType); + + // :: string + // The name the node type has in this schema. + this.name = name; + // :: ?string + // The kind of nodes this node may contain. `null` means it's a + // leaf node. + this.contains = contains; + // :: Object + // The attributes allowed on this node type. + this.attrs = attrs; + // :: Schema + // A link back to the `Schema` the node type belongs to. + this.schema = schema; + this.defaultAttrs = getDefaultAttrs(attrs); + } + + // :: Object + // The default set of attributes to associate with a given type. Note + // that schemas may add additional attributes to instances of the + // type. + + // :: bool + // True if this is a block type. + + _createClass(NodeType, [{ + key: "canContainFragment", + + // :: (Fragment) → bool + // Test whether the content of the given fragment could be contained + // in this node type. + value: function canContainFragment(fragment) { + var _this = this; + + var ok = true; + fragment.forEach(function (n) { + if (!_this.canContain(n)) ok = false; + }); + return ok; + } + + // :: (Node) → bool + // Test whether the given node could be contained in this node type. + }, { + key: "canContain", + value: function canContain(node) { + if (!this.canContainType(node.type)) return false; + for (var i = 0; i < node.marks.length; i++) { + if (!this.canContainMark(node.marks[i])) return false; + }return true; + } + + // :: (Mark) → bool + // Test whether this node type can contain children with the given + // mark. + }, { + key: "canContainMark", + value: function canContainMark(mark) { + var contains = this.containsMarks; + if (contains === true) return true; + if (contains) for (var i = 0; i < contains.length; i++) { + if (contains[i] == mark.name) return true; + }return false; + } + + // :: (NodeType) → bool + // Test whether this node type can contain nodes of the given node + // type. + }, { + key: "canContainType", + value: function canContainType(type) { + return this.schema.subKind(type.name, this.contains); + } + + // :: (NodeType) → bool + // Test whether the nodes that can be contained in the given node + // type are a sub-type of the nodes that can be contained in this + // type. + }, { + key: "canContainContent", + value: function canContainContent(type) { + return this.schema.subKind(type.contains, this.contains); + } + + // :: (NodeType) → [NodeType] + // Find a set of intermediate node types, possibly empty, that have + // to be inserted between this type and `other` to put a node of + // type `other` into this type. + }, { + key: "findConnection", + value: function findConnection(other) { + // FIXME somehow define an order in which these are tried + if (this.canContainType(other)) return []; + + var seen = Object.create(null); + var active = [{ from: this, via: [] }]; + while (active.length) { + var current = active.shift(); + for (var _name in this.schema.nodes) { + var type = this.schema.nodes[_name]; + if (type.defaultAttrs && !(type.contains in seen) && current.from.canContainType(type)) { + var via = current.via.concat(type); + if (type.canContainType(other)) return via; + active.push({ from: type, via: via }); + seen[type.contains] = true; + } + } + } + } + }, { + key: "buildAttrs", + value: function buildAttrs(attrs, content) { + if (!attrs && this.defaultAttrs) return this.defaultAttrs;else return _buildAttrs(this.attrs, attrs, this, content); + } + + // :: (?Object, ?Fragment, ?[Mark]) → Node + // Create a `Node` of this type. The given attributes are + // checked and defaulted (you can pass `null` to use the type's + // defaults entirely, if no required attributes exist). `content` + // may be a `Fragment`, a node, an array of nodes, or + // `null`. Similarly `marks` may be `null` to default to the empty + // set of marks. + }, { + key: "create", + value: function create(attrs, content, marks) { + return new _node.Node(this, this.buildAttrs(attrs, content), _fragment.Fragment.from(content), _mark.Mark.setFrom(marks)); + } + }, { + key: "createAutoFill", + value: function createAutoFill(attrs, content, marks) { + if ((!content || content.length == 0) && !this.canBeEmpty) content = this.defaultContent(); + return this.create(attrs, content, marks); + } + + // :: bool + // Controls whether this node is allowed to be empty. + }, { + key: "isBlock", + get: function get() { + return false; + } + + // :: bool + // True if this is a textblock type, a block that contains inline + // content. + }, { + key: "isTextblock", + get: function get() { + return false; + } + + // :: bool + // True if this is an inline type. + }, { + key: "isInline", + get: function get() { + return false; + } + + // :: bool + // True if this is the text node type. + }, { + key: "isText", + get: function get() { + return false; + } + + // :: bool + // Controls whether nodes of this type can be selected (as a user + // node selection). + }, { + key: "selectable", + get: function get() { + return true; + } + + // :: bool + // Controls whether this node type is locked. + }, { + key: "locked", + get: function get() { + return false; + } + + // :: string + // Controls the _kind_ of the node, which is used to determine valid + // parent/child relations. Can be a word, which adds that kind to + // the set of kinds of the superclass, a word followed by a dot, to + // ignore the kinds of the superclass and use only that word (along + // with the node's name) as kind, or only a dot, in which case the + // only kind the node has is its own name. + }, { + key: "canBeEmpty", + get: function get() { + return true; + } + }, { + key: "containsMarks", + + // :: union + // The mark types that child nodes of this node may have. `false` + // means no marks, `true` means any mark, and an array of strings + // can be used to explicitly list the allowed mark types. + get: function get() { + return false; + } + }], [{ + key: "compile", + value: function compile(types, schema) { + var result = Object.create(null); + for (var _name2 in types) { + var info = types[_name2]; + var type = info.type || SchemaError.raise("Missing node type for " + _name2); + findKinds(type, _name2, schema, info.kind); + var contains = "contains" in info ? info.contains : type.contains; + var attrs = type.attributes; + if (info.attributes) { + attrs = copyObj(attrs); + for (var aName in info.attributes) attrs[aName] = info.attributes[aName]; + } + result[_name2] = new type(_name2, contains, attrs, schema); + } + for (var _name3 in result) { + var contains = result[_name3].contains; + if (contains && !(contains in schema.kinds)) SchemaError.raise("Node type " + _name3 + " is specified to contain non-existing kind " + contains); + } + if (!result.doc) SchemaError.raise("Every schema needs a 'doc' type"); + if (!result.text) SchemaError.raise("Every schema needs a 'text' type"); + + return result; + } + + // :: (string, *) + // Register an element in this type's registry. That is, add `value` + // to the array associated with `name` in the registry stored in + // type's `prototype`. This is mostly used to attach things like + // commands and parsing strategies to node types. See `Schema.registry`. + }, { + key: "register", + value: function register(name, value) { + var registry = this.prototype.hasOwnProperty("registry") ? this.prototype.registry : this.prototype.registry = Object.create(null);(registry[name] || (registry[name] = [])).push(value); + } + }, { + key: "kind", + get: function get() { + return "."; + } + }]); + + return NodeType; +})(); + +exports.NodeType = NodeType; +NodeType.attributes = {}; + +// ;; #toc=false Base type for block nodetypes. + +var Block = (function (_NodeType) { + _inherits(Block, _NodeType); + + function Block() { + _classCallCheck(this, Block); + + _get(Object.getPrototypeOf(Block.prototype), "constructor", this).apply(this, arguments); + } + + // ;; #toc=false Base type for textblock node types. + + _createClass(Block, [{ + key: "defaultContent", + value: function defaultContent() { + var inner = this.schema.defaultTextblockType().create(); + var conn = this.findConnection(inner.type); + if (!conn) SchemaError.raise("Can't create default content for " + this.name); + for (var i = conn.length - 1; i >= 0; i--) { + inner = conn[i].create(null, inner); + }return _fragment.Fragment.from(inner); + } + }, { + key: "isBlock", + get: function get() { + return true; + } + }, { + key: "canBeEmpty", + get: function get() { + return this.contains == null; + } + }], [{ + key: "contains", + get: function get() { + return "block"; + } + }, { + key: "kind", + get: function get() { + return "block."; + } + }]); + + return Block; +})(NodeType); + +exports.Block = Block; + +var Textblock = (function (_Block) { + _inherits(Textblock, _Block); + + function Textblock() { + _classCallCheck(this, Textblock); + + _get(Object.getPrototypeOf(Textblock.prototype), "constructor", this).apply(this, arguments); + } + + // ;; #toc=false Base type for inline node types. + + _createClass(Textblock, [{ + key: "containsMarks", + get: function get() { + return true; + } + }, { + key: "isTextblock", + get: function get() { + return true; + } + }, { + key: "canBeEmpty", + get: function get() { + return true; + } + }], [{ + key: "contains", + get: function get() { + return "inline"; + } + }]); + + return Textblock; +})(Block); + +exports.Textblock = Textblock; + +var Inline = (function (_NodeType2) { + _inherits(Inline, _NodeType2); + + function Inline() { + _classCallCheck(this, Inline); + + _get(Object.getPrototypeOf(Inline.prototype), "constructor", this).apply(this, arguments); + } + + // ;; #toc=false The text node type. + + _createClass(Inline, [{ + key: "isInline", + get: function get() { + return true; + } + }], [{ + key: "contains", + get: function get() { + return null; + } + }, { + key: "kind", + get: function get() { + return "inline."; + } + }]); + + return Inline; +})(NodeType); + +exports.Inline = Inline; + +var Text = (function (_Inline) { + _inherits(Text, _Inline); + + function Text() { + _classCallCheck(this, Text); + + _get(Object.getPrototypeOf(Text.prototype), "constructor", this).apply(this, arguments); + } + + // Attribute descriptors + + // ;; Attributes are named strings associated with nodes and marks. + // Each node type or mark type has a fixed set of attributes, which + // instances of this class are used to control. + + _createClass(Text, [{ + key: "create", + value: function create(attrs, content, marks) { + return new _node.TextNode(this, this.buildAttrs(attrs, content), content, marks); + } + }, { + key: "selectable", + get: function get() { + return false; + } + }, { + key: "isText", + get: function get() { + return true; + } + }]); + + return Text; +})(Inline); + +exports.Text = Text; + +var Attribute = (function () { + // :: (Object) + // Create an attribute. `options` is an object containing the + // settings for the attributes. The following settings are + // supported: + // + // **`default`**: `?string` + // : The default value for this attribute, to choose when no + // explicit value is provided. + // + // **`compute`**: `?(Fragment) → string` + // : A function that computes a default value for the attribute from + // the node's content. + // + // Attributes that have no default or compute property must be + // provided whenever a node or mark of a type that has them is + // created. + + function Attribute() { + var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; + + _classCallCheck(this, Attribute); + + this["default"] = options["default"]; + this.compute = options.compute; + this.registry = Object.create(null); + } + + // Marks + + // ;; Like nodes, marks (which are associated with nodes to signify + // things like emphasis or being part of a link) are tagged with type + // objects, which are instantiated once per `Schema`. + + // :: (string, *) + // Register a value in this attribute's registry. See + // `NodeType.register` and `Schema.registry`. + + _createClass(Attribute, [{ + key: "register", + value: function register(name, value) { + ;(this.registry[name] || (this.registry[name] = [])).push(value); + } + }]); + + return Attribute; +})(); + +exports.Attribute = Attribute; + +var MarkType = (function () { + function MarkType(name, attrs, rank, schema) { + _classCallCheck(this, MarkType); + + // :: string + // The name of the mark type. + this.name = name; + // :: Object + // The attributes supported by this type of mark. + this.attrs = attrs; + this.rank = rank; + // :: Schema + // The schema that this mark type instance is part of. + this.schema = schema; + var defaults = getDefaultAttrs(this.attrs); + this.instance = defaults && new _mark.Mark(this, defaults); + } + + // :: Object + // The default set of attributes to associate with a mark type. By + // default, this returns an empty object. + + // :: number + // Mark type ranks are used to determine the order in which mark + // arrays are sorted. (If multiple mark types end up with the same + // rank, they still get a fixed order in the schema, but there's no + // guarantee what it will be.) + + _createClass(MarkType, [{ + key: "create", + + // :: (Object) → Mark + // Create a mark of this type. `attrs` may be `null` or an object + // containing only some of the mark's attributes. The others, if + // they have defaults, will be added. + value: function create(attrs) { + if (!attrs && this.instance) return this.instance; + return new _mark.Mark(this, _buildAttrs(this.attrs, attrs, this)); + } + }, { + key: "removeFromSet", + + // :: ([Mark]) → [Mark] + // When there is a mark of this type in the given set, a new set + // without it is returned. Otherwise, the input set is returned. + value: function removeFromSet(set) { + for (var i = 0; i < set.length; i++) if (set[i].type == this) return set.slice(0, i).concat(set.slice(i + 1)); + return set; + } + + // :: ([Mark]) → bool + // Tests whether there is a mark of this type in the given set. + }, { + key: "isInSet", + value: function isInSet(set) { + for (var i = 0; i < set.length; i++) { + if (set[i].type == this) return set[i]; + } + } + }], [{ + key: "getOrder", + value: function getOrder(marks) { + var sorted = []; + for (var _name4 in marks) { + sorted.push({ name: _name4, rank: marks[_name4].type.rank }); + }sorted.sort(function (a, b) { + return a.rank - b.rank; + }); + var ranks = Object.create(null); + for (var i = 0; i < sorted.length; i++) { + ranks[sorted[i].name] = i; + }return ranks; + } + }, { + key: "compile", + value: function compile(marks, schema) { + var order = this.getOrder(marks); + var result = Object.create(null); + for (var _name5 in marks) { + var info = marks[_name5]; + var attrs = info.attributes || info.type.attributes; + result[_name5] = new info.type(_name5, attrs, order[_name5], schema); + } + return result; + } + }, { + key: "rank", + get: function get() { + return 50; + } + }]); + + return MarkType; +})(); + +exports.MarkType = MarkType; +MarkType.attributes = {}; + +// :: (string, *) +// Register a metadata element for this mark type. See also +// `NodeType.register`. +MarkType.register = NodeType.register; + +// Schema specifications are data structures that specify a schema -- +// a set of node types, their names, attributes, and nesting behavior. + +function copyObj(obj, f) { + var result = Object.create(null); + for (var prop in obj) { + result[prop] = f ? f(obj[prop]) : obj[prop]; + }return result; +} + +function ensureWrapped(obj) { + return obj instanceof Function ? { type: obj } : obj; +} + +function overlayObj(obj, overlay) { + var copy = copyObj(obj); + for (var _name6 in overlay) { + var info = ensureWrapped(overlay[_name6]); + if (info == null) { + delete copy[_name6]; + } else if (info.type) { + copy[_name6] = info; + } else { + var existing = copy[_name6] = copyObj(copy[_name6]); + for (var prop in info) { + existing[prop] = info[prop]; + } + } + } + return copy; +} + +// ;; A schema specification is a blueprint for an actual +// `Schema`. It maps names to node and mark types, along +// with extra information, such as additional attributes and changes +// to node kinds and relations. +// +// A specification consists of an object that maps node names to node +// type constructors and another similar object mapping mark names to +// mark type constructors. +// +// For flexibility and reusability, node and mark type classes do not +// declare their own name. Instead, each schema that includes them can +// assign a name to them, as well as override their +// [kind](#NodeType.kind) and [contained kind](#NodeType.contains), or +// adding extra [attributes](#NodeType.attributes). + +var SchemaSpec = (function () { + // :: (?Object<{type: NodeType}>, ?Object<{type: MarkType}>) + // Create a schema specification from scratch. The arguments map + // node names to node type constructors and mark names to mark type + // constructors. Their property value should be either the type + // constructors themselves, or objects with a type constructor under + // their `type` property, and optionally these other properties: + // + // **`contains`**`: string` + // : Only valid for `nodes`. The [kind](#NodeType.kind) of the + // nodes that this node can contain in this schema. + // + // **`kind`**`: string` + // : Only valid for `nodes`. Overrides the kind of this node in + // this schema. Same format as `NodeType.kind`. + // + // **`attributes`**`: Object` + // : Extra attributes to attach to this node in this schema. + + function SchemaSpec(nodes, marks) { + _classCallCheck(this, SchemaSpec); + + this.nodes = nodes ? copyObj(nodes, ensureWrapped) : Object.create(null); + this.marks = marks ? copyObj(marks, ensureWrapped) : Object.create(null); + } + + // For node types where all attrs have a default value (or which don't + // have any attributes), build up a single reusable default attribute + // object, and use it for all nodes that don't specify specific + // attributes. + + // :: (?Object, ?Object) → SchemaSpec + // Base a new schema spec on this one by specifying nodes and marks + // to add, change, or remove. + // + // When `nodes` is passed, it should be an object mapping type names + // to either `null`, to delete the type of that name, to a + // `NodeType`, to add or replace the node type of that name, or to + // an object containing [extension + // properties](#SchemaSpec_constructor), to add to the existing + // description of that node type. + // + // Similarly, `marks` can be an object to add, change, or remove + // marks in the schema. + + _createClass(SchemaSpec, [{ + key: "update", + value: function update(nodes, marks) { + return new SchemaSpec(nodes ? overlayObj(this.nodes, nodes) : this.nodes, marks ? overlayObj(this.marks, marks) : this.marks); + } + + // :: (?union, string, Attribute) → SchemaSpec + // Create a new schema spec with attributes added to selected node + // types. `filter` can be `null`, to add the attribute to all node + // types, a string, to add it only to the named node type, or a + // predicate function, to add it to node types that pass the + // predicate. + // + // This attribute will be added alongside the node type's [default + // attributes](#NodeType.attributes). + }, { + key: "addAttribute", + value: function addAttribute(filter, attrName, attr) { + var copy = copyObj(this.nodes); + for (var _name7 in copy) { + if (typeof filter == "string" ? filter == _name7 : typeof filter == "function" ? filter(_name7, copy[_name7]) : filter ? filter == copy[_name7] : true) { + var info = copy[_name7] = copyObj(copy[_name7]);(info.attributes || (info.attributes = Object.create(null)))[attrName] = attr; + } + } + return new SchemaSpec(copy, this.marks); + } + }]); + + return SchemaSpec; +})(); + +exports.SchemaSpec = SchemaSpec; +function getDefaultAttrs(attrs) { + var defaults = Object.create(null); + for (var attrName in attrs) { + var attr = attrs[attrName]; + if (attr["default"] == null) return null; + defaults[attrName] = attr["default"]; + } + return defaults; +} + +function _buildAttrs(attrSpec, attrs, arg1, arg2) { + var built = Object.create(null); + for (var _name8 in attrSpec) { + var value = attrs && attrs[_name8]; + if (value == null) { + var attr = attrSpec[_name8]; + if (attr["default"] != null) value = attr["default"];else if (attr.compute) value = attr.compute(arg1, arg2);else SchemaError.raise("No value supplied for attribute " + _name8); + } + built[_name8] = value; + } + return built; +} + +// ;; Each document is based on a single schema, which provides the +// node and mark types that it is made up of (which, in turn, +// determine the structure it is allowed to have). + +var Schema = (function () { + // :: (SchemaSpec) + // Construct a schema from a specification. + + function Schema(spec) { + _classCallCheck(this, Schema); + + // :: SchemaSpec + // The specification on which the schema is based. + this.spec = spec; + this.kinds = Object.create(null); + // :: Object + // An object mapping the schema's node names to node type objects. + this.nodes = NodeType.compile(spec.nodes, this); + // :: Object + // A map from mark names to mark type objects. + this.marks = MarkType.compile(spec.marks, this); + // :: Object + // An object for storing whatever values modules may want to + // compute and cache per schema. (If you want to store something + // in it, try to use property names unlikely to clash.) + this.cached = Object.create(null); + + this.node = this.node.bind(this); + this.text = this.text.bind(this); + this.nodeFromJSON = this.nodeFromJSON.bind(this); + this.markFromJSON = this.markFromJSON.bind(this); + } + + // :: (union, ?Object, ?union, ?[Mark]) → Node + // Create a node in this schema. The `type` may be a string or a + // `NodeType` instance. Attributes will be extended + // with defaults, `content` may be a `Fragment`, + // `null`, a `Node`, or an array of nodes. + // + // When creating a text node, `content` should be a string and is + // interpreted as the node's text. + // + // This method is bound to the Schema, meaning you don't have to + // call it as a method, but can pass it to higher-order functions + // and such. + + _createClass(Schema, [{ + key: "node", + value: function node(type, attrs, content, marks) { + if (typeof type == "string") type = this.nodeType(type);else if (!(type instanceof NodeType)) SchemaError.raise("Invalid node type: " + type);else if (type.schema != this) SchemaError.raise("Node type from different schema used (" + type.name + ")"); + + return type.create(attrs, content, marks); + } + + // :: (string, ?[Mark]) → Node + // Create a text node in the schema. This method is bound to the Schema. + }, { + key: "text", + value: function text(_text, marks) { + return this.nodes.text.create(null, _text, _mark.Mark.setFrom(marks)); + } + + // :: () → ?NodeType + // Return the default textblock type for this schema, or `null` if + // it does not contain a node type with a `defaultTextblock` + // property. + }, { + key: "defaultTextblockType", + value: function defaultTextblockType() { + var cached = this.cached.defaultTextblockType; + if (cached !== undefined) return cached; + for (var _name9 in this.nodes) { + if (this.nodes[_name9].defaultTextblock) return this.cached.defaultTextblockType = this.nodes[_name9]; + } + return this.cached.defaultTextblockType = null; + } + + // :: (string, ?Object) → Mark + // Create a mark with the named type + }, { + key: "mark", + value: function mark(name, attrs) { + var spec = this.marks[name] || SchemaError.raise("No mark named " + name); + return spec.create(attrs); + } + + // :: (Object) → Node + // Deserialize a node from its JSON representation. This method is + // bound. + }, { + key: "nodeFromJSON", + value: function nodeFromJSON(json) { + return _node.Node.fromJSON(this, json); + } + + // :: (Object) → Mark + // Deserialize a mark from its JSON representation. This method is + // bound. + }, { + key: "markFromJSON", + value: function markFromJSON(json) { + if (typeof json == "string") return this.mark(json); + return this.mark(json._, json); + } + + // :: (string) → NodeType + // Get the `NodeType` associated with the given name in + // this schema, or raise an error if it does not exist. + }, { + key: "nodeType", + value: function nodeType(name) { + return this.nodes[name] || SchemaError.raise("Unknown node type: " + name); + } + + // :: (string, string) → bool + // Test whether a node kind is a sub-kind of another kind. + }, { + key: "subKind", + value: function subKind(sub, sup) { + for (;;) { + if (sub == sup) return true; + sub = this.kinds[sub]; + if (!sub) return false; + } + } + + // :: (string, (value: *, source: union)) + // Retrieve all registered items under the given name from this + // schema. The given function will be called with each item and, as + // a second argument, the element—node type, mark type, or + // attribute—that it was associated with. + }, { + key: "registry", + value: function registry(name, f) { + var attrsSeen = []; + for (var i = 0; i < 2; i++) { + var obj = i ? this.marks : this.nodes; + for (var tname in obj) { + var type = obj[tname]; + if (type.constructor.prototype.hasOwnProperty("registry")) { + var reg = type.registry[name]; + if (reg) for (var j = 0; j < reg.length; j++) { + f(reg[j], type); + } + } + for (var aname in type.attrs) { + var attr = type.attrs[aname], + reg = attr.registry[name]; + if (reg && attrsSeen.indexOf(attr) == -1) { + attrsSeen.push(attr); + for (var j = 0; j < reg.length; j++) { + f(reg[j], attr); + } + } + } + } + } + } + }]); + + return Schema; +})(); + +exports.Schema = Schema; + +},{"../util/error":66,"./fragment":44,"./mark":46,"./node":47}],50:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = (function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); + } + }return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; + }; +})(); + +exports.fromDOM = fromDOM; +exports.fromHTML = fromHTML; + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +var _model = require("../model"); + +var _index = require("./index"); + +// :: (Schema, DOMNode, ?Object) → Node +// Parse document from the content of a DOM node. To pass an explicit +// parent document (for example, when not in a browser window +// environment, where we simply use the global document), pass it as +// the `document` property of `options`. + +function fromDOM(schema, dom, options) { + if (!options) options = {}; + var context = new DOMParseState(schema, options.topNode || schema.node("doc"), options); + var start = options.from ? dom.childNodes[options.from] : dom.firstChild; + var end = options.to != null && dom.childNodes[options.to] || null; + context.addAll(start, end, true); + var doc = undefined; + while (context.stack.length) doc = context.leave(); + return doc; +} + +// ;; #path=DOMParseSpec #kind=interface #toc=false +// To define the way [node](#NodeType) and [mark](#MarkType) types are +// parsed, you can associate one or more DOM parsing specifications to +// them using the [`register`](#NodeType.register) method with the +// `parseDOM` property name. Each of them defines a parsing strategy +// for a certain type of DOM node. +// +// Note that `Attribute`s may also contain a `parseDOM` property, +// which should _not_ be a `DOMParseSpec`, but simply a function that +// computes the attribute's value from a DOM node. + +// :: ?string #path=DOMParseSpec.tag +// The (lower-case) tag name for which to activate this parser. When +// not given, it is activated for all nodes. + +// :: ?number #path=DOMParseSpec.rank +// The precedence of this parsing strategy. Should be a number between +// 0 and 100, which determines when this parser gets a chance relative +// to others that apply to the node (low ranks go first). Defaults to +// 50. + +// :: union #path=DOMParseSpec.parse +// The function that, given a DOM node, parses it, updating the parse +// state. It should return (the exact value) `false` when it wants to +// indicate that it was not able to parse this node. This function is +// called in such a way that `this` is bound to the type that the +// parse spec was associated with. +// +// When this is set to the string `"block"`, the content of the DOM +// node is parsed as the content in a node of the type that this spec +// was associated with. +// +// When set to the string `"mark"`, the content of the DOM node is +// parsed with an instance of the mark that this spec was associated +// with added to their marks. + +(0, _index.defineSource)("dom", fromDOM); + +// :: (Schema, string, ?Object) → Node +// Parses the HTML into a DOM, and then calls through to `fromDOM`. + +function fromHTML(schema, html, options) { + var wrap = (options && options.document || window.document).createElement("div"); + wrap.innerHTML = html; + return fromDOM(schema, wrap, options); +} + +(0, _index.defineSource)("html", fromHTML); + +var blockElements = { + address: true, article: true, aside: true, blockquote: true, canvas: true, + dd: true, div: true, dl: true, fieldset: true, figcaption: true, figure: true, + footer: true, form: true, h1: true, h2: true, h3: true, h4: true, h5: true, + h6: true, header: true, hgroup: true, hr: true, li: true, noscript: true, ol: true, + output: true, p: true, pre: true, section: true, table: true, tfoot: true, ul: true +}; + +var noMarks = []; + +// ;; #toc=false A state object used to track context during a parse, +// and to expose methods to custom parsing functions. + +var DOMParseState = (function () { + function DOMParseState(schema, topNode, options) { + _classCallCheck(this, DOMParseState); + + // :: Object The options passed to this parse. + this.options = options || {}; + // :: Schema The schema that we are parsing into. + this.schema = schema; + this.stack = []; + this.marks = noMarks; + this.closing = false; + this.enter(topNode.type, topNode.attrs); + this.nodeInfo = nodeInfo(schema); + } + + _createClass(DOMParseState, [{ + key: "parseAttrs", + value: function parseAttrs(dom, type, attrs) { + for (var attr in type.attrs) { + var desc = type.attrs[attr]; + if (desc.parseDOM && (!attrs || !Object.prototype.hasOwnProperty.call(attrs, attr))) { + var value = desc.parseDOM(dom, this.options, desc, type); + if (value != null) { + if (!attrs) attrs = {}; + attrs[attr] = value; + } + } + } + return attrs; + } + }, { + key: "addDOM", + value: function addDOM(dom) { + if (dom.nodeType == 3) { + // FIXME define a coherent strategy for dealing with trailing, leading, and multiple spaces (this isn't one) + var value = dom.nodeValue; + var _top = this.top, + last = undefined; + if (/\S/.test(value) || _top.type.isTextblock) { + value = value.replace(/\s+/g, " "); + if (/^\s/.test(value) && (last = _top.content[_top.content.length - 1]) && last.type.name == "text" && /\s$/.test(last.text)) value = value.slice(1); + if (value) this.insert(this.schema.text(value, this.marks)); + } + } else if (dom.nodeType != 1 || dom.hasAttribute("pm-ignore")) { + // Ignore non-text non-element nodes + } else if (!this.parseNodeType(dom)) { + this.addAll(dom.firstChild, null); + var _name = dom.nodeName.toLowerCase(); + if (blockElements.hasOwnProperty(_name) && this.top.type == this.schema.defaultTextblockType()) this.closing = true; + } + } + }, { + key: "tryParsers", + value: function tryParsers(parsers, dom) { + if (parsers) for (var i = 0; i < parsers.length; i++) { + var parser = parsers[i]; + if (parser.parse.call(parser.type, dom, this) !== false) return true; + } + } + }, { + key: "parseNodeType", + value: function parseNodeType(dom) { + return this.tryParsers(this.nodeInfo[dom.nodeName.toLowerCase()], dom) || this.tryParsers(this.nodeInfo._, dom); + } + }, { + key: "addAll", + value: function addAll(from, to, sync) { + var stack = sync && this.stack.slice(); + for (var dom = from; dom != to; dom = dom.nextSibling) { + this.addDOM(dom); + if (sync && blockElements.hasOwnProperty(dom.nodeName.toLowerCase())) this.sync(stack); + } + } + }, { + key: "doClose", + value: function doClose() { + if (!this.closing || this.stack.length < 2) return; + var left = this.leave(); + this.enter(left.type, left.attrs); + this.closing = false; + } + }, { + key: "insert", + value: function insert(node) { + if (this.top.type.canContain(node)) { + this.doClose(); + } else { + for (var i = this.stack.length - 1; i >= 0; i--) { + var route = this.stack[i].type.findConnection(node.type); + if (!route) continue; + if (i == this.stack.length - 1) { + this.doClose(); + } else { + while (this.stack.length > i + 1) this.leave(); + } + for (var j = 0; j < route.length; j++) { + this.enter(route[j]); + }if (this.marks.length) this.marks = noMarks; + break; + } + } + this.top.content.push(node); + return node; + } + + // :: (DOMNode, NodeType, ?Object, [Node]) → Node + // Insert a node of the given type, with the given content, based on + // `dom`, at the current position in the document. + }, { + key: "insertFrom", + value: function insertFrom(dom, type, attrs, content) { + return this.insert(type.createAutoFill(this.parseAttrs(dom, type, attrs), content, this.marks)); + } + }, { + key: "enter", + value: function enter(type, attrs) { + if (this.marks.length) this.marks = noMarks; + this.stack.push({ type: type, attrs: attrs, content: [] }); + } + }, { + key: "enterFrom", + value: function enterFrom(dom, type, attrs) { + this.enter(type, this.parseAttrs(dom, type, attrs)); + } + }, { + key: "leave", + value: function leave() { + var top = this.stack.pop(); + var node = top.type.createAutoFill(top.attrs, top.content); + if (this.stack.length) this.insert(node); + return node; + } + }, { + key: "sync", + value: function sync(stack) { + while (this.stack.length > stack.length) this.leave(); + for (;;) { + var n = this.stack.length - 1, + one = this.stack[n], + two = stack[n]; + if (one.type == two.type && _model.Node.sameAttrs(one.attrs, two.attrs)) break; + this.leave(); + } + while (stack.length > this.stack.length) { + var add = stack[this.stack.length]; + this.enter(add.type, add.attrs); + } + if (this.marks.length) this.marks = noMarks; + this.closing = false; + } + + // :: (DOMNode, NodeType, ?Object) + // Parse the contents of `dom` as children of a node of the given + // type. + }, { + key: "wrapIn", + value: function wrapIn(dom, type, attrs) { + this.enterFrom(dom, type, attrs); + this.addAll(dom.firstChild, null, true); + this.leave(); + } + + // :: (DOMNode, Mark) + // Parse the contents of `dom`, with `mark` added to the set of + // current marks. + }, { + key: "wrapMark", + value: function wrapMark(dom, mark) { + var old = this.marks; + this.marks = (mark.instance || mark).addToSet(old); + this.addAll(dom.firstChild, null); + this.marks = old; + } + }, { + key: "top", + get: function get() { + return this.stack[this.stack.length - 1]; + } + }]); + + return DOMParseState; +})(); + +function nodeInfo(schema) { + return schema.cached.parseDOMNodes || (schema.cached.parseDOMNodes = summarizeNodeInfo(schema)); +} + +function summarizeNodeInfo(schema) { + var tags = Object.create(null); + tags._ = []; + schema.registry("parseDOM", function (info, type) { + var tag = info.tag || "_"; + var parse = info.parse; + if (parse == "block") parse = function (dom, state) { + state.wrapIn(dom, this); + };else if (parse == "mark") parse = function (dom, state) { + state.wrapMark(dom, this); + };(tags[tag] || (tags[tag] = [])).push({ + type: type, parse: parse, + rank: info.rank == null ? 50 : info.rank + }); + }); + for (var tag in tags) { + tags[tag].sort(function (a, b) { + return a.rank - b.rank; + }); + }return tags; +} + +_model.Paragraph.register("parseDOM", { tag: "p", parse: "block" }); + +_model.BlockQuote.register("parseDOM", { tag: "blockquote", parse: "block" }); + +var _loop = function _loop(i) { + _model.Heading.register("parseDOM", { + tag: "h" + i, + parse: function parse(dom, state) { + state.wrapIn(dom, this, { level: i }); + } + }); +}; + +for (var i = 1; i <= 6; i++) { + _loop(i); +}_model.HorizontalRule.register("parseDOM", { tag: "hr", parse: "block" }); + +_model.CodeBlock.register("parseDOM", { tag: "pre", parse: function parse(dom, state) { + var params = dom.firstChild && /^code$/i.test(dom.firstChild.nodeName) && dom.firstChild.getAttribute("class"); + if (params && /fence/.test(params)) { + var found = [], + re = /(?:^|\s)lang-(\S+)/g, + m = undefined; + while (m = re.test(params)) found.push(m[1]); + params = found.join(" "); + } else { + params = null; + } + var text = dom.textContent; + state.insertFrom(dom, this, { params: params }, text ? [state.schema.text(text)] : []); + } }); + +_model.BulletList.register("parseDOM", { tag: "ul", parse: "block" }); + +_model.OrderedList.register("parseDOM", { tag: "ol", parse: function parse(dom, state) { + var attrs = { order: dom.getAttribute("start") || 1 }; + state.wrapIn(dom, this, attrs); + } }); + +_model.ListItem.register("parseDOM", { tag: "li", parse: "block" }); + +_model.HardBreak.register("parseDOM", { tag: "br", parse: function parse(dom, state) { + state.insertFrom(dom, this); + } }); + +_model.Image.register("parseDOM", { tag: "img", parse: function parse(dom, state) { + state.insertFrom(dom, this, { + src: dom.getAttribute("src"), + title: dom.getAttribute("title") || null, + alt: dom.getAttribute("alt") || null + }); + } }); + +// Inline style tokens + +_model.LinkMark.register("parseDOM", { tag: "a", parse: function parse(dom, state) { + var href = dom.getAttribute("href"); + if (!href) return false; + state.wrapMark(dom, this.create({ href: href, title: dom.getAttribute("title") })); + } }); + +_model.EmMark.register("parseDOM", { tag: "i", parse: "mark" }); +_model.EmMark.register("parseDOM", { tag: "em", parse: "mark" }); + +_model.StrongMark.register("parseDOM", { tag: "b", parse: "mark" }); +_model.StrongMark.register("parseDOM", { tag: "strong", parse: "mark" }); + +_model.CodeMark.register("parseDOM", { tag: "code", parse: "mark" }); + +},{"../model":45,"./index":51}],51:[function(require,module,exports){ +// !! This module implements a way to register and access parsers from +// various input formats to ProseMirror's [document format](#Node). To +// load the actual parsers, you need to import parser modules like +// `parse/dom` or `parse/markdown`, which will then register +// themselves here, as well as export special-purpose parsing +// functions. +// +// These are the parses in the distribution: +// +// **`"json"`** +// : The top-level module defines a single parser `"json"`, which +// uses `Node.fromJSON` to parse JSON data. +// +// **`"dom"`** +// : Parses [DOM +// nodes](https://developer.mozilla.org/en-US/docs/Web/API/Node). +// Defined in `parse/dom`. See `fromDOM`. +// +// **`"html"`** +// : Parses strings of HTML content. Defined in `parse/dom`. +// +// **`"markdown"`** +// : Parses strings of +// [CommonMark](http://commonmark.org/)-formatted text. Defined in +// `parse/markdown`. See `fromMarkdown`. +// +// **`"text"`** +// : Simply splits a string of text on blank lines and creates a +// document containing those lines as paragraphs. Defined in +// `parse/text`. See `fromText`. + +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.parseFrom = parseFrom; +exports.knownSource = knownSource; +exports.defineSource = defineSource; +var parsers = Object.create(null); + +// :: (Schema, any, string, ?Object) → Node +// Parse document `value` from the format named by `format`. If +// `options` is given, it is passed along to the parser function. + +function parseFrom(schema, value, format, options) { + var converter = parsers[format]; + if (!converter) throw new Error("Source format " + format + " not defined"); + return converter(schema, value, options); +} + +// :: (string) → bool +// Query whether a parser for the named format has been registered. + +function knownSource(format) { + return !!parsers[format]; +} + +// :: (string, (Schema, any, ?Object) → Node) +// Register a parser function for `format`. + +function defineSource(format, func) { + parsers[format] = func; +} + +defineSource("json", function (schema, json) { + return schema.nodeFromJSON(json); +}); + +},{}],52:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.fromText = fromText; + +var _index = require("./index"); + +// FIXME is it meaningful to try and attach text-parsing information +// to node types? + +// :: (Schema, string) → Node +// Convert a string into a simple ProseMirror document. + +function fromText(schema, text) { + var blocks = text.trim().split(/\n{2,}/); + var nodes = []; + for (var i = 0; i < blocks.length; i++) { + var spans = []; + var parts = blocks[i].split("\n"); + for (var j = 0; j < parts.length; j++) { + if (j) spans.push(schema.node("hard_break")); + if (parts[j]) spans.push(schema.text(parts[j])); + } + nodes.push(schema.node("paragraph", null, spans)); + } + if (!nodes.length) nodes.push(schema.node("paragraph")); + return schema.node("doc", null, nodes); +} + +(0, _index.defineSource)("text", fromText); + +},{"./index":51}],53:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = (function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); + } + }return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; + }; +})(); + +exports.toDOM = toDOM; +exports.renderNodeToDOM = renderNodeToDOM; +exports.toHTML = toHTML; + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +var _model = require("../model"); + +var _index = require("./index"); + +// ;; #toc=false Object used to to expose relevant values and methods +// to DOM serializer functions. + +var DOMSerializer = (function () { + function DOMSerializer(options) { + _classCallCheck(this, DOMSerializer); + + // :: Object The options passed to the serializer. + this.options = options || {}; + // :: DOMDocument The DOM document in which we are working. + this.doc = this.options.document || window.document; + } + + // :: (Node, ?Object) → DOMFragment + // Serialize the content of the given node to a DOM fragment. When not + // in the browser, the `document` option, containing a DOM document, + // should be passed so that the serialize can create nodes. + // + // To define rendering behavior for your own [node](#NodeType) and + // [mark](#MarkType) types, give them a `serializeDOM` method. This + // method is passed a `Node` and a `DOMSerializer`, and should return + // the [DOM + // node](https://developer.mozilla.org/en-US/docs/Web/API/Node) that + // represents this node and its content. For marks, that should be an + // inline wrapping node like `` or ``. + // + // Individual attributes can also define serialization behavior. If an + // `Attribute` object has a `serializeDOM` method, that will be called + // with the DOM node representing the node that the attribute applies + // to and the atttribute's value, so that it can set additional DOM + // attributes on the DOM node. + + // :: (string, ?Object, ...union) → DOMNode + // Create a DOM node of the given type, with (optionally) the given + // attributes and content. Content elements may be strings (for text + // nodes) or other DOM nodes. + + _createClass(DOMSerializer, [{ + key: "elt", + value: function elt(type, attrs) { + var result = this.doc.createElement(type); + if (attrs) for (var _name in attrs) { + if (_name == "style") result.style.cssText = attrs[_name];else if (attrs[_name]) result.setAttribute(_name, attrs[_name]); + } + + for (var _len = arguments.length, content = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { + content[_key - 2] = arguments[_key]; + } + + for (var i = 0; i < content.length; i++) { + result.appendChild(typeof content[i] == "string" ? this.doc.createTextNode(content[i]) : content[i]); + }return result; + } + }, { + key: "renderNode", + value: function renderNode(node, offset) { + var dom = node.type.serializeDOM(node, this); + for (var attr in node.type.attrs) { + var desc = node.type.attrs[attr]; + if (desc.serializeDOM) desc.serializeDOM(dom, node.attrs[attr], this, node); + } + if (this.options.onRender) dom = this.options.onRender(node, dom, offset) || dom; + return dom; + } + }, { + key: "renderContent", + value: function renderContent(node, where) { + if (!where) where = this.doc.createDocumentFragment(); + if (!node.isTextblock) this.renderBlocksInto(node, where);else if (this.options.renderInlineFlat) this.renderInlineFlatInto(node, where);else this.renderInlineInto(node, where); + return where; + } + }, { + key: "renderBlocksInto", + value: function renderBlocksInto(parent, where) { + for (var i = parent.iter(), child = undefined; child = i.next().value;) { + if (this.options.path) this.options.path.push(i.offset - child.width); + where.appendChild(this.renderNode(child, i.offset - child.width)); + if (this.options.path) this.options.path.pop(); + } + } + }, { + key: "renderInlineInto", + value: function renderInlineInto(parent, where) { + var _this = this; + + var top = where; + var active = []; + parent.forEach(function (node, offset) { + var keep = 0; + for (; keep < Math.min(active.length, node.marks.length); ++keep) if (!node.marks[keep].eq(active[keep])) break; + while (keep < active.length) { + active.pop(); + top = top.parentNode; + } + while (active.length < node.marks.length) { + var add = node.marks[active.length]; + active.push(add); + top = top.appendChild(_this.renderMark(add)); + } + top.appendChild(_this.renderNode(node, offset)); + }); + } + }, { + key: "renderInlineFlatInto", + value: function renderInlineFlatInto(parent, where) { + var _this2 = this; + + parent.forEach(function (node, start) { + var dom = _this2.renderNode(node, start); + dom = _this2.wrapInlineFlat(dom, node.marks); + dom = _this2.options.renderInlineFlat(node, dom, start) || dom; + where.appendChild(dom); + }); + } + }, { + key: "renderMark", + value: function renderMark(mark) { + var dom = mark.type.serializeDOM(mark, this); + for (var attr in mark.type.attrs) { + var desc = mark.type.attrs[attr]; + if (desc.serializeDOM) desc.serializeDOM(dom, mark.attrs[attr], this); + } + return dom; + } + }, { + key: "wrapInlineFlat", + value: function wrapInlineFlat(dom, marks) { + for (var i = marks.length - 1; i >= 0; i--) { + var wrap = this.renderMark(marks[i]); + wrap.appendChild(dom); + dom = wrap; + } + return dom; + } + + // :: (Node, string, ?Object) → DOMNode + // Render the content of ProseMirror node into a DOM node with the + // given tag name and attributes. + }, { + key: "renderAs", + value: function renderAs(node, tagName, tagAttrs) { + return this.renderContent(node, this.elt(tagName, tagAttrs)); + } + }]); + + return DOMSerializer; +})(); + +function toDOM(node) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + return new DOMSerializer(options).renderContent(node); +} + +(0, _index.defineTarget)("dom", toDOM); + +// :: (Node, ?Object) → DOMNode +// Serialize a given node to a DOM node. This is useful when you need +// to serialize a part of a document, as opposed to the whole +// document. + +function renderNodeToDOM(node, options, offset) { + var serializer = new DOMSerializer(options); + var dom = serializer.renderNode(node, offset); + if (node.isInline) { + dom = serializer.wrapInlineFlat(dom, node.marks); + if (serializer.options.renderInlineFlat) dom = options.renderInlineFlat(node, dom, offset) || dom; + } + return dom; +} + +// :: (Node, ?Object) → string +// Serialize a node as an HTML string. Goes through `toDOM` and then +// serializes the result. Again, you must pass a `document` option +// when not in the browser. + +function toHTML(node, options) { + var serializer = new DOMSerializer(options); + var wrap = serializer.elt("div"); + wrap.appendChild(serializer.renderContent(node)); + return wrap.innerHTML; +} + +(0, _index.defineTarget)("html", toHTML); + +// Block nodes + +function def(cls, method) { + cls.prototype.serializeDOM = method; +} + +def(_model.BlockQuote, function (node, s) { + return s.renderAs(node, "blockquote"); +}); + +_model.BlockQuote.prototype.countCoordsAsChild = function (_, path, dom, coords) { + var childBox = dom.firstChild.getBoundingClientRect(); + if (coords.left < childBox.left - 2) return _model.Pos.from(path); +}; + +def(_model.BulletList, function (node, s) { + return s.renderAs(node, "ul"); +}); + +def(_model.OrderedList, function (node, s) { + return s.renderAs(node, "ol", { start: node.attrs.order != "1" && node.attrs.order }); +}); + +_model.OrderedList.prototype.countCoordsAsChild = _model.BulletList.prototype.countCoordsAsChild = function (_, path, dom, coords) { + for (var i = 0; i < dom.childNodes.length; i++) { + var child = dom.childNodes[i]; + if (!child.hasAttribute("pm-offset")) continue; + var childBox = child.getBoundingClientRect(); + if (coords.left > childBox.left - 2) return null; + if (childBox.top <= coords.top && childBox.bottom >= coords.top) return new _model.Pos(path, i); + } +}; + +def(_model.ListItem, function (node, s) { + return s.renderAs(node, "li"); +}); + +def(_model.HorizontalRule, function (_, s) { + return s.elt("hr"); +}); + +def(_model.Paragraph, function (node, s) { + return s.renderAs(node, "p"); +}); + +def(_model.Heading, function (node, s) { + return s.renderAs(node, "h" + node.attrs.level); +}); + +def(_model.CodeBlock, function (node, s) { + var code = s.renderAs(node, "code"); + if (node.attrs.params != null) code.className = "fence " + node.attrs.params.replace(/(^|\s+)/g, "$&lang-"); + return s.elt("pre", null, code); +}); + +// Inline content + +def(_model.Text, function (node, s) { + return s.doc.createTextNode(node.text); +}); + +def(_model.Image, function (node, s) { + return s.elt("img", { + src: node.attrs.src, + alt: node.attrs.alt, + title: node.attrs.title + }); +}); + +def(_model.HardBreak, function (_, s) { + return s.elt("br"); +}); + +// Inline styles + +def(_model.EmMark, function (_, s) { + return s.elt("em"); +}); + +def(_model.StrongMark, function (_, s) { + return s.elt("strong"); +}); + +def(_model.CodeMark, function (_, s) { + return s.elt("code"); +}); + +def(_model.LinkMark, function (mark, s) { + return s.elt("a", { href: mark.attrs.href, + title: mark.attrs.title }); +}); + +},{"../model":45,"./index":54}],54:[function(require,module,exports){ +// !! This module provides a way to register and access functions that +// serialize ProseMirror [documents](#Node) to various formats. To +// load the actual serializers, you need to include submodules of this +// module (or 3rd party serialization modules), which will register +// themselves to this module. +// +// These are the serializers defined: +// +// **`"json"`** +// : Use `Node.toJSON` to serialize the node as JSON. Defined by the +// top-level `serialize` module. +// +// **`"dom"`** +// : Serialize to a [DOM +// fragment](https://developer.mozilla.org/en-US/docs/Web/API/DocumentFragment). +// Defined in `serialize/dom`. See `toDOM`. +// +// **`"html"`** +// : Serialize to HTML text. Defined in `serialize/dom`. See `toHTML`. +// +// **`"markdown"`** +// : Serialize to [CommonMark](http://commonmark.org/) marked-up +// text. Defined in `serialize/markdown`. See `toMarkdown`. +// +// **`"text"`** +// : Serialize to plain text. Defined in `serialize/text`. See `toText`. + +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.serializeTo = serializeTo; +exports.knownTarget = knownTarget; +exports.defineTarget = defineTarget; +var serializers = Object.create(null); + +// :: (Node, string, ?Object) → any +// Serialize the given document to the given format. If `options` is +// given, it will be passed along to the serializer function. + +function serializeTo(doc, format, options) { + var converter = serializers[format]; + if (!converter) throw new Error("Target format " + format + " not defined"); + return converter(doc, options); +} + +// :: (string) → bool +// Query whether a given serialization format has been registered. + +function knownTarget(format) { + return !!serializers[format]; +} + +// :: (string, (Node, ?Object) → any) +// Register a function as the serializer for `format`. + +function defineTarget(format, func) { + serializers[format] = func; +} + +defineTarget("json", function (doc) { + return doc.toJSON(); +}); + +},{}],55:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.toText = toText; + +var _model = require("../model"); + +var _index = require("./index"); + +_model.Block.prototype.serializeText = function (node) { + var accum = ""; + node.forEach(function (child) { + return accum += child.type.serializeText(child); + }); + return accum; +}; + +_model.Textblock.prototype.serializeText = function (node) { + var text = _model.Block.prototype.serializeText(node); + return text && text + "\n\n"; +}; + +_model.Inline.prototype.serializeText = function () { + return ""; +}; + +_model.HardBreak.prototype.serializeText = function () { + return "\n"; +}; + +_model.Text.prototype.serializeText = function (node) { + return node.text; +}; + +// :: (Node) → string +// Serialize a node as a plain text string. + +function toText(doc) { + return doc.type.serializeText(doc).trim(); +} + +(0, _index.defineTarget)("text", toText); + +},{"../model":45,"./index":54}],56:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.canLift = canLift; +exports.canWrap = canWrap; + +var _model = require("../model"); + +var _transform = require("./transform"); + +var _step = require("./step"); + +var _tree = require("./tree"); + +var _map = require("./map"); + +// !! **`ancestor`** +// : Change the stack of nodes that wrap the part of the document +// between `from` and `to`, which must point into the same parent +// node. +// +// The set of ancestors to replace is determined by the `depth` +// property of the step's parameter. If this is greater than +// zero, `from` and `to` must point at the start and end of a +// stack of nodes, of that depth, since this step will not split +// nodes. +// +// The set of new ancestors to wrap with is determined by the +// `types` and `attrs` properties of the parameter. The first +// should be an array of `NodeType`s, and the second, optionally, +// an array of attribute objects. + +_step.Step.define("ancestor", { + apply: function apply(doc, step) { + var from = step.from, + to = step.to; + if (!(0, _tree.isFlatRange)(from, to)) return null; + var toParent = from.path, + start = from.offset, + end = to.offset; + var _step$param = step.param; + var _step$param$depth = _step$param.depth; + var depth = _step$param$depth === undefined ? 0 : _step$param$depth; + var _step$param$types = _step$param.types; + var types = _step$param$types === undefined ? [] : _step$param$types; + var _step$param$attrs = _step$param.attrs; + var attrs = _step$param$attrs === undefined ? [] : _step$param$attrs; + + var inner = doc.path(from.path); + for (var i = 0; i < depth; i++) { + if (start > 0 || end < doc.path(toParent).size || toParent.length == 0) return null; + start = toParent[toParent.length - 1]; + end = start + 1; + toParent = toParent.slice(0, toParent.length - 1); + } + if (depth == 0 && types.length == 0) return null; + + var parent = doc.path(toParent), + parentSize = parent.size, + newParent = undefined; + if (parent.type.locked) return null; + if (types.length) { + var _ret = (function () { + var lastWrapper = types[types.length - 1]; + var content = inner.content.slice(from.offset, to.offset); + if (!parent.type.canContainType(types[0]) || content.some(function (n) { + return !lastWrapper.canContain(n); + }) || !inner.size && !lastWrapper.canBeEmpty || lastWrapper.locked) return { + v: null + }; + var node = null; + for (var i = types.length - 1; i >= 0; i--) { + node = types[i].create(attrs[i], node || content); + }newParent = parent.splice(start, end, _model.Fragment.from(node)); + })(); + + if (typeof _ret === "object") return _ret.v; + } else { + if (!parent.type.canContainFragment(inner.content) || !inner.size && start == 0 && end == parent.size && !parent.type.canBeEmpty) return null; + newParent = parent.splice(start, end, inner.content); + } + var copy = doc.replaceDeep(toParent, newParent); + + var toInner = toParent.slice(); + for (var i = 0; i < types.length; i++) { + toInner.push(i ? 0 : start); + }var startOfInner = new _model.Pos(toInner, types.length ? 0 : start); + var replaced = null; + var insertedSize = types.length ? 1 : to.offset - from.offset; + if (depth != types.length || depth > 1 || types.length > 1) { + var posBefore = new _model.Pos(toParent, start); + var posAfter1 = new _model.Pos(toParent, end), + posAfter2 = new _model.Pos(toParent, start + insertedSize); + var endOfInner = new _model.Pos(toInner, startOfInner.offset + (to.offset - from.offset)); + replaced = [new _map.ReplacedRange(posBefore, from, posBefore, startOfInner), new _map.ReplacedRange(to, posAfter1, endOfInner, posAfter2, posAfter1, posAfter2)]; + } + var moved = [new _map.MovedRange(from, to.offset - from.offset, startOfInner)]; + if (end - start != insertedSize) moved.push(new _map.MovedRange(new _model.Pos(toParent, end), parentSize - end, new _model.Pos(toParent, start + insertedSize))); + return new _step.StepResult(copy, new _map.PosMap(moved, replaced)); + }, + invert: function invert(step, oldDoc, map) { + var types = [], + attrs = []; + if (step.param.depth) for (var i = 0; i < step.param.depth; i++) { + var _parent = oldDoc.path(step.from.path.slice(0, step.from.path.length - i)); + types.unshift(_parent.type); + attrs.unshift(_parent.attrs); + } + var newFrom = map.map(step.from).pos; + var newTo = step.from.cmp(step.to) ? map.map(step.to, -1).pos : newFrom; + return new _step.Step("ancestor", newFrom, newTo, null, { depth: step.param.types ? step.param.types.length : 0, + types: types, attrs: attrs }); + }, + paramToJSON: function paramToJSON(param) { + return { depth: param.depth, + types: param.types && param.types.map(function (t) { + return t.name; + }), + attrs: param.attrs }; + }, + paramFromJSON: function paramFromJSON(schema, json) { + return { depth: json.depth, + types: json.types && json.types.map(function (n) { + return schema.nodeType(n); + }), + attrs: json.attrs }; + } +}); + +function canBeLifted(doc, range) { + var content = [doc.path(range.from.path)], + unwrap = false; + for (;;) { + var parentDepth = -1; + + var _loop = function _loop(_node, i) { + if (!content.some(function (inner) { + return !_node.type.canContainContent(inner.type); + })) parentDepth = i; + _node = _node.child(range.from.path[i]); + node = _node; + }; + + for (var node = doc, i = 0; i < range.from.path.length; i++) { + _loop(node, i); + } + if (parentDepth > -1) return { path: range.from.path.slice(0, parentDepth), unwrap: unwrap }; + if (unwrap || !content[0].isBlock) return null; + content = content[0].content.slice(range.from.offset, range.to.offset); + unwrap = true; + } +} + +// :: (Node, Pos, ?Pos) → bool +// Tells you whether the given positions' [sibling +// range](#Node.siblingRange), or any of its ancestor nodes, can be +// lifted out of a parent. + +function canLift(doc, from, to) { + var range = doc.siblingRange(from, to || from); + var found = canBeLifted(doc, range); + if (found) return { found: found, range: range }; +} + +// :: (Pos, ?Pos) → Transform +// Lift the nearest liftable ancestor of the [sibling +// range](#Node.siblingRange) of the given positions out of its +// parent (or do nothing if no such node exists). +_transform.Transform.prototype.lift = function (from) { + var to = arguments.length <= 1 || arguments[1] === undefined ? from : arguments[1]; + return (function () { + var can = canLift(this.doc, from, to); + if (!can) return this; + var found = can.found; + var range = can.range; + + var depth = range.from.path.length - found.path.length; + var rangeNode = found.unwrap && this.doc.path(range.from.path); + + for (var d = 0, pos = range.to;; d++) { + if (pos.offset < this.doc.path(pos.path).size) { + this.split(pos, depth - d); + break; + } + if (d == depth - 1) break; + pos = pos.shorten(null, 1); + } + for (var d = 0, pos = range.from;; d++) { + if (pos.offset > 0) { + this.split(pos, depth - d); + var cut = range.from.path.length - depth, + path = pos.path.slice(0, cut).concat(pos.path[cut] + 1); + while (path.length < range.from.path.length) path.push(0); + range = { from: new _model.Pos(path, 0), to: new _model.Pos(path, range.to.offset - range.from.offset) }; + break; + } + if (d == depth - 1) break; + pos = pos.shorten(); + } + if (found.unwrap) { + for (var i = range.to.offset - 1; i > range.from.offset; i--) { + this.join(new _model.Pos(range.from.path, i)); + }var size = 0; + for (var i = rangeNode.iter(range.from.offset, range.to.offset), child = undefined; child = i.next().value;) { + size += child.size; + }var path = range.from.path.concat(range.from.offset); + range = { from: new _model.Pos(path, 0), to: new _model.Pos(path, size) }; + ++depth; + } + this.step("ancestor", range.from, range.to, null, { depth: depth }); + return this; + }).apply(this, arguments); +}; + +// :: (Node, Pos, ?Pos, NodeType) → bool +// Determines whether the [sibling range](#Node.siblingRange) of the +// given positions can be wrapped in the given node type. + +function canWrap(doc, from, to, type) { + var range = doc.siblingRange(from, to || from); + if (range.from.offset == range.to.offset) return null; + var parent = doc.path(range.from.path); + var around = parent.type.findConnection(type); + var inside = type.findConnection(parent.child(range.from.offset).type); + if (around && inside) return { range: range, around: around, inside: inside }; +} + +// :: (Pos, ?Pos, NodeType, ?Object) → Transform +// Wrap the [sibling range](#Node.siblingRange) of the given positions +// in a node of the given type, with the given attributes (if +// possible). +_transform.Transform.prototype.wrap = function (from, to, type, wrapAttrs) { + var can = canWrap(this.doc, from, to, type); + if (!can) return this; + var range = can.range; + var around = can.around; + var inside = can.inside; + + var types = around.concat(type).concat(inside); + var attrs = around.map(function () { + return null; + }).concat(wrapAttrs).concat(inside.map(function () { + return null; + })); + this.step("ancestor", range.from, range.to, null, { types: types, attrs: attrs }); + if (inside.length) { + var toInner = range.from.path.slice(); + for (var i = 0; i < around.length + inside.length + 1; i++) { + toInner.push(i ? 0 : range.from.offset); + }for (var i = range.to.offset - 1 - range.from.offset; i > 0; i--) { + this.split(new _model.Pos(toInner, i), inside.length); + } + } + return this; +}; + +// :: (Pos, ?Pos, NodeType, ?Object) → Transform +// Set the type of all textblocks (partly) between `from` and `to` to +// the given node type with the given attributes. +_transform.Transform.prototype.setBlockType = function (from, to, type, attrs) { + var _this = this; + + this.doc.nodesBetween(from, to || from, function (node, path) { + if (node.isTextblock && !node.hasMarkup(type, attrs)) { + path = path.slice(); + // Ensure all markup that isn't allowed in the new node type is cleared + _this.clearMarkup(new _model.Pos(path, 0), new _model.Pos(path, node.size), type); + _this.step("ancestor", new _model.Pos(path, 0), new _model.Pos(path, _this.doc.path(path).size), null, { depth: 1, types: [type], attrs: [attrs] }); + return false; + } + }); + return this; +}; + +// :: (Pos, NodeType, ?Object) → Transform +// Change the type and attributes of the node after `pos`. +_transform.Transform.prototype.setNodeType = function (pos, type, attrs) { + var node = this.doc.nodeAfter(pos); + var path = pos.toPath(); + this.step("ancestor", new _model.Pos(path, 0), new _model.Pos(path, node.size), null, { depth: 1, types: [type], attrs: [attrs] }); + return this; +}; + +},{"../model":45,"./map":59,"./step":63,"./transform":64,"./tree":65}],57:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +require("./mark"); + +require("./split"); + +require("./replace"); + +// !! This module defines a way to transform documents. Transforming +// happens in `Step`s, which are atomic, well-defined modifications to +// a document. [Applying](`Step.apply`) a step produces a new document +// and a [position map](#PosMap) that maps positions in the old +// document to position in the new document. Steps can be +// [inverted](#Step.invert) to create a step that undoes their effect, +// and chained together in a convenience object called a `Transform`. +// +// This module does not depend on the browser API being available +// (i.e. you can load it into any JavaScript environment). +// +// These are the types of steps defined: +var _transform = require("./transform"); + +Object.defineProperty(exports, "Transform", { + enumerable: true, + get: function get() { + return _transform.Transform; + } +}); + +var _step = require("./step"); + +Object.defineProperty(exports, "Step", { + enumerable: true, + get: function get() { + return _step.Step; + } +}); +Object.defineProperty(exports, "StepResult", { + enumerable: true, + get: function get() { + return _step.StepResult; + } +}); + +var _ancestor = require("./ancestor"); + +Object.defineProperty(exports, "canLift", { + enumerable: true, + get: function get() { + return _ancestor.canLift; + } +}); +Object.defineProperty(exports, "canWrap", { + enumerable: true, + get: function get() { + return _ancestor.canWrap; + } +}); + +var _join = require("./join"); + +Object.defineProperty(exports, "joinPoint", { + enumerable: true, + get: function get() { + return _join.joinPoint; + } +}); +Object.defineProperty(exports, "joinableBlocks", { + enumerable: true, + get: function get() { + return _join.joinableBlocks; + } +}); + +var _map = require("./map"); + +Object.defineProperty(exports, "PosMap", { + enumerable: true, + get: function get() { + return _map.PosMap; + } +}); +Object.defineProperty(exports, "MapResult", { + enumerable: true, + get: function get() { + return _map.MapResult; + } +}); +Object.defineProperty(exports, "Remapping", { + enumerable: true, + get: function get() { + return _map.Remapping; + } +}); + +},{"./ancestor":56,"./join":58,"./map":59,"./mark":60,"./replace":61,"./split":62,"./step":63,"./transform":64}],58:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.joinableBlocks = joinableBlocks; +exports.joinPoint = joinPoint; + +var _model = require("../model"); + +var _transform = require("./transform"); + +var _step = require("./step"); + +var _map = require("./map"); + +// !! **`join`** +// : Join two block elements together. `from` and `to` must point at +// the end of the first and start of the second element (so that +// the intention is preserved even when the positions are mapped). + +_step.Step.define("join", { + apply: function apply(doc, step) { + var before = doc.path(step.from.path); + var after = doc.path(step.to.path); + if (step.from.offset < before.size || step.to.offset > 0 || !before.type.canContainFragment(after.content)) return null; + var pFrom = step.from.path, + pTo = step.to.path; + var last = pFrom.length - 1, + offset = pFrom[last] + 1; + if (pFrom.length != pTo.length || pFrom.length == 0 || offset != pTo[last]) return null; + for (var i = 0; i < last; i++) { + if (pFrom[i] != pTo[i]) return null; + }var targetPath = pFrom.slice(0, last); + var target = doc.path(targetPath), + oldSize = target.size; + if (target.type.locked) return null; + var joined = before.append(after.content); + var copy = doc.replaceDeep(targetPath, target.splice(offset - 1, offset + 1, _model.Fragment.from(joined))); + + var map = new _map.PosMap([new _map.MovedRange(step.to, after.size, step.from), new _map.MovedRange(new _model.Pos(targetPath, offset + 1), oldSize - offset - 1, new _model.Pos(targetPath, offset))], [new _map.ReplacedRange(step.from, step.to, step.from, step.from, step.to.shorten())]); + return new _step.StepResult(copy, map); + }, + invert: function invert(step, oldDoc) { + return new _step.Step("split", null, null, step.from, oldDoc.path(step.to.path).copy()); + } +}); + +// :: (Node, Pos) → bool +// Test whether the blocks before and after a given position can be +// joined. + +function joinableBlocks(doc, pos) { + if (pos.offset == 0) return false; + var parent = doc.path(pos.path); + if (parent.isTextblock || pos.offset == parent.size) return false; + var type = parent.child(pos.offset - 1).type; + return !type.isTextblock && type.contains && type == parent.child(pos.offset).type; +} + +// :: (Node, Pos, ?number) → ?Pos +// Find an ancestor of the given position that can be joined to the +// block before (or after if `dir` is positive). Returns the joinable +// point, if any. + +function joinPoint(doc, pos) { + var dir = arguments.length <= 2 || arguments[2] === undefined ? -1 : arguments[2]; + + for (;;) { + if (joinableBlocks(doc, pos)) return pos; + if (pos.depth == 0) return null; + pos = pos.shorten(null, dir < 0 ? 0 : 1); + } +} + +// :: (Pos) → Transform +// Join the blocks around the given position. +_transform.Transform.prototype.join = function (at) { + var parent = this.doc.path(at.path); + if (at.offset == 0 || at.offset == parent.size || parent.isTextblock) return this; + this.step("join", new _model.Pos(at.path.concat(at.offset - 1), parent.child(at.offset - 1).size), new _model.Pos(at.path.concat(at.offset), 0)); + return this; +}; + +},{"../model":45,"./map":59,"./step":63,"./transform":64}],59:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = (function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); + } + }return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; + }; +})(); + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +var _model = require("../model"); + +// ;; #kind=interface #path=Mappable #toc=false +// There are various things that positions can be mapped through. +// We'll denote those as 'mappable'. This is not an actual class in +// the codebase, only an agreed-on interface. + +// :: (pos: Pos, bias: ?number) → MapResult +// #path=Mappable.map +// Map a position through this object. When given, the `bias` +// determines in which direction to move when a chunk of content is +// inserted at or around the mapped position. + +var MovedRange = (function () { + function MovedRange(start, size) { + var dest = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2]; + + _classCallCheck(this, MovedRange); + + this.start = start; + this.size = size; + this.dest = dest; + } + + _createClass(MovedRange, [{ + key: "toString", + value: function toString() { + return "[moved " + this.start + "+" + this.size + " to " + this.dest + "]"; + } + }, { + key: "end", + get: function get() { + return new _model.Pos(this.start.path, this.start.offset + this.size); + } + }]); + + return MovedRange; +})(); + +exports.MovedRange = MovedRange; + +var Side = function Side(from, to, ref) { + _classCallCheck(this, Side); + + this.from = from; + this.to = to; + this.ref = ref; +}; + +var ReplacedRange = (function () { + function ReplacedRange(from, to, newFrom, newTo) { + var ref = arguments.length <= 4 || arguments[4] === undefined ? from : arguments[4]; + var newRef = arguments.length <= 5 || arguments[5] === undefined ? newFrom : arguments[5]; + return (function () { + _classCallCheck(this, ReplacedRange); + + this.before = new Side(from, to, ref); + this.after = new Side(newFrom, newTo, newRef); + }).apply(this, arguments); + } + + _createClass(ReplacedRange, [{ + key: "toString", + value: function toString() { + return "[replaced " + this.before.from + "-" + this.before.to + " with " + this.after.from + "-" + this.after.to + "]"; + } + }]); + + return ReplacedRange; +})(); + +exports.ReplacedRange = ReplacedRange; + +var empty = []; + +function offsetFrom(base, pos) { + if (pos.path.length > base.path.length) { + var path = [pos.path[base.path.length] - base.offset]; + for (var i = base.path.length + 1; i < pos.path.length; i++) { + path.push(pos.path[i]); + }return new _model.Pos(path, pos.offset); + } else { + return new _model.Pos([], pos.offset - base.offset); + } +} + +function mapThrough(map, pos, bias, back) { + if (bias === undefined) bias = 1; + + for (var i = 0; i < map.replaced.length; i++) { + var range = map.replaced[i], + side = back ? range.after : range.before; + var left = undefined, + right = undefined; + if ((left = pos.cmp(side.from)) >= 0 && (right = pos.cmp(side.to)) <= 0) { + var other = back ? range.before : range.after; + return new MapResult(bias < 0 ? other.from : other.to, !!(left && right), { rangeID: i, offset: offsetFrom(side.ref, pos) }); + } + } + + for (var i = 0; i < map.moved.length; i++) { + var range = map.moved[i]; + var start = back ? range.dest : range.start; + if (pos.cmp(start) >= 0 && _model.Pos.cmp(pos.path, pos.offset, start.path, start.offset + range.size) <= 0) { + var dest = back ? range.start : range.dest; + var depth = start.depth; + if (pos.depth > depth) { + var offset = dest.offset + (pos.path[depth] - start.offset); + return new MapResult(new _model.Pos(dest.path.concat(offset).concat(pos.path.slice(depth + 1)), pos.offset)); + } else { + return new MapResult(new _model.Pos(dest.path, dest.offset + (pos.offset - start.offset))); + } + } + } + + return new MapResult(pos); +} + +// ;; A position map, holding information about the way positions in +// the pre-step version of a document correspond to positions in the +// post-step version. This class implements `Mappable`. + +var PosMap = (function () { + function PosMap(moved, replaced) { + _classCallCheck(this, PosMap); + + this.moved = moved || empty; + this.replaced = replaced || empty; + } + + // ;; #toc=false The return value of mapping a position. + + _createClass(PosMap, [{ + key: "recover", + value: function recover(offset) { + return this.replaced[offset.rangeID].after.ref.extend(offset.offset); + } + + // :: (Pos, ?number) → MapResult + // Map the given position through this map. The `bias` parameter can + // be used to control what happens when the transform inserted + // content at (or around) this position—if `bias` is negative, the a + // position before the inserted content will be returned, if it is + // positive, a position after the insertion is returned. + }, { + key: "map", + value: function map(pos, bias) { + return mapThrough(this, pos, bias, false); + } + + // :: () → PosMap + // Create an inverted version of this map. The result can be used to + // map positions in the post-step document to the pre-step document. + }, { + key: "invert", + value: function invert() { + return new InvertedPosMap(this); + } + }, { + key: "toString", + value: function toString() { + return this.moved.concat(this.replaced).join(" "); + } + }]); + + return PosMap; +})(); + +exports.PosMap = PosMap; + +var MapResult = function MapResult(pos) { + var deleted = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1]; + var recover = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2]; + + _classCallCheck(this, MapResult); + + // :: Pos The mapped version of the position. + this.pos = pos; + // :: bool Tells you whether the position was deleted, that is, + // whether the step removed its surroundings from the document. + this.deleted = deleted; + this.recover = recover; +}; + +exports.MapResult = MapResult; + +var InvertedPosMap = (function () { + function InvertedPosMap(map) { + _classCallCheck(this, InvertedPosMap); + + this.inner = map; + } + + _createClass(InvertedPosMap, [{ + key: "recover", + value: function recover(offset) { + return this.inner.replaced[offset.rangeID].before.ref.extend(offset.offset); + } + }, { + key: "map", + value: function map(pos, bias) { + return mapThrough(this.inner, pos, bias, true); + } + }, { + key: "invert", + value: function invert() { + return this.inner; + } + }, { + key: "toString", + value: function toString() { + return "-" + this.inner; + } + }]); + + return InvertedPosMap; +})(); + +var nullMap = new PosMap(); + +exports.nullMap = nullMap; +// ;; A remapping represents a pipeline of zero or more mappings. It +// is a specialized data structured used to manage mapping through a +// series of steps, typically including inverted and non-inverted +// versions of the same step. (This comes up when ‘rebasing’ steps for +// collaboration or history management.) This class implements +// `Mappable`. + +var Remapping = (function () { + // :: (?[PosMap], ?[PosMap]) + + function Remapping() { + var head = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0]; + var tail = arguments.length <= 1 || arguments[1] === undefined ? [] : arguments[1]; + var mirror = arguments.length <= 2 || arguments[2] === undefined ? Object.create(null) : arguments[2]; + + _classCallCheck(this, Remapping); + + // :: [PosMap] + // The maps in the head of the mapping are applied to input + // positions first, back-to-front. So the map at the end of this + // array (if any) is the very first one applied. + this.head = head; + // The maps in the tail are applied last, front-to-back. + this.tail = tail; + this.mirror = mirror; + } + + // :: (PosMap, ?number) → number + // Add a map to the mapping's front. If this map is the mirror image + // (produced by an inverted step) of another map in this mapping, + // that map's id (as returned by this method or + // [`addToBack`](#Remapping.addToBack)) should be passed as a second + // parameter to register the correspondence. + + _createClass(Remapping, [{ + key: "addToFront", + value: function addToFront(map, corr) { + this.head.push(map); + var id = -this.head.length; + if (corr != null) this.mirror[id] = corr; + return id; + } + + // :: (PosMap, ?number) → number + // Add a map to the mapping's back. If the map is the mirror image + // of another mapping in this object, the id of that map should be + // passed to register the correspondence. + }, { + key: "addToBack", + value: function addToBack(map, corr) { + this.tail.push(map); + var id = this.tail.length - 1; + if (corr != null) this.mirror[corr] = id; + return id; + } + }, { + key: "get", + value: function get(id) { + return id < 0 ? this.head[-id - 1] : this.tail[id]; + } + + // :: (Pos, ?number) → MapResult + // Map a position through this remapping, optionally passing a bias + // direction. + }, { + key: "map", + value: function map(pos, bias) { + var deleted = false; + + for (var i = -this.head.length; i < this.tail.length; i++) { + var map = this.get(i); + var result = map.map(pos, bias); + if (result.recover) { + var corr = this.mirror[i]; + if (corr != null) { + i = corr; + pos = this.get(corr).recover(result.recover); + continue; + } + } + if (result.deleted) deleted = true; + pos = result.pos; + } + + return new MapResult(pos, deleted); + } + }]); + + return Remapping; +})(); + +exports.Remapping = Remapping; + +},{"../model":45}],60:[function(require,module,exports){ +"use strict"; + +var _model = require("../model"); + +var _transform = require("./transform"); + +var _step = require("./step"); + +var _tree = require("./tree"); + +// !! +// **`addMark`** +// : Add the `Mark` given as the step's parameter to all +// inline content between `from` and `to` (when allowed). +// +// **`removeMark`** +// : Remove the `Mark` given as the step's parameter from all inline +// content between `from` and `to`. + +_step.Step.define("addMark", { + apply: function apply(doc, step) { + return new _step.StepResult((0, _tree.copyStructure)(doc, step.from, step.to, function (node, from, to) { + if (!node.type.canContainMark(step.param)) return node; + return (0, _tree.copyInline)(node, from, to, function (node) { + return node.mark(step.param.addToSet(node.marks)); + }); + })); + }, + invert: function invert(step, _oldDoc, map) { + return new _step.Step("removeMark", step.from, map.map(step.to).pos, null, step.param); + }, + paramToJSON: function paramToJSON(param) { + return param.toJSON(); + }, + paramFromJSON: function paramFromJSON(schema, json) { + return schema.markFromJSON(json); + } +}); + +// :: (Pos, Pos, Mark) → Transform +// Add the given mark to the inline content between `from` and `to`. +_transform.Transform.prototype.addMark = function (from, to, mark) { + var _this = this; + + var removed = [], + added = [], + removing = null, + adding = null; + this.doc.inlineNodesBetween(from, to, function (_ref, path, start, end, parent) { + var marks = _ref.marks; + + if (mark.isInSet(marks) || !parent.type.canContainMark(mark.type)) { + adding = removing = null; + } else { + var rm = mark.type.isInSet(marks); + if (rm) { + if (removing && removing.param.eq(rm)) { + removing.to = new _model.Pos(path, end); + } else { + removing = new _step.Step("removeMark", new _model.Pos(path, start), new _model.Pos(path, end), null, rm); + removed.push(removing); + } + } else if (removing) { + removing = null; + } + if (adding) { + adding.to = new _model.Pos(path, end); + } else { + adding = new _step.Step("addMark", new _model.Pos(path, start), new _model.Pos(path, end), null, mark); + added.push(adding); + } + } + }); + removed.forEach(function (s) { + return _this.step(s); + }); + added.forEach(function (s) { + return _this.step(s); + }); + return this; +}; + +_step.Step.define("removeMark", { + apply: function apply(doc, step) { + return new _step.StepResult((0, _tree.copyStructure)(doc, step.from, step.to, function (node, from, to) { + return (0, _tree.copyInline)(node, from, to, function (node) { + return node.mark(step.param.removeFromSet(node.marks)); + }); + })); + }, + invert: function invert(step, _oldDoc, map) { + return new _step.Step("addMark", step.from, map.map(step.to).pos, null, step.param); + }, + paramToJSON: function paramToJSON(param) { + return param.toJSON(); + }, + paramFromJSON: function paramFromJSON(schema, json) { + return schema.markFromJSON(json); + } +}); + +// :: (Pos, Pos, union) → Transform +// Remove the given mark, or all marks of the given type, from inline +// nodes between `from` and `to`. +_transform.Transform.prototype.removeMark = function (from, to) { + var _this2 = this; + + var mark = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2]; + + var matched = [], + step = 0; + this.doc.inlineNodesBetween(from, to, function (_ref2, path, start, end) { + var marks = _ref2.marks; + + step++; + var toRemove = null; + if (mark instanceof _model.MarkType) { + var found = mark.isInSet(marks); + if (found) toRemove = [found]; + } else if (mark) { + if (mark.isInSet(marks)) toRemove = [mark]; + } else { + toRemove = marks; + } + if (toRemove && toRemove.length) { + path = path.slice(); + for (var i = 0; i < toRemove.length; i++) { + var rm = toRemove[i], + found = undefined; + for (var j = 0; j < matched.length; j++) { + var m = matched[j]; + if (m.step == step - 1 && rm.eq(matched[j].style)) found = m; + } + if (found) { + found.to = new _model.Pos(path, end); + found.step = step; + } else { + matched.push({ style: rm, from: new _model.Pos(path, start), to: new _model.Pos(path, end), step: step }); + } + } + } + }); + matched.forEach(function (m) { + return _this2.step("removeMark", m.from, m.to, null, m.style); + }); + return this; +}; + +// :: (Pos, Pos, ?NodeType) → Transform +// Remove all marks and non-text inline nodes, or if `newParent` is +// given, all marks and inline nodes that may not appear as content of +// `newParent`, from the given range. +_transform.Transform.prototype.clearMarkup = function (from, to, newParent) { + var _this3 = this; + + var delSteps = []; // Must be accumulated and applied in inverse order + this.doc.inlineNodesBetween(from, to, function (_ref3, path, start, end) { + var marks = _ref3.marks; + var type = _ref3.type; + + if (newParent ? !newParent.canContainType(type) : !type.isText) { + path = path.slice(); + var _from = new _model.Pos(path, start); + delSteps.push(new _step.Step("replace", _from, new _model.Pos(path, end), _from)); + return; + } + for (var i = 0; i < marks.length; i++) { + var mark = marks[i]; + if (!newParent || !newParent.canContainMark(mark.type)) { + path = path.slice(); + _this3.step("removeMark", new _model.Pos(path, start), new _model.Pos(path, end), null, mark); + } + } + }); + for (var i = delSteps.length - 1; i >= 0; i--) { + this.step(delSteps[i]); + }return this; +}; + +},{"../model":45,"./step":63,"./transform":64,"./tree":65}],61:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.replace = replace; + +var _model = require("../model"); + +var _transform = require("./transform"); + +var _step = require("./step"); + +var _map = require("./map"); + +var _tree = require("./tree"); + +// !! **`replace`** + +// : Delete the part of the document between `from` and `to` and +// optionally replace it with another chunk of content. `pos` must +// point at the ‘root’ at which the cut starts—a position between +// and above `from` and `to`. +// +// When new content is to be inserted, the step's parameter should +// be an object of shape `{content: `[`Fragment`](#Fragment)`, +// openLeft: number, openRight: number}`. The step will insert the +// given content at the root of the cut, and `openLeft` and +// `openRight` indicate how much of the content on both sides +// should be consided ‘open’. +// +// A replace step will try to join open nodes on both sides of the +// cut. That is, nodes in the original document that are partially +// cut off by `from` and `to`, and nodes at the sides of the +// replacement content as specificed by `openLeft` and +// `openRight`. For example, if `openLeft` is 2, the first node of +// the replacement content as well as its first child is +// considered open. Whenever two open nodes with the same +// [markup](#Node.sameMarkup) end up next to each other, they are +// joined. Open nodes that aren't joined are [closed](#Node.close) +// to ensure their content (or lack of it) is valid. + +function findMovedChunks(oldNode, oldPath, newNode, startDepth) { + var moved = []; + var newPath = oldPath.path.slice(0, startDepth); + + for (var depth = startDepth;; depth++) { + var joined = depth == oldPath.depth ? 0 : 1; + var cut = depth == oldPath.depth ? oldPath.offset : oldPath.path[depth]; + var afterCut = oldNode.size - cut; + var newOffset = newNode.size - afterCut; + + var from = oldPath.shorten(depth, joined); + var to = new _model.Pos(newPath, newOffset + joined); + if (from.cmp(to)) moved.push(new _map.MovedRange(from, afterCut - joined, to)); + + if (!joined) return moved; + + oldNode = oldNode.child(cut); + newNode = newNode.child(newOffset); + newPath = newPath.concat(newOffset); + } +} + +function replace(node, from, to, root, repl) { + var depth = arguments.length <= 5 || arguments[5] === undefined ? 0 : arguments[5]; + + if (depth == root.length) { + var before = node.sliceBetween(null, from, depth); + var after = node.sliceBetween(to, null, depth), + result = undefined; + if (!before.type.canContainFragment(repl.content)) return null; + if (repl.content.size) result = before.append(repl.content, from.depth - depth, repl.openLeft).append(after.content, repl.openRight, to.depth - depth);else result = before.append(after.content, from.depth - depth, to.depth - depth); + if (!result.size && !result.type.canBeEmpty) result = result.copy(result.type.defaultContent()); + return { doc: result, moved: findMovedChunks(node, to, result, depth) }; + } else { + var pos = root[depth]; + var result = replace(node.child(pos), from, to, root, repl, depth + 1); + if (!result) return null; + return { doc: node.replace(pos, result.doc), moved: result.moved }; + } +} + +var nullRepl = { content: _model.emptyFragment, openLeft: 0, openRight: 0 }; + +_step.Step.define("replace", { + apply: function apply(doc, step) { + var rootPos = step.pos, + root = rootPos.path; + if (step.from.depth < root.length || step.to.depth < root.length) return null; + for (var i = 0; i < root.length; i++) { + if (step.from.path[i] != root[i] || step.to.path[i] != root[i]) return null; + }var result = replace(doc, step.from, step.to, rootPos.path, step.param || nullRepl); + if (!result) return null; + var out = result.doc; + var moved = result.moved; + + var end = moved.length ? moved[moved.length - 1].dest : step.to; + var replaced = new _map.ReplacedRange(step.from, step.to, step.from, end, rootPos, rootPos); + return new _step.StepResult(out, new _map.PosMap(moved, [replaced])); + }, + invert: function invert(step, oldDoc, map) { + var depth = step.pos.depth; + return new _step.Step("replace", step.from, map.map(step.to).pos, step.from.shorten(depth), { + content: oldDoc.path(step.pos.path).content.sliceBetween(step.from, step.to, depth), + openLeft: step.from.depth - depth, + openRight: step.to.depth - depth + }); + }, + paramToJSON: function paramToJSON(param) { + return param && { content: param.content.size && param.content.toJSON(), + openLeft: param.openLeft, openRight: param.openRight }; + }, + paramFromJSON: function paramFromJSON(schema, json) { + return json && { content: _model.Fragment.fromJSON(schema, json.content), + openLeft: json.openLeft, openRight: json.openRight }; + } +}); + +function shiftFromStack(stack, depth) { + var shifted = stack[depth] = stack[depth].splice(0, 1, _model.emptyFragment); + for (var i = depth - 1; i >= 0; i--) { + shifted = stack[i] = stack[i].replace(0, shifted); + } +} + +// FIXME find a not so horribly confusing way to express this +function buildInserted(nodesLeft, source, start, end) { + var sliced = source.sliceBetween(start, end); + var nodesRight = []; + for (var node = sliced, i = 0; i <= start.path.length; i++, node = node.firstChild) { + nodesRight.push(node); + }var same = (0, _tree.samePathDepth)(start, end); + var searchLeft = nodesLeft.length - 1, + searchRight = nodesRight.length - 1; + var result = null; + + var inner = nodesRight[searchRight]; + if (inner.isTextblock && inner.size && nodesLeft[searchLeft].isTextblock) { + result = nodesLeft[searchLeft--].copy(inner.content); + --searchRight; + shiftFromStack(nodesRight, searchRight); + } + + for (;;) { + var node = nodesRight[searchRight], + type = node.type, + matched = null; + var outside = searchRight <= same; + for (var i = searchLeft; i >= 0; i--) { + var left = nodesLeft[i]; + if (outside ? left.type.canContainContent(node.type) : left.type == type) { + matched = i; + break; + } + } + if (matched != null) { + if (!result) { + result = nodesLeft[matched].copy(node.content); + searchLeft = matched - 1; + } else { + while (searchLeft >= matched) { + var wrap = nodesLeft[searchLeft]; + var content = _model.Fragment.from(result); + result = wrap.copy(searchLeft == matched ? content.append(node.content) : content); + searchLeft--; + } + } + } + if (matched != null || node.size == 0) { + if (outside) break; + if (searchRight) shiftFromStack(nodesRight, searchRight - 1); + } + searchRight--; + } + + var repl = { content: result ? result.content : _model.emptyFragment, + openLeft: start.depth - searchRight, + openRight: end.depth - searchRight }; + return { repl: repl, depth: searchLeft + 1 }; +} + +function moveText(tr, doc, before, after) { + var root = (0, _tree.samePathDepth)(before, after); + var cutAt = after.shorten(null, 1); + while (cutAt.path.length > root && doc.path(cutAt.path).size == 1) cutAt = cutAt.shorten(null, 1); + tr.split(cutAt, cutAt.path.length - root); + var start = after, + end = new _model.Pos(start.path, doc.path(start.path).size); + var parent = doc.path(start.path.slice(0, root)); + var wanted = parent.pathNodes(before.path.slice(root)); + var existing = parent.pathNodes(start.path.slice(root)); + while (wanted.length && existing.length && wanted[0].sameMarkup(existing[0])) { + wanted.shift(); + existing.shift(); + } + if (existing.length || wanted.length) tr.step("ancestor", start, end, null, { + depth: existing.length, + types: wanted.map(function (n) { + return n.type; + }), + attrs: wanted.map(function (n) { + return n.attrs; + }) + }); + for (var i = root; i < before.path.length; i++) { + tr.join(before.shorten(i, 1)); + } +} + +// :: (Pos, Pos) → Transform +// Delete the content between the given positions. +_transform.Transform.prototype["delete"] = function (from, to) { + if (from.cmp(to)) this.replace(from, to); + return this; +}; + +// :: (Pos, Pos, Node, Pos, Pos) → Transform +// Replace the part of the document between `from` and `to` with the +// part of the `source` between `start` and `end`. +_transform.Transform.prototype.replace = function (from, to, source, start, end) { + var repl = undefined, + depth = undefined, + doc = this.doc, + maxDepth = (0, _tree.samePathDepth)(from, to); + if (source) { + ; + var _buildInserted = buildInserted(doc.pathNodes(from.path), source, start, end); + + repl = _buildInserted.repl; + depth = _buildInserted.depth; + + while (depth > maxDepth) { + if (repl.content.size) repl = { content: _model.Fragment.from(doc.path(from.path.slice(0, depth)).copy(repl.content)), + openLeft: repl.openLeft + 1, openRight: repl.openRight + 1 }; + depth--; + } + } else { + repl = nullRepl; + depth = maxDepth; + } + var root = from.shorten(depth), + docAfter = doc, + after = to; + if (repl.content.size || (0, _tree.replaceHasEffect)(doc, from, to)) { + var result = this.step("replace", from, to, root, repl); + docAfter = result.doc; + after = result.map.map(to).pos; + } + + // If no text nodes before or after end of replacement, don't glue text + if (!doc.path(to.path).isTextblock) return this; + if (!(repl.content.size ? source.path(end.path).isTextblock : doc.path(from.path).isTextblock)) return this; + + var nodesAfter = doc.path(root.path).pathNodes(to.path.slice(depth)).slice(1); + var nodesBefore = undefined; + if (repl.content.size) { + var inserted = repl.content; + nodesBefore = []; + for (var i = 0; i < repl.openRight; i++) { + var last = inserted.child(inserted.size - 1); + nodesBefore.push(last); + inserted = last.content; + } + } else { + nodesBefore = doc.path(root.path).pathNodes(from.path.slice(depth)).slice(1); + } + + if (nodesBefore.length && (nodesAfter.length != nodesBefore.length || !nodesAfter.every(function (n, i) { + return n.sameMarkup(nodesBefore[i]); + }))) { + var _after$shorten = after.shorten(root.depth); + + var path = _after$shorten.path; + var offset = _after$shorten.offset;var before = undefined; + for (var node = docAfter.path(path), i = 0;; i++) { + if (i == nodesBefore.length) { + before = new _model.Pos(path, offset); + break; + } + path.push(offset - 1); + node = node.child(offset - 1); + offset = node.size; + } + moveText(this, docAfter, before, after); + } + return this; +}; + +// :: (Pos, Pos, union) → Transform +// Replace the given sibling range (position ponting into the same +// parent) with the given content, which may be a fragment, node, or +// array of nodes. +_transform.Transform.prototype.replaceWith = function (from, to, content) { + if (!(content instanceof _model.Fragment)) content = _model.Fragment.from(content); + if (!_model.Pos.samePath(from.path, to.path)) return this; + this.step("replace", from, to, from, { content: content, openLeft: 0, openRight: 0 }); + return this; +}; + +// :: (Pos, union) → Transform +// Insert the given content at the `pos`. +_transform.Transform.prototype.insert = function (pos, content) { + return this.replaceWith(pos, pos, content); +}; + +// :: (Pos, string) → Transform +// Insert the given text at `pos`, inheriting the marks of the +// existing content at that position. +_transform.Transform.prototype.insertText = function (pos, text) { + return this.insert(pos, this.doc.type.schema.text(text, this.doc.marksAt(pos))); +}; + +// :: (Pos, Node) → Transform +// Insert the given node at `pos`, inheriting the marks of the +// existing content at that position. +_transform.Transform.prototype.insertInline = function (pos, node) { + return this.insert(pos, node.mark(this.doc.marksAt(pos))); +}; + +},{"../model":45,"./map":59,"./step":63,"./transform":64,"./tree":65}],62:[function(require,module,exports){ +"use strict"; + +var _model = require("../model"); + +var _transform = require("./transform"); + +var _step = require("./step"); + +var _map = require("./map"); + +// !! **`split`** +// : Split a block node at `pos`. The parameter, if given, may be +// `{type, ?attrs}` object giving the node type and optionally the +// attributes of the node created to hold the content after the +// split. + +_step.Step.define("split", { + apply: function apply(doc, step) { + var pos = step.pos; + if (pos.depth == 0) return null; + + var _pos$shorten = pos.shorten(); + + var parentPath = _pos$shorten.path; + var offset = _pos$shorten.offset; + + var parent = doc.path(parentPath); + var target = parent.child(offset), + targetSize = target.size; + + var _ref = step.param || target; + + var typeAfter = _ref.type; + var attrsAfter = _ref.attrs; + + var splitAt = pos.offset; + if (splitAt == 0 && !target.type.canBeEmpty || target.type.locked || splitAt == target.size && !typeAfter.canBeEmpty) return null; + var newParent = parent.splice(offset, offset + 1, _model.Fragment.from([target.slice(0, splitAt), typeAfter.create(attrsAfter, target.content.slice(splitAt))])); + var copy = doc.replaceDeep(parentPath, newParent); + + var dest = new _model.Pos(parentPath.concat(offset + 1), 0); + var map = new _map.PosMap([new _map.MovedRange(pos, targetSize - pos.offset, dest), new _map.MovedRange(new _model.Pos(parentPath, offset + 1), newParent.size - 2 - offset, new _model.Pos(parentPath, offset + 2))], [new _map.ReplacedRange(pos, pos, pos, dest, pos, pos.shorten(null, 1))]); + return new _step.StepResult(copy, map); + }, + invert: function invert(step, _oldDoc, map) { + return new _step.Step("join", step.pos, map.map(step.pos).pos); + }, + paramToJSON: function paramToJSON(param) { + return param && { type: param.type.name, attrs: param.attrs }; + }, + paramFromJSON: function paramFromJSON(schema, json) { + return json && { type: schema.nodeType(json.type), attrs: json.attrs }; + } +}); + +// :: (Pos, ?number, ?NodeType, ?Object) → Transform +// Split the node at the given position, and optionally, if `depth` is +// greater than one, any number of nodes above that. By default, the part +// split off will inherit the node type of the original node. This can +// be changed by passing `typeAfter` and `attrsAfter`. +_transform.Transform.prototype.split = function (pos, depth, typeAfter, attrsAfter) { + if (depth === undefined) depth = 1; + + if (depth == 0) return this; + for (var i = 0;; i++) { + this.step("split", null, null, pos, typeAfter && { type: typeAfter, attrs: attrsAfter }); + if (i == depth - 1) return this; + typeAfter = null; + pos = pos.shorten(null, 1); + } +}; + +// :: (Pos, ?number) → Transform +// Split at the given position, _if_ that position isn't already at +// the start or end of a node. If `depth` is greater than one, also do +// so for parent positions above the given position. +_transform.Transform.prototype.splitIfNeeded = function (pos) { + var depth = arguments.length <= 1 || arguments[1] === undefined ? 1 : arguments[1]; + + for (var off = 0; off < depth; off++) { + var here = pos.shorten(pos.depth - off); + if (here.offset && here.offset < this.doc.path(here.path).size) this.step("split", null, null, here); + } + return this; +}; + +},{"../model":45,"./map":59,"./step":63,"./transform":64}],63:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = (function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); + } + }return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; + }; +})(); + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +var _model = require("../model"); + +var _map = require("./map"); + +// ;; A step object wraps an atomic operation. It generally applies +// only to the document it was created for, since the positions +// associated with it will only make sense for that document. + +var Step = (function () { + // :: (string, ?Pos, ?Pos, ?Pos, ?any) + // Build a step. The type should name a [defined](Step.define) step + // type, and the shape of the positions and parameter should be + // appropriate for that type. + + function Step(type, from, to, pos) { + var param = arguments.length <= 4 || arguments[4] === undefined ? null : arguments[4]; + + _classCallCheck(this, Step); + + if (!(type in steps)) throw new Error("Unknown step type: " + type); + // :: string + // The type of the step. + this.type = type; + // :: ?Pos + // The start of the step's range, if any. Which of the three + // optional positions associated with a step a given step type + // uses differs. The way each of these positions is mapped when + // the step is mapped over a [position mapping](#PosMap) depends + // on its role. + this.from = from; + // :: ?Pos + // The end of the step's range. + this.to = to; + // :: ?Pos + // The base position for this step. + this.pos = pos; + // :: ?any + // Extra step-type-specific information associated with the step. + this.param = param; + } + + // ;; #toc=false Objects of this type are returned as the result of + // applying a transform step to a document. + + // :: (Node) → ?StepResult + // Applies this step to the given document, returning a result + // containing the transformed document (the input document is not + // changed) and a `PosMap`. If the step could not meaningfully be + // applied to the given document, this returns `null`. + + _createClass(Step, [{ + key: "apply", + value: function apply(doc) { + return steps[this.type].apply(doc, this); + } + + // :: (Node, PosMap) → Step + // Create an inverted version of this step. Needs the document as it + // was before the step, as well as `PosMap` created by applying the + // step to that document, as input. + }, { + key: "invert", + value: function invert(oldDoc, map) { + return steps[this.type].invert(this, oldDoc, map); + } + + // :: (Mappable) → ?Step + // Map this step through a mappable thing, returning either a + // version of that step with its positions adjusted, or `null` if + // the step was entirely deleted by the mapping. + }, { + key: "map", + value: function map(remapping) { + var allDeleted = true; + var from = null, + to = null, + pos = null; + + if (this.from) { + var result = remapping.map(this.from, 1); + from = result.pos; + if (!result.deleted) allDeleted = false; + } + if (this.to) { + if (this.to.cmp(this.from) == 0) { + to = from; + } else { + var result = remapping.map(this.to, -1); + to = result.pos.max(from); + if (!result.deleted) allDeleted = false; + } + } + if (this.pos) { + if (from && this.pos.cmp(this.from) == 0) { + pos = from; + } else if (to && this.pos.cmp(this.to) == 0) { + pos = to; + } else { + var result = remapping.map(this.pos, 1); + pos = result.pos; + if (!result.deleted) allDeleted = false; + } + } + return allDeleted ? null : new Step(this.type, from, to, pos, this.param); + } + + // :: () → Object + // Create a JSON-serializeable representation of this step. + }, { + key: "toJSON", + value: function toJSON() { + var impl = steps[this.type]; + return { + type: this.type, + from: this.from, + to: this.to, + pos: this.pos, + param: impl.paramToJSON ? impl.paramToJSON(this.param) : this.param + }; + } + + // :: (Schema, Object) → Step + // Deserialize a step from its JSON representation. + }], [{ + key: "fromJSON", + value: function fromJSON(schema, json) { + var impl = steps[json.type]; + return new Step(json.type, json.from && _model.Pos.fromJSON(json.from), json.to && _model.Pos.fromJSON(json.to), json.pos && _model.Pos.fromJSON(json.pos), impl.paramFromJSON ? impl.paramFromJSON(schema, json.param) : json.param); + } + + // :: (string, Object) + // Define a new type of step. Implementation should have the + // following properties: + // + // **`apply`**`(doc: Node, step: Step) → ?StepResult + // : Applies the step to a document. + // **`invert`**`(step: Step, oldDoc: Node, map: PosMap) → Step + // : Create an inverted version of the step. + // **`paramToJSON`**`(param: ?any) → ?Object + // : Serialize this step type's parameter to JSON. + // **`paramFromJSON`**`(schema: Schema, json: ?Object) → ?any + // : Deserialize this step type's parameter from JSON. + }, { + key: "define", + value: function define(type, implementation) { + steps[type] = implementation; + } + }]); + + return Step; +})(); + +exports.Step = Step; + +var StepResult = function StepResult(doc) { + var map = arguments.length <= 1 || arguments[1] === undefined ? _map.nullMap : arguments[1]; + + _classCallCheck(this, StepResult); + + // :: Node The transformed document. + this.doc = doc; + // :: PosMap + // The position map that describes the correspondence between the + // old and the new document. + this.map = map; +}; + +exports.StepResult = StepResult; + +var steps = Object.create(null); + +},{"../model":45,"./map":59}],64:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = (function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); + } + }return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; + }; +})(); + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +var _step2 = require("./step"); + +var _map = require("./map"); + +// ;; A change to a document often consists of a series of +// [steps](#Step). This class provides a convenience abstraction to +// build up and track such an array of steps. A `Transform` object +// implements `Mappable`. +// +// The high-level transforming methods return the `Transform` object +// itself, so that they can be chained. + +var Transform = (function () { + // :: (Node) + // Create a transformation that starts with the given document. + + function Transform(doc) { + _classCallCheck(this, Transform); + + // :: [Step] + // The accumulated steps. + this.steps = []; + // :: [Node] + // The individual document versions. Always has a length one more + // than `steps`, since it also includes the original starting + // document. + this.docs = [doc]; + // :: [PosMap] + // The position maps produced by the steps. Has the same length as + // `steps`. + this.maps = []; + } + + // :: Node + // The current version of the transformed document. + + _createClass(Transform, [{ + key: "step", + + // :: (Step) → ?StepResult + // Add a step to this transformation. If the step can be + // [applied](#Step.apply) to the current document, the result of + // applying it is returned, and an element is added to the + // [`steps`](#Transform.steps), [`docs`](#Transform.docs), and + // [`maps`](#Transform.maps) arrays. + value: function step(_step, from, to, pos, param) { + if (typeof _step == "string") _step = new _step2.Step(_step, from, to, pos, param); + var result = _step.apply(this.doc); + if (result) { + this.steps.push(_step); + this.maps.push(result.map); + this.docs.push(result.doc); + } + return result; + } + + // :: (Pos, ?number) → MapResult + // Map a position through the whole transformation (all the position + // maps in [`maps`](#Transform.maps)), and return the result. + }, { + key: "map", + value: function map(pos, bias) { + var deleted = false; + for (var i = 0; i < this.maps.length; i++) { + var result = this.maps[i].map(pos, bias); + pos = result.pos; + if (result.deleted) deleted = true; + } + return new _map.MapResult(pos, deleted); + } + }, { + key: "doc", + get: function get() { + return this.docs[this.docs.length - 1]; + } + + // :: Node + // The original input document. + }, { + key: "before", + get: function get() { + return this.docs[0]; + } + }]); + + return Transform; +})(); + +exports.Transform = Transform; + +},{"./map":59,"./step":63}],65:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.copyStructure = copyStructure; +exports.copyInline = copyInline; +exports.isFlatRange = isFlatRange; +exports.replaceHasEffect = replaceHasEffect; +exports.samePathDepth = samePathDepth; + +var _model = require("../model"); + +function copyStructure(node, from, to, f) { + var depth = arguments.length <= 4 || arguments[4] === undefined ? 0 : arguments[4]; + + if (node.isTextblock) { + return f(node, from ? from.offset : 0, to ? to.offset : node.size); + } else { + if (!node.size) return node; + var start = from ? from.path[depth] : 0; + var end = to ? to.path[depth] + 1 : node.size; + var content = node.content.toArray(0, start); + for (var iter = node.iter(start, end), child = undefined; child = iter.next().value;) { + var passFrom = iter.offset - child.width == start ? from : null; + var passTo = iter.offset == end ? to : null; + content.push(copyStructure(child, passFrom, passTo, f, depth + 1)); + } + return node.copy(_model.Fragment.fromArray(content.concat(node.content.toArray(end)))); + } +} + +function copyInline(node, from, to, f) { + return node.splice(from, to, node.content.slice(from, to).map(f)); +} + +function isFlatRange(from, to) { + if (from.path.length != to.path.length) return false; + for (var i = 0; i < from.path.length; i++) { + if (from.path[i] != to.path[i]) return false; + }return from.offset <= to.offset; +} + +function canBeJoined(node, offset, depth) { + if (!depth || offset == 0 || offset == node.size) return false; + var left = node.child(offset - 1), + right = node.child(offset); + return left.sameMarkup(right); +} + +function replaceHasEffect(doc, from, to) { + for (var depth = 0, node = doc;; depth++) { + var fromEnd = depth == from.depth, + toEnd = depth == to.depth; + if (fromEnd || toEnd || from.path[depth] != to.path[depth]) { + var gapStart = undefined, + gapEnd = undefined; + if (fromEnd) { + gapStart = from.offset; + } else { + gapStart = from.path[depth] + 1; + for (var i = depth + 1, n = node.child(gapStart - 1); i <= from.path.length; i++) { + if (i == from.path.length) { + if (from.offset < n.size) return true; + } else { + if (from.path[i] + 1 < n.size) return true; + n = n.child(from.path[i]); + } + } + } + if (toEnd) { + gapEnd = to.offset; + } else { + gapEnd = to.path[depth]; + for (var i = depth + 1; i <= to.path.length; i++) { + if ((i == to.path.length ? to.offset : to.path[i]) > 0) return true; + } + } + if (gapStart != gapEnd) return true; + return canBeJoined(node, gapStart, Math.min(from.depth, to.depth) - depth); + } else { + node = node.child(from.path[depth]); + } + } +} + +function samePathDepth(a, b) { + for (var i = 0;; i++) { + if (i == a.path.length || i == b.path.length || a.path[i] != b.path[i]) return i; + } +} + +},{"../model":45}],66:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = (function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); + } + }return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; + }; +})(); + +var _get = function get(_x, _x2, _x3) { + var _again = true;_function: while (_again) { + var object = _x, + property = _x2, + receiver = _x3;_again = false;if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) { + var parent = Object.getPrototypeOf(object);if (parent === null) { + return undefined; + } else { + _x = parent;_x2 = property;_x3 = receiver;_again = true;desc = parent = undefined;continue _function; + } + } else if ("value" in desc) { + return desc.value; + } else { + var getter = desc.get;if (getter === undefined) { + return undefined; + }return getter.call(receiver); + } + } +}; + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; +} + +var ProseMirrorError = (function (_Error) { + _inherits(ProseMirrorError, _Error); + + function ProseMirrorError(message) { + _classCallCheck(this, ProseMirrorError); + + _get(Object.getPrototypeOf(ProseMirrorError.prototype), "constructor", this).call(this, message); + if (this.message != message) { + this.message = message; + if (Error.captureStackTrace) Error.captureStackTrace(this, this.name);else this.stack = new Error(message).stack; + } + } + + _createClass(ProseMirrorError, [{ + key: "name", + get: function get() { + return this.constructor.name || functionName(this.constructor) || "ProseMirrorError"; + } + }], [{ + key: "raise", + value: function raise(message) { + throw new this(message); + } + }]); + + return ProseMirrorError; +})(Error); + +exports.ProseMirrorError = ProseMirrorError; + +function functionName(f) { + var match = /^function (\w+)/.exec(f.toString()); + return match && match[1]; +} + +},{}],67:[function(require,module,exports){ +// ;; #path=EventMixin #kind=interface +// A set of methods for objects that emit events. Added by calling +// `eventMixin` on a constructor. + +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.eventMixin = eventMixin; +var methods = { + // :: (type: string, handler: (...args: [any])) #path=EventMixin.on + // Register an event handler for the given event type. + on: function on(type, f) { + var map = this._handlers || (this._handlers = {}); + var arr = map[type] || (map[type] = []); + arr.push(f); + }, + + // :: (type: string, handler: (...args: [any])) #path=EventMixin.off + // Unregister an event handler for the given event type. + off: function off(type, f) { + var arr = this._handlers && this._handlers[type]; + if (arr) for (var i = 0; i < arr.length; ++i) { + if (arr[i] == f) { + arr.splice(i, 1);break; + } + } + }, + + // :: (type: string, ...args: [any]) #path=EventMixin.signal + // Signal an event of the given type, passing any number of + // arguments. Will call the handlers for the event, passing them the + // arguments. + signal: function signal(type) { + var arr = this._handlers && this._handlers[type]; + + for (var _len = arguments.length, values = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + values[_key - 1] = arguments[_key]; + } + + if (arr) for (var i = 0; i < arr.length; ++i) { + arr[i].apply(arr, values); + } + }, + + // :: (type: string, ...args: [any]) #path=EventMixin.signalHandleable + // Signal a handleable event of the given type. All handlers for the + // event will be called with the given arguments, until one of them + // returns something that is not the value `false`. When that + // happens, the return value of that handler is returned. If that + // does not happen, `false` is returned. + signalHandleable: function signalHandleable(type) { + var arr = this._handlers && this._handlers[type]; + if (arr) { + for (var _len2 = arguments.length, values = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + values[_key2 - 1] = arguments[_key2]; + } + + for (var i = 0; i < arr.length; ++i) { + var result = arr[i].apply(arr, values); + if (result !== false) return result; + } + }return false; + }, + + // :: (type: string) → bool #path=EventMixin.hasHandler + // Query whether there are any handlers for this event type. + hasHandler: function hasHandler(type) { + var arr = this._handlers && this._handlers[type]; + return arr && arr.length > 0; + } +}; + +// :: (()) +// Add the methods in the `EventMixin` interface to the prototype +// object of the given constructor. + +function eventMixin(ctor) { + var proto = ctor.prototype; + for (var prop in methods) if (methods.hasOwnProperty(prop)) proto[prop] = methods[prop]; +} + +},{}],68:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = (function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); + } + }return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; + }; +})(); + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +var Map = window.Map || (function () { + function _class() { + _classCallCheck(this, _class); + + this.content = []; + } + + _createClass(_class, [{ + key: "set", + value: function set(key, value) { + var found = this.find(key); + if (found > -1) this.content[found + 1] = value;else this.content.push(key, value); + } + }, { + key: "get", + value: function get(key) { + var found = this.find(key); + return found == -1 ? undefined : this.content[found + 1]; + } + }, { + key: "has", + value: function has(key) { + return this.find(key) > -1; + } + }, { + key: "find", + value: function find(key) { + for (var i = 0; i < this.content.length; i += 2) { + if (this.content[i] === key) return i; + } + } + }, { + key: "clear", + value: function clear() { + this.content.length = 0; + } + }, { + key: "size", + get: function get() { + return this.content.length / 2; + } + }]); + + return _class; +})(); +exports.Map = Map; + +},{}],69:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = sortedInsert; + +function sortedInsert(array, elt, compare) { + var i = 0; + for (; i < array.length; i++) if (compare(array[i], elt) > 0) break; + array.splice(i, 0, elt); +} + +module.exports = exports["default"]; + +},{}]},{},[1]) +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy93YXRjaGlmeS9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnJvd3Nlci1wYWNrL19wcmVsdWRlLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3Itd2lkZ2V0cy9zcmMvbWFpbi5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yLXdpZGdldHMvc3JjL3V0aWxzL2luZGV4LmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3Itd2lkZ2V0cy9zcmMvd2lkZ2V0cy9ibG9ja21hdGguanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci13aWRnZXRzL3NyYy93aWRnZXRzL2NoZWNrYm94LmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3Itd2lkZ2V0cy9zcmMvd2lkZ2V0cy9jaGVja2xpc3QuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci13aWRnZXRzL3NyYy93aWRnZXRzL2lmcmFtZS5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yLXdpZGdldHMvc3JjL3dpZGdldHMvaW1hZ2UuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci13aWRnZXRzL3NyYy93aWRnZXRzL2luZGV4LmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3Itd2lkZ2V0cy9zcmMvd2lkZ2V0cy9pbmxpbmVtYXRoLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3Itd2lkZ2V0cy9zcmMvd2lkZ2V0cy9pbnB1dC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yLXdpZGdldHMvc3JjL3dpZGdldHMvbXVsdGlwbGVjaG9pY2UuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci13aWRnZXRzL3NyYy93aWRnZXRzL3JhZGlvYnV0dG9uLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3Itd2lkZ2V0cy9zcmMvd2lkZ2V0cy9zY2FsZS5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yLXdpZGdldHMvc3JjL3dpZGdldHMvc2VsZWN0LmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3Itd2lkZ2V0cy9zcmMvd2lkZ2V0cy9zcHJlYWRzaGVldC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yLXdpZGdldHMvc3JjL3dpZGdldHMvdGV4dGFyZWEuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci13aWRnZXRzL3NyYy93aWRnZXRzL3RleHRmaWVsZC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yLXdpZGdldHMvc3JjL3dpZGdldHMvd2lkZ2V0LmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9kb20vaW5kZXguanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L2VkaXQvY2FwdHVyZWtleXMuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L2VkaXQvY2hhci5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZWRpdC9jb21tYW5kcy5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZWRpdC9jc3MuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L2VkaXQvZG9tY2hhbmdlLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9lZGl0L2RyYXcuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L2VkaXQvaGlzdG9yeS5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZWRpdC9pbmRleC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZWRpdC9pbnB1dC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZWRpdC9rZXlzLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9lZGl0L21haW4uanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L2VkaXQvb3B0aW9ucy5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZWRpdC9yYW5nZS5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZWRpdC9zZWxlY3Rpb24uanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L2lucHV0cnVsZXMvYXV0b2lucHV0LmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9pbnB1dHJ1bGVzL2lucHV0cnVsZXMuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L21lbnUvaWNvbnMuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L21lbnUvbWVudS5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvbWVudS9tZW51YmFyLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tZW51L3Rvb2x0aXAuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L21lbnUvdG9vbHRpcG1lbnUuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L21lbnUvdXBkYXRlLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tb2RlbC9kZWZhdWx0c2NoZW1hLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tb2RlbC9kaWZmLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tb2RlbC9mcmFnbWVudC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvbW9kZWwvaW5kZXguanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L21vZGVsL21hcmsuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L21vZGVsL25vZGUuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L21vZGVsL3Bvcy5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvbW9kZWwvc2NoZW1hLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9wYXJzZS9kb20uanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L3BhcnNlL2luZGV4LmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9wYXJzZS90ZXh0LmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9zZXJpYWxpemUvZG9tLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9zZXJpYWxpemUvaW5kZXguanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L3NlcmlhbGl6ZS90ZXh0LmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC90cmFuc2Zvcm0vYW5jZXN0b3IuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L3RyYW5zZm9ybS9pbmRleC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvdHJhbnNmb3JtL2pvaW4uanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L3RyYW5zZm9ybS9tYXAuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L3RyYW5zZm9ybS9tYXJrLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC90cmFuc2Zvcm0vcmVwbGFjZS5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvdHJhbnNmb3JtL3NwbGl0LmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC90cmFuc2Zvcm0vc3RlcC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvdHJhbnNmb3JtL3RyYW5zZm9ybS5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvdHJhbnNmb3JtL3RyZWUuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L3V0aWwvZXJyb3IuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L3V0aWwvZXZlbnQuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L3V0aWwvbWFwLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC91dGlsL3NvcnRlZGluc2VydC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O21DQ0EwQiw2QkFBNkI7O2tDQUMvQiw0QkFBNEI7O1FBQzdDLHlDQUF5Qzs7UUFDekMscUNBQXFDOztRQUNyQyw2Q0FBNkM7O29DQUljLDhCQUE4Qjs7dUJBSTdCLFdBQVc7O0FBRzlFLElBQU0sV0FBVyxHQUFHLHFDQUFlO0FBQ2xDLElBQUcsMkJBQUs7QUFDUixXQUFVLGtDQUFZO0FBQ3RCLGFBQVksbUNBQWE7QUFDekIsWUFBVyxrQ0FBWTtBQUN2QixVQUFTLGdDQUFVO0FBQ25CLGdCQUFlLHNDQUFnQjs7QUFFL0IsVUFBUyxpQ0FBVztBQUNwQixRQUFPLCtCQUFTOztBQUVoQixLQUFJLDRCQUFNO0FBQ1Ys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QUUsUUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDLEFBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEFBQUMsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLEFBQUMsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDLEFBQUMsSUFBSTtBQUFFLFdBQUssSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUEsQ0FBRSxJQUFJLENBQUEsQUFBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUU7QUFBRSxZQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxBQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLE1BQU07T0FBRTtLQUFFLENBQUMsT0FBTyxHQUFHLEVBQUU7QUFBRSxRQUFFLEdBQUcsSUFBSSxDQUFDLEFBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztLQUFFLFNBQVM7QUFBRSxVQUFJO0FBQUUsWUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7T0FBRSxTQUFTO0FBQUUsWUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUM7T0FBRTtLQUFFLEFBQUMsT0FBTyxJQUFJLENBQUM7R0FBRSxBQUFDLE9BQU8sVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQUUsUUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQUUsYUFBTyxHQUFHLENBQUM7S0FBRSxNQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFBRSxhQUFPLGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FBRSxNQUFNO0FBQUUsWUFBTSxJQUFJLFNB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RUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxLQUFLO0FBQ3JGLElBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxLQUFLO0FBQzVGLElBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxRQUFRO0FBQ3hGLElBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSztBQUMvRCxLQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLFFBQVE7QUFDL0QsS0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUk7QUFDbkcsS0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFF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Qzs7QUFFbkMsUUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQSxDQUFFLElBQUksQ0FBQyxDQUFDOzs7QUFHdkQsUUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQzFCLFFBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7QUFHaEcsUUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFBLENBQUUsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLENBQUMsQ0FBQzs7O0FBR3hFLFFBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQSxDQUFFLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDOUUsUUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDOztBQUVoQyxRQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDOztBQUU3SCxRQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQSxDQUFFLElBQUksQ0FBQyxNQUFN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QUMsTUFBTSxDQUFDLENBQUMsQUFBQyxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7QUFBRSxlQUFPLFNBQVMsQ0FBQztPQUFFLE1BQU07QUFBRSxVQUFFLEdBQUcsTUFBTSxDQUFDLEFBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxBQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsQUFBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEFBQUMsSUFBSSxHQUFHLE1BQU0sR0FBRyxTQUFTLENBQUMsQUFBQyxTQUFTLFNBQVMsQ0FBQztPQUFFO0tBQUUsTUFBTSxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7QUFBRSxhQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7S0FBRSxNQUFNO0FBQUUsVUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxBQUFDLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtBQUFFLGVBQU8sU0FBUyxDQUFDO09BQUUsQUFBQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7S0FBRTtHQUFFO0NBQUUsQ0FBQzs7QUFFbHBCLElBQUksWUFBWSxHQUFHLENBQUMsWUFBWTtBQUFFLFdBQVMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRTtBQUFFLFNBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQUUsVUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEFBQUMsVUFBVSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxBQUFDLFVBQVUsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEFBQUMsSUFBSSxPQUFPLElBQUksVUFBVSxFQUFFLFVBQVUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEFBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztLQUFFO0dB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QSxFQUFHLENBQUM7O0FBRXRqQixJQUFJLElBQUksR0FBRyxTQUFTLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUFFLE1BQUksTUFBTSxHQUFHLElBQUksQ0FBQyxBQUFDLFNBQVMsRUFBRSxPQUFPLE1BQU0sRUFBRTtBQUFFLFFBQUksTUFBTSxHQUFHLEVBQUU7UUFBRSxRQUFRLEdBQUcsR0FBRztRQUFFLFFBQVEsR0FBRyxHQUFHLENBQUMsQUFBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLEFBQUMsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFLE1BQU0sR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLEFBQUMsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxBQUFDLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTtBQUFFLFVBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQUFBQyxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7QUFBRSxlQUFPLFNBQVMsQ0FBQztPQUFFLE1BQU07QUFBRSxVQUFFLEdBQUcsTUFBTSxDQUFDLEFBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxBQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsQUFBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEFBQUMsSUFBSSxHQUFHLE1BQU0sR0FBRyxTQUFTLENBQUMsQUFBQyxTQUFTLFNBQVMsQ0FBQztPQUFFO0tBQUUsTUFBTSxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7QUFBRSxhQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7S0FBRSxNQUFNO0FBQUUsVUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxBQUFDLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtBQUFFLGVBQU8sU0FBUyxDQUFDO09BQUUsQUFBQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7S0FBRTtHQUFFO0NBQUUsQ0FB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QUFJLEtBQUssQ0FBQyxBQUFDLFVBQVUsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEFBQUMsSUFBSSxPQUFPLElBQUksVUFBVSxFQUFFLFVBQVUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEFBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztLQUFFO0dBQUUsQUFBQyxPQUFPLFVBQVUsV0FBVyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUU7QUFBRSxRQUFJLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDLEFBQUMsSUFBSSxXQUFXLEVBQUUsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDLEFBQUMsT0FBTyxXQUFXLENBQUM7R0FBRSxDQUFDO0NBQUUsQ0FBQSxFQUFHLENBQUM7O0FBRXRqQixTQUFTLFNBQVMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFO0FBQUUsTUFBSSxPQUFPLFVBQVUsS0FBSyxVQUFVLElBQUksVUFBVSxLQUFLLElBQUksRUFBRTtBQUFFLFVBQU0sSUFBSSxTQUFTLENBQUMsMERBQTBELEdBQUcsT0FBTyxVQUFVLENBQUMsQ0FBQztHQUFFLEFBQUMsUUFBUSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxVQUFVLENBQUMsU0FBUyxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxBQUFDLElBQUksVUFBVSxFQUFFLE1BQU0sQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLEdBQUcsUUFBUSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUM7Q0FBRTs7QUFFOWUsU0FBUyxlQUFlLENBQUMs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SSxJQUFJLEdBQUcsRUFBRSxDQUFDLEFBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEFBQUMsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLEFBQUMsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDLEFBQUMsSUFBSTtBQUFFLFdBQUssSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUEsQ0FBRSxJQUFJLENBQUEsQUFBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUU7QUFBRSxZQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxBQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLE1BQU07T0FBRTtLQUFFLENBQUMsT0FBTyxHQUFHLEVBQUU7QUFBRSxRQUFFLEdBQUcsSUFBSSxDQUFDLEFBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztLQUFFLFNBQVM7QUFBRSxVQUFJO0FBQUUsWUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7T0FBRSxTQUFTO0FBQUUsWUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUM7T0FBRTtLQUFFLEFBQUMsT0FBTyxJQUFJLENBQUM7R0FBRSxBQUFDLE9BQU8sVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQUUsUUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQUUsYUFBTyxHQUFHLENBQUM7S0FBRSxNQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFBRSxhQUFPLGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FBRSxNQUFNO0FBQUUsWUFBTSxJQUFJLFNBQVMsQ0FB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QUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUU7QUFDekcsZUFBTyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7T0FDckM7O0FBRUQsV0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDdkMsY0FBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7T0FDdEcsT0FBTyxNQUFNLENBQUM7S0FDaEI7R0FDRixFQUFFO0FBQ0QsT0FBRyxFQUFFLFlBQVk7QUFDakIsU0FBSyxFQUFFLFNBQVMsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUU7QUFDdkMsVUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzdDLFdBQUssSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7QUFDaEMsWUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakMsWUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO09BQzdFO0FBQ0QsVUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFN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LE1BQU0sQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztHQUNyRTtBQUNELFFBQU0sRUFBRSxTQUFTLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRTtBQUN6QyxRQUFJLEtBQUssR0FBRyxFQUFFO1FBQ1YsS0FBSyxHQUFHLEVBQUUsQ0FBQztBQUNmLFFBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQy9ELFVBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5RSxXQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM1QixXQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUM5QjtBQUNELFFBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUNyQyxRQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQztBQUN4RSxXQUFPLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxD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LE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFO0FBQzdDLFlBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMzQixjQUFNO09BQ1A7QUFDRCxVQUFJLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLE1BQU07QUFDMUIsU0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQzVCO0FBQ0QsU0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLEVBQUU7QUFDdEMsVUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtBQUNsQixZQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDM0IsWUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUs7WUFDcEMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1RCxlQUFPLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUQsYUFBSyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFN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QyxNQUFNLEdBQUcsQ0FBQztRQUN2QixNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM3QixRQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxNQUFNLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ3hGLFNBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDN0IsVUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sSUFBSSxDQUFDO0tBQ3JDLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3ZDLFFBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQzdCLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0FBQzFCLFFBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxJQUFJLENBQUM7QUFDcEMsUUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDMUMsUUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDOztBQUU1RyxRQUFJLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsSUFBSSxF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QyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakosU0FBTyxJQUFJLENBQUM7Q0FDYixDQUFDOzs7QUNsRkYsWUFBWSxDQUFDOztBQUViLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRTtBQUMzQyxPQUFLLEVBQUUsSUFBSTtDQUNaLENBQUMsQ0FBQzs7QUFFSCxJQUFJLFlBQVksR0FBRyxDQUFDLFlBQVk7QUFBRSxXQUFTLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUU7QUFBRSxTQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUFFLFVBQUksVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxBQUFDLFVBQVUsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsQUFBQyxVQUFVLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxBQUFDLElBQUksT0FBTyxJQUFJLFVBQVUsRUFBRSxVQUFVLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxBQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7S0FBRTtHQUFFLEFBQUMsT0FBTyxVQUFVLFdBQVcsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFO0FBQUUsUUFBSSxVQUFV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RyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzNELFVBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3hCLE9BQU8sSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7R0FDMUMsTUFBTTtBQUNMLFdBQU8sSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztHQUNyRDtDQUNGOztBQUVELFNBQVMsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRTtBQUN4QyxNQUFJLElBQUksS0FBSyxTQUFTLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQzs7QUFFakMsT0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzVDLFFBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0FBQzdDLFFBQUksSUFBSSxHQUFHLFNBQVM7UUFDaEIsS0FBSyxHQUFHLFNBQVMsQ0FBQztBQUN0QixRQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBLElBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBLElBQUssQ0FBQyxFQUFFO0FBQ3ZFLFVBQUksS0FBSyxHQUFHLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7QUFDOUMsYUFBTyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxJQUFJLEtBQUssQ0FBQSxBQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7S0FDOUg7R0FDRjs7QUFFRCxPQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDekMsUUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6QixRQUFJLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO0FBQzVDLFFBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQzNHLFVBQUksSUFBSSxHQUFHLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7QUFDM0MsVUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztBQUN4QixVQUFJLEdBQUcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxFQUFFO0FBQ3JCLFlBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFL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QUFFLEVBQUUsVUFBVSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7QUFDdkUsUUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztBQUN4QixRQUFJLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDOztBQUV0QixRQUFJLFNBQVMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQzlELFVBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDcEIsVUFBSSxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN4QyxjQUFRLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNsRixhQUFPO0tBQ1I7QUFDRCxTQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNyQyxVQUFJLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsVUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQ3RELFlBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDcEIsY0FBTSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztPQUMv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QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUUsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2xHLElBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQzFDLE1BQUksS0FBSyxHQUFHLEtBQUs7TUFDYixHQUFHLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEUsTUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNqRCxNQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDdkQsTUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3hELFNBQU8sTUFBTSxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDNUUsVUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ2YsWUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO0dBQ2xCO0FBQ0QsTUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLEdBQUcs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QyxNQUFNLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLFVBQVUsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxNQUFNLEVBQUUsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDalMsV0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0dBQ3hDO0FBQ0QsUUFBTSxFQUFFLFNBQVMsTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFO0FBQzFDLFdBQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ2hFO0FBQ0QsYUFBVyxFQUFFLFNBQVMsV0FBVyxDQUFDLEtBQUssRUFBRTtBQUN2QyxXQUFPLEtBQUssSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0dBQy9EO0FBQ0QsZUFBYSxFQUFFLFNBQVMsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUU7QUFDbEQsV0FBTyxJ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LFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUMsQUFBQyxPQUFPLFdBQVcsQ0FBQztHQUFFLENBQUM7Q0FBRSxDQUFBLEVBQUcsQ0FBQzs7QUFFdGpCLElBQUksSUFBSSxHQUFHLFNBQVMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQUUsTUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEFBQUMsU0FBUyxFQUFFLE9BQU8sTUFBTSxFQUFFO0FBQUUsUUFBSSxNQUFNLEdBQUcsRUFBRTtRQUFFLFFBQVEsR0FBRyxHQUFHO1FBQUUsUUFBUSxHQUFHLEdBQUcsQ0FBQyxBQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsQUFBQyxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUUsTUFBTSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQUFBQyxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDLEFBQUMsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO0FBQUUsVUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxBQUFDLElBQUksTUFBTSxLQUFLLElBQUksRUFBRTtBQUFFLGVBQU8sU0FBUyxDQUFDO09BQUUsTUFBTTtBQUFFLFVBQUUsR0FBRyxNQUFNLENBQUMsQUFBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLEFBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxBQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsQUFBQyxJQUFJLEdBQUcsTUFBTSxHQUFHLFNBQVMsQ0FBQyxBQUFDLFNBQVMsU0FBUyxDQUFDO09BQUU7S0FBRSxNQUFNLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtBQUFFLGFBQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztLQUFFLE1BQU07QUFBRSxVQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEFBQUMsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO0FB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QUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7S0FDaEM7R0FDRixDQUFDLENBQUMsQ0FBQzs7QUFFSixTQUFPLE1BQU0sQ0FBQztDQUNmLENBQUEsRUFBRyxDQUFDO0FBQ0wsT0FBTyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7OztBQ3ZEbEIsWUFBWSxDQUFDOztBQUViLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRTtBQUMzQyxPQUFLLEVBQUUsSUFBSTtDQUNaLENBQUMsQ0FBQztBQUNILE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxZQUFZLENBQUM7O0FBRWxDLFNBQVMsWUFBWSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFO0FBQ3pDLE1BQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNWLFNBQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNO0FBQ3BFLE9BQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUN6Qjs7QUFFRCxNQUFNLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJpbXBvcnQge1Byb3NlTWlycm9yfSBmcm9tIFwiLi4vLi4vcHJvc2VtaXJyb3IvZGlzdC9lZGl0XCJcclxuaW1wb3J0IHtpbnNlcnRDU1N9IGZyb20gXCIuLi8uLi9wcm9zZW1pcnJvci9kaXN0L2RvbVwiXHJcbmltcG9ydCBcIi4uLy4uL3Byb3NlbWlycm9yL2Rpc3QvbWVudS90b29sdGlwbWVudVwiXHJcbmltcG9ydCBcIi4uLy4uL3Byb3NlbWlycm9yL2Rpc3QvbWVudS9tZW51YmFyXCJcclxuaW1wb3J0IFwiLi4vLi4vcHJvc2VtaXJyb3IvZGlzdC9pbnB1dHJ1bGVzL2F1dG9pbnB1dFwiXHJcbiAgXHJcbmltcG9ydCB7RG9jLCBUZXh0YmxvY2ssIEJsb2NrUXVvdGUsIE9yZGVyZWRMaXN0LCBCdWxsZXRMaXN0LCBMaXN0SXRlbSwgSG9yaXpvbnRhbFJ1bGUsXHJcblx0UGFyYWdyYXBoLCBIZWFkaW5nLCBUZXh0LCBIYXJkQnJlYWssXHJcblx0RW1NYXJrLCBTdHJvbmdNYXJrLCBMaW5rTWFyaywgQ29kZU1hcmssIFNjaGVtYSwgU2NoZW1hU3BlY30gZnJvbSBcIi4uLy4uL3Byb3NlbWlycm9yL2Rpc3QvbW9kZWxcIlxyXG5cclxuaW1wb3J0IHtJbnB1dCwgVGV4dEZpZWxkLCBUZXh0QXJlYSwgQ2hlY2tCb3gsIFJhZGlvQnV0dG9uLCBTZWxlY3QsIFxyXG5cdElGcmFtZSwgSW5saW5lTWF0aCwgQmxvY2tNYXRoLCBJbWFnZSwgU3ByZWFkU2hlZXQsXHJcblx0Q2hvaWNlLCBNdWx0aXBsZUNob2ljZSwgU2NhbGUsIENoZWNrSXRlbSwgQ2hlY2tMaXN0LCBXaWRnZXR9IGZyb20gXCIuL3dpZGdldHNcIlxyXG5cclxuXHJcbmNvbnN0IHdpZGdldHNTcGVjID0gbmV3IFNjaGVtYVNwZWMoe1xyXG5cdGRvYzogRG9jLFxyXG5cdGJsb2NrcXVvdGU6IEJsb2NrUXVvdGUsXHJcblx0b3JkZXJlZF9saXN0OiBPcmRlcmVkTGlzdCxcclxuXHRidWxsZXRfbGlzdDogQnVsbGV0TGlzdCxcclxuXHRsaXN0X2l0ZW06IExpc3RJdGVtLFxyXG5cdGhvcml6b250YWxfcnVsZTogSG9yaXpvbnRhbFJ1bGUsXHJcblxyXG5cdHBhcmFncmFwaDogUGFyYWdyYXBoLFxyXG5cdGhlYWRpbmc6IEhlYWRpbmcsXHJcblxyXG5cdHRleHQ6IFRleHQsXHJcblx0aW1hZ2U6IEltYWdlLFxyXG5cdGhhcmRfYnJlYWs6IEhhcmRCcmVhayxcclxuXHRcclxuXHRpbnB1dDogSW5wdXQsXHJcblx0dGV4dGZpZWxkOiBUZXh0RmllbGQsXHJcblx0dGV4dGFyZWE6IFRleHRBcmVhLFxyXG5cdGNoZWNrYm94OiBDaGVja0JveCxcclxuXHRyYWRpb2J1dHRvbjogUmFkaW9CdXR0b24sXHJcblx0c2VsZWN0OiBTZWxlY3QsXHJcblx0aW5saW5lbWF0aDogSW5saW5lTWF0aCxcclxuXHRibG9ja21hdGg6IEJsb2NrTWF0aCxcclxuXHRpZnJhbWU6IElGcmFtZSxcclxuXHRjaG9pY2U6IENob2ljZSxcclxuXHRtdWx0aXBsZWNob2ljZTogTXVsdGlwbGVDaG9pY2UsXHJcblx0c2NhbGU6IFNjYWxlLFxyXG5cdGNoZWNraXRlbTogQ2hlY2tJdGVtLFxyXG5cdGNoZWNrbGlzdDogQ2hlY2tMaXN0LFxyXG5cdHNwcmVhZHNoZWV0OiBTcHJlYWRTaGVldCxcclxuXHR3aWRnZXQ6IFdpZGdldFxyXG59LCB7XHJcblx0ZW06IEVtTWFyayxcclxuXHRzdHJvbmc6IFN0cm9uZ01hcmssXHJcblx0bGluazogTGlua01hcmssXHJcblx0Y29kZTogQ29kZU1hcmtcclxufSlcclxuXHJcbmNvbnN0IHdpZGdldFNjaGVtYSA9IG5ldyBTY2hlbWEod2lkZ2V0c1NwZWMpXHJcblxyXG5sZXQgcG0gPSB3aW5kb3cucG0gPSBuZXcgUHJvc2VNaXJyb3Ioe1xyXG4gIHBsYWNlOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2VkaXRvclwiKSxcclxuICBtZW51QmFyOiB0cnVlLFxyXG4gIGRvYzogZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNjb250ZW50XCIpLmlubmVySFRNTCxcclxuICBkb2NGb3JtYXQ6IFwiaHRtbFwiLFxyXG4gIHNjaGVtYTogd2lkZ2V0U2NoZW1hLFxyXG4gIGF1dG9JbnB1dDogdHJ1ZVxyXG59KVxyXG5cclxuaW5zZXJ0Q1NTKGBcclxuXHRcdFxyXG5kaXYuUHJvc2VNaXJyb3Itc2VsZWN0LW1lbnUge1xyXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICBiYWNrZ3JvdW5kOiAjRUVFO1xyXG4gIGNvbG9yOiBibGFjaztcclxuICBwYWRkaW5nOiAycHggMnB4O1xyXG4gIHotaW5kZXg6IDE1O1xyXG59XHJcblxyXG5kaXYuUHJvc2VNaXJyb3Itc2VsZWN0LW1lbnUgZGl2IHtcclxuICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgcGFkZGluZzogMCAxZW0gMCAycHg7XHJcbn1cclxuXHJcbmRpdi5Qcm9zZU1pcnJvci1zZWxlY3QtbWVudSBkaXY6aG92ZXIge1xyXG4gIGJhY2tncm91bmQ6IHdoaXRlO1xyXG59XHJcblxyXG5kaXYuUHJvc2VNaXJyb3ItbWVudSBmb3JtIHtcclxuXHRiYWNrZ3JvdW5kOiAjRUVFO1xyXG5cdHdpZHRoOiAzMDBweDtcclxuXHRib3JkZXI6IDFweCBzb2xpZCAjQUFBXHJcbn1cclxuXHJcbmRpdi5Qcm9zZU1pcnJvci1tZW51IGZvcm0gc2VsZWN0IHtcclxuXHRiYWNrZ3JvdW5kOiB3aGl0ZTtcclxufVxyXG5cclxuZGl2LlByb3NlTWlycm9yLW1lbnViYXItc2xpZGluZyB7XHJcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiByaWdodCAwLjJzIGVhc2Utb3V0O1xyXG4gIC1tb3otdHJhbnNpdGlvbjogcmlnaHQgMC4ycyBlYXNlLW91dDtcclxuICB0cmFuc2l0aW9uOiByaWdodCAwLjJzIGVhc2Utb3V0O1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICBsZWZ0OiAxMDAlO1xyXG4gIHdpZHRoOiAxMDAlO1xyXG4gIGJveC1zaXppbmc6IC1tb3otYm9yZGVyLWJveDtcclxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gIHBhZGRpbmctbGVmdDogMTZweDtcclxuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcclxufVxyXG5cclxuXHJcbmApXHJcblxyXG4iLCJpbXBvcnQge3JlYWRQYXJhbXN9IGZyb20gXCIuLi8uLi8uLi9wcm9zZW1pcnJvci9kaXN0L21lbnUvbWVudVwiXHJcbmltcG9ydCB7UG9zfSBmcm9tIFwiLi4vLi4vLi4vcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7c2VsZWN0YWJsZU5vZGVBYm92ZX0gZnJvbSBcIi4uLy4uLy4uL3Byb3NlbWlycm9yL2Rpc3QvZWRpdC9zZWxlY3Rpb25cIlxyXG5cclxuZXhwb3J0IGNvbnN0IGFuZFNjcm9sbCA9IHtzY3JvbGxJbnRvVmlldzogdHJ1ZX1cclxuXHJcbk1hdGhKYXguSHViLlF1ZXVlKGZ1bmN0aW9uICgpIHtcclxuICAgIE1hdGhKYXguSHViLkNvbmZpZyh7XHJcbiAgICBcdHRleDJqYXg6IHtcclxuICAgICAgICBcdGRpc3BsYXlNYXRoOiBbIFtcIlxcXFxbXCIsXCJcXFxcXVwiXSBdLCBcclxuICAgICAgICBcdGlubGluZU1hdGg6IFsgW1wiXFxcXChcIixcIlxcXFwpXCJdIF0sXHJcbiAgICAgICAgXHRwcm9jZXNzRXNjYXBlczogdHJ1ZVxyXG4gICAgXHR9LFxyXG4gICAgXHRkaXNwbGF5QWxpZ246XCJsZWZ0XCJcclxuXHR9KVxyXG59KVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGRlZlBhcnNlcih0eXBlLHRhZyxjbHMpIHtcclxuXHR0eXBlLnJlZ2lzdGVyKFwicGFyc2VET01cIiwge1xyXG5cdFx0dGFnOiB0YWcsXHJcblx0XHRyYW5rOiAyNSxcclxuXHRcdHBhcnNlOiAoZG9tLCBjb250ZXh0LCB0eXBlLCBhdHRycykgPT4ge1xyXG5cdFx0XHRsZXQgY29udGFpbnMgPSBkb20uY2xhc3NMaXN0LmNvbnRhaW5zKGNscylcclxuXHRcdFx0aWYgKCFjb250YWlucykgcmV0dXJuIGZhbHNlXHJcblx0XHRcdGNvbnRleHQuaW5zZXJ0RnJvbShkb20sIHR5cGUsIGF0dHJzKVxyXG5cdFx0fVxyXG5cdH0pXHRcclxufVxyXG5cclxuZnVuY3Rpb24gc2VsZWN0Q2xpY2tlZE5vZGUocG0sIGUpIHtcclxuXHQgIGxldCBwb3MgPSBzZWxlY3RhYmxlTm9kZUFib3ZlKHBtLCBlLnRhcmdldCwge2xlZnQ6IGUuY2xpZW50WCwgdG9wOiBlLmNsaWVudFl9LCB0cnVlKVxyXG5cdCAgaWYgKCFwb3MpIHJldHVybiBwbS5zZWwucG9sbEZvclVwZGF0ZSgpXHJcblxyXG5cdCAgbGV0IHtub2RlLCBmcm9tfSA9IHBtLnNlbGVjdGlvblxyXG5cdCAgaWYgKG5vZGUgJiYgcG9zLmRlcHRoID49IGZyb20uZGVwdGggJiYgcG9zLnNob3J0ZW4oZnJvbS5kZXB0aCkuY21wKGZyb20pID09IDApIHtcclxuXHQgICAgaWYgKGZyb20uZGVwdGggPT0gMCkgcmV0dXJuIHBtLnNlbC5wb2xsRm9yVXBkYXRlKClcclxuXHQgICAgcG9zID0gZnJvbS5zaG9ydGVuKClcclxuXHQgIH1cclxuXHJcblx0ICBwbS5zZXROb2RlU2VsZWN0aW9uKHBvcylcclxuXHQgIHBtLmZvY3VzKClcclxuXHQgIGUucHJldmVudERlZmF1bHQoKVxyXG5cdH1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWZQYXJhbXNDbGljayh0eXBlKSB7XHJcblx0dHlwZS5wcm90b3R5cGUuaGFuZGxlQ2xpY2sgPSAocG0sIGUsIHBhdGgsIG5vZGUpID0+IHtcclxuXHRcdGxldCBtZW51ID0gcG0ubW9kLm1lbnVCYXIubWVudVxyXG5cdFx0bGV0IGNtZCA9IHBtLmNvbW1hbmRzW1wiaW5zZXJ0XCIrdHlwZS5uYW1lXVxyXG5cdFx0aWYgKG1lbnUgJiYgY21kKSB7XHJcblx0XHRcdHNlbGVjdENsaWNrZWROb2RlKHBtLGUpXHJcblx0XHRcdG1lbnUuZW50ZXIocmVhZFBhcmFtcyhjbWQpKVxyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH0gZWxzZVxyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0fVxyXG59XHJcbiIsImltcG9ydCB7QmxvY2ssIEF0dHJpYnV0ZX0gZnJvbSBcIi4uLy4uLy4uL3Byb3NlbWlycm9yL2Rpc3QvbW9kZWxcIlxyXG5pbXBvcnQge2VsdCxpbnNlcnRDU1N9IGZyb20gXCIuLi8uLi8uLi9wcm9zZW1pcnJvci9kaXN0L2RvbVwiXHJcbmltcG9ydCB7ZGVmUGFyc2VyLCBkZWZQYXJhbXNDbGljaywgYW5kU2Nyb2xsfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG5cclxuZXhwb3J0IGNsYXNzIEJsb2NrTWF0aCBleHRlbmRzIEJsb2NrIHt9XHJcblxyXG5CbG9ja01hdGguYXR0cmlidXRlcyA9IHtcclxuXHR0ZXg6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwiXCJ9KVxyXG59XHJcblxyXG5kZWZQYXJzZXIoQmxvY2tNYXRoLFwiZGl2XCIsXCJ3aWRnZXRzLWJsb2NrbWF0aFwiKVxyXG5cclxuQmxvY2tNYXRoLnByb3RvdHlwZS5zZXJpYWxpemVET00gPSBub2RlID0+IHtcclxuXHRpZiAobm9kZS5yZW5kZXJlZCkge1xyXG5cdFx0bm9kZS5yZW5kZXJlZCA9IG5vZGUucmVuZGVyZWQuY2xvbmVOb2RlKHRydWUpXHJcblx0fSBlbHNlIHtcclxuXHRcdG5vZGUucmVuZGVyZWQgPSBlbHQoXCJkaXZcIiwge2NsYXNzOiBcIndpZGdldHMtYmxvY2ttYXRoXCJ9LCBcIlxcXFxbXCIrbm9kZS5hdHRycy50ZXgrXCJcXFxcXVwiKTtcclxuXHRcdC8vIHdhaXQgdW50aWwgbm9kZSBpcyBhdHRhY2hlZCB0byBkb2N1bWVudCB0byByZW5kZXJcclxuXHRcdE1hdGhKYXguSHViLlF1ZXVlKFtcIkRlbGF5XCIsTWF0aEpheC5DYWxsYmFjaywxMDBdLFtcIlR5cGVzZXRcIixNYXRoSmF4Lkh1Yixub2RlLnJlbmRlcmVkXSlcclxuXHR9XHJcblx0cmV0dXJuIG5vZGUucmVuZGVyZWQ7IFxyXG59XHJcblxyXG5CbG9ja01hdGgucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcclxuXHRuYW1lOiBcImluc2VydEJsb2NrTWF0aFwiLFxyXG5cdGxhYmVsOiBcIkJsb2NrTWF0aFwiLFxyXG5cdHJ1bihwbSwgdGV4KSB7XHJcbiAgICBcdHJldHVybiBwbS50ci5yZXBsYWNlU2VsZWN0aW9uKHRoaXMuY3JlYXRlKHt0ZXh9KSkuYXBwbHkoYW5kU2Nyb2xsKVxyXG4gIFx0fSxcclxuXHRwYXJhbXM6IFtcclxuICAgICBcdHsgbGFiZWw6IFwiTGF0ZXggRXhwcmVzc2lvblwiLCB0eXBlOiBcInRleHRcIn1cclxuXHRdLFxyXG4gICAgcHJlZmlsbFBhcmFtcyhwbSkge1xyXG4gICAgICBsZXQge25vZGV9ID0gcG0uc2VsZWN0aW9uXHJcbiAgICAgIGlmIChub2RlKVxyXG4gICAgICAgIHJldHVybiBbbm9kZS5hdHRycy50ZXhdXHJcbiAgICB9XHJcbn0pXHJcblxyXG5kZWZQYXJhbXNDbGljayhCbG9ja01hdGgpXHJcblxyXG5pbnNlcnRDU1MoYFxyXG5cclxuLndpZGdldHMtYmxvY2ttYXRoIHt9XHJcblxyXG5gKSIsImltcG9ydCB7QXR0cmlidXRlfSBmcm9tIFwiLi4vLi4vLi4vcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7aW5zZXJ0Q1NTfSBmcm9tIFwiLi4vLi4vLi4vcHJvc2VtaXJyb3IvZGlzdC9kb21cIlxyXG5pbXBvcnQge0lucHV0fSBmcm9tIFwiLi9pbnB1dFwiXHJcbmltcG9ydCB7ZGVmUGFyc2VyLCBkZWZQYXJhbXNDbGljaywgYW5kU2Nyb2xsfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG5cclxuZXhwb3J0IGNsYXNzIENoZWNrQm94IGV4dGVuZHMgSW5wdXQge31cclxuXHJcbkNoZWNrQm94LmF0dHJpYnV0ZXMgPSB7XHJcblx0bmFtZTogbmV3IEF0dHJpYnV0ZSgpLFxyXG5cdHR5cGU6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwiY2hlY2tib3hcIn0pLFxyXG5cdHZhbHVlOiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiAxfSksXHJcblx0Y2xhc3M6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwid2lkZ2V0cy1jaGVja2JveFwifSlcclxufVxyXG5cclxuZGVmUGFyc2VyKENoZWNrQm94LFwiaW5wdXRcIixcIndpZGdldHMtY2hlY2tib3hcIilcclxuXHJcbi8vIENoZWNrYm94IGluaGVyaXRzIHNlcmlhbGl6ZXIgZnJvbSBpbnB1dFxyXG5cclxuXHJcbkNoZWNrQm94LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XHJcblx0bmFtZTogXCJpbnNlcnRDaGVja0JveFwiLFxyXG5cdGxhYmVsOiBcIkNoZWNrQm94XCIsXHJcblx0cnVuKHBtLCBuYW1lLCBsYWJlbCwgbG9jKSB7XHJcbiAgICBcdHJldHVybiBwbS50ci5yZXBsYWNlU2VsZWN0aW9uKHRoaXMuY3JlYXRlKHtuYW1lLCBsYWJlbCwgbG9jfSkpLmFwcGx5KGFuZFNjcm9sbClcclxuICBcdH0sXHJcblx0cGFyYW1zOiBbXHJcbiAgICAgXHR7IGxhYmVsOiBcIk5hbWVcIiwgdHlwZTogXCJ0ZXh0XCJ9LFxyXG5cdF0sXHJcbiAgICBwcmVmaWxsUGFyYW1zKHBtKSB7XHJcblx0ICAgIGxldCB7bm9kZX0gPSBwbS5zZWxlY3Rpb25cclxuXHQgICAgaWYgKG5vZGUpXHJcblx0ICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLm5hbWUsIG5vZGUuYXR0cnMubGFiZWwsIG5vZGUuYXR0cnMubG9jXVxyXG5cdH1cclxufSlcclxuXHJcbmRlZlBhcmFtc0NsaWNrKENoZWNrQm94KVxyXG5cclxuaW5zZXJ0Q1NTKGBcclxuXHJcbi53aWRnZXRzLWNoZWNrYm94IHt9XHJcblxyXG5gKSIsImltcG9ydCB7QmxvY2ssIFBhcmFncmFwaCwgQXR0cmlidXRlLCBQb3N9IGZyb20gXCIuLi8uLi8uLi9wcm9zZW1pcnJvci9kaXN0L21vZGVsXCJcclxuaW1wb3J0IHtlbHQsIGluc2VydENTU30gZnJvbSBcIi4uLy4uLy4uL3Byb3NlbWlycm9yL2Rpc3QvZG9tXCJcclxuaW1wb3J0IHtkZWZQYXJzZXIsIGRlZlBhcmFtc0NsaWNrLCBhbmRTY3JvbGx9IGZyb20gXCIuLi91dGlsc1wiXHJcblxyXG5leHBvcnQgY2xhc3MgQ2hlY2tJdGVtIGV4dGVuZHMgUGFyYWdyYXBoIHtcclxuXHRzdGF0aWMgZ2V0IGtpbmQoKSB7IHJldHVybiBcIi5cIiB9XHJcblxyXG5cdGNyZWF0ZShhdHRycywgY29udGVudCwgbWFya3MpIHtcclxuXHRcdGlmIChhdHRycy52YWx1ZSA+IDApIGNvbnRlbnQgPSBbdGhpcy5zY2hlbWEubm9kZShcImNoZWNrYm94XCIsYXR0cnMpXVxyXG5cdFx0cmV0dXJuIHN1cGVyLmNyZWF0ZShhdHRycywgY29udGVudCwgbWFya3MpXHJcblx0fVxyXG59XHJcblxyXG5DaGVja0l0ZW0uYXR0cmlidXRlcyA9IHtcclxuXHRuYW1lOiBuZXcgQXR0cmlidXRlKCksXHJcblx0dmFsdWU6IG5ldyBBdHRyaWJ1dGUoKVxyXG59XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIENoZWNrTGlzdCBleHRlbmRzIEJsb2NrIHtcclxuXHRzdGF0aWMgZ2V0IGNvbnRhaW5zKCkgeyByZXR1cm4gXCJjaGVja2l0ZW1cIiB9XHJcbn1cclxuXHJcbkNoZWNrTGlzdC5hdHRyaWJ1dGVzID0ge1xyXG5cdG5hbWU6IG5ldyBBdHRyaWJ1dGUoKSxcclxuXHRsYXlvdXQ6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwidmVydGljYWxcIn0pXHJcbn1cclxuXHJcbmRlZlBhcnNlcihDaGVja0l0ZW0sXCJkaXZcIixcIndpZGdldHMtY2hlY2tpdGVtXCIpXHJcbmRlZlBhcnNlcihDaGVja0xpc3QsXCJkaXZcIixcIndpZGdldHMtY2hlY2tsaXN0XCIpXHJcblxyXG5DaGVja0l0ZW0ucHJvdG90eXBlLnNlcmlhbGl6ZURPTSA9IChub2RlLHMpID0+IHMucmVuZGVyQXMobm9kZSxcInBcIiwge1xyXG5cdG5hbWU6IG5vZGUuYXR0cnMubmFtZStcIi1cIitub2RlLmF0dHJzLnZhbHVlLCBcclxuXHR2YWx1ZTogbm9kZS5hdHRycy52YWx1ZSxcclxuXHRjbGFzczogXCJ3aWRnZXRzLWNoZWNraXRlbVwiXHJcbn0pXHJcblxyXG5DaGVja0xpc3QucHJvdG90eXBlLnNlcmlhbGl6ZURPTSA9IChub2RlLHMpID0+IHMucmVuZGVyQXMobm9kZSxcImRpdlwiLHtcclxuXHRuYW1lOiBub2RlLmF0dHJzLm5hbWUsXHJcblx0bGF5b3V0OiBub2RlLmF0dHJzLmxheW91dCxcclxuXHRjbGFzczogXCJ3aWRnZXRzLWNoZWNrbGlzdFwiXHJcbn0pXHJcblxyXG5DaGVja0l0ZW0ucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcclxuXHQgIG5hbWU6IFwic3BsaXRDaGVja2l0ZW1cIixcclxuXHQgIGxhYmVsOiBcIlNwbGl0IHRoZSBjdXJyZW50IGNoZWNraXRlbVwiLFxyXG5cdCAgcnVuKHBtKSB7XHJcblx0ICAgIGxldCB7bm9kZSwgZnJvbSwgdG99ID0gcG0uc2VsZWN0aW9uXHJcblx0ICAgIGlmICgobm9kZSAmJiBub2RlLmlzQmxvY2spIHx8IGZyb20ucGF0aC5sZW5ndGggPCAyIHx8ICFQb3Muc2FtZVBhdGgoZnJvbS5wYXRoLCB0by5wYXRoKSkgcmV0dXJuIGZhbHNlXHJcblx0ICAgIGxldCB0b1BhcmVudCA9IGZyb20uc2hvcnRlbigpLCBncmFuZFBhcmVudCA9IHBtLmRvYy5wYXRoKHRvUGFyZW50LnBhdGgpXHJcblx0ICAgIGNvbnNvbGUubG9nKGdyYW5kUGFyZW50LnR5cGUubmFtZSlcclxuXHQgICAgaWYgKGdyYW5kUGFyZW50LnR5cGUubmFtZSAhPSBcImNoZWNrbGlzdFwiKSByZXR1cm4gZmFsc2VcclxuXHQgICAgcmV0dXJuIHBtLnRyLmRlbGV0ZShmcm9tLCB0bykuc3BsaXQoZnJvbSwgMSwgcG0uc2NoZW1hLm5vZGVzLmNoZWNraXRlbSwge25hbWU6IGdyYW5kUGFyZW50LmF0dHJzLm5hbWUsIHZhbHVlOiBncmFuZFBhcmVudC5zaXplfSkuYXBwbHkoYW5kU2Nyb2xsKVxyXG5cdCAgfSxcclxuXHQgIGtleTogXCJFbnRlcig1MClcIlxyXG5cdH0pXHJcblxyXG5cclxuQ2hlY2tMaXN0LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XHJcblx0bmFtZTogXCJpbnNlcnRDaGVja0xpc3RcIixcclxuXHRsYWJlbDogXCJDaGVja0xpc3RcIixcclxuXHRydW4ocG0sIG5hbWUsIGxheW91dCkge1xyXG5cdFx0bGV0IGNoa2l0ZW0gPSBwbS5zY2hlbWEubm9kZXMuY2hlY2tpdGVtLmNyZWF0ZSh7bmFtZTpuYW1lLCB2YWx1ZTogMH0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcblx0XHRyZXR1cm4gcG0udHIucmVwbGFjZVNlbGVjdGlvbih0aGlzLmNyZWF0ZSh7bmFtZTpuYW1lK1wiLTBcIiwgbGF5b3V0OmxheW91dH0sY2hraXRlbSkpLmFwcGx5KGFuZFNjcm9sbClcclxuICBcdH0sXHJcblx0cGFyYW1zOiBbXHJcbiAgICAgXHR7IGxhYmVsOiBcIk5hbWVcIiwgdHlwZTogXCJ0ZXh0XCJ9LFxyXG4gICAgIFx0eyBsYWJlbDogXCJMYXlvdXQgKHZlcnRpY2FsLCBob3Jpem9udGFsKVwiLCB0eXBlOiBcInNlbGVjdFwiLCBvcHRpb25zOiBbXHJcbiAgICAgXHQgICAge3ZhbHVlOiBcImhvcml6b250YWxcIiwgbGFiZWw6IFwiaG9yaXpvbnRhbFwifSxcclxuICAgICBcdCAgICB7dmFsdWU6IFwidmVydGljYWxcIiwgbGFiZWw6IFwidmVydGljYWxcIn1cclxuICAgICBcdCAgXX1cclxuXHRdLFxyXG4gICAgcHJlZmlsbFBhcmFtcyhwbSkge1xyXG5cdCAgICBsZXQge25vZGV9ID0gcG0uc2VsZWN0aW9uXHJcblx0ICAgIGlmIChub2RlKVxyXG5cdCAgICAgIHJldHVybiBbbm9kZS5hdHRycy5uYW1lLCBub2RlLmF0dHJzLmxheW91dF1cclxuXHQgfVxyXG59KVxyXG5cclxuQ2hlY2tJdGVtLnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XHJcbiAgbmFtZTogXCJzcGxpdENoZWNrSXRlbVwiLFxyXG4gIGxhYmVsOiBcIlNwbGl0IHRoZSBjdXJyZW50IGNoZWNraXRlbVwiLFxyXG4gIHJ1bihwbSkge1xyXG4gICAgbGV0IHtub2RlLCBmcm9tLCB0b30gPSBwbS5zZWxlY3Rpb25cclxuICAgIGlmICgobm9kZSAmJiBub2RlLmlzQmxvY2spIHx8IGZyb20ucGF0aC5sZW5ndGggPCAyIHx8ICFQb3Muc2FtZVBhdGgoZnJvbS5wYXRoLCB0by5wYXRoKSkgcmV0dXJuIGZhbHNlXHJcbiAgICBsZXQgdG9QYXJlbnQgPSBmcm9tLnNob3J0ZW4oKSwgZ3JhbmRQYXJlbnQgPSBwbS5kb2MucGF0aCh0b1BhcmVudC5wYXRoKVxyXG4gICAgcmV0dXJuIHBtLnRyLmRlbGV0ZShmcm9tLCB0bykuc3BsaXQoZnJvbSwgMSwgcG0uc2NoZW1hLm5vZGVzLmNoZWNraXRlbSwge1xyXG4gICAgXHRuYW1lOiBncmFuZFBhcmVudC5hdHRycy5uYW1lK1wiLVwiK2dyYW5kUGFyZW50LnNpemUsIFxyXG4gICAgXHR2YWx1ZTogZ3JhbmRQYXJlbnQuc2l6ZX0pLmFwcGx5KGFuZFNjcm9sbClcclxuICB9LFxyXG4gIGtleTogXCJFbnRlcig1MClcIlxyXG59KVxyXG5cclxuQ2hlY2tJdGVtLnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XHJcbiAgbmFtZTogXCJkZWxldGVDaGVja0l0ZW1cIixcclxuICBsYWJlbDogXCJkZWxldGUgdGhpcyBjaGVja2l0ZW0gb3IgY2hlY2tsaXN0XCIsXHJcbiAgcnVuKHBtKSB7XHJcbiAgICBsZXQge2hlYWQsIGVtcHR5fSA9IHBtLnNlbGVjdGlvblxyXG4gICAgaWYgKCFlbXB0eSB8fCBoZWFkLm9mZnNldCA+IDEpIHJldHVybiBmYWxzZVxyXG4gICAgLy8gRmluZCB0aGUgbm9kZSBiZWZvcmUgdGhpcyBvbmVcclxuICAgIGxldCBiZWZvcmUsIGN1dFxyXG4gICAgZm9yIChsZXQgaSA9IGhlYWQucGF0aC5sZW5ndGggLSAxOyAhYmVmb3JlICYmIGkgPj0gMDsgaS0tKSBpZiAoaGVhZC5wYXRoW2ldID4gMCkge1xyXG4gICAgICBjdXQgPSBoZWFkLnNob3J0ZW4oaSlcclxuICAgICAgYmVmb3JlID0gcG0uZG9jLnBhdGgoY3V0LnBhdGgpLmNoaWxkKGN1dC5vZmZzZXQgLSAxKVxyXG4gICAgfVxyXG5cdGxldCBtYyA9IHBtLmRvYy5wYXRoKGN1dC5wYXRoKS5jaGlsZChjdXQub2Zmc2V0KVxyXG4gICAgLy8gaWYgdG9wIGNob2ljZSwgZGVsZXRlIHdob2xlIHF1ZXN0aW9uIGlmIG9ubHkgb25lIGNob2ljZVxyXG4gICAgaWYgKG1jLnR5cGUubmFtZSA9PSBcImNoZWNraXRlbVwiKSB7XHJcbiAgICBcdHJldHVybiBwbS50ci5kZWxldGUoY3V0LCBjdXQubW92ZSgxKSkuYXBwbHkoYW5kU2Nyb2xsKVxyXG4gICAgfSBlbHNlIHtcclxuICAgIFx0Ly8gZG9uJ3QgZGVsZXRlIHF1ZXN0aW9uIGlmIG1vcmUgdGhhbiBvbmUgY2hvaWNlXHJcbiAgICBcdGlmIChtYy5zaXplID09IDEpIHtcclxuICAgICBcdFx0cmV0dXJuIHBtLnRyLmRlbGV0ZShjdXQsY3V0Lm1vdmUoMSkpLmFwcGx5KGFuZFNjcm9sbClcclxuICAgIFx0fSBlbHNlXHJcbiAgICBcdFx0cmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH0sXHJcbiAga2V5OiBbXCJCYWNrc3BhY2UoNTApXCIsIFwiTW9kLUJhY2tzcGFjZSg1MClcIl1cclxufSlcclxuXHJcblxyXG5cclxuaW5zZXJ0Q1NTKGBcclxuXHJcbi53aWRnZXRzLWNoZWNraXRlbSB7fVxyXG4ud2lkZ2V0cy1jaGVja2xpc3Qge31cclxuXHJcbmApIiwiaW1wb3J0IHtCbG9jaywgQXR0cmlidXRlfSBmcm9tIFwiLi4vLi4vLi4vcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7aW5zZXJ0Q1NTfSBmcm9tIFwiLi4vLi4vLi4vcHJvc2VtaXJyb3IvZGlzdC9kb21cIlxyXG5pbXBvcnQge2RlZlBhcnNlciwgZGVmUGFyYW1zQ2xpY2ssIGFuZFNjcm9sbH0gZnJvbSBcIi4uL3V0aWxzXCJcclxuXHJcbmV4cG9ydCBjbGFzcyBJRnJhbWUgZXh0ZW5kcyBCbG9jayB7fVxyXG5cclxuSUZyYW1lLmF0dHJpYnV0ZXMgPSB7XHJcblx0c3JjOiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OlwiXCJ9KSxcclxuXHR3aWR0aDogbmV3IEF0dHJpYnV0ZSh7ZGVmYXVsdDogMjAwfSksXHJcblx0aGVpZ2h0OiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiAyMDB9KVxyXG59XHJcblxyXG5kZWZQYXJzZXIoSUZyYW1lLCBcImlmcmFtZVwiLCBcIndpZGdldHMtaWZyYW1lXCIpXHJcblxyXG5JRnJhbWUucHJvdG90eXBlLnNlcmlhbGl6ZURPTSA9IChub2RlLCBzKSA9PiBzLnJlbmRlckFzKG5vZGUsIFwiaWZyYW1lXCIseyBcclxuXHRzcmM6IG5vZGUuYXR0cnMuc3JjLFxyXG5cdHdpZHRoOiBub2RlLmF0dHJzLndpZHRoLFxyXG5cdGhlaWdodDogbm9kZS5hdHRycy5oZWlnaHQsXHJcblx0Y29udGVudDogXCJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOFwiLFxyXG5cdGNsYXNzOiBcImlmcmFtZVwiLFxyXG5cdGZyYW1lYm9yZGVyOiBcIjFcIixcclxuXHRhbGxvd2Z1bGxzY3JlZW46IFwiMVwiXHJcbn0pXHJcblxyXG5JRnJhbWUucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcclxuXHRuYW1lOiBcImluc2VydElGcmFtZVwiLFxyXG5cdGxhYmVsOiBcInNob3cgd2Vic2l0ZXMsIHlvdVR1YmUsIEdvb2dsZU1hcHMsLi4uXCIsXHJcblx0cnVuKHBtLCBzcmMsIHdpZHRoLCBoZWlnaHQpIHtcclxuICAgIFx0cmV0dXJuIHBtLnRyLnJlcGxhY2VTZWxlY3Rpb24odGhpcy5jcmVhdGUoe3NyYywgd2lkdGgsIGhlaWdodH0pKS5hcHBseShhbmRTY3JvbGwpXHJcbiAgXHR9LFxyXG5cdHBhcmFtczogW1xyXG4gICAgIFx0eyBsYWJlbDogXCJMaW5rICh3ZWJzaXRlLCB5b3VUdWJlLCBHb29nbGUgTWFwcyAuLi4pXCIsIHR5cGU6IFwidGV4dFwifSxcclxuICAgICBcdHsgbGFiZWw6IFwiV2lkdGggaW4gcGl4ZWxzXCIsIHR5cGU6IFwidGV4dFwiLCBkZWZhdWx0OiAyMDAgfSxcclxuICAgICBcdHsgbGFiZWw6IFwiSGVpZ2h0IGluIHBpeGVsc1wiLCB0eXBlOiBcInRleHRcIiwgZGVmYXVsdDogMjAwIH0sXHJcblx0XSxcclxuICBcdHByZWZpbGxQYXJhbXMocG0pIHtcclxuICAgICAgbGV0IHtub2RlfSA9IHBtLnNlbGVjdGlvblxyXG4gICAgICBpZiAobm9kZSlcclxuICAgICAgICByZXR1cm4gW25vZGUuYXR0cnMuc3JjLCBub2RlLmF0dHJzLndpZHRoLCBub2RlLmF0dHJzLmhlaWdodF1cclxuICAgIH1cclxufSlcclxuXHJcbmRlZlBhcmFtc0NsaWNrKElGcmFtZSlcclxuXHJcbmluc2VydENTUyhgXHJcblxyXG4ud2lkZ2V0cy1pZnJhbWUge31cclxuXHJcbmApIiwiaW1wb3J0IHtJbmxpbmUsIEF0dHJpYnV0ZX0gZnJvbSBcIi4uLy4uLy4uL3Byb3NlbWlycm9yL2Rpc3QvbW9kZWxcIlxyXG5pbXBvcnQge2VsdCxpbnNlcnRDU1N9IGZyb20gXCIuLi8uLi8uLi9wcm9zZW1pcnJvci9kaXN0L2RvbVwiXHJcbmltcG9ydCB7ZGVmUGFyc2VyLCBkZWZQYXJhbXNDbGljaywgYW5kU2Nyb2xsfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG5cclxuZXhwb3J0IGNsYXNzIEltYWdlIGV4dGVuZHMgSW5saW5lIHt9XHJcbkltYWdlLmF0dHJpYnV0ZXMgPSB7XHJcbiAgc3JjOiBuZXcgQXR0cmlidXRlLFxyXG4gIGFsdDogbmV3IEF0dHJpYnV0ZSh7ZGVmYXVsdDogXCJcIn0pLFxyXG4gIHRpdGxlOiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiBcIlwifSksXHJcbiAgY2xhc3M6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwid2lkZ2V0cy1pbWdcIn0pXHJcbn1cclxuXHJcbmRlZlBhcnNlcihJbWFnZSwgXCJpbWdcIiwgXCJ3aWRnZXRzLWltZ1wiKVxyXG5cclxuSW1hZ2UucHJvdG90eXBlLnNlcmlhbGl6ZURPTSA9IChub2RlLCBzKSA9PiBzLnJlbmRlckFzKG5vZGUsIFwiaW1nXCIsIG5vZGUuYXR0cnMpXHJcblxyXG5JbWFnZS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xyXG4gIG5hbWU6IFwiaW5zZXJ0SW1hZ2VcIixcclxuICBsYWJlbDogXCJJbnNlcnQgaW1hZ2VcIixcclxuICBydW4ocG0sIHNyYywgYWx0LCB0aXRsZSkge1xyXG4gICAgcmV0dXJuIHBtLnRyLnJlcGxhY2VTZWxlY3Rpb24odGhpcy5jcmVhdGUoe3NyYywgdGl0bGUsIGFsdH0pKS5hcHBseShhbmRTY3JvbGwpXHJcbiAgfSxcclxuICBwYXJhbXM6IFtcclxuICAgIHtsYWJlbDogXCJJbWFnZSBVUkxcIiwgdHlwZTogXCJ0ZXh0XCJ9LFxyXG4gICAge2xhYmVsOiBcIkRlc2NyaXB0aW9uIC8gYWx0ZXJuYXRpdmUgdGV4dFwiLCB0eXBlOiBcInRleHRcIiwgZGVmYXVsdDogXCJcIn0sXHJcbiAgICB7bGFiZWw6IFwiVGl0bGVcIiwgdHlwZTogXCJ0ZXh0XCIsIGRlZmF1bHQ6IFwiXCJ9XHJcbiAgXSxcclxuICBzZWxlY3QocG0pIHtcclxuICAgIHJldHVybiBwbS5kb2MucGF0aChwbS5zZWxlY3Rpb24uZnJvbS5wYXRoKS50eXBlLmNhbkNvbnRhaW5UeXBlKHRoaXMpXHJcbiAgfSxcclxuICBwcmVmaWxsUGFyYW1zKHBtKSB7XHJcbiAgICBsZXQge25vZGV9ID0gcG0uc2VsZWN0aW9uXHJcbiAgICBpZiAobm9kZSAmJiBub2RlLnR5cGUgPT0gdGhpcylcclxuICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLnNyYywgbm9kZS5hdHRycy5hbHQsIG5vZGUuYXR0cnMudGl0bGVdXHJcbiAgfVxyXG59KVxyXG5cclxuZGVmUGFyYW1zQ2xpY2soSW1hZ2UpXHJcblxyXG5pbnNlcnRDU1MoYFxyXG5cclxuLndpZGdldHMtaW1hZ2Uge31cclxuXHJcbmApIiwiZXhwb3J0IHtCbG9ja01hdGh9IGZyb20gXCIuL2Jsb2NrbWF0aFwiXHJcbmV4cG9ydCB7Q2hlY2tCb3h9IGZyb20gXCIuL2NoZWNrYm94XCJcclxuZXhwb3J0IHtDaGVja0xpc3QsIENoZWNrSXRlbX0gZnJvbSBcIi4vY2hlY2tsaXN0XCJcclxuZXhwb3J0IHtJRnJhbWV9IGZyb20gXCIuL2lmcmFtZVwiXHJcbmV4cG9ydCB7SW5saW5lTWF0aH0gZnJvbSBcIi4vaW5saW5lbWF0aFwiXHJcbmV4cG9ydCB7SW5wdXR9IGZyb20gXCIuL2lucHV0XCJcclxuZXhwb3J0IHtNdWx0aXBsZUNob2ljZSwgQ2hvaWNlfSBmcm9tIFwiLi9tdWx0aXBsZWNob2ljZVwiXHJcbmV4cG9ydCB7UmFkaW9CdXR0b259IGZyb20gXCIuL3JhZGlvYnV0dG9uXCJcclxuZXhwb3J0IHtTY2FsZX0gZnJvbSBcIi4vc2NhbGVcIlxyXG5leHBvcnQge1NlbGVjdH0gZnJvbSBcIi4vc2VsZWN0XCJcclxuZXhwb3J0IHtUZXh0QXJlYX0gZnJvbSBcIi4vdGV4dGFyZWFcIlxyXG5leHBvcnQge1RleHRGaWVsZH0gZnJvbSBcIi4vdGV4dGZpZWxkXCJcclxuZXhwb3J0IHtJbWFnZX0gZnJvbSBcIi4vaW1hZ2VcIlxyXG5leHBvcnQge1NwcmVhZFNoZWV0fSBmcm9tIFwiLi9zcHJlYWRzaGVldFwiXHJcbmV4cG9ydCB7V2lkZ2V0fSBmcm9tIFwiLi93aWRnZXRcIlxyXG4iLCJpbXBvcnQge0lubGluZSwgQXR0cmlidXRlfSBmcm9tIFwiLi4vLi4vLi4vcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7ZWx0LCBpbnNlcnRDU1N9IGZyb20gXCIuLi8uLi8uLi9wcm9zZW1pcnJvci9kaXN0L2RvbVwiXHJcbmltcG9ydCB7ZGVmUGFyc2VyLCBkZWZQYXJhbXNDbGljaywgYW5kU2Nyb2xsfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG5cclxuZXhwb3J0IGNsYXNzIElubGluZU1hdGggZXh0ZW5kcyBJbmxpbmUge31cclxuXHJcbklubGluZU1hdGguYXR0cmlidXRlcyA9IHtcclxuXHR0ZXg6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwiXCJ9KVxyXG59IFxyXG5cclxuZGVmUGFyc2VyKElubGluZU1hdGgsIFwic3BhblwiLCBcIndpZGdldHMtaW5saW5lbWF0aFwiKVxyXG5cclxuSW5saW5lTWF0aC5wcm90b3R5cGUuc2VyaWFsaXplRE9NID0gbm9kZSA9PiB7XHJcblx0aWYgKG5vZGUucmVuZGVyZWQpIHtcclxuXHRcdG5vZGUucmVuZGVyZWQgPSBub2RlLnJlbmRlcmVkLmNsb25lTm9kZSh0cnVlKVxyXG5cdH0gZWxzZSB7XHJcblx0XHRub2RlLnJlbmRlcmVkID0gZWx0KFwic3BhblwiLCB7Y2xhc3M6IFwid2lkZ2V0cy1pbmxpbmVtYXRoXCJ9LCBcIiBcXFxcKFwiK25vZGUuYXR0cnMudGV4K1wiXFxcXCkgXCIpXHJcblx0XHQvLyB3YWl0IHVudGlsIG5vZGUgaXMgYXR0YWNoZWQgdG8gZG9jdW1lbnQgdG8gcmVuZGVyXHJcblx0XHRNYXRoSmF4Lkh1Yi5RdWV1ZShbXCJEZWxheVwiLE1hdGhKYXguQ2FsbGJhY2ssMTAwXSxbXCJUeXBlc2V0XCIsTWF0aEpheC5IdWIsbm9kZS5yZW5kZXJlZF0pXHJcblx0fVxyXG5cdHJldHVybiBub2RlLnJlbmRlcmVkO1xyXG59XHJcblxyXG5cclxuSW5saW5lTWF0aC5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xyXG5cdG5hbWU6IFwiaW5zZXJ0SW5saW5lTWF0aFwiLFxyXG5cdGxhYmVsOiBcIklubGluZU1hdGhcIixcclxuXHRydW4ocG0sIHRleCkge1xyXG4gICAgXHRyZXR1cm4gcG0udHIucmVwbGFjZVNlbGVjdGlvbih0aGlzLmNyZWF0ZSh7dGV4fSkpLmFwcGx5KGFuZFNjcm9sbClcclxuICBcdH0sXHJcblx0cGFyYW1zOiBbXHJcbiAgICAgXHR7IGxhYmVsOiBcIkxhdGV4IEV4cHJlc3Npb25cIiwgdHlwZTogXCJ0ZXh0XCIgfVxyXG5cdF0sXHJcbiAgICBwcmVmaWxsUGFyYW1zKHBtKSB7XHJcbiAgICAgIGxldCB7bm9kZX0gPSBwbS5zZWxlY3Rpb25cclxuICAgICAgaWYgKG5vZGUpXHJcbiAgICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLnRleF1cclxuICAgIH1cclxufSlcclxuXHJcbmRlZlBhcmFtc0NsaWNrKElubGluZU1hdGgpXHJcblxyXG5pbnNlcnRDU1MoYFxyXG5cclxuLndpZGdldHMtaW5saW5lbWF0aCB7fVxyXG5cclxuYCkiLCJpbXBvcnQge0lubGluZSwgQXR0cmlidXRlfSBmcm9tIFwiLi4vLi4vLi4vcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7aW5zZXJ0Q1NTfSBmcm9tIFwiLi4vLi4vLi4vcHJvc2VtaXJyb3IvZGlzdC9kb21cIlxyXG5pbXBvcnQge2RlZlBhcnNlcn0gZnJvbSBcIi4uL3V0aWxzXCJcclxuXHJcbmV4cG9ydCBjbGFzcyBJbnB1dCBleHRlbmRzIElubGluZSB7fVxyXG5cclxuSW5wdXQuYXR0cmlidXRlcyA9IHtcclxuXHRuYW1lOiBuZXcgQXR0cmlidXRlKCksXHJcblx0dHlwZTogbmV3IEF0dHJpYnV0ZSh7ZGVmYXVsdDogXCJ0ZXh0XCJ9KSxcclxuXHR2YWx1ZTogbmV3IEF0dHJpYnV0ZSgpLFxyXG59XHJcblxyXG5kZWZQYXJzZXIoSW5wdXQsXCJ3aWRnZXRzLWlucHV0XCIpXHJcblxyXG5JbnB1dC5wcm90b3R5cGUuc2VyaWFsaXplRE9NID0gKG5vZGUscykgPT4gcy5yZW5kZXJBcyhub2RlLFwiaW5wdXRcIixub2RlLmF0dHJzKVxyXG5cclxuaW5zZXJ0Q1NTKGBcclxuXHRcdFxyXG4ud2lkZ2V0cy1pbnB1dCB7fVxyXG5cclxuYCkiLCJpbXBvcnQge0Jsb2NrLCBQYXJhZ3JhcGgsIEF0dHJpYnV0ZSwgUG9zfSBmcm9tIFwiLi4vLi4vLi4vcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7aW5zZXJ0Q1NTfSBmcm9tIFwiLi4vLi4vLi4vcHJvc2VtaXJyb3IvZGlzdC9kb21cIlxyXG5pbXBvcnQge2RlZlBhcnNlciwgYW5kU2Nyb2xsfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG5cclxuZXhwb3J0IGNsYXNzIENob2ljZSBleHRlbmRzIFBhcmFncmFwaCB7XHJcblx0c3RhdGljIGdldCBraW5kKCkgeyByZXR1cm4gXCIuXCIgfVxyXG5cclxuXHRjcmVhdGUoYXR0cnMsIGNvbnRlbnQsIG1hcmtzKSB7XHJcblx0XHRpZiAoYXR0cnMudmFsdWUgPiAwKSBjb250ZW50ID0gW3RoaXMuc2NoZW1hLm5vZGUoXCJyYWRpb2J1dHRvblwiLGF0dHJzKV1cclxuXHRcdHJldHVybiBzdXBlci5jcmVhdGUoYXR0cnMsIGNvbnRlbnQsIG1hcmtzKVxyXG5cdH1cclxufVxyXG5cclxuQ2hvaWNlLmF0dHJpYnV0ZXMgPSB7XHJcblx0bmFtZTogbmV3IEF0dHJpYnV0ZSgpLFxyXG5cdHZhbHVlOiBuZXcgQXR0cmlidXRlKClcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE11bHRpcGxlQ2hvaWNlIGV4dGVuZHMgQmxvY2sge1xyXG5cdHN0YXRpYyBnZXQgY29udGFpbnMoKSB7IHJldHVybiBcImNob2ljZVwifVxyXG59XHJcblxyXG5NdWx0aXBsZUNob2ljZS5hdHRyaWJ1dGVzID0ge1xyXG5cdG5hbWU6IG5ldyBBdHRyaWJ1dGUoKVxyXG59XHJcblxyXG5cclxuZGVmUGFyc2VyKENob2ljZSxcInBcIixcIndpZGdldHMtY2hvaWNlXCIpXHJcbmRlZlBhcnNlcihNdWx0aXBsZUNob2ljZSxcImRpdlwiLFwid2lkZ2V0cy1tdWx0aXBsZWNob2ljZVwiKVxyXG5cclxuQ2hvaWNlLnByb3RvdHlwZS5zZXJpYWxpemVET00gPSAobm9kZSxzKSA9PiBzLnJlbmRlckFzKG5vZGUsXCJwXCIsIHtuYW1lOiBub2RlLmF0dHJzLm5hbWUsIHZhbHVlOiBub2RlLmF0dHJzLnZhbHVlLCBjbGFzczogXCJ3aWRnZXRzLWNob2ljZVwifSlcclxuXHJcbk11bHRpcGxlQ2hvaWNlLnByb3RvdHlwZS5zZXJpYWxpemVET00gPSAobm9kZSxzKSA9PiBzLnJlbmRlckFzKG5vZGUsXCJkaXZcIix7bmFtZTogbm9kZS5hdHRycy5uYW1lLCBjbGFzczogXCJ3aWRnZXRzLW11bHRpcGxlY2hvaWNlXCJ9KVxyXG5cclxuQ2hvaWNlLnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XHJcbiAgbmFtZTogXCJzcGxpdENob2ljZVwiLFxyXG4gIGxhYmVsOiBcIlNwbGl0IHRoZSBjdXJyZW50IGNob2ljZVwiLFxyXG4gIHJ1bihwbSkge1xyXG4gICAgbGV0IHtub2RlLCBmcm9tLCB0b30gPSBwbS5zZWxlY3Rpb25cclxuICAgIGlmICgobm9kZSAmJiBub2RlLmlzQmxvY2spIHx8IGZyb20ucGF0aC5sZW5ndGggPCAyIHx8ICFQb3Muc2FtZVBhdGgoZnJvbS5wYXRoLCB0by5wYXRoKSkgcmV0dXJuIGZhbHNlXHJcbiAgICAgbGV0IHRvUGFyZW50ID0gZnJvbS5zaG9ydGVuKCksIGdyYW5kUGFyZW50ID0gcG0uZG9jLnBhdGgodG9QYXJlbnQucGF0aClcclxuICAgIGlmIChncmFuZFBhcmVudC50eXBlLm5hbWUgIT0gXCJtdWx0aXBsZWNob2ljZVwiKSByZXR1cm4gZmFsc2VcclxuICAgIHJldHVybiBwbS50ci5kZWxldGUoZnJvbSwgdG8pLnNwbGl0KGZyb20sIDEsIHBtLnNjaGVtYS5ub2Rlcy5jaG9pY2UsIHtuYW1lOiBncmFuZFBhcmVudC5hdHRycy5uYW1lLCB2YWx1ZTogZ3JhbmRQYXJlbnQuc2l6ZX0pLmFwcGx5KGFuZFNjcm9sbClcclxuICB9LFxyXG4gIGtleTogXCJFbnRlcig1MClcIlxyXG59KVxyXG5cclxuQ2hvaWNlLnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XHJcbiAgbmFtZTogXCJkZWxldGVDaG9pY2VcIixcclxuICBsYWJlbDogXCJkZWxldGUgdGhpcyBjaG9pY2Ugb3IgbXVsdGlwbGVjaG9pY2VcIixcclxuICBydW4ocG0pIHtcclxuICAgIGxldCB7aGVhZCwgZW1wdHl9ID0gcG0uc2VsZWN0aW9uXHJcbiAgICBpZiAoIWVtcHR5IHx8IGhlYWQub2Zmc2V0ID4gMSkgcmV0dXJuIGZhbHNlXHJcbiAgICAvLyBGaW5kIHRoZSBub2RlIGJlZm9yZSB0aGlzIG9uZVxyXG4gICAgbGV0IGJlZm9yZSwgY3V0XHJcbiAgICBmb3IgKGxldCBpID0gaGVhZC5wYXRoLmxlbmd0aCAtIDE7ICFiZWZvcmUgJiYgaSA+PSAwOyBpLS0pIGlmIChoZWFkLnBhdGhbaV0gPiAwKSB7XHJcbiAgICAgIGN1dCA9IGhlYWQuc2hvcnRlbihpKVxyXG4gICAgICBiZWZvcmUgPSBwbS5kb2MucGF0aChjdXQucGF0aCkuY2hpbGQoY3V0Lm9mZnNldCAtIDEpXHJcbiAgICB9XHJcblx0bGV0IG1jID0gcG0uZG9jLnBhdGgoY3V0LnBhdGgpLmNoaWxkKGN1dC5vZmZzZXQpXHJcbiAgICAvLyBpZiB0b3AgY2hvaWNlLCBkZWxldGUgd2hvbGUgcXVlc3Rpb24gaWYgb25seSBvbmUgY2hvaWNlXHJcbiAgICBpZiAobWMudHlwZS5uYW1lID09IFwiY2hvaWNlXCIpIHtcclxuICAgIFx0cmV0dXJuIHBtLnRyLmRlbGV0ZShjdXQsIGN1dC5tb3ZlKDEpKS5hcHBseSgpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgXHQvLyBkb24ndCBkZWxldGUgcXVlc3Rpb24gaWYgbW9yZSB0aGFuIG9uZSBjaG9pY2VcclxuICAgIFx0aWYgKG1jLnNpemUgPT0gMSkge1xyXG4gICAgIFx0XHRyZXR1cm4gcG0udHIuZGVsZXRlKGN1dCxjdXQubW92ZSgxKSkuYXBwbHkoKVxyXG4gICAgXHR9IGVsc2VcclxuICAgIFx0XHRyZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfSxcclxuICBrZXk6IFtcIkJhY2tzcGFjZSg1MClcIiwgXCJNb2QtQmFja3NwYWNlKDUwKVwiXVxyXG59KVxyXG5cclxuTXVsdGlwbGVDaG9pY2UucmVnaXN0ZXIoXCJjb21tYW5kXCIse1xyXG5cdG5hbWU6IFwiaW5zZXJ0TXVsdGlwbGVDaG9pY2VcIixcclxuXHRsYWJlbDogXCJNdWx0aXBsZUNob2ljZVwiLFxyXG5cdHJ1bihwbSwgbmFtZSkge1xyXG4gICAgXHRsZXQge2Zyb20sIHRvLCBoZWFkfSA9IHBtLnNlbGVjdGlvblxyXG5cdFx0bGV0IGNob2ljZSA9IHBtLnNjaGVtYS5ub2RlKFwiY2hvaWNlXCIse25hbWU6IG5hbWUsIHZhbHVlOiAwfSlcclxuXHRcdGxldCB0ciA9IHBtLnRyLnJlcGxhY2VTZWxlY3Rpb24odGhpcy5jcmVhdGUoe25hbWU6IG5hbWV9LCBjaG9pY2UpKS5hcHBseShhbmRTY3JvbGwpXHJcblx0XHQvL2ZpbmQgcGF0aCBvZiBuZXh0IHNpYmxpbmdcclxuXHRcdGxldCBsZW4gPSBmcm9tLnBhdGgubGVuZ3RoLTFcclxuXHRcdGxldCBzaWIgPSBmcm9tLnBhdGhbbGVuXSsxXHJcblx0XHRwbS5zZXRUZXh0U2VsZWN0aW9uKG5ldyBQb3MoZnJvbS5wYXRoLnNwbGljZSgwLGxlbikuY29uY2F0KHNpYiksMCkpXHJcblx0XHRyZXR1cm4gdHJcclxuXHR9LFxyXG5cdHNlbGVjdChwbSkge1xyXG5cdFx0Y29uc29sZS5sb2coXCJzZWxlY3RcIilcclxuXHRcdHJldHVybiBwbS5kb2MucGF0aChwbS5zZWxlY3Rpb24uZnJvbS5wYXRoKS50eXBlLmNhbkNvbnRhaW5UeXBlKHRoaXMpXHJcblx0fSxcclxuXHRwYXJhbXM6IFtcclxuXHRcdHsgbGFiZWw6IFwiTmFtZVwiLCB0eXBlOiBcInRleHRcIn1cclxuXHRdLFxyXG4gICAgcHJlZmlsbFBhcmFtcyhwbSkge1xyXG5cdCAgICBsZXQge25vZGV9ID0gcG0uc2VsZWN0aW9uXHJcblx0ICAgIGlmIChub2RlKVxyXG5cdCAgICAgIHJldHVybiBbbm9kZS5hdHRycy5uYW1lXVxyXG5cdCB9XHJcbn0pXHJcblxyXG5pbnNlcnRDU1MoYFxyXG5cclxuLndpZGdldHMtY2hvaWNlIHt9XHJcbi53aWRnZXRzLW11bHRpcGxlY2hvaWNlIHt9XHJcblxyXG5gKSIsImltcG9ydCB7QXR0cmlidXRlfSBmcm9tIFwiLi4vLi4vLi4vcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7aW5zZXJ0Q1NTfSBmcm9tIFwiLi4vLi4vLi4vcHJvc2VtaXJyb3IvZGlzdC9kb21cIlxyXG5pbXBvcnQge2RlZlBhcnNlcn0gZnJvbSBcIi4uL3V0aWxzXCJcclxuaW1wb3J0IHtJbnB1dH0gZnJvbSBcIi4vaW5wdXRcIlxyXG5cclxuZXhwb3J0IGNsYXNzIFJhZGlvQnV0dG9uIGV4dGVuZHMgSW5wdXQge31cclxuXHJcblJhZGlvQnV0dG9uLmF0dHJpYnV0ZXMgPSB7XHJcblx0bmFtZTogbmV3IEF0dHJpYnV0ZSgpLFxyXG5cdHR5cGU6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwicmFkaW9cIn0pLFxyXG5cdHZhbHVlOiBuZXcgQXR0cmlidXRlKCksXHJcblx0Y2xhc3M6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwid2lkZ2V0cy1yYWRpb2J1dHRvblwifSlcclxufVxyXG5cclxuZGVmUGFyc2VyKFJhZGlvQnV0dG9uLFwiaW5wdXRcIixcIndpZGdldHMtcmFkaW9idXR0b25cIilcclxuXHJcbi8vIGluaGVyaXRzIHNlcmlhbGl6ZXIgZnJvbSBpbnB1dFxyXG5cclxuXHJcbmluc2VydENTUyhgXHJcblxyXG4ud2lkZ2V0cy1yYWRpb2J1dHRvbiB7fVxyXG5cclxuYCkiLCJpbXBvcnQge0Jsb2NrLCBBdHRyaWJ1dGV9IGZyb20gXCIuLi8uLi8uLi9wcm9zZW1pcnJvci9kaXN0L21vZGVsXCJcclxuaW1wb3J0IHtlbHQsIGluc2VydENTU30gZnJvbSBcIi4uLy4uLy4uL3Byb3NlbWlycm9yL2Rpc3QvZG9tXCJcclxuaW1wb3J0IHtkZWZQYXJzZXIsIGRlZlBhcmFtc0NsaWNrLCBhbmRTY3JvbGx9IGZyb20gXCIuLi91dGlsc1wiXHJcblxyXG5leHBvcnQgY2xhc3MgU2NhbGUgZXh0ZW5kcyBCbG9jayB7fVxyXG5cclxuU2NhbGUuYXR0cmlidXRlcyA9IHtcclxuXHRuYW1lOiBuZXcgQXR0cmlidXRlKCksXHJcblx0c3RhcnR2YWx1ZTogbmV3IEF0dHJpYnV0ZSh7ZGVmYXVsdDogXCIxXCJ9KSxcclxuXHRzdGFydGxhYmVsOiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiBcImxvd1wifSksXHJcblx0ZW5kdmFsdWU6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwiMTBcIn0pLFxyXG5cdGVuZGxhYmVsOiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiBcImhpZ2hcIn0pLFxyXG59XHJcblxyXG5kZWZQYXJzZXIoU2NhbGUsXCJkaXZcIixcInNjYWxlXCIpXHJcblxyXG5TY2FsZS5wcm90b3R5cGUuc2VyaWFsaXplRE9NID0gbm9kZSA9PiB7XHJcblx0bGV0IGRvbSA9IGVsdChcImRpdlwiLHtjbGFzczogXCJ3aWRnZXRzLXNjYWxlXCJ9KVxyXG5cdGRvbS5hcHBlbmRDaGlsZChlbHQoXCJzcGFuXCIsIG51bGwsIG5vZGUuYXR0cnMuc3RhcnRsYWJlbCtcIiBcIikpXHJcblx0bGV0IHN0YXJ0VmFsID0gTnVtYmVyKG5vZGUuYXR0cnMuc3RhcnR2YWx1ZSlcclxuXHRsZXQgZW5kVmFsID0gTnVtYmVyKG5vZGUuYXR0cnMuZW5kdmFsdWUpXHJcblx0aWYgKHN0YXJ0VmFsIDwgZW5kVmFsKVxyXG5cdFx0Zm9yIChsZXQgaSA9IHN0YXJ0VmFsOyBpIDw9IGVuZFZhbDsgaSsrKSB7XHJcblx0XHRcdGRvbS5hcHBlbmRDaGlsZChcclxuXHRcdFx0XHRlbHQoXCJzcGFuXCIse2NsYXNzOiBcIndpZGdldHMtc2NhbGVpdGVtXCJ9LFxyXG5cdFx0XHRcdFx0ZWx0KFwiaW5wdXRcIix7bmFtZTpub2RlLmF0dHJzLm5hbWUsIHR5cGU6XCJyYWRpb1wiLCB2YWx1ZTppfSksXHJcblx0XHRcdFx0XHRpLnRvU3RyaW5nKClcclxuXHRcdFx0XHQpXHJcblx0XHRcdClcclxuXHRcdH1cclxuXHRlbHNlXHJcblx0XHRmb3IgKGxldCBpID0gc3RhcnRWYWw7IGkgPj0gIGVuZFZhbDsgaS0tKSB7XHJcblx0XHRcdGRvbS5hcHBlbmRDaGlsZChcclxuXHRcdFx0XHRlbHQoXCJzcGFuXCIse2NsYXNzOiBcIndpZGdldHMtc2NhbGVpdGVtXCJ9LFxyXG5cdFx0XHRcdFx0ZWx0KFwiaW5wdXRcIix7bmFtZTpub2RlLmF0dHJzLm5hbWUsIHR5cGU6XCJyYWRpb1wiLCB2YWx1ZTppfSksXHJcblx0XHRcdFx0XHRpLnRvU3RyaW5nKClcclxuXHRcdFx0XHQpXHJcblx0XHRcdClcclxuXHRcdH1cclxuXHRkb20uYXBwZW5kQ2hpbGQoZWx0KFwic3BhblwiLCBudWxsLCBcIiBcIitub2RlLmF0dHJzLmVuZGxhYmVsKSlcclxuXHRyZXR1cm4gZG9tXHJcbn1cclxuXHJcblNjYWxlLnJlZ2lzdGVyKFwiY29tbWFuZFwiLHtcclxuXHRuYW1lOiBcImluc2VydFNjYWxlXCIsXHJcblx0bGFiZWw6IFwiU2NhbGVcIixcclxuXHRydW4ocG0sIG5hbWUsIHN0YXJ0dmFsdWUsIHN0YXJ0bGFiZWwsIGVuZHZhbHVlLCBlbmRsYWJlbCkge1xyXG4gICAgXHRyZXR1cm4gcG0udHIucmVwbGFjZVNlbGVjdGlvbih0aGlzLmNyZWF0ZSh7bmFtZSxzdGFydHZhbHVlLHN0YXJ0bGFiZWwsZW5kdmFsdWUsZW5kbGFiZWx9KSkuYXBwbHkoYW5kU2Nyb2xsKVxyXG4gIFx0fSxcclxuXHRwYXJhbXM6IFtcclxuICAgICBcdHsgbGFiZWw6IFwiTmFtZVwiLCB0eXBlOiBcInRleHRcIn0sXHJcbiAgICAgXHR7IGxhYmVsOiBcIlN0YXJ0IHZhbHVlXCIsIHR5cGU6IFwidGV4dFwiLCBkZWZhdWx0OiAxfSxcclxuICAgICBcdHsgbGFiZWw6IFwiU3RhcnQgbGFiZWxcIiwgdHlwZTogXCJ0ZXh0XCIsIGRlZmF1bHQ6IFwibWluXCJ9LFxyXG4gICAgIFx0eyBsYWJlbDogXCJFbmQgdmFsdWVcIiwgdHlwZTogXCJ0ZXh0XCIsIGRlZmF1bHQ6IDEwfSxcclxuICAgICBcdHsgbGFiZWw6IFwiRW5kIGxhYmVsXCIsIHR5cGU6IFwidGV4dFwiLCBkZWZhdWx0OiBcIm1heFwifVxyXG5cdF0sXHJcbiAgICBwcmVmaWxsUGFyYW1zKHBtKSB7XHJcblx0ICAgIGxldCB7bm9kZX0gPSBwbS5zZWxlY3Rpb25cclxuXHQgICAgaWYgKG5vZGUpXHJcblx0ICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLm5hbWUsIG5vZGUuYXR0cnMuc3RhcnR2YWx1ZSwgbm9kZS5hdHRycy5zdGFydGxhYmVsLCBub2RlLmF0dHJzLmVuZHZhbHVlLCBub2RlLmF0dHJzLmVuZGxhYmVsXVxyXG5cdCB9XHJcbn0pXHJcblxyXG5kZWZQYXJhbXNDbGljayhTY2FsZSlcclxuXHJcbmluc2VydENTUyhgXHJcblxyXG4ud2lkZ2V0cy1zY2FsZWl0ZW0ge31cdFx0XHJcbi53aWRnZXRzLXNjYWxlIHt9XHJcblxyXG5gKSIsImltcG9ydCB7QmxvY2ssIElubGluZSwgQXR0cmlidXRlfSBmcm9tIFwiLi4vLi4vLi4vcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7ZWx0LCBpbnNlcnRDU1N9IGZyb20gXCIuLi8uLi8uLi9wcm9zZW1pcnJvci9kaXN0L2RvbVwiXHJcbmltcG9ydCB7ZGVmUGFyc2VyLCBkZWZQYXJhbXNDbGljaywgYW5kU2Nyb2xsfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG5cclxuZXhwb3J0IGNsYXNzIFNlbGVjdCBleHRlbmRzIElubGluZSB7fVxyXG5cclxuU2VsZWN0LmF0dHJpYnV0ZXMgPSB7XHJcblx0bmFtZTogbmV3IEF0dHJpYnV0ZSgpLFxyXG5cdG9wdGlvbnM6IG5ldyBBdHRyaWJ1dGUoKSxcclxuICAgIG11bHRpcGxlOiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiBcInNpbmdsZVwifSlcclxufVxyXG5cclxuZGVmUGFyc2VyKFNlbGVjdCxcInNlbGVjdFwiLFwid2lkZ2V0cy1zZWxlY3RcIilcclxuXHJcblNlbGVjdC5wcm90b3R5cGUuc2VyaWFsaXplRE9NID0gbm9kZSA9PiB7XHJcblx0bGV0IHNlbGVjdGlvbiA9IG5vZGUuYXR0cnMubXVsdGlwbGUgPT0gXCJtdWx0aXBsZVwiXHJcblx0bGV0IHNlbGVjdCA9IGVsdChcInNlbGVjdFwiLHtuYW1lOiBub2RlLmF0dHJzLm5hbWUsIGNsYXNzOiBcIndpZGdldHMtc2VsZWN0XCIsIHNpemU6IDEsIG11bHRpcGxlOiBzZWxlY3Rpb259KVxyXG5cdG5vZGUuYXR0cnMub3B0aW9ucy5zcGxpdChcIixcIikubWFwKGZ1bmN0aW9uKG9wdGlvbikge1xyXG5cdFx0c2VsZWN0LmFwcGVuZENoaWxkKGVsdChcIm9wdGlvblwiLCB7dmFsdWU6IG9wdGlvbi50cmltKCl9LCBvcHRpb24pKVxyXG5cdH0pXHJcblx0cmV0dXJuIHNlbGVjdFxyXG59XHJcblxyXG5TZWxlY3QucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcclxuXHRuYW1lOiBcImluc2VydFNlbGVjdFwiLFxyXG5cdGxhYmVsOiBcIlNlbGVjdFwiLFxyXG5cdHJ1bihwbSwgbmFtZSwgb3B0aW9ucywgbXVsdGlwbGUpIHtcclxuICAgIFx0cmV0dXJuIHBtLnRyLnJlcGxhY2VTZWxlY3Rpb24odGhpcy5jcmVhdGUoe25hbWUsb3B0aW9ucyxtdWx0aXBsZX0pKS5hcHBseShhbmRTY3JvbGwpXHJcbiAgXHR9LFxyXG5cdHBhcmFtczogW1xyXG4gICAgIFx0eyBsYWJlbDogXCJOYW1lXCIsIHR5cGU6IFwidGV4dFwifSxcclxuICAgICAgXHR7IGxhYmVsOiBcIk9wdGlvbnMgKGNvbW1hIHNlcGFyYXRlZClcIiwgdHlwZTogXCJ0ZXh0XCJ9LFxyXG4gICAgIFx0eyBsYWJlbDogXCJTZWxlY3Rpb24gKHNpbmdsZSBvciBtdWx0aXBsZSlcIiwgdHlwZTogXCJzZWxlY3RcIiwgb3B0aW9uczogW1xyXG4gICAgIFx0ICAgIHt2YWx1ZTogXCJtdWx0aXBsZVwiLCBsYWJlbDpcIm11bHRpcGxlXCJ9LFxyXG4gICAgIFx0ICAgIHt2YWx1ZTogXCJzaW5nbGVcIiwgbGFiZWw6XCJzaW5nbGVcIn1cclxuICAgICBcdF19XHJcblx0XSxcclxuICAgIHByZWZpbGxQYXJhbXMocG0pIHtcclxuXHQgICAgbGV0IHtub2RlfSA9IHBtLnNlbGVjdGlvblxyXG5cdCAgICBpZiAobm9kZSkge1xyXG5cdCAgICAgIHJldHVybiBbbm9kZS5hdHRycy5uYW1lLCBub2RlLmF0dHJzLm9wdGlvbnMsIG5vZGUuYXR0cnMubXVsdGlwbGVdXHJcblx0ICAgIH1cclxuXHQgfVxyXG59KVxyXG5cclxuZGVmUGFyYW1zQ2xpY2soU2VsZWN0KVxyXG5cclxuaW5zZXJ0Q1NTKGBcclxuXHJcbi53aWRnZXRzLXNlbGVjdCB7fVxyXG5cclxuYCkiLCJpbXBvcnQge0Jsb2NrLCBBdHRyaWJ1dGV9IGZyb20gXCIuLi8uLi8uLi9wcm9zZW1pcnJvci9kaXN0L21vZGVsXCJcclxuaW1wb3J0IHtlbHQsaW5zZXJ0Q1NTfSBmcm9tIFwiLi4vLi4vLi4vcHJvc2VtaXJyb3IvZGlzdC9kb21cIlxyXG5pbXBvcnQge2RlZlBhcnNlciwgZGVmUGFyYW1zQ2xpY2ssIGFuZFNjcm9sbH0gZnJvbSBcIi4uL3V0aWxzXCJcclxuXHJcbmV4cG9ydCBjbGFzcyBTcHJlYWRTaGVldCBleHRlbmRzIEJsb2NrIHt9XHJcblxyXG5TcHJlYWRTaGVldC5hdHRyaWJ1dGVzID0ge1xyXG5cdGRhdGE6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwiXCJ9KVxyXG59XHJcblxyXG5kZWZQYXJzZXIoU3ByZWFkU2hlZXQsXCJkaXZcIixcIndpZGdldHMtc3ByZWFkc2hlZXRcIilcclxuXHJcblNwcmVhZFNoZWV0LnByb3RvdHlwZS5zZXJpYWxpemVET00gPSBub2RlID0+IHtcclxuXHRpZiAobm9kZS5yZW5kZXJlZCkge1xyXG5cdFx0bm9kZS5yZW5kZXJlZCA9IG5vZGUucmVuZGVyZWQuY2xvbmVOb2RlKHRydWUpXHJcblx0fSBlbHNlIHtcclxuXHRcdG5vZGUucmVuZGVyZWQgPSBlbHQoXCJkaXZcIiwge1xyXG5cdFx0XHRpZDogXCJzcHJlYWRzaGVldFwiLCBcclxuXHRcdFx0Y2xhc3M6IFwid2lkZ2V0cy1zcHJlYWRzaGVldFwiXHJcblx0XHR9KTtcclxuXHRcdC8vIHdhaXQgdW50aWwgbm9kZSBpcyBhdHRhY2hlZCB0byBkb2N1bWVudCB0byByZW5kZXJcclxuXHRcdHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRsZXQgZGF0YSA9IFtcclxuXHQgICAgICAgICAgICBbXCJcIiwgXCJGb3JkXCIsIFwiVm9sdm9cIiwgXCJUb3lvdGFcIiwgXCJIb25kYVwiXSxcclxuXHQgICAgICAgICAgICBbXCIyMDE0XCIsIDEwLCAxMSwgMTIsIDEzXSxcclxuXHQgICAgICAgICAgICBbXCIyMDE1XCIsIDIwLCAxMSwgMTQsIDEzXSxcclxuXHQgICAgICAgICAgICBbXCIyMDE2XCIsIDMwLCAxNSwgMTIsIDEzXVxyXG5cdCAgICAgICAgXTtcclxuXHRcclxuXHQgICAgICAgIGxldCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ByZWFkc2hlZXQnKTtcclxuXHQgICAgICAgIGxldCBob3QgPSBuZXcgSGFuZHNvbnRhYmxlKGNvbnRhaW5lciwge1xyXG5cdCAgICAgICAgXHRkYXRhOiBkYXRhLFxyXG5cdCAgICAgICAgICAgIG1pblNwYXJlUm93czogMSxcclxuXHQgICAgICAgICAgICByb3dIZWFkZXJzOiB0cnVlLFxyXG5cdCAgICAgICAgICAgIGNvbEhlYWRlcnM6IHRydWUsXHJcblx0ICAgICAgICAgICAgY29udGV4dE1lbnU6IHRydWVcclxuXHQgICAgICAgIH0pO1xyXG5cdFx0fSwgMTAwKVxyXG5cdH1cclxuXHRyZXR1cm4gbm9kZS5yZW5kZXJlZDsgXHJcbn1cclxuXHJcblNwcmVhZFNoZWV0LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XHJcblx0bmFtZTogXCJpbnNlcnRTcHJlYWRTaGVldFwiLFxyXG5cdGxhYmVsOiBcIlNwcmVhZFNoZWV0XCIsXHJcblx0cnVuKHBtLCBkYXRhKSB7XHJcbiAgICBcdHJldHVybiBwbS50ci5yZXBsYWNlU2VsZWN0aW9uKHRoaXMuY3JlYXRlKHtkYXRhfSkpLmFwcGx5KGFuZFNjcm9sbClcclxuICBcdH0sXHJcblx0cGFyYW1zOiBbXHJcbiAgICAgXHR7IGxhYmVsOiBcIkxpbmsgdG8gZGF0YSBjc3YgKGZpeGVkIGZvciBkZW1vKVwiLCB0eXBlOiBcInRleHRcIiwgZGVmYXVsdDogXCJjYXJzLmNzdlwifVxyXG5cdF0sXHJcbiAgICBwcmVmaWxsUGFyYW1zKHBtKSB7XHJcbiAgICAgIGxldCB7bm9kZX0gPSBwbS5zZWxlY3Rpb25cclxuICAgICAgaWYgKG5vZGUpXHJcbiAgICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLmRhdGFdXHJcbiAgICB9XHJcbn0pXHJcblxyXG5kZWZQYXJhbXNDbGljayhTcHJlYWRTaGVldClcclxuXHJcbmluc2VydENTUyhgXHJcblxyXG4ud2lkZ2V0cy1zcHJlYWRzaGVldCB7fVxyXG5cclxuYCkiLCJpbXBvcnQge0Jsb2NrLCBBdHRyaWJ1dGV9IGZyb20gXCIuLi8uLi8uLi9wcm9zZW1pcnJvci9kaXN0L21vZGVsXCJcclxuaW1wb3J0IHtpbnNlcnRDU1N9IGZyb20gXCIuLi8uLi8uLi9wcm9zZW1pcnJvci9kaXN0L2RvbVwiXHJcbmltcG9ydCB7ZGVmUGFyc2VyLCBkZWZQYXJhbXNDbGljaywgYW5kU2Nyb2xsfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG5cclxuZXhwb3J0IGNsYXNzIFRleHRBcmVhIGV4dGVuZHMgQmxvY2sge31cclxuXHJcblRleHRBcmVhLmF0dHJpYnV0ZXMgPSB7XHJcblx0bmFtZTogbmV3IEF0dHJpYnV0ZSgpLFxyXG5cdHJvd3M6IG5ldyBBdHRyaWJ1dGUoKSxcclxuXHRjb2xzOiBuZXcgQXR0cmlidXRlKCksXHJcblx0Y2xhc3M6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwid2lkZ2V0cy10ZXh0YXJlYVwifSlcclxufVxyXG5cclxuZGVmUGFyc2VyKFRleHRBcmVhLFwiaW5wdXRcIixcIndpZGdldHMtdGV4dGFyZWFcIilcclxuXHJcblRleHRBcmVhLnByb3RvdHlwZS5zZXJpYWxpemVET00gPSAobm9kZSxzKSA9PiBzLnJlbmRlckFzKG5vZGUsXCJ0ZXh0YXJlYVwiLG5vZGUuYXR0cnMpXHJcblxyXG5UZXh0QXJlYS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xyXG5cdG5hbWU6IFwiaW5zZXJ0VGV4dEFyZWFcIixcclxuXHRsYWJlbDogXCJUZXh0QXJlYVwiLFxyXG5cdHJ1bihwbSwgbmFtZSwgcm93cywgY29scykge1xyXG4gICAgXHRyZXR1cm4gcG0udHIucmVwbGFjZVNlbGVjdGlvbih0aGlzLmNyZWF0ZSh7bmFtZSxyb3dzLGNvbHN9KSkuYXBwbHkoYW5kU2Nyb2xsKVxyXG4gIFx0fSxcclxuXHRwYXJhbXM6IFtcclxuICAgICBcdHsgbGFiZWw6IFwiTmFtZVwiLCB0eXBlOiBcInRleHRcIn0sXHJcbiAgICAgXHR7IGxhYmVsOiBcIlJvd3NcIiwgdHlwZTogXCJ0ZXh0XCIsIGRlZmF1bHQ6IFwiNFwifSxcclxuICAgICBcdHsgbGFiZWw6IFwiQ29sdW1uc1wiLCB0eXBlOiBcInRleHRcIiwgZGVmYXVsdDogXCIyMFwifVxyXG5cdF0sXHJcbiAgICBwcmVmaWxsUGFyYW1zKHBtKSB7XHJcblx0ICAgIGxldCB7bm9kZX0gPSBwbS5zZWxlY3Rpb25cclxuXHQgICAgaWYgKG5vZGUpXHJcblx0ICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLm5hbWUsIG5vZGUuYXR0cnMucm93cywgbm9kZS5hdHRycy5jb2xzXVxyXG5cdCB9XHJcbn0pIFxyXG5cclxuZGVmUGFyYW1zQ2xpY2soVGV4dEFyZWEpXHJcblxyXG5pbnNlcnRDU1MoYFxyXG5cclxuLndpZGdldHMtdGV4dGFyZWEge31cclxuXHJcbmApIiwiaW1wb3J0IHtBdHRyaWJ1dGV9IGZyb20gXCIuLi8uLi8uLi9wcm9zZW1pcnJvci9kaXN0L21vZGVsXCJcclxuaW1wb3J0IHtpbnNlcnRDU1N9IGZyb20gXCIuLi8uLi8uLi9wcm9zZW1pcnJvci9kaXN0L2RvbVwiXHJcbmltcG9ydCB7SW5wdXR9IGZyb20gXCIuL2lucHV0XCJcclxuaW1wb3J0IHtkZWZQYXJzZXIsIGRlZlBhcmFtc0NsaWNrLCBhbmRTY3JvbGx9IGZyb20gXCIuLi91dGlsc1wiXHJcblxyXG5leHBvcnQgY2xhc3MgVGV4dEZpZWxkIGV4dGVuZHMgSW5wdXQge31cclxuXHJcblRleHRGaWVsZC5hdHRyaWJ1dGVzID0ge1xyXG5cdG5hbWU6IG5ldyBBdHRyaWJ1dGUoKSxcclxuXHR0eXBlOiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiBcInRleHRcIn0pLFxyXG5cdHNpemU6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwiMjBcIn0pLFxyXG5cdGNsYXNzOiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiBcIndpZGdldHMtdGV4dGZpZWxkXCJ9KVxyXG59XHJcblxyXG5kZWZQYXJzZXIoVGV4dEZpZWxkLFwiaW5wdXRcIixcIndpZGdldHMtdGV4dGZpZWxkXCIpXHJcblxyXG4vLyBzZXJpYWxpemVyIGluaGVyaXRzIGZyb20gaW5wdXRcclxuXHJcblRleHRGaWVsZC5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xyXG5cdG5hbWU6IFwiaW5zZXJ0VGV4dEZpZWxkXCIsXHJcblx0bGFiZWw6IFwiVGV4dEZpZWxkXCIsXHJcblx0cnVuKHBtLCBuYW1lLCBzaXplKSB7XHJcbiAgICBcdHJldHVybiBwbS50ci5yZXBsYWNlU2VsZWN0aW9uKHRoaXMuY3JlYXRlKHtuYW1lLHNpemV9KSkuYXBwbHkoYW5kU2Nyb2xsKVxyXG4gIFx0fSxcclxuXHRwYXJhbXM6IFtcclxuICAgICBcdHsgbGFiZWw6IFwiTmFtZVwiLCB0eXBlOiBcInRleHRcIn0sXHJcbiAgICAgXHR7IGxhYmVsOiBcIlNpemVcIiwgdHlwZTogXCJ0ZXh0XCIsIGRlZmF1bHQ6IFwiMjBcIiB9LFxyXG5cdF0sXHJcbiAgICBwcmVmaWxsUGFyYW1zKHBtKSB7XHJcblx0ICAgIGxldCB7bm9kZX0gPSBwbS5zZWxlY3Rpb25cclxuIFx0ICAgIGlmIChub2RlKVxyXG5cdCAgICAgIHJldHVybiBbbm9kZS5hdHRycy5uYW1lLCBub2RlLmF0dHJzLnNpemUgXVxyXG5cdCB9XHJcbn0pXHJcblxyXG5kZWZQYXJhbXNDbGljayhUZXh0RmllbGQpXHJcblxyXG5pbnNlcnRDU1MoYFxyXG5cclxuLndpZGdldHMtdGV4dGZpZWxkIHt9XHJcblxyXG5gKSIsImltcG9ydCB7cmVhZFBhcmFtc30gZnJvbSBcIi4uLy4uLy4uL3Byb3NlbWlycm9yL2Rpc3QvbWVudS9tZW51XCJcclxuaW1wb3J0IHtUZXh0YmxvY2t9IGZyb20gXCIuLi8uLi8uLi9wcm9zZW1pcnJvci9kaXN0L21vZGVsXCJcclxuaW1wb3J0IHtlbHR9IGZyb20gXCIuLi8uLi8uLi9wcm9zZW1pcnJvci9kaXN0L2RvbVwiXHJcblxyXG5jb25zdCB3aWRnZXRzID0gW1wiSW1hZ2VcIiwgXCJUZXh0RmllbGRcIiwgXCJUZXh0QXJlYVwiLCBcIkNoZWNrQm94XCIsIFwiU2VsZWN0XCIsIFxyXG4gICAgICAgICAgICAgICAgIFwiSUZyYW1lXCIsIFwiSW5saW5lTWF0aFwiLCBcIkJsb2NrTWF0aFwiLCBcIlNwcmVhZFNoZWV0XCIsXHJcbiAgICAgICAgICAgICAgICAgXCJNdWx0aXBsZUNob2ljZVwiLCBcIlNjYWxlXCIsIFwiQ2hlY2tMaXN0XCJdXHJcblxyXG4gY29uc3QgaW5zZXJ0V2lkZ2V0ID0gd2lkZ2V0cy5tYXAodyA9PiAoe1xyXG4gXHR2YWx1ZTogXCJpbnNlcnRcIit3LFxyXG4gXHRkaXNwbGF5OiAoKSA9PiB7IHJldHVybiBlbHQoXCJzcGFuXCIsbnVsbCwgdyl9XHJcbiB9KSlcclxuXHJcbmV4cG9ydCBjbGFzcyBXaWRnZXQgZXh0ZW5kcyBUZXh0YmxvY2sge31cclxuIFxyXG5XaWRnZXQucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcclxuXHRuYW1lOiBcImluc2VydFdpZGdldFwiLFxyXG5cdGxhYmVsOiBcIkluc2VydC4uLlwiLFxyXG5cdHNlbGVjdChwbSkge3JldHVybiB0cnVlfSxcclxuXHRwYXJhbXM6IFtcclxuXHQgICAgIHtuYW1lOiBcIldpZGdldCB0eXBlXCIsIHR5cGU6IFwic2VsZWN0XCIsIG9wdGlvbnM6IGluc2VydFdpZGdldCwgZGVmYXVsdExhYmVsOiBcIkluc2VydC4uLlwifVxyXG5cdF0sXHJcblx0cnVuKHBtLCB0eXBlKSB7XHJcblx0XHRsZXQgbWVudSA9IHBtLm1vZC5tZW51QmFyLm1lbnVcclxuXHRcdGxldCBjbWQgPSBwbS5jb21tYW5kc1t0eXBlXVxyXG5cdFx0aWYgKG1lbnUgJiYgY21kKSBtZW51LmVudGVyKHJlYWRQYXJhbXMoY21kKSlcclxuXHR9LFxyXG5cdGRpc3BsYXk6IFwic2VsZWN0XCIsXHJcblx0bWVudUdyb3VwOiBcImJsb2NrXCIsXHJcblx0bWVudVJhbms6IDk5XHJcbn0pXHJcblxyXG4gXHJcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5lbHQgPSBlbHQ7XG5leHBvcnRzLnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZTtcbmV4cG9ydHMucm1DbGFzcyA9IHJtQ2xhc3M7XG5leHBvcnRzLmFkZENsYXNzID0gYWRkQ2xhc3M7XG5leHBvcnRzLmNvbnRhaW5zID0gY29udGFpbnM7XG5leHBvcnRzLmluc2VydENTUyA9IGluc2VydENTUztcblxuZnVuY3Rpb24gZWx0KHRhZywgYXR0cnMpIHtcbiAgdmFyIHJlc3VsdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcbiAgaWYgKGF0dHJzKSBmb3IgKHZhciBfbmFtZSBpbiBhdHRycykge1xuICAgIGlmIChfbmFtZSA9PSBcInN0eWxlXCIpIHJlc3VsdC5zdHlsZS5jc3NUZXh0ID0gYXR0cnNbX25hbWVdO2Vsc2UgaWYgKGF0dHJzW19uYW1lXSAhPSBudWxsKSByZXN1bHQuc2V0QXR0cmlidXRlKF9uYW1lLCBhdHRyc1tfbmFtZV0pO1xuICB9XG5cbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuID4gMiA/IF9sZW4gLSAyIDogMCksIF9rZXkgPSAyOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgYXJnc1tfa2V5IC0gMl0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICBhZGQoYXJnc1tpXSwgcmVzdWx0KTtcbiAgfXJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGFkZCh2YWx1ZSwgdGFyZ2V0KSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIikgdmFsdWUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh2YWx1ZSk7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFkZCh2YWx1ZVtpXSwgdGFyZ2V0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0LmFwcGVuZENoaWxkKHZhbHVlKTtcbiAgfVxufVxuXG52YXIgcmVxRnJhbWUgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCB3aW5kb3cubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWU7XG5cbmZ1bmN0aW9uIHJlcXVlc3RBbmltYXRpb25GcmFtZShmKSB7XG4gIGlmIChyZXFGcmFtZSkgcmVxRnJhbWUoZik7ZWxzZSBzZXRUaW1lb3V0KGYsIDEwKTtcbn1cblxudmFyIGllX3VwdG8xMCA9IC9NU0lFIFxcZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbnZhciBpZV8xMXVwID0gL1RyaWRlbnRcXC8oPzpbNy05XXxcXGR7Mix9KVxcLi4qcnY6KFxcZCspLy5leGVjKG5hdmlnYXRvci51c2VyQWdlbnQpO1xuXG52YXIgYnJvd3NlciA9IHtcbiAgbWFjOiAvTWFjLy50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSksXG4gIGllX3VwdG8xMDogaWVfdXB0bzEwLFxuICBpZV8xMXVwOiBpZV8xMXVwLFxuICBpZTogaWVfdXB0bzEwIHx8IGllXzExdXAsXG4gIGdlY2tvOiAvZ2Vja29cXC9cXGQvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpXG59O1xuXG5leHBvcnRzLmJyb3dzZXIgPSBicm93c2VyO1xuZnVuY3Rpb24gY2xhc3NUZXN0KGNscykge1xuICByZXR1cm4gbmV3IFJlZ0V4cChcIihefFxcXFxzKVwiICsgY2xzICsgXCIoPzokfFxcXFxzKVxcXFxzKlwiKTtcbn1cblxuZnVuY3Rpb24gcm1DbGFzcyhub2RlLCBjbHMpIHtcbiAgdmFyIGN1cnJlbnQgPSBub2RlLmNsYXNzTmFtZTtcbiAgdmFyIG1hdGNoID0gY2xhc3NUZXN0KGNscykuZXhlYyhjdXJyZW50KTtcbiAgaWYgKG1hdGNoKSB7XG4gICAgdmFyIGFmdGVyID0gY3VycmVudC5zbGljZShtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCk7XG4gICAgbm9kZS5jbGFzc05hbWUgPSBjdXJyZW50LnNsaWNlKDAsIG1hdGNoLmluZGV4KSArIChhZnRlciA/IG1hdGNoWzFdICsgYWZ0ZXIgOiBcIlwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRDbGFzcyhub2RlLCBjbHMpIHtcbiAgdmFyIGN1cnJlbnQgPSBub2RlLmNsYXNzTmFtZTtcbiAgaWYgKCFjbGFzc1Rlc3QoY2xzKS50ZXN0KGN1cnJlbnQpKSBub2RlLmNsYXNzTmFtZSArPSAoY3VycmVudCA/IFwiIFwiIDogXCJcIikgKyBjbHM7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zKHBhcmVudCwgY2hpbGQpIHtcbiAgLy8gQW5kcm9pZCBicm93c2VyIGFuZCBJRSB3aWxsIHJldHVybiBmYWxzZSBpZiBjaGlsZCBpcyBhIHRleHQgbm9kZS5cbiAgaWYgKGNoaWxkLm5vZGVUeXBlICE9IDEpIGNoaWxkID0gY2hpbGQucGFyZW50Tm9kZTtcbiAgcmV0dXJuIGNoaWxkICYmIHBhcmVudC5jb250YWlucyhjaGlsZCk7XG59XG5cbmZ1bmN0aW9uIGluc2VydENTUyhjc3MpIHtcbiAgdmFyIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICBzdHlsZS50ZXh0Q29udGVudCA9IGNzcztcbiAgZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoc3R5bGUsIGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfc2VsZWN0aW9uID0gcmVxdWlyZShcIi4vc2VsZWN0aW9uXCIpO1xuXG52YXIgX2RvbSA9IHJlcXVpcmUoXCIuLi9kb21cIik7XG5cbnZhciBfa2V5cyA9IHJlcXVpcmUoXCIuL2tleXNcIik7XG5cbmZ1bmN0aW9uIG5vdGhpbmcoKSB7fVxuXG5mdW5jdGlvbiBlbnN1cmVTZWxlY3Rpb24ocG0pIHtcbiAgaWYgKHBtLnNlbGVjdGlvbi5ub2RlKSB7XG4gICAgdmFyIGZvdW5kID0gKDAsIF9zZWxlY3Rpb24uZmluZFNlbGVjdGlvbk5lYXIpKHBtLmRvYywgcG0uc2VsZWN0aW9uLmZyb20sIDEsIHRydWUpO1xuICAgIGlmIChmb3VuZCkgKDAsIF9zZWxlY3Rpb24uc2V0RE9NU2VsZWN0aW9uVG9Qb3MpKHBtLCBmb3VuZC5oZWFkKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIEEgYmFja2Ryb3Aga2V5bWFwIHVzZWQgdG8gbWFrZSBzdXJlIHdlIGFsd2F5cyBzdXBwcmVzcyBrZXlzIHRoYXRcbi8vIGhhdmUgYSBkYW5nZXJvdXMgZGVmYXVsdCBlZmZlY3QsIGV2ZW4gaWYgdGhlIGNvbW1hbmRzIHRoZXkgYXJlXG4vLyBib3VuZCB0byByZXR1cm4gZmFsc2UsIGFuZCB0byBtYWtlIHN1cmUgdGhhdCBjdXJzb3ItbW90aW9uIGtleXNcbi8vIGZpbmQgYSBjdXJzb3IgKGFzIG9wcG9zZWQgdG8gYSBub2RlIHNlbGVjdGlvbikgd2hlbiBwcmVzc2VkLlxuXG52YXIga2V5cyA9IHtcbiAgXCJFc2NcIjogbm90aGluZyxcbiAgXCJFbnRlclwiOiBub3RoaW5nLFxuICBcIk1vZC1FbnRlclwiOiBub3RoaW5nLFxuICBcIlNoaWZ0LUVudGVyXCI6IG5vdGhpbmcsXG4gIFwiQmFja3NwYWNlXCI6IG5vdGhpbmcsXG4gIFwiRGVsZXRlXCI6IG5vdGhpbmcsXG4gIFwiTW9kLUJcIjogbm90aGluZyxcbiAgXCJNb2QtSVwiOiBub3RoaW5nLFxuICBcIk1vZC1CYWNrc3BhY2VcIjogbm90aGluZyxcbiAgXCJNb2QtRGVsZXRlXCI6IG5vdGhpbmcsXG4gIFwiU2hpZnQtQmFja3NwYWNlXCI6IG5vdGhpbmcsXG4gIFwiU2hpZnQtRGVsZXRlXCI6IG5vdGhpbmcsXG4gIFwiU2hpZnQtTW9kLUJhY2tzcGFjZVwiOiBub3RoaW5nLFxuICBcIlNoaWZ0LU1vZC1EZWxldGVcIjogbm90aGluZyxcbiAgXCJNb2QtWlwiOiBub3RoaW5nLFxuICBcIk1vZC1ZXCI6IG5vdGhpbmcsXG4gIFwiU2hpZnQtTW9kLVpcIjogbm90aGluZyxcbiAgXCJDdHJsLURcIjogbm90aGluZyxcbiAgXCJDdHJsLUhcIjogbm90aGluZyxcbiAgXCJDdHJsLUFsdC1CYWNrc3BhY2VcIjogbm90aGluZyxcbiAgXCJBbHQtRFwiOiBub3RoaW5nLFxuICBcIkFsdC1EZWxldGVcIjogbm90aGluZyxcbiAgXCJBbHQtQmFja3NwYWNlXCI6IG5vdGhpbmcsXG5cbiAgXCJNb2QtQVwiOiBlbnN1cmVTZWxlY3Rpb25cbn07W1wiTGVmdFwiLCBcIlJpZ2h0XCIsIFwiVXBcIiwgXCJEb3duXCIsIFwiSG9tZVwiLCBcIkVuZFwiLCBcIlBhZ2VVcFwiLCBcIlBhZ2VEb3duXCJdLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICBrZXlzW2tleV0gPSBrZXlzW1wiU2hpZnQtXCIgKyBrZXldID0ga2V5c1tcIk1vZC1cIiArIGtleV0gPSBrZXlzW1wiU2hpZnQtTW9kLVwiICsga2V5XSA9IGtleXNbXCJBbHQtXCIgKyBrZXldID0ga2V5c1tcIlNoaWZ0LUFsdC1cIiArIGtleV0gPSBlbnN1cmVTZWxlY3Rpb247XG59KTtbXCJMZWZ0XCIsIFwiTW9kLUxlZnRcIiwgXCJSaWdodFwiLCBcIk1vZC1SaWdodFwiLCBcIlVwXCIsIFwiRG93blwiXS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIGRlbGV0ZSBrZXlzW2tleV07XG59KTtcblxuaWYgKF9kb20uYnJvd3Nlci5tYWMpIGtleXNbXCJDdHJsLUZcIl0gPSBrZXlzW1wiQ3RybC1CXCJdID0ga2V5c1tcIkN0cmwtUFwiXSA9IGtleXNbXCJDdHJsLU5cIl0gPSBrZXlzW1wiQWx0LUZcIl0gPSBrZXlzW1wiQWx0LUJcIl0gPSBrZXlzW1wiQ3RybC1BXCJdID0ga2V5c1tcIkN0cmwtRVwiXSA9IGtleXNbXCJDdHJsLVZcIl0gPSBrZXlzW1wiZ29QYWdlVXBcIl0gPSBlbnN1cmVTZWxlY3Rpb247XG5cbnZhciBjYXB0dXJlS2V5cyA9IG5ldyBfa2V5cy5LZXltYXAoa2V5cyk7XG5leHBvcnRzLmNhcHR1cmVLZXlzID0gY2FwdHVyZUtleXM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmlzV29yZENoYXIgPSBpc1dvcmRDaGFyO1xuZXhwb3J0cy5jaGFyQ2F0ZWdvcnkgPSBjaGFyQ2F0ZWdvcnk7XG5leHBvcnRzLmlzRXh0ZW5kaW5nQ2hhciA9IGlzRXh0ZW5kaW5nQ2hhcjtcbnZhciBub25BU0NJSVNpbmdsZUNhc2VXb3JkQ2hhciA9IC9bXFx1MDBkZlxcdTA1ODdcXHUwNTkwLVxcdTA1ZjRcXHUwNjAwLVxcdTA2ZmZcXHUzMDQwLVxcdTMwOWZcXHUzMGEwLVxcdTMwZmZcXHUzNDAwLVxcdTRkYjVcXHU0ZTAwLVxcdTlmY2NcXHVhYzAwLVxcdWQ3YWZdLztcblxuLy8gRXh0ZW5kaW5nIHVuaWNvZGUgY2hhcmFjdGVycy4gQSBzZXJpZXMgb2YgYSBub24tZXh0ZW5kaW5nIGNoYXIgK1xuLy8gYW55IG51bWJlciBvZiBleHRlbmRpbmcgY2hhcnMgaXMgdHJlYXRlZCBhcyBhIHNpbmdsZSB1bml0IGFzIGZhclxuLy8gYXMgZWRpdGluZyBhbmQgbWVhc3VyaW5nIGlzIGNvbmNlcm5lZC4gVGhpcyBpcyBub3QgZnVsbHkgY29ycmVjdCxcbi8vIHNpbmNlIHNvbWUgc2NyaXB0cy9mb250cy9icm93c2VycyBhbHNvIHRyZWF0IG90aGVyIGNvbmZpZ3VyYXRpb25zXG4vLyBvZiBjb2RlIHBvaW50cyBhcyBhIGdyb3VwLlxudmFyIGV4dGVuZGluZ0NoYXIgPSAvW1xcdTAzMDAtXFx1MDM2ZlxcdTA0ODMtXFx1MDQ4OVxcdTA1OTEtXFx1MDViZFxcdTA1YmZcXHUwNWMxXFx1MDVjMlxcdTA1YzRcXHUwNWM1XFx1MDVjN1xcdTA2MTAtXFx1MDYxYVxcdTA2NGItXFx1MDY1ZVxcdTA2NzBcXHUwNmQ2LVxcdTA2ZGNcXHUwNmRlLVxcdTA2ZTRcXHUwNmU3XFx1MDZlOFxcdTA2ZWEtXFx1MDZlZFxcdTA3MTFcXHUwNzMwLVxcdTA3NGFcXHUwN2E2LVxcdTA3YjBcXHUwN2ViLVxcdTA3ZjNcXHUwODE2LVxcdTA4MTlcXHUwODFiLVxcdTA4MjNcXHUwODI1LVxcdTA4MjdcXHUwODI5LVxcdTA4MmRcXHUwOTAwLVxcdTA5MDJcXHUwOTNjXFx1MDk0MS1cXHUwOTQ4XFx1MDk0ZFxcdTA5NTEtXFx1MDk1NVxcdTA5NjJcXHUwOTYzXFx1MDk4MVxcdTA5YmNcXHUwOWJlXFx1MDljMS1cXHUwOWM0XFx1MDljZFxcdTA5ZDdcXHUwOWUyXFx1MDllM1xcdTBhMDFcXHUwYTAyXFx1MGEzY1xcdTBhNDFcXHUwYTQyXFx1MGE0N1xcdTBhNDhcXHUwYTRiLVxcdTBhNGRcXHUwYTUxXFx1MGE3MFxcdTBhNzFcXHUwYTc1XFx1MGE4MVxcdTBhODJcXHUwYWJjXFx1MGFjMS1cXHUwYWM1XFx1MGFjN1xcdTBhYzhcXHUwYWNkXFx1MGFlMlxcdTBhZTNcXHUwYjAxXFx1MGIzY1xcdTBiM2VcXHUwYjNmXFx1MGI0MS1cXHUwYjQ0XFx1MGI0ZFxcdTBiNTZcXHUwYjU3XFx1MGI2MlxcdTBiNjNcXHUwYjgyXFx1MGJiZVxcdTBiYzBcXHUwYmNkXFx1MGJkN1xcdTBjM2UtXFx1MGM0MFxcdTBjNDYtXFx1MGM0OFxcdTBjNGEtXFx1MGM0ZFxcdTBjNTVcXHUwYzU2XFx1MGM2MlxcdTBjNjNcXHUwY2JjXFx1MGNiZlxcdTBjYzJcXHUwY2M2XFx1MGNjY1xcdTBjY2RcXHUwY2Q1XFx1MGNkNlxcdTBjZTJcXHUwY2UzXFx1MGQzZVxcdTBkNDEtXFx1MGQ0NFxcdTBkNGRcXHUwZDU3XFx1MGQ2MlxcdTBkNjNcXHUwZGNhXFx1MGRjZlxcdTBkZDItXFx1MGRkNFxcdTBkZDZcXHUwZGRmXFx1MGUzMVxcdTBlMzQtXFx1MGUzYVxcdTBlNDctXFx1MGU0ZVxcdTBlYjFcXHUwZWI0LVxcdTBlYjlcXHUwZWJiXFx1MGViY1xcdTBlYzgtXFx1MGVjZFxcdTBmMThcXHUwZjE5XFx1MGYzNVxcdTBmMzdcXHUwZjM5XFx1MGY3MS1cXHUwZjdlXFx1MGY4MC1cXHUwZjg0XFx1MGY4NlxcdTBmODdcXHUwZjkwLVxcdTBmOTdcXHUwZjk5LVxcdTBmYmNcXHUwZmM2XFx1MTAyZC1cXHUxMDMwXFx1MTAzMi1cXHUxMDM3XFx1MTAzOVxcdTEwM2FcXHUxMDNkXFx1MTAzZVxcdTEwNThcXHUxMDU5XFx1MTA1ZS1cXHUxMDYwXFx1MTA3MS1cXHUxMDc0XFx1MTA4MlxcdTEwODVcXHUxMDg2XFx1MTA4ZFxcdTEwOWRcXHUxMzVmXFx1MTcxMi1cXHUxNzE0XFx1MTczMi1cXHUxNzM0XFx1MTc1MlxcdTE3NTNcXHUxNzcyXFx1MTc3M1xcdTE3YjctXFx1MTdiZFxcdTE3YzZcXHUxN2M5LVxcdTE3ZDNcXHUxN2RkXFx1MTgwYi1cXHUxODBkXFx1MThhOVxcdTE5MjAtXFx1MTkyMlxcdTE5MjdcXHUxOTI4XFx1MTkzMlxcdTE5MzktXFx1MTkzYlxcdTFhMTdcXHUxYTE4XFx1MWE1NlxcdTFhNTgtXFx1MWE1ZVxcdTFhNjBcXHUxYTYyXFx1MWE2NS1cXHUxYTZjXFx1MWE3My1cXHUxYTdjXFx1MWE3ZlxcdTFiMDAtXFx1MWIwM1xcdTFiMzRcXHUxYjM2LVxcdTFiM2FcXHUxYjNjXFx1MWI0MlxcdTFiNmItXFx1MWI3M1xcdTFiODBcXHUxYjgxXFx1MWJhMi1cXHUxYmE1XFx1MWJhOFxcdTFiYTlcXHUxYzJjLVxcdTFjMzNcXHUxYzM2XFx1MWMzN1xcdTFjZDAtXFx1MWNkMlxcdTFjZDQtXFx1MWNlMFxcdTFjZTItXFx1MWNlOFxcdTFjZWRcXHUxZGMwLVxcdTFkZTZcXHUxZGZkLVxcdTFkZmZcXHUyMDBjXFx1MjAwZFxcdTIwZDAtXFx1MjBmMFxcdTJjZWYtXFx1MmNmMVxcdTJkZTAtXFx1MmRmZlxcdTMwMmEtXFx1MzAyZlxcdTMwOTlcXHUzMDlhXFx1YTY2Zi1cXHVhNjcyXFx1YTY3Y1xcdWE2N2RcXHVhNmYwXFx1YTZmMVxcdWE4MDJcXHVhODA2XFx1YTgwYlxcdWE4MjVcXHVhODI2XFx1YThjNFxcdWE4ZTAtXFx1YThmMVxcdWE5MjYtXFx1YTkyZFxcdWE5NDctXFx1YTk1MVxcdWE5ODAtXFx1YTk4MlxcdWE5YjNcXHVhOWI2LVxcdWE5YjlcXHVhOWJjXFx1YWEyOS1cXHVhYTJlXFx1YWEzMVxcdWFhMzJcXHVhYTM1XFx1YWEzNlxcdWFhNDNcXHVhYTRjXFx1YWFiMFxcdWFhYjItXFx1YWFiNFxcdWFhYjdcXHVhYWI4XFx1YWFiZVxcdWFhYmZcXHVhYWMxXFx1YWJlNVxcdWFiZThcXHVhYmVkXFx1ZGMwMC1cXHVkZmZmXFx1ZmIxZVxcdWZlMDAtXFx1ZmUwZlxcdWZlMjAtXFx1ZmUyNlxcdWZmOWVcXHVmZjlmXS87XG5cbmZ1bmN0aW9uIGlzV29yZENoYXIoY2gpIHtcbiAgcmV0dXJuICgvXFx3Ly50ZXN0KGNoKSB8fCBpc0V4dGVuZGluZ0NoYXIoY2gpIHx8IGNoID4gXCJcXHg4MFwiICYmIChjaC50b1VwcGVyQ2FzZSgpICE9IGNoLnRvTG93ZXJDYXNlKCkgfHwgbm9uQVNDSUlTaW5nbGVDYXNlV29yZENoYXIudGVzdChjaCkpXG4gICk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBjYXRlZ29yeSBvZiBhIGdpdmVuIGNoYXJhY3Rlci4gRWl0aGVyIGEgXCJzcGFjZVwiLFxuICogYSBjaGFyYWN0ZXIgdGhhdCBjYW4gYmUgcGFydCBvZiBhIHdvcmQgKFwid29yZFwiKSwgb3IgYW55dGhpbmcgZWxzZSAoXCJvdGhlclwiKS5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGNoIFRoZSBjaGFyYWN0ZXIuXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gY2hhckNhdGVnb3J5KGNoKSB7XG4gIHJldHVybiAoL1xccy8udGVzdChjaCkgPyBcInNwYWNlXCIgOiBpc1dvcmRDaGFyKGNoKSA/IFwid29yZFwiIDogXCJvdGhlclwiXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzRXh0ZW5kaW5nQ2hhcihjaCkge1xuICByZXR1cm4gY2guY2hhckNvZGVBdCgwKSA+PSA3NjggJiYgZXh0ZW5kaW5nQ2hhci50ZXN0KGNoKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9zbGljZWRUb0FycmF5ID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gc2xpY2VJdGVyYXRvcihhcnIsIGkpIHsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfZSA9IHVuZGVmaW5lZDsgdHJ5IHsgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkgeyBfYXJyLnB1c2goX3MudmFsdWUpOyBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7IH0gfSBjYXRjaCAoZXJyKSB7IF9kID0gdHJ1ZTsgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0pIF9pW1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfSByZXR1cm4gZnVuY3Rpb24gKGFyciwgaSkgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IHJldHVybiBhcnI7IH0gZWxzZSBpZiAoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChhcnIpKSB7IHJldHVybiBzbGljZUl0ZXJhdG9yKGFyciwgaSk7IH0gZWxzZSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpOyB9IH07IH0pKCk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZXhwb3J0cy5kZWZpbmVQYXJhbUhhbmRsZXIgPSBkZWZpbmVQYXJhbUhhbmRsZXI7XG5leHBvcnRzLmluaXRDb21tYW5kcyA9IGluaXRDb21tYW5kcztcbmV4cG9ydHMuZGVmYXVsdEtleW1hcCA9IGRlZmF1bHRLZXltYXA7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgYXJyMltpXSA9IGFycltpXTsgcmV0dXJuIGFycjI7IH0gZWxzZSB7IHJldHVybiBBcnJheS5mcm9tKGFycik7IH0gfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgX21vZGVsID0gcmVxdWlyZShcIi4uL21vZGVsXCIpO1xuXG52YXIgX3RyYW5zZm9ybSA9IHJlcXVpcmUoXCIuLi90cmFuc2Zvcm1cIik7XG5cbnZhciBfZG9tID0gcmVxdWlyZShcIi4uL2RvbVwiKTtcblxudmFyIF91dGlsU29ydGVkaW5zZXJ0ID0gcmVxdWlyZShcIi4uL3V0aWwvc29ydGVkaW5zZXJ0XCIpO1xuXG52YXIgX3V0aWxTb3J0ZWRpbnNlcnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdXRpbFNvcnRlZGluc2VydCk7XG5cbnZhciBfY2hhciA9IHJlcXVpcmUoXCIuL2NoYXJcIik7XG5cbnZhciBfa2V5cyA9IHJlcXVpcmUoXCIuL2tleXNcIik7XG5cbnZhciBfc2VsZWN0aW9uID0gcmVxdWlyZShcIi4vc2VsZWN0aW9uXCIpO1xuXG52YXIgX29wdGlvbnMgPSByZXF1aXJlKFwiLi9vcHRpb25zXCIpO1xuXG52YXIgcGFyYW1IYW5kbGVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbnZhciBlbXB0eSA9IFtdO1xuXG4vLyBGSVhNRSBkb2N1bWVudCBpbmRpdmlkdWFsIGNvbW1hbmRzXG5cbi8vIDs7IEEgY29tbWFuZCBpcyBhIG5hbWVkIHBpZWNlIG9mIGZ1bmN0aW9uYWxpdHkgdGhhdCBjYW4gYmUgYm91bmQgdG9cbi8vIGEga2V5LCBzaG93biBpbiB0aGUgbWVudSwgb3Igb3RoZXJ3aXNlIGV4cG9zZWQgdG8gdGhlIHVzZXIuXG4vL1xuLy8gVGhlIGNvbW1hbmRzIGF2YWlsYWJsZSBpbiBhIGdpdmVuIGVkaXRvciBhcmUgZ2F0aGVyZWQgZnJvbSB0aGVcbi8vIFtyZWdpc3RyaWVzXSgjcmVnaXN0cmllcykgZ2l2ZW4gdG8gdGhlIGVkaXRvciwgYW5kIHRoZSBub2RlIGFuZFxuLy8gbWFyayB0eXBlcyBpbiBpdHMgW3NjaGVtYV0oI1NjaGVtYS5yZWdpc3RyeSkuIFVzZSB0aGVcbi8vIFtgcmVnaXN0ZXJgXSgjTm9kZVR5cGUucmVnaXN0ZXIpIG1ldGhvZCB3aXRoIGBcImNvbW1hbmRcImAgYXMgdGhlXG4vLyBuYW1lIGFuZCBhIGBDb21tYW5kU3BlY2AgYXMgdmFsdWUgdG8gZGVmaW5lIGEgbmV3IGNvbW1hbmQuXG5cbnZhciBDb21tYW5kID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQ29tbWFuZChzcGVjLCBzZWxmKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENvbW1hbmQpO1xuXG4gICAgLy8gOjogc3RyaW5nIFRoZSBuYW1lIG9mIHRoZSBjb21tYW5kLlxuICAgIHRoaXMubmFtZSA9IHNwZWMubmFtZTtcbiAgICBpZiAoIXRoaXMubmFtZSkgdGhyb3cgbmV3IEVycm9yKFwiVHJ5aW5nIHRvIGRlZmluZSBhIGNvbW1hbmQgd2l0aG91dCBhIG5hbWVcIik7XG4gICAgLy8gOjogQ29tbWFuZFNwZWMgVGhlIGNvbW1hbmQncyBzcGVjaWZ5aW5nIG9iamVjdC5cbiAgICB0aGlzLnNwZWMgPSBzcGVjO1xuICAgIHRoaXMuc2VsZiA9IHNlbGY7XG4gIH1cblxuICAvLyA7OyAjcGF0aD1Db21tYW5kU3BlYyAja2luZD1pbnRlcmZhY2UgI3RvYz1mYWxzZVxuICAvLyBDb21tYW5kcyBhcmUgZGVmaW5lZCB1c2luZyBvYmplY3RzIHRoYXQgc3BlY2lmeSB2YXJpb3VzIGFzcGVjdHMgb2ZcbiAgLy8gdGhlIGNvbW1hbmQuIFRoZSBvbmx5IHByb3BlcnRpZXMgdGhhdCBfbXVzdF8gYXBwZWFyIGluIGEgY29tbWFuZFxuICAvLyBzcGVjIGFyZSBbYG5hbWVgXSgjQ29tbWFuZFNwZWMubmFtZSkgYW5kIFtgcnVuYF0oI0NvbW1hbmRTcGVjLnJ1bikuXG4gIC8vIFlvdSBzaG91bGQgcHJvYmFibHkgYWxzbyBnaXZlIHlvdXIgY29tbWFuZHMgYSBgbGFiZWxgLlxuXG4gIC8vIDo6IHN0cmluZyAjcGF0aD1Db21tYW5kU3BlYy5uYW1lXG4gIC8vIFRoZSBuYW1lIG9mIHRoZSBjb21tYW5kLCB3aGljaCB3aWxsIGJlIGl0cyBrZXkgaW5cbiAgLy8gYFByb3NlTWlycm9yLmNvbW1hbmRzYCwgYW5kIHRoZSB0aGluZyBwYXNzZWQgdG9cbiAgLy8gW2BleGVjQ29tbWFuZGBdKCNQcm9zZU1pcnJvci5leGVjQ29tbWFuZCkuXG5cbiAgLy8gOjogc3RyaW5nICNwYXRoPUNvbW1hbmRTcGVjLmxhYmVsXG4gIC8vIEEgdXNlci1mYWNpbmcgbGFiZWwgZm9yIHRoZSBjb21tYW5kLiBUaGlzIHdpbGwgYmUgdXNlZCwgYW1vbmcgb3RoZXJcbiAgLy8gdGhpbmdzLiBhcyB0aGUgdG9vbHRpcCB0aXRsZSBmb3IgdGhlIGNvbW1hbmQncyBtZW51IGl0ZW0uIElmIHRoZXJlXG4gIC8vIGlzIG5vIGBsYWJlbGAsIHRoZSBjb21tYW5kJ3MgYG5hbWVgIHdpbGwgYmUgdXNlZCBpbnN0ZWFkLlxuXG4gIC8vIDo6IChwbTogUHJvc2VNaXJyb3IsIC4uLnBhcmFtczogW2FueV0pIOKGkiA/Ym9vbCAjcGF0aD1Db21tYW5kU3BlYy5ydW5cbiAgLy8gVGhlIGZ1bmN0aW9uIHRoYXQgZXhlY3V0ZXMgdGhlIGNvbW1hbmQuIElmIHRoZSBjb21tYW5kIGhhc1xuICAvLyBbcGFyYW1ldGVyc10oI0NvbW1hbmRTcGVjLnBhcmFtcyksIHRoZWlyIHZhbHVlcyBhcmUgcGFzc2VkIGFzXG4gIC8vIGFyZ3VtZW50cy4gRm9yIGNvbW1hbmRzIFtyZWdpc3RlcmVkXSgjTm9kZVR5cGUucmVnaXN0ZXIpIG9uIG5vZGUgb3JcbiAgLy8gbWFyayB0eXBlcywgYHRoaXNgIHdpbGwgYmUgYm91bmQgdG8gdGhlIG5vZGUgb3IgbWFyayB0eXBlIHdoZW4gdGhpc1xuICAvLyBmdW5jdGlvbiBpcyByYW4uIFNob3VsZCByZXR1cm4gYGZhbHNlYCB3aGVuIHRoZSBjb21tYW5kIGNvdWxkIG5vdFxuICAvLyBiZSBleGVjdXRlZC5cblxuICAvLyA6OiBbQ29tbWFuZFBhcmFtXSAjcGF0aD1Db21tYW5kU3BlYy5wYXJhbXNcbiAgLy8gVGhlIHBhcmFtZXRlcnMgdGhhdCB0aGlzIGNvbW1hbmQgZXhwZWN0cy5cblxuICAvLyA6OiAocG06IFByb3NlTWlycm9yKSDihpIgYm9vbCAjcGF0aD1Db21tYW5kU3BlYy5zZWxlY3RcbiAgLy8gVGhlIGZ1bmN0aW9uIHVzZWQgdG8gW3NlbGVjdF0oI0NvbW1hbmQuc2VsZWN0KSB0aGUgY29tbWFuZC4gYHRoaXNgXG4gIC8vIHdpbGwgYWdhaW4gYmUgYm91bmQgdG8gYSBub2RlIG9yIG1hcmsgdHlwZSwgd2hlbiBhdmFpbGFibGUuXG5cbiAgLy8gOjogKHBtOiBQcm9zZU1pcnJvcikg4oaSIGJvb2wgI3BhdGg9Q29tbWFuZFNwZWMuYWN0aXZlXG4gIC8vIFRoZSBmdW5jdGlvbiB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBjb21tYW5kIGlzXG4gIC8vIFthY3RpdmVdKCNDb21tYW5kLmFjdGl2ZSkuIGB0aGlzYCByZWZlcnMgdG8gdGhlIGFzc29jaWF0ZWQgbm9kZSBvclxuICAvLyBtYXJrIHR5cGUuXG5cbiAgLy8gOjogdW5pb248c3RyaW5nLCBbc3RyaW5nXT4gI3BhdGg9Q29tbWFuZFNwZWMua2V5XG4gIC8vIFRoZSBkZWZhdWx0IGtleSBiaW5kaW5nIG9yIGJpbmRpbmdzIGZvciB0aGlzIGNvbW1hbmQuXG5cbiAgLy8gOjogdW5pb248c3RyaW5nLCBbc3RyaW5nXT4gI3BhdGg9Q29tbWFuZFNwZWMucGNLZXlcbiAgLy8gRGVmYXVsdCBrZXkgYmluZGluZyBvciBiaW5kaW5ncyBzcGVjaWZpYyB0byBub24tTWFjIHBsYXRmb3Jtcy5cblxuICAvLyA6OiB1bmlvbjxzdHJpbmcsIFtzdHJpbmddPiAjcGF0aD1Db21tYW5kU3BlYy5tYWNLZXlcbiAgLy8gRGVmYXVsdCBrZXkgYmluZGluZyBvciBiaW5kaW5ncyBzcGVjaWZpYyB0byB0aGUgTWFjIHBsYXRmb3JtLlxuXG4gIC8vIEZJWE1FIGRvY3VtZW50IG1lbnUgYW5kIGljb24gcHJvcGVydGllc1xuXG4gIC8vIDs7ICNwYXRoPUNvbW1hbmRQYXJhbSAja2luZD1pbnRlcmZhY2UgI3RvYz1mYWxzZVxuICAvLyBUaGUgcGFyYW1ldGVycyB0aGF0IGEgY29tbWFuZCBjYW4gdGFrZSBhcmUgc3BlY2lmaWVkIHVzaW5nIG9iamVjdHNcbiAgLy8gd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG5cbiAgLy8gOjogc3RyaW5nICNwYXRoPUNvbW1hbmRQYXJhbS5sYWJlbFxuICAvLyBUaGUgdXNlci1mYWNpbmcgbmFtZSBvZiB0aGUgcGFyYW1ldGVyLiBTaG93biB0byB0aGUgdXNlciB3aGVuXG4gIC8vIHByb21wdGluZyBmb3IgdGhpcyBwYXJhbWV0ZXIuXG5cbiAgLy8gOjogc3RyaW5nICNwYXRoPUNvbW1hbmRQYXJhbS50eXBlXG4gIC8vIFRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIuIFN1cHBvcnRlZCB0eXBlcyBhcmUgYFwidGV4dFwiYCBhbmQgYFwic2VsZWN0XCJgLlxuXG4gIC8vIDo6IGFueSAjcGF0aD1Db21tYW5kUGFyYW0uZGVmYXVsdFxuICAvLyBBIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwYXJhbWV0ZXIuXG5cbiAgLy8gOjogKHN0cmluZywgKHBtOiBQcm9zZU1pcnJvciwgY21kOiBDb21tYW5kLCBjYWxsYmFjazogKD9bYW55XSkpKVxuICAvLyBSZWdpc3RlciBhIHBhcmFtZXRlciBoYW5kbGVyLCB3aGljaCBpcyBhIGZ1bmN0aW9uIHRoYXQgcHJvbXB0cyB0aGVcbiAgLy8gdXNlciB0byBlbnRlciB2YWx1ZXMgZm9yIGEgY29tbWFuZCdzIFtwYXJhbWV0ZXJzXSgjQ29tbWFuZFBhcmFtKSwgYW5kXG4gIC8vIGNhbGxzIGEgY2FsbGJhY2sgd2l0aCB0aGUgdmFsdWVzIHJlY2VpdmVkLiBTZWUgYWxzbyB0aGVcbiAgLy8gW2Bjb21tYW5kUGFyYW1IYW5kbGVyYCBvcHRpb25dKCNjb21tYW5kUGFyYW1IYW5kbGVyKS5cblxuICAvLyA6OiAoUHJvc2VNaXJyb3IsID9bYW55XSkg4oaSID9ib29sXG4gIC8vIEV4ZWN1dGUgdGhpcyBjb21tYW5kLiBJZiB0aGUgY29tbWFuZCB0YWtlc1xuICAvLyBbcGFyYW1ldGVyc10oI0NvbW1hbmQucGFyYW1zKSwgdGhleSBjYW4gYmUgcGFzc2VkIGFzIHNlY29uZFxuICAvLyBhcmd1bWVudCBoZXJlLCBvciBvbWl0dGVkLCBpbiB3aGljaCBjYXNlIGEgW3BhcmFtZXRlclxuICAvLyBoYW5kbGVyXSgjZGVmaW5lUGFyYW1IYW5kbGVyKSB3aWxsIGJlIGNhbGxlZCB0byBwcm9tcHQgdGhlIHVzZXJcbiAgLy8gZm9yIHZhbHVlcy5cbiAgLy9cbiAgLy8gUmV0dXJucyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGNvbW1hbmQgc3BlYydzIFtgcnVuYFxuICAvLyBtZXRob2RdKCNDb21tYW5kU3BlYy5ydW4pLCBvciBgZmFsc2VgIGlmIHRoZSBjb21tYW5kIGNvdWxkIG5vdCBiZVxuICAvLyByYW4uXG5cbiAgX2NyZWF0ZUNsYXNzKENvbW1hbmQsIFt7XG4gICAga2V5OiBcImV4ZWNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZXhlYyhwbSwgcGFyYW1zKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB2YXIgcnVuID0gdGhpcy5zcGVjLnJ1bjtcbiAgICAgIGlmICghdGhpcy5wYXJhbXMubGVuZ3RoKSByZXR1cm4gcnVuLmNhbGwodGhpcy5zZWxmLCBwbSk7XG4gICAgICBpZiAocGFyYW1zKSByZXR1cm4gcnVuLmNhbGwuYXBwbHkocnVuLCBbdGhpcy5zZWxmLCBwbV0uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShwYXJhbXMpKSk7XG4gICAgICB2YXIgaGFuZGxlciA9IGdldFBhcmFtSGFuZGxlcihwbSk7XG4gICAgICBpZiAoIWhhbmRsZXIpIHJldHVybiBmYWxzZTtcbiAgICAgIGhhbmRsZXIocG0sIHRoaXMsIGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgaWYgKHBhcmFtcykgcnVuLmNhbGwuYXBwbHkocnVuLCBbX3RoaXMuc2VsZiwgcG1dLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocGFyYW1zKSkpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gOjogKFByb3NlTWlycm9yKSDihpIgYm9vbFxuICAgIC8vIEFzayB0aGlzIGNvbW1hbmQgd2hldGhlciBpdCBpcyBjdXJyZW50bHkgcmVsZXZhbnQsIGdpdmVuIHRoZVxuICAgIC8vIGVkaXRvcidzIGRvY3VtZW50IGFuZCBzZWxlY3Rpb24uIElmIHRoZSBjb21tYW5kIGRvZXMgbm90IGRlZmluZSBhXG4gICAgLy8gW2BzZWxlY3RgXSgjQ29tbWFuZFNwZWMuc2VsZWN0KSBtZXRob2QsIHRoaXMgYWx3YXlzIHJldHVybnMgdHJ1ZS5cbiAgfSwge1xuICAgIGtleTogXCJzZWxlY3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2VsZWN0KHBtKSB7XG4gICAgICB2YXIgZiA9IHRoaXMuc3BlYy5zZWxlY3Q7XG4gICAgICByZXR1cm4gZiA/IGYuY2FsbCh0aGlzLnNlbGYsIHBtKSA6IHRydWU7XG4gICAgfVxuXG4gICAgLy8gOjogKFByb3NlTWlycm9yKSDihpIgYm9vbFxuICAgIC8vIEFzayB0aGlzIGNvbW1hbmQgd2hldGhlciBpdCBpcyDigJxhY3RpdmXigJ0uIFRoaXMgaXMgbW9zdGx5IHVzZWQgdG9cbiAgICAvLyBzdHlsZSBpbmxpbmUgbWFyayBpY29ucyAoc3VjaCBhcyBzdHJvbmcpIGRpZmZlcmVudGx5IHdoZW4gdGhlXG4gICAgLy8gc2VsZWN0aW9uIGNvbnRhaW5zIHN1Y2ggbWFya3MuXG4gIH0sIHtcbiAgICBrZXk6IFwiYWN0aXZlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFjdGl2ZShwbSkge1xuICAgICAgdmFyIGYgPSB0aGlzLnNwZWMuYWN0aXZlO1xuICAgICAgcmV0dXJuIGYgPyBmLmNhbGwodGhpcy5zZWxmLCBwbSkgOiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyA6OiBbQ29tbWFuZFBhcmFtXVxuICAgIC8vIEdldCB0aGUgbGlzdCBvZiBwYXJhbWV0ZXJzIHRoYXQgdGhpcyBjb21tYW5kIGV4cGVjdHMuXG4gIH0sIHtcbiAgICBrZXk6IFwicGFyYW1zXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zcGVjLnBhcmFtcyB8fCBlbXB0eTtcbiAgICB9XG5cbiAgICAvLyA6OiBzdHJpbmdcbiAgICAvLyBHZXQgdGhlIGxhYmVsIGZvciB0aGlzIGNvbW1hbmQuXG4gIH0sIHtcbiAgICBrZXk6IFwibGFiZWxcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNwZWMubGFiZWwgfHwgdGhpcy5uYW1lO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBDb21tYW5kO1xufSkoKTtcblxuZXhwb3J0cy5Db21tYW5kID0gQ29tbWFuZDtcblxuZnVuY3Rpb24gZGVmaW5lUGFyYW1IYW5kbGVyKG5hbWUsIGhhbmRsZXIpIHtcbiAgcGFyYW1IYW5kbGVyc1tuYW1lXSA9IGhhbmRsZXI7XG59XG5cbmZ1bmN0aW9uIGdldFBhcmFtSGFuZGxlcihwbSkge1xuICB2YXIgb3B0aW9uID0gcG0ub3B0aW9ucy5jb21tYW5kUGFyYW1IYW5kbGVyO1xuICBpZiAob3B0aW9uICYmIHBhcmFtSGFuZGxlcnNbb3B0aW9uXSkgcmV0dXJuIHBhcmFtSGFuZGxlcnNbb3B0aW9uXTtcbn1cblxuZnVuY3Rpb24gaW5pdENvbW1hbmRzKHBtKSB7XG4gIHZhciByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBwbS5yZWdpc3RyeShcImNvbW1hbmRcIiwgZnVuY3Rpb24gKHNwZWMsIHR5cGUpIHtcbiAgICByZXN1bHRbc3BlYy5uYW1lXSA9IG5ldyBDb21tYW5kKHNwZWMsIHR5cGUpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdEtleW1hcChwbSkge1xuICB2YXIgYmluZGluZ3MgPSB7fTtcbiAgZnVuY3Rpb24gYWRkKGNvbW1hbmQsIGtleSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGtleSkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFkZChjb21tYW5kLCBrZXlbaV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoa2V5KSB7XG4gICAgICB2YXIgX2QkJGV4ZWMgPSAvXiguKz8pKD86XFwoKFxcZCspXFwpKT8kLy5leGVjKGtleSk7XG5cbiAgICAgIHZhciBfZCQkZXhlYzIgPSBfc2xpY2VkVG9BcnJheShfZCQkZXhlYywgMyk7XG5cbiAgICAgIHZhciBfID0gX2QkJGV4ZWMyWzBdO1xuICAgICAgdmFyIF9uYW1lID0gX2QkJGV4ZWMyWzFdO1xuICAgICAgdmFyIF9kJCRleGVjMiQyID0gX2QkJGV4ZWMyWzJdO1xuICAgICAgdmFyIHJhbmsgPSBfZCQkZXhlYzIkMiA9PT0gdW5kZWZpbmVkID8gNTAgOiBfZCQkZXhlYzIkMjtcblxuICAgICAgKDAsIF91dGlsU29ydGVkaW5zZXJ0MltcImRlZmF1bHRcIl0pKGJpbmRpbmdzW19uYW1lXSB8fCAoYmluZGluZ3NbX25hbWVdID0gW10pLCB7IGNvbW1hbmQ6IGNvbW1hbmQsIHJhbms6IHJhbmsgfSwgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGEucmFuayAtIGIucmFuaztcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBmb3IgKHZhciBfbmFtZTIgaW4gcG0uY29tbWFuZHMpIHtcbiAgICB2YXIgY21kID0gcG0uY29tbWFuZHNbX25hbWUyXTtcbiAgICBhZGQoX25hbWUyLCBjbWQuc3BlYy5rZXkpO1xuICAgIGFkZChfbmFtZTIsIF9kb20uYnJvd3Nlci5tYWMgPyBjbWQuc3BlYy5tYWNLZXkgOiBjbWQuc3BlYy5wY0tleSk7XG4gIH1cblxuICBmb3IgKHZhciBrZXkgaW4gYmluZGluZ3MpIHtcbiAgICBiaW5kaW5nc1trZXldID0gYmluZGluZ3Nba2V5XS5tYXAoZnVuY3Rpb24gKGIpIHtcbiAgICAgIHJldHVybiBiLmNvbW1hbmQ7XG4gICAgfSk7XG4gIH1yZXR1cm4gbmV3IF9rZXlzLktleW1hcChiaW5kaW5ncyk7XG59XG5cbnZhciBhbmRTY3JvbGwgPSB7IHNjcm9sbEludG9WaWV3OiB0cnVlIH07XG5cbl9tb2RlbC5IYXJkQnJlYWsucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJpbnNlcnRIYXJkQnJlYWtcIixcbiAgbGFiZWw6IFwiSW5zZXJ0IGhhcmQgYnJlYWtcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICB2YXIgX3BtJHNlbGVjdGlvbiA9IHBtLnNlbGVjdGlvbjtcbiAgICB2YXIgbm9kZSA9IF9wbSRzZWxlY3Rpb24ubm9kZTtcbiAgICB2YXIgZnJvbSA9IF9wbSRzZWxlY3Rpb24uZnJvbTtcblxuICAgIGlmIChub2RlICYmIG5vZGUuaXNCbG9jaykgcmV0dXJuIGZhbHNlO2Vsc2UgaWYgKHBtLmRvYy5wYXRoKGZyb20ucGF0aCkudHlwZS5pc0NvZGUpIHJldHVybiBwbS50ci50eXBlVGV4dChcIlxcblwiKS5hcHBseShhbmRTY3JvbGwpO2Vsc2UgcmV0dXJuIHBtLnRyLnJlcGxhY2VTZWxlY3Rpb24odGhpcy5jcmVhdGUoKSkuYXBwbHkoYW5kU2Nyb2xsKTtcbiAgfSxcbiAga2V5OiBbXCJNb2QtRW50ZXJcIiwgXCJTaGlmdC1FbnRlclwiXVxufSk7XG5cbmZ1bmN0aW9uIG1hcmtBY3RpdmUocG0sIHR5cGUpIHtcbiAgdmFyIHNlbCA9IHBtLnNlbGVjdGlvbjtcbiAgaWYgKHNlbC5lbXB0eSkgcmV0dXJuIHR5cGUuaXNJblNldChwbS5hY3RpdmVNYXJrcygpKTtlbHNlIHJldHVybiBwbS5kb2MucmFuZ2VIYXNNYXJrKHNlbC5mcm9tLCBzZWwudG8sIHR5cGUpO1xufVxuXG5mdW5jdGlvbiBjYW5BZGRJbmxpbmUocG0sIHR5cGUpIHtcbiAgdmFyIF9wbSRzZWxlY3Rpb24yID0gcG0uc2VsZWN0aW9uO1xuICB2YXIgZnJvbSA9IF9wbSRzZWxlY3Rpb24yLmZyb207XG4gIHZhciB0byA9IF9wbSRzZWxlY3Rpb24yLnRvO1xuICB2YXIgZW1wdHkgPSBfcG0kc2VsZWN0aW9uMi5lbXB0eTtcblxuICBpZiAoZW1wdHkpIHJldHVybiAhdHlwZS5pc0luU2V0KHBtLmFjdGl2ZU1hcmtzKCkpICYmIHBtLmRvYy5wYXRoKGZyb20ucGF0aCkudHlwZS5jYW5Db250YWluTWFyayh0eXBlKTtcbiAgdmFyIGNhbiA9IGZhbHNlO1xuICBwbS5kb2Mubm9kZXNCZXR3ZWVuKGZyb20sIHRvLCBmdW5jdGlvbiAobm9kZSkge1xuICAgIGlmIChjYW4gfHwgbm9kZS5pc1RleHRibG9jayAmJiAhbm9kZS50eXBlLmNhbkNvbnRhaW5NYXJrKHR5cGUpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKG5vZGUuaXNJbmxpbmUgJiYgIXR5cGUuaXNJblNldChub2RlLm1hcmtzKSkgY2FuID0gdHJ1ZTtcbiAgfSk7XG4gIHJldHVybiBjYW47XG59XG5cbmZ1bmN0aW9uIG1hcmtBcHBsaWVzKHBtLCB0eXBlKSB7XG4gIHZhciBfcG0kc2VsZWN0aW9uMyA9IHBtLnNlbGVjdGlvbjtcbiAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uMy5mcm9tO1xuICB2YXIgdG8gPSBfcG0kc2VsZWN0aW9uMy50bztcblxuICB2YXIgcmVsZXZhbnQgPSBmYWxzZTtcbiAgcG0uZG9jLm5vZGVzQmV0d2Vlbihmcm9tLCB0bywgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBpZiAobm9kZS5pc1RleHRibG9jaykge1xuICAgICAgaWYgKG5vZGUudHlwZS5jYW5Db250YWluTWFyayh0eXBlKSkgcmVsZXZhbnQgPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZWxldmFudDtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVNYXJrQ29tbWFuZHModHlwZSwgbmFtZSwgbGFiZWxOYW1lLCBzcGVjKSB7XG4gIGlmICghbGFiZWxOYW1lKSBsYWJlbE5hbWUgPSBuYW1lO1xuICB2YXIgY2FwID0gbmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSk7XG4gIHR5cGUucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgICBuYW1lOiBcInNldFwiICsgY2FwLFxuICAgIGxhYmVsOiBcIlNldCBcIiArIGxhYmVsTmFtZSxcbiAgICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgICAgcG0uc2V0TWFyayh0aGlzLCB0cnVlKTtcbiAgICB9LFxuICAgIHNlbGVjdDogZnVuY3Rpb24gc2VsZWN0KHBtKSB7XG4gICAgICByZXR1cm4gY2FuQWRkSW5saW5lKHBtLCB0aGlzKTtcbiAgICB9LFxuICAgIGljb246IHsgZnJvbTogbmFtZSB9XG4gIH0pO1xuICB0eXBlLnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gICAgbmFtZTogXCJ1bnNldFwiICsgY2FwLFxuICAgIGxhYmVsOiBcIlJlbW92ZSBcIiArIGxhYmVsTmFtZSxcbiAgICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgICAgcG0uc2V0TWFyayh0aGlzLCBmYWxzZSk7XG4gICAgfSxcbiAgICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdChwbSkge1xuICAgICAgcmV0dXJuIG1hcmtBY3RpdmUocG0sIHRoaXMpO1xuICAgIH0sXG4gICAgaWNvbjogeyBmcm9tOiBuYW1lIH1cbiAgfSk7XG4gIHZhciBjb21tYW5kID0ge1xuICAgIG5hbWU6IG5hbWUsXG4gICAgbGFiZWw6IFwiVG9nZ2xlIFwiICsgbGFiZWxOYW1lLFxuICAgIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgICBwbS5zZXRNYXJrKHRoaXMsIG51bGwpO1xuICAgIH0sXG4gICAgYWN0aXZlOiBmdW5jdGlvbiBhY3RpdmUocG0pIHtcbiAgICAgIHJldHVybiBtYXJrQWN0aXZlKHBtLCB0aGlzKTtcbiAgICB9LFxuICAgIHNlbGVjdDogZnVuY3Rpb24gc2VsZWN0KHBtKSB7XG4gICAgICByZXR1cm4gbWFya0FwcGxpZXMocG0sIHRoaXMpO1xuICAgIH1cbiAgfTtcbiAgZm9yICh2YXIgcHJvcCBpbiBzcGVjKSB7XG4gICAgY29tbWFuZFtwcm9wXSA9IHNwZWNbcHJvcF07XG4gIH10eXBlLnJlZ2lzdGVyKFwiY29tbWFuZFwiLCBjb21tYW5kKTtcbn1cblxuZ2VuZXJhdGVNYXJrQ29tbWFuZHMoX21vZGVsLlN0cm9uZ01hcmssIFwic3Ryb25nXCIsIG51bGwsIHtcbiAgbWVudUdyb3VwOiBcImlubGluZVwiLCBtZW51UmFuazogMjAsXG4gIGljb246IHtcbiAgICB3aWR0aDogODA1LCBoZWlnaHQ6IDEwMjQsXG4gICAgcGF0aDogXCJNMzE3IDg2OXE0MiAxOCA4MCAxOCAyMTQgMCAyMTQtMTkxIDAtNjUtMjMtMTAyLTE1LTI1LTM1LTQydC0zOC0yNi00Ni0xNC00OC02LTU0LTFxLTQxIDAtNTcgNSAwIDMwLTAgOTB0LTAgOTBxMCA0LTAgMzh0LTAgNTUgMiA0NyA2IDM4ek0zMDkgNDQycTI0IDQgNjIgNCA0NiAwIDgxLTd0NjItMjUgNDItNTEgMTQtODFxMC00MC0xNi03MHQtNDUtNDYtNjEtMjQtNzAtOHEtMjggMC03NCA3IDAgMjggMiA4NnQyIDg2cTAgMTUtMCA0NXQtMCA0NXEwIDI2IDAgMzl6TTAgOTUwbDEtNTNxOC0yIDQ4LTl0NjAtMTVxNC02IDctMTV0NC0xOSAzLTE4IDEtMjEgMC0xOXYtMzdxMC01NjEtMTItNTg1LTItNC0xMi04dC0yNS02LTI4LTQtMjctMi0xNy0xbC0yLTQ3cTU2LTEgMTk0LTZ0MjEzLTVxMTMgMCAzOSAwdDM4IDBxNDAgMCA3OCA3dDczIDI0IDYxIDQwIDQyIDU5IDE2IDc4cTAgMjktOSA1NHQtMjIgNDEtMzYgMzItNDEgMjUtNDggMjJxODggMjAgMTQ2IDc2dDU4IDE0MXEwIDU3LTIwIDEwMnQtNTMgNzQtNzggNDgtOTMgMjctMTAwIDhxLTI1IDAtNzUtMXQtNzUtMXEtNjAgMC0xNzUgNnQtMTMyIDZ6XCJcbiAgfSxcbiAga2V5OiBcIk1vZC1CXCJcbn0pO1xuXG5nZW5lcmF0ZU1hcmtDb21tYW5kcyhfbW9kZWwuRW1NYXJrLCBcImVtXCIsIFwiZW1waGFzaXNcIiwge1xuICBtZW51R3JvdXA6IFwiaW5saW5lXCIsIG1lbnVSYW5rOiAyMSxcbiAgaWNvbjoge1xuICAgIHdpZHRoOiA1ODUsIGhlaWdodDogMTAyNCxcbiAgICBwYXRoOiBcIk0wIDk0OWw5LTQ4cTMtMSA0Ni0xMnQ2My0yMXExNi0yMCAyMy01NyAwLTQgMzUtMTY1dDY1LTMxMCAyOS0xNjl2LTE0cS0xMy03LTMxLTEwdC0zOS00LTMzLTNsMTAtNThxMTggMSA2OCAzdDg1IDQgNjggMXEyNyAwIDU2LTF0NjktNCA1Ni0zcS0yIDIyLTEwIDUwLTE3IDUtNTggMTZ0LTYyIDE5cS00IDEwLTggMjR0LTUgMjItNCAyNi0zIDI0cS0xNSA4NC01MCAyMzl0LTQ0IDIwM3EtMSA1LTcgMzN0LTExIDUxLTkgNDctMyAzMmwwIDEwcTkgMiAxMDUgMTctMSAyNS05IDU2LTYgMC0xOCAwdC0xOCAwcS0xNiAwLTQ5LTV0LTQ5LTVxLTc4LTEtMTE3LTEtMjkgMC04MSA1dC02OSA2elwiXG4gIH0sXG4gIGtleTogXCJNb2QtSVwiXG59KTtcblxuZ2VuZXJhdGVNYXJrQ29tbWFuZHMoX21vZGVsLkNvZGVNYXJrLCBcImNvZGVcIiwgbnVsbCwge1xuICBtZW51R3JvdXA6IFwiaW5saW5lXCIsIG1lbnVSYW5rOiAyMixcbiAgaWNvbjoge1xuICAgIHdpZHRoOiA4OTYsIGhlaWdodDogMTAyNCxcbiAgICBwYXRoOiBcIk02MDggMTkybC05NiA5NiAyMjQgMjI0LTIyNCAyMjQgOTYgOTYgMjg4LTMyMC0yODgtMzIwek0yODggMTkybC0yODggMzIwIDI4OCAzMjAgOTYtOTYtMjI0LTIyNCAyMjQtMjI0LTk2LTk2elwiXG4gIH0sXG4gIGtleTogXCJNb2QtYFwiXG59KTtcblxuX21vZGVsLkxpbmtNYXJrLnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwidW5saW5rXCIsXG4gIGxhYmVsOiBcIlVubGlua1wiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgIHBtLnNldE1hcmsodGhpcywgZmFsc2UpO1xuICB9LFxuICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdChwbSkge1xuICAgIHJldHVybiBtYXJrQWN0aXZlKHBtLCB0aGlzKTtcbiAgfSxcbiAgYWN0aXZlOiBmdW5jdGlvbiBhY3RpdmUoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIG1lbnVHcm91cDogXCJpbmxpbmVcIiwgbWVudVJhbms6IDMwLFxuICBpY29uOiB7IGZyb206IFwibGlua1wiIH1cbn0pO1xuXG5fbW9kZWwuTGlua01hcmsucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJsaW5rXCIsXG4gIGxhYmVsOiBcIkFkZCBsaW5rXCIsXG4gIHJ1bjogZnVuY3Rpb24gcnVuKHBtLCBocmVmLCB0aXRsZSkge1xuICAgIHBtLnNldE1hcmsodGhpcywgdHJ1ZSwgeyBocmVmOiBocmVmLCB0aXRsZTogdGl0bGUgfSk7XG4gIH0sXG4gIHBhcmFtczogW3sgbGFiZWw6IFwiVGFyZ2V0XCIsIHR5cGU6IFwidGV4dFwiIH0sIHsgbGFiZWw6IFwiVGl0bGVcIiwgdHlwZTogXCJ0ZXh0XCIsIFwiZGVmYXVsdFwiOiBcIlwiIH1dLFxuICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdChwbSkge1xuICAgIHJldHVybiBtYXJrQXBwbGllcyhwbSwgdGhpcykgJiYgIW1hcmtBY3RpdmUocG0sIHRoaXMpO1xuICB9LFxuICBtZW51R3JvdXA6IFwiaW5saW5lXCIsIG1lbnVSYW5rOiAzMCxcbiAgaWNvbjoge1xuICAgIHdpZHRoOiA5NTEsIGhlaWdodDogMTAyNCxcbiAgICBwYXRoOiBcIk04MzIgNjk0cTAtMjItMTYtMzhsLTExOC0xMThxLTE2LTE2LTM4LTE2LTI0IDAtNDEgMTggMSAxIDEwIDEwdDEyIDEyIDggMTAgNyAxNCAyIDE1cTAgMjItMTYgMzh0LTM4IDE2cS04IDAtMTUtMnQtMTQtNy0xMC04LTEyLTEyLTEwLTEwcS0xOCAxNy0xOCA0MSAwIDIyIDE2IDM4bDExNyAxMThxMTUgMTUgMzggMTUgMjIgMCAzOC0xNGw4NC04M3ExNi0xNiAxNi0zOHpNNDMwIDI5MnEwLTIyLTE2LTM4bC0xMTctMTE4cS0xNi0xNi0zOC0xNi0yMiAwLTM4IDE1bC04NCA4M3EtMTYgMTYtMTYgMzggMCAyMiAxNiAzOGwxMTggMTE4cTE1IDE1IDM4IDE1IDI0IDAgNDEtMTctMS0xLTEwLTEwdC0xMi0xMi04LTEwLTctMTQtMi0xNXEwLTIyIDE2LTM4dDM4LTE2cTggMCAxNSAydDE0IDcgMTAgOCAxMiAxMiAxMCAxMHExOC0xNyAxOC00MXpNOTQxIDY5NHEwIDY4LTQ4IDExNmwtODQgODNxLTQ3IDQ3LTExNiA0Ny02OSAwLTExNi00OGwtMTE3LTExOHEtNDctNDctNDctMTE2IDAtNzAgNTAtMTE5bC01MC01MHEtNDkgNTAtMTE4IDUwLTY4IDAtMTE2LTQ4bC0xMTgtMTE4cS00OC00OC00OC0xMTZ0NDgtMTE2bDg0LTgzcTQ3LTQ3IDExNi00NyA2OSAwIDExNiA0OGwxMTcgMTE4cTQ3IDQ3IDQ3IDExNiAwIDcwLTUwIDExOWw1MCA1MHE0OS01MCAxMTgtNTAgNjggMCAxMTYgNDhsMTE4IDExOHE0OCA0OCA0OCAxMTZ6XCJcbiAgfVxufSk7XG5cbl9tb2RlbC5JbWFnZS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcImluc2VydEltYWdlXCIsXG4gIGxhYmVsOiBcIkluc2VydCBpbWFnZVwiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSwgc3JjLCBhbHQsIHRpdGxlKSB7XG4gICAgcmV0dXJuIHBtLnRyLnJlcGxhY2VTZWxlY3Rpb24odGhpcy5jcmVhdGUoeyBzcmM6IHNyYywgdGl0bGU6IHRpdGxlLCBhbHQ6IGFsdCB9KSkuYXBwbHkoYW5kU2Nyb2xsKTtcbiAgfSxcbiAgcGFyYW1zOiBbeyBsYWJlbDogXCJJbWFnZSBVUkxcIiwgdHlwZTogXCJ0ZXh0XCIgfSwgeyBsYWJlbDogXCJEZXNjcmlwdGlvbiAvIGFsdGVybmF0aXZlIHRleHRcIiwgdHlwZTogXCJ0ZXh0XCIsIFwiZGVmYXVsdFwiOiBcIlwiIH0sIHsgbGFiZWw6IFwiVGl0bGVcIiwgdHlwZTogXCJ0ZXh0XCIsIFwiZGVmYXVsdFwiOiBcIlwiIH1dLFxuICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdChwbSkge1xuICAgIHJldHVybiBwbS5kb2MucGF0aChwbS5zZWxlY3Rpb24uZnJvbS5wYXRoKS50eXBlLmNhbkNvbnRhaW5UeXBlKHRoaXMpO1xuICB9LFxuICBtZW51R3JvdXA6IFwiaW5saW5lXCIsIG1lbnVSYW5rOiA0MCxcbiAgaWNvbjoge1xuICAgIHdpZHRoOiAxMDk3LCBoZWlnaHQ6IDEwMjQsXG4gICAgcGF0aDogXCJNMzY1IDMyOXEwIDQ1LTMyIDc3dC03NyAzMi03Ny0zMi0zMi03NyAzMi03NyA3Ny0zMiA3NyAzMiAzMiA3N3pNOTUwIDU0OHYyNTZoLTgwNHYtMTA5bDE4Mi0xODIgOTEgOTEgMjkyLTI5MnpNMTAwNSAxNDZoLTkxNHEtNyAwLTEyIDV0LTUgMTJ2Njk0cTAgNyA1IDEydDEyIDVoOTE0cTcgMCAxMi01dDUtMTJ2LTY5NHEwLTctNS0xMnQtMTItNXpNMTA5NyAxNjR2Njk0cTAgMzctMjYgNjR0LTY0IDI2aC05MTRxLTM3IDAtNjQtMjZ0LTI2LTY0di02OTRxMC0zNyAyNi02NHQ2NC0yNmg5MTRxMzcgMCA2NCAyNnQyNiA2NHpcIlxuICB9LFxuICBwcmVmaWxsUGFyYW1zOiBmdW5jdGlvbiBwcmVmaWxsUGFyYW1zKHBtKSB7XG4gICAgdmFyIG5vZGUgPSBwbS5zZWxlY3Rpb24ubm9kZTtcblxuICAgIGlmIChub2RlICYmIG5vZGUudHlwZSA9PSB0aGlzKSByZXR1cm4gW25vZGUuYXR0cnMuc3JjLCBub2RlLmF0dHJzLmFsdCwgbm9kZS5hdHRycy50aXRsZV07XG4gIH1cbn0pO1xuXG4vKipcbiAqIEdldCBhbiBvZmZzZXQgbW92aW5nIGJhY2t3YXJkIGZyb20gYSBjdXJyZW50IG9mZnNldCBpbnNpZGUgYSBub2RlLlxuICpcbiAqIEBwYXJhbSAge09iamVjdH0gcGFyZW50IFRoZSBwYXJlbnQgbm9kZS5cbiAqIEBwYXJhbSAge2ludH0gICAgb2Zmc2V0IE9mZnNldCB0byBtb3ZlIGZyb20gaW5zaWRlIHRoZSBub2RlLlxuICogQHBhcmFtICB7c3RyaW5nfSBieSAgICAgU2l6ZSB0byBkZWxldGUgYnkuIEVpdGhlciBcImNoYXJcIiBvciBcIndvcmRcIi5cbiAqL1xuZnVuY3Rpb24gbW92ZUJhY2t3YXJkKHBhcmVudCwgb2Zmc2V0LCBieSkge1xuICBpZiAoYnkgIT0gXCJjaGFyXCIgJiYgYnkgIT0gXCJ3b3JkXCIpIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gbW90aW9uIHVuaXQ6IFwiICsgYnkpO1xuXG4gIHZhciBjYXQgPSBudWxsLFxuICAgICAgY291bnRlZCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICBpZiAob2Zmc2V0ID09IDApIHJldHVybiBvZmZzZXQ7XG5cbiAgICB2YXIgX3BhcmVudCRjaHVua0JlZm9yZSA9IHBhcmVudC5jaHVua0JlZm9yZShvZmZzZXQpO1xuXG4gICAgdmFyIHN0YXJ0ID0gX3BhcmVudCRjaHVua0JlZm9yZS5zdGFydDtcbiAgICB2YXIgbm9kZSA9IF9wYXJlbnQkY2h1bmtCZWZvcmUubm9kZTtcblxuICAgIGlmICghbm9kZS5pc1RleHQpIHJldHVybiBjYXQgPyBvZmZzZXQgOiBvZmZzZXQgLSAxO1xuXG4gICAgaWYgKGJ5ID09IFwiY2hhclwiKSB7XG4gICAgICBmb3IgKHZhciBpID0gb2Zmc2V0IC0gc3RhcnQ7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgaWYgKCEoMCwgX2NoYXIuaXNFeHRlbmRpbmdDaGFyKShub2RlLnRleHQuY2hhckF0KGkgLSAxKSkpIHJldHVybiBvZmZzZXQgLSAxO1xuICAgICAgICBvZmZzZXQtLTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGJ5ID09IFwid29yZFwiKSB7XG4gICAgICAvLyBXb3JrIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gYmFja3dhcmRzIHRocm91Z2ggdGV4dCBvZiBhIHNpbmd1bGFyXG4gICAgICAvLyBjaGFyYWN0ZXIgY2F0ZWdvcnkgKGUuZy4gXCJjYXRcIiBvZiBcIiMhKlwiKSB1bnRpbCByZWFjaGluZyBhIGNoYXJhY3RlciBpbiBhXG4gICAgICAvLyBkaWZmZXJlbnQgY2F0ZWdvcnkgKGkuZS4gdGhlIGVuZCBvZiB0aGUgd29yZCkuXG4gICAgICBmb3IgKHZhciBpID0gb2Zmc2V0IC0gc3RhcnQ7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgdmFyIG5leHRDaGFyQ2F0ID0gKDAsIF9jaGFyLmNoYXJDYXRlZ29yeSkobm9kZS50ZXh0LmNoYXJBdChpIC0gMSkpO1xuICAgICAgICBpZiAoY2F0ID09IG51bGwgfHwgY291bnRlZCA9PSAxICYmIGNhdCA9PSBcInNwYWNlXCIpIGNhdCA9IG5leHRDaGFyQ2F0O2Vsc2UgaWYgKGNhdCAhPSBuZXh0Q2hhckNhdCkgcmV0dXJuIG9mZnNldDtcbiAgICAgICAgb2Zmc2V0LS07XG4gICAgICAgIGNvdW50ZWQrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuX29wdGlvbnMuZGVmYXVsdFJlZ2lzdHJ5LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwiZGVsZXRlU2VsZWN0aW9uXCIsXG4gIGxhYmVsOiBcIkRlbGV0ZSB0aGUgc2VsZWN0aW9uXCIsXG4gIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgcmV0dXJuIHBtLnRyLnJlcGxhY2VTZWxlY3Rpb24oKS5hcHBseShhbmRTY3JvbGwpO1xuICB9LFxuICBrZXk6IFtcIkJhY2tzcGFjZSgxMClcIiwgXCJEZWxldGUoMTApXCIsIFwiTW9kLUJhY2tzcGFjZSgxMClcIiwgXCJNb2QtRGVsZXRlKDEwKVwiXSxcbiAgbWFjS2V5OiBbXCJDdHJsLUgoMTApXCIsIFwiQWx0LUJhY2tzcGFjZSgxMClcIiwgXCJDdHJsLUQoMTApXCIsIFwiQ3RybC1BbHQtQmFja3NwYWNlKDEwKVwiLCBcIkFsdC1EZWxldGUoMTApXCIsIFwiQWx0LUQoMTApXCJdXG59KTtcblxuZnVuY3Rpb24gZGVsZXRlQmFycmllcihwbSwgY3V0KSB7XG4gIHZhciBhcm91bmQgPSBwbS5kb2MucGF0aChjdXQucGF0aCk7XG4gIHZhciBiZWZvcmUgPSBhcm91bmQuY2hpbGQoY3V0Lm9mZnNldCAtIDEpLFxuICAgICAgYWZ0ZXIgPSBhcm91bmQuY2hpbGQoY3V0Lm9mZnNldCk7XG4gIGlmIChiZWZvcmUudHlwZS5jYW5Db250YWluQ29udGVudChhZnRlci50eXBlKSAmJiBwbS50ci5qb2luKGN1dCkuYXBwbHkoYW5kU2Nyb2xsKSAhPT0gZmFsc2UpIHJldHVybjtcblxuICB2YXIgY29ubiA9IHVuZGVmaW5lZDtcbiAgaWYgKGFmdGVyLmlzVGV4dGJsb2NrICYmIChjb25uID0gYmVmb3JlLnR5cGUuZmluZENvbm5lY3Rpb24oYWZ0ZXIudHlwZSkpKSB7XG4gICAgdmFyIHRyID0gcG0udHIsXG4gICAgICAgIGVuZCA9IGN1dC5tb3ZlKDEpO1xuICAgIHRyLnN0ZXAoXCJhbmNlc3RvclwiLCBjdXQsIGVuZCwgbnVsbCwgeyB0eXBlczogW2JlZm9yZS50eXBlXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGNvbm4pKSxcbiAgICAgIGF0dHJzOiBbYmVmb3JlLmF0dHJzXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGNvbm4ubWFwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KSkpIH0pO1xuICAgIHRyLmpvaW4oZW5kKTtcbiAgICB0ci5qb2luKGN1dCk7XG4gICAgaWYgKHRyLmFwcGx5KGFuZFNjcm9sbCkgIT09IGZhbHNlKSByZXR1cm47XG4gIH1cblxuICB2YXIgc2VsQWZ0ZXIgPSAoMCwgX3NlbGVjdGlvbi5maW5kU2VsZWN0aW9uRnJvbSkocG0uZG9jLCBjdXQsIDEpO1xuICByZXR1cm4gcG0udHIubGlmdChzZWxBZnRlci5mcm9tLCBzZWxBZnRlci50bykuYXBwbHkoYW5kU2Nyb2xsKTtcbn1cblxuX29wdGlvbnMuZGVmYXVsdFJlZ2lzdHJ5LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwiam9pbkJhY2t3YXJkXCIsXG4gIGxhYmVsOiBcIkpvaW4gd2l0aCB0aGUgYmxvY2sgYWJvdmVcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICB2YXIgX3BtJHNlbGVjdGlvbjQgPSBwbS5zZWxlY3Rpb247XG4gICAgdmFyIGhlYWQgPSBfcG0kc2VsZWN0aW9uNC5oZWFkO1xuICAgIHZhciBlbXB0eSA9IF9wbSRzZWxlY3Rpb240LmVtcHR5O1xuXG4gICAgaWYgKCFlbXB0eSB8fCBoZWFkLm9mZnNldCA+IDApIHJldHVybiBmYWxzZTtcblxuICAgIC8vIEZpbmQgdGhlIG5vZGUgYmVmb3JlIHRoaXMgb25lXG4gICAgdmFyIGJlZm9yZSA9IHVuZGVmaW5lZCxcbiAgICAgICAgY3V0ID0gdW5kZWZpbmVkO1xuICAgIGZvciAodmFyIGkgPSBoZWFkLnBhdGgubGVuZ3RoIC0gMTsgIWJlZm9yZSAmJiBpID49IDA7IGktLSkge1xuICAgICAgaWYgKGhlYWQucGF0aFtpXSA+IDApIHtcbiAgICAgICAgY3V0ID0gaGVhZC5zaG9ydGVuKGkpO1xuICAgICAgICBiZWZvcmUgPSBwbS5kb2MucGF0aChjdXQucGF0aCkuY2hpbGQoY3V0Lm9mZnNldCAtIDEpO1xuICAgICAgfVxuICAgIH0gLy8gSWYgdGhlcmUgaXMgbm8gbm9kZSBiZWZvcmUgdGhpcywgdHJ5IHRvIGxpZnRcbiAgICBpZiAoIWJlZm9yZSkgcmV0dXJuIHBtLnRyLmxpZnQoaGVhZCkuYXBwbHkoYW5kU2Nyb2xsKTtcblxuICAgIC8vIElmIHRoZSBub2RlIGRvZXNuJ3QgYWxsb3cgY2hpbGRyZW4sIGRlbGV0ZSBpdFxuICAgIGlmIChiZWZvcmUudHlwZS5jb250YWlucyA9PSBudWxsKSByZXR1cm4gcG0udHJbXCJkZWxldGVcIl0oY3V0Lm1vdmUoLTEpLCBjdXQpLmFwcGx5KGFuZFNjcm9sbCk7XG5cbiAgICAvLyBBcHBseSB0aGUgam9pbmluZyBhbGdvcml0aG1cbiAgICByZXR1cm4gZGVsZXRlQmFycmllcihwbSwgY3V0KTtcbiAgfSxcbiAga2V5OiBbXCJCYWNrc3BhY2UoMzApXCIsIFwiTW9kLUJhY2tzcGFjZSgzMClcIl1cbn0pO1xuXG5fb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJkZWxldGVDaGFyQmVmb3JlXCIsXG4gIGxhYmVsOiBcIkRlbGV0ZSBhIGNoYXJhY3RlciBiZWZvcmUgdGhlIGN1cnNvclwiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgIHZhciBfcG0kc2VsZWN0aW9uNSA9IHBtLnNlbGVjdGlvbjtcbiAgICB2YXIgaGVhZCA9IF9wbSRzZWxlY3Rpb241LmhlYWQ7XG4gICAgdmFyIGVtcHR5ID0gX3BtJHNlbGVjdGlvbjUuZW1wdHk7XG5cbiAgICBpZiAoIWVtcHR5IHx8IGhlYWQub2Zmc2V0ID09IDApIHJldHVybiBmYWxzZTtcbiAgICB2YXIgZnJvbSA9IG1vdmVCYWNrd2FyZChwbS5kb2MucGF0aChoZWFkLnBhdGgpLCBoZWFkLm9mZnNldCwgXCJjaGFyXCIpO1xuICAgIHJldHVybiBwbS50cltcImRlbGV0ZVwiXShuZXcgX21vZGVsLlBvcyhoZWFkLnBhdGgsIGZyb20pLCBoZWFkKS5hcHBseShhbmRTY3JvbGwpO1xuICB9LFxuICBrZXk6IFwiQmFja3NwYWNlKDYwKVwiLFxuICBtYWNLZXk6IFwiQ3RybC1IKDQwKVwiXG59KTtcblxuX29wdGlvbnMuZGVmYXVsdFJlZ2lzdHJ5LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwiZGVsZXRlV29yZEJlZm9yZVwiLFxuICBsYWJlbDogXCJEZWxldGUgdGhlIHdvcmQgYmVmb3JlIHRoZSBjdXJzb3JcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICB2YXIgX3BtJHNlbGVjdGlvbjYgPSBwbS5zZWxlY3Rpb247XG4gICAgdmFyIGhlYWQgPSBfcG0kc2VsZWN0aW9uNi5oZWFkO1xuICAgIHZhciBlbXB0eSA9IF9wbSRzZWxlY3Rpb242LmVtcHR5O1xuXG4gICAgaWYgKCFlbXB0eSB8fCBoZWFkLm9mZnNldCA9PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIGZyb20gPSBtb3ZlQmFja3dhcmQocG0uZG9jLnBhdGgoaGVhZC5wYXRoKSwgaGVhZC5vZmZzZXQsIFwid29yZFwiKTtcbiAgICByZXR1cm4gcG0udHJbXCJkZWxldGVcIl0obmV3IF9tb2RlbC5Qb3MoaGVhZC5wYXRoLCBmcm9tKSwgaGVhZCkuYXBwbHkoYW5kU2Nyb2xsKTtcbiAgfSxcbiAga2V5OiBcIk1vZC1CYWNrc3BhY2UoNDApXCIsXG4gIG1hY0tleTogXCJBbHQtQmFja3NwYWNlKDQwKVwiXG59KTtcblxuZnVuY3Rpb24gbW92ZUZvcndhcmQocGFyZW50LCBvZmZzZXQsIGJ5KSB7XG4gIGlmIChieSAhPSBcImNoYXJcIiAmJiBieSAhPSBcIndvcmRcIikgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBtb3Rpb24gdW5pdDogXCIgKyBieSk7XG5cbiAgdmFyIGNhdCA9IG51bGwsXG4gICAgICBjb3VudGVkID0gMDtcbiAgZm9yICg7Oykge1xuICAgIGlmIChvZmZzZXQgPT0gcGFyZW50LnNpemUpIHJldHVybiBvZmZzZXQ7XG5cbiAgICB2YXIgX3BhcmVudCRjaHVua0FmdGVyID0gcGFyZW50LmNodW5rQWZ0ZXIob2Zmc2V0KTtcblxuICAgIHZhciBzdGFydCA9IF9wYXJlbnQkY2h1bmtBZnRlci5zdGFydDtcbiAgICB2YXIgbm9kZSA9IF9wYXJlbnQkY2h1bmtBZnRlci5ub2RlO1xuXG4gICAgaWYgKCFub2RlLmlzVGV4dCkgcmV0dXJuIGNhdCA/IG9mZnNldCA6IG9mZnNldCArIDE7XG5cbiAgICBpZiAoYnkgPT0gXCJjaGFyXCIpIHtcbiAgICAgIGZvciAodmFyIGkgPSBvZmZzZXQgLSBzdGFydDsgaSA8IG5vZGUudGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoISgwLCBfY2hhci5pc0V4dGVuZGluZ0NoYXIpKG5vZGUudGV4dC5jaGFyQXQoaSArIDEpKSkgcmV0dXJuIG9mZnNldCArIDE7XG4gICAgICAgIG9mZnNldCsrO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYnkgPT0gXCJ3b3JkXCIpIHtcbiAgICAgIGZvciAodmFyIGkgPSBvZmZzZXQgLSBzdGFydDsgaSA8IG5vZGUudGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbmV4dENoYXJDYXQgPSAoMCwgX2NoYXIuY2hhckNhdGVnb3J5KShub2RlLnRleHQuY2hhckF0KGkpKTtcbiAgICAgICAgaWYgKGNhdCA9PSBudWxsIHx8IGNvdW50ZWQgPT0gMSAmJiBjYXQgPT0gXCJzcGFjZVwiKSBjYXQgPSBuZXh0Q2hhckNhdDtlbHNlIGlmIChjYXQgIT0gbmV4dENoYXJDYXQpIHJldHVybiBvZmZzZXQ7XG4gICAgICAgIG9mZnNldCsrO1xuICAgICAgICBjb3VudGVkKys7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbl9vcHRpb25zLmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcImpvaW5Gb3J3YXJkXCIsXG4gIGxhYmVsOiBcIkpvaW4gd2l0aCB0aGUgYmxvY2sgYmVsb3dcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICB2YXIgX3BtJHNlbGVjdGlvbjcgPSBwbS5zZWxlY3Rpb247XG4gICAgdmFyIGhlYWQgPSBfcG0kc2VsZWN0aW9uNy5oZWFkO1xuICAgIHZhciBlbXB0eSA9IF9wbSRzZWxlY3Rpb243LmVtcHR5O1xuXG4gICAgaWYgKCFlbXB0eSB8fCBoZWFkLm9mZnNldCA8IHBtLmRvYy5wYXRoKGhlYWQucGF0aCkuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gRmluZCB0aGUgbm9kZSBhZnRlciB0aGlzIG9uZVxuICAgIHZhciBhZnRlciA9IHVuZGVmaW5lZCxcbiAgICAgICAgY3V0ID0gdW5kZWZpbmVkO1xuICAgIGZvciAodmFyIGkgPSBoZWFkLnBhdGgubGVuZ3RoIC0gMTsgIWFmdGVyICYmIGkgPj0gMDsgaS0tKSB7XG4gICAgICBjdXQgPSBoZWFkLnNob3J0ZW4oaSwgMSk7XG4gICAgICB2YXIgX3BhcmVudCA9IHBtLmRvYy5wYXRoKGN1dC5wYXRoKTtcbiAgICAgIGlmIChjdXQub2Zmc2V0IDwgX3BhcmVudC5zaXplKSBhZnRlciA9IF9wYXJlbnQuY2hpbGQoY3V0Lm9mZnNldCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gbm9kZSBhZnRlciB0aGlzLCB0aGVyZSdzIG5vdGhpbmcgdG8gZG9cbiAgICBpZiAoIWFmdGVyKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBJZiB0aGUgbm9kZSBkb2Vzbid0IGFsbG93IGNoaWxkcmVuLCBkZWxldGUgaXRcbiAgICBpZiAoYWZ0ZXIudHlwZS5jb250YWlucyA9PSBudWxsKSByZXR1cm4gcG0udHJbXCJkZWxldGVcIl0oY3V0LCBjdXQubW92ZSgxKSkuYXBwbHkoYW5kU2Nyb2xsKTtcblxuICAgIC8vIEFwcGx5IHRoZSBqb2luaW5nIGFsZ29yaXRobVxuICAgIHJldHVybiBkZWxldGVCYXJyaWVyKHBtLCBjdXQpO1xuICB9LFxuICBrZXk6IFtcIkRlbGV0ZSgzMClcIiwgXCJNb2QtRGVsZXRlKDMwKVwiXVxufSk7XG5cbl9vcHRpb25zLmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcImRlbGV0ZUNoYXJBZnRlclwiLFxuICBsYWJlbDogXCJEZWxldGUgYSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGN1cnNvclwiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgIHZhciBfcG0kc2VsZWN0aW9uOCA9IHBtLnNlbGVjdGlvbjtcbiAgICB2YXIgaGVhZCA9IF9wbSRzZWxlY3Rpb244LmhlYWQ7XG4gICAgdmFyIGVtcHR5ID0gX3BtJHNlbGVjdGlvbjguZW1wdHk7XG5cbiAgICBpZiAoIWVtcHR5IHx8IGhlYWQub2Zmc2V0ID09IHBtLmRvYy5wYXRoKGhlYWQucGF0aCkuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciB0byA9IG1vdmVGb3J3YXJkKHBtLmRvYy5wYXRoKGhlYWQucGF0aCksIGhlYWQub2Zmc2V0LCBcImNoYXJcIik7XG4gICAgcmV0dXJuIHBtLnRyW1wiZGVsZXRlXCJdKGhlYWQsIG5ldyBfbW9kZWwuUG9zKGhlYWQucGF0aCwgdG8pKS5hcHBseShhbmRTY3JvbGwpO1xuICB9LFxuICBrZXk6IFwiRGVsZXRlKDYwKVwiLFxuICBtYWNLZXk6IFwiQ3RybC1EKDYwKVwiXG59KTtcblxuX29wdGlvbnMuZGVmYXVsdFJlZ2lzdHJ5LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwiZGVsZXRlV29yZEFmdGVyXCIsXG4gIGxhYmVsOiBcIkRlbGV0ZSBhIGNoYXJhY3RlciBhZnRlciB0aGUgY3Vyc29yXCIsXG4gIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgdmFyIF9wbSRzZWxlY3Rpb245ID0gcG0uc2VsZWN0aW9uO1xuICAgIHZhciBoZWFkID0gX3BtJHNlbGVjdGlvbjkuaGVhZDtcbiAgICB2YXIgZW1wdHkgPSBfcG0kc2VsZWN0aW9uOS5lbXB0eTtcblxuICAgIGlmICghZW1wdHkgfHwgaGVhZC5vZmZzZXQgPT0gcG0uZG9jLnBhdGgoaGVhZC5wYXRoKS5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHRvID0gbW92ZUZvcndhcmQocG0uZG9jLnBhdGgoaGVhZC5wYXRoKSwgaGVhZC5vZmZzZXQsIFwid29yZFwiKTtcbiAgICByZXR1cm4gcG0udHJbXCJkZWxldGVcIl0oaGVhZCwgbmV3IF9tb2RlbC5Qb3MoaGVhZC5wYXRoLCB0bykpLmFwcGx5KGFuZFNjcm9sbCk7XG4gIH0sXG4gIGtleTogXCJNb2QtRGVsZXRlKDQwKVwiLFxuICBtYWNLZXk6IFtcIkN0cmwtQWx0LUJhY2tzcGFjZSg0MClcIiwgXCJBbHQtRGVsZXRlKDQwKVwiLCBcIkFsdC1EKDQwKVwiXVxufSk7XG5cbmZ1bmN0aW9uIGpvaW5Qb2ludEFib3ZlKHBtKSB7XG4gIHZhciBfcG0kc2VsZWN0aW9uMTAgPSBwbS5zZWxlY3Rpb247XG4gIHZhciBub2RlID0gX3BtJHNlbGVjdGlvbjEwLm5vZGU7XG4gIHZhciBmcm9tID0gX3BtJHNlbGVjdGlvbjEwLmZyb207XG5cbiAgaWYgKG5vZGUpIHJldHVybiAoMCwgX3RyYW5zZm9ybS5qb2luYWJsZUJsb2NrcykocG0uZG9jLCBmcm9tKSA/IGZyb20gOiBudWxsO2Vsc2UgcmV0dXJuICgwLCBfdHJhbnNmb3JtLmpvaW5Qb2ludCkocG0uZG9jLCBmcm9tLCAtMSk7XG59XG5cbl9vcHRpb25zLmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcImpvaW5VcFwiLFxuICBsYWJlbDogXCJKb2luIHdpdGggYWJvdmUgYmxvY2tcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICB2YXIgbm9kZSA9IHBtLnNlbGVjdGlvbi5ub2RlO1xuICAgIHZhciBwb2ludCA9IGpvaW5Qb2ludEFib3ZlKHBtKTtcbiAgICBpZiAoIXBvaW50KSByZXR1cm4gZmFsc2U7XG4gICAgcG0udHIuam9pbihwb2ludCkuYXBwbHkoKTtcbiAgICBpZiAobm9kZSkgcG0uc2V0Tm9kZVNlbGVjdGlvbihwb2ludC5tb3ZlKC0xKSk7XG4gIH0sXG4gIHNlbGVjdDogZnVuY3Rpb24gc2VsZWN0KHBtKSB7XG4gICAgcmV0dXJuIGpvaW5Qb2ludEFib3ZlKHBtKTtcbiAgfSxcbiAgbWVudUdyb3VwOiBcImJsb2NrXCIsIG1lbnVSYW5rOiA4MCxcbiAgaWNvbjoge1xuICAgIHdpZHRoOiA4MDAsIGhlaWdodDogOTAwLFxuICAgIHBhdGg6IFwiTTAgNzVoODAwdjEyNWgtODAweiBNMCA4MjVoODAwdi0xMjVoLTgwMHogTTI1MCA0MDBoMTAwdi0xMDBoMTAwdjEwMGgxMDB2MTAwaC0xMDB2MTAwaC0xMDB2LTEwMGgtMTAwelwiXG4gIH0sXG4gIGtleTogXCJBbHQtVXBcIlxufSk7XG5cbmZ1bmN0aW9uIGpvaW5Qb2ludEJlbG93KHBtKSB7XG4gIHZhciBfcG0kc2VsZWN0aW9uMTEgPSBwbS5zZWxlY3Rpb247XG4gIHZhciBub2RlID0gX3BtJHNlbGVjdGlvbjExLm5vZGU7XG4gIHZhciB0byA9IF9wbSRzZWxlY3Rpb24xMS50bztcblxuICBpZiAobm9kZSkgcmV0dXJuICgwLCBfdHJhbnNmb3JtLmpvaW5hYmxlQmxvY2tzKShwbS5kb2MsIHRvKSA/IHRvIDogbnVsbDtlbHNlIHJldHVybiAoMCwgX3RyYW5zZm9ybS5qb2luUG9pbnQpKHBtLmRvYywgdG8sIDEpO1xufVxuXG5fb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJqb2luRG93blwiLFxuICBsYWJlbDogXCJKb2luIHdpdGggYmVsb3cgYmxvY2tcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICB2YXIgbm9kZSA9IHBtLnNlbGVjdGlvbi5ub2RlO1xuICAgIHZhciBwb2ludCA9IGpvaW5Qb2ludEJlbG93KHBtKTtcbiAgICBpZiAoIXBvaW50KSByZXR1cm4gZmFsc2U7XG4gICAgcG0udHIuam9pbihwb2ludCkuYXBwbHkoKTtcbiAgICBpZiAobm9kZSkgcG0uc2V0Tm9kZVNlbGVjdGlvbihwb2ludC5tb3ZlKC0xKSk7XG4gIH0sXG4gIHNlbGVjdDogZnVuY3Rpb24gc2VsZWN0KHBtKSB7XG4gICAgcmV0dXJuIGpvaW5Qb2ludEJlbG93KHBtKTtcbiAgfSxcbiAga2V5OiBcIkFsdC1Eb3duXCJcbn0pO1xuXG5fb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJsaWZ0XCIsXG4gIGxhYmVsOiBcIkxpZnQgb3V0IG9mIGVuY2xvc2luZyBibG9ja1wiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgIHZhciBfcG0kc2VsZWN0aW9uMTIgPSBwbS5zZWxlY3Rpb247XG4gICAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uMTIuZnJvbTtcbiAgICB2YXIgdG8gPSBfcG0kc2VsZWN0aW9uMTIudG87XG5cbiAgICByZXR1cm4gcG0udHIubGlmdChmcm9tLCB0bykuYXBwbHkoYW5kU2Nyb2xsKTtcbiAgfSxcbiAgc2VsZWN0OiBmdW5jdGlvbiBzZWxlY3QocG0pIHtcbiAgICB2YXIgX3BtJHNlbGVjdGlvbjEzID0gcG0uc2VsZWN0aW9uO1xuICAgIHZhciBmcm9tID0gX3BtJHNlbGVjdGlvbjEzLmZyb207XG4gICAgdmFyIHRvID0gX3BtJHNlbGVjdGlvbjEzLnRvO1xuXG4gICAgcmV0dXJuICgwLCBfdHJhbnNmb3JtLmNhbkxpZnQpKHBtLmRvYywgZnJvbSwgdG8pO1xuICB9LFxuICBtZW51R3JvdXA6IFwiYmxvY2tcIiwgbWVudVJhbms6IDc1LFxuICBpY29uOiB7XG4gICAgd2lkdGg6IDEwMjQsIGhlaWdodDogMTAyNCxcbiAgICBwYXRoOiBcIk0yMTkgMzEwdjMyOXEwIDctNSAxMnQtMTIgNXEtOCAwLTEzLTVsLTE2NC0xNjRxLTUtNS01LTEzdDUtMTNsMTY0LTE2NHE1LTUgMTMtNSA3IDAgMTIgNXQ1IDEyek0xMDI0IDc0OXYxMDlxMCA3LTUgMTJ0LTEyIDVoLTk4N3EtNyAwLTEyLTV0LTUtMTJ2LTEwOXEwLTcgNS0xMnQxMi01aDk4N3E3IDAgMTIgNXQ1IDEyek0xMDI0IDUzMHYxMDlxMCA3LTUgMTJ0LTEyIDVoLTYyMXEtNyAwLTEyLTV0LTUtMTJ2LTEwOXEwLTcgNS0xMnQxMi01aDYyMXE3IDAgMTIgNXQ1IDEyek0xMDI0IDMxMHYxMDlxMCA3LTUgMTJ0LTEyIDVoLTYyMXEtNyAwLTEyLTV0LTUtMTJ2LTEwOXEwLTcgNS0xMnQxMi01aDYyMXE3IDAgMTIgNXQ1IDEyek0xMDI0IDkxdjEwOXEwIDctNSAxMnQtMTIgNWgtOTg3cS03IDAtMTItNXQtNS0xMnYtMTA5cTAtNyA1LTEydDEyLTVoOTg3cTcgMCAxMiA1dDUgMTJ6XCJcbiAgfSxcbiAga2V5OiBcIkFsdC1MZWZ0XCJcbn0pO1xuXG5mdW5jdGlvbiBpc0F0VG9wT2ZMaXN0SXRlbShkb2MsIGZyb20sIHRvLCBsaXN0VHlwZSkge1xuICByZXR1cm4gX21vZGVsLlBvcy5zYW1lUGF0aChmcm9tLnBhdGgsIHRvLnBhdGgpICYmIGZyb20ucGF0aC5sZW5ndGggPj0gMiAmJiBmcm9tLnBhdGhbZnJvbS5wYXRoLmxlbmd0aCAtIDFdID09IDAgJiYgbGlzdFR5cGUuY2FuQ29udGFpbihkb2MucGF0aChmcm9tLnBhdGguc2xpY2UoMCwgZnJvbS5wYXRoLmxlbmd0aCAtIDEpKSk7XG59XG5cbmZ1bmN0aW9uIHdyYXBDb21tYW5kKHR5cGUsIG5hbWUsIGxhYmVsTmFtZSwgaXNMaXN0LCBzcGVjKSB7XG4gIHZhciBjb21tYW5kID0ge1xuICAgIG5hbWU6IFwid3JhcFwiICsgbmFtZSxcbiAgICBsYWJlbDogXCJXcmFwIGluIFwiICsgbGFiZWxOYW1lLFxuICAgIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgICB2YXIgX3BtJHNlbGVjdGlvbjE0ID0gcG0uc2VsZWN0aW9uO1xuICAgICAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uMTQuZnJvbTtcbiAgICAgIHZhciB0byA9IF9wbSRzZWxlY3Rpb24xNC50bztcbiAgICAgIHZhciBoZWFkID0gX3BtJHNlbGVjdGlvbjE0LmhlYWQ7dmFyIGRvSm9pbiA9IGZhbHNlO1xuICAgICAgaWYgKGlzTGlzdCAmJiBoZWFkICYmIGlzQXRUb3BPZkxpc3RJdGVtKHBtLmRvYywgZnJvbSwgdG8sIHRoaXMpKSB7XG4gICAgICAgIC8vIERvbid0IGRvIGFueXRoaW5nIGlmIHRoaXMgaXMgdGhlIHRvcCBvZiB0aGUgbGlzdFxuICAgICAgICBpZiAoZnJvbS5wYXRoW2Zyb20ucGF0aC5sZW5ndGggLSAyXSA9PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGRvSm9pbiA9IHRydWU7XG4gICAgICB9XG4gICAgICB2YXIgdHIgPSBwbS50ci53cmFwKGZyb20sIHRvLCB0aGlzKTtcbiAgICAgIGlmIChkb0pvaW4pIHRyLmpvaW4oZnJvbS5zaG9ydGVuKGZyb20uZGVwdGggLSAyKSk7XG4gICAgICByZXR1cm4gdHIuYXBwbHkoYW5kU2Nyb2xsKTtcbiAgICB9LFxuICAgIHNlbGVjdDogZnVuY3Rpb24gc2VsZWN0KHBtKSB7XG4gICAgICB2YXIgX3BtJHNlbGVjdGlvbjE1ID0gcG0uc2VsZWN0aW9uO1xuICAgICAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uMTUuZnJvbTtcbiAgICAgIHZhciB0byA9IF9wbSRzZWxlY3Rpb24xNS50bztcbiAgICAgIHZhciBoZWFkID0gX3BtJHNlbGVjdGlvbjE1LmhlYWQ7XG5cbiAgICAgIGlmIChpc0xpc3QgJiYgaGVhZCAmJiBpc0F0VG9wT2ZMaXN0SXRlbShwbS5kb2MsIGZyb20sIHRvLCB0aGlzKSAmJiBmcm9tLnBhdGhbZnJvbS5wYXRoLmxlbmd0aCAtIDJdID09IDApIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiAoMCwgX3RyYW5zZm9ybS5jYW5XcmFwKShwbS5kb2MsIGZyb20sIHRvLCB0aGlzKTtcbiAgICB9XG4gIH07XG4gIGZvciAodmFyIGtleSBpbiBzcGVjKSB7XG4gICAgY29tbWFuZFtrZXldID0gc3BlY1trZXldO1xuICB9dHlwZS5yZWdpc3RlcihcImNvbW1hbmRcIiwgY29tbWFuZCk7XG59XG5cbndyYXBDb21tYW5kKF9tb2RlbC5CdWxsZXRMaXN0LCBcIkJ1bGxldExpc3RcIiwgXCJidWxsZXQgbGlzdFwiLCB0cnVlLCB7XG4gIG1lbnVHcm91cDogXCJibG9ja1wiLCBtZW51UmFuazogNDAsXG4gIGljb246IHtcbiAgICB3aWR0aDogNzY4LCBoZWlnaHQ6IDg5NixcbiAgICBwYXRoOiBcIk0wIDUxMmgxMjh2LTEyOGgtMTI4djEyOHpNMCAyNTZoMTI4di0xMjhoLTEyOHYxMjh6TTAgNzY4aDEyOHYtMTI4aC0xMjh2MTI4ek0yNTYgNTEyaDUxMnYtMTI4aC01MTJ2MTI4ek0yNTYgMjU2aDUxMnYtMTI4aC01MTJ2MTI4ek0yNTYgNzY4aDUxMnYtMTI4aC01MTJ2MTI4elwiXG4gIH0sXG4gIGtleTogW1wiQWx0LVJpZ2h0ICcqJ1wiLCBcIkFsdC1SaWdodCAnLSdcIl1cbn0pO1xuXG53cmFwQ29tbWFuZChfbW9kZWwuT3JkZXJlZExpc3QsIFwiT3JkZXJlZExpc3RcIiwgXCJvcmRlcmVkIGxpc3RcIiwgdHJ1ZSwge1xuICBtZW51R3JvdXA6IFwiYmxvY2tcIiwgbWVudVJhbms6IDQxLFxuICBpY29uOiB7XG4gICAgd2lkdGg6IDc2OCwgaGVpZ2h0OiA4OTYsXG4gICAgcGF0aDogXCJNMzIwIDUxMmg0NDh2LTEyOGgtNDQ4djEyOHpNMzIwIDc2OGg0NDh2LTEyOGgtNDQ4djEyOHpNMzIwIDEyOHYxMjhoNDQ4di0xMjhoLTQ0OHpNNzkgMzg0aDc4di0yNTZoLTM2bC04NSAyM3Y1MGw0My0ydjE4NXpNMTg5IDU5MGMwLTM2LTEyLTc4LTk2LTc4LTMzIDAtNjQgNi04MyAxNmwxIDY2YzIxLTEwIDQyLTE1IDY3LTE1czMyIDExIDMyIDI4YzAgMjYtMzAgNTgtMTEwIDExMnY1MGgxOTJ2LTY3bC05MSAyYzQ5LTMwIDg3LTY2IDg3LTExM2wxLTF6XCJcbiAgfSxcbiAga2V5OiBcIkFsdC1SaWdodCAnMSdcIlxufSk7XG5cbndyYXBDb21tYW5kKF9tb2RlbC5CbG9ja1F1b3RlLCBcIkJsb2NrUXVvdGVcIiwgXCJibG9jayBxdW90ZVwiLCBmYWxzZSwge1xuICBtZW51R3JvdXA6IFwiYmxvY2tcIiwgbWVudVJhbms6IDQ1LFxuICBpY29uOiB7XG4gICAgd2lkdGg6IDY0MCwgaGVpZ2h0OiA4OTYsXG4gICAgcGF0aDogXCJNMCA0NDh2MjU2aDI1NnYtMjU2aC0xMjhjMCAwIDAtMTI4IDEyOC0xMjh2LTEyOGMwIDAtMjU2IDAtMjU2IDI1NnpNNjQwIDMyMHYtMTI4YzAgMC0yNTYgMC0yNTYgMjU2djI1NmgyNTZ2LTI1NmgtMTI4YzAgMCAwLTEyOCAxMjgtMTI4elwiXG4gIH0sXG4gIGtleTogW1wiQWx0LVJpZ2h0ICc+J1wiLCBcIkFsdC1SaWdodCAnXFxcIidcIl1cbn0pO1xuXG5fb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJuZXdsaW5lSW5Db2RlXCIsXG4gIGxhYmVsOiBcIkluc2VydCBuZXdsaW5lXCIsXG4gIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgdmFyIF9wbSRzZWxlY3Rpb24xNiA9IHBtLnNlbGVjdGlvbjtcbiAgICB2YXIgZnJvbSA9IF9wbSRzZWxlY3Rpb24xNi5mcm9tO1xuICAgIHZhciB0byA9IF9wbSRzZWxlY3Rpb24xNi50bztcbiAgICB2YXIgbm9kZSA9IF9wbSRzZWxlY3Rpb24xNi5ub2RlO3ZhciBibG9jayA9IHVuZGVmaW5lZDtcbiAgICBpZiAoIW5vZGUgJiYgX21vZGVsLlBvcy5zYW1lUGF0aChmcm9tLnBhdGgsIHRvLnBhdGgpICYmIChibG9jayA9IHBtLmRvYy5wYXRoKGZyb20ucGF0aCkpLnR5cGUuaXNDb2RlICYmIHRvLm9mZnNldCA8IGJsb2NrLnNpemUpIHJldHVybiBwbS50ci50eXBlVGV4dChcIlxcblwiKS5hcHBseShhbmRTY3JvbGwpO2Vsc2UgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBrZXk6IFwiRW50ZXIoMTApXCJcbn0pO1xuXG5fb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJjcmVhdGVQYXJhZ3JhcGhOZWFyXCIsXG4gIGxhYmVsOiBcIkNyZWF0ZSBhIHBhcmFncmFwaCBuZWFyIHRoZSBzZWxlY3RlZCBsZWFmIGJsb2NrXCIsXG4gIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgdmFyIF9wbSRzZWxlY3Rpb24xNyA9IHBtLnNlbGVjdGlvbjtcbiAgICB2YXIgZnJvbSA9IF9wbSRzZWxlY3Rpb24xNy5mcm9tO1xuICAgIHZhciB0byA9IF9wbSRzZWxlY3Rpb24xNy50bztcbiAgICB2YXIgbm9kZSA9IF9wbSRzZWxlY3Rpb24xNy5ub2RlO1xuXG4gICAgaWYgKCFub2RlIHx8ICFub2RlLmlzQmxvY2sgfHwgbm9kZS50eXBlLmNvbnRhaW5zKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHNpZGUgPSBmcm9tLm9mZnNldCA/IHRvIDogZnJvbTtcbiAgICBwbS50ci5pbnNlcnQoc2lkZSwgcG0uc2NoZW1hLmRlZmF1bHRUZXh0YmxvY2tUeXBlKCkuY3JlYXRlKCkpLmFwcGx5KGFuZFNjcm9sbCk7XG4gICAgcG0uc2V0VGV4dFNlbGVjdGlvbihuZXcgX21vZGVsLlBvcyhzaWRlLnRvUGF0aCgpLCAwKSk7XG4gIH0sXG4gIGtleTogXCJFbnRlcigyMClcIlxufSk7XG5cbl9vcHRpb25zLmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcImxpZnRFbXB0eUJsb2NrXCIsXG4gIGxhYmVsOiBcIk1vdmUgY3VycmVudCBibG9jayB1cFwiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgIHZhciBfcG0kc2VsZWN0aW9uMTggPSBwbS5zZWxlY3Rpb247XG4gICAgdmFyIGhlYWQgPSBfcG0kc2VsZWN0aW9uMTguaGVhZDtcbiAgICB2YXIgZW1wdHkgPSBfcG0kc2VsZWN0aW9uMTguZW1wdHk7XG5cbiAgICBpZiAoIWVtcHR5IHx8IGhlYWQub2Zmc2V0ID4gMCB8fCBwbS5kb2MucGF0aChoZWFkLnBhdGgpLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaGVhZC5kZXB0aCA+IDEpIHtcbiAgICAgIHZhciBzaG9ydGVyID0gaGVhZC5zaG9ydGVuKCk7XG4gICAgICBpZiAoc2hvcnRlci5vZmZzZXQgPiAwICYmIHNob3J0ZXIub2Zmc2V0IDwgcG0uZG9jLnBhdGgoc2hvcnRlci5wYXRoKS5zaXplIC0gMSAmJiBwbS50ci5zcGxpdChzaG9ydGVyKS5hcHBseSgpICE9PSBmYWxzZSkgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gcG0udHIubGlmdChoZWFkKS5hcHBseShhbmRTY3JvbGwpO1xuICB9LFxuICBrZXk6IFwiRW50ZXIoMzApXCJcbn0pO1xuXG5fb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJzcGxpdEJsb2NrXCIsXG4gIGxhYmVsOiBcIlNwbGl0IHRoZSBjdXJyZW50IGJsb2NrXCIsXG4gIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgdmFyIF9wbSRzZWxlY3Rpb24xOSA9IHBtLnNlbGVjdGlvbjtcbiAgICB2YXIgZnJvbSA9IF9wbSRzZWxlY3Rpb24xOS5mcm9tO1xuICAgIHZhciB0byA9IF9wbSRzZWxlY3Rpb24xOS50bztcbiAgICB2YXIgbm9kZSA9IF9wbSRzZWxlY3Rpb24xOS5ub2RlO3ZhciBibG9jayA9IHBtLmRvYy5wYXRoKHRvLnBhdGgpO1xuICAgIGlmIChub2RlICYmIG5vZGUuaXNCbG9jaykge1xuICAgICAgaWYgKCFmcm9tLm9mZnNldCkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHBtLnRyLnNwbGl0KGZyb20pLmFwcGx5KGFuZFNjcm9sbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB0eXBlID0gdG8ub2Zmc2V0ID09IGJsb2NrLnNpemUgPyBwbS5zY2hlbWEuZGVmYXVsdFRleHRibG9ja1R5cGUoKSA6IG51bGw7XG4gICAgICByZXR1cm4gcG0udHJbXCJkZWxldGVcIl0oZnJvbSwgdG8pLnNwbGl0KGZyb20sIDEsIHR5cGUpLmFwcGx5KGFuZFNjcm9sbCk7XG4gICAgfVxuICB9LFxuICBrZXk6IFwiRW50ZXIoNjApXCJcbn0pO1xuXG5fbW9kZWwuTGlzdEl0ZW0ucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJzcGxpdExpc3RJdGVtXCIsXG4gIGxhYmVsOiBcIlNwbGl0IHRoZSBjdXJyZW50IGxpc3QgaXRlbVwiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgIHZhciBfcG0kc2VsZWN0aW9uMjAgPSBwbS5zZWxlY3Rpb247XG4gICAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uMjAuZnJvbTtcbiAgICB2YXIgdG8gPSBfcG0kc2VsZWN0aW9uMjAudG87XG4gICAgdmFyIG5vZGUgPSBfcG0kc2VsZWN0aW9uMjAubm9kZTtcblxuICAgIGlmIChub2RlICYmIG5vZGUuaXNCbG9jayB8fCBmcm9tLnBhdGgubGVuZ3RoIDwgMiB8fCAhX21vZGVsLlBvcy5zYW1lUGF0aChmcm9tLnBhdGgsIHRvLnBhdGgpKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHRvUGFyZW50ID0gZnJvbS5zaG9ydGVuKCksXG4gICAgICAgIGdyYW5kUGFyZW50ID0gcG0uZG9jLnBhdGgodG9QYXJlbnQucGF0aCk7XG4gICAgaWYgKGdyYW5kUGFyZW50LnR5cGUgIT0gdGhpcykgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBuZXh0VHlwZSA9IHRvLm9mZnNldCA9PSBncmFuZFBhcmVudC5jaGlsZCh0b1BhcmVudC5vZmZzZXQpLnNpemUgPyBwbS5zY2hlbWEuZGVmYXVsdFRleHRibG9ja1R5cGUoKSA6IG51bGw7XG4gICAgcmV0dXJuIHBtLnRyW1wiZGVsZXRlXCJdKGZyb20sIHRvKS5zcGxpdChmcm9tLCAyLCBuZXh0VHlwZSkuYXBwbHkoYW5kU2Nyb2xsKTtcbiAgfSxcbiAga2V5OiBcIkVudGVyKDUwKVwiXG59KTtcblxuZnVuY3Rpb24gYWxyZWFkeUhhc0Jsb2NrVHlwZShkb2MsIGZyb20sIHRvLCB0eXBlLCBhdHRycykge1xuICB2YXIgZm91bmQgPSBmYWxzZTtcbiAgaWYgKCFhdHRycykgYXR0cnMgPSB7fTtcbiAgZG9jLm5vZGVzQmV0d2Vlbihmcm9tLCB0byB8fCBmcm9tLCBmdW5jdGlvbiAobm9kZSkge1xuICAgIGlmIChub2RlLmlzVGV4dGJsb2NrKSB7XG4gICAgICBpZiAobm9kZS5oYXNNYXJrdXAodHlwZSwgYXR0cnMpKSBmb3VuZCA9IHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGZvdW5kO1xufVxuXG5mdW5jdGlvbiBibG9ja1R5cGVDb21tYW5kKHR5cGUsIG5hbWUsIGxhYmVsTmFtZSwgYXR0cnMsIGtleSkge1xuICBpZiAoIWF0dHJzKSBhdHRycyA9IHt9O1xuICB0eXBlLnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gICAgbmFtZTogbmFtZSxcbiAgICBsYWJlbDogXCJDaGFuZ2UgdG8gXCIgKyBsYWJlbE5hbWUsXG4gICAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICAgIHZhciBfcG0kc2VsZWN0aW9uMjEgPSBwbS5zZWxlY3Rpb247XG4gICAgICB2YXIgZnJvbSA9IF9wbSRzZWxlY3Rpb24yMS5mcm9tO1xuICAgICAgdmFyIHRvID0gX3BtJHNlbGVjdGlvbjIxLnRvO1xuXG4gICAgICByZXR1cm4gcG0udHIuc2V0QmxvY2tUeXBlKGZyb20sIHRvLCB0aGlzLCBhdHRycykuYXBwbHkoYW5kU2Nyb2xsKTtcbiAgICB9LFxuICAgIHNlbGVjdDogZnVuY3Rpb24gc2VsZWN0KHBtKSB7XG4gICAgICB2YXIgX3BtJHNlbGVjdGlvbjIyID0gcG0uc2VsZWN0aW9uO1xuICAgICAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uMjIuZnJvbTtcbiAgICAgIHZhciB0byA9IF9wbSRzZWxlY3Rpb24yMi50bztcbiAgICAgIHZhciBub2RlID0gX3BtJHNlbGVjdGlvbjIyLm5vZGU7XG5cbiAgICAgIGlmIChub2RlKSByZXR1cm4gbm9kZS5pc1RleHRibG9jayAmJiAhbm9kZS5oYXNNYXJrdXAodGhpcywgYXR0cnMpO2Vsc2UgcmV0dXJuICFhbHJlYWR5SGFzQmxvY2tUeXBlKHBtLmRvYywgZnJvbSwgdG8sIHRoaXMsIGF0dHJzKTtcbiAgICB9LFxuICAgIGtleToga2V5XG4gIH0pO1xufVxuXG5ibG9ja1R5cGVDb21tYW5kKF9tb2RlbC5IZWFkaW5nLCBcIm1ha2VIMVwiLCBcImhlYWRpbmcgMVwiLCB7IGxldmVsOiAxIH0sIFwiTW9kLUggJzEnXCIpO1xuYmxvY2tUeXBlQ29tbWFuZChfbW9kZWwuSGVhZGluZywgXCJtYWtlSDJcIiwgXCJoZWFkaW5nIDJcIiwgeyBsZXZlbDogMiB9LCBcIk1vZC1IICcyJ1wiKTtcbmJsb2NrVHlwZUNvbW1hbmQoX21vZGVsLkhlYWRpbmcsIFwibWFrZUgzXCIsIFwiaGVhZGluZyAzXCIsIHsgbGV2ZWw6IDMgfSwgXCJNb2QtSCAnMydcIik7XG5ibG9ja1R5cGVDb21tYW5kKF9tb2RlbC5IZWFkaW5nLCBcIm1ha2VINFwiLCBcImhlYWRpbmcgNFwiLCB7IGxldmVsOiA0IH0sIFwiTW9kLUggJzQnXCIpO1xuYmxvY2tUeXBlQ29tbWFuZChfbW9kZWwuSGVhZGluZywgXCJtYWtlSDVcIiwgXCJoZWFkaW5nIDVcIiwgeyBsZXZlbDogNSB9LCBcIk1vZC1IICc1J1wiKTtcbmJsb2NrVHlwZUNvbW1hbmQoX21vZGVsLkhlYWRpbmcsIFwibWFrZUg2XCIsIFwiaGVhZGluZyA2XCIsIHsgbGV2ZWw6IDYgfSwgXCJNb2QtSCAnNidcIik7XG5cbmJsb2NrVHlwZUNvbW1hbmQoX21vZGVsLlBhcmFncmFwaCwgXCJtYWtlUGFyYWdyYXBoXCIsIFwicGFyYWdyYXBoXCIsIG51bGwsIFwiTW9kLVBcIik7XG5ibG9ja1R5cGVDb21tYW5kKF9tb2RlbC5Db2RlQmxvY2ssIFwibWFrZUNvZGVCbG9ja1wiLCBcImNvZGUgYmxvY2tcIiwgbnVsbCwgXCJNb2QtXFxcXFwiKTtcblxuX21vZGVsLkhvcml6b250YWxSdWxlLnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwiaW5zZXJ0SG9yaXpvbnRhbFJ1bGVcIixcbiAgbGFiZWw6IFwiSW5zZXJ0IGhvcml6b250YWwgcnVsZVwiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgIHJldHVybiBwbS50ci5yZXBsYWNlU2VsZWN0aW9uKHRoaXMuY3JlYXRlKCkpLmFwcGx5KGFuZFNjcm9sbCk7XG4gIH0sXG4gIGtleTogXCJNb2QtU3BhY2VcIlxufSk7XG5cbl9vcHRpb25zLmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcInVuZG9cIixcbiAgbGFiZWw6IFwiVW5kbyBsYXN0IGNoYW5nZVwiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgIHBtLnNjcm9sbEludG9WaWV3KCk7cmV0dXJuIHBtLmhpc3RvcnkudW5kbygpO1xuICB9LFxuICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdChwbSkge1xuICAgIHJldHVybiBwbS5oaXN0b3J5LmNhblVuZG8oKTtcbiAgfSxcbiAgbWVudUdyb3VwOiBcImhpc3RvcnlcIiwgbWVudVJhbms6IDEwLFxuICBpY29uOiB7XG4gICAgd2lkdGg6IDEwMjQsIGhlaWdodDogMTAyNCxcbiAgICBwYXRoOiBcIk03NjEgMTAyNGMxMTMtMjA2IDEzMi01MjAtMzEzLTUwOXYyNTNsLTM4NC0zODQgMzg0LTM4NHYyNDhjNTM0LTEzIDU5NCA0NzIgMzEzIDc3NXpcIlxuICB9LFxuICBrZXk6IFwiTW9kLVpcIlxufSk7XG5cbl9vcHRpb25zLmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcInJlZG9cIixcbiAgbGFiZWw6IFwiUmVkbyBsYXN0IHVuZG9uZSBjaGFuZ2VcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICBwbS5zY3JvbGxJbnRvVmlldygpO3JldHVybiBwbS5oaXN0b3J5LnJlZG8oKTtcbiAgfSxcbiAgc2VsZWN0OiBmdW5jdGlvbiBzZWxlY3QocG0pIHtcbiAgICByZXR1cm4gcG0uaGlzdG9yeS5jYW5SZWRvKCk7XG4gIH0sXG4gIG1lbnVHcm91cDogXCJoaXN0b3J5XCIsIG1lbnVSYW5rOiAyMCxcbiAgaWNvbjoge1xuICAgIHdpZHRoOiAxMDI0LCBoZWlnaHQ6IDEwMjQsXG4gICAgcGF0aDogXCJNNTc2IDI0OHYtMjQ4bDM4NCAzODQtMzg0IDM4NHYtMjUzYy00NDYtMTAtNDI3IDMwMy0zMTMgNTA5LTI4MC0zMDMtMjIxLTc4OSAzMTMtNzc1elwiXG4gIH0sXG4gIGtleTogW1wiTW9kLVlcIiwgXCJTaGlmdC1Nb2QtWlwiXVxufSk7XG5cbl9vcHRpb25zLmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcInRleHRibG9ja1R5cGVcIixcbiAgbGFiZWw6IFwiQ2hhbmdlIGJsb2NrIHR5cGVcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0sIHR5cGUpIHtcbiAgICB2YXIgX3BtJHNlbGVjdGlvbjIzID0gcG0uc2VsZWN0aW9uO1xuICAgIHZhciBmcm9tID0gX3BtJHNlbGVjdGlvbjIzLmZyb207XG4gICAgdmFyIHRvID0gX3BtJHNlbGVjdGlvbjIzLnRvO1xuXG4gICAgcmV0dXJuIHBtLnRyLnNldEJsb2NrVHlwZShmcm9tLCB0bywgdHlwZS50eXBlLCB0eXBlLmF0dHJzKS5hcHBseSgpO1xuICB9LFxuICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdChwbSkge1xuICAgIHZhciBub2RlID0gcG0uc2VsZWN0aW9uLm5vZGU7XG5cbiAgICByZXR1cm4gIW5vZGUgfHwgbm9kZS5pc1RleHRibG9jaztcbiAgfSxcbiAgcGFyYW1zOiBbeyBsYWJlbDogXCJUeXBlXCIsIHR5cGU6IFwic2VsZWN0XCIsIG9wdGlvbnM6IGxpc3RUZXh0YmxvY2tUeXBlcywgXCJkZWZhdWx0XCI6IGN1cnJlbnRUZXh0YmxvY2tUeXBlLCBkZWZhdWx0TGFiZWw6IFwiVHlwZS4uLlwiIH1dLFxuICBkaXNwbGF5OiBcInNlbGVjdFwiLFxuICBtZW51R3JvdXA6IFwiYmxvY2tcIiwgbWVudVJhbms6IDEwXG59KTtcblxuX21vZGVsLlBhcmFncmFwaC5wcm90b3R5cGUudGV4dGJsb2NrVHlwZXMgPSBbeyBsYWJlbDogXCJOb3JtYWxcIiwgcmFuazogMTAgfV07XG5fbW9kZWwuQ29kZUJsb2NrLnByb3RvdHlwZS50ZXh0YmxvY2tUeXBlcyA9IFt7IGxhYmVsOiBcIkNvZGVcIiwgcmFuazogMjAgfV07XG5fbW9kZWwuSGVhZGluZy5wcm90b3R5cGUudGV4dGJsb2NrVHlwZXMgPSBbMSwgMiwgMywgNCwgNSwgNl0ubWFwKGZ1bmN0aW9uIChuKSB7XG4gIHJldHVybiB7IGxhYmVsOiBcIkhlYWQgXCIgKyBuLCBhdHRyczogeyBsZXZlbDogbiB9LCByYW5rOiAzMCArIG4gfTtcbn0pO1xuXG5mdW5jdGlvbiBsaXN0VGV4dGJsb2NrVHlwZXMocG0pIHtcbiAgdmFyIGNhY2hlZCA9IHBtLnNjaGVtYS5jYWNoZWQudGV4dGJsb2NrVHlwZXM7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgdmFyIGZvdW5kID0gW107XG4gIGZvciAodmFyIF9uYW1lMyBpbiBwbS5zY2hlbWEubm9kZXMpIHtcbiAgICB2YXIgdHlwZSA9IHBtLnNjaGVtYS5ub2Rlc1tfbmFtZTNdO1xuICAgIGlmICghdHlwZS50ZXh0YmxvY2tUeXBlcykgY29udGludWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlLnRleHRibG9ja1R5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaW5mbyA9IHR5cGUudGV4dGJsb2NrVHlwZXNbaV07XG4gICAgICAoMCwgX3V0aWxTb3J0ZWRpbnNlcnQyW1wiZGVmYXVsdFwiXSkoZm91bmQsIHsgbGFiZWw6IGluZm8ubGFiZWwsIHZhbHVlOiB7IHR5cGU6IHR5cGUsIGF0dHJzOiBpbmZvLmF0dHJzIH0sIHJhbms6IGluZm8ucmFuayB9LCBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICByZXR1cm4gYS5yYW5rIC0gYi5yYW5rO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwbS5zY2hlbWEuY2FjaGVkLnRleHRibG9ja1R5cGVzID0gZm91bmQ7XG59XG5cbmZ1bmN0aW9uIGN1cnJlbnRUZXh0YmxvY2tUeXBlKHBtKSB7XG4gIHZhciBfcG0kc2VsZWN0aW9uMjQgPSBwbS5zZWxlY3Rpb247XG4gIHZhciBmcm9tID0gX3BtJHNlbGVjdGlvbjI0LmZyb207XG4gIHZhciB0byA9IF9wbSRzZWxlY3Rpb24yNC50bztcbiAgdmFyIG5vZGUgPSBfcG0kc2VsZWN0aW9uMjQubm9kZTtcblxuICBpZiAoIW5vZGUgfHwgbm9kZS5pc0lubGluZSkge1xuICAgIGlmICghX21vZGVsLlBvcy5zYW1lUGF0aChmcm9tLnBhdGgsIHRvLnBhdGgpKSByZXR1cm4gbnVsbDtcbiAgICBub2RlID0gcG0uZG9jLnBhdGgoZnJvbS5wYXRoKTtcbiAgfSBlbHNlIGlmICghbm9kZS5pc1RleHRibG9jaykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciB0eXBlcyA9IGxpc3RUZXh0YmxvY2tUeXBlcyhwbSk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdHAgPSB0eXBlc1tpXSxcbiAgICAgICAgdmFsID0gdHAudmFsdWU7XG4gICAgaWYgKG5vZGUuaGFzTWFya3VwKHZhbC50eXBlLCB2YWwuYXR0cnMpKSByZXR1cm4gdHA7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9kZUFib3ZlU2VsZWN0aW9uKHBtKSB7XG4gIHZhciBzZWwgPSBwbS5zZWxlY3Rpb24sXG4gICAgICBpID0gMDtcbiAgaWYgKHNlbC5ub2RlKSByZXR1cm4gISFzZWwuZnJvbS5kZXB0aCAmJiBzZWwuZnJvbS5zaG9ydGVuKCk7XG4gIGZvciAoOyBpIDwgc2VsLmhlYWQuZGVwdGggJiYgaSA8IHNlbC5hbmNob3IuZGVwdGg7IGkrKykgaWYgKHNlbC5oZWFkLnBhdGhbaV0gIT0gc2VsLmFuY2hvci5wYXRoW2ldKSBicmVhaztcbiAgcmV0dXJuIGkgPT0gMCA/IGZhbHNlIDogc2VsLmhlYWQuc2hvcnRlbihpIC0gMSk7XG59XG5cbl9vcHRpb25zLmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcInNlbGVjdFBhcmVudEJsb2NrXCIsXG4gIGxhYmVsOiBcIlNlbGVjdCBwYXJlbnQgbm9kZVwiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgIHZhciBub2RlID0gbm9kZUFib3ZlU2VsZWN0aW9uKHBtKTtcbiAgICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcbiAgICBwbS5zZXROb2RlU2VsZWN0aW9uKG5vZGUpO1xuICB9LFxuICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdChwbSkge1xuICAgIHJldHVybiBub2RlQWJvdmVTZWxlY3Rpb24ocG0pO1xuICB9LFxuICBtZW51R3JvdXA6IFwiYmxvY2tcIiwgbWVudVJhbms6IDkwLFxuICBpY29uOiB7IHRleHQ6IFwi4qyaXCIsIHN0eWxlOiBcImZvbnQtd2VpZ2h0OiBib2xkOyB2ZXJ0aWNhbC1hbGlnbjogMjAlXCIgfSxcbiAga2V5OiBcIkVzY1wiXG59KTtcblxuZnVuY3Rpb24gbW92ZVNlbGVjdGlvbkJsb2NrKHBtLCBkaXIpIHtcbiAgdmFyIF9wbSRzZWxlY3Rpb24yNSA9IHBtLnNlbGVjdGlvbjtcbiAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uMjUuZnJvbTtcbiAgdmFyIHRvID0gX3BtJHNlbGVjdGlvbjI1LnRvO1xuICB2YXIgbm9kZSA9IF9wbSRzZWxlY3Rpb24yNS5ub2RlO1xuXG4gIHZhciBzaWRlID0gZGlyID4gMCA/IHRvIDogZnJvbTtcbiAgcmV0dXJuICgwLCBfc2VsZWN0aW9uLmZpbmRTZWxlY3Rpb25Gcm9tKShwbS5kb2MsIG5vZGUgJiYgbm9kZS5pc0Jsb2NrID8gc2lkZSA6IHNpZGUuc2hvcnRlbihudWxsLCBkaXIgPiAwID8gMSA6IDApLCBkaXIpO1xufVxuXG5mdW5jdGlvbiBzZWxlY3RCbG9ja0hvcml6b250YWxseShwbSwgZGlyKSB7XG4gIHZhciBfcG0kc2VsZWN0aW9uMjYgPSBwbS5zZWxlY3Rpb247XG4gIHZhciBlbXB0eSA9IF9wbSRzZWxlY3Rpb24yNi5lbXB0eTtcbiAgdmFyIG5vZGUgPSBfcG0kc2VsZWN0aW9uMjYubm9kZTtcbiAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uMjYuZnJvbTtcbiAgdmFyIHRvID0gX3BtJHNlbGVjdGlvbjI2LnRvO1xuXG4gIGlmICghZW1wdHkgJiYgIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZSAmJiBub2RlLmlzSW5saW5lKSB7XG4gICAgcG0uc2V0VGV4dFNlbGVjdGlvbihkaXIgPiAwID8gdG8gOiBmcm9tKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHZhciBwYXJlbnQgPSB1bmRlZmluZWQ7XG4gIGlmICghbm9kZSAmJiAocGFyZW50ID0gcG0uZG9jLnBhdGgoZnJvbS5wYXRoKSkgJiYgKGRpciA+IDAgPyBmcm9tLm9mZnNldCA8IHBhcmVudC5zaXplIDogZnJvbS5vZmZzZXQpKSB7XG4gICAgdmFyIF9yZWYgPSBkaXIgPiAwID8gcGFyZW50LmNodW5rQWZ0ZXIoZnJvbS5vZmZzZXQpIDogcGFyZW50LmNodW5rQmVmb3JlKGZyb20ub2Zmc2V0KTtcblxuICAgIHZhciBuZXh0Tm9kZSA9IF9yZWYubm9kZTtcbiAgICB2YXIgc3RhcnQgPSBfcmVmLnN0YXJ0O1xuXG4gICAgaWYgKG5leHROb2RlLnR5cGUuc2VsZWN0YWJsZSAmJiBzdGFydCA9PSBmcm9tLm9mZnNldCAtIChkaXIgPiAwID8gMCA6IDEpKSB7XG4gICAgICBwbS5zZXROb2RlU2VsZWN0aW9uKGRpciA8IDAgPyBmcm9tLm1vdmUoLTEpIDogZnJvbSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIG5leHQgPSBtb3ZlU2VsZWN0aW9uQmxvY2socG0sIGRpcik7XG4gIGlmIChuZXh0ICYmIChuZXh0IGluc3RhbmNlb2YgX3NlbGVjdGlvbi5Ob2RlU2VsZWN0aW9uIHx8IG5vZGUpKSB7XG4gICAgcG0uc2V0U2VsZWN0aW9uRGlyZWN0KG5leHQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuX29wdGlvbnMuZGVmYXVsdFJlZ2lzdHJ5LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwic2VsZWN0QmxvY2tMZWZ0XCIsXG4gIGxhYmVsOiBcIk1vdmUgdGhlIHNlbGVjdGlvbiBvbnRvIG9yIG91dCBvZiB0aGUgYmxvY2sgdG8gdGhlIGxlZnRcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICB2YXIgZG9uZSA9IHNlbGVjdEJsb2NrSG9yaXpvbnRhbGx5KHBtLCAtMSk7XG4gICAgaWYgKGRvbmUpIHBtLnNjcm9sbEludG9WaWV3KCk7XG4gICAgcmV0dXJuIGRvbmU7XG4gIH0sXG4gIGtleTogW1wiTGVmdFwiLCBcIk1vZC1MZWZ0XCJdXG59KTtcblxuX29wdGlvbnMuZGVmYXVsdFJlZ2lzdHJ5LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwic2VsZWN0QmxvY2tSaWdodFwiLFxuICBsYWJlbDogXCJNb3ZlIHRoZSBzZWxlY3Rpb24gb250byBvciBvdXQgb2YgdGhlIGJsb2NrIHRvIHRoZSByaWdodFwiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgIHZhciBkb25lID0gc2VsZWN0QmxvY2tIb3Jpem9udGFsbHkocG0sIDEpO1xuICAgIGlmIChkb25lKSBwbS5zY3JvbGxJbnRvVmlldygpO1xuICAgIHJldHVybiBkb25lO1xuICB9LFxuICBrZXk6IFtcIlJpZ2h0XCIsIFwiTW9kLVJpZ2h0XCJdXG59KTtcblxuZnVuY3Rpb24gc2VsZWN0QmxvY2tWZXJ0aWNhbGx5KHBtLCBkaXIpIHtcbiAgdmFyIF9wbSRzZWxlY3Rpb24yNyA9IHBtLnNlbGVjdGlvbjtcbiAgdmFyIGVtcHR5ID0gX3BtJHNlbGVjdGlvbjI3LmVtcHR5O1xuICB2YXIgbm9kZSA9IF9wbSRzZWxlY3Rpb24yNy5ub2RlO1xuICB2YXIgZnJvbSA9IF9wbSRzZWxlY3Rpb24yNy5mcm9tO1xuICB2YXIgdG8gPSBfcG0kc2VsZWN0aW9uMjcudG87XG5cbiAgaWYgKCFlbXB0eSAmJiAhbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBsZWF2aW5nVGV4dGJsb2NrID0gdHJ1ZTtcbiAgaWYgKCFub2RlIHx8IG5vZGUuaXNJbmxpbmUpIGxlYXZpbmdUZXh0YmxvY2sgPSAoMCwgX3NlbGVjdGlvbi52ZXJ0aWNhbE1vdGlvbkxlYXZlc1RleHRibG9jaykocG0sIGRpciA+IDAgPyB0byA6IGZyb20sIGRpcik7XG5cbiAgaWYgKGxlYXZpbmdUZXh0YmxvY2spIHtcbiAgICB2YXIgbmV4dCA9IG1vdmVTZWxlY3Rpb25CbG9jayhwbSwgZGlyKTtcbiAgICBpZiAobmV4dCAmJiBuZXh0IGluc3RhbmNlb2YgX3NlbGVjdGlvbi5Ob2RlU2VsZWN0aW9uKSB7XG4gICAgICBwbS5zZXRTZWxlY3Rpb25EaXJlY3QobmV4dCk7XG4gICAgICBpZiAoIW5vZGUpIHBtLnNlbC5sYXN0Tm9uTm9kZVBvcyA9IGZyb207XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS5pc0lubGluZSkge1xuICAgICgwLCBfc2VsZWN0aW9uLnNldERPTVNlbGVjdGlvblRvUG9zKShwbSwgZnJvbSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGxhc3QgPSBwbS5zZWwubGFzdE5vbk5vZGVQb3M7XG4gIHZhciBiZXlvbmQgPSAoMCwgX3NlbGVjdGlvbi5maW5kU2VsZWN0aW9uRnJvbSkocG0uZG9jLCBkaXIgPCAwID8gZnJvbSA6IHRvLCBkaXIpO1xuICBpZiAobGFzdCAmJiBiZXlvbmQgJiYgX21vZGVsLlBvcy5zYW1lUGF0aChsYXN0LnBhdGgsIGJleW9uZC5mcm9tLnBhdGgpKSB7XG4gICAgKDAsIF9zZWxlY3Rpb24uc2V0RE9NU2VsZWN0aW9uVG9Qb3MpKHBtLCBsYXN0KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcG0uc2V0U2VsZWN0aW9uRGlyZWN0KGJleW9uZCk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5fb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJzZWxlY3RCbG9ja1VwXCIsXG4gIGxhYmVsOiBcIk1vdmUgdGhlIHNlbGVjdGlvbiBvbnRvIG9yIG91dCBvZiB0aGUgYmxvY2sgYWJvdmVcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICB2YXIgZG9uZSA9IHNlbGVjdEJsb2NrVmVydGljYWxseShwbSwgLTEpO1xuICAgIGlmIChkb25lICE9PSBmYWxzZSkgcG0uc2Nyb2xsSW50b1ZpZXcoKTtcbiAgICByZXR1cm4gZG9uZTtcbiAgfSxcbiAga2V5OiBcIlVwXCJcbn0pO1xuXG5fb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJzZWxlY3RCbG9ja0Rvd25cIixcbiAgbGFiZWw6IFwiTW92ZSB0aGUgc2VsZWN0aW9uIG9udG8gb3Igb3V0IG9mIHRoZSBibG9jayBiZWxvd1wiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgIHZhciBkb25lID0gc2VsZWN0QmxvY2tWZXJ0aWNhbGx5KHBtLCAxKTtcbiAgICBpZiAoZG9uZSAhPT0gZmFsc2UpIHBtLnNjcm9sbEludG9WaWV3KCk7XG4gICAgcmV0dXJuIGRvbmU7XG4gIH0sXG4gIGtleTogXCJEb3duXCJcbn0pOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2RvbSA9IHJlcXVpcmUoXCIuLi9kb21cIik7XG5cbigwLCBfZG9tLmluc2VydENTUykoXCJcXG5cXG4uUHJvc2VNaXJyb3Ige1xcbiAgYm9yZGVyOiAxcHggc29saWQgc2lsdmVyO1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItY29udGVudCB7XFxuICBwYWRkaW5nOiA0cHggOHB4IDRweCAxNHB4O1xcbiAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMjtcXG59XFxuXFxuLlByb3NlTWlycm9yLWRyb3AtdGFyZ2V0IHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHdpZHRoOiAxcHg7XFxuICBiYWNrZ3JvdW5kOiAjNjY2O1xcbiAgZGlzcGxheTogbm9uZTtcXG59XFxuXFxuLlByb3NlTWlycm9yLWNvbnRlbnQgdWwudGlnaHQgcCwgLlByb3NlTWlycm9yLWNvbnRlbnQgb2wudGlnaHQgcCB7XFxuICBtYXJnaW46IDA7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1jb250ZW50IHVsLCAuUHJvc2VNaXJyb3ItY29udGVudCBvbCB7XFxuICBwYWRkaW5nLWxlZnQ6IDMwcHg7XFxuICBjdXJzb3I6IGRlZmF1bHQ7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1jb250ZW50IGJsb2NrcXVvdGUge1xcbiAgcGFkZGluZy1sZWZ0OiAxZW07XFxuICBib3JkZXItbGVmdDogM3B4IHNvbGlkICNlZWU7XFxuICBtYXJnaW4tbGVmdDogMDsgbWFyZ2luLXJpZ2h0OiAwO1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItY29udGVudCBwcmUge1xcbiAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xcbn1cXG5cXG4uUHJvc2VNaXJyb3Itc2VsZWN0ZWRub2RlIHtcXG4gIG91dGxpbmU6IDJweCBzb2xpZCAjOGNmO1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItY29udGVudCBwOmZpcnN0LWNoaWxkLFxcbi5Qcm9zZU1pcnJvci1jb250ZW50IGgxOmZpcnN0LWNoaWxkLFxcbi5Qcm9zZU1pcnJvci1jb250ZW50IGgyOmZpcnN0LWNoaWxkLFxcbi5Qcm9zZU1pcnJvci1jb250ZW50IGgzOmZpcnN0LWNoaWxkLFxcbi5Qcm9zZU1pcnJvci1jb250ZW50IGg0OmZpcnN0LWNoaWxkLFxcbi5Qcm9zZU1pcnJvci1jb250ZW50IGg1OmZpcnN0LWNoaWxkLFxcbi5Qcm9zZU1pcnJvci1jb250ZW50IGg2OmZpcnN0LWNoaWxkIHtcXG4gIG1hcmdpbi10b3A6IC4zZW07XFxufVxcblxcbi8qIEFkZCBzcGFjZSBhcm91bmQgdGhlIGhyIHRvIG1ha2UgY2xpY2tpbmcgaXQgZWFzaWVyICovXFxuXFxuLlByb3NlTWlycm9yLWNvbnRlbnQgaHIge1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgaGVpZ2h0OiA2cHg7XFxuICBib3JkZXI6IG5vbmU7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1jb250ZW50IGhyOmFmdGVyIHtcXG4gIGNvbnRlbnQ6IFxcXCJcXFwiO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgbGVmdDogMTBweDtcXG4gIHJpZ2h0OiAxMHB4O1xcbiAgdG9wOiAycHg7XFxuICBib3JkZXItdG9wOiAycHggc29saWQgc2lsdmVyO1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItY29udGVudCBpbWcge1xcbiAgY3Vyc29yOiBkZWZhdWx0O1xcbn1cXG5cXG4vKiBNYWtlIHN1cmUgbGkgc2VsZWN0aW9ucyB3cmFwIGFyb3VuZCBtYXJrZXJzICovXFxuXFxuLlByb3NlTWlycm9yLWNvbnRlbnQgbGkge1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7IC8qIERvbid0IGRvIHdlaXJkIHN0dWZmIHdpdGggbWFya2VyIGNsaWNrcyAqL1xcbn1cXG4uUHJvc2VNaXJyb3ItY29udGVudCBsaSA+ICoge1xcbiAgcG9pbnRlci1ldmVudHM6IGF1dG87XFxufVxcblxcbmxpLlByb3NlTWlycm9yLXNlbGVjdGVkbm9kZSB7XFxuICBvdXRsaW5lOiBub25lO1xcbn1cXG5cXG5saS5Qcm9zZU1pcnJvci1zZWxlY3RlZG5vZGU6YWZ0ZXIge1xcbiAgY29udGVudDogXFxcIlxcXCI7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBsZWZ0OiAtMzJweDtcXG4gIHJpZ2h0OiAtMnB4OyB0b3A6IC0ycHg7IGJvdHRvbTogLTJweDtcXG4gIGJvcmRlcjogMnB4IHNvbGlkICM4Y2Y7XFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxuXFxuXCIpOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5hcHBseURPTUNoYW5nZSA9IGFwcGx5RE9NQ2hhbmdlO1xuZXhwb3J0cy50ZXh0Q29udGV4dCA9IHRleHRDb250ZXh0O1xuZXhwb3J0cy50ZXh0SW5Db250ZXh0ID0gdGV4dEluQ29udGV4dDtcblxudmFyIF9tb2RlbCA9IHJlcXVpcmUoXCIuLi9tb2RlbFwiKTtcblxudmFyIF9wYXJzZURvbSA9IHJlcXVpcmUoXCIuLi9wYXJzZS9kb21cIik7XG5cbnZhciBfdHJhbnNmb3JtVHJlZSA9IHJlcXVpcmUoXCIuLi90cmFuc2Zvcm0vdHJlZVwiKTtcblxudmFyIF9zZWxlY3Rpb24gPSByZXF1aXJlKFwiLi9zZWxlY3Rpb25cIik7XG5cbmZ1bmN0aW9uIGlzQXRFbmQobm9kZSwgcG9zLCBkZXB0aCkge1xuICBmb3IgKHZhciBpID0gZGVwdGggfHwgMDsgaSA8IHBvcy5wYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG4gPSBwb3MucGF0aFtkZXB0aF07XG4gICAgaWYgKG4gPCBub2RlLnNpemUgLSAxKSByZXR1cm4gZmFsc2U7XG4gICAgbm9kZSA9IG5vZGUuY2hpbGQobik7XG4gIH1cbiAgcmV0dXJuIHBvcy5vZmZzZXQgPT0gbm9kZS5zaXplO1xufVxuZnVuY3Rpb24gaXNBdFN0YXJ0KHBvcywgZGVwdGgpIHtcbiAgaWYgKHBvcy5vZmZzZXQgPiAwKSByZXR1cm4gZmFsc2U7XG4gIGZvciAodmFyIGkgPSBkZXB0aCB8fCAwOyBpIDwgcG9zLnBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAocG9zLnBhdGhbZGVwdGhdID4gMCkgcmV0dXJuIGZhbHNlO1xuICB9cmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTmVhclNlbGVjdGlvbihwbSkge1xuICB2YXIgZG9tID0gcG0uY29udGVudCxcbiAgICAgIG5vZGUgPSBwbS5kb2M7XG4gIHZhciBfcG0kc2VsZWN0aW9uID0gcG0uc2VsZWN0aW9uO1xuICB2YXIgZnJvbSA9IF9wbSRzZWxlY3Rpb24uZnJvbTtcbiAgdmFyIHRvID0gX3BtJHNlbGVjdGlvbi50bztcblxuICBmb3IgKHZhciBkZXB0aCA9IDA7OyBkZXB0aCsrKSB7XG4gICAgdmFyIHRvTm9kZSA9IG5vZGUuY2hpbGQodG8ucGF0aFtkZXB0aF0pO1xuICAgIHZhciBmcm9tU3RhcnQgPSBpc0F0U3RhcnQoZnJvbSwgZGVwdGggKyAxKTtcbiAgICB2YXIgdG9FbmQgPSBpc0F0RW5kKHRvTm9kZSwgdG8sIGRlcHRoICsgMSk7XG4gICAgaWYgKGZyb21TdGFydCB8fCB0b0VuZCB8fCBmcm9tLnBhdGhbZGVwdGhdICE9IHRvLnBhdGhbZGVwdGhdIHx8IHRvTm9kZS5pc1RleHRibG9jaykge1xuICAgICAgdmFyIHN0YXJ0T2Zmc2V0ID0gZGVwdGggPT0gZnJvbS5kZXB0aCA/IGZyb20ub2Zmc2V0IDogZnJvbS5wYXRoW2RlcHRoXTtcbiAgICAgIGlmIChmcm9tU3RhcnQgJiYgc3RhcnRPZmZzZXQgPiAwKSBzdGFydE9mZnNldC0tO1xuICAgICAgdmFyIGVuZE9mZnNldCA9IGRlcHRoID09IHRvLmRlcHRoID8gdG8ub2Zmc2V0IDogdG8ucGF0aFtkZXB0aF0gKyAxO1xuICAgICAgaWYgKHRvRW5kICYmIGVuZE9mZnNldCA8IG5vZGUuc2l6ZSAtIDEpIGVuZE9mZnNldCsrO1xuICAgICAgdmFyIHBhcnNlZCA9ICgwLCBfcGFyc2VEb20uZnJvbURPTSkocG0uc2NoZW1hLCBkb20sIHsgdG9wTm9kZTogbm9kZS5jb3B5KCksXG4gICAgICAgIGZyb206IHN0YXJ0T2Zmc2V0LFxuICAgICAgICB0bzogZG9tLmNoaWxkTm9kZXMubGVuZ3RoIC0gKG5vZGUuc2l6ZSAtIGVuZE9mZnNldCkgfSk7XG4gICAgICBwYXJzZWQgPSBwYXJzZWQuY29weShub2RlLmNvbnRlbnQuc2xpY2UoMCwgc3RhcnRPZmZzZXQpLmFwcGVuZChwYXJzZWQuY29udGVudCkuYXBwZW5kKG5vZGUuY29udGVudC5zbGljZShlbmRPZmZzZXQpKSk7XG4gICAgICBmb3IgKHZhciBpID0gZGVwdGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB2YXIgd3JhcCA9IHBtLmRvYy5wYXRoKGZyb20ucGF0aC5zbGljZSgwLCBpKSk7XG4gICAgICAgIHBhcnNlZCA9IHdyYXAucmVwbGFjZShmcm9tLnBhdGhbaV0sIHBhcnNlZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFyc2VkO1xuICAgIH1cbiAgICBub2RlID0gdG9Ob2RlO1xuICAgIGRvbSA9ICgwLCBfc2VsZWN0aW9uLmZpbmRCeVBhdGgpKGRvbSwgZnJvbS5wYXRoW2RlcHRoXSwgZmFsc2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFwcGx5RE9NQ2hhbmdlKHBtKSB7XG4gIHZhciB1cGRhdGVkID0gcGFyc2VOZWFyU2VsZWN0aW9uKHBtKTtcbiAgdmFyIGNoYW5nZVN0YXJ0ID0gKDAsIF9tb2RlbC5maW5kRGlmZlN0YXJ0KShwbS5kb2MuY29udGVudCwgdXBkYXRlZC5jb250ZW50KTtcbiAgaWYgKGNoYW5nZVN0YXJ0KSB7XG4gICAgdmFyIGNoYW5nZUVuZCA9IGZpbmREaWZmRW5kQ29uc3RyYWluZWQocG0uZG9jLmNvbnRlbnQsIHVwZGF0ZWQuY29udGVudCwgY2hhbmdlU3RhcnQpO1xuICAgIC8vIE1hcmsgbm9kZXMgdG91Y2hlZCBieSB0aGlzIGNoYW5nZSBhcyAndG8gYmUgcmVkcmF3bidcbiAgICBwbS5tYXJrUmFuZ2VEaXJ0eShwbS5kb2Muc2libGluZ1JhbmdlKGNoYW5nZVN0YXJ0LCBjaGFuZ2VFbmQuYSkpO1xuXG4gICAgcG0udHIucmVwbGFjZShjaGFuZ2VTdGFydCwgY2hhbmdlRW5kLmEsIHVwZGF0ZWQsIGNoYW5nZVN0YXJ0LCBjaGFuZ2VFbmQuYikuYXBwbHkoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gb2Zmc2V0QnkoZmlyc3QsIHNlY29uZCwgcG9zKSB7XG4gIHZhciBzYW1lID0gKDAsIF90cmFuc2Zvcm1UcmVlLnNhbWVQYXRoRGVwdGgpKGZpcnN0LCBzZWNvbmQpO1xuICB2YXIgZmlyc3RFbmQgPSBzYW1lID09IGZpcnN0LmRlcHRoLFxuICAgICAgc2Vjb25kRW5kID0gc2FtZSA9PSBzZWNvbmQuZGVwdGg7XG4gIHZhciBvZmYgPSAoc2Vjb25kRW5kID8gc2Vjb25kLm9mZnNldCA6IHNlY29uZC5wYXRoW3NhbWVdKSAtIChmaXJzdEVuZCA/IGZpcnN0Lm9mZnNldCA6IGZpcnN0LnBhdGhbc2FtZV0pO1xuICB2YXIgc2hvcnRlciA9IGZpcnN0RW5kID8gcG9zLm1vdmUob2ZmKSA6IHBvcy5zaG9ydGVuKHNhbWUsIG9mZik7XG4gIGlmIChzZWNvbmRFbmQpIHJldHVybiBzaG9ydGVyO2Vsc2UgcmV0dXJuIHNob3J0ZXIuZXh0ZW5kKG5ldyBfbW9kZWwuUG9zKHNlY29uZC5wYXRoLnNsaWNlKHNhbWUpLCBzZWNvbmQub2Zmc2V0KSk7XG59XG5cbmZ1bmN0aW9uIGZpbmREaWZmRW5kQ29uc3RyYWluZWQoYSwgYiwgc3RhcnQpIHtcbiAgdmFyIGVuZCA9ICgwLCBfbW9kZWwuZmluZERpZmZFbmQpKGEsIGIpO1xuICBpZiAoIWVuZCkgcmV0dXJuIGVuZDtcbiAgaWYgKGVuZC5hLmNtcChzdGFydCkgPCAwKSByZXR1cm4geyBhOiBzdGFydCwgYjogb2Zmc2V0QnkoZW5kLmEsIHN0YXJ0LCBlbmQuYikgfTtcbiAgaWYgKGVuZC5iLmNtcChzdGFydCkgPCAwKSByZXR1cm4geyBhOiBvZmZzZXRCeShlbmQuYiwgc3RhcnQsIGVuZC5hKSwgYjogc3RhcnQgfTtcbiAgcmV0dXJuIGVuZDtcbn1cblxuLy8gVGV4dC1vbmx5IHF1ZXJpZXMgZm9yIGNvbXBvc2l0aW9uIGV2ZW50c1xuXG5mdW5jdGlvbiB0ZXh0Q29udGV4dChkYXRhKSB7XG4gIHZhciByYW5nZSA9IGdldFNlbGVjdGlvbigpLmdldFJhbmdlQXQoMCk7XG4gIHZhciBzdGFydCA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyLFxuICAgICAgZW5kID0gcmFuZ2UuZW5kQ29udGFpbmVyO1xuICBpZiAoc3RhcnQgPT0gZW5kICYmIHN0YXJ0Lm5vZGVUeXBlID09IDMpIHtcbiAgICB2YXIgdmFsdWUgPSBzdGFydC5ub2RlVmFsdWUsXG4gICAgICAgIGxlYWQgPSByYW5nZS5zdGFydE9mZnNldCxcbiAgICAgICAgX2VuZCA9IHJhbmdlLmVuZE9mZnNldDtcbiAgICBpZiAoZGF0YSAmJiBfZW5kID49IGRhdGEubGVuZ3RoICYmIHZhbHVlLnNsaWNlKF9lbmQgLSBkYXRhLmxlbmd0aCwgX2VuZCkgPT0gZGF0YSkgbGVhZCA9IF9lbmQgLSBkYXRhLmxlbmd0aDtcbiAgICByZXR1cm4geyBpbnNpZGU6IHN0YXJ0LCBsZWFkOiBsZWFkLCB0cmFpbDogdmFsdWUubGVuZ3RoIC0gX2VuZCB9O1xuICB9XG5cbiAgdmFyIHNpemVCZWZvcmUgPSBudWxsLFxuICAgICAgc2l6ZUFmdGVyID0gbnVsbDtcbiAgdmFyIGJlZm9yZSA9IHN0YXJ0LmNoaWxkTm9kZXNbcmFuZ2Uuc3RhcnRPZmZzZXQgLSAxXSB8fCBub2RlQmVmb3JlKHN0YXJ0KTtcbiAgd2hpbGUgKGJlZm9yZS5sYXN0Q2hpbGQpIGJlZm9yZSA9IGJlZm9yZS5sYXN0Q2hpbGQ7XG4gIGlmIChiZWZvcmUgJiYgYmVmb3JlLm5vZGVUeXBlID09IDMpIHtcbiAgICB2YXIgdmFsdWUgPSBiZWZvcmUubm9kZVZhbHVlO1xuICAgIHNpemVCZWZvcmUgPSB2YWx1ZS5sZW5ndGg7XG4gICAgaWYgKGRhdGEgJiYgdmFsdWUuc2xpY2UodmFsdWUubGVuZ3RoIC0gZGF0YS5sZW5ndGgpID09IGRhdGEpIHNpemVCZWZvcmUgLT0gZGF0YS5sZW5ndGg7XG4gIH1cbiAgdmFyIGFmdGVyID0gZW5kLmNoaWxkTm9kZXNbcmFuZ2UuZW5kT2Zmc2V0XSB8fCBub2RlQWZ0ZXIoZW5kKTtcbiAgd2hpbGUgKGFmdGVyLmZpcnN0Q2hpbGQpIGFmdGVyID0gYWZ0ZXIuZmlyc3RDaGlsZDtcbiAgaWYgKGFmdGVyICYmIGFmdGVyLm5vZGVUeXBlID09IDMpIHNpemVBZnRlciA9IGFmdGVyLm5vZGVWYWx1ZS5sZW5ndGg7XG5cbiAgcmV0dXJuIHsgYmVmb3JlOiBiZWZvcmUsIHNpemVCZWZvcmU6IHNpemVCZWZvcmUsXG4gICAgYWZ0ZXI6IGFmdGVyLCBzaXplQWZ0ZXI6IHNpemVBZnRlciB9O1xufVxuXG5mdW5jdGlvbiB0ZXh0SW5Db250ZXh0KGNvbnRleHQsIGRlZmx0KSB7XG4gIGlmIChjb250ZXh0Lmluc2lkZSkge1xuICAgIHZhciBfdmFsID0gY29udGV4dC5pbnNpZGUubm9kZVZhbHVlO1xuICAgIHJldHVybiBfdmFsLnNsaWNlKGNvbnRleHQubGVhZCwgX3ZhbC5sZW5ndGggLSBjb250ZXh0LnRyYWlsKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgYmVmb3JlID0gY29udGV4dC5iZWZvcmUsXG4gICAgICAgIGFmdGVyID0gY29udGV4dC5hZnRlcixcbiAgICAgICAgdmFsID0gXCJcIjtcbiAgICBpZiAoIWJlZm9yZSkgcmV0dXJuIGRlZmx0O1xuICAgIGlmIChiZWZvcmUubm9kZVR5cGUgPT0gMykgdmFsID0gYmVmb3JlLm5vZGVWYWx1ZS5zbGljZShjb250ZXh0LnNpemVCZWZvcmUpO1xuICAgIHZhciBzY2FuID0gc2NhblRleHQoYmVmb3JlLCBhZnRlcik7XG4gICAgaWYgKHNjYW4gPT0gbnVsbCkgcmV0dXJuIGRlZmx0O1xuICAgIHZhbCArPSBzY2FuO1xuICAgIGlmIChhZnRlciAmJiBhZnRlci5ub2RlVHlwZSA9PSAzKSB7XG4gICAgICB2YXIgdmFsQWZ0ZXIgPSBhZnRlci5ub2RlVmFsdWU7XG4gICAgICB2YWwgKz0gdmFsQWZ0ZXIuc2xpY2UoMCwgdmFsQWZ0ZXIubGVuZ3RoIC0gY29udGV4dC5zaXplQWZ0ZXIpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vZGVBZnRlcihub2RlKSB7XG4gIGZvciAoOzspIHtcbiAgICB2YXIgbmV4dCA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgaWYgKG5leHQpIHtcbiAgICAgIHdoaWxlIChuZXh0LmZpcnN0Q2hpbGQpIG5leHQgPSBuZXh0LmZpcnN0Q2hpbGQ7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9XG4gICAgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50RWxlbWVudCkpIHJldHVybiBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vZGVCZWZvcmUobm9kZSkge1xuICBmb3IgKDs7KSB7XG4gICAgdmFyIHByZXYgPSBub2RlLnByZXZpb3VzU2libGluZztcbiAgICBpZiAocHJldikge1xuICAgICAgd2hpbGUgKHByZXYubGFzdENoaWxkKSBwcmV2ID0gcHJldi5sYXN0Q2hpbGQ7XG4gICAgICByZXR1cm4gcHJldjtcbiAgICB9XG4gICAgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50RWxlbWVudCkpIHJldHVybiBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNjYW5UZXh0KHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHRleHQgPSBcIlwiLFxuICAgICAgY3VyID0gbm9kZUFmdGVyKHN0YXJ0KTtcbiAgZm9yICg7Oykge1xuICAgIGlmIChjdXIgPT0gZW5kKSByZXR1cm4gdGV4dDtcbiAgICBpZiAoIWN1cikgcmV0dXJuIG51bGw7XG4gICAgaWYgKGN1ci5ub2RlVHlwZSA9PSAzKSB0ZXh0ICs9IGN1ci5ub2RlVmFsdWU7XG4gICAgY3VyID0gY3VyLmZpcnN0Q2hpbGQgfHwgbm9kZUFmdGVyKGN1cik7XG4gIH1cbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZHJhdyA9IGRyYXc7XG5leHBvcnRzLnJlZHJhdyA9IHJlZHJhdztcblxudmFyIF9tb2RlbCA9IHJlcXVpcmUoXCIuLi9tb2RlbFwiKTtcblxudmFyIF9zZXJpYWxpemVEb20gPSByZXF1aXJlKFwiLi4vc2VyaWFsaXplL2RvbVwiKTtcblxudmFyIF9kb20gPSByZXF1aXJlKFwiLi4vZG9tXCIpO1xuXG52YXIgX21haW4gPSByZXF1aXJlKFwiLi9tYWluXCIpO1xuXG4vLyBGSVhNRSBjbGVhbiB1cCB0aHJlYWRpbmcgb2YgcGF0aCBhbmQgb2Zmc2V0LCBtYXliZSByZW1vdmUgZnJvbSBET00gcmVuZGVyZXIgZW50aXJlbHlcblxuZnVuY3Rpb24gb3B0aW9ucyhwYXRoLCByYW5nZXMpIHtcbiAgcmV0dXJuIHtcbiAgICBvblJlbmRlcjogZnVuY3Rpb24gb25SZW5kZXIobm9kZSwgZG9tLCBvZmZzZXQpIHtcbiAgICAgIGlmICghbm9kZS5pc1RleHQgJiYgbm9kZS50eXBlLmNvbnRhaW5zID09IG51bGwpIHtcbiAgICAgICAgZG9tLmNvbnRlbnRFZGl0YWJsZSA9IGZhbHNlO1xuICAgICAgICBpZiAobm9kZS5pc0Jsb2NrKSBkb20uc2V0QXR0cmlidXRlKFwicG0tbGVhZlwiLCBcInRydWVcIik7XG4gICAgICB9XG4gICAgICBpZiAobm9kZS5pc0Jsb2NrICYmIG9mZnNldCAhPSBudWxsKSBkb20uc2V0QXR0cmlidXRlKFwicG0tb2Zmc2V0XCIsIG9mZnNldCk7XG4gICAgICBpZiAobm9kZS5pc1RleHRibG9jaykgYWRqdXN0VHJhaWxpbmdIYWNrcyhkb20sIG5vZGUpO1xuXG4gICAgICByZXR1cm4gZG9tO1xuICAgIH0sXG4gICAgcmVuZGVySW5saW5lRmxhdDogZnVuY3Rpb24gcmVuZGVySW5saW5lRmxhdChub2RlLCBkb20sIG9mZnNldCkge1xuICAgICAgcmFuZ2VzLmFkdmFuY2VUbyhuZXcgX21vZGVsLlBvcyhwYXRoLCBvZmZzZXQpKTtcbiAgICAgIHZhciBlbmQgPSBuZXcgX21vZGVsLlBvcyhwYXRoLCBvZmZzZXQgKyBub2RlLndpZHRoKTtcbiAgICAgIHZhciBuZXh0Q3V0ID0gcmFuZ2VzLm5leHRDaGFuZ2VCZWZvcmUoZW5kKTtcblxuICAgICAgdmFyIGlubmVyID0gZG9tLFxuICAgICAgICAgIHdyYXBwZWQgPSB1bmRlZmluZWQ7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUubWFya3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaW5uZXIgPSBpbm5lci5maXJzdENoaWxkO1xuICAgICAgfWlmIChkb20ubm9kZVR5cGUgIT0gMSkge1xuICAgICAgICBkb20gPSAoMCwgX2RvbS5lbHQpKFwic3BhblwiLCBudWxsLCBkb20pO1xuICAgICAgICBpZiAoIW5leHRDdXQpIHdyYXBwZWQgPSBkb207XG4gICAgICB9XG4gICAgICBpZiAoIXdyYXBwZWQgJiYgKG5leHRDdXQgfHwgcmFuZ2VzLmN1cnJlbnQubGVuZ3RoKSkge1xuICAgICAgICB3cmFwcGVkID0gaW5uZXIgPT0gZG9tID8gZG9tID0gKDAsIF9kb20uZWx0KShcInNwYW5cIiwgbnVsbCwgaW5uZXIpIDogaW5uZXIucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCgoMCwgX2RvbS5lbHQpKFwic3BhblwiLCBudWxsLCBpbm5lcikpO1xuICAgICAgfVxuXG4gICAgICBkb20uc2V0QXR0cmlidXRlKFwicG0tb2Zmc2V0XCIsIG9mZnNldCk7XG4gICAgICBpZiAobm9kZS50eXBlLmNvbnRhaW5zID09IG51bGwpIGRvbS5zZXRBdHRyaWJ1dGUoXCJwbS1sZWFmXCIsIG5vZGUuaXNUZXh0ID8gbm9kZS53aWR0aCA6IFwidHJ1ZVwiKTtcblxuICAgICAgdmFyIGlubGluZU9mZnNldCA9IDA7XG4gICAgICB3aGlsZSAobmV4dEN1dCkge1xuICAgICAgICB2YXIgc2l6ZSA9IG5leHRDdXQgLSBvZmZzZXQ7XG4gICAgICAgIHZhciBzcGxpdCA9IHNwbGl0U3Bhbih3cmFwcGVkLCBzaXplKTtcbiAgICAgICAgaWYgKHJhbmdlcy5jdXJyZW50Lmxlbmd0aCkgc3BsaXQuY2xhc3NOYW1lID0gcmFuZ2VzLmN1cnJlbnQuam9pbihcIiBcIik7XG4gICAgICAgIHNwbGl0LnNldEF0dHJpYnV0ZShcInBtLWlubmVyLW9mZnNldFwiLCBpbmxpbmVPZmZzZXQpO1xuICAgICAgICBpbmxpbmVPZmZzZXQgKz0gc2l6ZTtcbiAgICAgICAgb2Zmc2V0ICs9IHNpemU7XG4gICAgICAgIHJhbmdlcy5hZHZhbmNlVG8obmV3IF9tb2RlbC5Qb3MocGF0aCwgb2Zmc2V0KSk7XG4gICAgICAgIGlmICghKG5leHRDdXQgPSByYW5nZXMubmV4dENoYW5nZUJlZm9yZShlbmQpKSkgd3JhcHBlZC5zZXRBdHRyaWJ1dGUoXCJwbS1pbm5lci1vZmZzZXRcIiwgaW5saW5lT2Zmc2V0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJhbmdlcy5jdXJyZW50Lmxlbmd0aCkgd3JhcHBlZC5jbGFzc05hbWUgPSByYW5nZXMuY3VycmVudC5qb2luKFwiIFwiKTtcbiAgICAgIHJldHVybiBkb207XG4gICAgfSxcbiAgICBkb2N1bWVudDogZG9jdW1lbnQsIHBhdGg6IHBhdGhcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3BsaXRTcGFuKHNwYW4sIGF0KSB7XG4gIHZhciB0ZXh0Tm9kZSA9IHNwYW4uZmlyc3RDaGlsZCxcbiAgICAgIHRleHQgPSB0ZXh0Tm9kZS5ub2RlVmFsdWU7XG4gIHZhciBuZXdOb2RlID0gc3Bhbi5wYXJlbnROb2RlLmluc2VydEJlZm9yZSgoMCwgX2RvbS5lbHQpKFwic3BhblwiLCBudWxsLCB0ZXh0LnNsaWNlKDAsIGF0KSksIHNwYW4pO1xuICB0ZXh0Tm9kZS5ub2RlVmFsdWUgPSB0ZXh0LnNsaWNlKGF0KTtcbiAgcmV0dXJuIG5ld05vZGU7XG59XG5cbmZ1bmN0aW9uIGRyYXcocG0sIGRvYykge1xuICBwbS5jb250ZW50LnRleHRDb250ZW50ID0gXCJcIjtcbiAgcG0uY29udGVudC5hcHBlbmRDaGlsZCgoMCwgX3NlcmlhbGl6ZURvbS50b0RPTSkoZG9jLCBvcHRpb25zKFtdLCBwbS5yYW5nZXMuYWN0aXZlUmFuZ2VUcmFja2VyKCkpKSk7XG59XG5cbmZ1bmN0aW9uIGFkanVzdFRyYWlsaW5nSGFja3MoZG9tLCBub2RlKSB7XG4gIHZhciBuZWVkcyA9IG5vZGUuc2l6ZSA9PSAwIHx8IG5vZGUubGFzdENoaWxkLnR5cGUuaXNCUiA/IFwiYnJcIiA6ICFub2RlLmxhc3RDaGlsZC5pc1RleHQgJiYgbm9kZS5sYXN0Q2hpbGQudHlwZS5jb250YWlucyA9PSBudWxsID8gXCJ0ZXh0XCIgOiBudWxsO1xuICB2YXIgbGFzdCA9IGRvbS5sYXN0Q2hpbGQ7XG4gIHZhciBoYXMgPSAhbGFzdCB8fCBsYXN0Lm5vZGVUeXBlICE9IDEgfHwgIWxhc3QuaGFzQXR0cmlidXRlKFwicG0taWdub3JlXCIpID8gbnVsbCA6IGxhc3Qubm9kZU5hbWUgPT0gXCJCUlwiID8gXCJiclwiIDogXCJ0ZXh0XCI7XG4gIGlmIChuZWVkcyAhPSBoYXMpIHtcbiAgICBpZiAoaGFzKSBkb20ucmVtb3ZlQ2hpbGQobGFzdCk7XG4gICAgaWYgKG5lZWRzKSBkb20uYXBwZW5kQ2hpbGQobmVlZHMgPT0gXCJiclwiID8gKDAsIF9kb20uZWx0KShcImJyXCIsIHsgXCJwbS1pZ25vcmVcIjogXCJ0cmFpbGluZy1icmVha1wiIH0pIDogKDAsIF9kb20uZWx0KShcInNwYW5cIiwgeyBcInBtLWlnbm9yZVwiOiBcImN1cnNvci10ZXh0XCIgfSwgXCJcIikpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmROb2RlSW4oaXRlciwgbm9kZSkge1xuICB2YXIgY29weSA9IGl0ZXIuY29weSgpO1xuICBmb3IgKHZhciBjaGlsZCA9IHVuZGVmaW5lZDsgY2hpbGQgPSBjb3B5Lm5leHQoKS52YWx1ZTspIHtcbiAgICBpZiAoY2hpbGQgPT0gbm9kZSkgcmV0dXJuIGNoaWxkO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1vdmVQYXN0KGRvbSkge1xuICB2YXIgbmV4dCA9IGRvbS5uZXh0U2libGluZztcbiAgZG9tLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZG9tKTtcbiAgcmV0dXJuIG5leHQ7XG59XG5cbmZ1bmN0aW9uIHJlZHJhdyhwbSwgZGlydHksIGRvYywgcHJldikge1xuICB2YXIgb3B0cyA9IG9wdGlvbnMoW10sIHBtLnJhbmdlcy5hY3RpdmVSYW5nZVRyYWNrZXIoKSk7XG5cbiAgZnVuY3Rpb24gc2Nhbihkb20sIG5vZGUsIHByZXYpIHtcbiAgICB2YXIgaU5vZGUgPSBub2RlLml0ZXIoKSxcbiAgICAgICAgaVByZXYgPSBwcmV2Lml0ZXIoKSxcbiAgICAgICAgcENoaWxkID0gaVByZXYubmV4dCgpLnZhbHVlO1xuICAgIHZhciBkb21Qb3MgPSBkb20uZmlyc3RDaGlsZDtcblxuICAgIGZvciAodmFyIGNoaWxkID0gdW5kZWZpbmVkOyBjaGlsZCA9IGlOb2RlLm5leHQoKS52YWx1ZTspIHtcbiAgICAgIHZhciBvZmZzZXQgPSBpTm9kZS5vZmZzZXQgLSBjaGlsZC53aWR0aCxcbiAgICAgICAgICBtYXRjaGluZyA9IHVuZGVmaW5lZCxcbiAgICAgICAgICByZXVzZURPTSA9IHVuZGVmaW5lZDtcbiAgICAgIGlmICghbm9kZS5pc1RleHRibG9jaykgb3B0cy5wYXRoLnB1c2gob2Zmc2V0KTtcblxuICAgICAgaWYgKHBDaGlsZCA9PSBjaGlsZCkge1xuICAgICAgICBtYXRjaGluZyA9IHBDaGlsZDtcbiAgICAgIH0gZWxzZSBpZiAobWF0Y2hpbmcgPSBmaW5kTm9kZUluKGlQcmV2LCBjaGlsZCkpIHtcbiAgICAgICAgd2hpbGUgKHBDaGlsZCAhPSBtYXRjaGluZykge1xuICAgICAgICAgIHBDaGlsZCA9IGlQcmV2Lm5leHQoKS52YWx1ZTtcbiAgICAgICAgICBkb21Qb3MgPSBtb3ZlUGFzdChkb21Qb3MpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChtYXRjaGluZyAmJiAhZGlydHkuZ2V0KG1hdGNoaW5nKSkge1xuICAgICAgICByZXVzZURPTSA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHBDaGlsZCAmJiAhY2hpbGQuaXNUZXh0ICYmIGNoaWxkLnNhbWVNYXJrdXAocENoaWxkKSAmJiBkaXJ0eS5nZXQocENoaWxkKSAhPSBfbWFpbi5ESVJUWV9SRURSQVcpIHtcbiAgICAgICAgcmV1c2VET00gPSB0cnVlO1xuICAgICAgICB2YXIgY29udGVudE5vZGUgPSBkb21Qb3M7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICB2YXIgZmlyc3QgPSBjb250ZW50Tm9kZS5maXJzdENoaWxkO1xuICAgICAgICAgIGlmICghZmlyc3QgfHwgIWZpcnN0Lmhhc0F0dHJpYnV0ZSB8fCBmaXJzdC5oYXNBdHRyaWJ1dGUoXCJwbS1pZ25vcmVcIikgfHwgZmlyc3QuaGFzQXR0cmlidXRlKFwicG0tb2Zmc2V0XCIpKSBicmVhaztcbiAgICAgICAgICBjb250ZW50Tm9kZSA9IGZpcnN0O1xuICAgICAgICB9XG4gICAgICAgIHNjYW4oY29udGVudE5vZGUsIGNoaWxkLCBwQ2hpbGQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlbmRlcmVkID0gKDAsIF9zZXJpYWxpemVEb20ucmVuZGVyTm9kZVRvRE9NKShjaGlsZCwgb3B0cywgb2Zmc2V0KTtcbiAgICAgICAgZG9tLmluc2VydEJlZm9yZShyZW5kZXJlZCwgZG9tUG9zKTtcbiAgICAgICAgcmV1c2VET00gPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJldXNlRE9NKSB7XG4gICAgICAgIGRvbVBvcy5zZXRBdHRyaWJ1dGUoXCJwbS1vZmZzZXRcIiwgb2Zmc2V0KTtcbiAgICAgICAgZG9tUG9zID0gZG9tUG9zLm5leHRTaWJsaW5nO1xuICAgICAgICBwQ2hpbGQgPSBpUHJldi5uZXh0KCkudmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoIW5vZGUuaXNUZXh0YmxvY2spIG9wdHMucGF0aC5wb3AoKTtcbiAgICB9XG5cbiAgICB3aGlsZSAocENoaWxkKSB7XG4gICAgICBkb21Qb3MgPSBtb3ZlUGFzdChkb21Qb3MpO1xuICAgICAgcENoaWxkID0gaVByZXYubmV4dCgpLnZhbHVlO1xuICAgIH1cbiAgICBpZiAobm9kZS5pc1RleHRibG9jaykgYWRqdXN0VHJhaWxpbmdIYWNrcyhkb20sIG5vZGUpO1xuICB9XG4gIHNjYW4ocG0uY29udGVudCwgZG9jLCBwcmV2KTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgX21vZGVsID0gcmVxdWlyZShcIi4uL21vZGVsXCIpO1xuXG52YXIgX3RyYW5zZm9ybSA9IHJlcXVpcmUoXCIuLi90cmFuc2Zvcm1cIik7XG5cbnZhciBJbnZlcnRlZFN0ZXAgPSBmdW5jdGlvbiBJbnZlcnRlZFN0ZXAoc3RlcCwgdmVyc2lvbiwgaWQpIHtcbiAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEludmVydGVkU3RlcCk7XG5cbiAgdGhpcy5zdGVwID0gc3RlcDtcbiAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjtcbiAgdGhpcy5pZCA9IGlkO1xufTtcblxudmFyIEJyYW5jaFJlbWFwcGluZyA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEJyYW5jaFJlbWFwcGluZyhicmFuY2gpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQnJhbmNoUmVtYXBwaW5nKTtcblxuICAgIHRoaXMuYnJhbmNoID0gYnJhbmNoO1xuICAgIHRoaXMucmVtYXAgPSBuZXcgX3RyYW5zZm9ybS5SZW1hcHBpbmcoKTtcbiAgICB0aGlzLnZlcnNpb24gPSBicmFuY2gudmVyc2lvbjtcbiAgICB0aGlzLm1pcnJvckJ1ZmZlciA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQnJhbmNoUmVtYXBwaW5nLCBbe1xuICAgIGtleTogXCJtb3ZlVG9WZXJzaW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1vdmVUb1ZlcnNpb24odmVyc2lvbikge1xuICAgICAgd2hpbGUgKHRoaXMudmVyc2lvbiA+IHZlcnNpb24pIHRoaXMuYWRkTmV4dE1hcCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGROZXh0TWFwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZE5leHRNYXAoKSB7XG4gICAgICB2YXIgZm91bmQgPSB0aGlzLmJyYW5jaC5taXJyb3JbdGhpcy52ZXJzaW9uXTtcbiAgICAgIHZhciBtYXBPZmZzZXQgPSB0aGlzLmJyYW5jaC5tYXBzLmxlbmd0aCAtICh0aGlzLmJyYW5jaC52ZXJzaW9uIC0gdGhpcy52ZXJzaW9uKSAtIDE7XG4gICAgICB2YXIgaWQgPSB0aGlzLnJlbWFwLmFkZFRvRnJvbnQodGhpcy5icmFuY2gubWFwc1ttYXBPZmZzZXRdLCB0aGlzLm1pcnJvckJ1ZmZlclt0aGlzLnZlcnNpb25dKTtcbiAgICAgIC0tdGhpcy52ZXJzaW9uO1xuICAgICAgaWYgKGZvdW5kICE9IG51bGwpIHRoaXMubWlycm9yQnVmZmVyW2ZvdW5kXSA9IGlkO1xuICAgICAgcmV0dXJuIGlkO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJtb3ZlUGFzdFN0ZXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbW92ZVBhc3RTdGVwKHJlc3VsdCkge1xuICAgICAgdmFyIGlkID0gdGhpcy5hZGROZXh0TWFwKCk7XG4gICAgICBpZiAocmVzdWx0KSB0aGlzLnJlbWFwLmFkZFRvQmFjayhyZXN1bHQubWFwLCBpZCk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEJyYW5jaFJlbWFwcGluZztcbn0pKCk7XG5cbnZhciB3b3JrVGltZSA9IDEwMCxcbiAgICBwYXVzZVRpbWUgPSAxNTA7XG5cbnZhciBDb21wcmVzc2lvbldvcmtlciA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENvbXByZXNzaW9uV29ya2VyKGRvYywgYnJhbmNoLCBjYWxsYmFjaykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDb21wcmVzc2lvbldvcmtlcik7XG5cbiAgICB0aGlzLmJyYW5jaCA9IGJyYW5jaDtcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgdGhpcy5yZW1hcCA9IG5ldyBCcmFuY2hSZW1hcHBpbmcoYnJhbmNoKTtcblxuICAgIHRoaXMuZG9jID0gZG9jO1xuICAgIHRoaXMuZXZlbnRzID0gW107XG4gICAgdGhpcy5tYXBzID0gW107XG4gICAgdGhpcy52ZXJzaW9uID0gdGhpcy5zdGFydFZlcnNpb24gPSBicmFuY2gudmVyc2lvbjtcblxuICAgIHRoaXMuaSA9IGJyYW5jaC5ldmVudHMubGVuZ3RoO1xuICAgIHRoaXMudGltZW91dCA9IG51bGw7XG4gICAgdGhpcy5hYm9ydGVkID0gZmFsc2U7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQ29tcHJlc3Npb25Xb3JrZXIsIFt7XG4gICAga2V5OiBcIndvcmtcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gd29yaygpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLmFib3J0ZWQpIHJldHVybjtcblxuICAgICAgdmFyIGVuZFRpbWUgPSBEYXRlLm5vdygpICsgd29ya1RpbWU7XG5cbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKHRoaXMuaSA9PSAwKSByZXR1cm4gdGhpcy5maW5pc2goKTtcbiAgICAgICAgdmFyIF9ldmVudCA9IHRoaXMuYnJhbmNoLmV2ZW50c1stLXRoaXMuaV0sXG4gICAgICAgICAgICBvdXRFdmVudCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBqID0gX2V2ZW50Lmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICAgICAgdmFyIF9ldmVudCRqID0gX2V2ZW50W2pdO1xuICAgICAgICAgIHZhciBzdGVwID0gX2V2ZW50JGouc3RlcDtcbiAgICAgICAgICB2YXIgc3RlcFZlcnNpb24gPSBfZXZlbnQkai52ZXJzaW9uO1xuICAgICAgICAgIHZhciBzdGVwSUQgPSBfZXZlbnQkai5pZDtcblxuICAgICAgICAgIHRoaXMucmVtYXAubW92ZVRvVmVyc2lvbihzdGVwVmVyc2lvbik7XG5cbiAgICAgICAgICB2YXIgbWFwcGVkU3RlcCA9IHN0ZXAubWFwKHRoaXMucmVtYXAucmVtYXApO1xuICAgICAgICAgIGlmIChtYXBwZWRTdGVwICYmIGlzRGVsU3RlcChzdGVwKSkge1xuICAgICAgICAgICAgdmFyIGV4dHJhID0gMCxcbiAgICAgICAgICAgICAgICBzdGFydCA9IHN0ZXAuZnJvbTtcbiAgICAgICAgICAgIHdoaWxlIChqID4gMCkge1xuICAgICAgICAgICAgICB2YXIgbmV4dCA9IF9ldmVudFtqIC0gMV07XG4gICAgICAgICAgICAgIGlmIChuZXh0LnZlcnNpb24gIT0gc3RlcFZlcnNpb24gLSAxIHx8ICFpc0RlbFN0ZXAobmV4dC5zdGVwKSB8fCBzdGFydC5jbXAobmV4dC5zdGVwLnRvKSkgYnJlYWs7XG4gICAgICAgICAgICAgIGV4dHJhICs9IG5leHQuc3RlcC50by5vZmZzZXQgLSBuZXh0LnN0ZXAuZnJvbS5vZmZzZXQ7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gbmV4dC5zdGVwLmZyb207XG4gICAgICAgICAgICAgIHN0ZXBWZXJzaW9uLS07XG4gICAgICAgICAgICAgIGotLTtcbiAgICAgICAgICAgICAgdGhpcy5yZW1hcC5hZGROZXh0TWFwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXh0cmEgPiAwKSB7XG4gICAgICAgICAgICAgIHZhciBfc3RhcnQgPSBtYXBwZWRTdGVwLmZyb20ubW92ZSgtZXh0cmEpO1xuICAgICAgICAgICAgICBtYXBwZWRTdGVwID0gbmV3IF90cmFuc2Zvcm0uU3RlcChcInJlcGxhY2VcIiwgX3N0YXJ0LCBtYXBwZWRTdGVwLnRvLCBfc3RhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgcmVzdWx0ID0gbWFwcGVkU3RlcCAmJiBtYXBwZWRTdGVwLmFwcGx5KHRoaXMuZG9jKTtcbiAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICB0aGlzLmRvYyA9IHJlc3VsdC5kb2M7XG4gICAgICAgICAgICB0aGlzLm1hcHMucHVzaChyZXN1bHQubWFwLmludmVydCgpKTtcbiAgICAgICAgICAgIG91dEV2ZW50LnB1c2gobmV3IEludmVydGVkU3RlcChtYXBwZWRTdGVwLCB0aGlzLnZlcnNpb24sIHN0ZXBJRCkpO1xuICAgICAgICAgICAgdGhpcy52ZXJzaW9uLS07XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMucmVtYXAubW92ZVBhc3RTdGVwKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG91dEV2ZW50Lmxlbmd0aCkge1xuICAgICAgICAgIG91dEV2ZW50LnJldmVyc2UoKTtcbiAgICAgICAgICB0aGlzLmV2ZW50cy5wdXNoKG91dEV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoRGF0ZS5ub3coKSA+IGVuZFRpbWUpIHtcbiAgICAgICAgICB0aGlzLnRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMud29yaygpO1xuICAgICAgICAgIH0sIHBhdXNlVGltZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZpbmlzaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmaW5pc2goKSB7XG4gICAgICBpZiAodGhpcy5hYm9ydGVkKSByZXR1cm47XG5cbiAgICAgIHRoaXMuZXZlbnRzLnJldmVyc2UoKTtcbiAgICAgIHRoaXMubWFwcy5yZXZlcnNlKCk7XG4gICAgICB0aGlzLmNhbGxiYWNrKHRoaXMubWFwcy5jb25jYXQodGhpcy5icmFuY2gubWFwcy5zbGljZSh0aGlzLmJyYW5jaC5tYXBzLmxlbmd0aCAtICh0aGlzLmJyYW5jaC52ZXJzaW9uIC0gdGhpcy5zdGFydFZlcnNpb24pKSksIHRoaXMuZXZlbnRzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWJvcnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWJvcnQoKSB7XG4gICAgICB0aGlzLmFib3J0ZWQgPSB0cnVlO1xuICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBDb21wcmVzc2lvbldvcmtlcjtcbn0pKCk7XG5cbmZ1bmN0aW9uIGlzRGVsU3RlcChzdGVwKSB7XG4gIHJldHVybiBzdGVwLnR5cGUgPT0gXCJyZXBsYWNlXCIgJiYgc3RlcC5mcm9tLm9mZnNldCA8IHN0ZXAudG8ub2Zmc2V0ICYmIF9tb2RlbC5Qb3Muc2FtZVBhdGgoc3RlcC5mcm9tLnBhdGgsIHN0ZXAudG8ucGF0aCkgJiYgKCFzdGVwLnBhcmFtIHx8IHN0ZXAucGFyYW0uY29udGVudC5zaXplID09IDApO1xufVxuXG52YXIgY29tcHJlc3NTdGVwQ291bnQgPSAxNTA7XG5cbnZhciBCcmFuY2ggPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBCcmFuY2gobWF4RGVwdGgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQnJhbmNoKTtcblxuICAgIHRoaXMubWF4RGVwdGggPSBtYXhEZXB0aDtcbiAgICB0aGlzLnZlcnNpb24gPSAwO1xuICAgIHRoaXMubmV4dFN0ZXBJRCA9IDE7XG5cbiAgICB0aGlzLm1hcHMgPSBbXTtcbiAgICB0aGlzLm1pcnJvciA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5ldmVudHMgPSBbXTtcblxuICAgIHRoaXMuc3RlcHNTaW5jZUNvbXByZXNzID0gMDtcbiAgICB0aGlzLmNvbXByZXNzaW5nID0gbnVsbDtcbiAgICB0aGlzLmNvbXByZXNzVGltZW91dCA9IG51bGw7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQnJhbmNoLCBbe1xuICAgIGtleTogXCJjbGVhclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhcihmb3JjZSkge1xuICAgICAgaWYgKGZvcmNlIHx8ICF0aGlzLmVtcHR5KCkpIHtcbiAgICAgICAgdGhpcy5tYXBzLmxlbmd0aCA9IHRoaXMuZXZlbnRzLmxlbmd0aCA9IHRoaXMuc3RlcHNTaW5jZUNvbXByZXNzID0gMDtcbiAgICAgICAgdGhpcy5taXJyb3IgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLmFib3J0Q29tcHJlc3Npb24oKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibmV3RXZlbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbmV3RXZlbnQoKSB7XG4gICAgICB0aGlzLmFib3J0Q29tcHJlc3Npb24oKTtcbiAgICAgIHRoaXMuZXZlbnRzLnB1c2goW10pO1xuICAgICAgd2hpbGUgKHRoaXMuZXZlbnRzLmxlbmd0aCA+IHRoaXMubWF4RGVwdGgpIHRoaXMuZXZlbnRzLnNoaWZ0KCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFkZE1hcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRNYXAobWFwKSB7XG4gICAgICBpZiAoIXRoaXMuZW1wdHkoKSkge1xuICAgICAgICB0aGlzLm1hcHMucHVzaChtYXApO1xuICAgICAgICB0aGlzLnZlcnNpb24rKztcbiAgICAgICAgdGhpcy5zdGVwc1NpbmNlQ29tcHJlc3MrKztcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVtcHR5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVtcHR5KCkge1xuICAgICAgcmV0dXJuIHRoaXMuZXZlbnRzLmxlbmd0aCA9PSAwO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRTdGVwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZFN0ZXAoc3RlcCwgbWFwLCBpZCkge1xuICAgICAgdGhpcy5hZGRNYXAobWFwKTtcbiAgICAgIGlmIChpZCA9PSBudWxsKSBpZCA9IHRoaXMubmV4dFN0ZXBJRCsrO1xuICAgICAgdGhpcy5ldmVudHNbdGhpcy5ldmVudHMubGVuZ3RoIC0gMV0ucHVzaChuZXcgSW52ZXJ0ZWRTdGVwKHN0ZXAsIHRoaXMudmVyc2lvbiwgaWQpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkVHJhbnNmb3JtXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZFRyYW5zZm9ybSh0cmFuc2Zvcm0sIGlkcykge1xuICAgICAgdGhpcy5hYm9ydENvbXByZXNzaW9uKCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYW5zZm9ybS5zdGVwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgaW52ZXJ0ZWQgPSB0cmFuc2Zvcm0uc3RlcHNbaV0uaW52ZXJ0KHRyYW5zZm9ybS5kb2NzW2ldLCB0cmFuc2Zvcm0ubWFwc1tpXSk7XG4gICAgICAgIHRoaXMuYWRkU3RlcChpbnZlcnRlZCwgdHJhbnNmb3JtLm1hcHNbaV0sIGlkcyAmJiBpZHNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwb3BFdmVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwb3BFdmVudChkb2MsIGFsbG93Q29sbGFwc2luZykge1xuICAgICAgdGhpcy5hYm9ydENvbXByZXNzaW9uKCk7XG4gICAgICB2YXIgZXZlbnQgPSB0aGlzLmV2ZW50cy5wb3AoKTtcbiAgICAgIGlmICghZXZlbnQpIHJldHVybiBudWxsO1xuXG4gICAgICB2YXIgcmVtYXAgPSBuZXcgQnJhbmNoUmVtYXBwaW5nKHRoaXMpLFxuICAgICAgICAgIGNvbGxhcHNpbmcgPSBhbGxvd0NvbGxhcHNpbmc7XG4gICAgICB2YXIgdHIgPSBuZXcgX3RyYW5zZm9ybS5UcmFuc2Zvcm0oZG9jKTtcbiAgICAgIHZhciBpZHMgPSBbXTtcblxuICAgICAgZm9yICh2YXIgaSA9IGV2ZW50Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHZhciBpbnZlcnRlZFN0ZXAgPSBldmVudFtpXSxcbiAgICAgICAgICAgIHN0ZXAgPSBpbnZlcnRlZFN0ZXAuc3RlcDtcbiAgICAgICAgaWYgKCFjb2xsYXBzaW5nIHx8IGludmVydGVkU3RlcC52ZXJzaW9uICE9IHJlbWFwLnZlcnNpb24pIHtcbiAgICAgICAgICBjb2xsYXBzaW5nID0gZmFsc2U7XG4gICAgICAgICAgcmVtYXAubW92ZVRvVmVyc2lvbihpbnZlcnRlZFN0ZXAudmVyc2lvbik7XG5cbiAgICAgICAgICBzdGVwID0gc3RlcC5tYXAocmVtYXAucmVtYXApO1xuICAgICAgICAgIHZhciByZXN1bHQgPSBzdGVwICYmIHRyLnN0ZXAoc3RlcCk7XG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgaWRzLnB1c2goaW52ZXJ0ZWRTdGVwLmlkKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmFkZE1hcChyZXN1bHQubWFwKSkgdGhpcy5taXJyb3JbdGhpcy52ZXJzaW9uXSA9IGludmVydGVkU3RlcC52ZXJzaW9uO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpID4gMCkgcmVtYXAubW92ZVBhc3RTdGVwKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy52ZXJzaW9uLS07XG4gICAgICAgICAgZGVsZXRlIHRoaXMubWlycm9yW3RoaXMudmVyc2lvbl07XG4gICAgICAgICAgdGhpcy5tYXBzLnBvcCgpO1xuICAgICAgICAgIHRyLnN0ZXAoc3RlcCk7XG4gICAgICAgICAgaWRzLnB1c2goaW52ZXJ0ZWRTdGVwLmlkKTtcbiAgICAgICAgICAtLXJlbWFwLnZlcnNpb247XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmVtcHR5KCkpIHRoaXMuY2xlYXIodHJ1ZSk7XG4gICAgICByZXR1cm4geyB0cmFuc2Zvcm06IHRyLCBpZHM6IGlkcyB9O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRWZXJzaW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFZlcnNpb24oKSB7XG4gICAgICByZXR1cm4geyBpZDogdGhpcy5uZXh0U3RlcElELCB2ZXJzaW9uOiB0aGlzLnZlcnNpb24gfTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZmluZFZlcnNpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZmluZFZlcnNpb24odmVyc2lvbikge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMuZXZlbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHZhciBfZXZlbnQyID0gdGhpcy5ldmVudHNbaV07XG4gICAgICAgIGZvciAodmFyIGogPSBfZXZlbnQyLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICAgICAgdmFyIHN0ZXAgPSBfZXZlbnQyW2pdO1xuICAgICAgICAgIGlmIChzdGVwLmlkID09IHZlcnNpb24uaWQpIHJldHVybiB7IGV2ZW50OiBpLCBzdGVwOiBqIH07ZWxzZSBpZiAoc3RlcC5pZCA8IHZlcnNpb24uaWQpIHJldHVybiB7IGV2ZW50OiBpLCBzdGVwOiBqICsgMSB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlYmFzZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmViYXNlZChuZXdNYXBzLCByZWJhc2VkVHJhbnNmb3JtLCBwb3NpdGlvbnMpIHtcbiAgICAgIGlmICh0aGlzLmVtcHR5KCkpIHJldHVybjtcbiAgICAgIHRoaXMuYWJvcnRDb21wcmVzc2lvbigpO1xuXG4gICAgICB2YXIgc3RhcnRWZXJzaW9uID0gdGhpcy52ZXJzaW9uIC0gcG9zaXRpb25zLmxlbmd0aDtcblxuICAgICAgLy8gVXBkYXRlIGFuZCBjbGVhbiB1cCB0aGUgZXZlbnRzXG4gICAgICBvdXQ6IGZvciAodmFyIGkgPSB0aGlzLmV2ZW50cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB2YXIgX2V2ZW50MyA9IHRoaXMuZXZlbnRzW2ldO1xuICAgICAgICBmb3IgKHZhciBqID0gX2V2ZW50My5sZW5ndGggLSAxOyBqID49IDA7IGotLSkge1xuICAgICAgICAgIHZhciBzdGVwID0gX2V2ZW50M1tqXTtcbiAgICAgICAgICBpZiAoc3RlcC52ZXJzaW9uIDw9IHN0YXJ0VmVyc2lvbikgYnJlYWsgb3V0O1xuICAgICAgICAgIHZhciBvZmYgPSBwb3NpdGlvbnNbc3RlcC52ZXJzaW9uIC0gc3RhcnRWZXJzaW9uIC0gMV07XG4gICAgICAgICAgaWYgKG9mZiA9PSAtMSkge1xuICAgICAgICAgICAgX2V2ZW50My5zcGxpY2Uoai0tLCAxKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGludiA9IHJlYmFzZWRUcmFuc2Zvcm0uc3RlcHNbb2ZmXS5pbnZlcnQocmViYXNlZFRyYW5zZm9ybS5kb2NzW29mZl0sIHJlYmFzZWRUcmFuc2Zvcm0ubWFwc1tvZmZdKTtcbiAgICAgICAgICAgIF9ldmVudDNbal0gPSBuZXcgSW52ZXJ0ZWRTdGVwKGludiwgc3RhcnRWZXJzaW9uICsgbmV3TWFwcy5sZW5ndGggKyBvZmYgKyAxLCBzdGVwLmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU3luYyB0aGUgYXJyYXkgb2YgbWFwc1xuICAgICAgaWYgKHRoaXMubWFwcy5sZW5ndGggPiBwb3NpdGlvbnMubGVuZ3RoKSB0aGlzLm1hcHMgPSB0aGlzLm1hcHMuc2xpY2UoMCwgdGhpcy5tYXBzLmxlbmd0aCAtIHBvc2l0aW9ucy5sZW5ndGgpLmNvbmNhdChuZXdNYXBzKS5jb25jYXQocmViYXNlZFRyYW5zZm9ybS5tYXBzKTtlbHNlIHRoaXMubWFwcyA9IHJlYmFzZWRUcmFuc2Zvcm0ubWFwcy5zbGljZSgpO1xuXG4gICAgICB0aGlzLnZlcnNpb24gPSBzdGFydFZlcnNpb24gKyBuZXdNYXBzLmxlbmd0aCArIHJlYmFzZWRUcmFuc2Zvcm0ubWFwcy5sZW5ndGg7XG5cbiAgICAgIHRoaXMuc3RlcHNTaW5jZUNvbXByZXNzICs9IG5ld01hcHMubGVuZ3RoICsgcmViYXNlZFRyYW5zZm9ybS5zdGVwcy5sZW5ndGggLSBwb3NpdGlvbnMubGVuZ3RoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhYm9ydENvbXByZXNzaW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFib3J0Q29tcHJlc3Npb24oKSB7XG4gICAgICBpZiAodGhpcy5jb21wcmVzc2luZykge1xuICAgICAgICB0aGlzLmNvbXByZXNzaW5nLmFib3J0KCk7XG4gICAgICAgIHRoaXMuY29tcHJlc3NpbmcgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJuZWVkc0NvbXByZXNzaW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5lZWRzQ29tcHJlc3Npb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGVwc1NpbmNlQ29tcHJlc3MgPiBjb21wcmVzc1N0ZXBDb3VudCAmJiAhdGhpcy5jb21wcmVzc2luZztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic3RhcnRDb21wcmVzc2lvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdGFydENvbXByZXNzaW9uKGRvYykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHRoaXMuY29tcHJlc3NpbmcgPSBuZXcgQ29tcHJlc3Npb25Xb3JrZXIoZG9jLCB0aGlzLCBmdW5jdGlvbiAobWFwcywgZXZlbnRzKSB7XG4gICAgICAgIF90aGlzMi5tYXBzID0gbWFwcztcbiAgICAgICAgX3RoaXMyLmV2ZW50cyA9IGV2ZW50cztcbiAgICAgICAgX3RoaXMyLm1pcnJvciA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIF90aGlzMi5jb21wcmVzc2luZyA9IG51bGw7XG4gICAgICAgIF90aGlzMi5zdGVwc1NpbmNlQ29tcHJlc3MgPSAwO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmNvbXByZXNzaW5nLndvcmsoKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQnJhbmNoO1xufSkoKTtcblxudmFyIGNvbXByZXNzRGVsYXkgPSA3NTA7XG5cbnZhciBIaXN0b3J5ID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gSGlzdG9yeShwbSkge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEhpc3RvcnkpO1xuXG4gICAgdGhpcy5wbSA9IHBtO1xuXG4gICAgdGhpcy5kb25lID0gbmV3IEJyYW5jaChwbS5vcHRpb25zLmhpc3RvcnlEZXB0aCk7XG4gICAgdGhpcy51bmRvbmUgPSBuZXcgQnJhbmNoKHBtLm9wdGlvbnMuaGlzdG9yeURlcHRoKTtcblxuICAgIHRoaXMubGFzdEFkZGVkQXQgPSAwO1xuICAgIHRoaXMuaWdub3JlVHJhbnNmb3JtID0gZmFsc2U7XG5cbiAgICB0aGlzLmFsbG93Q29sbGFwc2luZyA9IHRydWU7XG5cbiAgICBwbS5vbihcInRyYW5zZm9ybVwiLCBmdW5jdGlvbiAodHJhbnNmb3JtLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gX3RoaXMzLnJlY29yZFRyYW5zZm9ybSh0cmFuc2Zvcm0sIG9wdGlvbnMpO1xuICAgIH0pO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEhpc3RvcnksIFt7XG4gICAga2V5OiBcInJlY29yZFRyYW5zZm9ybVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZWNvcmRUcmFuc2Zvcm0odHJhbnNmb3JtLCBvcHRpb25zKSB7XG4gICAgICBpZiAodGhpcy5pZ25vcmVUcmFuc2Zvcm0pIHJldHVybjtcblxuICAgICAgaWYgKG9wdGlvbnMuYWRkVG9IaXN0b3J5ID09IGZhbHNlKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJhbnNmb3JtLm1hcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgbWFwID0gdHJhbnNmb3JtLm1hcHNbaV07XG4gICAgICAgICAgdGhpcy5kb25lLmFkZE1hcChtYXApO1xuICAgICAgICAgIHRoaXMudW5kb25lLmFkZE1hcChtYXApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVuZG9uZS5jbGVhcigpO1xuICAgICAgICB2YXIgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKG5vdyA+IHRoaXMubGFzdEFkZGVkQXQgKyB0aGlzLnBtLm9wdGlvbnMuaGlzdG9yeUV2ZW50RGVsYXkpIHRoaXMuZG9uZS5uZXdFdmVudCgpO1xuXG4gICAgICAgIHRoaXMuZG9uZS5hZGRUcmFuc2Zvcm0odHJhbnNmb3JtKTtcbiAgICAgICAgdGhpcy5sYXN0QWRkZWRBdCA9IG5vdztcbiAgICAgIH1cbiAgICAgIHRoaXMubWF5YmVTY2hlZHVsZUNvbXByZXNzaW9uKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVuZG9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5kbygpIHtcbiAgICAgIHJldHVybiB0aGlzLnNoaWZ0KHRoaXMuZG9uZSwgdGhpcy51bmRvbmUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZWRvXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlZG8oKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaGlmdCh0aGlzLnVuZG9uZSwgdGhpcy5kb25lKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2FuVW5kb1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjYW5VbmRvKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZG9uZS5ldmVudHMubGVuZ3RoID4gMDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2FuUmVkb1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjYW5SZWRvKCkge1xuICAgICAgcmV0dXJuIHRoaXMudW5kb25lLmV2ZW50cy5sZW5ndGggPiAwO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzaGlmdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaGlmdChmcm9tLCB0bykge1xuICAgICAgdmFyIGV2ZW50ID0gZnJvbS5wb3BFdmVudCh0aGlzLnBtLmRvYywgdGhpcy5hbGxvd0NvbGxhcHNpbmcpO1xuICAgICAgaWYgKCFldmVudCkgcmV0dXJuIGZhbHNlO1xuICAgICAgdmFyIHRyYW5zZm9ybSA9IGV2ZW50LnRyYW5zZm9ybTtcbiAgICAgIHZhciBpZHMgPSBldmVudC5pZHM7XG5cbiAgICAgIHRoaXMuaWdub3JlVHJhbnNmb3JtID0gdHJ1ZTtcbiAgICAgIHRoaXMucG0uYXBwbHkodHJhbnNmb3JtKTtcbiAgICAgIHRoaXMuaWdub3JlVHJhbnNmb3JtID0gZmFsc2U7XG5cbiAgICAgIGlmICghdHJhbnNmb3JtLnN0ZXBzLmxlbmd0aCkgcmV0dXJuIHRoaXMuc2hpZnQoZnJvbSwgdG8pO1xuXG4gICAgICBpZiAodG8pIHtcbiAgICAgICAgdG8ubmV3RXZlbnQoKTtcbiAgICAgICAgdG8uYWRkVHJhbnNmb3JtKHRyYW5zZm9ybSwgaWRzKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubGFzdEFkZGVkQXQgPSAwO1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0VmVyc2lvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRWZXJzaW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZG9uZS5nZXRWZXJzaW9uKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJhY2tUb1ZlcnNpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYmFja1RvVmVyc2lvbih2ZXJzaW9uKSB7XG4gICAgICB2YXIgZm91bmQgPSB0aGlzLmRvbmUuZmluZFZlcnNpb24odmVyc2lvbik7XG4gICAgICBpZiAoIWZvdW5kKSByZXR1cm4gZmFsc2U7XG4gICAgICB2YXIgZXZlbnQgPSB0aGlzLmRvbmUuZXZlbnRzW2ZvdW5kLmV2ZW50XTtcbiAgICAgIHZhciBjb21iaW5lZCA9IHRoaXMuZG9uZS5ldmVudHMuc2xpY2UoZm91bmQuZXZlbnQgKyAxKS5yZWR1Y2UoZnVuY3Rpb24gKGNvbWIsIGFycikge1xuICAgICAgICByZXR1cm4gY29tYi5jb25jYXQoYXJyKTtcbiAgICAgIH0sIGV2ZW50LnNsaWNlKGZvdW5kLnN0ZXApKTtcbiAgICAgIHRoaXMuZG9uZS5ldmVudHMubGVuZ3RoID0gZm91bmQuZXZlbnQgKyAoKGV2ZW50Lmxlbmd0aCA9IGZvdW5kLnN0ZXApID8gMSA6IDApO1xuICAgICAgdGhpcy5kb25lLmV2ZW50cy5wdXNoKGNvbWJpbmVkKTtcblxuICAgICAgdGhpcy5zaGlmdCh0aGlzLmRvbmUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZWJhc2VkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlYmFzZWQobmV3TWFwcywgcmViYXNlZFRyYW5zZm9ybSwgcG9zaXRpb25zKSB7XG4gICAgICB0aGlzLmRvbmUucmViYXNlZChuZXdNYXBzLCByZWJhc2VkVHJhbnNmb3JtLCBwb3NpdGlvbnMpO1xuICAgICAgdGhpcy51bmRvbmUucmViYXNlZChuZXdNYXBzLCByZWJhc2VkVHJhbnNmb3JtLCBwb3NpdGlvbnMpO1xuICAgICAgdGhpcy5tYXliZVNjaGVkdWxlQ29tcHJlc3Npb24oKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibWF5YmVTY2hlZHVsZUNvbXByZXNzaW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1heWJlU2NoZWR1bGVDb21wcmVzc2lvbigpIHtcbiAgICAgIHRoaXMubWF5YmVTY2hlZHVsZUNvbXByZXNzaW9uRm9yQnJhbmNoKHRoaXMuZG9uZSk7XG4gICAgICB0aGlzLm1heWJlU2NoZWR1bGVDb21wcmVzc2lvbkZvckJyYW5jaCh0aGlzLnVuZG9uZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm1heWJlU2NoZWR1bGVDb21wcmVzc2lvbkZvckJyYW5jaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXliZVNjaGVkdWxlQ29tcHJlc3Npb25Gb3JCcmFuY2goYnJhbmNoKSB7XG4gICAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgICAgd2luZG93LmNsZWFyVGltZW91dChicmFuY2guY29tcHJlc3NUaW1lb3V0KTtcbiAgICAgIGlmIChicmFuY2gubmVlZHNDb21wcmVzc2lvbigpKSBicmFuY2guY29tcHJlc3NUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoYnJhbmNoLm5lZWRzQ29tcHJlc3Npb24oKSkgYnJhbmNoLnN0YXJ0Q29tcHJlc3Npb24oX3RoaXM0LnBtLmRvYyk7XG4gICAgICB9LCBjb21wcmVzc0RlbGF5KTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSGlzdG9yeTtcbn0pKCk7XG5cbmV4cG9ydHMuSGlzdG9yeSA9IEhpc3Rvcnk7IiwiLy8gISEgVGhpcyBtb2R1bGUgaW1wbGVtZW50cyB0aGUgUHJvc2VNaXJyb3IgZWRpdG9yLiBJdCBjb250YWluc1xuLy8gZnVuY3Rpb25hbGl0eSByZWxhdGVkIHRvIGVkaXRpbmcsIHNlbGVjdGlvbiwgYW5kIGludGVncmF0aW9uIHdpdGhcbi8vIHRoZSBicm93c2VyLiBgUHJvc2VNaXJyb3JgIGlzIHRoZSBjbGFzcyB5b3UnbGwgd2FudCB0byBpbnN0YW50aWF0ZVxuLy8gYW5kIGludGVyYWN0IHdpdGggd2hlbiB1c2luZyB0aGUgZWRpdG9yLlxuXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9tYWluID0gcmVxdWlyZShcIi4vbWFpblwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUHJvc2VNaXJyb3JcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX21haW4uUHJvc2VNaXJyb3I7XG4gIH1cbn0pO1xuXG52YXIgX29wdGlvbnMgPSByZXF1aXJlKFwiLi9vcHRpb25zXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJkZWZpbmVPcHRpb25cIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX29wdGlvbnMuZGVmaW5lT3B0aW9uO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlZ2lzdHJ5XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9vcHRpb25zLlJlZ2lzdHJ5O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImRlZmF1bHRSZWdpc3RyeVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnk7XG4gIH1cbn0pO1xuXG52YXIgX3NlbGVjdGlvbiA9IHJlcXVpcmUoXCIuL3NlbGVjdGlvblwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmFuZ2VcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3NlbGVjdGlvbi5SYW5nZTtcbiAgfVxufSk7XG5cbnZhciBfa2V5cyA9IHJlcXVpcmUoXCIuL2tleXNcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIktleW1hcFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfa2V5cy5LZXltYXA7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwia2V5TmFtZVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfa2V5cy5rZXlOYW1lO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImtleU5hbWVzXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9rZXlzLmtleU5hbWVzO1xuICB9XG59KTtcblxudmFyIF9yYW5nZSA9IHJlcXVpcmUoXCIuL3JhbmdlXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNYXJrZWRSYW5nZVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfcmFuZ2UuTWFya2VkUmFuZ2U7XG4gIH1cbn0pO1xuXG52YXIgX2NvbW1hbmRzID0gcmVxdWlyZShcIi4vY29tbWFuZHNcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImRlZmluZUNvbW1hbmRcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2NvbW1hbmRzLmRlZmluZUNvbW1hbmQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZGVmaW5lUGFyYW1IYW5kbGVyXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9jb21tYW5kcy5kZWZpbmVQYXJhbUhhbmRsZXI7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29tbWFuZFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfY29tbWFuZHMuQ29tbWFuZDtcbiAgfVxufSk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZXhwb3J0cy5kaXNwYXRjaEtleSA9IGRpc3BhdGNoS2V5O1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgX21vZGVsID0gcmVxdWlyZShcIi4uL21vZGVsXCIpO1xuXG52YXIgX3BhcnNlRG9tID0gcmVxdWlyZShcIi4uL3BhcnNlL2RvbVwiKTtcblxudmFyIF9wYXJzZVRleHQgPSByZXF1aXJlKFwiLi4vcGFyc2UvdGV4dFwiKTtcblxudmFyIF9kb20gPSByZXF1aXJlKFwiLi4vZG9tXCIpO1xuXG52YXIgX3NlcmlhbGl6ZURvbSA9IHJlcXVpcmUoXCIuLi9zZXJpYWxpemUvZG9tXCIpO1xuXG52YXIgX3NlcmlhbGl6ZVRleHQgPSByZXF1aXJlKFwiLi4vc2VyaWFsaXplL3RleHRcIik7XG5cbnZhciBfcGFyc2UgPSByZXF1aXJlKFwiLi4vcGFyc2VcIik7XG5cbnZhciBfa2V5cyA9IHJlcXVpcmUoXCIuL2tleXNcIik7XG5cbnZhciBfY2FwdHVyZWtleXMgPSByZXF1aXJlKFwiLi9jYXB0dXJla2V5c1wiKTtcblxudmFyIF9kb21jaGFuZ2UgPSByZXF1aXJlKFwiLi9kb21jaGFuZ2VcIik7XG5cbnZhciBfc2VsZWN0aW9uID0gcmVxdWlyZShcIi4vc2VsZWN0aW9uXCIpO1xuXG52YXIgc3RvcFNlcSA9IG51bGw7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIERPTSBldmVudHMgdGhhdCBvY2N1ciB3aXRoaW4gdGhlIGVkaXRvciwgYW5kIGNhbGxiYWNrIGZ1bmN0aW9uc1xuICogdG8gaW52b2tlIHdoZW4gdGhlIGV2ZW50IGZpcmVzLlxuICovXG52YXIgaGFuZGxlcnMgPSB7fTtcblxudmFyIElucHV0ID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gSW5wdXQocG0pIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIElucHV0KTtcblxuICAgIHRoaXMucG0gPSBwbTtcblxuICAgIHRoaXMua2V5U2VxID0gbnVsbDtcblxuICAgIC8vIFdoZW4gdGhlIHVzZXIgaXMgY3JlYXRpbmcgYSBjb21wb3NlZCBjaGFyYWN0ZXIsXG4gICAgLy8gdGhpcyBpcyBzZXQgdG8gYSBDb21wb3NpbmcgaW5zdGFuY2UuXG4gICAgdGhpcy5jb21wb3NpbmcgPSBudWxsO1xuICAgIHRoaXMuc2hpZnRLZXkgPSB0aGlzLnVwZGF0aW5nQ29tcG9zaXRpb24gPSBmYWxzZTtcbiAgICB0aGlzLnNraXBJbnB1dCA9IDA7XG5cbiAgICB0aGlzLmRyYWdnaW5nRnJvbSA9IGZhbHNlO1xuXG4gICAgdGhpcy5rZXltYXBzID0gW107XG4gICAgdGhpcy5kZWZhdWx0S2V5bWFwID0gbnVsbDtcblxuICAgIHRoaXMuc3RvcmVkTWFya3MgPSBudWxsO1xuXG4gICAgdGhpcy5kcm9wVGFyZ2V0ID0gcG0ud3JhcHBlci5hcHBlbmRDaGlsZCgoMCwgX2RvbS5lbHQpKFwiZGl2XCIsIHsgXCJjbGFzc1wiOiBcIlByb3NlTWlycm9yLWRyb3AtdGFyZ2V0XCIgfSkpO1xuXG4gICAgdmFyIF9sb29wID0gZnVuY3Rpb24gKF9ldmVudCkge1xuICAgICAgdmFyIGhhbmRsZXIgPSBoYW5kbGVyc1tfZXZlbnRdO1xuICAgICAgcG0uY29udGVudC5hZGRFdmVudExpc3RlbmVyKF9ldmVudCwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIocG0sIGUpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGZvciAodmFyIF9ldmVudCBpbiBoYW5kbGVycykge1xuICAgICAgX2xvb3AoX2V2ZW50KTtcbiAgICB9XG5cbiAgICBwbS5vbihcInNlbGVjdGlvbkNoYW5nZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMuc3RvcmVkTWFya3MgPSBudWxsO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIGEga2V5IHByZXNzIHRvIHRoZSBpbnRlcm5hbCBrZXltYXBzLCB3aGljaCB3aWxsIG92ZXJyaWRlIHRoZSBkZWZhdWx0XG4gICAqIERPTSBiZWhhdmlvci5cbiAgICpcbiAgICogQHBhcmFtICB7UHJvc2VNaXJyb3J9ICAgcG0gVGhlIGVkaXRvciBpbnN0YW5jZS5cbiAgICogQHBhcmFtICB7c3RyaW5nfSAgICAgICAgbmFtZSBUaGUgbmFtZSBvZiB0aGUga2V5IHByZXNzZWQuXG4gICAqIEBwYXJhbSAge0tleWJvYXJkRXZlbnR9IGVcbiAgICogQHJldHVybiB7c3RyaW5nfSBJZiB0aGUga2V5IG5hbWUgaGFzIGEgbWFwcGluZyBhbmQgdGhlIGNhbGxiYWNrIGlzIGludm9rZWQgKFwiaGFuZGxlZFwiKSxcbiAgICogICAgICAgICAgICAgICAgICBpZiB0aGUga2V5IG5hbWUgbmVlZHMgdG8gYmUgY29tYmluZWQgaW4gc2VxdWVuY2Ugd2l0aCB0aGUgbmV4dCBrZXkgKFwibXVsdGlcIiksXG4gICAqICAgICAgICAgICAgICAgICAgaWYgdGhlcmUgaXMgbm8gbWFwcGluZyAoXCJub3RoaW5nXCIpLlxuICAgKi9cblxuICBfY3JlYXRlQ2xhc3MoSW5wdXQsIFt7XG4gICAga2V5OiBcIm1heWJlQWJvcnRDb21wb3NpdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXliZUFib3J0Q29tcG9zaXRpb24oKSB7XG4gICAgICBpZiAodGhpcy5jb21wb3NpbmcgJiYgIXRoaXMudXBkYXRpbmdDb21wb3NpdGlvbikge1xuICAgICAgICBpZiAodGhpcy5jb21wb3NpbmcuZmluaXNoZWQpIHtcbiAgICAgICAgICBmaW5pc2hDb21wb3NpbmcodGhpcy5wbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVG9nZ2xlIHNlbGVjdGlvbiB0byBmb3JjZSBlbmQgb2YgY29tcG9zaXRpb25cbiAgICAgICAgICB0aGlzLmNvbXBvc2luZyA9IG51bGw7XG4gICAgICAgICAgdGhpcy5za2lwSW5wdXQrKztcbiAgICAgICAgICB2YXIgc2VsID0gZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgICAgaWYgKHNlbC5yYW5nZUNvdW50KSB7XG4gICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZWwuZ2V0UmFuZ2VBdCgwKTtcbiAgICAgICAgICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBJbnB1dDtcbn0pKCk7XG5cbmV4cG9ydHMuSW5wdXQgPSBJbnB1dDtcblxuZnVuY3Rpb24gZGlzcGF0Y2hLZXkocG0sIG5hbWUsIGUpIHtcbiAgdmFyIHNlcSA9IHBtLmlucHV0LmtleVNlcTtcbiAgLy8gSWYgdGhlIHByZXZpb3VzIGtleSBzaG91bGQgYmUgdXNlZCBpbiBzZXF1ZW5jZSB3aXRoIHRoaXMgb25lLCBtb2RpZnkgdGhlIG5hbWUgYWNjb3JkaW5nbHkuXG4gIGlmIChzZXEpIHtcbiAgICBpZiAoKDAsIF9rZXlzLmlzTW9kaWZpZXJLZXkpKG5hbWUpKSByZXR1cm4gdHJ1ZTtcbiAgICBjbGVhclRpbWVvdXQoc3RvcFNlcSk7XG4gICAgc3RvcFNlcSA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHBtLmlucHV0LmtleVNlcSA9PSBzZXEpIHBtLmlucHV0LmtleVNlcSA9IG51bGw7XG4gICAgfSwgNTApO1xuICAgIG5hbWUgPSBzZXEgKyBcIiBcIiArIG5hbWU7XG4gIH1cblxuICB2YXIgaGFuZGxlID0gZnVuY3Rpb24gaGFuZGxlKGJvdW5kKSB7XG4gICAgaWYgKGJvdW5kID09PSBmYWxzZSkgcmV0dXJuIFwibm90aGluZ1wiO1xuICAgIGlmIChib3VuZCA9PSBcIi4uLlwiKSByZXR1cm4gXCJtdWx0aVwiO1xuICAgIGlmIChib3VuZCA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgICB2YXIgcmVzdWx0ID0gZmFsc2U7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYm91bmQpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgcmVzdWx0ID09PSBmYWxzZSAmJiBpIDwgYm91bmQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzdWx0ID0gaGFuZGxlKGJvdW5kW2ldKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBib3VuZCA9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXN1bHQgPSBwbS5leGVjQ29tbWFuZChib3VuZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGJvdW5kKHBtKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdCA9PSBmYWxzZSA/IGZhbHNlIDogXCJoYW5kbGVkXCI7XG4gIH07XG5cbiAgdmFyIHJlc3VsdCA9IHVuZGVmaW5lZDtcbiAgZm9yICh2YXIgaSA9IDA7ICFyZXN1bHQgJiYgaSA8IHBtLmlucHV0LmtleW1hcHMubGVuZ3RoOyBpKyspIHtcbiAgICByZXN1bHQgPSBoYW5kbGUocG0uaW5wdXQua2V5bWFwc1tpXS5tYXAubG9va3VwKG5hbWUsIHBtKSk7XG4gIH1pZiAoIXJlc3VsdCkgcmVzdWx0ID0gaGFuZGxlKHBtLmJhc2VLZXltYXAubG9va3VwKG5hbWUsIHBtKSkgfHwgaGFuZGxlKF9jYXB0dXJla2V5cy5jYXB0dXJlS2V5cy5sb29rdXAobmFtZSkpO1xuXG4gIC8vIElmIHRoZSBrZXkgc2hvdWxkIGJlIHVzZWQgaW4gc2VxdWVuY2Ugd2l0aCB0aGUgbmV4dCBrZXksIHN0b3JlIHRoZSBrZXluYW1lIGludGVybmFsbHkuXG4gIGlmIChyZXN1bHQgPT0gXCJtdWx0aVwiKSBwbS5pbnB1dC5rZXlTZXEgPSBuYW1lO1xuXG4gIGlmIChyZXN1bHQgPT0gXCJoYW5kbGVkXCIgfHwgcmVzdWx0ID09IFwibXVsdGlcIikgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gIGlmIChzZXEgJiYgIXJlc3VsdCAmJiAvXFwnJC8udGVzdChuYW1lKSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gISFyZXN1bHQ7XG59XG5cbmhhbmRsZXJzLmtleWRvd24gPSBmdW5jdGlvbiAocG0sIGUpIHtcbiAgaWYgKGUua2V5Q29kZSA9PSAxNikgcG0uaW5wdXQuc2hpZnRLZXkgPSB0cnVlO1xuICBpZiAocG0uaW5wdXQuY29tcG9zaW5nKSByZXR1cm47XG4gIHZhciBuYW1lID0gKDAsIF9rZXlzLmtleU5hbWUpKGUpO1xuICBpZiAobmFtZSAmJiBkaXNwYXRjaEtleShwbSwgbmFtZSwgZSkpIHJldHVybjtcbiAgcG0uc2VsLnBvbGxGb3JVcGRhdGUoKTtcbn07XG5cbmhhbmRsZXJzLmtleXVwID0gZnVuY3Rpb24gKHBtLCBlKSB7XG4gIGlmIChlLmtleUNvZGUgPT0gMTYpIHBtLmlucHV0LnNoaWZ0S2V5ID0gZmFsc2U7XG59O1xuXG5mdW5jdGlvbiBpbnB1dFRleHQocG0sIHJhbmdlLCB0ZXh0KSB7XG4gIGlmIChyYW5nZS5lbXB0eSAmJiAhdGV4dCkgcmV0dXJuIGZhbHNlO1xuICB2YXIgbWFya3MgPSBwbS5pbnB1dC5zdG9yZWRNYXJrcyB8fCBwbS5kb2MubWFya3NBdChyYW5nZS5mcm9tKTtcbiAgdmFyIHRyID0gcG0udHI7XG4gIHRyLnJlcGxhY2VXaXRoKHJhbmdlLmZyb20sIHJhbmdlLnRvLCBwbS5zY2hlbWEudGV4dCh0ZXh0LCBtYXJrcykpLmFwcGx5KCk7XG4gIHBtLnNjcm9sbEludG9WaWV3KCk7XG4gIC8vIDo6ICgpICNwYXRoPVByb3NlTWlycm9yI2V2ZW50cyN0ZXh0SW5wdXRcbiAgLy8gRmlyZWQgd2hlbiB0aGUgdXNlciB0eXBlcyB0ZXh0IGludG8gdGhlIGVkaXRvci5cbiAgcG0uc2lnbmFsKFwidGV4dElucHV0XCIsIHRleHQpO1xufVxuXG5oYW5kbGVycy5rZXlwcmVzcyA9IGZ1bmN0aW9uIChwbSwgZSkge1xuICBpZiAocG0uaW5wdXQuY29tcG9zaW5nIHx8ICFlLmNoYXJDb2RlIHx8IGUuY3RybEtleSAmJiAhZS5hbHRLZXkgfHwgX2RvbS5icm93c2VyLm1hYyAmJiBlLm1ldGFLZXkpIHJldHVybjtcbiAgdmFyIGNoID0gU3RyaW5nLmZyb21DaGFyQ29kZShlLmNoYXJDb2RlKTtcbiAgaWYgKGRpc3BhdGNoS2V5KHBtLCBcIidcIiArIGNoICsgXCInXCIsIGUpKSByZXR1cm47XG4gIHZhciBzZWwgPSBwbS5zZWxlY3Rpb247XG4gIGlmIChzZWwubm9kZSAmJiBzZWwubm9kZS5jb250YWlucyA9PSBudWxsKSB7XG4gICAgcG0udHJbXCJkZWxldGVcIl0oc2VsLmZyb20sIHNlbC50bykuYXBwbHkoKTtcbiAgICBzZWwgPSBwbS5zZWxlY3Rpb247XG4gIH1cbiAgaW5wdXRUZXh0KHBtLCBzZWwsIGNoKTtcbiAgZS5wcmV2ZW50RGVmYXVsdCgpO1xufTtcblxuZnVuY3Rpb24gc2VsZWN0Q2xpY2tlZE5vZGUocG0sIGUpIHtcbiAgdmFyIHBvcyA9ICgwLCBfc2VsZWN0aW9uLnNlbGVjdGFibGVOb2RlQWJvdmUpKHBtLCBlLnRhcmdldCwgeyBsZWZ0OiBlLmNsaWVudFgsIHRvcDogZS5jbGllbnRZIH0sIHRydWUpO1xuICBpZiAoIXBvcykgcmV0dXJuIHBtLnNlbC5wb2xsRm9yVXBkYXRlKCk7XG5cbiAgdmFyIF9wbSRzZWxlY3Rpb24gPSBwbS5zZWxlY3Rpb247XG4gIHZhciBub2RlID0gX3BtJHNlbGVjdGlvbi5ub2RlO1xuICB2YXIgZnJvbSA9IF9wbSRzZWxlY3Rpb24uZnJvbTtcblxuICBpZiAobm9kZSAmJiBwb3MuZGVwdGggPj0gZnJvbS5kZXB0aCAmJiBwb3Muc2hvcnRlbihmcm9tLmRlcHRoKS5jbXAoZnJvbSkgPT0gMCkge1xuICAgIGlmIChmcm9tLmRlcHRoID09IDApIHJldHVybiBwbS5zZWwucG9sbEZvclVwZGF0ZSgpO1xuICAgIHBvcyA9IGZyb20uc2hvcnRlbigpO1xuICB9XG5cbiAgcG0uc2V0Tm9kZVNlbGVjdGlvbihwb3MpO1xuICBwbS5mb2N1cygpO1xuICBlLnByZXZlbnREZWZhdWx0KCk7XG59XG5cbnZhciBsYXN0Q2xpY2sgPSAwO1xuXG5oYW5kbGVycy5tb3VzZWRvd24gPSBmdW5jdGlvbiAocG0sIGUpIHtcbiAgaWYgKGUuY3RybEtleSkgcmV0dXJuIHNlbGVjdENsaWNrZWROb2RlKHBtLCBlKTtcblxuICBwbS5zZWwucG9sbEZvclVwZGF0ZSgpO1xuXG4gIHZhciBub3cgPSBEYXRlLm5vdygpLFxuICAgICAgbXVsdGkgPSBub3cgLSBsYXN0Q2xpY2sgPCA1MDA7XG4gIGxhc3RDbGljayA9IG5vdztcbiAgaWYgKHBtLmlucHV0LnNoaWZ0S2V5IHx8IG11bHRpKSByZXR1cm47XG5cbiAgdmFyIHggPSBlLmNsaWVudFgsXG4gICAgICB5ID0gZS5jbGllbnRZLFxuICAgICAgbW92ZWQgPSBmYWxzZTtcbiAgdmFyIHVwID0gZnVuY3Rpb24gdXAoKSB7XG4gICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgdXApO1xuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgbW92ZSk7XG4gICAgaWYgKCgwLCBfc2VsZWN0aW9uLmhhbmRsZU5vZGVDbGljaykocG0sIGUpKSByZXR1cm47XG5cbiAgICB2YXIgcG9zID0gIW1vdmVkICYmICgwLCBfc2VsZWN0aW9uLnNlbGVjdGFibGVOb2RlQWJvdmUpKHBtLCBlLnRhcmdldCwgeyBsZWZ0OiBlLmNsaWVudFgsIHRvcDogZS5jbGllbnRZIH0pO1xuICAgIGlmIChwb3MpIHtcbiAgICAgIHBtLnNldE5vZGVTZWxlY3Rpb24ocG9zKTtcbiAgICAgIHBtLmZvY3VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBtLnNlbC5wb2xsRm9yVXBkYXRlKCk7XG4gICAgfVxuICB9O1xuICB2YXIgbW92ZSA9IGZ1bmN0aW9uIG1vdmUoZSkge1xuICAgIGlmICghbW92ZWQgJiYgKE1hdGguYWJzKHggLSBlLmNsaWVudFgpID4gNCB8fCBNYXRoLmFicyh5IC0gZS5jbGllbnRZKSA+IDQpKSBtb3ZlZCA9IHRydWU7XG4gICAgcG0uc2VsLnBvbGxGb3JVcGRhdGUoKTtcbiAgfTtcbiAgYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgdXApO1xuICBhZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIG1vdmUpO1xufTtcblxuaGFuZGxlcnMudG91Y2hkb3duID0gZnVuY3Rpb24gKHBtKSB7XG4gIHBtLnNlbC5wb2xsRm9yVXBkYXRlKCk7XG59O1xuXG4vKipcbiAqIEEgY2xhc3MgdG8gdHJhY2sgc3RhdGUgd2hpbGUgY3JlYXRpbmcgYSBjb21wb3NlZCBjaGFyYWN0ZXIuXG4gKi9cblxudmFyIENvbXBvc2luZyA9IGZ1bmN0aW9uIENvbXBvc2luZyhwbSwgZGF0YSkge1xuICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29tcG9zaW5nKTtcblxuICB0aGlzLmZpbmlzaGVkID0gZmFsc2U7XG4gIHRoaXMuY29udGV4dCA9ICgwLCBfZG9tY2hhbmdlLnRleHRDb250ZXh0KShkYXRhKTtcbiAgdGhpcy5kYXRhID0gZGF0YTtcbiAgdGhpcy5lbmREYXRhID0gbnVsbDtcbiAgdmFyIHJhbmdlID0gcG0uc2VsZWN0aW9uO1xuICBpZiAoZGF0YSkge1xuICAgIHZhciBwYXRoID0gcmFuZ2UuaGVhZC5wYXRoLFxuICAgICAgICBsaW5lID0gcG0uZG9jLnBhdGgocGF0aCkudGV4dENvbnRlbnQ7XG4gICAgdmFyIGZvdW5kID0gbGluZS5pbmRleE9mKGRhdGEsIHJhbmdlLmhlYWQub2Zmc2V0IC0gZGF0YS5sZW5ndGgpO1xuICAgIGlmIChmb3VuZCA+IC0xICYmIGZvdW5kIDw9IHJhbmdlLmhlYWQub2Zmc2V0ICsgZGF0YS5sZW5ndGgpIHJhbmdlID0gbmV3IF9zZWxlY3Rpb24uVGV4dFNlbGVjdGlvbihuZXcgX21vZGVsLlBvcyhwYXRoLCBmb3VuZCksIG5ldyBfbW9kZWwuUG9zKHBhdGgsIGZvdW5kICsgZGF0YS5sZW5ndGgpKTtcbiAgfVxuICB0aGlzLnJhbmdlID0gcmFuZ2U7XG59O1xuXG5oYW5kbGVycy5jb21wb3NpdGlvbnN0YXJ0ID0gZnVuY3Rpb24gKHBtLCBlKSB7XG4gIGlmIChwbS5pbnB1dC5tYXliZUFib3J0Q29tcG9zaXRpb24oKSkgcmV0dXJuO1xuXG4gIHBtLmZsdXNoKCk7XG4gIHBtLmlucHV0LmNvbXBvc2luZyA9IG5ldyBDb21wb3NpbmcocG0sIGUuZGF0YSk7XG4gIHZhciBhYm92ZSA9IHBtLnNlbGVjdGlvbi5oZWFkLnNob3J0ZW4oKTtcbiAgcG0ubWFya1JhbmdlRGlydHkoeyBmcm9tOiBhYm92ZSwgdG86IGFib3ZlLm1vdmUoMSkgfSk7XG59O1xuXG5oYW5kbGVycy5jb21wb3NpdGlvbnVwZGF0ZSA9IGZ1bmN0aW9uIChwbSwgZSkge1xuICB2YXIgaW5mbyA9IHBtLmlucHV0LmNvbXBvc2luZztcbiAgaWYgKGluZm8gJiYgaW5mby5kYXRhICE9IGUuZGF0YSkge1xuICAgIGluZm8uZGF0YSA9IGUuZGF0YTtcbiAgICBwbS5pbnB1dC51cGRhdGluZ0NvbXBvc2l0aW9uID0gdHJ1ZTtcbiAgICBpbnB1dFRleHQocG0sIGluZm8ucmFuZ2UsIGluZm8uZGF0YSk7XG4gICAgcG0uaW5wdXQudXBkYXRpbmdDb21wb3NpdGlvbiA9IGZhbHNlO1xuICAgIGluZm8ucmFuZ2UgPSBuZXcgX3NlbGVjdGlvbi5UZXh0U2VsZWN0aW9uKGluZm8ucmFuZ2UuZnJvbSwgaW5mby5yYW5nZS5mcm9tLm1vdmUoaW5mby5kYXRhLmxlbmd0aCkpO1xuICB9XG59O1xuXG5oYW5kbGVycy5jb21wb3NpdGlvbmVuZCA9IGZ1bmN0aW9uIChwbSwgZSkge1xuICB2YXIgaW5mbyA9IHBtLmlucHV0LmNvbXBvc2luZztcbiAgaWYgKGluZm8pIHtcbiAgICBwbS5pbnB1dC5jb21wb3NpbmcuZmluaXNoZWQgPSB0cnVlO1xuICAgIHBtLmlucHV0LmNvbXBvc2luZy5lbmREYXRhID0gZS5kYXRhO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHBtLmlucHV0LmNvbXBvc2luZyA9PSBpbmZvKSBmaW5pc2hDb21wb3NpbmcocG0pO1xuICAgIH0sIDIwKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZmluaXNoQ29tcG9zaW5nKHBtKSB7XG4gIHZhciBpbmZvID0gcG0uaW5wdXQuY29tcG9zaW5nO1xuICB2YXIgdGV4dCA9ICgwLCBfZG9tY2hhbmdlLnRleHRJbkNvbnRleHQpKGluZm8uY29udGV4dCwgaW5mby5lbmREYXRhKTtcbiAgdmFyIHJhbmdlID0gKDAsIF9zZWxlY3Rpb24ucmFuZ2VGcm9tRE9NTG9vc2UpKHBtKTtcbiAgcG0uZW5zdXJlT3BlcmF0aW9uKCk7XG4gIHBtLmlucHV0LmNvbXBvc2luZyA9IG51bGw7XG4gIGlmICh0ZXh0ICE9IGluZm8uZGF0YSkgaW5wdXRUZXh0KHBtLCBpbmZvLnJhbmdlLCB0ZXh0KTtcbiAgaWYgKHJhbmdlICYmICFyYW5nZS5lcShwbS5zZWwucmFuZ2UpKSBwbS5zZXRTZWxlY3Rpb25EaXJlY3QocmFuZ2UpO1xufVxuXG5oYW5kbGVycy5pbnB1dCA9IGZ1bmN0aW9uIChwbSkge1xuICBpZiAocG0uaW5wdXQuc2tpcElucHV0KSByZXR1cm4gLS1wbS5pbnB1dC5za2lwSW5wdXQ7XG5cbiAgaWYgKHBtLmlucHV0LmNvbXBvc2luZykge1xuICAgIGlmIChwbS5pbnB1dC5jb21wb3NpbmcuZmluaXNoZWQpIGZpbmlzaENvbXBvc2luZyhwbSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcG0uc2VsLnN0b3BQb2xsaW5nRm9yVXBkYXRlKCk7XG4gICgwLCBfZG9tY2hhbmdlLmFwcGx5RE9NQ2hhbmdlKShwbSk7XG4gIHBtLnNjcm9sbEludG9WaWV3KCk7XG59O1xuXG52YXIgbGFzdENvcGllZCA9IG51bGw7XG5cbmhhbmRsZXJzLmNvcHkgPSBoYW5kbGVycy5jdXQgPSBmdW5jdGlvbiAocG0sIGUpIHtcbiAgdmFyIF9wbSRzZWxlY3Rpb24yID0gcG0uc2VsZWN0aW9uO1xuICB2YXIgZnJvbSA9IF9wbSRzZWxlY3Rpb24yLmZyb207XG4gIHZhciB0byA9IF9wbSRzZWxlY3Rpb24yLnRvO1xuICB2YXIgZW1wdHkgPSBfcG0kc2VsZWN0aW9uMi5lbXB0eTtcblxuICBpZiAoZW1wdHkpIHJldHVybjtcbiAgdmFyIGZyYWdtZW50ID0gcG0uc2VsZWN0ZWREb2M7XG4gIGxhc3RDb3BpZWQgPSB7IGRvYzogcG0uZG9jLCBmcm9tOiBmcm9tLCB0bzogdG8sXG4gICAgaHRtbDogKDAsIF9zZXJpYWxpemVEb20udG9IVE1MKShmcmFnbWVudCksXG4gICAgdGV4dDogKDAsIF9zZXJpYWxpemVUZXh0LnRvVGV4dCkoZnJhZ21lbnQpIH07XG5cbiAgaWYgKGUuY2xpcGJvYXJkRGF0YSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLmNsaXBib2FyZERhdGEuY2xlYXJEYXRhKCk7XG4gICAgZS5jbGlwYm9hcmREYXRhLnNldERhdGEoXCJ0ZXh0L2h0bWxcIiwgbGFzdENvcGllZC5odG1sKTtcbiAgICBlLmNsaXBib2FyZERhdGEuc2V0RGF0YShcInRleHQvcGxhaW5cIiwgbGFzdENvcGllZC50ZXh0KTtcbiAgICBpZiAoZS50eXBlID09IFwiY3V0XCIgJiYgIWVtcHR5KSBwbS50cltcImRlbGV0ZVwiXShmcm9tLCB0bykuYXBwbHkoKTtcbiAgfVxufTtcblxuaGFuZGxlcnMucGFzdGUgPSBmdW5jdGlvbiAocG0sIGUpIHtcbiAgaWYgKCFlLmNsaXBib2FyZERhdGEpIHJldHVybjtcbiAgdmFyIHNlbCA9IHBtLnNlbGVjdGlvbjtcbiAgdmFyIHR4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKFwidGV4dC9wbGFpblwiKTtcbiAgdmFyIGh0bWwgPSBlLmNsaXBib2FyZERhdGEuZ2V0RGF0YShcInRleHQvaHRtbFwiKTtcbiAgaWYgKGh0bWwgfHwgdHh0KSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHZhciBkb2MgPSB1bmRlZmluZWQsXG4gICAgICAgIGZyb20gPSB1bmRlZmluZWQsXG4gICAgICAgIHRvID0gdW5kZWZpbmVkO1xuICAgIGlmIChwbS5pbnB1dC5zaGlmdEtleSAmJiB0eHQpIHtcbiAgICAgIGRvYyA9ICgwLCBfcGFyc2VUZXh0LmZyb21UZXh0KShwbS5zY2hlbWEsIHR4dCk7XG4gICAgfSBlbHNlIGlmIChsYXN0Q29waWVkICYmIChsYXN0Q29waWVkLmh0bWwgPT0gaHRtbCB8fCBsYXN0Q29waWVkLnRleHQgPT0gdHh0KSkge1xuICAgICAgO3ZhciBfbGFzdENvcGllZCA9IGxhc3RDb3BpZWQ7XG4gICAgICBkb2MgPSBfbGFzdENvcGllZC5kb2M7XG4gICAgICBmcm9tID0gX2xhc3RDb3BpZWQuZnJvbTtcbiAgICAgIHRvID0gX2xhc3RDb3BpZWQudG87XG4gICAgfSBlbHNlIGlmIChodG1sKSB7XG4gICAgICBkb2MgPSAoMCwgX3BhcnNlRG9tLmZyb21IVE1MKShwbS5zY2hlbWEsIGh0bWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb2MgPSAoMCwgX3BhcnNlLnBhcnNlRnJvbSkocG0uc2NoZW1hLCB0eHQsICgwLCBfcGFyc2Uua25vd25Tb3VyY2UpKFwibWFya2Rvd25cIikgPyBcIm1hcmtkb3duXCIgOiBcInRleHRcIik7XG4gICAgfVxuICAgIHBtLnRyLnJlcGxhY2Uoc2VsLmZyb20sIHNlbC50bywgZG9jLCBmcm9tIHx8ICgwLCBfc2VsZWN0aW9uLmZpbmRTZWxlY3Rpb25BdFN0YXJ0KShkb2MpLmZyb20sIHRvIHx8ICgwLCBfc2VsZWN0aW9uLmZpbmRTZWxlY3Rpb25BdEVuZCkoZG9jKS50bykuYXBwbHkoKTtcbiAgICBwbS5zY3JvbGxJbnRvVmlldygpO1xuICB9XG59O1xuXG5oYW5kbGVycy5kcmFnc3RhcnQgPSBmdW5jdGlvbiAocG0sIGUpIHtcbiAgaWYgKCFlLmRhdGFUcmFuc2ZlcikgcmV0dXJuO1xuXG4gIHZhciBmcmFnbWVudCA9IHBtLnNlbGVjdGVkRG9jO1xuXG4gIGUuZGF0YVRyYW5zZmVyLnNldERhdGEoXCJ0ZXh0L2h0bWxcIiwgKDAsIF9zZXJpYWxpemVEb20udG9IVE1MKShmcmFnbWVudCkpO1xuICBlLmRhdGFUcmFuc2Zlci5zZXREYXRhKFwidGV4dC9wbGFpblwiLCAoMCwgX3NlcmlhbGl6ZVRleHQudG9UZXh0KShmcmFnbWVudCkpO1xuICBwbS5pbnB1dC5kcmFnZ2luZ0Zyb20gPSB0cnVlO1xufTtcblxuaGFuZGxlcnMuZHJhZ2VuZCA9IGZ1bmN0aW9uIChwbSkge1xuICByZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBwbS5pbnB1dC5kcmFnZ2luRnJvbSA9IGZhbHNlO1xuICB9LCA1MCk7XG59O1xuXG5oYW5kbGVycy5kcmFnb3ZlciA9IGhhbmRsZXJzLmRyYWdlbnRlciA9IGZ1bmN0aW9uIChwbSwgZSkge1xuICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIHZhciBjdXJzb3JQb3MgPSBwbS5wb3NBdENvb3Jkcyh7IGxlZnQ6IGUuY2xpZW50WCwgdG9wOiBlLmNsaWVudFkgfSk7XG4gIGlmICghY3Vyc29yUG9zKSByZXR1cm47XG4gIHZhciBjb29yZHMgPSAoMCwgX3NlbGVjdGlvbi5jb29yZHNBdFBvcykocG0sIGN1cnNvclBvcyk7XG4gIHZhciByZWN0ID0gcG0ud3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgY29vcmRzLnRvcCAtPSByZWN0LnRvcDtcbiAgY29vcmRzLnJpZ2h0IC09IHJlY3QubGVmdDtcbiAgY29vcmRzLmJvdHRvbSAtPSByZWN0LnRvcDtcbiAgY29vcmRzLmxlZnQgLT0gcmVjdC5sZWZ0O1xuICB2YXIgdGFyZ2V0ID0gcG0uaW5wdXQuZHJvcFRhcmdldDtcbiAgdGFyZ2V0LnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gIHRhcmdldC5zdHlsZS5sZWZ0ID0gY29vcmRzLmxlZnQgLSAxICsgXCJweFwiO1xuICB0YXJnZXQuc3R5bGUudG9wID0gY29vcmRzLnRvcCArIFwicHhcIjtcbiAgdGFyZ2V0LnN0eWxlLmhlaWdodCA9IGNvb3Jkcy5ib3R0b20gLSBjb29yZHMudG9wICsgXCJweFwiO1xufTtcblxuaGFuZGxlcnMuZHJhZ2xlYXZlID0gZnVuY3Rpb24gKHBtKSB7XG4gIHJldHVybiBwbS5pbnB1dC5kcm9wVGFyZ2V0LnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xufTtcblxuaGFuZGxlcnMuZHJvcCA9IGZ1bmN0aW9uIChwbSwgZSkge1xuICBwbS5pbnB1dC5kcm9wVGFyZ2V0LnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xuXG4gIGlmICghZS5kYXRhVHJhbnNmZXIpIHJldHVybjtcblxuICB2YXIgaHRtbCA9IHVuZGVmaW5lZCxcbiAgICAgIHR4dCA9IHVuZGVmaW5lZCxcbiAgICAgIGRvYyA9IHVuZGVmaW5lZDtcbiAgaWYgKGh0bWwgPSBlLmRhdGFUcmFuc2Zlci5nZXREYXRhKFwidGV4dC9odG1sXCIpKSBkb2MgPSAoMCwgX3BhcnNlRG9tLmZyb21IVE1MKShwbS5zY2hlbWEsIGh0bWwsIHsgZG9jdW1lbnQ6IGRvY3VtZW50IH0pO2Vsc2UgaWYgKHR4dCA9IGUuZGF0YVRyYW5zZmVyLmdldERhdGEoXCJ0ZXh0L3BsYWluXCIpKSBkb2MgPSAoMCwgX3BhcnNlLnBhcnNlRnJvbSkocG0uc2NoZW1hLCB0eHQsICgwLCBfcGFyc2Uua25vd25Tb3VyY2UpKFwibWFya2Rvd25cIikgPyBcIm1hcmtkb3duXCIgOiBcInRleHRcIik7XG5cbiAgaWYgKGRvYykge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB2YXIgaW5zZXJ0UG9zID0gcG0ucG9zQXRDb29yZHMoeyBsZWZ0OiBlLmNsaWVudFgsIHRvcDogZS5jbGllbnRZIH0pO1xuICAgIGlmICghaW5zZXJ0UG9zKSByZXR1cm47XG4gICAgdmFyIHRyID0gcG0udHI7XG4gICAgaWYgKHBtLmlucHV0LmRyYWdnaW5nRnJvbSAmJiAhZS5jdHJsS2V5KSB7XG4gICAgICB0ci5kZWxldGVTZWxlY3Rpb24oKTtcbiAgICAgIGluc2VydFBvcyA9IHRyLm1hcChpbnNlcnRQb3MpLnBvcztcbiAgICB9XG4gICAgdHIucmVwbGFjZShpbnNlcnRQb3MsIGluc2VydFBvcywgZG9jLCAoMCwgX3NlbGVjdGlvbi5maW5kU2VsZWN0aW9uQXRTdGFydCkoZG9jKS5mcm9tLCAoMCwgX3NlbGVjdGlvbi5maW5kU2VsZWN0aW9uQXRFbmQpKGRvYykudG8pLmFwcGx5KCk7XG4gICAgcG0uc2V0VGV4dFNlbGVjdGlvbihpbnNlcnRQb3MsIHRyLm1hcChpbnNlcnRQb3MpLnBvcyk7XG4gICAgcG0uZm9jdXMoKTtcbiAgfVxufTtcblxuaGFuZGxlcnMuZm9jdXMgPSBmdW5jdGlvbiAocG0pIHtcbiAgKDAsIF9kb20uYWRkQ2xhc3MpKHBtLndyYXBwZXIsIFwiUHJvc2VNaXJyb3ItZm9jdXNlZFwiKTtcbiAgLy8gOjogKCkgI3BhdGg9UHJvc2VNaXJyb3IjZXZlbnRzI2ZvY3VzXG4gIC8vIEZpcmVkIHdoZW4gdGhlIGVkaXRvciBnYWlucyBmb2N1cy5cbiAgcG0uc2lnbmFsKFwiZm9jdXNcIik7XG59O1xuXG5oYW5kbGVycy5ibHVyID0gZnVuY3Rpb24gKHBtKSB7XG4gICgwLCBfZG9tLnJtQ2xhc3MpKHBtLndyYXBwZXIsIFwiUHJvc2VNaXJyb3ItZm9jdXNlZFwiKTtcbiAgLy8gOjogKCkgI3BhdGg9UHJvc2VNaXJyb3IjZXZlbnRzI2JsdXJcbiAgLy8gRmlyZWQgd2hlbiB0aGUgZWRpdG9yIGxvc2VzIGZvY3VzLlxuICBwbS5zaWduYWwoXCJibHVyXCIpO1xufTsiLCIvLyBGcm9tIENvZGVNaXJyb3IsIHNob3VsZCBiZSBmYWN0b3JlZCBpbnRvIGl0cyBvd24gTlBNIG1vZHVsZVxuXG4vLyBkZWNsYXJlX2dsb2JhbDogbmF2aWdhdG9yXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5leHBvcnRzLmtleU5hbWUgPSBrZXlOYW1lO1xuZXhwb3J0cy5pc01vZGlmaWVyS2V5ID0gaXNNb2RpZmllcktleTtcbmV4cG9ydHMubm9ybWFsaXplS2V5TmFtZSA9IG5vcm1hbGl6ZUtleU5hbWU7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBtYWMgPSB0eXBlb2YgbmF2aWdhdG9yICE9IFwidW5kZWZpbmVkXCIgPyAvTWFjLy50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSkgOiBmYWxzZTtcblxuLy8gOjogT2JqZWN0PHN0cmluZz5cbi8vIEEgbWFwIGZyb20ga2V5IGNvZGVzIHRvIGtleSBuYW1lcy5cbnZhciBrZXlOYW1lcyA9IHtcbiAgMzogXCJFbnRlclwiLCA4OiBcIkJhY2tzcGFjZVwiLCA5OiBcIlRhYlwiLCAxMzogXCJFbnRlclwiLCAxNjogXCJTaGlmdFwiLCAxNzogXCJDdHJsXCIsIDE4OiBcIkFsdFwiLFxuICAxOTogXCJQYXVzZVwiLCAyMDogXCJDYXBzTG9ja1wiLCAyNzogXCJFc2NcIiwgMzI6IFwiU3BhY2VcIiwgMzM6IFwiUGFnZVVwXCIsIDM0OiBcIlBhZ2VEb3duXCIsIDM1OiBcIkVuZFwiLFxuICAzNjogXCJIb21lXCIsIDM3OiBcIkxlZnRcIiwgMzg6IFwiVXBcIiwgMzk6IFwiUmlnaHRcIiwgNDA6IFwiRG93blwiLCA0NDogXCJQcmludFNjcm5cIiwgNDU6IFwiSW5zZXJ0XCIsXG4gIDQ2OiBcIkRlbGV0ZVwiLCA1OTogXCI7XCIsIDYxOiBcIj1cIiwgOTE6IFwiTW9kXCIsIDkyOiBcIk1vZFwiLCA5MzogXCJNb2RcIixcbiAgMTA2OiBcIipcIiwgMTA3OiBcIj1cIiwgMTA5OiBcIi1cIiwgMTEwOiBcIi5cIiwgMTExOiBcIi9cIiwgMTI3OiBcIkRlbGV0ZVwiLFxuICAxNzM6IFwiLVwiLCAxODY6IFwiO1wiLCAxODc6IFwiPVwiLCAxODg6IFwiLFwiLCAxODk6IFwiLVwiLCAxOTA6IFwiLlwiLCAxOTE6IFwiL1wiLCAxOTI6IFwiYFwiLCAyMTk6IFwiW1wiLCAyMjA6IFwiXFxcXFwiLFxuICAyMjE6IFwiXVwiLCAyMjI6IFwiJ1wiLCA2MzIzMjogXCJVcFwiLCA2MzIzMzogXCJEb3duXCIsIDYzMjM0OiBcIkxlZnRcIiwgNjMyMzU6IFwiUmlnaHRcIiwgNjMyNzI6IFwiRGVsZXRlXCIsXG4gIDYzMjczOiBcIkhvbWVcIiwgNjMyNzU6IFwiRW5kXCIsIDYzMjc2OiBcIlBhZ2VVcFwiLCA2MzI3NzogXCJQYWdlRG93blwiLCA2MzMwMjogXCJJbnNlcnRcIlxufTtcblxuZXhwb3J0cy5rZXlOYW1lcyA9IGtleU5hbWVzO1xuLy8gTnVtYmVyIGtleXNcbmZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICBrZXlOYW1lc1tpICsgNDhdID0ga2V5TmFtZXNbaSArIDk2XSA9IFN0cmluZyhpKTtcbn0gLy8gQWxwaGFiZXRpYyBrZXlzXG5mb3IgKHZhciBpID0gNjU7IGkgPD0gOTA7IGkrKykge1xuICBrZXlOYW1lc1tpXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoaSk7XG59IC8vIEZ1bmN0aW9uIGtleXNcbmZvciAodmFyIGkgPSAxOyBpIDw9IDEyOyBpKyspIHtcbiAga2V5TmFtZXNbaSArIDExMV0gPSBrZXlOYW1lc1tpICsgNjMyMzVdID0gXCJGXCIgKyBpO1xufSAvLyA6OiAoS2V5Ym9hcmRFdmVudCkg4oaSID9zdHJpbmdcbi8vIEZpbmQgYSBuYW1lIGZvciB0aGUgZ2l2ZW4ga2V5ZG93biBldmVudC4gSWYgdGhlIGtleWNvZGUgaW4gdGhlXG4vLyBldmVudCBpcyBub3Qga25vd24sIHRoaXMgd2lsbCByZXR1cm4gYG51bGxgLiBPdGhlcndpc2UsIGl0IHdpbGxcbi8vIHJldHVybiBhIHN0cmluZyBsaWtlIGBcIlNoaWZ0LUNtZC1DdHJsLUFsdC1Ib21lXCJgLiBUaGUgcGFydHMgYmVmb3JlXG4vLyB0aGUgZGFzaGVzIGdpdmUgdGhlIG1vZGlmaWVycyAoYWx3YXlzIGluIHRoYXQgb3JkZXIsIGlmIHByZXNlbnQpLFxuLy8gYW5kIHRoZSBsYXN0IHdvcmQgZ2l2ZXMgdGhlIGtleSBuYW1lLCB3aGljaCBvbmUgb2YgdGhlIG5hbWVzIGluXG4vLyBga2V5TmFtZXNgLlxuLy9cbi8vIFRoZSBjb252ZW50aW9uIGZvciBrZXlwcmVzcyBldmVudHMgaXMgdG8gdXNlIHRoZSBwcmVzc2VkIGNoYXJhY3RlclxuLy8gYmV0d2VlbiBzaW5nbGUgcXVvdGVzLiBEdWUgdG8gbGltaXRhdGlvbnMgaW4gdGhlIGJyb3dzZXIgQVBJLFxuLy8ga2V5cHJlc3MgZXZlbnRzIGNhbiBub3QgaGF2ZSBtb2RpZmllcnMuXG5cbmZ1bmN0aW9uIGtleU5hbWUoZXZlbnQpIHtcbiAgdmFyIGJhc2UgPSBrZXlOYW1lc1tldmVudC5rZXlDb2RlXSxcbiAgICAgIG5hbWUgPSBiYXNlO1xuICBpZiAobmFtZSA9PSBudWxsIHx8IGV2ZW50LmFsdEdyYXBoS2V5KSByZXR1cm4gbnVsbDtcblxuICBpZiAoZXZlbnQuYWx0S2V5ICYmIGJhc2UgIT0gXCJBbHRcIikgbmFtZSA9IFwiQWx0LVwiICsgbmFtZTtcbiAgaWYgKGV2ZW50LmN0cmxLZXkgJiYgYmFzZSAhPSBcIkN0cmxcIikgbmFtZSA9IFwiQ3RybC1cIiArIG5hbWU7XG4gIGlmIChldmVudC5tZXRhS2V5ICYmIGJhc2UgIT0gXCJDbWRcIikgbmFtZSA9IFwiQ21kLVwiICsgbmFtZTtcbiAgaWYgKGV2ZW50LnNoaWZ0S2V5ICYmIGJhc2UgIT0gXCJTaGlmdFwiKSBuYW1lID0gXCJTaGlmdC1cIiArIG5hbWU7XG4gIHJldHVybiBuYW1lO1xufVxuXG4vLyA6OiAoc3RyaW5nKSDihpIgYm9vbFxuLy8gVGVzdCB3aGV0aGVyIHRoZSBnaXZlbiBrZXkgbmFtZSByZWZlcnMgdG8gYSBtb2RpZmllciBrZXkuXG5cbmZ1bmN0aW9uIGlzTW9kaWZpZXJLZXkobmFtZSkge1xuICBuYW1lID0gL1teLV0qJC8uZXhlYyhuYW1lKVswXTtcbiAgcmV0dXJuIG5hbWUgPT0gXCJDdHJsXCIgfHwgbmFtZSA9PSBcIkFsdFwiIHx8IG5hbWUgPT0gXCJTaGlmdFwiIHx8IG5hbWUgPT0gXCJNb2RcIjtcbn1cblxuLy8gOjogKHN0cmluZykg4oaSIHN0cmluZ1xuLy8gTm9ybWFsaXplIGEgc2xvcHB5IGtleSBuYW1lLCB3aGljaCBtYXkgaGF2ZSBtb2RpZmllcnMgaW4gdGhlIHdyb25nXG4vLyBvcmRlciBvciB1c2Ugc2hvcnRoYW5kcyBmb3IgbW9kaWZpZXJzLCB0byBhIHByb3Blcmx5IGZvcm1lZCBrZXlcbi8vIG5hbWUuIFVzZWQgdG8gbm9ybWFsaXplIG5hbWVzIHByb3ZpZGVkIGluIGtleW1hcHMuXG4vL1xuLy8gTm90ZSB0aGF0IHRoZSBtb2RpZmllciBgbW9kYCBpcyBhIHNob3J0aGFuZCBmb3IgYENtZGAgb24gTWFjLCBhbmRcbi8vIGBDdHJsYCBvbiBvdGhlciBwbGF0Zm9ybXMuXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUtleU5hbWUobmFtZSkge1xuICB2YXIgcGFydHMgPSBuYW1lLnNwbGl0KC8tKD8hJz8kKS8pLFxuICAgICAgcmVzdWx0ID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07XG4gIHZhciBhbHQgPSB1bmRlZmluZWQsXG4gICAgICBjdHJsID0gdW5kZWZpbmVkLFxuICAgICAgc2hpZnQgPSB1bmRlZmluZWQsXG4gICAgICBjbWQgPSB1bmRlZmluZWQ7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgdmFyIG1vZCA9IHBhcnRzW2ldO1xuICAgIGlmICgvXihjbWR8bWV0YXxtKSQvaS50ZXN0KG1vZCkpIGNtZCA9IHRydWU7ZWxzZSBpZiAoL15hKGx0KT8kL2kudGVzdChtb2QpKSBhbHQgPSB0cnVlO2Vsc2UgaWYgKC9eKGN8Y3RybHxjb250cm9sKSQvaS50ZXN0KG1vZCkpIGN0cmwgPSB0cnVlO2Vsc2UgaWYgKC9ecyhoaWZ0KSQvaS50ZXN0KG1vZCkpIHNoaWZ0ID0gdHJ1ZTtlbHNlIGlmICgvXm1vZCQvaS50ZXN0KG1vZCkpIHtcbiAgICAgIGlmIChtYWMpIGNtZCA9IHRydWU7ZWxzZSBjdHJsID0gdHJ1ZTtcbiAgICB9IGVsc2UgdGhyb3cgbmV3IEVycm9yKFwiVW5yZWNvZ25pemVkIG1vZGlmaWVyIG5hbWU6IFwiICsgbW9kKTtcbiAgfVxuICBpZiAoYWx0KSByZXN1bHQgPSBcIkFsdC1cIiArIHJlc3VsdDtcbiAgaWYgKGN0cmwpIHJlc3VsdCA9IFwiQ3RybC1cIiArIHJlc3VsdDtcbiAgaWYgKGNtZCkgcmVzdWx0ID0gXCJDbWQtXCIgKyByZXN1bHQ7XG4gIGlmIChzaGlmdCkgcmVzdWx0ID0gXCJTaGlmdC1cIiArIHJlc3VsdDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gOzsgQSBrZXltYXAgYmluZHMgYSBzZXQgb2YgW2tleSBuYW1lc10oI2tleU5hbWUpIHRvIGNvbW1hbmRzIG5hbWVzXG4vLyBvciBmdW5jdGlvbnMuXG5cbnZhciBLZXltYXAgPSAoZnVuY3Rpb24gKCkge1xuICAvLyA6OiAoT2JqZWN0LCA/T2JqZWN0KVxuICAvLyBDb25zdHJ1Y3QgYSBrZXltYXAgdXNpbmcgdGhlIGJpbmRpbmdzIGluIGBrZXlzYCwgd2hvc2UgcHJvcGVydGllc1xuICAvLyBzaG91bGQgYmUgW2tleSBuYW1lc10oI2tleU5hbWUpIG9yIHNwYWNlLXNlcGFyYXRlZCBzZXF1ZW5jZXMgb2ZcbiAgLy8ga2V5IG5hbWVzLiBJbiB0aGUgc2Vjb25kIGNhc2UsIHRoZSBiaW5kaW5nIHdpbGwgYmUgZm9yIGFcbiAgLy8gbXVsdGktc3Ryb2tlIGtleSBjb21iaW5hdGlvbi5cbiAgLy9cbiAgLy8gV2hlbiBgb3B0aW9uc2AgaGFzIGEgcHJvcGVydHkgYGNhbGxgLCB0aGlzIHdpbGwgYmUgYSBwcm9ncmFtbWF0aWNcbiAgLy8ga2V5bWFwLCBtZWFuaW5nIHRoYXQgaW5zdGVhZCBvZiBsb29raW5nIGtleXMgdXAgaW4gaXRzIHNldCBvZlxuICAvLyBiaW5kaW5ncywgaXQgd2lsbCBwYXNzIHRoZSBrZXkgbmFtZSB0byBgb3B0aW9ucy5jYWxsYCwgYW5kIHVzZVxuICAvLyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoYXQgY2FsbHMgYXMgdGhlIHJlc29sdmVkIGJpbmRpbmcuXG4gIC8vXG4gIC8vIGBvcHRpb25zLm5hbWVgIGNhbiBiZSB1c2VkIHRvIGdpdmUgdGhlIGtleW1hcCBhIG5hbWUsIG1ha2luZyBpdFxuICAvLyBlYXNpZXIgdG8gW3JlbW92ZV0oI1Byb3NlTWlycm9yLnJlbW92ZUtleW1hcCkgZnJvbSBhbiBlZGl0b3IuXG5cbiAgZnVuY3Rpb24gS2V5bWFwKGtleXMsIG9wdGlvbnMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgS2V5bWFwKTtcblxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgdGhpcy5iaW5kaW5ncyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgaWYgKGtleXMpIGZvciAodmFyIGtleW5hbWUgaW4ga2V5cykge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChrZXlzLCBrZXluYW1lKSkgdGhpcy5hZGRCaW5kaW5nKGtleW5hbWUsIGtleXNba2V5bmFtZV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIDo6IChzdHJpbmcsIGFueSlcbiAgLy8gQWRkIGEgYmluZGluZyBmb3IgdGhlIGdpdmVuIGtleSBvciBrZXkgc2VxdWVuY2UuXG5cbiAgX2NyZWF0ZUNsYXNzKEtleW1hcCwgW3tcbiAgICBrZXk6IFwiYWRkQmluZGluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRCaW5kaW5nKGtleW5hbWUsIHZhbHVlKSB7XG4gICAgICB2YXIga2V5cyA9IGtleW5hbWUuc3BsaXQoLyArKD8hXFwnJCkvKS5tYXAobm9ybWFsaXplS2V5TmFtZSk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIF9uYW1lID0ga2V5cy5zbGljZSgwLCBpICsgMSkuam9pbihcIiBcIik7XG4gICAgICAgIHZhciB2YWwgPSBpID09IGtleXMubGVuZ3RoIC0gMSA/IHZhbHVlIDogXCIuLi5cIjtcbiAgICAgICAgdmFyIHByZXYgPSB0aGlzLmJpbmRpbmdzW19uYW1lXTtcbiAgICAgICAgaWYgKCFwcmV2KSB0aGlzLmJpbmRpbmdzW19uYW1lXSA9IHZhbDtlbHNlIGlmIChwcmV2ICE9IHZhbCkgdGhyb3cgbmV3IEVycm9yKFwiSW5jb25zaXN0ZW50IGJpbmRpbmdzIGZvciBcIiArIF9uYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA6OiAoc3RyaW5nKVxuICAgIC8vIFJlbW92ZSB0aGUgYmluZGluZyBmb3IgdGhlIGdpdmVuIGtleSBvciBrZXkgc2VxdWVuY2UuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlQmluZGluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVCaW5kaW5nKGtleW5hbWUpIHtcbiAgICAgIHZhciBrZXlzID0ga2V5bmFtZS5zcGxpdCgvICsoPyFcXCckKS8pLm1hcChub3JtYWxpemVLZXlOYW1lKTtcbiAgICAgIGZvciAodmFyIGkgPSBrZXlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHZhciBfbmFtZTIgPSBrZXlzLnNsaWNlKDAsIGkpLmpvaW4oXCIgXCIpO1xuICAgICAgICB2YXIgdmFsID0gdGhpcy5iaW5kaW5nc1tfbmFtZTJdO1xuICAgICAgICBpZiAodmFsID09IFwiLi4uXCIgJiYgIXRoaXMudW51c2VkTXVsdGkoX25hbWUyKSkgYnJlYWs7ZWxzZSBpZiAodmFsKSBkZWxldGUgdGhpcy5iaW5kaW5nc1tfbmFtZTJdO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1bnVzZWRNdWx0aVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1bnVzZWRNdWx0aShuYW1lKSB7XG4gICAgICBmb3IgKHZhciBiaW5kaW5nIGluIHRoaXMuYmluZGluZ3MpIHtcbiAgICAgICAgaWYgKGJpbmRpbmcubGVuZ3RoID4gbmFtZSAmJiBiaW5kaW5nLmluZGV4T2YobmFtZSkgPT0gMCAmJiBiaW5kaW5nLmNoYXJBdChuYW1lLmxlbmd0aCkgPT0gXCIgXCIpIHJldHVybiBmYWxzZTtcbiAgICAgIH1yZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyA6OiAoc3RyaW5nLCA/YW55KSDihpIgYW55XG4gICAgLy8gTG9va3MgdXAgdGhlIGdpdmVuIGtleSBvciBrZXkgc2VxdWVuY2UgaW4gdGhpcyBrZXltYXAuIFJldHVybnNcbiAgICAvLyB0aGUgdmFsdWUgdGhlIGtleSBpcyBib3VuZCB0byAod2hpY2ggbWF5IGJlIHVuZGVmaW5lZCBpZiBpdCBpc1xuICAgIC8vIG5vdCBib3VuZCksIG9yIHRoZSBzdHJpbmcgYFwiLi4uXCJgIGlmIHRoZSBrZXkgaXMgYSBwcmVmaXggb2YgYVxuICAgIC8vIG11bHRpLWtleSBzZXF1ZW5jZSB0aGF0IGlzIGJvdW5kIGJ5IHRoaXMga2V5bWFwLlxuICB9LCB7XG4gICAga2V5OiBcImxvb2t1cFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsb29rdXAoa2V5LCBjb250ZXh0KSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNhbGwgPyB0aGlzLm9wdGlvbnMuY2FsbChrZXksIGNvbnRleHQpIDogdGhpcy5iaW5kaW5nc1trZXldO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBLZXltYXA7XG59KSgpO1xuXG5leHBvcnRzLktleW1hcCA9IEtleW1hcDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9nZXQgPSBmdW5jdGlvbiBnZXQoX3g0LCBfeDUsIF94NikgeyB2YXIgX2FnYWluID0gdHJ1ZTsgX2Z1bmN0aW9uOiB3aGlsZSAoX2FnYWluKSB7IHZhciBvYmplY3QgPSBfeDQsIHByb3BlcnR5ID0gX3g1LCByZWNlaXZlciA9IF94NjsgX2FnYWluID0gZmFsc2U7IGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyBfeDQgPSBwYXJlbnQ7IF94NSA9IHByb3BlcnR5OyBfeDYgPSByZWNlaXZlcjsgX2FnYWluID0gdHJ1ZTsgZGVzYyA9IHBhcmVudCA9IHVuZGVmaW5lZDsgY29udGludWUgX2Z1bmN0aW9uOyB9IH0gZWxzZSBpZiAoXCJ2YWx1ZVwiIGluIGRlc2MpIHsgcmV0dXJuIGRlc2MudmFsdWU7IH0gZWxzZSB7IHZhciBnZXR0ZXIgPSBkZXNjLmdldDsgaWYgKGdldHRlciA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTsgfSB9IH07XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5yZXF1aXJlKFwiLi9jc3NcIik7XG5cbnZhciBfbW9kZWwgPSByZXF1aXJlKFwiLi4vbW9kZWxcIik7XG5cbnZhciBfdHJhbnNmb3JtID0gcmVxdWlyZShcIi4uL3RyYW5zZm9ybVwiKTtcblxudmFyIF91dGlsU29ydGVkaW5zZXJ0ID0gcmVxdWlyZShcIi4uL3V0aWwvc29ydGVkaW5zZXJ0XCIpO1xuXG52YXIgX3V0aWxTb3J0ZWRpbnNlcnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdXRpbFNvcnRlZGluc2VydCk7XG5cbnZhciBfdXRpbE1hcCA9IHJlcXVpcmUoXCIuLi91dGlsL21hcFwiKTtcblxudmFyIF91dGlsRXZlbnQgPSByZXF1aXJlKFwiLi4vdXRpbC9ldmVudFwiKTtcblxudmFyIF9kb20gPSByZXF1aXJlKFwiLi4vZG9tXCIpO1xuXG52YXIgX3NlcmlhbGl6ZVRleHQgPSByZXF1aXJlKFwiLi4vc2VyaWFsaXplL3RleHRcIik7XG5cbnJlcXVpcmUoXCIuLi9wYXJzZS90ZXh0XCIpO1xuXG52YXIgX3BhcnNlID0gcmVxdWlyZShcIi4uL3BhcnNlXCIpO1xuXG52YXIgX3NlcmlhbGl6ZSA9IHJlcXVpcmUoXCIuLi9zZXJpYWxpemVcIik7XG5cbnZhciBfb3B0aW9ucyA9IHJlcXVpcmUoXCIuL29wdGlvbnNcIik7XG5cbnZhciBfc2VsZWN0aW9uMiA9IHJlcXVpcmUoXCIuL3NlbGVjdGlvblwiKTtcblxudmFyIF9kcmF3ID0gcmVxdWlyZShcIi4vZHJhd1wiKTtcblxudmFyIF9pbnB1dCA9IHJlcXVpcmUoXCIuL2lucHV0XCIpO1xuXG52YXIgX2hpc3RvcnkgPSByZXF1aXJlKFwiLi9oaXN0b3J5XCIpO1xuXG52YXIgX2NvbW1hbmRzID0gcmVxdWlyZShcIi4vY29tbWFuZHNcIik7XG5cbnZhciBfcmFuZ2UgPSByZXF1aXJlKFwiLi9yYW5nZVwiKTtcblxudmFyIF9rZXlzID0gcmVxdWlyZShcIi4va2V5c1wiKTtcblxuLy8gOzsgVGhpcyBpcyB0aGUgY2xhc3MgdXNlZCB0byByZXByZXNlbnQgaW5zdGFuY2VzIG9mIHRoZSBlZGl0b3IuIEFcbi8vIFByb3NlTWlycm9yIGVkaXRvciBob2xkcyBhIFtkb2N1bWVudF0oI05vZGUpIGFuZCBhXG4vLyBbc2VsZWN0aW9uXSgjU2VsZWN0aW9uKSwgYW5kIGRpc3BsYXlzIGFuIGVkaXRhYmxlIHN1cmZhY2Vcbi8vIHJlcHJlc2VudGluZyB0aGF0IGRvY3VtZW50IGluIHRoZSBicm93c2VyIGRvY3VtZW50LlxuLy9cbi8vIENvbnRhaW5zIGV2ZW50IG1ldGhvZHMgKGBvbmAsIGV0YykgZnJvbSB0aGUgW2V2ZW50XG4vLyBtaXhpbl0oI0V2ZW50TWl4aW4pLlxuXG52YXIgUHJvc2VNaXJyb3IgPSAoZnVuY3Rpb24gKCkge1xuICAvLyA6OiAoT2JqZWN0KVxuICAvLyBDb25zdHJ1Y3QgYSBuZXcgZWRpdG9yIGZyb20gYSBzZXQgb2YgW29wdGlvbnNdKCNlZGl0X29wdGlvbnMpXG4gIC8vIGFuZCwgaWYgaXQgaGFzIGEgW2BwbGFjZWBdKCNwbGFjZSkgb3B0aW9uLCBhZGQgaXQgdG8gdGhlXG4gIC8vIGRvY3VtZW50LlxuXG4gIGZ1bmN0aW9uIFByb3NlTWlycm9yKG9wdHMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUHJvc2VNaXJyb3IpO1xuXG4gICAgb3B0cyA9IHRoaXMub3B0aW9ucyA9ICgwLCBfb3B0aW9ucy5wYXJzZU9wdGlvbnMpKG9wdHMpO1xuICAgIC8vIDo6IFNjaGVtYVxuICAgIC8vIFRoZSBzY2hlbWEgZm9yIHRoaXMgZWRpdG9yJ3MgZG9jdW1lbnQuXG4gICAgdGhpcy5zY2hlbWEgPSBvcHRzLnNjaGVtYTtcbiAgICBpZiAob3B0cy5kb2MgPT0gbnVsbCkgb3B0cy5kb2MgPSB0aGlzLnNjaGVtYS5ub2RlKFwiZG9jXCIsIG51bGwsIFt0aGlzLnNjaGVtYS5ub2RlKFwicGFyYWdyYXBoXCIpXSk7XG4gICAgLy8gOjogRE9NTm9kZVxuICAgIC8vIFRoZSBlZGl0YWJsZSBET00gbm9kZSBjb250YWluaW5nIHRoZSBkb2N1bWVudC5cbiAgICB0aGlzLmNvbnRlbnQgPSAoMCwgX2RvbS5lbHQpKFwiZGl2XCIsIHsgXCJjbGFzc1wiOiBcIlByb3NlTWlycm9yLWNvbnRlbnRcIiB9KTtcbiAgICAvLyA6OiBET01Ob2RlXG4gICAgLy8gVGhlIG91dGVyIERPTSBlbGVtZW50IG9mIHRoZSBlZGl0b3IuXG4gICAgdGhpcy53cmFwcGVyID0gKDAsIF9kb20uZWx0KShcImRpdlwiLCB7IFwiY2xhc3NcIjogXCJQcm9zZU1pcnJvclwiIH0sIHRoaXMuY29udGVudCk7XG4gICAgdGhpcy53cmFwcGVyLlByb3NlTWlycm9yID0gdGhpcztcblxuICAgIGlmIChvcHRzLnBsYWNlICYmIG9wdHMucGxhY2UuYXBwZW5kQ2hpbGQpIG9wdHMucGxhY2UuYXBwZW5kQ2hpbGQodGhpcy53cmFwcGVyKTtlbHNlIGlmIChvcHRzLnBsYWNlKSBvcHRzLnBsYWNlKHRoaXMud3JhcHBlcik7XG5cbiAgICB0aGlzLnNldERvY0lubmVyKG9wdHMuZG9jRm9ybWF0ID8gKDAsIF9wYXJzZS5wYXJzZUZyb20pKHRoaXMuc2NoZW1hLCBvcHRzLmRvYywgb3B0cy5kb2NGb3JtYXQpIDogb3B0cy5kb2MpO1xuICAgICgwLCBfZHJhdy5kcmF3KSh0aGlzLCB0aGlzLmRvYyk7XG4gICAgdGhpcy5jb250ZW50LmNvbnRlbnRFZGl0YWJsZSA9IHRydWU7XG4gICAgaWYgKG9wdHMubGFiZWwpIHRoaXMuY29udGVudC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIG9wdHMubGFiZWwpO1xuXG4gICAgLy8gOjogT2JqZWN0XG4gICAgLy8gQSBuYW1lc3BhY2Ugd2hlcmUgbW9kdWxlcyBjYW4gc3RvcmUgcmVmZXJlbmNlcyB0byB0aGVtc2VsdmVzXG4gICAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZWRpdG9yIGluc3RhbmNlLlxuICAgIHRoaXMubW9kID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLm9wZXJhdGlvbiA9IG51bGw7XG4gICAgdGhpcy5kaXJ0eU5vZGVzID0gbmV3IF91dGlsTWFwLk1hcCgpOyAvLyBNYXBzIG5vZGUgb2JqZWN0IHRvIDEgKHJlLXNjYW4gY29udGVudCkgb3IgMiAocmVkcmF3IGVudGlyZWx5KVxuICAgIHRoaXMuZmx1c2hTY2hlZHVsZWQgPSBmYWxzZTtcblxuICAgIHRoaXMuc2VsID0gbmV3IF9zZWxlY3Rpb24yLlNlbGVjdGlvblN0YXRlKHRoaXMpO1xuICAgIHRoaXMuYWNjdXJhdGVTZWxlY3Rpb24gPSBmYWxzZTtcbiAgICB0aGlzLmlucHV0ID0gbmV3IF9pbnB1dC5JbnB1dCh0aGlzKTtcblxuICAgIC8vIDo6IE9iamVjdDxDb21tYW5kPlxuICAgIC8vIFRoZSBjb21tYW5kcyBhdmFpbGFibGUgaW4gdGhlIGVkaXRvci5cbiAgICB0aGlzLmNvbW1hbmRzID0gKDAsIF9jb21tYW5kcy5pbml0Q29tbWFuZHMpKHRoaXMpO1xuICAgIHRoaXMuY29tbWFuZEtleXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgKDAsIF9vcHRpb25zLmluaXRPcHRpb25zKSh0aGlzKTtcbiAgfVxuXG4gIC8vIDo6IChzdHJpbmcsIGFueSlcbiAgLy8gVXBkYXRlIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gW29wdGlvbl0oI2VkaXRfb3B0aW9ucykuXG5cbiAgX2NyZWF0ZUNsYXNzKFByb3NlTWlycm9yLCBbe1xuICAgIGtleTogXCJzZXRPcHRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0T3B0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICAoMCwgX29wdGlvbnMuc2V0T3B0aW9uKSh0aGlzLCBuYW1lLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gOjogKHN0cmluZykg4oaSIGFueVxuICAgIC8vIEdldCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZ2l2ZW4gW29wdGlvbl0oI2VkaXRfb3B0aW9ucykuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0T3B0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE9wdGlvbihuYW1lKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zW25hbWVdO1xuICAgIH1cblxuICAgIC8vIDo6IFNlbGVjdGlvblxuICAgIC8vIEdldCB0aGUgY3VycmVudCBzZWxlY3Rpb24uXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0VGV4dFNlbGVjdGlvblwiLFxuXG4gICAgLy8gOjogKFBvcywgP1BvcylcbiAgICAvLyBTZXQgdGhlIHNlbGVjdGlvbiB0byBhIFt0ZXh0IHNlbGVjdGlvbl0oI1RleHRTZWxlY3Rpb24pIGZyb21cbiAgICAvLyBgYW5jaG9yYCB0byBgaGVhZGAsIG9yLCBpZiBgaGVhZGAgaXMgbnVsbCwgYSBjdXJzb3Igc2VsZWN0aW9uIGF0XG4gICAgLy8gYGFuY2hvcmAuXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFRleHRTZWxlY3Rpb24oYW5jaG9yLCBoZWFkKSB7XG4gICAgICB0aGlzLnNldFNlbGVjdGlvbihuZXcgX3NlbGVjdGlvbjIuVGV4dFNlbGVjdGlvbihhbmNob3IsIGhlYWQpKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoUG9zKVxuICAgIC8vIFNldCB0aGUgc2VsZWN0aW9uIHRvIGEgbm9kZSBzZWxlY3Rpb24gb24gdGhlIG5vZGUgYWZ0ZXIgYHBvc2AuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0Tm9kZVNlbGVjdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXROb2RlU2VsZWN0aW9uKHBvcykge1xuICAgICAgdGhpcy5jaGVja1Bvcyhwb3MsIGZhbHNlKTtcbiAgICAgIHZhciBwYXJlbnQgPSB0aGlzLmRvYy5wYXRoKHBvcy5wYXRoKTtcbiAgICAgIGlmIChwb3Mub2Zmc2V0ID49IHBhcmVudC5zaXplKSB0aHJvdyBuZXcgRXJyb3IoXCJUcnlpbmcgdG8gc2V0IGEgbm9kZSBzZWxlY3Rpb24gYXQgdGhlIGVuZCBvZiBhIG5vZGVcIik7XG4gICAgICB2YXIgbm9kZSA9IHBhcmVudC5jaGlsZChwb3Mub2Zmc2V0KTtcbiAgICAgIGlmICghbm9kZS50eXBlLnNlbGVjdGFibGUpIHRocm93IG5ldyBFcnJvcihcIlRyeWluZyB0byBzZWxlY3QgYSBub24tc2VsZWN0YWJsZSBub2RlXCIpO1xuICAgICAgdGhpcy5pbnB1dC5tYXliZUFib3J0Q29tcG9zaXRpb24oKTtcbiAgICAgIHRoaXMuc2VsLnNldEFuZFNpZ25hbChuZXcgX3NlbGVjdGlvbjIuTm9kZVNlbGVjdGlvbihwb3MsIHBvcy5tb3ZlKDEpLCBub2RlKSk7XG4gICAgfVxuXG4gICAgLy8gOjogKFNlbGVjdGlvbilcbiAgICAvLyBTZXQgdGhlIHNlbGVjdGlvbiB0byB0aGUgZ2l2ZW4gc2VsZWN0aW9uIG9iamVjdC5cbiAgfSwge1xuICAgIGtleTogXCJzZXRTZWxlY3Rpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U2VsZWN0aW9uKHNlbGVjdGlvbikge1xuICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIF9zZWxlY3Rpb24yLlRleHRTZWxlY3Rpb24pIHtcbiAgICAgICAgdGhpcy5jaGVja1BvcyhzZWxlY3Rpb24uaGVhZCwgdHJ1ZSk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uLmVtcHR5KSB0aGlzLmNoZWNrUG9zKHNlbGVjdGlvbi5hbmNob3IsIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jaGVja1BvcyhzZWxlY3Rpb24udG8sIGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0U2VsZWN0aW9uRGlyZWN0KHNlbGVjdGlvbik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldFNlbGVjdGlvbkRpcmVjdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRTZWxlY3Rpb25EaXJlY3Qoc2VsZWN0aW9uKSB7XG4gICAgICB0aGlzLmVuc3VyZU9wZXJhdGlvbigpO1xuICAgICAgdGhpcy5pbnB1dC5tYXliZUFib3J0Q29tcG9zaXRpb24oKTtcbiAgICAgIGlmICghc2VsZWN0aW9uLmVxKHRoaXMuc2VsLnJhbmdlKSkgdGhpcy5zZWwuc2V0QW5kU2lnbmFsKHNlbGVjdGlvbik7XG4gICAgfVxuXG4gICAgLy8gOjogKGFueSwgP3N0cmluZylcbiAgICAvLyBSZXBsYWNlIHRoZSBlZGl0b3IncyBkb2N1bWVudC4gV2hlbiBgZm9ybWF0YCBpcyBnaXZlbiwgaXQgc2hvdWxkXG4gICAgLy8gYmUgYSBbcGFyc2FibGUgZm9ybWF0XSgjcGFyc2UpLCBhbmQgYHZhbHVlYCBzaG91bGQgc29tZXRoaW5nIGluXG4gICAgLy8gdGhhdCBmb3JtYXQuIElmIG5vdCwgYHZhbHVlYCBzaG91bGQgYmUgYSBgTm9kZWAuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0Q29udGVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRDb250ZW50KHZhbHVlLCBmb3JtYXQpIHtcbiAgICAgIGlmIChmb3JtYXQpIHZhbHVlID0gKDAsIF9wYXJzZS5wYXJzZUZyb20pKHRoaXMuc2NoZW1hLCB2YWx1ZSwgZm9ybWF0KTtcbiAgICAgIHRoaXMuc2V0RG9jKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoP3N0cmluZykg4oaSIGFueVxuICAgIC8vIEdldCB0aGUgZWRpdG9yJ3MgY29udGVudCBpbiBhIGdpdmVuIGZvcm1hdC4gV2hlbiBgZm9ybWF0YCBpcyBub3RcbiAgICAvLyBnaXZlbiwgYSBgTm9kZWAgaXMgcmV0dXJuZWQuIElmIGl0IGlzIGdpdmVuLCBpdCBzaG91bGQgYmUgYW5cbiAgICAvLyBleGlzdGluZyBbc2VyaWFsaXphdGlvbiBmb3JtYXRdKCNzZXJpYWxpemUpLlxuICB9LCB7XG4gICAga2V5OiBcImdldENvbnRlbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q29udGVudChmb3JtYXQpIHtcbiAgICAgIHJldHVybiBmb3JtYXQgPyAoMCwgX3NlcmlhbGl6ZS5zZXJpYWxpemVUbykodGhpcy5kb2MsIGZvcm1hdCkgOiB0aGlzLmRvYztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0RG9jSW5uZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0RG9jSW5uZXIoZG9jKSB7XG4gICAgICBpZiAoZG9jLnR5cGUgIT0gdGhpcy5zY2hlbWEubm9kZXMuZG9jKSB0aHJvdyBuZXcgRXJyb3IoXCJUcnlpbmcgdG8gc2V0IGEgZG9jdW1lbnQgd2l0aCBhIGRpZmZlcmVudCBzY2hlbWFcIik7XG4gICAgICAvLyA6OiBOb2RlIFRoZSBjdXJyZW50IGRvY3VtZW50LlxuICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICB0aGlzLnJhbmdlcyA9IG5ldyBfcmFuZ2UuUmFuZ2VTdG9yZSh0aGlzKTtcbiAgICAgIHRoaXMuaGlzdG9yeSA9IG5ldyBfaGlzdG9yeS5IaXN0b3J5KHRoaXMpO1xuICAgIH1cblxuICAgIC8vIDo6IChOb2RlLCA/U2VsZWN0aW9uKVxuICAgIC8vIFNldCB0aGUgZWRpdG9yJ3MgY29udGVudCwgYW5kIG9wdGlvbmFsbHkgaW5jbHVkZSBhIG5ldyBzZWxlY3Rpb24uXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0RG9jXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldERvYyhkb2MsIHNlbCkge1xuICAgICAgaWYgKCFzZWwpIHNlbCA9ICgwLCBfc2VsZWN0aW9uMi5maW5kU2VsZWN0aW9uQXRTdGFydCkoZG9jKTtcbiAgICAgIC8vIDo6IChkb2M6IE5vZGUsIHNlbGVjdGlvbjogU2VsZWN0aW9uKSAjcGF0aD1Qcm9zZU1pcnJvciNldmVudHMjYmVmb3JlU2V0RG9jXG4gICAgICAvLyBGaXJlZCB3aGVuIFtgc2V0RG9jYF0oI1Byb3NlTWlycm9yLnNldERvYykgaXMgY2FsbGVkLCBiZWZvcmVcbiAgICAgIC8vIHRoZSBkb2N1bWVudCBpcyBhY3R1YWxseSB1cGRhdGVkLlxuICAgICAgdGhpcy5zaWduYWwoXCJiZWZvcmVTZXREb2NcIiwgZG9jLCBzZWwpO1xuICAgICAgdGhpcy5lbnN1cmVPcGVyYXRpb24oKTtcbiAgICAgIHRoaXMuc2V0RG9jSW5uZXIoZG9jKTtcbiAgICAgIHRoaXMuc2VsLnNldChzZWwsIHRydWUpO1xuICAgICAgLy8gOjogKGRvYzogTm9kZSwgc2VsZWN0aW9uOiBTZWxlY3Rpb24pICNwYXRoPVByb3NlTWlycm9yI2V2ZW50cyNzZXREb2NcbiAgICAgIC8vIEZpcmVkIHdoZW4gW2BzZXREb2NgXSgjUHJvc2VNaXJyb3Iuc2V0RG9jKSBpcyBjYWxsZWQsIGFmdGVyXG4gICAgICAvLyB0aGUgZG9jdW1lbnQgaXMgdXBkYXRlZC5cbiAgICAgIHRoaXMuc2lnbmFsKFwic2V0RG9jXCIsIGRvYywgc2VsKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidXBkYXRlRG9jXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZURvYyhkb2MsIG1hcHBpbmcsIHNlbGVjdGlvbikge1xuICAgICAgdGhpcy5lbnN1cmVPcGVyYXRpb24oKTtcbiAgICAgIHRoaXMuaW5wdXQubWF5YmVBYm9ydENvbXBvc2l0aW9uKCk7XG4gICAgICB0aGlzLnJhbmdlcy50cmFuc2Zvcm0obWFwcGluZyk7XG4gICAgICB0aGlzLmRvYyA9IGRvYztcbiAgICAgIHRoaXMuc2VsLnNldEFuZFNpZ25hbChzZWxlY3Rpb24gfHwgdGhpcy5zZWwucmFuZ2UubWFwKGRvYywgbWFwcGluZykpO1xuICAgICAgLy8gOjogKCkgI3BhdGg9UHJvc2VNaXJyb3IjZXZlbnRzI2NoYW5nZVxuICAgICAgLy8gRmlyZWQgd2hlbiB0aGUgZG9jdW1lbnQgaGFzIGNoYW5nZWQuIFNlZVxuICAgICAgLy8gW2BzZXREb2NgXSgjUHJvc2VNaXJyb3IuZXZlbnRfc2V0RG9jKSBhbmRcbiAgICAgIC8vIFtgdHJhbnNmb3JtYF0oI1Byb3NlTWlycm9yLmV2ZW50X3RyYW5zZm9ybSkgZm9yIG1vcmUgc3BlY2lmaWNcbiAgICAgIC8vIGNoYW5nZS1yZWxhdGVkIGV2ZW50cy5cbiAgICAgIHRoaXMuc2lnbmFsKFwiY2hhbmdlXCIpO1xuICAgIH1cblxuICAgIC8vIDo6IEVkaXRvclRyYW5zZm9ybVxuICAgIC8vIENyZWF0ZSBhbiBlZGl0b3ItIGFuZCBzZWxlY3Rpb24tYXdhcmUgYFRyYW5zZm9ybWAgZm9yIHRoaXMgZWRpdG9yLlxuICB9LCB7XG4gICAga2V5OiBcImFwcGx5XCIsXG5cbiAgICAvLyA6OiAoVHJhbnNmb3JtLCA/T2JqZWN0KSDihpIgP1RyYW5zZm9ybVxuICAgIC8vIEFwcGx5IGEgdHJhbnNmb3JtYXRpb24gKHdoaWNoIHlvdSBtaWdodCB3YW50IHRvIGNyZWF0ZSB3aXRoIHRoZVxuICAgIC8vIFtgdHJgIGdldHRlcl0oI1Byb3NlTWlycm9yLnRyKSkgdG8gdGhlIGRvY3VtZW50IGluIHRoZSBlZGl0b3IuXG4gICAgLy8gVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBzdXBwb3J0ZWQ6XG4gICAgLy9cbiAgICAvLyAqKmBzZWxlY3Rpb25gKipgOiA/U2VsZWN0aW9uYFxuICAgIC8vICAgOiBBIG5ldyBzZWxlY3Rpb24gdG8gc2V0IGFmdGVyIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBhcHBsaWVkLlxuICAgIC8vXG4gICAgLy8gKipgc2Nyb2xsSW50b1ZpZXdgKio6ID9ib29sXG4gICAgLy8gICA6IFdoZW4gdHJ1ZSwgc2Nyb2xsIHRoZSBzZWxlY3Rpb24gaW50byB2aWV3IG9uIHRoZSBuZXh0XG4gICAgLy8gICAgIFtyZWRyYXddKCNQcm9zZU1pcnJvci5mbHVzaCkuXG4gICAgLy9cbiAgICAvLyBSZXR1cm5zIHRoZSB0cmFuc2Zvcm0sIG9yIGBmYWxzZWAgaWYgdGhlcmUgd2VyZSBubyBzdGVwcyBpbiBpdC5cbiAgICB2YWx1ZTogZnVuY3Rpb24gYXBwbHkodHJhbnNmb3JtKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IG51bGxPcHRpb25zIDogYXJndW1lbnRzWzFdO1xuXG4gICAgICBpZiAodHJhbnNmb3JtLmRvYyA9PSB0aGlzLmRvYykgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHRyYW5zZm9ybS5kb2NzWzBdICE9IHRoaXMuZG9jICYmICgwLCBfbW9kZWwuZmluZERpZmZTdGFydCkodHJhbnNmb3JtLmRvY3NbMF0sIHRoaXMuZG9jKSkgdGhyb3cgbmV3IEVycm9yKFwiQXBwbHlpbmcgYSB0cmFuc2Zvcm0gdGhhdCBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBjdXJyZW50IGRvY3VtZW50XCIpO1xuXG4gICAgICB0aGlzLnVwZGF0ZURvYyh0cmFuc2Zvcm0uZG9jLCB0cmFuc2Zvcm0sIG9wdGlvbnMuc2VsZWN0aW9uKTtcbiAgICAgIC8vIDo6IChUcmFuc2Zvcm0sIE9iamVjdCkgI3BhdGg9UHJvc2VNaXJyb3IjZXZlbnRzI3RyYW5zZm9ybVxuICAgICAgLy8gU2lnbmFscyB0aGF0IGEgKG5vbi1lbXB0eSkgdHJhbnNmb3JtYXRpb24gaGFzIGJlZW4gYXBsaWVkIHRvXG4gICAgICAvLyB0aGUgZWRpdG9yLiBQYXNzZXMgdGhlIGBUcmFuc2Zvcm1gIGFuZCB0aGUgb3B0aW9ucyBnaXZlbiB0b1xuICAgICAgLy8gW2BhcHBseWBdKCNQcm9zZU1pcnJvci5hcHBseSkgYXMgYXJndW1lbnRzIHRvIHRoZSBoYW5kbGVyLlxuICAgICAgdGhpcy5zaWduYWwoXCJ0cmFuc2Zvcm1cIiwgdHJhbnNmb3JtLCBvcHRpb25zKTtcbiAgICAgIGlmIChvcHRpb25zLnNjcm9sbEludG9WaWV3KSB0aGlzLnNjcm9sbEludG9WaWV3KCk7XG4gICAgICByZXR1cm4gdHJhbnNmb3JtO1xuICAgIH1cblxuICAgIC8vIDo6IChQb3MsID9ib29sKVxuICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBpcyB2YWxpZCBpbiB0aGUgY3VycmVudCBkb2N1bWVudCxcbiAgICAvLyBhbmQgdGhyb3cgYW4gZXJyb3Igb3RoZXJ3aXNlLiBXaGVuIGB0ZXh0YmxvY2tgIGlzIHRydWUsIHRoZSBwb3NpdGlvblxuICAgIC8vIG11c3QgYWxzbyBmYWxsIHdpdGhpbiBhIHRleHRibG9jayBub2RlLlxuICB9LCB7XG4gICAga2V5OiBcImNoZWNrUG9zXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNoZWNrUG9zKHBvcywgdGV4dGJsb2NrKSB7XG4gICAgICBpZiAoIXRoaXMuZG9jLmlzVmFsaWRQb3MocG9zLCB0ZXh0YmxvY2spKSB0aHJvdyBuZXcgRXJyb3IoXCJQb3NpdGlvbiBcIiArIHBvcyArIFwiIGlzIG5vdCB2YWxpZCBpbiBjdXJyZW50IGRvY3VtZW50XCIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlbnN1cmVPcGVyYXRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZW5zdXJlT3BlcmF0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMub3BlcmF0aW9uIHx8IHRoaXMuc3RhcnRPcGVyYXRpb24oKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic3RhcnRPcGVyYXRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RhcnRPcGVyYXRpb24oKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB0aGlzLnNlbC5iZWZvcmVTdGFydE9wKCk7XG4gICAgICB0aGlzLm9wZXJhdGlvbiA9IG5ldyBPcGVyYXRpb24odGhpcyk7XG4gICAgICBpZiAoIXRoaXMuZmx1c2hTY2hlZHVsZWQpIHtcbiAgICAgICAgKDAsIF9kb20ucmVxdWVzdEFuaW1hdGlvbkZyYW1lKShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXMuZmx1c2hTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgICAgICBfdGhpcy5mbHVzaCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5mbHVzaFNjaGVkdWxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5vcGVyYXRpb247XG4gICAgfVxuXG4gICAgLy8gOjogKClcbiAgICAvLyBGbHVzaCBhbnkgcGVuZGluZyBjaGFuZ2VzIHRvIHRoZSBET00uIFdoZW4gdGhlIGRvY3VtZW50LFxuICAgIC8vIHNlbGVjdGlvbiwgb3IgbWFya2VkIHJhbmdlcyBpbiBhbiBlZGl0b3IgY2hhbmdlLCB0aGUgRE9NIGlzbid0XG4gICAgLy8gdXBkYXRlZCBpbW1lZGlhdGVseSwgYnV0IHJhdGhlciBzY2hlZHVsZWQgdG8gYmUgdXBkYXRlZCB0aGUgbmV4dFxuICAgIC8vIHRpbWUgdGhlIGJyb3dzZXIgcmVkcmF3cyB0aGUgc2NyZWVuLiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0b1xuICAgIC8vIGZvcmNlIHRoaXMgdG8gaGFwcGVuIGltbWVkaWF0ZWx5LiBJdCBjYW4gYmUgdXNlZnVsIHdoZW4geW91LCBmb3JcbiAgICAvLyBleGFtcGxlLCB3YW50IHRvIG1lYXN1cmUgd2hlcmUgb24gdGhlIHNjcmVlbiBhIHBhcnQgb2YgdGhlXG4gICAgLy8gZG9jdW1lbnQgZW5kcyB1cCwgaW1tZWRpYXRlbHkgYWZ0ZXIgY2hhbmdpbmcgdGhlIGRvY3VtZW50LlxuICB9LCB7XG4gICAga2V5OiBcImZsdXNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgICAgaWYgKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKHRoaXMud3JhcHBlcikgfHwgIXRoaXMub3BlcmF0aW9uKSByZXR1cm47XG4gICAgICAvLyA6OiAoKSAjcGF0aD1Qcm9zZU1pcnJvciNldmVudHMjZmx1c2hpbmdcbiAgICAgIC8vIEZpcmVkIHdoZW4gdGhlIGVkaXRvciBpcyBhYm91dCB0byBbZmx1c2hdKCNQcm9zZU1pcnJvci5mbHVzaClcbiAgICAgIC8vIGFuIHVwZGF0ZSB0byB0aGUgRE9NLlxuICAgICAgdGhpcy5zaWduYWwoXCJmbHVzaGluZ1wiKTtcbiAgICAgIHZhciBvcCA9IHRoaXMub3BlcmF0aW9uO1xuICAgICAgaWYgKCFvcCkgcmV0dXJuO1xuICAgICAgdGhpcy5vcGVyYXRpb24gPSBudWxsO1xuICAgICAgdGhpcy5hY2N1cmF0ZVNlbGVjdGlvbiA9IHRydWU7XG5cbiAgICAgIHZhciBkb2NDaGFuZ2VkID0gb3AuZG9jICE9IHRoaXMuZG9jIHx8IHRoaXMuZGlydHlOb2Rlcy5zaXplLFxuICAgICAgICAgIHJlZHJhd24gPSBmYWxzZTtcbiAgICAgIGlmICghdGhpcy5pbnB1dC5jb21wb3NpbmcgJiYgKGRvY0NoYW5nZWQgfHwgb3AuY29tcG9zaW5nQXRTdGFydCkpIHtcbiAgICAgICAgKDAsIF9kcmF3LnJlZHJhdykodGhpcywgdGhpcy5kaXJ0eU5vZGVzLCB0aGlzLmRvYywgb3AuZG9jKTtcbiAgICAgICAgdGhpcy5kaXJ0eU5vZGVzLmNsZWFyKCk7XG4gICAgICAgIHJlZHJhd24gPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoKHJlZHJhd24gfHwgIW9wLnNlbC5lcSh0aGlzLnNlbC5yYW5nZSkpICYmICF0aGlzLmlucHV0LmNvbXBvc2luZykgdGhpcy5zZWwudG9ET00ob3AuZm9jdXMpO1xuXG4gICAgICBpZiAob3Auc2Nyb2xsSW50b1ZpZXcgIT09IGZhbHNlKSAoMCwgX3NlbGVjdGlvbjIuc2Nyb2xsSW50b1ZpZXcpKHRoaXMsIG9wLnNjcm9sbEludG9WaWV3KTtcbiAgICAgIC8vIDo6ICgpICNwYXRoPVByb3NlTWlycm9yI2V2ZW50cyNkcmF3XG4gICAgICAvLyBGaXJlZCB3aGVuIHRoZSBlZGl0b3IgcmVkcmV3IGl0cyBkb2N1bWVudCBpbiB0aGUgRE9NLlxuICAgICAgaWYgKGRvY0NoYW5nZWQpIHRoaXMuc2lnbmFsKFwiZHJhd1wiKTtcbiAgICAgIC8vIDo6ICgpICNwYXRoPVByb3NlTWlycm9yI2V2ZW50cyNmbHVzaFxuICAgICAgLy8gRmlyZWQgd2hlbiB0aGUgZWRpdG9yIGhhcyBmaW5pc2hlZFxuICAgICAgLy8gW2ZsdXNoaW5nXSgjUHJvc2VNaXJyb3IuZmx1c2gpIGFuIHVwZGF0ZSB0byB0aGUgRE9NLiBJZiB5b3VcbiAgICAgIC8vIG5lZWQgdG8gcmVzcG9uZCB0byB0aGlzIHdpdGggYSBET00gdXBkYXRlIG9mIHlvdXIgb3duLCB1c2UgdGhpc1xuICAgICAgLy8gZXZlbnQgdG8gcmVhZCBsYXlvdXQgZnJvbSB0aGUgRE9NLCBhbmRcbiAgICAgIC8vIFtgZmx1c2hlZGBdKCNQcm9zZU1pcnJvci5ldmVudF9mbHVzaGVkKSB0byB1cGRhdGUgdGhlIERPTS5cbiAgICAgIHRoaXMuc2lnbmFsKFwiZmx1c2hcIik7XG4gICAgICAvLyA6OiAoKSAjcGF0aD1Qcm9zZU1pcnJvciNldmVudHMjZmx1c2hlZFxuICAgICAgLy8gRmlyZWQgd2hlbiB0aGUgZWRpdG9yIGhhcyBmaW5pc2hlZFxuICAgICAgLy8gW2ZsdXNoaW5nXSgjUHJvc2VNaXJyb3IuZmx1c2gpIGFuIHVwZGF0ZSB0byB0aGUgRE9NLCBhZnRlclxuICAgICAgLy8gW2BmbHVzaGBdKCNQcm9zZU1pcnJvci5ldmVudF9mbHVzaCkgaGFzIGZpcmVkLlxuICAgICAgdGhpcy5zaWduYWwoXCJmbHVzaGVkXCIpO1xuICAgICAgdGhpcy5hY2N1cmF0ZVNlbGVjdGlvbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIDo6IChLZXltYXAsID9udW1iZXIpXG4gICAgLy8gQWRkIGEgW2tleW1hcF0oI0tleW1hcCkgdG8gdGhlIGVkaXRvci4gS2V5bWFwcyBhZGRlZCBpbiB0aGlzIHdheVxuICAgIC8vIGFyZSBxdWVyaWVkIGJlZm9yZSB0aGUgW2Jhc2Uga2V5bWFwXSgja2V5bWFwKS5cbiAgICAvLyBUaGUgYHJhbmtgIHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byBjb250cm9sIHdoZW4gdGhleSBhcmUgcXVlcmllZFxuICAgIC8vIHJlbGF0aXZlIHRvIG90aGVyIG1hcHMgYWRkZWQgbGlrZSB0aGlzLiBNYXBzIHdpdGggYSBsb3dlciByYW5rXG4gICAgLy8gZ2V0IHF1ZXJpZWQgZmlyc3QuXG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkS2V5bWFwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZEtleW1hcChtYXApIHtcbiAgICAgIHZhciByYW5rID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8gNTAgOiBhcmd1bWVudHNbMV07XG5cbiAgICAgICgwLCBfdXRpbFNvcnRlZGluc2VydDJbXCJkZWZhdWx0XCJdKSh0aGlzLmlucHV0LmtleW1hcHMsIHsgbWFwOiBtYXAsIHJhbms6IHJhbmsgfSwgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGEucmFuayAtIGIucmFuaztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIDo6ICh1bmlvbjxzdHJpbmcsIEtleW1hcD4pXG4gICAgLy8gUmVtb3ZlIHRoZSBnaXZlbiBrZXltYXAsIG9yIHRoZSBrZXltYXAgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgZnJvbVxuICAgIC8vIHRoZSBlZGl0b3IuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlS2V5bWFwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZUtleW1hcChtYXApIHtcbiAgICAgIHZhciBtYXBzID0gdGhpcy5pbnB1dC5rZXltYXBzO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXBzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmIChtYXBzW2ldLm1hcCA9PSBtYXAgfHwgbWFwc1tpXS5tYXAub3B0aW9ucy5uYW1lID09IG1hcCkge1xuICAgICAgICAgIG1hcHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm1hcmtSYW5nZVwiLFxuXG4gICAgLy8gOjogKFBvcywgUG9zLCA/T2JqZWN0KSDihpIgTWFya2VkUmFuZ2VcbiAgICAvLyBDcmVhdGUgYSBtYXJrZWQgcmFuZ2UgYmV0d2VlbiB0aGUgZ2l2ZW4gcG9zaXRpb25zLiBNYXJrZWQgcmFuZ2VzXG4gICAgLy8g4oCcdHJhY2vigJ0gdGhlIHBhcnQgb2YgdGhlIGRvY3VtZW50IHRoZXkgcG9pbnQgdG/igJRhcyB0aGUgZG9jdW1lbnRcbiAgICAvLyBjaGFuZ2VzLCB0aGV5IGFyZSB1cGRhdGVkIHRvIG1vdmUsIGdyb3csIGFuZCBzaHJpbmsgYWxvbmcgd2l0aFxuICAgIC8vIHRoZWlyIGNvbnRlbnQuXG4gICAgLy9cbiAgICAvLyBgb3B0aW9uc2AgbWF5IGJlIGFuIG9iamVjdCBjb250YWluaW5nIHRoZXNlIHByb3BlcnRpZXM6XG4gICAgLy9cbiAgICAvLyAqKmBpbmNsdXNpdmVMZWZ0YCoqYDogYm9vbCA9IGZhbHNlYFxuICAgIC8vICAgOiBXaGV0aGVyIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHJhbmdlIGlzIGluY2x1c2l2ZS4gV2hlbiBpdCBpcyxcbiAgICAvLyAgICAgY29udGVudCBpbnNlcnRlZCBhdCB0aGF0IHBvaW50IHdpbGwgYmVjb21lIHBhcnQgb2YgdGhlIHJhbmdlLlxuICAgIC8vICAgICBXaGVuIG5vdCwgaXQgd2lsbCBiZSBvdXRzaWRlIG9mIHRoZSByYW5nZS5cbiAgICAvL1xuICAgIC8vICoqYGluY2x1c2l2ZVJpZ2h0YCoqYDogYm9vbCA9IGZhbHNlYFxuICAgIC8vICAgOiBXaGV0aGVyIHRoZSByaWdodCBzaWRlIG9mIHRoZSByYW5nZSBpcyBpbmNsdXNpdmUuXG4gICAgLy9cbiAgICAvLyAqKmByZW1vdmVXaGVuRW1wdHlgKipgOiBib29sID0gdHJ1ZWBcbiAgICAvLyAgIDogV2hldGhlciB0aGUgcmFuZ2Ugc2hvdWxkIGJlIGZvcmdvdHRlbiB3aGVuIGl0IGJlY29tZXMgZW1wdHlcbiAgICAvLyAgICAgKGJlY2F1c2UgYWxsIG9mIGl0cyBjb250ZW50IHdhcyBkZWxldGVkKS5cbiAgICAvL1xuICAgIC8vICoqYGNsYXNzTmFtZWAqKjogc3RyaW5nXG4gICAgLy8gICA6IEEgQ1NTIGNsYXNzIHRvIGFkZCB0byB0aGUgaW5saW5lIGNvbnRlbnQgdGhhdCBpcyBwYXJ0IG9mIHRoaXNcbiAgICAvLyAgICAgcmFuZ2UuXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hcmtSYW5nZShmcm9tLCB0bywgb3B0aW9ucykge1xuICAgICAgdGhpcy5jaGVja1Bvcyhmcm9tKTtcbiAgICAgIHRoaXMuY2hlY2tQb3ModG8pO1xuICAgICAgdmFyIHJhbmdlID0gbmV3IF9yYW5nZS5NYXJrZWRSYW5nZShmcm9tLCB0bywgb3B0aW9ucyk7XG4gICAgICB0aGlzLnJhbmdlcy5hZGRSYW5nZShyYW5nZSk7XG4gICAgICByZXR1cm4gcmFuZ2U7XG4gICAgfVxuXG4gICAgLy8gOjogKE1hcmtlZFJhbmdlKVxuICAgIC8vIFJlbW92ZSB0aGUgZ2l2ZW4gcmFuZ2UgZnJvbSB0aGUgZWRpdG9yLlxuICB9LCB7XG4gICAga2V5OiBcInJlbW92ZVJhbmdlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZVJhbmdlKHJhbmdlKSB7XG4gICAgICB0aGlzLnJhbmdlcy5yZW1vdmVSYW5nZShyYW5nZSk7XG4gICAgfVxuXG4gICAgLy8gOjogKE1hcmtUeXBlLCA/Ym9vbCwgP09iamVjdClcbiAgICAvLyBTZXQgKHdoZW4gYHRvYCBpcyB0cnVlKSwgdW5zZXQgKGB0b2AgaXMgZmFsc2UpLCBvciB0b2dnbGUgKGB0b2BcbiAgICAvLyBpcyBudWxsKSB0aGUgZ2l2ZW4gbWFyayB0eXBlIG9uIHRoZSBzZWxlY3Rpb24uIFdoZW4gdGhlcmUgaXMgYVxuICAgIC8vIG5vbi1lbXB0eSBzZWxlY3Rpb24sIHRoZSBtYXJrcyBvZiB0aGUgc2VsZWN0aW9uIGFyZSB1cGRhdGVkLiBXaGVuXG4gICAgLy8gdGhlIHNlbGVjdGlvbiBpcyBlbXB0eSwgdGhlIHNldCBvZiBbYWN0aXZlXG4gICAgLy8gbWFya3NdKCNQcm9zZU1pcnJvci5hY3RpdmVNYXJrcykgaXMgdXBkYXRlZC5cbiAgfSwge1xuICAgIGtleTogXCJzZXRNYXJrXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldE1hcmsodHlwZSwgdG8sIGF0dHJzKSB7XG4gICAgICB2YXIgc2VsID0gdGhpcy5zZWxlY3Rpb247XG4gICAgICBpZiAoc2VsLmVtcHR5KSB7XG4gICAgICAgIHZhciBtYXJrcyA9IHRoaXMuYWN0aXZlTWFya3MoKTtcbiAgICAgICAgaWYgKHRvID09IG51bGwpIHRvID0gIXR5cGUuaXNJblNldChtYXJrcyk7XG4gICAgICAgIGlmICh0byAmJiAhdGhpcy5kb2MucGF0aChzZWwuaGVhZC5wYXRoKS50eXBlLmNhbkNvbnRhaW5NYXJrKHR5cGUpKSByZXR1cm47XG4gICAgICAgIHRoaXMuaW5wdXQuc3RvcmVkTWFya3MgPSB0byA/IHR5cGUuY3JlYXRlKGF0dHJzKS5hZGRUb1NldChtYXJrcykgOiB0eXBlLnJlbW92ZUZyb21TZXQobWFya3MpO1xuICAgICAgICAvLyA6OiAoKSAjcGF0aD1Qcm9zZU1pcnJvciNldmVudHMjYWN0aXZlTWFya0NoYW5nZVxuICAgICAgICAvLyBGaXJlZCB3aGVuIHRoZSBzZXQgb2YgW2FjdGl2ZSBtYXJrc10oI1Byb3NlTWlycm9yLmFjdGl2ZU1hcmtzKSBjaGFuZ2VzLlxuICAgICAgICB0aGlzLnNpZ25hbChcImFjdGl2ZU1hcmtDaGFuZ2VcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodG8gIT0gbnVsbCA/IHRvIDogIXRoaXMuZG9jLnJhbmdlSGFzTWFyayhzZWwuZnJvbSwgc2VsLnRvLCB0eXBlKSkgdGhpcy5hcHBseSh0aGlzLnRyLmFkZE1hcmsoc2VsLmZyb20sIHNlbC50bywgdHlwZS5jcmVhdGUoYXR0cnMpKSk7ZWxzZSB0aGlzLmFwcGx5KHRoaXMudHIucmVtb3ZlTWFyayhzZWwuZnJvbSwgc2VsLnRvLCB0eXBlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gOjogKCkg4oaSIFtNYXJrXVxuICAgIC8vIEdldCB0aGUgbWFya3MgYXQgdGhlIGN1cnNvci4gQnkgZGVmYXVsdCwgdGhpcyB5aWVsZHMgdGhlIG1hcmtzXG4gICAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZW50IGF0IHRoZSBjdXJzb3IsIGFzIHBlciBgTm9kZS5tYXJrc0F0YC5cbiAgICAvLyBCdXQgYHNldE1hcmtgIG1heSBoYXZlIGJlZW4gdXNlZCB0byBjaGFuZ2UgdGhlIHNldCBvZiBhY3RpdmVcbiAgICAvLyBtYXJrcywgaW4gd2hpY2ggY2FzZSB0aGF0IHNldCBpcyByZXR1cm5lZC5cbiAgfSwge1xuICAgIGtleTogXCJhY3RpdmVNYXJrc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhY3RpdmVNYXJrcygpIHtcbiAgICAgIHZhciBoZWFkO1xuICAgICAgcmV0dXJuIHRoaXMuaW5wdXQuc3RvcmVkTWFya3MgfHwgKChoZWFkID0gdGhpcy5zZWxlY3Rpb24uaGVhZCkgPyB0aGlzLmRvYy5tYXJrc0F0KGhlYWQpIDogW10pO1xuICAgIH1cblxuICAgIC8vIDo6ICgpXG4gICAgLy8gR2l2ZSB0aGUgZWRpdG9yIGZvY3VzLlxuICB9LCB7XG4gICAga2V5OiBcImZvY3VzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZvY3VzKCkge1xuICAgICAgaWYgKHRoaXMub3BlcmF0aW9uKSB0aGlzLm9wZXJhdGlvbi5mb2N1cyA9IHRydWU7ZWxzZSB0aGlzLnNlbC50b0RPTSh0cnVlKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoKSDihpIgYm9vbFxuICAgIC8vIFF1ZXJ5IHdoZXRoZXIgdGhlIGVkaXRvciBoYXMgZm9jdXMuXG4gIH0sIHtcbiAgICBrZXk6IFwiaGFzRm9jdXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzRm9jdXMoKSB7XG4gICAgICBpZiAodGhpcy5zZWwucmFuZ2UgaW5zdGFuY2VvZiBfc2VsZWN0aW9uMi5Ob2RlU2VsZWN0aW9uKSByZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PSB0aGlzLmNvbnRlbnQ7ZWxzZSByZXR1cm4gKDAsIF9zZWxlY3Rpb24yLmhhc0ZvY3VzKSh0aGlzKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoKSDihpIgTm9kZVxuICAgIC8vIEdldCB0aGUgcGFydCBvZiB0aGUgZG9jdW1lbnQgdGhhdCBmYWxscyB3aXRoaW4gdGhlIHNlbGVjdGlvbi5cbiAgfSwge1xuICAgIGtleTogXCJwb3NBdENvb3Jkc1wiLFxuXG4gICAgLy8gOjogKHt0b3A6IG51bWJlciwgbGVmdDogbnVtYmVyfSkg4oaSID9Qb3NcbiAgICAvLyBJZiB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMgKHdoaWNoIHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgdG9wXG4gICAgLy8gbGVmdCBjb3JuZXIgb2YgdGhlIHdpbmRvd+KAlG5vdCB0aGUgcGFnZSkgZmFsbCB3aXRoaW4gdGhlIGVkaXRhYmxlXG4gICAgLy8gY29udGVudCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGRvY3VtZW50IHBvc2l0aW9uIHRoYXRcbiAgICAvLyBjb3JyZXNwb25kcyB0byB0aG9zZSBjb29yZGluYXRlcy5cbiAgICB2YWx1ZTogZnVuY3Rpb24gcG9zQXRDb29yZHMoY29vcmRzKSB7XG4gICAgICByZXR1cm4gKDAsIF9zZWxlY3Rpb24yLnBvc0F0Q29vcmRzKSh0aGlzLCBjb29yZHMpO1xuICAgIH1cblxuICAgIC8vIDo6IChQb3MpIOKGkiB7dG9wOiBudW1iZXIsIGxlZnQ6IG51bWJlciwgYm90dG9tOiBudW1iZXJ9XG4gICAgLy8gRmluZCB0aGUgc2NyZWVuIGNvb3JkaW5hdGVzIChyZWxhdGl2ZSB0byB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlXG4gICAgLy8gd2luZG93KSBvZiB0aGUgZ2l2ZW4gZG9jdW1lbnQgcG9zaXRpb24uXG4gIH0sIHtcbiAgICBrZXk6IFwiY29vcmRzQXRQb3NcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29vcmRzQXRQb3MocG9zKSB7XG4gICAgICB0aGlzLmNoZWNrUG9zKHBvcyk7XG4gICAgICByZXR1cm4gKDAsIF9zZWxlY3Rpb24yLmNvb3Jkc0F0UG9zKSh0aGlzLCBwb3MpO1xuICAgIH1cblxuICAgIC8vIDo6ICg/UG9zKVxuICAgIC8vIFNjcm9sbCB0aGUgZ2l2ZW4gcG9zaXRpb24sIG9yIHRoZSBjdXJzb3IgcG9zaXRpb24gaWYgYHBvc2AgaXNuJ3RcbiAgICAvLyBnaXZlbiwgaW50byB2aWV3LlxuICB9LCB7XG4gICAga2V5OiBcInNjcm9sbEludG9WaWV3XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNjcm9sbEludG9WaWV3KCkge1xuICAgICAgdmFyIHBvcyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IG51bGwgOiBhcmd1bWVudHNbMF07XG5cbiAgICAgIGlmIChwb3MpIHRoaXMuY2hlY2tQb3MocG9zKTtcbiAgICAgIHRoaXMuZW5zdXJlT3BlcmF0aW9uKCk7XG4gICAgICB0aGlzLm9wZXJhdGlvbi5zY3JvbGxJbnRvVmlldyA9IHBvcztcbiAgICB9XG5cbiAgICAvLyA6OiAoc3RyaW5nLCA/W2FueV0pIOKGkiBib29sXG4gICAgLy8gRXhlY3V0ZSB0aGUgbmFtZWQgW2NvbW1hbmRdKCNDb21tYW5kKS4gSWYgdGhlIGNvbW1hbmQgdGFrZXNcbiAgICAvLyBwYXJhbWV0ZXJzIGFuZCB0aGV5IGFyZSBub3QgcGFzc2VkIGhlcmUsIHRoZSB1c2VyIHdpbGwgYmVcbiAgICAvLyBwcm9tcHRlZCBmb3IgdGhlbS5cbiAgfSwge1xuICAgIGtleTogXCJleGVjQ29tbWFuZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBleGVjQ29tbWFuZChuYW1lLCBwYXJhbXMpIHtcbiAgICAgIHZhciBjbWQgPSB0aGlzLmNvbW1hbmRzW25hbWVdO1xuICAgICAgcmV0dXJuICEhKGNtZCAmJiBjbWQuZXhlYyh0aGlzLCBwYXJhbXMpICE9PSBmYWxzZSk7XG4gICAgfVxuXG4gICAgLy8gOjogKHN0cmluZykg4oaSID9zdHJpbmdcbiAgICAvLyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGtleSB0aGF0IGlzIGJvdW5kIHRvIHRoZSBnaXZlbiBjb21tYW5kLCBpZlxuICAgIC8vIGFueS5cbiAgfSwge1xuICAgIGtleTogXCJrZXlGb3JDb21tYW5kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGtleUZvckNvbW1hbmQobmFtZSkge1xuICAgICAgdmFyIGNhY2hlZCA9IHRoaXMuY29tbWFuZEtleXNbbmFtZV07XG4gICAgICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgICAgIHZhciBjbWQgPSB0aGlzLmNvbW1hbmRzW25hbWVdLFxuICAgICAgICAgIGtleW1hcCA9IHRoaXMuYmFzZUtleW1hcDtcbiAgICAgIGlmICghY21kKSByZXR1cm4gdGhpcy5jb21tYW5kS2V5c1tuYW1lXSA9IG51bGw7XG4gICAgICB2YXIga2V5ID0gY21kLnNwZWMua2V5IHx8IChfZG9tLmJyb3dzZXIubWFjID8gY21kLnNwZWMubWFjS2V5IDogY21kLnNwZWMucGNLZXkpO1xuICAgICAgaWYgKGtleSkge1xuICAgICAgICBrZXkgPSAoMCwgX2tleXMubm9ybWFsaXplS2V5TmFtZSkoQXJyYXkuaXNBcnJheShrZXkpID8ga2V5WzBdIDoga2V5KTtcbiAgICAgICAgdmFyIGRlZmx0ID0ga2V5bWFwLmJpbmRpbmdzW2tleV07XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRlZmx0KSA/IGRlZmx0LmluZGV4T2YobmFtZSkgPiAtMSA6IGRlZmx0ID09IG5hbWUpIHJldHVybiB0aGlzLmNvbW1hbmRLZXlzW25hbWVdID0ga2V5O1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgX2tleSBpbiBrZXltYXAuYmluZGluZ3MpIHtcbiAgICAgICAgdmFyIGJvdW5kID0ga2V5bWFwLmJpbmRpbmdzW19rZXldO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShib3VuZCkgPyBib3VuZC5pbmRleE9mKG5hbWUpID4gLTEgOiBib3VuZCA9PSBuYW1lKSByZXR1cm4gdGhpcy5jb21tYW5kS2V5c1tuYW1lXSA9IF9rZXk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5jb21tYW5kS2V5c1tuYW1lXSA9IG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlZ2lzdHJ5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlZ2lzdHJ5KG5hbWUsIGYpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB0aGlzLnNjaGVtYS5yZWdpc3RyeShuYW1lLCBmKTtcbiAgICAgIHRoaXMub3B0aW9ucy5yZWdpc3RyaWVzLmZvckVhY2goZnVuY3Rpb24gKHJlZykge1xuICAgICAgICB2YXIgYXJyYXkgPSByZWcucmVnaXN0cnlbbmFtZV07XG4gICAgICAgIGlmIChhcnJheSkgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgZihhcnJheVtpXSwgX3RoaXMyKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJtYXJrUmFuZ2VEaXJ0eVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXJrUmFuZ2VEaXJ0eShyYW5nZSkge1xuICAgICAgdGhpcy5lbnN1cmVPcGVyYXRpb24oKTtcbiAgICAgIHZhciBkaXJ0eSA9IHRoaXMuZGlydHlOb2RlcztcbiAgICAgIHZhciBmcm9tID0gcmFuZ2UuZnJvbSxcbiAgICAgICAgICB0byA9IHJhbmdlLnRvO1xuICAgICAgZm9yICh2YXIgZGVwdGggPSAwLCBub2RlID0gdGhpcy5kb2M7OyBkZXB0aCsrKSB7XG4gICAgICAgIHZhciBmcm9tRW5kID0gZGVwdGggPT0gZnJvbS5kZXB0aCxcbiAgICAgICAgICAgIHRvRW5kID0gZGVwdGggPT0gdG8uZGVwdGg7XG4gICAgICAgIGlmICghZnJvbUVuZCAmJiAhdG9FbmQgJiYgZnJvbS5wYXRoW2RlcHRoXSA9PSB0by5wYXRoW2RlcHRoXSkge1xuICAgICAgICAgIHZhciBjaGlsZCA9IG5vZGUuY2hpbGQoZnJvbS5wYXRoW2RlcHRoXSk7XG4gICAgICAgICAgaWYgKCFkaXJ0eS5oYXMoY2hpbGQpKSBkaXJ0eS5zZXQoY2hpbGQsIERJUlRZX1JFU0NBTik7XG4gICAgICAgICAgbm9kZSA9IGNoaWxkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBfcmV0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IGZyb21FbmQgPyBmcm9tLm9mZnNldCA6IGZyb20ucGF0aFtkZXB0aF07XG4gICAgICAgICAgICB2YXIgZW5kID0gdG9FbmQgPyB0by5vZmZzZXQgOiB0by5wYXRoW2RlcHRoXSArIDE7XG4gICAgICAgICAgICBpZiAobm9kZS5pc1RleHRibG9jaykge1xuICAgICAgICAgICAgICBub2RlLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkLCBjU3RhcnQsIGNFbmQpIHtcbiAgICAgICAgICAgICAgICBpZiAoY1N0YXJ0IDwgZW5kICYmIGNFbmQgPiBzdGFydCkgZGlydHkuc2V0KGNoaWxkLCBESVJUWV9SRURSQVcpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIGkgPSBub2RlLml0ZXIoc3RhcnQsIGVuZCksIGNoaWxkID0gdW5kZWZpbmVkOyBjaGlsZCA9IGkubmV4dCgpLnZhbHVlOykge1xuICAgICAgICAgICAgICAgIGRpcnR5LnNldChjaGlsZCwgRElSVFlfUkVEUkFXKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFwiYnJlYWtcIjtcbiAgICAgICAgICB9KSgpO1xuXG4gICAgICAgICAgaWYgKF9yZXQgPT09IFwiYnJlYWtcIikgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2VsZWN0aW9uXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAoIXRoaXMuYWNjdXJhdGVTZWxlY3Rpb24pIHRoaXMuZW5zdXJlT3BlcmF0aW9uKCk7XG4gICAgICByZXR1cm4gdGhpcy5zZWwucmFuZ2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRyXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gbmV3IEVkaXRvclRyYW5zZm9ybSh0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYmFzZUtleW1hcFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5rZXltYXAgfHwgdGhpcy5kZWZhdWx0S2V5bWFwIHx8ICh0aGlzLmRlZmF1bHRLZXltYXAgPSAoMCwgX2NvbW1hbmRzLmRlZmF1bHRLZXltYXApKHRoaXMpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2VsZWN0ZWREb2NcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHZhciBzZWwgPSB0aGlzLnNlbGVjdGlvbjtcbiAgICAgIHJldHVybiB0aGlzLmRvYy5zbGljZUJldHdlZW4oc2VsLmZyb20sIHNlbC50byk7XG4gICAgfVxuXG4gICAgLy8gOjogKCkg4oaSIHN0cmluZ1xuICAgIC8vIEdldCB0aGUgdGV4dCB0aGF0IGZhbGxzIHdpdGhpbiB0aGUgc2VsZWN0aW9uLlxuICB9LCB7XG4gICAga2V5OiBcInNlbGVjdGVkVGV4dFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuICgwLCBfc2VyaWFsaXplVGV4dC50b1RleHQpKHRoaXMuc2VsZWN0ZWREb2MpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBQcm9zZU1pcnJvcjtcbn0pKCk7XG5cbmV4cG9ydHMuUHJvc2VNaXJyb3IgPSBQcm9zZU1pcnJvcjtcbnZhciBESVJUWV9SRVNDQU4gPSAxLFxuICAgIERJUlRZX1JFRFJBVyA9IDI7XG5cbmV4cG9ydHMuRElSVFlfUkVTQ0FOID0gRElSVFlfUkVTQ0FOO1xuZXhwb3J0cy5ESVJUWV9SRURSQVcgPSBESVJUWV9SRURSQVc7XG52YXIgbnVsbE9wdGlvbnMgPSB7fTtcblxuKDAsIF91dGlsRXZlbnQuZXZlbnRNaXhpbikoUHJvc2VNaXJyb3IpO1xuXG52YXIgT3BlcmF0aW9uID0gZnVuY3Rpb24gT3BlcmF0aW9uKHBtKSB7XG4gIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBPcGVyYXRpb24pO1xuXG4gIHRoaXMuZG9jID0gcG0uZG9jO1xuICB0aGlzLnNlbCA9IHBtLnNlbC5yYW5nZTtcbiAgdGhpcy5zY3JvbGxJbnRvVmlldyA9IGZhbHNlO1xuICB0aGlzLmZvY3VzID0gZmFsc2U7XG4gIHRoaXMuY29tcG9zaW5nQXRTdGFydCA9ICEhcG0uaW5wdXQuY29tcG9zaW5nO1xufVxuXG4vLyA7OyAjdG9jPWZhbHNlIEEgc2VsZWN0aW9uLWF3YXJlIGV4dGVuc2lvbiBvZiBgVHJhbnNmb3JtYC4gVXNlXG4vLyBgUHJvc2VNaXJyb3IudHJgIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZS5cbjtcblxudmFyIEVkaXRvclRyYW5zZm9ybSA9IChmdW5jdGlvbiAoX1RyYW5zZm9ybSkge1xuICBfaW5oZXJpdHMoRWRpdG9yVHJhbnNmb3JtLCBfVHJhbnNmb3JtKTtcblxuICBmdW5jdGlvbiBFZGl0b3JUcmFuc2Zvcm0ocG0pIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRWRpdG9yVHJhbnNmb3JtKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKEVkaXRvclRyYW5zZm9ybS5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmNhbGwodGhpcywgcG0uZG9jKTtcbiAgICB0aGlzLnBtID0gcG07XG4gIH1cblxuICAvLyA6OiAoP09iamVjdCkg4oaSID9FZGl0b3JUcmFuc2Zvcm1cbiAgLy8gQXBwbHkgdGhlIHRyYW5zZm9ybWF0aW9uLiBSZXR1cm5zIHRoZSB0cmFuc2Zvcm0sIG9yIGBmYWxzZWAgaXQgaXNcbiAgLy8gd2FzIGVtcHR5LlxuXG4gIF9jcmVhdGVDbGFzcyhFZGl0b3JUcmFuc2Zvcm0sIFt7XG4gICAga2V5OiBcImFwcGx5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFwcGx5KG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLnBtLmFwcGx5KHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8vIDo6IFNlbGVjdGlvblxuICAgIC8vIEdldCB0aGUgZWRpdG9yJ3MgY3VycmVudCBzZWxlY3Rpb24sIFttYXBwZWRdKCNTZWxlY3Rpb24ubWFwKVxuICAgIC8vIHRocm91Z2ggdGhlIHN0ZXBzIGluIHRoaXMgdHJhbnNmb3JtLlxuICB9LCB7XG4gICAga2V5OiBcInJlcGxhY2VTZWxlY3Rpb25cIixcblxuICAgIC8vIDo6ICg/Tm9kZSwgP2Jvb2wpIOKGkiBFZGl0b3JUcmFuc2Zvcm1cbiAgICAvLyBSZXBsYWNlIHRoZSBzZWxlY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gbm9kZSwgb3IgZGVsZXRlIGl0IGlmIGBub2RlYFxuICAgIC8vIGlzIG51bGwuIFdoZW4gYGluaGVyaXRNYXJrc2AgaXMgdHJ1ZSBhbmQgdGhlIG5vZGUgaXMgYW4gaW5saW5lXG4gICAgLy8gbm9kZSwgaXQgaW5oZXJpdHMgdGhlIG1hcmtzIGZyb20gdGhlIHBsYWNlIHdoZXJlIGl0IGlzIGluc2VydGVkLlxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXBsYWNlU2VsZWN0aW9uKG5vZGUsIGluaGVyaXRNYXJrcykge1xuICAgICAgdmFyIF9zZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbjtcbiAgICAgIHZhciBlbXB0eSA9IF9zZWxlY3Rpb24uZW1wdHk7XG4gICAgICB2YXIgZnJvbSA9IF9zZWxlY3Rpb24uZnJvbTtcbiAgICAgIHZhciB0byA9IF9zZWxlY3Rpb24udG87XG4gICAgICB2YXIgc2VsTm9kZSA9IF9zZWxlY3Rpb24ubm9kZTt2YXIgcGFyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgaWYgKG5vZGUgJiYgbm9kZS5pc0lubGluZSAmJiBpbmhlcml0TWFya3MgIT09IGZhbHNlKSB7XG4gICAgICAgIHZhciBtYXJrcyA9IGVtcHR5ID8gdGhpcy5wbS5pbnB1dC5zdG9yZWRNYXJrcyA6IHRoaXMuZG9jLm1hcmtzQXQoZnJvbSk7XG4gICAgICAgIG5vZGUgPSBub2RlLnR5cGUuY3JlYXRlKG5vZGUuYXR0cnMsIG5vZGUudGV4dCwgbWFya3MpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2VsTm9kZSAmJiBzZWxOb2RlLmlzVGV4dGJsb2NrICYmIG5vZGUgJiYgbm9kZS5pc0lubGluZSkge1xuICAgICAgICAvLyBQdXR0aW5nIGlubGluZSBzdHVmZiBvbnRvIGEgc2VsZWN0ZWQgdGV4dGJsb2NrIHB1dHMgaXQgaW5zaWRlXG4gICAgICAgIGZyb20gPSBuZXcgX21vZGVsLlBvcyhmcm9tLnRvUGF0aCgpLCAwKTtcbiAgICAgICAgdG8gPSBuZXcgX21vZGVsLlBvcyhmcm9tLnBhdGgsIHNlbE5vZGUuc2l6ZSk7XG4gICAgICB9IGVsc2UgaWYgKHNlbE5vZGUpIHtcbiAgICAgICAgLy8gVGhpcyBub2RlIGNhbiBub3Qgc2ltcGx5IGJlIHJlbW92ZWQvcmVwbGFjZWQuIFJlbW92ZSBpdHMgcGFyZW50IGFzIHdlbGxcbiAgICAgICAgd2hpbGUgKGZyb20uZGVwdGggJiYgZnJvbS5vZmZzZXQgPT0gMCAmJiAocGFyZW50ID0gdGhpcy5kb2MucGF0aChmcm9tLnBhdGgpKSAmJiBmcm9tLm9mZnNldCA9PSBwYXJlbnQuc2l6ZSAtIDEgJiYgIXBhcmVudC50eXBlLmNhbkJlRW1wdHkgJiYgIShub2RlICYmIHBhcmVudC50eXBlLmNhbkNvbnRhaW4obm9kZSkpKSB7XG4gICAgICAgICAgZnJvbSA9IGZyb20uc2hvcnRlbigpO1xuICAgICAgICAgIHRvID0gdG8uc2hvcnRlbihudWxsLCAxKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChub2RlICYmIG5vZGUuaXNCbG9jayAmJiB0aGlzLmRvYy5wYXRoKGZyb20ucGF0aC5zbGljZSgwLCBmcm9tLmRlcHRoIC0gMSkpLnR5cGUuY2FuQ29udGFpbihub2RlKSkge1xuICAgICAgICAvLyBJbnNlcnRpbmcgYSBibG9jayBub2RlIGludG8gYSB0ZXh0YmxvY2suIFRyeSB0byBpbnNlcnQgaXQgYWJvdmUgYnkgc3BsaXR0aW5nIHRoZSB0ZXh0YmxvY2tcbiAgICAgICAgdGhpc1tcImRlbGV0ZVwiXShmcm9tLCB0byk7XG4gICAgICAgIHZhciBfcGFyZW50ID0gdGhpcy5kb2MucGF0aChmcm9tLnBhdGgpO1xuICAgICAgICBpZiAoZnJvbS5vZmZzZXQgJiYgZnJvbS5vZmZzZXQgIT0gX3BhcmVudC5zaXplKSB0aGlzLnNwbGl0KGZyb20pO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnQoZnJvbS5zaG9ydGVuKG51bGwsIGZyb20ub2Zmc2V0ID8gMSA6IDApLCBub2RlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUpIHJldHVybiB0aGlzLnJlcGxhY2VXaXRoKGZyb20sIHRvLCBub2RlKTtlbHNlIHJldHVybiB0aGlzW1wiZGVsZXRlXCJdKGZyb20sIHRvKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoKSDihpIgRWRpdG9yVHJhbnNmb3JtXG4gICAgLy8gRGVsZXRlIHRoZSBzZWxlY3Rpb24uXG4gIH0sIHtcbiAgICBrZXk6IFwiZGVsZXRlU2VsZWN0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlbGV0ZVNlbGVjdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VTZWxlY3Rpb24oKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoc3RyaW5nKSDihpIgRWRpdG9yVHJhbnNmb3JtXG4gICAgLy8gUmVwbGFjZSB0aGUgc2VsZWN0aW9uIHdpdGggYSB0ZXh0IG5vZGUgY29udGFpbmluZyB0aGUgZ2l2ZW4gc3RyaW5nLlxuICB9LCB7XG4gICAga2V5OiBcInR5cGVUZXh0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHR5cGVUZXh0KHRleHQpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VTZWxlY3Rpb24odGhpcy5wbS5zY2hlbWEudGV4dCh0ZXh0KSwgdHJ1ZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNlbGVjdGlvblwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RlcHMubGVuZ3RoID8gdGhpcy5wbS5zZWxlY3Rpb24ubWFwKHRoaXMpIDogdGhpcy5wbS5zZWxlY3Rpb247XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEVkaXRvclRyYW5zZm9ybTtcbn0pKF90cmFuc2Zvcm0uVHJhbnNmb3JtKTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5leHBvcnRzLmRlZmluZU9wdGlvbiA9IGRlZmluZU9wdGlvbjtcbmV4cG9ydHMucGFyc2VPcHRpb25zID0gcGFyc2VPcHRpb25zO1xuZXhwb3J0cy5pbml0T3B0aW9ucyA9IGluaXRPcHRpb25zO1xuZXhwb3J0cy5zZXRPcHRpb24gPSBzZXRPcHRpb247XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBfbW9kZWwgPSByZXF1aXJlKFwiLi4vbW9kZWxcIik7XG5cbi8vIDs7IEEgcmVnaXN0cnkgaXMgYSBuYW1lc3BhY2UgZm9yIFtjb21tYW5kc10oI0NvbW1hbmRzKSwgaW5wdXRcbi8vIHJ1bGVzLCBhbmQgc28gb24uIFRoZXkgcHJvdmlkZSBhIHdheSB0byBkZWZpbmUgY29tbWFuZHMgYW5kIHN1Y2ggaW5cbi8vIGEgc2NvcGVkIHdheSwgd2l0aG91dCBoYXZpbmcgdGhlbSBzaG93IHVwIG9uIGFsbCB5b3VyIGVkaXRvcnMgYnlcbi8vIGRlZmF1bHQgYWxsIG9mIGEgc3VkZGVuLiBTZWUgYWxzbyB0aGUgW2ByZWdpc3RyaWVzYFxuLy8gb3B0aW9uXSgjcmVnaXN0cmllcykuXG5cbnZhciBSZWdpc3RyeSA9IChmdW5jdGlvbiAoKSB7XG4gIC8vIDo6IChzdHJpbmcpXG4gIC8vIENyZWF0ZSBhIG5ldyByZWdpc3RyeSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuXG4gIGZ1bmN0aW9uIFJlZ2lzdHJ5KG5hbWUpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUmVnaXN0cnkpO1xuXG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnJlZ2lzdHJ5ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuXG4gIC8vIDo6IFJlZ2lzdHJ5XG4gIC8vIFRoZSByZWdpc3RyeSBpbiB3aGljaCBidWlsdC1pbiBjb21tYW5kcyBhbmQgaW5wdXQgcnVsZXMgYXJlXG4gIC8vIHJlZ2lzdGVyZWQuIFRoZSBkZWZhdWx0IGNvbnRlbnQgb2YgdGhlIGByZWdpc3RyaWVzYCBvcHRpb24uXG5cbiAgLy8gOjogKHN0cmluZywgKilcbiAgLy8gUmVnaXN0ZXIgYSBuZXcgaXRlbSBpbiB0aGlzIHJlZ2lzdHJ5LlxuXG4gIF9jcmVhdGVDbGFzcyhSZWdpc3RyeSwgW3tcbiAgICBrZXk6IFwicmVnaXN0ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVnaXN0ZXIobmFtZSwgdmFsdWUpIHtcbiAgICAgIDsodGhpcy5yZWdpc3RyeVtuYW1lXSB8fCAodGhpcy5yZWdpc3RyeVtuYW1lXSA9IFtdKSkucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFJlZ2lzdHJ5O1xufSkoKTtcblxuZXhwb3J0cy5SZWdpc3RyeSA9IFJlZ2lzdHJ5O1xudmFyIGRlZmF1bHRSZWdpc3RyeSA9IG5ldyBSZWdpc3RyeShcImRlZmF1bHRcIik7XG5cbmV4cG9ydHMuZGVmYXVsdFJlZ2lzdHJ5ID0gZGVmYXVsdFJlZ2lzdHJ5O1xuXG52YXIgT3B0aW9uID0gZnVuY3Rpb24gT3B0aW9uKGRlZmF1bHRWYWx1ZSwgdXBkYXRlLCB1cGRhdGVPbkluaXQpIHtcbiAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE9wdGlvbik7XG5cbiAgdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gIHRoaXMudXBkYXRlID0gdXBkYXRlO1xuICB0aGlzLnVwZGF0ZU9uSW5pdCA9IHVwZGF0ZU9uSW5pdCAhPT0gZmFsc2U7XG59O1xuXG52YXIgb3B0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbi8vIDo6IChzdHJpbmcsIGFueSwgKHBtOiBQcm9zZU1pcnJvciwgbmV3VmFsdWU6IGFueSwgb2xkVmFsdWU6IGFueSwgaW5pdDogYm9vbCksIGJvb2wpXG4vLyBEZWZpbmUgYSBuZXcgb3B0aW9uLiBUaGUgYHVwZGF0ZWAgaGFuZGxlciB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZVxuLy8gb3B0aW9uJ3Mgb2xkIGFuZCBuZXcgdmFsdWUgZXZlcnkgdGltZSB0aGUgb3B0aW9uIGlzXG4vLyBbY2hhbmdlZF0oI1Byb3NlTWlycm9yLnNldE9wdGlvbikuIFdoZW4gYHVwZGF0ZU9uSW5pdGAgaXMgdHJ1ZSwgaXRcbi8vIGlzIGFsc28gY2FsbGVkIG9uIGVkaXRvciBpbml0LCB3aXRoIG51bGwgYXMgdGhlIG9sZCB2YWx1ZSwgYW5kIGEgZm91cnRoXG4vLyBhcmd1bWVudCBvZiB0cnVlLlxuXG5mdW5jdGlvbiBkZWZpbmVPcHRpb24obmFtZSwgZGVmYXVsdFZhbHVlLCB1cGRhdGUsIHVwZGF0ZU9uSW5pdCkge1xuICBvcHRpb25zW25hbWVdID0gbmV3IE9wdGlvbihkZWZhdWx0VmFsdWUsIHVwZGF0ZSwgdXBkYXRlT25Jbml0KTtcbn1cblxuLy8gOjogU2NoZW1hICNwYXRoPXNjaGVtYSAja2luZD1vcHRpb25cbi8vIFRoZSBbc2NoZW1hXSgjU2NoZW1hKSB0aGF0IHRoZSBlZGl0b3IncyBkb2N1bWVudCBzaG91bGQgdXNlLlxuZGVmaW5lT3B0aW9uKFwic2NoZW1hXCIsIF9tb2RlbC5kZWZhdWx0U2NoZW1hLCBmYWxzZSk7XG5cbi8vIDo6IGFueSAjcGF0aD1kb2MgI2tpbmQ9b3B0aW9uXG4vLyBUaGUgc3RhcnRpbmcgZG9jdW1lbnQuIFVzdWFsbHkgYSBgTm9kZWAsIGJ1dCBjYW4gYmUgaW4gYW5vdGhlclxuLy8gZm9ybWF0IHdoZW4gdGhlIGBkb2NGb3JtYXRgIG9wdGlvbiBpcyBhbHNvIHNwZWNpZmllZC5cbmRlZmluZU9wdGlvbihcImRvY1wiLCBudWxsLCBmdW5jdGlvbiAocG0sIHZhbHVlKSB7XG4gIHJldHVybiBwbS5zZXREb2ModmFsdWUpO1xufSwgZmFsc2UpO1xuXG4vLyA6OiA/c3RyaW5nICNwYXRoPWRvY0Zvcm1hdCAja2luZD1vcHRpb25cbi8vIFRoZSBmb3JtYXQgaW4gd2hpY2ggdGhlIGBkb2NgIG9wdGlvbiBpcyBnaXZlbi4gRGVmYXVsdHMgdG8gYG51bGxgXG4vLyAoYSByYXcgYE5vZGVgKS5cbmRlZmluZU9wdGlvbihcImRvY0Zvcm1hdFwiLCBudWxsKTtcblxuLy8gOjogP3VuaW9uPERPTU5vZGUsIChET01Ob2RlKT4gI3BhdGg9cGxhY2UgI2tpbmQ9b3B0aW9uXG4vLyBEZXRlcm1pbmVzIHRoZSBwbGFjZW1lbnQgb2YgdGhlIGVkaXRvciBpbiB0aGUgcGFnZS4gV2hlbiBgbnVsbGAsXG4vLyB0aGUgZWRpdG9yIGlzIG5vdCBwbGFjZWQuIFdoZW4gYSBET00gbm9kZSBpcyBnaXZlbiwgdGhlIGVkaXRvciBpc1xuLy8gYXBwZW5kZWQgdG8gdGhhdCBub2RlLiBXaGVuIGEgZnVuY3Rpb24gaXMgZ2l2ZW4sIGl0IGlzIGNhbGxlZFxuLy8gd2l0aCB0aGUgZWRpdG9yJ3Mgd3JhcHBpbmcgRE9NIG5vZGUsIGFuZCBpcyBleHBlY3RlZCB0byBwbGFjZSBpdFxuLy8gaW50byB0aGUgZG9jdW1lbnQuXG5kZWZpbmVPcHRpb24oXCJwbGFjZVwiLCBudWxsKTtcblxuLy8gOjogS2V5bWFwICNwYXRoPWtleW1hcCAja2luZD1vcHRpb25cbi8vIFRoZSBiYXNlIFtrZXltYXBdKCNLZXltYXApLiBXaGVuIG5vdCBnaXZlbiwgYSBkZWZhdWx0IGtleW1hcCBpc1xuLy8gc3ludGhlc2l6ZWQgZnJvbSB0aGUgZGVmYXVsdCBrZXkgYmluZGluZ3MgcHJvdmlkZWQgYnkgdGhlXG4vLyBbY29tbWFuZHNdKCNDb21tYW5kKSB0aGF0IGFyZSBpbiBzY29wZSBmb3IgdGhlIGVkaXRvci5cbmRlZmluZU9wdGlvbihcImtleW1hcFwiLCBudWxsKTtcblxuLy8gOjogW1JlZ2lzdHJ5XVxuLy8gVGhlIHNldCBvZiBbcmVnaXN0cmllc10oI1JlZ2lzdHJ5KSB0aGUgZWRpdG9yIHNob3VsZCBsb2FkIGl0ZW1zXG4vLyBmcm9tLlxuZGVmaW5lT3B0aW9uKFwicmVnaXN0cmllc1wiLCBbZGVmYXVsdFJlZ2lzdHJ5XSwgZmFsc2UpO1xuXG4vLyA6OiBudW1iZXIgI3BhdGg9aGlzdG9yeURlcHRoICNraW5kPW9wdGlvblxuLy8gVGhlIGFtb3VudCBvZiBoaXN0b3J5IGV2ZW50cyB0aGF0IGFyZSBjb2xsZWN0ZWQgYmVmb3JlIHRoZSBvbGRlc3Rcbi8vIGV2ZW50cyBhcmUgZGlzY2FyZGVkLiBEZWZhdWx0cyB0byAxMDAuXG5kZWZpbmVPcHRpb24oXCJoaXN0b3J5RGVwdGhcIiwgMTAwKTtcblxuLy8gOjogbnVtYmVyICNwYXRoPWhpc3RvcnlFdmVudERlbGF5ICNraW5kPW9wdGlvblxuLy8gVGhlIGFtb3VudCBvZiBtaWxsaXNlY29uZHMgdGhhdCBtdXN0IHBhc3MgYmV0d2VlbiBjaGFuZ2VzIHRvXG4vLyBzdGFydCBhIG5ldyBoaXN0b3J5IGV2ZW50LiBEZWZhdWx0cyB0byA1MDAuXG5kZWZpbmVPcHRpb24oXCJoaXN0b3J5RXZlbnREZWxheVwiLCA1MDApO1xuXG4vLyA6OiBzdHJpbmcgI3BhdGg9Y29tbWFuZFBhcmFtSGFuZGxlciAja2luZD1vcHRpb25cbi8vIFRoZSBuYW1lIG9mIHRoZSBoYW5kbGVyIHVzZWQgdG8gcHJvbXB0IHRoZSB1c2VyIGZvciBbY29tbWFuZFxuLy8gcGFyYW1ldGVyc10oI0NvbW1hbmRQYXJhbSkuIE9ubHkgcmVsZXZhbnQgd2hlbiBtdWx0aXBsZSBzdWNoXG4vLyBoYW5kbGVycyBhcmUgbG9hZGVkLCBhbmQgeW91IHdhbnQgdG8gY2hvb3NlIGJldHdlZW4gdGhlbS5cbmRlZmluZU9wdGlvbihcImNvbW1hbmRQYXJhbUhhbmRsZXJcIiwgXCJkZWZhdWx0XCIpO1xuXG4vLyA6OiA/c3RyaW5nICNwYXRoPWxhYmVsICNraW5kPW9wdGlvblxuLy8gVGhlIGxhYmVsIG9mIHRoZSBlZGl0b3IuIFdoZW4gc2V0LCB0aGUgZWRpdGFibGUgRE9NIG5vZGUgZ2V0cyBhblxuLy8gYGFyaWEtbGFiZWxgIGF0dHJpYnV0ZSB3aXRoIHRoaXMgdmFsdWUuXG5kZWZpbmVPcHRpb24oXCJsYWJlbFwiLCBudWxsKTtcblxuZnVuY3Rpb24gcGFyc2VPcHRpb25zKG9iaikge1xuICB2YXIgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgdmFyIGdpdmVuID0gb2JqID8gW29ial0uY29uY2F0KG9iai51c2UgfHwgW10pIDogW107XG4gIG91dGVyOiBmb3IgKHZhciBvcHQgaW4gb3B0aW9ucykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2l2ZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChvcHQgaW4gZ2l2ZW5baV0pIHtcbiAgICAgICAgcmVzdWx0W29wdF0gPSBnaXZlbltpXVtvcHRdO1xuICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0W29wdF0gPSBvcHRpb25zW29wdF0uZGVmYXVsdFZhbHVlO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGluaXRPcHRpb25zKHBtKSB7XG4gIGZvciAodmFyIG9wdCBpbiBvcHRpb25zKSB7XG4gICAgdmFyIGRlc2MgPSBvcHRpb25zW29wdF07XG4gICAgaWYgKGRlc2MudXBkYXRlICYmIGRlc2MudXBkYXRlT25Jbml0KSBkZXNjLnVwZGF0ZShwbSwgcG0ub3B0aW9uc1tvcHRdLCBudWxsLCB0cnVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRPcHRpb24ocG0sIG5hbWUsIHZhbHVlKSB7XG4gIHZhciBkZXNjID0gb3B0aW9uc1tuYW1lXTtcbiAgaWYgKGRlc2MudXBkYXRlID09PSBmYWxzZSkgdGhyb3cgbmV3IEVycm9yKFwiT3B0aW9uICdcIiArIG5hbWUgKyBcIicgY2FuIG5vdCBiZSBjaGFuZ2VkXCIpO1xuICB2YXIgb2xkID0gcG0ub3B0aW9uc1tuYW1lXTtcbiAgcG0ub3B0aW9uc1tuYW1lXSA9IHZhbHVlO1xuICBpZiAoZGVzYy51cGRhdGUpIGRlc2MudXBkYXRlKHBtLCB2YWx1ZSwgb2xkLCBmYWxzZSk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIF91dGlsRXZlbnQgPSByZXF1aXJlKFwiLi4vdXRpbC9ldmVudFwiKTtcblxuLy8gOzsgQSBbbWFya2VkIHJhbmdlXSgjUHJvc2VNaXJyb3IubWFya1JhbmdlKS4gSW5jbHVkZXMgdGhlIG1ldGhvZHNcbi8vIGZyb20gdGhlIFtldmVudCBtaXhpbl0oI0V2ZW50TWl4aW4pLlxuXG52YXIgTWFya2VkUmFuZ2UgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBNYXJrZWRSYW5nZShmcm9tLCB0bywgb3B0aW9ucykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNYXJrZWRSYW5nZSk7XG5cbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIC8vIDo6ID9Qb3NcbiAgICAvLyBUaGUgY3VycmVudCBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmFuZ2UuIFVwZGF0ZWQgd2hlbmV2ZXIgdGhlXG4gICAgLy8gZWRpdG9yJ3MgZG9jdW1lbnQgaXMgY2hhbmdlZC4gU2V0IHRvIGBudWxsYCB3aGVuIHRoZSBtYXJrZWRcbiAgICAvLyByYW5nZSBpcyBbcmVtb3ZlZF0oI1Byb3NlTWlycm9yLnJlbW92ZVJhbmdlKS5cbiAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgIC8vIDo6ID9Qb3NcbiAgICAvLyBUaGUgY3VycmVudCBlbmQgcG9zaXRpb24gb2YgdGhlIHJhbmdlLiBVcGRhdGVkIHdoZW5ldmVyIHRoZVxuICAgIC8vIGVkaXRvcidzIGRvY3VtZW50IGlzIGNoYW5nZWQuIFNldCB0byBgbnVsbGAgd2hlbiB0aGUgbWFya2VkXG4gICAgLy8gcmFuZ2UgaXMgW3JlbW92ZWRdKCNQcm9zZU1pcnJvci5yZW1vdmVSYW5nZSkuXG4gICAgdGhpcy50byA9IHRvO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKE1hcmtlZFJhbmdlLCBbe1xuICAgIGtleTogXCJyZW1vdmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgICAgLy8gOjogKGZyb206IFBvcywgdG86IFBvcykgI3BhdGg9TWFya2VkUmFuZ2UjZXZlbnRzI3JlbW92ZWRcbiAgICAgIC8vIFNpZ25hbGxlZCB3aGVuIHRoZSBtYXJrZWQgcmFuZ2UgaXMgcmVtb3ZlZCBmcm9tIHRoZSBlZGl0b3IuXG4gICAgICB0aGlzLnNpZ25hbChcInJlbW92ZWRcIiwgdGhpcy5mcm9tLCB0aGlzLnRvLm1heCh0aGlzLmZyb20pKTtcbiAgICAgIHRoaXMuZnJvbSA9IHRoaXMudG8gPSBudWxsO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBNYXJrZWRSYW5nZTtcbn0pKCk7XG5cbmV4cG9ydHMuTWFya2VkUmFuZ2UgPSBNYXJrZWRSYW5nZTtcblxuKDAsIF91dGlsRXZlbnQuZXZlbnRNaXhpbikoTWFya2VkUmFuZ2UpO1xuXG52YXIgUmFuZ2VTb3J0ZXIgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBSYW5nZVNvcnRlcigpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUmFuZ2VTb3J0ZXIpO1xuXG4gICAgdGhpcy5zb3J0ZWQgPSBbXTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhSYW5nZVNvcnRlciwgW3tcbiAgICBrZXk6IFwiZmluZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmaW5kKGF0KSB7XG4gICAgICB2YXIgbWluID0gMCxcbiAgICAgICAgICBtYXggPSB0aGlzLnNvcnRlZC5sZW5ndGg7XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmIChtYXggPCBtaW4gKyAxMCkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSBtaW47IGkgPCBtYXg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuc29ydGVkW2ldLmF0LmNtcChhdCkgPj0gMCkgcmV0dXJuIGk7XG4gICAgICAgICAgfXJldHVybiBtYXg7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1pZCA9IG1pbiArIG1heCA+PiAxO1xuICAgICAgICBpZiAodGhpcy5zb3J0ZWRbbWlkXS5hdC5jbXAoYXQpID4gMCkgbWF4ID0gbWlkO2Vsc2UgbWluID0gbWlkO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnNlcnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5zZXJ0KG9iaikge1xuICAgICAgdGhpcy5zb3J0ZWQuc3BsaWNlKHRoaXMuZmluZChvYmouYXQpLCAwLCBvYmopO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW1vdmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlKGF0LCByYW5nZSkge1xuICAgICAgdmFyIHBvcyA9IHRoaXMuZmluZChhdCk7XG4gICAgICBmb3IgKHZhciBkaXN0ID0gMDs7IGRpc3QrKykge1xuICAgICAgICB2YXIgbGVmdFBvcyA9IHBvcyAtIGRpc3QgLSAxLFxuICAgICAgICAgICAgcmlnaHRQb3MgPSBwb3MgKyBkaXN0O1xuICAgICAgICBpZiAobGVmdFBvcyA+PSAwICYmIHRoaXMuc29ydGVkW2xlZnRQb3NdLnJhbmdlID09IHJhbmdlKSB7XG4gICAgICAgICAgdGhpcy5zb3J0ZWQuc3BsaWNlKGxlZnRQb3MsIDEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmIChyaWdodFBvcyA8IHRoaXMuc29ydGVkLmxlbmd0aCAmJiB0aGlzLnNvcnRlZFtyaWdodFBvc10ucmFuZ2UgPT0gcmFuZ2UpIHtcbiAgICAgICAgICB0aGlzLnNvcnRlZC5zcGxpY2UocmlnaHRQb3MsIDEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZXNvcnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzb3J0KCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnNvcnRlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY3VyID0gdGhpcy5zb3J0ZWRbaV07XG4gICAgICAgIHZhciBhdCA9IGN1ci5hdCA9IGN1ci50eXBlID09IFwib3BlblwiID8gY3VyLnJhbmdlLmZyb20gOiBjdXIucmFuZ2UudG87XG4gICAgICAgIHZhciBwb3MgPSBpO1xuICAgICAgICB3aGlsZSAocG9zID4gMCAmJiB0aGlzLnNvcnRlZFtwb3MgLSAxXS5hdC5jbXAoYXQpID4gMCkge1xuICAgICAgICAgIHRoaXMuc29ydGVkW3Bvc10gPSB0aGlzLnNvcnRlZFtwb3MgLSAxXTtcbiAgICAgICAgICB0aGlzLnNvcnRlZFstLXBvc10gPSBjdXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUmFuZ2VTb3J0ZXI7XG59KSgpO1xuXG52YXIgUmFuZ2VTdG9yZSA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFJhbmdlU3RvcmUocG0pIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUmFuZ2VTdG9yZSk7XG5cbiAgICB0aGlzLnBtID0gcG07XG4gICAgdGhpcy5yYW5nZXMgPSBbXTtcbiAgICB0aGlzLnNvcnRlZCA9IG5ldyBSYW5nZVNvcnRlcigpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFJhbmdlU3RvcmUsIFt7XG4gICAga2V5OiBcImFkZFJhbmdlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZFJhbmdlKHJhbmdlKSB7XG4gICAgICB0aGlzLnJhbmdlcy5wdXNoKHJhbmdlKTtcbiAgICAgIHRoaXMuc29ydGVkLmluc2VydCh7IHR5cGU6IFwib3BlblwiLCBhdDogcmFuZ2UuZnJvbSwgcmFuZ2U6IHJhbmdlIH0pO1xuICAgICAgdGhpcy5zb3J0ZWQuaW5zZXJ0KHsgdHlwZTogXCJjbG9zZVwiLCBhdDogcmFuZ2UudG8sIHJhbmdlOiByYW5nZSB9KTtcbiAgICAgIHRoaXMucG0ubWFya1JhbmdlRGlydHkocmFuZ2UpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW1vdmVSYW5nZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVSYW5nZShyYW5nZSkge1xuICAgICAgdmFyIGZvdW5kID0gdGhpcy5yYW5nZXMuaW5kZXhPZihyYW5nZSk7XG4gICAgICBpZiAoZm91bmQgPiAtMSkge1xuICAgICAgICB0aGlzLnJhbmdlcy5zcGxpY2UoZm91bmQsIDEpO1xuICAgICAgICB0aGlzLnNvcnRlZC5yZW1vdmUocmFuZ2UuZnJvbSwgcmFuZ2UpO1xuICAgICAgICB0aGlzLnNvcnRlZC5yZW1vdmUocmFuZ2UudG8sIHJhbmdlKTtcbiAgICAgICAgdGhpcy5wbS5tYXJrUmFuZ2VEaXJ0eShyYW5nZSk7XG4gICAgICAgIHJhbmdlLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0cmFuc2Zvcm1cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdHJhbnNmb3JtKG1hcHBpbmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHJhbmdlID0gdGhpcy5yYW5nZXNbaV07XG4gICAgICAgIHJhbmdlLmZyb20gPSBtYXBwaW5nLm1hcChyYW5nZS5mcm9tLCByYW5nZS5vcHRpb25zLmluY2x1c2l2ZUxlZnQgPyAtMSA6IDEpLnBvcztcbiAgICAgICAgcmFuZ2UudG8gPSBtYXBwaW5nLm1hcChyYW5nZS50bywgcmFuZ2Uub3B0aW9ucy5pbmNsdXNpdmVSaWdodCA/IDEgOiAtMSkucG9zO1xuICAgICAgICB2YXIgZGlmZiA9IHJhbmdlLmZyb20uY21wKHJhbmdlLnRvKTtcbiAgICAgICAgaWYgKHJhbmdlLm9wdGlvbnMucmVtb3ZlV2hlbkVtcHR5ICE9PSBmYWxzZSAmJiBkaWZmID49IDApIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZVJhbmdlKHJhbmdlKTtcbiAgICAgICAgICBpLS07XG4gICAgICAgIH0gZWxzZSBpZiAoZGlmZiA+IDApIHtcbiAgICAgICAgICByYW5nZS50byA9IHJhbmdlLmZyb207XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuc29ydGVkLnJlc29ydCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhY3RpdmVSYW5nZVRyYWNrZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWN0aXZlUmFuZ2VUcmFja2VyKCkge1xuICAgICAgcmV0dXJuIG5ldyBSYW5nZVRyYWNrZXIodGhpcy5zb3J0ZWQuc29ydGVkKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUmFuZ2VTdG9yZTtcbn0pKCk7XG5cbmV4cG9ydHMuUmFuZ2VTdG9yZSA9IFJhbmdlU3RvcmU7XG5cbnZhciBSYW5nZVRyYWNrZXIgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBSYW5nZVRyYWNrZXIoc29ydGVkKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJhbmdlVHJhY2tlcik7XG5cbiAgICB0aGlzLnNvcnRlZCA9IHNvcnRlZDtcbiAgICB0aGlzLnBvcyA9IDA7XG4gICAgdGhpcy5jdXJyZW50ID0gW107XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUmFuZ2VUcmFja2VyLCBbe1xuICAgIGtleTogXCJhZHZhbmNlVG9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWR2YW5jZVRvKHBvcykge1xuICAgICAgdmFyIG5leHQgPSB1bmRlZmluZWQ7XG4gICAgICB3aGlsZSAodGhpcy5wb3MgPCB0aGlzLnNvcnRlZC5sZW5ndGggJiYgKG5leHQgPSB0aGlzLnNvcnRlZFt0aGlzLnBvc10pLmF0LmNtcChwb3MpIDw9IDApIHtcbiAgICAgICAgdmFyIGNsYXNzTmFtZSA9IG5leHQucmFuZ2Uub3B0aW9ucy5jbGFzc05hbWU7XG4gICAgICAgIGlmICghY2xhc3NOYW1lKSBjb250aW51ZTtcbiAgICAgICAgaWYgKG5leHQudHlwZSA9PSBcIm9wZW5cIikgdGhpcy5jdXJyZW50LnB1c2goY2xhc3NOYW1lKTtlbHNlIHRoaXMuY3VycmVudC5zcGxpY2UodGhpcy5jdXJyZW50LmluZGV4T2YoY2xhc3NOYW1lKSwgMSk7XG4gICAgICAgIHRoaXMucG9zKys7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm5leHRDaGFuZ2VCZWZvcmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbmV4dENoYW5nZUJlZm9yZShwb3MpIHtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKHRoaXMucG9zID09IHRoaXMuc29ydGVkLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciBuZXh0ID0gdGhpcy5zb3J0ZWRbdGhpcy5wb3NdO1xuICAgICAgICBpZiAoIW5leHQucmFuZ2Uub3B0aW9ucy5jbGFzc05hbWUpIHRoaXMucG9zKys7ZWxzZSBpZiAobmV4dC5hdC5jbXAocG9zKSA+PSAwKSByZXR1cm4gbnVsbDtlbHNlIHJldHVybiBuZXh0LmF0Lm9mZnNldDtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUmFuZ2VUcmFja2VyO1xufSkoKTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9nZXQgPSBmdW5jdGlvbiBnZXQoX3gsIF94MiwgX3gzKSB7IHZhciBfYWdhaW4gPSB0cnVlOyBfZnVuY3Rpb246IHdoaWxlIChfYWdhaW4pIHsgdmFyIG9iamVjdCA9IF94LCBwcm9wZXJ0eSA9IF94MiwgcmVjZWl2ZXIgPSBfeDM7IF9hZ2FpbiA9IGZhbHNlOyBpZiAob2JqZWN0ID09PSBudWxsKSBvYmplY3QgPSBGdW5jdGlvbi5wcm90b3R5cGU7IHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTsgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkgeyB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChwYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSBlbHNlIHsgX3ggPSBwYXJlbnQ7IF94MiA9IHByb3BlcnR5OyBfeDMgPSByZWNlaXZlcjsgX2FnYWluID0gdHJ1ZTsgZGVzYyA9IHBhcmVudCA9IHVuZGVmaW5lZDsgY29udGludWUgX2Z1bmN0aW9uOyB9IH0gZWxzZSBpZiAoXCJ2YWx1ZVwiIGluIGRlc2MpIHsgcmV0dXJuIGRlc2MudmFsdWU7IH0gZWxzZSB7IHZhciBnZXR0ZXIgPSBkZXNjLmdldDsgaWYgKGdldHRlciA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTsgfSB9IH07XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZXhwb3J0cy5wb3NGcm9tRE9NID0gcG9zRnJvbURPTTtcbmV4cG9ydHMucmFuZ2VGcm9tRE9NTG9vc2UgPSByYW5nZUZyb21ET01Mb29zZTtcbmV4cG9ydHMuZmluZEJ5UGF0aCA9IGZpbmRCeVBhdGg7XG5leHBvcnRzLnJlc29sdmVQYXRoID0gcmVzb2x2ZVBhdGg7XG5leHBvcnRzLmhhc0ZvY3VzID0gaGFzRm9jdXM7XG5leHBvcnRzLnBvc0F0Q29vcmRzID0gcG9zQXRDb29yZHM7XG5leHBvcnRzLmNvb3Jkc0F0UG9zID0gY29vcmRzQXRQb3M7XG5leHBvcnRzLnNjcm9sbEludG9WaWV3ID0gc2Nyb2xsSW50b1ZpZXc7XG5leHBvcnRzLmZpbmRTZWxlY3Rpb25Gcm9tID0gZmluZFNlbGVjdGlvbkZyb207XG5leHBvcnRzLmZpbmRTZWxlY3Rpb25OZWFyID0gZmluZFNlbGVjdGlvbk5lYXI7XG5leHBvcnRzLmZpbmRTZWxlY3Rpb25BdFN0YXJ0ID0gZmluZFNlbGVjdGlvbkF0U3RhcnQ7XG5leHBvcnRzLmZpbmRTZWxlY3Rpb25BdEVuZCA9IGZpbmRTZWxlY3Rpb25BdEVuZDtcbmV4cG9ydHMuc2VsZWN0YWJsZU5vZGVBYm92ZSA9IHNlbGVjdGFibGVOb2RlQWJvdmU7XG5leHBvcnRzLmhhbmRsZU5vZGVDbGljayA9IGhhbmRsZU5vZGVDbGljaztcbmV4cG9ydHMudmVydGljYWxNb3Rpb25MZWF2ZXNUZXh0YmxvY2sgPSB2ZXJ0aWNhbE1vdGlvbkxlYXZlc1RleHRibG9jaztcbmV4cG9ydHMuc2V0RE9NU2VsZWN0aW9uVG9Qb3MgPSBzZXRET01TZWxlY3Rpb25Ub1BvcztcblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBfbW9kZWwgPSByZXF1aXJlKFwiLi4vbW9kZWxcIik7XG5cbnZhciBfZG9tID0gcmVxdWlyZShcIi4uL2RvbVwiKTtcblxudmFyIFNlbGVjdGlvblN0YXRlID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU2VsZWN0aW9uU3RhdGUocG0pIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFNlbGVjdGlvblN0YXRlKTtcblxuICAgIHRoaXMucG0gPSBwbTtcblxuICAgIHRoaXMucmFuZ2UgPSBmaW5kU2VsZWN0aW9uQXRTdGFydChwbS5kb2MpO1xuICAgIHRoaXMubGFzdE5vbk5vZGVQb3MgPSBudWxsO1xuXG4gICAgdGhpcy5wb2xsU3RhdGUgPSBudWxsO1xuICAgIHRoaXMucG9sbFRpbWVvdXQgPSBudWxsO1xuICAgIHRoaXMubGFzdEFuY2hvck5vZGUgPSB0aGlzLmxhc3RIZWFkTm9kZSA9IHRoaXMubGFzdEFuY2hvck9mZnNldCA9IHRoaXMubGFzdEhlYWRPZmZzZXQgPSBudWxsO1xuICAgIHRoaXMubGFzdE5vZGUgPSBudWxsO1xuXG4gICAgcG0uY29udGVudC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnJlY2VpdmVkRm9jdXMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhTZWxlY3Rpb25TdGF0ZSwgW3tcbiAgICBrZXk6IFwic2V0QW5kU2lnbmFsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEFuZFNpZ25hbChyYW5nZSwgY2xlYXJMYXN0KSB7XG4gICAgICB0aGlzLnNldChyYW5nZSwgY2xlYXJMYXN0KTtcbiAgICAgIC8vIDo6ICgpICNwYXRoPVByb3NlTWlycm9yI2V2ZW50cyNzZWxlY3Rpb25DaGFuZ2VcbiAgICAgIC8vIEluZGljYXRlcyB0aGF0IHRoZSBlZGl0b3IncyBzZWxlY3Rpb24gaGFzIGNoYW5nZWQuXG4gICAgICB0aGlzLnBtLnNpZ25hbChcInNlbGVjdGlvbkNoYW5nZVwiKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldChyYW5nZSwgY2xlYXJMYXN0KSB7XG4gICAgICB0aGlzLnJhbmdlID0gcmFuZ2U7XG4gICAgICBpZiAoIXJhbmdlLm5vZGUpIHRoaXMubGFzdE5vbk5vZGVQb3MgPSBudWxsO1xuICAgICAgaWYgKGNsZWFyTGFzdCAhPT0gZmFsc2UpIHRoaXMubGFzdEFuY2hvck5vZGUgPSBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwb2xsRm9yVXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBvbGxGb3JVcGRhdGUoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMucG0uaW5wdXQuY29tcG9zaW5nKSByZXR1cm47XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5wb2xsVGltZW91dCk7XG4gICAgICB0aGlzLnBvbGxTdGF0ZSA9IFwidXBkYXRlXCI7XG4gICAgICB2YXIgbiA9IDAsXG4gICAgICAgICAgY2hlY2sgPSBmdW5jdGlvbiBjaGVjaygpIHtcbiAgICAgICAgaWYgKF90aGlzMi5wbS5pbnB1dC5jb21wb3NpbmcpIHtcbiAgICAgICAgICAvLyBBYm9ydFxuICAgICAgICB9IGVsc2UgaWYgKF90aGlzMi5wbS5vcGVyYXRpb24pIHtcbiAgICAgICAgICAgIF90aGlzMi5wb2xsVGltZW91dCA9IHNldFRpbWVvdXQoY2hlY2ssIDIwKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFfdGhpczIucmVhZFVwZGF0ZSgpICYmICsrbiA9PSAxKSB7XG4gICAgICAgICAgICBfdGhpczIucG9sbFRpbWVvdXQgPSBzZXRUaW1lb3V0KGNoZWNrLCA1MCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF90aGlzMi5zdG9wUG9sbGluZ0ZvclVwZGF0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICB0aGlzLnBvbGxUaW1lb3V0ID0gc2V0VGltZW91dChjaGVjaywgMjApO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzdG9wUG9sbGluZ0ZvclVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdG9wUG9sbGluZ0ZvclVwZGF0ZSgpIHtcbiAgICAgIGlmICh0aGlzLnBvbGxTdGF0ZSA9PSBcInVwZGF0ZVwiKSB7XG4gICAgICAgIHRoaXMucG9sbFN0YXRlID0gbnVsbDtcbiAgICAgICAgdGhpcy5wb2xsVG9TeW5jKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRvbUNoYW5nZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZG9tQ2hhbmdlZCgpIHtcbiAgICAgIHZhciBzZWwgPSBnZXRTZWxlY3Rpb24oKTtcbiAgICAgIHJldHVybiBzZWwuYW5jaG9yTm9kZSAhPSB0aGlzLmxhc3RBbmNob3JOb2RlIHx8IHNlbC5hbmNob3JPZmZzZXQgIT0gdGhpcy5sYXN0QW5jaG9yT2Zmc2V0IHx8IHNlbC5mb2N1c05vZGUgIT0gdGhpcy5sYXN0SGVhZE5vZGUgfHwgc2VsLmZvY3VzT2Zmc2V0ICE9IHRoaXMubGFzdEhlYWRPZmZzZXQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInN0b3JlRE9NU3RhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RvcmVET01TdGF0ZSgpIHtcbiAgICAgIHZhciBzZWwgPSBnZXRTZWxlY3Rpb24oKTtcbiAgICAgIHRoaXMubGFzdEFuY2hvck5vZGUgPSBzZWwuYW5jaG9yTm9kZTt0aGlzLmxhc3RBbmNob3JPZmZzZXQgPSBzZWwuYW5jaG9yT2Zmc2V0O1xuICAgICAgdGhpcy5sYXN0SGVhZE5vZGUgPSBzZWwuZm9jdXNOb2RlO3RoaXMubGFzdEhlYWRPZmZzZXQgPSBzZWwuZm9jdXNPZmZzZXQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlYWRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVhZFVwZGF0ZSgpIHtcbiAgICAgIGlmICh0aGlzLnBtLmlucHV0LmNvbXBvc2luZyB8fCAhaGFzRm9jdXModGhpcy5wbSkgfHwgIXRoaXMuZG9tQ2hhbmdlZCgpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHZhciBzZWwgPSBnZXRTZWxlY3Rpb24oKSxcbiAgICAgICAgICBkb2MgPSB0aGlzLnBtLmRvYztcbiAgICAgIHZhciBhbmNob3IgPSBwb3NGcm9tRE9NSW5uZXIodGhpcy5wbSwgc2VsLmFuY2hvck5vZGUsIHNlbC5hbmNob3JPZmZzZXQpO1xuICAgICAgdmFyIGhlYWQgPSBwb3NGcm9tRE9NSW5uZXIodGhpcy5wbSwgc2VsLmZvY3VzTm9kZSwgc2VsLmZvY3VzT2Zmc2V0KTtcbiAgICAgIHZhciBuZXdTZWwgPSBmaW5kU2VsZWN0aW9uTmVhcihkb2MsIGhlYWQsIHRoaXMucmFuZ2UuaGVhZCAmJiB0aGlzLnJhbmdlLmhlYWQuY21wKGhlYWQpIDwgMCA/IC0xIDogMSk7XG4gICAgICBpZiAobmV3U2VsIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbiAmJiBkb2MucGF0aChhbmNob3IucGF0aCkuaXNUZXh0YmxvY2spIG5ld1NlbCA9IG5ldyBUZXh0U2VsZWN0aW9uKGFuY2hvciwgbmV3U2VsLmhlYWQpO1xuICAgICAgdGhpcy5zZXRBbmRTaWduYWwobmV3U2VsKTtcbiAgICAgIGlmIChuZXdTZWwgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uIHx8IG5ld1NlbC5oZWFkLmNtcChoZWFkKSB8fCBuZXdTZWwuYW5jaG9yLmNtcChhbmNob3IpKSB7XG4gICAgICAgIHRoaXMudG9ET00oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2xlYXJOb2RlKCk7XG4gICAgICAgIHRoaXMuc3RvcmVET01TdGF0ZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBvbGxUb1N5bmNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcG9sbFRvU3luYygpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5wb2xsU3RhdGUpIHJldHVybjtcbiAgICAgIHRoaXMucG9sbFN0YXRlID0gXCJzeW5jXCI7XG4gICAgICB2YXIgc3luYyA9IGZ1bmN0aW9uIHN5bmMoKSB7XG4gICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9IF90aGlzMy5wbS5jb250ZW50KSB7XG4gICAgICAgICAgX3RoaXMzLnBvbGxTdGF0ZSA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFfdGhpczMucG0ub3BlcmF0aW9uICYmICFfdGhpczMucG0uaW5wdXQuY29tcG9zaW5nKSBfdGhpczMuc3luY0RPTSgpO1xuICAgICAgICAgIF90aGlzMy5wb2xsVGltZW91dCA9IHNldFRpbWVvdXQoc3luYywgMjAwKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHRoaXMucG9sbFRpbWVvdXQgPSBzZXRUaW1lb3V0KHN5bmMsIDIwMCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInN5bmNET01cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3luY0RPTSgpIHtcbiAgICAgIGlmICghdGhpcy5wbS5pbnB1dC5jb21wb3NpbmcgJiYgaGFzRm9jdXModGhpcy5wbSkgJiYgdGhpcy5kb21DaGFuZ2VkKCkpIHRoaXMudG9ET00oKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9ET01cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9ET00odGFrZUZvY3VzKSB7XG4gICAgICBpZiAodGhpcy5yYW5nZSBpbnN0YW5jZW9mIE5vZGVTZWxlY3Rpb24pIHRoaXMubm9kZVRvRE9NKHRha2VGb2N1cyk7ZWxzZSB0aGlzLnJhbmdlVG9ET00odGFrZUZvY3VzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibm9kZVRvRE9NXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5vZGVUb0RPTSh0YWtlRm9jdXMpIHtcbiAgICAgIHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgIGlmICh0YWtlRm9jdXMpIHRoaXMucG0uY29udGVudC5mb2N1cygpO1xuICAgICAgdmFyIHBvcyA9IHRoaXMucmFuZ2UuZnJvbSxcbiAgICAgICAgICBub2RlID0gdGhpcy5yYW5nZS5ub2RlO1xuICAgICAgdmFyIGRvbSA9IHJlc29sdmVQYXRoKHRoaXMucG0uY29udGVudCwgcG9zLnRvUGF0aCgpKTtcbiAgICAgIGlmIChkb20gPT0gdGhpcy5sYXN0Tm9kZSkgcmV0dXJuO1xuICAgICAgdGhpcy5jbGVhck5vZGUoKTtcbiAgICAgIGFkZE5vZGVTZWxlY3Rpb24obm9kZSwgZG9tKTtcbiAgICAgIHRoaXMubGFzdE5vZGUgPSBkb207XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNsZWFyTm9kZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhck5vZGUoKSB7XG4gICAgICBpZiAodGhpcy5sYXN0Tm9kZSkge1xuICAgICAgICBjbGVhck5vZGVTZWxlY3Rpb24odGhpcy5sYXN0Tm9kZSk7XG4gICAgICAgIHRoaXMubGFzdE5vZGUgPSBudWxsO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmFuZ2VUb0RPTVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByYW5nZVRvRE9NKHRha2VGb2N1cykge1xuICAgICAgdmFyIHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgIGlmICghdGhpcy5jbGVhck5vZGUoKSAmJiAhaGFzRm9jdXModGhpcy5wbSkpIHtcbiAgICAgICAgaWYgKCF0YWtlRm9jdXMpIHJldHVybjtcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTkyMTQ0NFxuICAgICAgICBlbHNlIGlmIChfZG9tLmJyb3dzZXIuZ2Vja28pIHRoaXMucG0uY29udGVudC5mb2N1cygpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmRvbUNoYW5nZWQoKSkgcmV0dXJuO1xuXG4gICAgICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgdmFyIGNvbnRlbnQgPSB0aGlzLnBtLmNvbnRlbnQ7XG4gICAgICB2YXIgYW5jaG9yID0gRE9NRnJvbVBvcyhjb250ZW50LCB0aGlzLnJhbmdlLmFuY2hvcik7XG4gICAgICB2YXIgaGVhZCA9IERPTUZyb21Qb3MoY29udGVudCwgdGhpcy5yYW5nZS5oZWFkKTtcblxuICAgICAgaWYgKHNlbC5leHRlbmQpIHtcbiAgICAgICAgcmFuZ2Uuc2V0RW5kKGFuY2hvci5ub2RlLCBhbmNob3Iub2Zmc2V0KTtcbiAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMucmFuZ2UuYW5jaG9yLmNtcCh0aGlzLnJhbmdlLmhlYWQpID4gMCkge1xuICAgICAgICAgIHZhciB0bXAgPSBhbmNob3I7YW5jaG9yID0gaGVhZDtoZWFkID0gdG1wO1xuICAgICAgICB9XG4gICAgICAgIHJhbmdlLnNldEVuZChoZWFkLm5vZGUsIGhlYWQub2Zmc2V0KTtcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnQoYW5jaG9yLm5vZGUsIGFuY2hvci5vZmZzZXQpO1xuICAgICAgfVxuICAgICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgc2VsLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgIGlmIChzZWwuZXh0ZW5kKSBzZWwuZXh0ZW5kKGhlYWQubm9kZSwgaGVhZC5vZmZzZXQpO1xuICAgICAgdGhpcy5zdG9yZURPTVN0YXRlKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlY2VpdmVkRm9jdXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVjZWl2ZWRGb2N1cygpIHtcbiAgICAgIGlmICghdGhpcy5wb2xsU3RhdGUpIHRoaXMucG9sbFRvU3luYygpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJiZWZvcmVTdGFydE9wXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJlZm9yZVN0YXJ0T3AoKSB7XG4gICAgICBpZiAodGhpcy5wb2xsU3RhdGUgPT0gXCJ1cGRhdGVcIiAmJiB0aGlzLnJlYWRVcGRhdGUoKSkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5wb2xsVGltZW91dCk7XG4gICAgICAgIHRoaXMuc3RvcFBvbGxpbmdGb3JVcGRhdGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3luY0RPTSgpO1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBTZWxlY3Rpb25TdGF0ZTtcbn0pKCk7XG5cbmV4cG9ydHMuU2VsZWN0aW9uU3RhdGUgPSBTZWxlY3Rpb25TdGF0ZTtcblxuZnVuY3Rpb24gY2xlYXJOb2RlU2VsZWN0aW9uKGRvbSkge1xuICBkb20uY2xhc3NMaXN0LnJlbW92ZShcIlByb3NlTWlycm9yLXNlbGVjdGVkbm9kZVwiKTtcbn1cblxuZnVuY3Rpb24gYWRkTm9kZVNlbGVjdGlvbihfbm9kZSwgZG9tKSB7XG4gIGRvbS5jbGFzc0xpc3QuYWRkKFwiUHJvc2VNaXJyb3Itc2VsZWN0ZWRub2RlXCIpO1xufVxuXG5mdW5jdGlvbiB3aW5kb3dSZWN0KCkge1xuICByZXR1cm4geyBsZWZ0OiAwLCByaWdodDogd2luZG93LmlubmVyV2lkdGgsXG4gICAgdG9wOiAwLCBib3R0b206IHdpbmRvdy5pbm5lckhlaWdodCB9O1xufVxuXG4vLyA7OyBBbiBlZGl0b3Igc2VsZWN0aW9uLiBDYW4gYmUgb25lIG9mIHR3byBzZWxlY3Rpb24gdHlwZXM6XG4vLyBgVGV4dFNlbGVjdGlvbmAgYW5kIGBOb2RlU2VsZWN0aW9uYC4gQm90aCBoYXZlIHRoZSBwcm9wZXJ0aWVzXG4vLyBsaXN0ZWQgaGVyZSwgYnV0IGFsc28gY29udGFpbiBtb3JlIGluZm9ybWF0aW9uIChzdWNoIGFzIHRoZVxuLy8gc2VsZWN0ZWQgW25vZGVdKCNOb2RlU2VsZWN0aW9uLm5vZGUpIG9yIHRoZVxuLy8gW2hlYWRdKCNUZXh0U2VsZWN0aW9uLmhlYWQpIGFuZCBbYW5jaG9yXSgjVGV4dFNlbGVjdGlvbi5hbmNob3IpKS5cblxudmFyIFNlbGVjdGlvbiA9IGZ1bmN0aW9uIFNlbGVjdGlvbigpIHtcbiAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFNlbGVjdGlvbik7XG59O1xuXG5leHBvcnRzLlNlbGVjdGlvbiA9IFNlbGVjdGlvbjtcblxuLy8gOjogUG9zICNwYXRoPVNlbGVjdGlvbi5wcm90b3R5cGUuZnJvbVxuLy8gVGhlIHN0YXJ0IG9mIHRoZSBzZWxlY3Rpb24uXG5cbi8vIDo6IFBvcyAjcGF0aD1TZWxlY3Rpb24ucHJvdG90eXBlLnRvXG4vLyBUaGUgZW5kIG9mIHRoZSBzZWxlY3Rpb24uXG5cbi8vIDo6IGJvb2wgI3BhdGg9U2VsZWN0aW9uLmVtcHR5XG4vLyBUcnVlIGlmIHRoZSBzZWxlY3Rpb24gaXMgYW4gZW1wdHkgdGV4dCBzZWxlY3Rpb24gKGhlYWQgYW4gYW5jaG9yXG4vLyBhcmUgdGhlIHNhbWUpLlxuXG4vLyA6OiAob3RoZXI6IFNlbGVjdGlvbikg4oaSIGJvb2wgI3BhdGg9U2VsZWN0aW9uLmVxXG4vLyBUZXN0IHdoZXRoZXIgdGhlIHNlbGVjdGlvbiBpcyB0aGUgc2FtZSBhcyBhbm90aGVyIHNlbGVjdGlvbi5cblxuLy8gOjogKGRvYzogTm9kZSwgbWFwcGluZzogTWFwcGFibGUpIOKGkiBTZWxlY3Rpb24gI3BhdGg9U2VsZWN0aW9uLm1hcFxuLy8gTWFwIHRoaXMgc2VsZWN0aW9uIHRocm91Z2ggYSBbbWFwcGFibGVdKCNNYXBwYWJsZSkgdGhpbmcuIGBkb2NgXG4vLyBzaG91bGQgYmUgdGhlIG5ldyBkb2N1bWVudCwgdG8gd2hpY2ggd2UgYXJlIG1hcHBpbmcuXG5cbi8vIDs7ICN0b2M9ZmFsc2UgQSB0ZXh0IHNlbGVjdGlvbiByZXByZXNlbnRzIGEgY2xhc3NpY2FsIGVkaXRvclxuLy8gc2VsZWN0aW9uLCB3aXRoIGEgaGVhZCAodGhlIG1vdmluZyBzaWRlKSBhbmQgYW5jaG9yIChpbW1vYmlsZVxuLy8gc2lkZSksIGJvdGggb2Ygd2hpY2ggcG9pbnQgaW50byB0ZXh0YmxvY2sgbm9kZXMuIEl0IGNhbiBiZSBlbXB0eSAoYVxuLy8gcmVndWxhciBjdXJzb3IgcG9zaXRpb24pLlxuXG52YXIgVGV4dFNlbGVjdGlvbiA9IChmdW5jdGlvbiAoX1NlbGVjdGlvbikge1xuICBfaW5oZXJpdHMoVGV4dFNlbGVjdGlvbiwgX1NlbGVjdGlvbik7XG5cbiAgLy8gOjogKFBvcywgP1BvcylcbiAgLy8gQ29uc3RydWN0IGEgdGV4dCBzZWxlY3Rpb24uIFdoZW4gYGhlYWRgIGlzIG5vdCBnaXZlbiwgaXQgZGVmYXVsdHNcbiAgLy8gdG8gYGFuY2hvcmAuXG5cbiAgZnVuY3Rpb24gVGV4dFNlbGVjdGlvbihhbmNob3IsIGhlYWQpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVGV4dFNlbGVjdGlvbik7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihUZXh0U2VsZWN0aW9uLnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuY2FsbCh0aGlzKTtcbiAgICAvLyA6OiBQb3NcbiAgICAvLyBUaGUgc2VsZWN0aW9uJ3MgaW1tb2JpbGUgc2lkZSAoZG9lcyBub3QgbW92ZSB3aGVuIHByZXNzaW5nXG4gICAgLy8gc2hpZnQtYXJyb3cpLlxuICAgIHRoaXMuYW5jaG9yID0gYW5jaG9yO1xuICAgIC8vIDo6IFBvc1xuICAgIC8vIFRoZSBzZWxlY3Rpb24ncyBtb2JpbGUgc2lkZSAodGhlIHNpZGUgdGhhdCBtb3ZlcyB3aGVuIHByZXNzaW5nXG4gICAgLy8gc2hpZnQtYXJyb3cpLlxuICAgIHRoaXMuaGVhZCA9IGhlYWQgfHwgYW5jaG9yO1xuICB9XG5cbiAgLy8gOzsgI3RvYz1mYWxzZSBBIG5vZGUgc2VsZWN0aW9uIGlzIGEgc2VsZWN0aW9uIHRoYXQgcG9pbnRzIGF0IGFcbiAgLy8gc2luZ2xlIG5vZGUuIEFsbCBub2RlcyBtYXJrZWQgW3NlbGVjdGFibGVdKCNOb2RlVHlwZS5zZWxlY3RhYmxlKVxuICAvLyBjYW4gYmUgdGhlIHRhcmdldCBvZiBhIG5vZGUgc2VsZWN0aW9uLiBJbiBzdWNoIGFuIG9iamVjdCwgYGZyb21gXG4gIC8vIGFuZCBgdG9gIHBvaW50IGRpcmVjdGx5IGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHNlbGVjdGVkIG5vZGUuXG5cbiAgX2NyZWF0ZUNsYXNzKFRleHRTZWxlY3Rpb24sIFt7XG4gICAga2V5OiBcImVxXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVxKG90aGVyKSB7XG4gICAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uICYmICFvdGhlci5oZWFkLmNtcCh0aGlzLmhlYWQpICYmICFvdGhlci5hbmNob3IuY21wKHRoaXMuYW5jaG9yKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibWFwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hcChkb2MsIG1hcHBpbmcpIHtcbiAgICAgIHZhciBoZWFkID0gbWFwcGluZy5tYXAodGhpcy5oZWFkKS5wb3M7XG4gICAgICBpZiAoIWRvYy5wYXRoKGhlYWQucGF0aCkuaXNUZXh0YmxvY2spIHJldHVybiBmaW5kU2VsZWN0aW9uTmVhcihkb2MsIGhlYWQpO1xuICAgICAgdmFyIGFuY2hvciA9IG1hcHBpbmcubWFwKHRoaXMuYW5jaG9yKS5wb3M7XG4gICAgICByZXR1cm4gbmV3IFRleHRTZWxlY3Rpb24oZG9jLnBhdGgoYW5jaG9yLnBhdGgpLmlzVGV4dGJsb2NrID8gYW5jaG9yIDogaGVhZCwgaGVhZCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImludmVydGVkXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5hbmNob3IuY21wKHRoaXMuaGVhZCkgPiAwO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmcm9tXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnZlcnRlZCA/IHRoaXMuaGVhZCA6IHRoaXMuYW5jaG9yO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW52ZXJ0ZWQgPyB0aGlzLmFuY2hvciA6IHRoaXMuaGVhZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZW1wdHlcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmFuY2hvci5jbXAodGhpcy5oZWFkKSA9PSAwO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBUZXh0U2VsZWN0aW9uO1xufSkoU2VsZWN0aW9uKTtcblxuZXhwb3J0cy5UZXh0U2VsZWN0aW9uID0gVGV4dFNlbGVjdGlvbjtcblxudmFyIE5vZGVTZWxlY3Rpb24gPSAoZnVuY3Rpb24gKF9TZWxlY3Rpb24yKSB7XG4gIF9pbmhlcml0cyhOb2RlU2VsZWN0aW9uLCBfU2VsZWN0aW9uMik7XG5cbiAgLy8gOjogKFBvcywgUG9zLCBOb2RlKVxuICAvLyBDcmVhdGUgYSBub2RlIHNlbGVjdGlvbi4gRG9lcyBub3QgdmVyaWZ5IHRoZSB2YWxpZGl0eSBvZiBpdHNcbiAgLy8gYXJndW1lbnRzLiBVc2UgYFByb3NlTWlycm9yLnNldE5vZGVTZWxlY3Rpb25gIGZvciBhbiBlYXNpZXIsXG4gIC8vIGVycm9yLWNoZWNraW5nIHdheSB0byBjcmVhdGUgYSBub2RlIHNlbGVjdGlvbi5cblxuICBmdW5jdGlvbiBOb2RlU2VsZWN0aW9uKGZyb20sIHRvLCBub2RlKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE5vZGVTZWxlY3Rpb24pO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoTm9kZVNlbGVjdGlvbi5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmNhbGwodGhpcyk7XG4gICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICB0aGlzLnRvID0gdG87XG4gICAgLy8gOjogTm9kZSBUaGUgc2VsZWN0ZWQgbm9kZS5cbiAgICB0aGlzLm5vZGUgPSBub2RlO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKE5vZGVTZWxlY3Rpb24sIFt7XG4gICAga2V5OiBcImVxXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVxKG90aGVyKSB7XG4gICAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uICYmICF0aGlzLmZyb20uY21wKG90aGVyLmZyb20pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJtYXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFwKGRvYywgbWFwcGluZykge1xuICAgICAgdmFyIGZyb20gPSBtYXBwaW5nLm1hcCh0aGlzLmZyb20sIDEpLnBvcztcbiAgICAgIHZhciB0byA9IG1hcHBpbmcubWFwKHRoaXMudG8sIC0xKS5wb3M7XG4gICAgICBpZiAoX21vZGVsLlBvcy5zYW1lUGF0aChmcm9tLnBhdGgsIHRvLnBhdGgpICYmIGZyb20ub2Zmc2V0ID09IHRvLm9mZnNldCAtIDEpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBkb2Mubm9kZUFmdGVyKGZyb20pO1xuICAgICAgICBpZiAobm9kZS50eXBlLnNlbGVjdGFibGUpIHJldHVybiBuZXcgTm9kZVNlbGVjdGlvbihmcm9tLCB0bywgbm9kZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmluZFNlbGVjdGlvbk5lYXIoZG9jLCBmcm9tKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZW1wdHlcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTm9kZVNlbGVjdGlvbjtcbn0pKFNlbGVjdGlvbik7XG5cbmV4cG9ydHMuTm9kZVNlbGVjdGlvbiA9IE5vZGVTZWxlY3Rpb247XG5cbmZ1bmN0aW9uIHBhdGhGcm9tRE9NKHBtLCBub2RlKSB7XG4gIHZhciBwYXRoID0gW107XG4gIGZvciAoOyBub2RlICE9IHBtLmNvbnRlbnQ7KSB7XG4gICAgdmFyIGF0dHIgPSBub2RlLmdldEF0dHJpYnV0ZShcInBtLW9mZnNldFwiKTtcbiAgICBpZiAoYXR0cikgcGF0aC51bnNoaWZ0KCthdHRyKTtcbiAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICB9XG4gIHJldHVybiBwYXRoO1xufVxuXG5mdW5jdGlvbiB3aWR0aEZyb21ET00oZG9tKSB7XG4gIHZhciBhdHRyID0gZG9tLmdldEF0dHJpYnV0ZShcInBtLWxlYWZcIik7XG4gIHJldHVybiBhdHRyICYmIGF0dHIgIT0gXCJ0cnVlXCIgPyArYXR0ciA6IDE7XG59XG5cbmZ1bmN0aW9uIHBvc0Zyb21ET01Jbm5lcihwbSwgZG9tLCBkb21PZmZzZXQsIGxvb3NlKSB7XG4gIGlmICghbG9vc2UgJiYgcG0ub3BlcmF0aW9uICYmIHBtLmRvYyAhPSBwbS5vcGVyYXRpb24uZG9jKSB0aHJvdyBuZXcgRXJyb3IoXCJGZXRjaGluZyBhIHBvc2l0aW9uIGZyb20gYW4gb3V0ZGF0ZWQgRE9NIHN0cnVjdHVyZVwiKTtcblxuICB2YXIgZXh0cmFPZmZzZXQgPSAwLFxuICAgICAgdGFnID0gdW5kZWZpbmVkO1xuICBmb3IgKDs7KSB7XG4gICAgdmFyIGFkanVzdCA9IDA7XG4gICAgaWYgKGRvbS5ub2RlVHlwZSA9PSAzKSB7XG4gICAgICBleHRyYU9mZnNldCArPSBkb21PZmZzZXQ7XG4gICAgfSBlbHNlIGlmIChkb20uaGFzQXR0cmlidXRlKFwicG0tb2Zmc2V0XCIpIHx8IGRvbSA9PSBwbS5jb250ZW50KSB7XG4gICAgICBicmVhaztcbiAgICB9IGVsc2UgaWYgKHRhZyA9IGRvbS5nZXRBdHRyaWJ1dGUoXCJwbS1pbm5lci1vZmZzZXRcIikpIHtcbiAgICAgIGV4dHJhT2Zmc2V0ICs9ICt0YWc7XG4gICAgICBhZGp1c3QgPSAtMTtcbiAgICB9IGVsc2UgaWYgKGRvbU9mZnNldCAmJiBkb21PZmZzZXQgPT0gZG9tLmNoaWxkTm9kZXMubGVuZ3RoKSB7XG4gICAgICBhZGp1c3QgPSAxO1xuICAgIH1cblxuICAgIHZhciBfcGFyZW50ID0gZG9tLnBhcmVudE5vZGU7XG4gICAgZG9tT2Zmc2V0ID0gYWRqdXN0IDwgMCA/IDAgOiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKF9wYXJlbnQuY2hpbGROb2RlcywgZG9tKSArIGFkanVzdDtcbiAgICBkb20gPSBfcGFyZW50O1xuICB9XG5cbiAgdmFyIHBhdGggPSBwYXRoRnJvbURPTShwbSwgZG9tKTtcbiAgaWYgKGRvbS5oYXNBdHRyaWJ1dGUoXCJwbS1sZWFmXCIpKSByZXR1cm4gX21vZGVsLlBvcy5mcm9tKHBhdGgsIGV4dHJhT2Zmc2V0ICsgKGRvbU9mZnNldCA/IDEgOiAwKSk7XG5cbiAgdmFyIG9mZnNldCA9IDA7XG4gIGZvciAodmFyIGkgPSBkb21PZmZzZXQgLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciBjaGlsZCA9IGRvbS5jaGlsZE5vZGVzW2ldO1xuICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PSAzKSB7XG4gICAgICBpZiAobG9vc2UpIGV4dHJhT2Zmc2V0ICs9IGNoaWxkLm5vZGVWYWx1ZS5sZW5ndGg7XG4gICAgfSBlbHNlIGlmICh0YWcgPSBjaGlsZC5nZXRBdHRyaWJ1dGUoXCJwbS1vZmZzZXRcIikpIHtcbiAgICAgIG9mZnNldCA9ICt0YWcgKyB3aWR0aEZyb21ET00oY2hpbGQpO1xuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIGlmIChsb29zZSAmJiAhY2hpbGQuaGFzQXR0cmlidXRlKFwicG0taWdub3JlXCIpKSB7XG4gICAgICBleHRyYU9mZnNldCArPSBjaGlsZC50ZXh0Q29udGVudC5sZW5ndGg7XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXcgX21vZGVsLlBvcyhwYXRoLCBvZmZzZXQgKyBleHRyYU9mZnNldCk7XG59XG5cbmZ1bmN0aW9uIHBvc0Zyb21ET00ocG0sIG5vZGUsIG9mZnNldCkge1xuICBpZiAob2Zmc2V0ID09IG51bGwpIHtcbiAgICBvZmZzZXQgPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKG5vZGUucGFyZW50Tm9kZS5jaGlsZE5vZGVzLCBub2RlKTtcbiAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICB9XG4gIHJldHVybiBwb3NGcm9tRE9NSW5uZXIocG0sIG5vZGUsIG9mZnNldCk7XG59XG5cbmZ1bmN0aW9uIHJhbmdlRnJvbURPTUxvb3NlKHBtKSB7XG4gIGlmICghaGFzRm9jdXMocG0pKSByZXR1cm4gbnVsbDtcbiAgdmFyIHNlbCA9IGdldFNlbGVjdGlvbigpO1xuICByZXR1cm4gbmV3IFRleHRTZWxlY3Rpb24ocG9zRnJvbURPTUlubmVyKHBtLCBzZWwuYW5jaG9yTm9kZSwgc2VsLmFuY2hvck9mZnNldCwgdHJ1ZSksIHBvc0Zyb21ET01Jbm5lcihwbSwgc2VsLmZvY3VzTm9kZSwgc2VsLmZvY3VzT2Zmc2V0LCB0cnVlKSk7XG59XG5cbmZ1bmN0aW9uIGZpbmRCeVBhdGgobm9kZSwgbiwgZnJvbUVuZCkge1xuICBmb3IgKHZhciBjaCA9IGZyb21FbmQgPyBub2RlLmxhc3RDaGlsZCA6IG5vZGUuZmlyc3RDaGlsZDsgY2g7IGNoID0gZnJvbUVuZCA/IGNoLnByZXZpb3VzU2libGluZyA6IGNoLm5leHRTaWJsaW5nKSB7XG4gICAgaWYgKGNoLm5vZGVUeXBlICE9IDEpIGNvbnRpbnVlO1xuICAgIHZhciBvZmZzZXQgPSBjaC5nZXRBdHRyaWJ1dGUoXCJwbS1vZmZzZXRcIik7XG4gICAgaWYgKCFvZmZzZXQpIHtcbiAgICAgIHZhciBmb3VuZCA9IGZpbmRCeVBhdGgoY2gsIG4pO1xuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgfSBlbHNlIGlmICgrb2Zmc2V0ID09IG4pIHtcbiAgICAgIHJldHVybiBjaDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBhdGgocGFyZW50LCBwYXRoKSB7XG4gIHZhciBub2RlID0gcGFyZW50O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICBub2RlID0gZmluZEJ5UGF0aChub2RlLCBwYXRoW2ldKTtcbiAgICBpZiAoIW5vZGUpIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byByZXNvbHZlIHBhdGggXCIgKyBwYXRoLmpvaW4oXCIvXCIpKTtcbiAgfVxuICByZXR1cm4gbm9kZTtcbn1cblxuZnVuY3Rpb24gZmluZEJ5T2Zmc2V0KG5vZGUsIG9mZnNldCwgYWZ0ZXIpIHtcbiAgZnVuY3Rpb24gc2VhcmNoKG5vZGUpIHtcbiAgICBmb3IgKHZhciBjaCA9IG5vZGUuZmlyc3RDaGlsZCwgaSA9IDAsIGF0dHIgPSB1bmRlZmluZWQ7IGNoOyBjaCA9IGNoLm5leHRTaWJsaW5nLCBpKyspIHtcbiAgICAgIGlmIChjaC5ub2RlVHlwZSAhPSAxKSBjb250aW51ZTtcbiAgICAgIGlmIChhdHRyID0gY2guZ2V0QXR0cmlidXRlKFwicG0tb2Zmc2V0XCIpKSB7XG4gICAgICAgIHZhciBkaWZmID0gb2Zmc2V0IC0gK2F0dHIsXG4gICAgICAgICAgICB3aWR0aCA9IHdpZHRoRnJvbURPTShjaCk7XG4gICAgICAgIGlmIChkaWZmID49IDAgJiYgKGFmdGVyID8gZGlmZiA8PSB3aWR0aCA6IGRpZmYgPCB3aWR0aCkpIHJldHVybiB7IG5vZGU6IGNoLCBvZmZzZXQ6IGksIGlubmVyT2Zmc2V0OiBkaWZmIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVzdWx0ID0gc2VhcmNoKGNoKTtcbiAgICAgICAgaWYgKHJlc3VsdCkgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNlYXJjaChub2RlKTtcbn1cblxuZnVuY3Rpb24gbGVhZkF0KG5vZGUsIG9mZnNldCkge1xuICBmb3IgKDs7KSB7XG4gICAgdmFyIGNoaWxkID0gbm9kZS5maXJzdENoaWxkO1xuICAgIGlmICghY2hpbGQpIHJldHVybiB7IG5vZGU6IG5vZGUsIG9mZnNldDogb2Zmc2V0IH07XG4gICAgaWYgKGNoaWxkLm5vZGVUeXBlICE9IDEpIHJldHVybiB7IG5vZGU6IGNoaWxkLCBvZmZzZXQ6IG9mZnNldCB9O1xuICAgIGlmIChjaGlsZC5oYXNBdHRyaWJ1dGUoXCJwbS1pbm5lci1vZmZzZXRcIikpIHtcbiAgICAgIHZhciBub2RlT2Zmc2V0ID0gMDtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgdmFyIG5leHRTaWIgPSBjaGlsZC5uZXh0U2libGluZyxcbiAgICAgICAgICAgIG5leHRPZmZzZXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmICghbmV4dFNpYiB8fCAobmV4dE9mZnNldCA9ICtuZXh0U2liLmdldEF0dHJpYnV0ZShcInBtLWlubmVyLW9mZnNldFwiKSkgPj0gb2Zmc2V0KSBicmVhaztcbiAgICAgICAgY2hpbGQgPSBuZXh0U2liO1xuICAgICAgICBub2RlT2Zmc2V0ID0gbmV4dE9mZnNldDtcbiAgICAgIH1cbiAgICAgIG9mZnNldCAtPSBub2RlT2Zmc2V0O1xuICAgIH1cbiAgICBub2RlID0gY2hpbGQ7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgYSBET00gZWxlbWVudCBhdCBhIGdpdmVuIHBvc2l0aW9uIGluIHRoZSBkb2N1bWVudC5cbiAqXG4gKiBAcGFyYW0ge05vZGV9IHBhcmVudCBUaGUgcGFyZW50IERPTSBub2RlLlxuICogQHBhcmFtIHtQb3N9IHBvcyAgICAgVGhlIHBvc2l0aW9uIGluIHRoZSBkb2N1bWVudC5cbiAqIEByZXR1cm4ge09iamVjdH0gICAgIFRoZSBET00gbm9kZSBhbmQgY2hhcmFjdGVyIG9mZnNldCBpbnNpZGUgdGhlIG5vZGUuXG4gKi9cbmZ1bmN0aW9uIERPTUZyb21Qb3MocGFyZW50LCBwb3MpIHtcbiAgdmFyIGRvbSA9IHJlc29sdmVQYXRoKHBhcmVudCwgcG9zLnBhdGgpO1xuICB2YXIgZm91bmQgPSBmaW5kQnlPZmZzZXQoZG9tLCBwb3Mub2Zmc2V0LCB0cnVlKSxcbiAgICAgIGlubmVyID0gdW5kZWZpbmVkO1xuICBpZiAoIWZvdW5kKSByZXR1cm4geyBub2RlOiBkb20sIG9mZnNldDogMCB9O1xuICBpZiAoZm91bmQubm9kZS5nZXRBdHRyaWJ1dGUoXCJwbS1sZWFmXCIpID09IFwidHJ1ZVwiIHx8ICEoaW5uZXIgPSBsZWFmQXQoZm91bmQubm9kZSwgZm91bmQuaW5uZXJPZmZzZXQpKSkgcmV0dXJuIHsgbm9kZTogZm91bmQubm9kZS5wYXJlbnROb2RlLCBvZmZzZXQ6IGZvdW5kLm9mZnNldCArIChmb3VuZC5pbm5lck9mZnNldCA/IDEgOiAwKSB9O2Vsc2UgcmV0dXJuIGlubmVyO1xufVxuXG5mdW5jdGlvbiBoYXNGb2N1cyhwbSkge1xuICB2YXIgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICByZXR1cm4gc2VsLnJhbmdlQ291bnQgJiYgKDAsIF9kb20uY29udGFpbnMpKHBtLmNvbnRlbnQsIHNlbC5hbmNob3JOb2RlKTtcbn1cblxuLyoqXG4gKiBHaXZlbiBhbiB4LHkgcG9zaXRpb24gb24gdGhlIGVkaXRvciwgZ2V0IHRoZSBwb3NpdGlvbiBpbiB0aGUgZG9jdW1lbnQuXG4gKlxuICogQHBhcmFtICB7UHJvc2VNaXJyb3J9IHBtICAgICBFZGl0b3IgaW5zdGFuY2UuXG4gKiBAcGFyYW0gIHtPYmplY3R9ICAgICAgY29vcmRzIFRoZSB4LCB5IGNvb3JkaW5hdGVzLlxuICogQHJldHVybiB7UG9zfVxuICovXG4vLyBGSVhNRSBmYWlscyBvbiB0aGUgc3BhY2UgYmV0d2VlbiBsaW5lc1xuLy8gRklYTUUgcmVmb3JtdWxhdGUgYXMgc2VsZWN0aW9uQXRDb29yZHM/IFNvIHRoYXQgaXQgY2FuJ3QgcmV0dXJuIG51bGxcblxuZnVuY3Rpb24gcG9zQXRDb29yZHMocG0sIGNvb3Jkcykge1xuICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoY29vcmRzLmxlZnQsIGNvb3Jkcy50b3AgKyAxKTtcbiAgaWYgKCEoMCwgX2RvbS5jb250YWlucykocG0uY29udGVudCwgZWxlbWVudCkpIHJldHVybiBudWxsO1xuXG4gIHZhciBvZmZzZXQgPSB1bmRlZmluZWQ7XG4gIGlmIChlbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoID09IDEgJiYgZWxlbWVudC5maXJzdENoaWxkLm5vZGVUeXBlID09IDMpIHtcbiAgICBlbGVtZW50ID0gZWxlbWVudC5maXJzdENoaWxkO1xuICAgIG9mZnNldCA9IG9mZnNldEluVGV4dE5vZGUoZWxlbWVudCwgY29vcmRzKTtcbiAgfSBlbHNlIHtcbiAgICBvZmZzZXQgPSBvZmZzZXRJbkVsZW1lbnQoZWxlbWVudCwgY29vcmRzKTtcbiAgfVxuXG4gIHJldHVybiBwb3NGcm9tRE9NKHBtLCBlbGVtZW50LCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiB0ZXh0UmVjdChub2RlLCBmcm9tLCB0bykge1xuICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICByYW5nZS5zZXRFbmQobm9kZSwgdG8pO1xuICByYW5nZS5zZXRTdGFydChub2RlLCBmcm9tKTtcbiAgcmV0dXJuIHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xufVxuXG4vKipcbiAqIEdpdmVuIGEgcG9zaXRpb24gaW4gdGhlIGRvY3VtZW50IG1vZGVsLCBnZXQgYSBib3VuZGluZyBib3ggb2YgdGhlIGNoYXJhY3RlciBhdFxuICogdGhhdCBwb3NpdGlvbiwgcmVsYXRpdmUgdG8gdGhlIHdpbmRvdy5cbiAqXG4gKiBAcGFyYW0gIHtQcm9zZU1pcnJvcn0gcG0gVGhlIGVkaXRvciBpbnN0YW5jZS5cbiAqIEBwYXJhbSAge1Bvc30gICAgICAgICBwb3NcbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIGJvdW5kaW5nIGJveC5cbiAqL1xuXG5mdW5jdGlvbiBjb29yZHNBdFBvcyhwbSwgcG9zKSB7XG4gIHZhciBfRE9NRnJvbVBvcyA9IERPTUZyb21Qb3MocG0uY29udGVudCwgcG9zKTtcblxuICB2YXIgbm9kZSA9IF9ET01Gcm9tUG9zLm5vZGU7XG4gIHZhciBvZmZzZXQgPSBfRE9NRnJvbVBvcy5vZmZzZXQ7XG5cbiAgdmFyIHNpZGUgPSB1bmRlZmluZWQsXG4gICAgICByZWN0ID0gdW5kZWZpbmVkO1xuICBpZiAobm9kZS5ub2RlVHlwZSA9PSAzKSB7XG4gICAgaWYgKG9mZnNldCA8IG5vZGUubm9kZVZhbHVlLmxlbmd0aCkge1xuICAgICAgcmVjdCA9IHRleHRSZWN0KG5vZGUsIG9mZnNldCwgb2Zmc2V0ICsgMSk7XG4gICAgICBzaWRlID0gXCJsZWZ0XCI7XG4gICAgfVxuICAgIGlmICgoIXJlY3QgfHwgcmVjdC5sZWZ0ID09IHJlY3QucmlnaHQpICYmIG9mZnNldCkge1xuICAgICAgcmVjdCA9IHRleHRSZWN0KG5vZGUsIG9mZnNldCAtIDEsIG9mZnNldCk7XG4gICAgICBzaWRlID0gXCJyaWdodFwiO1xuICAgIH1cbiAgfSBlbHNlIGlmIChub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICBpZiAob2Zmc2V0IDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCkge1xuICAgICAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldF07XG4gICAgICByZWN0ID0gY2hpbGQubm9kZVR5cGUgPT0gMyA/IHRleHRSZWN0KGNoaWxkLCAwLCBjaGlsZC5ub2RlVmFsdWUubGVuZ3RoKSA6IGNoaWxkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgc2lkZSA9IFwibGVmdFwiO1xuICAgIH1cbiAgICBpZiAoKCFyZWN0IHx8IHJlY3QubGVmdCA9PSByZWN0LnJpZ2h0KSAmJiBvZmZzZXQpIHtcbiAgICAgIHZhciBjaGlsZCA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXTtcbiAgICAgIHJlY3QgPSBjaGlsZC5ub2RlVHlwZSA9PSAzID8gdGV4dFJlY3QoY2hpbGQsIDAsIGNoaWxkLm5vZGVWYWx1ZS5sZW5ndGgpIDogY2hpbGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBzaWRlID0gXCJyaWdodFwiO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZWN0ID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBzaWRlID0gXCJsZWZ0XCI7XG4gIH1cbiAgdmFyIHggPSByZWN0W3NpZGVdO1xuICByZXR1cm4geyB0b3A6IHJlY3QudG9wLCBib3R0b206IHJlY3QuYm90dG9tLCBsZWZ0OiB4LCByaWdodDogeCB9O1xufVxuXG52YXIgc2Nyb2xsTWFyZ2luID0gNTtcblxuZnVuY3Rpb24gc2Nyb2xsSW50b1ZpZXcocG0sIHBvcykge1xuICBpZiAoIXBvcykgcG9zID0gcG0uc2VsLnJhbmdlLmhlYWQgfHwgcG0uc2VsLnJhbmdlLmZyb207XG4gIHZhciBjb29yZHMgPSBjb29yZHNBdFBvcyhwbSwgcG9zKTtcbiAgZm9yICh2YXIgX3BhcmVudDIgPSBwbS5jb250ZW50OzsgX3BhcmVudDIgPSBfcGFyZW50Mi5wYXJlbnROb2RlKSB7XG4gICAgdmFyIGF0Qm9keSA9IF9wYXJlbnQyID09IGRvY3VtZW50LmJvZHk7XG4gICAgdmFyIHJlY3QgPSBhdEJvZHkgPyB3aW5kb3dSZWN0KCkgOiBfcGFyZW50Mi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB2YXIgbW92ZVggPSAwLFxuICAgICAgICBtb3ZlWSA9IDA7XG4gICAgaWYgKGNvb3Jkcy50b3AgPCByZWN0LnRvcCkgbW92ZVkgPSAtKHJlY3QudG9wIC0gY29vcmRzLnRvcCArIHNjcm9sbE1hcmdpbik7ZWxzZSBpZiAoY29vcmRzLmJvdHRvbSA+IHJlY3QuYm90dG9tKSBtb3ZlWSA9IGNvb3Jkcy5ib3R0b20gLSByZWN0LmJvdHRvbSArIHNjcm9sbE1hcmdpbjtcbiAgICBpZiAoY29vcmRzLmxlZnQgPCByZWN0LmxlZnQpIG1vdmVYID0gLShyZWN0LmxlZnQgLSBjb29yZHMubGVmdCArIHNjcm9sbE1hcmdpbik7ZWxzZSBpZiAoY29vcmRzLnJpZ2h0ID4gcmVjdC5yaWdodCkgbW92ZVggPSBjb29yZHMucmlnaHQgLSByZWN0LnJpZ2h0ICsgc2Nyb2xsTWFyZ2luO1xuICAgIGlmIChtb3ZlWCB8fCBtb3ZlWSkge1xuICAgICAgaWYgKGF0Qm9keSkgd2luZG93LnNjcm9sbEJ5KG1vdmVYLCBtb3ZlWSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChtb3ZlWSkgX3BhcmVudDIuc2Nyb2xsVG9wICs9IG1vdmVZO1xuICAgICAgaWYgKG1vdmVYKSBfcGFyZW50Mi5zY3JvbGxMZWZ0ICs9IG1vdmVYO1xuICAgIH1cbiAgICBpZiAoYXRCb2R5KSBicmVhaztcbiAgfVxufVxuXG5mdW5jdGlvbiBvZmZzZXRJblJlY3RzKGNvb3JkcywgcmVjdHMsIHN0cmljdCkge1xuICB2YXIgeSA9IGNvb3Jkcy50b3A7XG4gIHZhciB4ID0gY29vcmRzLmxlZnQ7XG5cbiAgdmFyIG1pblkgPSAxZTgsXG4gICAgICBtaW5YID0gMWU4LFxuICAgICAgb2Zmc2V0ID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWN0cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciByZWN0ID0gcmVjdHNbaV07XG4gICAgaWYgKCFyZWN0IHx8IHJlY3QudG9wID09IHJlY3QuYm90dG9tKSBjb250aW51ZTtcbiAgICB2YXIgZFggPSB4IDwgcmVjdC5sZWZ0ID8gcmVjdC5sZWZ0IC0geCA6IHggPiByZWN0LnJpZ2h0ID8geCAtIHJlY3QucmlnaHQgOiAwO1xuICAgIGlmIChkWCA+IG1pblgpIGNvbnRpbnVlO1xuICAgIGlmIChkWCA8IG1pblgpIHtcbiAgICAgIG1pblggPSBkWDttaW5ZID0gMWU4O1xuICAgIH1cbiAgICB2YXIgZFkgPSB5IDwgcmVjdC50b3AgPyByZWN0LnRvcCAtIHkgOiB5ID4gcmVjdC5ib3R0b20gPyB5IC0gcmVjdC5ib3R0b20gOiAwO1xuICAgIGlmIChkWSA8IG1pblkpIHtcbiAgICAgIG1pblkgPSBkWTtcbiAgICAgIG9mZnNldCA9IHggPCAocmVjdC5sZWZ0ICsgcmVjdC5yaWdodCkgLyAyID8gaSA6IGkgKyAxO1xuICAgIH1cbiAgfVxuICBpZiAoc3RyaWN0ICYmIChtaW5YIHx8IG1pblkpKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIG9mZnNldDtcbn1cblxuZnVuY3Rpb24gb2Zmc2V0SW5UZXh0Tm9kZSh0ZXh0LCBjb29yZHMsIHN0cmljdCkge1xuICB2YXIgbGVuID0gdGV4dC5ub2RlVmFsdWUubGVuZ3RoO1xuICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICB2YXIgcmVjdHMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHJhbmdlLnNldEVuZCh0ZXh0LCBpICsgMSk7XG4gICAgcmFuZ2Uuc2V0U3RhcnQodGV4dCwgaSk7XG4gICAgcmVjdHMucHVzaChyYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG4gIH1cbiAgcmV0dXJuIG9mZnNldEluUmVjdHMoY29vcmRzLCByZWN0cywgc3RyaWN0KTtcbn1cblxuZnVuY3Rpb24gb2Zmc2V0SW5FbGVtZW50KGVsZW1lbnQsIGNvb3Jkcykge1xuICB2YXIgcmVjdHMgPSBbXTtcbiAgZm9yICh2YXIgY2hpbGQgPSBlbGVtZW50LmZpcnN0Q2hpbGQ7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nKSB7XG4gICAgaWYgKGNoaWxkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCkgcmVjdHMucHVzaChjaGlsZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7ZWxzZSByZWN0cy5wdXNoKG51bGwpO1xuICB9XG4gIHJldHVybiBvZmZzZXRJblJlY3RzKGNvb3JkcywgcmVjdHMpO1xufVxuXG5mdW5jdGlvbiBmaW5kU2VsZWN0aW9uSW4oZG9jLCBwYXRoLCBvZmZzZXQsIGRpciwgdGV4dCkge1xuICB2YXIgbm9kZSA9IGRvYy5wYXRoKHBhdGgpO1xuICBpZiAobm9kZS5pc1RleHRibG9jaykgcmV0dXJuIG5ldyBUZXh0U2VsZWN0aW9uKG5ldyBfbW9kZWwuUG9zKHBhdGgsIG9mZnNldCkpO1xuXG4gIGZvciAodmFyIGkgPSBvZmZzZXQgKyAoZGlyID4gMCA/IDAgOiAtMSk7IGRpciA+IDAgPyBpIDwgbm9kZS5zaXplIDogaSA+PSAwOyBpICs9IGRpcikge1xuICAgIHZhciBjaGlsZCA9IG5vZGUuY2hpbGQoaSk7XG4gICAgaWYgKCF0ZXh0ICYmIGNoaWxkLnR5cGUuY29udGFpbnMgPT0gbnVsbCAmJiBjaGlsZC50eXBlLnNlbGVjdGFibGUpIHJldHVybiBuZXcgTm9kZVNlbGVjdGlvbihuZXcgX21vZGVsLlBvcyhwYXRoLCBpKSwgbmV3IF9tb2RlbC5Qb3MocGF0aCwgaSArIDEpLCBjaGlsZCk7XG4gICAgcGF0aC5wdXNoKGkpO1xuICAgIHZhciBpbnNpZGUgPSBmaW5kU2VsZWN0aW9uSW4oZG9jLCBwYXRoLCBkaXIgPCAwID8gY2hpbGQuc2l6ZSA6IDAsIGRpciwgdGV4dCk7XG4gICAgaWYgKGluc2lkZSkgcmV0dXJuIGluc2lkZTtcbiAgICBwYXRoLnBvcCgpO1xuICB9XG59XG5cbi8vIEZJWE1FIHdlJ2xsIG5lZWQgc29tZSBhd2FyZW5lc3Mgb2YgYmlkaSBtb3Rpb24gd2hlbiBkZXRlcm1pbmluZyBibG9jayBzdGFydCBhbmQgZW5kXG5cbmZ1bmN0aW9uIGZpbmRTZWxlY3Rpb25Gcm9tKGRvYywgcG9zLCBkaXIsIHRleHQpIHtcbiAgZm9yICh2YXIgcGF0aCA9IHBvcy5wYXRoLnNsaWNlKCksIG9mZnNldCA9IHBvcy5vZmZzZXQ7Oykge1xuICAgIHZhciBmb3VuZCA9IGZpbmRTZWxlY3Rpb25Jbihkb2MsIHBhdGgsIG9mZnNldCwgZGlyLCB0ZXh0KTtcbiAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICBpZiAoIXBhdGgubGVuZ3RoKSBicmVhaztcbiAgICBvZmZzZXQgPSBwYXRoLnBvcCgpICsgKGRpciA+IDAgPyAxIDogMCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZFNlbGVjdGlvbk5lYXIoZG9jLCBwb3MsIGJpYXMsIHRleHQpIHtcbiAgaWYgKGJpYXMgPT09IHVuZGVmaW5lZCkgYmlhcyA9IDE7XG5cbiAgdmFyIHJlc3VsdCA9IGZpbmRTZWxlY3Rpb25Gcm9tKGRvYywgcG9zLCBiaWFzLCB0ZXh0KSB8fCBmaW5kU2VsZWN0aW9uRnJvbShkb2MsIHBvcywgLWJpYXMsIHRleHQpO1xuICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKFwiU2VhcmNoaW5nIGZvciBzZWxlY3Rpb24gaW4gaW52YWxpZCBkb2N1bWVudCBcIiArIGRvYyk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGZpbmRTZWxlY3Rpb25BdFN0YXJ0KG5vZGUsIHBhdGgsIHRleHQpIHtcbiAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkgcGF0aCA9IFtdO1xuXG4gIHJldHVybiBmaW5kU2VsZWN0aW9uSW4obm9kZSwgcGF0aC5zbGljZSgpLCAwLCAxLCB0ZXh0KTtcbn1cblxuZnVuY3Rpb24gZmluZFNlbGVjdGlvbkF0RW5kKG5vZGUsIHBhdGgsIHRleHQpIHtcbiAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkgcGF0aCA9IFtdO1xuXG4gIHJldHVybiBmaW5kU2VsZWN0aW9uSW4obm9kZSwgcGF0aC5zbGljZSgpLCBub2RlLnNpemUsIC0xLCB0ZXh0KTtcbn1cblxuLy8gOzsgI3BhdGg9Tm9kZVR5cGUgI2tpbmQ9Y2xhc3MgI25vQW5jaG9yXG4vLyBZb3UgY2FuIGFkZCBzZXZlcmFsIHByb3BlcnRpZXMgdG8gW25vZGUgdHlwZXNdKCNOb2RlVHlwZSkgdG9cbi8vIGluZmx1ZW5jZSB0aGUgd2F5IHRoZSBlZGl0b3IgaW50ZXJhY3RzIHdpdGggdGhlbS5cblxuLy8gOjogKG5vZGU6IE5vZGUsIHBhdGg6IFtudW1iZXJdLCBkb206IERPTU5vZGUsIGNvb3Jkczoge2xlZnQ6IG51bWJlciwgdG9wOiBudW1iZXJ9KSDihpIgP1Bvc1xuLy8gI3BhdGg9Tm9kZVR5cGUucHJvdG90eXBlLmNvdW50Q29vcmRzQXNDaGlsZFxuLy8gU3BlY2lmaWVzIHRoYXQsIGlmIHRoaXMgbm9kZSBpcyBjbGlja2VkLCBhIGNoaWxkIG5vZGUgbWlnaHRcbi8vIGFjdHVhbGx5IGJlIG1lYW50LiBUaGlzIGlzIHVzZWQgdG8sIGZvciBleGFtcGxlLCBtYWtlIGNsaWNraW5nIGFcbi8vIGxpc3QgbWFya2VyICh3aGljaCwgaW4gdGhlIERPTSwgaXMgcGFydCBvZiB0aGUgbGlzdCBub2RlKSBzZWxlY3Rcbi8vIHRoZSBsaXN0IGl0ZW0gaXQgYmVsb25ncyB0by4gU2hvdWxkIHJldHVybiBudWxsIGlmIHRoZSBnaXZlblxuLy8gY29vcmRpbmF0ZXMgZG9uJ3QgcmVmZXIgdG8gYSBjaGlsZCBub2RlLCBvciB0aGUgW3Bvc2l0aW9uXSgjUG9zKVxuLy8gYmVmb3JlIHRoZWNoaWxkIG90aGVyd2lzZS5cblxuZnVuY3Rpb24gc2VsZWN0YWJsZU5vZGVBYm92ZShwbSwgZG9tLCBjb29yZHMsIGxpYmVyYWwpIHtcbiAgZm9yICg7IGRvbSAmJiBkb20gIT0gcG0uY29udGVudDsgZG9tID0gZG9tLnBhcmVudE5vZGUpIHtcbiAgICBpZiAoZG9tLmhhc0F0dHJpYnV0ZShcInBtLW9mZnNldFwiKSkge1xuICAgICAgdmFyIHBhdGggPSBwYXRoRnJvbURPTShwbSwgZG9tKSxcbiAgICAgICAgICBub2RlID0gcG0uZG9jLnBhdGgocGF0aCk7XG4gICAgICBpZiAobm9kZS50eXBlLmNvdW50Q29vcmRzQXNDaGlsZCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbm9kZS50eXBlLmNvdW50Q29vcmRzQXNDaGlsZChub2RlLCBwYXRoLCBkb20sIGNvb3Jkcyk7XG4gICAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICAvLyBMZWFmIG5vZGVzIGFyZSBpbXBsaWNpdGx5IGNsaWNrYWJsZVxuICAgICAgaWYgKChsaWJlcmFsIHx8IG5vZGUudHlwZS5jb250YWlucyA9PSBudWxsKSAmJiBub2RlLnR5cGUuc2VsZWN0YWJsZSkgcmV0dXJuIF9tb2RlbC5Qb3MuZnJvbShwYXRoKTtcbiAgICAgIGlmICghbGliZXJhbCkgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59XG5cbi8vIDo6IChwbTogUHJvc2VNaXJyb3IsIGV2ZW50OiBNb3VzZUV2ZW50LCBwYXRoOiBbbnVtYmVyXSwgbm9kZTogTm9kZSkg4oaSIGJvb2xcbi8vICNwYXRoPU5vZGVUeXBlLnByb3RvdHlwZS5oYW5kbGVDbGlja1xuLy8gSWYgYSBub2RlIGlzIGRpcmVjdGx5IGNsaWNrZWQgKHRoYXQgaXMsIHRoZSBjbGljayBkaWRuJ3QgbGFuZCBpbiBhXG4vLyBET00gbm9kZSBiZWxvbmdpbmcgdG8gYSBjaGlsZCBub2RlKSwgYW5kIGl0cyB0eXBlIGhhcyBhXG4vLyBgaGFuZGxlQ2xpY2tgIG1ldGhvZCwgdGhhdCBtZXRob2QgaXMgZ2l2ZW4gYSBjaGFuY2UgdG8gaGFuZGxlIHRoZVxuLy8gY2xpY2suIFRoZSBtZXRob2QgaXMgY2FsbGVkLCBhbmQgc2hvdWxkIHJldHVybiBgZmFsc2VgIGlmIGl0IGRpZFxuLy8gX25vdF8gaGFuZGxlIHRoZSBjbGljay5cbi8vXG4vLyBUaGUgYGV2ZW50YCBwYXNzZWQgaXMgdGhlIGV2ZW50IGZvciBgXCJtb3VzZWRvd25cImAsIGJ1dCBjYWxsaW5nXG4vLyBgcHJldmVudERlZmF1bHRgIG9uIGl0IGhhcyBubyBlZmZlY3QsIHNpbmNlIHRoaXMgbWV0aG9kIGlzIG9ubHlcbi8vIGNhbGxlZCBhZnRlciBhIGNvcnJlc3BvbmRpbmcgYFwibW91c2V1cFwiYCBoYXMgb2NjdXJyZWQgYW5kXG4vLyBQcm9zZU1pcnJvciBoYXMgZGV0ZXJtaW5lZCB0aGF0IHRoaXMgaXMgbm90IGEgZHJhZyBvciBtdWx0aS1jbGlja1xuLy8gZXZlbnQuXG5cbmZ1bmN0aW9uIGhhbmRsZU5vZGVDbGljayhwbSwgZXZlbnQpIHtcbiAgZm9yICh2YXIgZG9tID0gZXZlbnQudGFyZ2V0OyBkb20gJiYgZG9tICE9IHBtLmNvbnRlbnQ7IGRvbSA9IGRvbS5wYXJlbnROb2RlKSB7XG4gICAgaWYgKGRvbS5oYXNBdHRyaWJ1dGUoXCJwbS1vZmZzZXRcIikpIHtcbiAgICAgIHZhciBwYXRoID0gcGF0aEZyb21ET00ocG0sIGRvbSksXG4gICAgICAgICAgbm9kZSA9IHBtLmRvYy5wYXRoKHBhdGgpO1xuICAgICAgcmV0dXJuIG5vZGUudHlwZS5oYW5kbGVDbGljayAmJiBub2RlLnR5cGUuaGFuZGxlQ2xpY2socG0sIGV2ZW50LCBwYXRoLCBub2RlKSAhPT0gZmFsc2U7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHZlcnRpY2FsTW90aW9uTGVhdmVzVGV4dGJsb2NrKHBtLCBwb3MsIGRpcikge1xuICB2YXIgZG9tID0gcmVzb2x2ZVBhdGgocG0uY29udGVudCwgcG9zLnBhdGgpO1xuICB2YXIgY29vcmRzID0gY29vcmRzQXRQb3MocG0sIHBvcyk7XG4gIGZvciAodmFyIGNoaWxkID0gZG9tLmZpcnN0Q2hpbGQ7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nKSB7XG4gICAgaWYgKGNoaWxkLm5vZGVUeXBlICE9IDEpIGNvbnRpbnVlO1xuICAgIHZhciBib3hlcyA9IGNoaWxkLmdldENsaWVudFJlY3RzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBib3hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGJveCA9IGJveGVzW2ldO1xuICAgICAgaWYgKGRpciA8IDAgPyBib3guYm90dG9tIDwgY29vcmRzLnRvcCA6IGJveC50b3AgPiBjb29yZHMuYm90dG9tKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBzZXRET01TZWxlY3Rpb25Ub1BvcyhwbSwgcG9zKSB7XG4gIHZhciBfRE9NRnJvbVBvczIgPSBET01Gcm9tUG9zKHBtLmNvbnRlbnQsIHBvcyk7XG5cbiAgdmFyIG5vZGUgPSBfRE9NRnJvbVBvczIubm9kZTtcbiAgdmFyIG9mZnNldCA9IF9ET01Gcm9tUG9zMi5vZmZzZXQ7XG5cbiAgdmFyIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgcmFuZ2Uuc2V0RW5kKG5vZGUsIG9mZnNldCk7XG4gIHJhbmdlLnNldFN0YXJ0KG5vZGUsIG9mZnNldCk7XG4gIHZhciBzZWwgPSBnZXRTZWxlY3Rpb24oKTtcbiAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX21vZGVsID0gcmVxdWlyZShcIi4uL21vZGVsXCIpO1xuXG52YXIgX2VkaXQgPSByZXF1aXJlKFwiLi4vZWRpdFwiKTtcblxudmFyIF9pbnB1dHJ1bGVzID0gcmVxdWlyZShcIi4vaW5wdXRydWxlc1wiKTtcblxuLy8gOjogYm9vbCAjcGF0aD1hdXRvSW5wdXQgI2tpbmQ9b3B0aW9uXG4vLyBXaGVuIHNldCB0byB0cnVlLCBlbmFibGVzIHRoZSBpbnB1dCBydWxlcyBzdG9yZWQgdW5kZXIgdGhlXG4vLyBgXCJhdXRvSW5wdXRcImAgbmFtZSBpbiB0aGUgZWRpdG9yJ3Ncbi8vIFtgcmVnaXN0cnlgXSgjUHJvc2VNaXJyb3IucmVnaXN0cnkp4oCUYnkgZGVmYXVsdCwgdGhlc2UgYXJlIHRoaW5nc1xuLy8gbGlrZSBzbWFydCBxdW90ZXMsIGFuZCBhdXRvbWF0aWNhbGx5IHdyYXBwaW5nIGEgYmxvY2sgaW4gYSBsaXN0IGlmXG4vLyB5b3Ugc3RhcnQgaXQgd2l0aCBgXCIxLiBcImAuXG4oMCwgX2VkaXQuZGVmaW5lT3B0aW9uKShcImF1dG9JbnB1dFwiLCBmYWxzZSwgZnVuY3Rpb24gKHBtLCB2YWwpIHtcbiAgaWYgKHBtLm1vZC5hdXRvSW5wdXQpIHtcbiAgICBwbS5tb2QuYXV0b0lucHV0LmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHJldHVybiAoMCwgX2lucHV0cnVsZXMucmVtb3ZlSW5wdXRSdWxlKShwbSwgbmFtZSk7XG4gICAgfSk7XG4gICAgcG0ubW9kLmF1dG9JbnB1dCA9IG51bGw7XG4gIH1cbiAgaWYgKHZhbCkge1xuICAgIHBtLm1vZC5hdXRvSW5wdXQgPSBbXTtcbiAgICBwbS5yZWdpc3RyeShcImF1dG9JbnB1dFwiLCBmdW5jdGlvbiAocnVsZSwgdHlwZSkge1xuICAgICAgcG0ubW9kLmF1dG9JbnB1dC5wdXNoKHJ1bGUubmFtZSk7XG4gICAgICBpZiAocnVsZS5oYW5kbGVyLmJpbmQpIHJ1bGUgPSBuZXcgX2lucHV0cnVsZXMuSW5wdXRSdWxlKHJ1bGUubmFtZSwgcnVsZS5tYXRjaCwgcnVsZS5maWx0ZXIsIHJ1bGUuaGFuZGxlci5iaW5kKHR5cGUpKTtcbiAgICAgICgwLCBfaW5wdXRydWxlcy5hZGRJbnB1dFJ1bGUpKHBtLCBydWxlKTtcbiAgICB9KTtcbiAgfVxufSk7XG5cbl9lZGl0LmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImF1dG9JbnB1dFwiLCBuZXcgX2lucHV0cnVsZXMuSW5wdXRSdWxlKFwiZW1EYXNoXCIsIC8tLSQvLCBcIi1cIiwgXCLigJRcIikpO1xuXG5fZWRpdC5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJhdXRvSW5wdXRcIiwgbmV3IF9pbnB1dHJ1bGVzLklucHV0UnVsZShcIm9wZW5Eb3VibGVRdW90ZVwiLCAvXFxzKFwiKSQvLCAnXCInLCBcIuKAnFwiKSk7XG5cbl9lZGl0LmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImF1dG9JbnB1dFwiLCBuZXcgX2lucHV0cnVsZXMuSW5wdXRSdWxlKFwiY2xvc2VEb3VibGVRdW90ZVwiLCAvXCIkLywgJ1wiJywgXCLigJ1cIikpO1xuXG5fZWRpdC5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJhdXRvSW5wdXRcIiwgbmV3IF9pbnB1dHJ1bGVzLklucHV0UnVsZShcIm9wZW5TaW5nbGVRdW90ZVwiLCAvXFxzKCcpJC8sIFwiJ1wiLCBcIuKAmFwiKSk7XG5cbl9lZGl0LmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImF1dG9JbnB1dFwiLCBuZXcgX2lucHV0cnVsZXMuSW5wdXRSdWxlKFwiY2xvc2VTaW5nbGVRdW90ZVwiLCAvJyQvLCBcIidcIiwgXCLigJlcIikpO1xuXG5fbW9kZWwuQmxvY2tRdW90ZS5yZWdpc3RlcihcImF1dG9JbnB1dFwiLCBuZXcgX2lucHV0cnVsZXMuSW5wdXRSdWxlKFwic3RhcnRCbG9ja1F1b3RlXCIsIC9eXFxzKj4gJC8sIFwiIFwiLCBmdW5jdGlvbiAocG0sIF8sIHBvcykge1xuICB3cmFwQW5kSm9pbihwbSwgcG9zLCB0aGlzKTtcbn0pKTtcblxuX21vZGVsLk9yZGVyZWRMaXN0LnJlZ2lzdGVyKFwiYXV0b0lucHV0XCIsIG5ldyBfaW5wdXRydWxlcy5JbnB1dFJ1bGUoXCJzdGFydE9yZGVyZWRMaXN0XCIsIC9eKFxcZCspXFwuICQvLCBcIiBcIiwgZnVuY3Rpb24gKHBtLCBtYXRjaCwgcG9zKSB7XG4gIHZhciBvcmRlciA9ICttYXRjaFsxXTtcbiAgd3JhcEFuZEpvaW4ocG0sIHBvcywgdGhpcywgeyBvcmRlcjogb3JkZXIgfHwgbnVsbCB9LCBmdW5jdGlvbiAobm9kZSkge1xuICAgIHJldHVybiBub2RlLnNpemUgKyAobm9kZS5hdHRycy5vcmRlciB8fCAxKSA9PSBvcmRlcjtcbiAgfSk7XG59KSk7XG5cbl9tb2RlbC5CdWxsZXRMaXN0LnJlZ2lzdGVyKFwiYXV0b0lucHV0XCIsIG5ldyBfaW5wdXRydWxlcy5JbnB1dFJ1bGUoXCJzdGFydEJ1bGxldExpc3RcIiwgL15cXHMqKFstKypdKSAkLywgXCIgXCIsIGZ1bmN0aW9uIChwbSwgbWF0Y2gsIHBvcykge1xuICB2YXIgYnVsbGV0ID0gbWF0Y2hbMV07XG4gIHdyYXBBbmRKb2luKHBtLCBwb3MsIHRoaXMsIG51bGwsIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUuYXR0cnMuYnVsbGV0ID09IGJ1bGxldDtcbiAgfSk7XG59KSk7XG5cbl9tb2RlbC5Db2RlQmxvY2sucmVnaXN0ZXIoXCJhdXRvSW5wdXRcIiwgbmV3IF9pbnB1dHJ1bGVzLklucHV0UnVsZShcInN0YXJ0Q29kZUJsb2NrXCIsIC9eYGBgJC8sIFwiYFwiLCBmdW5jdGlvbiAocG0sIF8sIHBvcykge1xuICBzZXRBcyhwbSwgcG9zLCB0aGlzLCB7IHBhcmFtczogXCJcIiB9KTtcbn0pKTtcblxuX21vZGVsLkhlYWRpbmcucmVnaXN0ZXIoXCJhdXRvSW5wdXRcIiwgbmV3IF9pbnB1dHJ1bGVzLklucHV0UnVsZShcInN0YXJ0SGVhZGluZ1wiLCAvXigjezEsNn0pICQvLCBcIiBcIiwgZnVuY3Rpb24gKHBtLCBtYXRjaCwgcG9zKSB7XG4gIHNldEFzKHBtLCBwb3MsIHRoaXMsIHsgbGV2ZWw6IG1hdGNoWzFdLmxlbmd0aCB9KTtcbn0pKTtcblxuZnVuY3Rpb24gd3JhcEFuZEpvaW4ocG0sIHBvcywgdHlwZSkge1xuICB2YXIgYXR0cnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDMgfHwgYXJndW1lbnRzWzNdID09PSB1bmRlZmluZWQgPyBudWxsIDogYXJndW1lbnRzWzNdO1xuICB2YXIgcHJlZGljYXRlID0gYXJndW1lbnRzLmxlbmd0aCA8PSA0IHx8IGFyZ3VtZW50c1s0XSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGFyZ3VtZW50c1s0XTtcblxuICB2YXIgYmVmb3JlID0gcG9zLnNob3J0ZW4oKTtcbiAgdmFyIHNpYmxpbmcgPSBiZWZvcmUub2Zmc2V0ID4gMCAmJiBwbS5kb2MucGF0aChiZWZvcmUucGF0aCkuY2hpbGQoYmVmb3JlLm9mZnNldCAtIDEpO1xuICB2YXIgam9pbiA9IHNpYmxpbmcgJiYgc2libGluZy50eXBlLm5hbWUgPT0gdHlwZSAmJiAoIXByZWRpY2F0ZSB8fCBwcmVkaWNhdGUoc2libGluZykpO1xuICB2YXIgdHIgPSBwbS50ci53cmFwKHBvcywgcG9zLCB0eXBlLCBhdHRycyk7XG4gIHZhciBkZWxQb3MgPSB0ci5tYXAocG9zKS5wb3M7XG4gIHRyW1wiZGVsZXRlXCJdKG5ldyBfbW9kZWwuUG9zKGRlbFBvcy5wYXRoLCAwKSwgZGVsUG9zKTtcbiAgaWYgKGpvaW4pIHRyLmpvaW4oYmVmb3JlKTtcbiAgdHIuYXBwbHkoKTtcbn1cblxuZnVuY3Rpb24gc2V0QXMocG0sIHBvcywgdHlwZSwgYXR0cnMpIHtcbiAgcG0udHIuc2V0QmxvY2tUeXBlKHBvcywgcG9zLCB0eXBlLCBhdHRycylbXCJkZWxldGVcIl0obmV3IF9tb2RlbC5Qb3MocG9zLnBhdGgsIDApLCBwb3MpLmFwcGx5KCk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZXhwb3J0cy5hZGRJbnB1dFJ1bGUgPSBhZGRJbnB1dFJ1bGU7XG5leHBvcnRzLnJlbW92ZUlucHV0UnVsZSA9IHJlbW92ZUlucHV0UnVsZTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIF9tb2RlbCA9IHJlcXVpcmUoXCIuLi9tb2RlbFwiKTtcblxudmFyIF9lZGl0ID0gcmVxdWlyZShcIi4uL2VkaXRcIik7XG5cbi8vIDo6IChQcm9zZU1pcnJvciwgSW5wdXRSdWxlKVxuLy8gQWRkIHRoZSBnaXZlbiBbaW5wdXQgcnVsZV0oI0lucHV0UnVsZSkgdG8gYW4gZWRpdG9yLiBGcm9tIG5vdyBvbixcbi8vIHdoZW5ldmVyIHRoZSBydWxlJ3MgcGF0dGVybiBpcyB0eXBlZCwgaXRzIGhhbmRsZXIgaXMgYWN0aXZhdGVkLlxuLy9cbi8vIE5vdGUgdGhhdCB0aGUgZWZmZWN0IG9mIGFuIGlucHV0IHJ1bGUgY2FuIGJlIGNhbmNlbGVkIGJ5IHByZXNzaW5nXG4vLyBCYWNrc3BhY2UgcmlnaHQgYWZ0ZXIgaXQgaGFwcGVucy5cblxuZnVuY3Rpb24gYWRkSW5wdXRSdWxlKHBtLCBydWxlKSB7XG4gIGlmICghcG0ubW9kLmludGVycHJldElucHV0KSBwbS5tb2QuaW50ZXJwcmV0SW5wdXQgPSBuZXcgSW5wdXRSdWxlcyhwbSk7XG4gIHBtLm1vZC5pbnRlcnByZXRJbnB1dC5hZGRSdWxlKHJ1bGUpO1xufVxuXG4vLyA6OiAoUHJvc2VNaXJyb3IsIHN0cmluZylcbi8vIFJlbW92ZSB0aGUgaW5wdXQgcnVsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIChhZGRlZCBlYXJsaWVyIHdpdGhcbi8vIGBhZGRJbnB1dFJ1bGVgKSBmcm9tIHRoZSBlZGl0b3IuXG5cbmZ1bmN0aW9uIHJlbW92ZUlucHV0UnVsZShwbSwgbmFtZSkge1xuICB2YXIgaWkgPSBwbS5tb2QuaW50ZXJwcmV0SW5wdXQ7XG4gIGlmICghaWkpIHJldHVybjtcbiAgaWkucmVtb3ZlUnVsZShuYW1lKTtcbiAgaWYgKGlpLnJ1bGVzLmxlbmd0aCA9PSAwKSB7XG4gICAgaWkudW5yZWdpc3RlcigpO1xuICAgIHBtLm1vZC5pbnRlcnByZXRJbnB1dCA9IG51bGw7XG4gIH1cbn1cblxuLy8gOzsgSW5wdXQgcnVsZXMgYXJlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgZGVzY3JpYmluZyBhIHBpZWNlIG9mIHRleHRcbi8vIHRoYXQsIHdoZW4gdHlwZWQsIGNhdXNlcyBzb21ldGhpbmcgdG8gaGFwcGVuLiBUaGlzIG1pZ2h0IGJlXG4vLyBjaGFuZ2luZyB0d28gZGFzaGVzIGludG8gYW4gZW1kYXNoLCB3cmFwcGluZyBhIHBhcmFncmFwaCBzdGFydGluZ1xuLy8gd2l0aCBgXCI+IFwiYCBpbnRvIGEgYmxvY2txdW90ZSwgb3Igc29tZXRoaW5nIGVudGlyZWx5IGRpZmZlcmVudC5cblxudmFyIElucHV0UnVsZSA9XG4vLyA6OiAoc3RyaW5nLCBSZWdFeHAsID9zdHJpbmcsIHVuaW9uPHN0cmluZywgKFByb3NlTWlycm9yLCBbc3RyaW5nXSwgUG9zKT4pXG4vLyBDcmVhdGUgYW4gaW5wdXQgcnVsZS4gSXRzIG5hbWUgaXMgdXNlZCB0byBpZGVudGlmeSBpdCAodG8gZGlzYWJsZVxuLy8gaXQpLiBUaGUgcnVsZSBhcHBsaWVzIHdoZW4gdGhlIHVzZXIgdHlwZWQgc29tZXRoaW5nIGFuZCB0aGUgdGV4dFxuLy8gZGlyZWN0bHkgaW4gZnJvbnQgb2YgdGhlIGN1cnNvciBtYXRjaGVzIGBtYXRjaGAsIHdoaWNoIHNob3VsZFxuLy8gcHJvYmFibHkgZW5kIHdpdGggYCRgLiBZb3UgY2FuIG9wdGlvbmFsbHkgcHJvdmlkZSBhIGZpbHRlciwgd2hpY2hcbi8vIHNob3VsZCBiZSBhIHNpbmdsZSBjaGFyYWN0ZXIgdGhhdCBhbHdheXMgYXBwZWFycyBhdCB0aGUgZW5kIG9mXG4vLyB0aGUgbWF0Y2gsIGFuZCB3aWxsIGJlIHVzZWQgdG8gb25seSBhcHBseSB0aGUgcnVsZSB3aGVuIHRoZXJlJ3Ncbi8vIGFuIGFjdHVhbCBjaGFuY2Ugb2YgaXQgc3VjY2VlZGluZy5cbi8vXG4vLyBUaGUgYGhhbmRsZXJgIGNhbiBiZSBhIHN0cmluZywgaW4gd2hpY2ggY2FzZSB0aGUgbWF0Y2hlZCB0ZXh0XG4vLyB3aWxsIHNpbXBseSBiZSByZXBsYWNlZCBieSB0aGF0IHN0cmluZywgb3IgYSBmdW5jdGlvbiwgd2hpY2ggd2lsbFxuLy8gYmUgY2FsbGVkIHdpdGggdGhlIG1hdGNoIGFycmF5IHByb2R1Y2VkIGJ5XG4vLyBbYFJlZ0V4cC5leGVjYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUmVnRXhwL2V4ZWMpLFxuLy8gYW5kIHNob3VsZCBwcm9kdWNlIHRoZSBlZmZlY3Qgb2YgdGhlIHJ1bGUuXG5mdW5jdGlvbiBJbnB1dFJ1bGUobmFtZSwgbWF0Y2gsIGZpbHRlciwgaGFuZGxlcikge1xuICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSW5wdXRSdWxlKTtcblxuICB0aGlzLm5hbWUgPSBuYW1lO1xuICB0aGlzLmZpbHRlciA9IGZpbHRlcjtcbiAgdGhpcy5tYXRjaCA9IG1hdGNoO1xuICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyO1xufTtcblxuZXhwb3J0cy5JbnB1dFJ1bGUgPSBJbnB1dFJ1bGU7XG5cbnZhciBJbnB1dFJ1bGVzID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gSW5wdXRSdWxlcyhwbSkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSW5wdXRSdWxlcyk7XG5cbiAgICB0aGlzLnBtID0gcG07XG4gICAgdGhpcy5ydWxlcyA9IFtdO1xuICAgIHRoaXMuY2FuY2VsVmVyc2lvbiA9IG51bGw7XG5cbiAgICBwbS5vbihcInNlbGVjdGlvbkNoYW5nZVwiLCB0aGlzLm9uU2VsQ2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLmNhbmNlbFZlcnNpb24gPSBudWxsO1xuICAgIH0pO1xuICAgIHBtLm9uKFwidGV4dElucHV0XCIsIHRoaXMub25UZXh0SW5wdXQgPSB0aGlzLm9uVGV4dElucHV0LmJpbmQodGhpcykpO1xuICAgIHBtLmFkZEtleW1hcChuZXcgX2VkaXQuS2V5bWFwKHsgQmFja3NwYWNlOiBmdW5jdGlvbiBCYWNrc3BhY2UocG0pIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLmJhY2tzcGFjZShwbSk7XG4gICAgICB9IH0sIHsgbmFtZTogXCJpbnB1dFJ1bGVzXCIgfSksIDIwKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhJbnB1dFJ1bGVzLCBbe1xuICAgIGtleTogXCJ1bnJlZ2lzdGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVucmVnaXN0ZXIoKSB7XG4gICAgICB0aGlzLnBtLm9mZihcInNlbGVjdGlvbkNoYW5nZVwiLCB0aGlzLm9uU2VsQ2hhbmdlKTtcbiAgICAgIHRoaXMucG0ub2ZmKFwidGV4dElucHV0XCIsIHRoaXMub25UZXh0SW5wdXQpO1xuICAgICAgdGhpcy5wbS5yZW1vdmVLZXltYXAoXCJpbnB1dFJ1bGVzXCIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRSdWxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZFJ1bGUocnVsZSkge1xuICAgICAgdGhpcy5ydWxlcy5wdXNoKHJ1bGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW1vdmVSdWxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZVJ1bGUobmFtZSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJ1bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzLnJ1bGVzW2ldLm5hbWUgPT0gbmFtZSkge1xuICAgICAgICAgIHRoaXMucnVsZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm9uVGV4dElucHV0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uVGV4dElucHV0KHRleHQpIHtcbiAgICAgIHZhciBwb3MgPSB0aGlzLnBtLnNlbGVjdGlvbi5oZWFkO1xuICAgICAgaWYgKCFwb3MpIHJldHVybjtcblxuICAgICAgdmFyIHRleHRCZWZvcmUgPSB1bmRlZmluZWQsXG4gICAgICAgICAgaXNDb2RlID0gdW5kZWZpbmVkO1xuICAgICAgdmFyIGxhc3RDaCA9IHRleHRbdGV4dC5sZW5ndGggLSAxXTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJ1bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBydWxlID0gdGhpcy5ydWxlc1tpXSxcbiAgICAgICAgICAgIG1hdGNoID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAocnVsZS5maWx0ZXIgJiYgcnVsZS5maWx0ZXIgIT0gbGFzdENoKSBjb250aW51ZTtcbiAgICAgICAgaWYgKHRleHRCZWZvcmUgPT0gbnVsbCkge1xuICAgICAgICAgIDtcbiAgICAgICAgICB2YXIgX2dldENvbnRleHQgPSBnZXRDb250ZXh0KHRoaXMucG0uZG9jLCBwb3MpO1xuXG4gICAgICAgICAgdGV4dEJlZm9yZSA9IF9nZXRDb250ZXh0LnRleHRCZWZvcmU7XG4gICAgICAgICAgaXNDb2RlID0gX2dldENvbnRleHQuaXNDb2RlO1xuXG4gICAgICAgICAgaWYgKGlzQ29kZSkgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXRjaCA9IHJ1bGUubWF0Y2guZXhlYyh0ZXh0QmVmb3JlKSkge1xuICAgICAgICAgIHZhciBzdGFydFZlcnNpb24gPSB0aGlzLnBtLmhpc3RvcnkuZ2V0VmVyc2lvbigpO1xuICAgICAgICAgIGlmICh0eXBlb2YgcnVsZS5oYW5kbGVyID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSBwb3Mub2Zmc2V0IC0gKG1hdGNoWzFdIHx8IG1hdGNoWzBdKS5sZW5ndGg7XG4gICAgICAgICAgICB2YXIgc3RhcnQgPSBuZXcgX21vZGVsLlBvcyhwb3MucGF0aCwgb2Zmc2V0KTtcbiAgICAgICAgICAgIHZhciBtYXJrcyA9IHRoaXMucG0uZG9jLm1hcmtzQXQocG9zKTtcbiAgICAgICAgICAgIHRoaXMucG0udHJbXCJkZWxldGVcIl0oc3RhcnQsIHBvcykuaW5zZXJ0KHN0YXJ0LCB0aGlzLnBtLnNjaGVtYS50ZXh0KHJ1bGUuaGFuZGxlciwgbWFya3MpKS5hcHBseSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBydWxlLmhhbmRsZXIodGhpcy5wbSwgbWF0Y2gsIHBvcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY2FuY2VsVmVyc2lvbiA9IHN0YXJ0VmVyc2lvbjtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYmFja3NwYWNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJhY2tzcGFjZSgpIHtcbiAgICAgIGlmICh0aGlzLmNhbmNlbFZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5wbS5oaXN0b3J5LmJhY2tUb1ZlcnNpb24odGhpcy5jYW5jZWxWZXJzaW9uKTtcbiAgICAgICAgdGhpcy5jYW5jZWxWZXJzaW9uID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSW5wdXRSdWxlcztcbn0pKCk7XG5cbmZ1bmN0aW9uIGdldENvbnRleHQoZG9jLCBwb3MpIHtcbiAgdmFyIHBhcmVudCA9IGRvYy5wYXRoKHBvcy5wYXRoKTtcbiAgdmFyIGlzQ29kZSA9IHBhcmVudC50eXBlLmlzQ29kZTtcbiAgdmFyIHRleHRCZWZvcmUgPSBcIlwiO1xuICBmb3IgKHZhciBpID0gcGFyZW50Lml0ZXIoMCwgcG9zLm9mZnNldCksIGNoaWxkID0gdW5kZWZpbmVkOyBjaGlsZCA9IGkubmV4dCgpLnZhbHVlOykge1xuICAgIGlmIChjaGlsZC5pc1RleHQpIHRleHRCZWZvcmUgKz0gY2hpbGQudGV4dDtlbHNlIHRleHRCZWZvcmUgPSBcIlwiO1xuICAgIGlmIChpLmF0RW5kKCkgJiYgY2hpbGQubWFya3Muc29tZShmdW5jdGlvbiAoc3QpIHtcbiAgICAgIHJldHVybiBzdC50eXBlLmlzQ29kZTtcbiAgICB9KSkgaXNDb2RlID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4geyB0ZXh0QmVmb3JlOiB0ZXh0QmVmb3JlLCBpc0NvZGU6IGlzQ29kZSB9O1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5nZXRJY29uID0gZ2V0SWNvbjtcblxudmFyIF9kb20gPSByZXF1aXJlKFwiLi4vZG9tXCIpO1xuXG52YXIgc3ZnQ29sbGVjdGlvbiA9IG51bGw7XG52YXIgc3ZnQnVpbHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG52YXIgU1ZHID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiO1xudmFyIFhMSU5LID0gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCI7XG5cbmZ1bmN0aW9uIGdldEljb24obmFtZSwgZGF0YSkge1xuICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIG5vZGUuY2xhc3NOYW1lID0gXCJQcm9zZU1pcnJvci1pY29uXCI7XG4gIGlmIChkYXRhLnBhdGgpIHtcbiAgICBpZiAoIXN2Z0J1aWx0W25hbWVdKSBidWlsZFNWRyhuYW1lLCBkYXRhKTtcbiAgICB2YXIgc3ZnID0gbm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHLCBcInN2Z1wiKSk7XG4gICAgc3ZnLnN0eWxlLndpZHRoID0gZGF0YS53aWR0aCAvIGRhdGEuaGVpZ2h0ICsgXCJlbVwiO1xuICAgIHZhciB1c2UgPSBzdmcuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWRywgXCJ1c2VcIikpO1xuICAgIHVzZS5zZXRBdHRyaWJ1dGVOUyhYTElOSywgXCJocmVmXCIsIFwiI3BtLWljb24tXCIgKyBuYW1lKTtcbiAgfSBlbHNlIHtcbiAgICBub2RlLnRleHRDb250ZW50ID0gZGF0YS50ZXh0O1xuICAgIGlmIChkYXRhLmNzcykgbm9kZS5zdHlsZS5jc3NUZXh0ID0gZGF0YS5jc3M7XG4gIH1cbiAgcmV0dXJuIG5vZGU7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU1ZHKG5hbWUsIGRhdGEpIHtcbiAgaWYgKCFzdmdDb2xsZWN0aW9uKSB7XG4gICAgc3ZnQ29sbGVjdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkcsIFwic3ZnXCIpO1xuICAgIHN2Z0NvbGxlY3Rpb24uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QmVmb3JlKHN2Z0NvbGxlY3Rpb24sIGRvY3VtZW50LmJvZHkuZmlyc3RDaGlsZCk7XG4gIH1cbiAgdmFyIHN5bSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkcsIFwic3ltYm9sXCIpO1xuICBzeW0uaWQgPSBcInBtLWljb24tXCIgKyBuYW1lO1xuICBzeW0uc2V0QXR0cmlidXRlKFwidmlld0JveFwiLCBcIjAgMCBcIiArIGRhdGEud2lkdGggKyBcIiBcIiArIGRhdGEuaGVpZ2h0KTtcbiAgdmFyIHBhdGggPSBzeW0uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWRywgXCJwYXRoXCIpKTtcbiAgcGF0aC5zZXRBdHRyaWJ1dGUoXCJkXCIsIGRhdGEucGF0aCk7XG4gIHN2Z0NvbGxlY3Rpb24uYXBwZW5kQ2hpbGQoc3ltKTtcbiAgc3ZnQnVpbHRbbmFtZV0gPSB0cnVlO1xufVxuXG4oMCwgX2RvbS5pbnNlcnRDU1MpKFwiXFxuLlByb3NlTWlycm9yLWljb24ge1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgbGluZS1oZWlnaHQ6IC44O1xcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXG4gIHBhZGRpbmc6IDJweCA4cHg7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1pY29uLWFjdGl2ZSB7XFxuICBiYWNrZ3JvdW5kOiAjNjY2O1xcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItaWNvbiBzdmcge1xcbiAgZmlsbDogY3VycmVudENvbG9yO1xcbiAgaGVpZ2h0OiAxZW07XFxufVxcblwiKTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5leHBvcnRzLnNob3dTZWxlY3RNZW51ID0gc2hvd1NlbGVjdE1lbnU7XG5leHBvcnRzLnJlYWRQYXJhbXMgPSByZWFkUGFyYW1zO1xuZXhwb3J0cy5jb21tYW5kR3JvdXBzID0gY29tbWFuZEdyb3VwcztcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBfdG9vbHRpcCA9IHJlcXVpcmUoXCIuL3Rvb2x0aXBcIik7XG5cbnZhciBfZG9tID0gcmVxdWlyZShcIi4uL2RvbVwiKTtcblxudmFyIF9lZGl0ID0gcmVxdWlyZShcIi4uL2VkaXRcIik7XG5cbnZhciBfdXRpbFNvcnRlZGluc2VydCA9IHJlcXVpcmUoXCIuLi91dGlsL3NvcnRlZGluc2VydFwiKTtcblxudmFyIF91dGlsU29ydGVkaW5zZXJ0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3V0aWxTb3J0ZWRpbnNlcnQpO1xuXG52YXIgX2ljb25zID0gcmVxdWlyZShcIi4vaWNvbnNcIik7XG5cbnZhciBNZW51ID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTWVudShwbSwgZGlzcGxheSkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNZW51KTtcblxuICAgIHRoaXMuZGlzcGxheSA9IGRpc3BsYXk7XG4gICAgdGhpcy5zdGFjayA9IFtdO1xuICAgIHRoaXMucG0gPSBwbTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhNZW51LCBbe1xuICAgIGtleTogXCJzaG93XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNob3coY29udGVudCwgZGlzcGxheUluZm8pIHtcbiAgICAgIHRoaXMuc3RhY2subGVuZ3RoID0gMDtcbiAgICAgIHRoaXMuZW50ZXIoY29udGVudCwgZGlzcGxheUluZm8pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZXNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNldCgpIHtcbiAgICAgIHRoaXMuc3RhY2subGVuZ3RoID0gMDtcbiAgICAgIHRoaXMuZGlzcGxheS5yZXNldCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlbnRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbnRlcihjb250ZW50LCBkaXNwbGF5SW5mbykge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIHBpZWNlcyA9IFtdLFxuICAgICAgICAgIGV4cGxvcmUgPSBmdW5jdGlvbiBleHBsb3JlKHZhbHVlKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGV4cGxvcmUodmFsdWVbaV0pO1xuICAgICAgICAgIH1waWVjZXMucHVzaChzZXBhcmF0b3IpO1xuICAgICAgICB9IGVsc2UgaWYgKCF2YWx1ZS5zZWxlY3QgfHwgdmFsdWUuc2VsZWN0KF90aGlzLnBtKSkge1xuICAgICAgICAgIHBpZWNlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGV4cGxvcmUoY29udGVudCk7XG4gICAgICAvLyBSZW1vdmUgc3VwZXJmbHVvdXMgc2VwYXJhdG9yc1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwaWVjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBpZWNlc1tpXSA9PSBzZXBhcmF0b3IgJiYgKGkgPT0gMCB8fCBpID09IHBpZWNlcy5sZW5ndGggLSAxIHx8IHBpZWNlc1tpICsgMV0gPT0gc2VwYXJhdG9yKSkgcGllY2VzLnNwbGljZShpLS0sIDEpO1xuICAgICAgfWlmICghcGllY2VzLmxlbmd0aCkgcmV0dXJuIHRoaXMuZGlzcGxheS5jbGVhcigpO1xuXG4gICAgICB0aGlzLnN0YWNrLnB1c2gocGllY2VzKTtcbiAgICAgIHRoaXMuZHJhdyhkaXNwbGF5SW5mbyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRyYXdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZHJhdyhkaXNwbGF5SW5mbykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBjdXIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07XG4gICAgICB2YXIgcmVuZGVyZWQgPSAoMCwgX2RvbS5lbHQpKFwiZGl2XCIsIHsgXCJjbGFzc1wiOiBcIlByb3NlTWlycm9yLW1lbnVcIiB9LCBjdXIubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHJldHVybiByZW5kZXJJdGVtKGl0ZW0sIF90aGlzMik7XG4gICAgICB9KSk7XG4gICAgICBpZiAodGhpcy5zdGFjay5sZW5ndGggPiAxKSB0aGlzLmRpc3BsYXkuZW50ZXIocmVuZGVyZWQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMi5sZWF2ZSgpO1xuICAgICAgfSwgZGlzcGxheUluZm8pO2Vsc2UgdGhpcy5kaXNwbGF5LnNob3cocmVuZGVyZWQsIGRpc3BsYXlJbmZvKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibGVhdmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbGVhdmUoKSB7XG4gICAgICB0aGlzLnN0YWNrLnBvcCgpO1xuICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoKSB0aGlzLmRyYXcoKTtlbHNlIHRoaXMuZGlzcGxheS5yZXNldCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhY3RpdmVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YWNrLmxlbmd0aCA+IDE7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE1lbnU7XG59KSgpO1xuXG5leHBvcnRzLk1lbnUgPSBNZW51O1xuXG52YXIgVG9vbHRpcERpc3BsYXkgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBUb29sdGlwRGlzcGxheSh0b29sdGlwLCByZXNldEZ1bmMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVG9vbHRpcERpc3BsYXkpO1xuXG4gICAgdGhpcy50b29sdGlwID0gdG9vbHRpcDtcbiAgICB0aGlzLnJlc2V0RnVuYyA9IHJlc2V0RnVuYztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhUb29sdGlwRGlzcGxheSwgW3tcbiAgICBrZXk6IFwiY2xlYXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICB0aGlzLnRvb2x0aXAuY2xvc2UoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVzZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICBpZiAodGhpcy5yZXNldEZ1bmMpIHRoaXMucmVzZXRGdW5jKCk7ZWxzZSB0aGlzLmNsZWFyKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNob3dcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hvdyhkb20sIGluZm8pIHtcbiAgICAgIHRoaXMudG9vbHRpcC5vcGVuKGRvbSwgaW5mbyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVudGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVudGVyKGRvbSwgYmFjaywgaW5mbykge1xuICAgICAgdmFyIGJ1dHRvbiA9ICgwLCBfZG9tLmVsdCkoXCJkaXZcIiwgeyBcImNsYXNzXCI6IFwiUHJvc2VNaXJyb3ItdG9vbHRpcC1iYWNrXCIsIHRpdGxlOiBcIkJhY2tcIiB9KTtcbiAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBiYWNrKCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuc2hvdygoMCwgX2RvbS5lbHQpKFwiZGl2XCIsIHsgXCJjbGFzc1wiOiBcIlByb3NlTWlycm9yLXRvb2x0aXAtYmFjay13cmFwcGVyXCIgfSwgZG9tLCBidXR0b24pLCBpbmZvKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVG9vbHRpcERpc3BsYXk7XG59KSgpO1xuXG5leHBvcnRzLlRvb2x0aXBEaXNwbGF5ID0gVG9vbHRpcERpc3BsYXk7XG5cbmZ1bmN0aW9uIHRpdGxlKHBtLCBjb21tYW5kKSB7XG4gIHZhciBrZXkgPSBwbS5rZXlGb3JDb21tYW5kKGNvbW1hbmQubmFtZSk7XG4gIHJldHVybiBrZXkgPyBjb21tYW5kLmxhYmVsICsgXCIgKFwiICsga2V5ICsgXCIpXCIgOiBjb21tYW5kLmxhYmVsO1xufVxuXG5mdW5jdGlvbiByZW5kZXJJY29uKGNvbW1hbmQsIG1lbnUpIHtcbiAgdmFyIGljb24gPSByZXNvbHZlSWNvbihtZW51LnBtLCBjb21tYW5kKTtcbiAgaWYgKGNvbW1hbmQuYWN0aXZlKG1lbnUucG0pKSBpY29uLmNsYXNzTmFtZSArPSBcIiBQcm9zZU1pcnJvci1pY29uLWFjdGl2ZVwiO1xuICB2YXIgZG9tID0gKDAsIF9kb20uZWx0KShcInNwYW5cIiwgeyBcImNsYXNzXCI6IFwiUHJvc2VNaXJyb3ItbWVudWljb25cIiwgdGl0bGU6IHRpdGxlKG1lbnUucG0sIGNvbW1hbmQpIH0sIGljb24pO1xuICBkb20uYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBmdW5jdGlvbiAoZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICghY29tbWFuZC5wYXJhbXMubGVuZ3RoKSB7XG4gICAgICBjb21tYW5kLmV4ZWMobWVudS5wbSk7XG4gICAgICBtZW51LnJlc2V0KCk7XG4gICAgfSBlbHNlIGlmIChjb21tYW5kLnBhcmFtcy5sZW5ndGggPT0gMSAmJiBjb21tYW5kLnBhcmFtc1swXS50eXBlID09IFwic2VsZWN0XCIpIHtcbiAgICAgIHNob3dTZWxlY3RNZW51KG1lbnUucG0sIGNvbW1hbmQsIGRvbSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lbnUuZW50ZXIocmVhZFBhcmFtcyhjb21tYW5kKSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGRvbTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUljb24ocG0sIGNvbW1hbmQpIHtcbiAgZm9yICg7Oykge1xuICAgIHZhciBpY29uID0gY29tbWFuZC5zcGVjLmljb247XG4gICAgaWYgKCFpY29uKSBicmVhaztcbiAgICBpZiAoaWNvbi5mcm9tKSB7XG4gICAgICBjb21tYW5kID0gcG0uY29tbWFuZHNbaWNvbi5mcm9tXTtcbiAgICAgIGlmICghY29tbWFuZCkgYnJlYWs7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAoMCwgX2ljb25zLmdldEljb24pKGNvbW1hbmQubmFtZSwgaWNvbik7XG4gICAgfVxuICB9XG4gIHJldHVybiAoMCwgX2ljb25zLmdldEljb24pKFwiZGVmYXVsdFwiLCB7IHRleHQ6IFwi4pyYXCIgfSk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclNlbGVjdChpdGVtLCBtZW51KSB7XG4gIHZhciBwYXJhbSA9IGl0ZW0ucGFyYW1zWzBdO1xuICB2YXIgdmFsdWUgPSAhcGFyYW1bXCJkZWZhdWx0XCJdID8gbnVsbCA6IHBhcmFtW1wiZGVmYXVsdFwiXS5jYWxsID8gcGFyYW1bXCJkZWZhdWx0XCJdKG1lbnUucG0pIDogcGFyYW1bXCJkZWZhdWx0XCJdO1xuXG4gIHZhciBkb20gPSAoMCwgX2RvbS5lbHQpKFwiZGl2XCIsIHsgXCJjbGFzc1wiOiBcIlByb3NlTWlycm9yLXNlbGVjdCBQcm9zZU1pcnJvci1zZWxlY3QtY29tbWFuZC1cIiArIGl0ZW0ubmFtZSwgdGl0bGU6IGl0ZW0ubGFiZWwgfSwgIXZhbHVlID8gcGFyYW0uZGVmYXVsdExhYmVsIHx8IFwiU2VsZWN0Li4uXCIgOiB2YWx1ZS5kaXNwbGF5ID8gdmFsdWUuZGlzcGxheSh2YWx1ZSkgOiB2YWx1ZS5sYWJlbCk7XG4gIGRvbS5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO2Uuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgc2hvd1NlbGVjdE1lbnUobWVudS5wbSwgaXRlbSwgZG9tKTtcbiAgfSk7XG4gIHJldHVybiBkb207XG59XG5cbmZ1bmN0aW9uIHNob3dTZWxlY3RNZW51KHBtLCBpdGVtLCBkb20pIHtcbiAgdmFyIHBhcmFtID0gaXRlbS5wYXJhbXNbMF07XG4gIHZhciBvcHRpb25zID0gcGFyYW0ub3B0aW9ucy5jYWxsID8gcGFyYW0ub3B0aW9ucyhwbSkgOiBwYXJhbS5vcHRpb25zO1xuICB2YXIgbWVudSA9ICgwLCBfZG9tLmVsdCkoXCJkaXZcIiwgeyBcImNsYXNzXCI6IFwiUHJvc2VNaXJyb3Itc2VsZWN0LW1lbnVcIiB9LCBvcHRpb25zLm1hcChmdW5jdGlvbiAobykge1xuICAgIHZhciBkb20gPSAoMCwgX2RvbS5lbHQpKFwiZGl2XCIsIG51bGwsIG8uZGlzcGxheSA/IG8uZGlzcGxheShvKSA6IG8ubGFiZWwpO1xuICAgIGRvbS5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpdGVtLmV4ZWMocG0sIFtvLnZhbHVlXSk7XG4gICAgICBmaW5pc2goKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZG9tO1xuICB9KSk7XG4gIHZhciBwb3MgPSBkb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICBib3ggPSBwbS53cmFwcGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBtZW51LnN0eWxlLmxlZnQgPSBwb3MubGVmdCAtIGJveC5sZWZ0IC0gMiArIFwicHhcIjtcbiAgbWVudS5zdHlsZS50b3AgPSBwb3MudG9wIC0gYm94LnRvcCAtIDIgKyBcInB4XCI7XG5cbiAgdmFyIGRvbmUgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZmluaXNoKCkge1xuICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgZG9uZSA9IHRydWU7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGZpbmlzaCk7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBmaW5pc2gpO1xuICAgIHBtLndyYXBwZXIucmVtb3ZlQ2hpbGQobWVudSk7XG4gIH1cbiAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGZpbmlzaCk7XG4gIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgZmluaXNoKTtcbiAgcG0ud3JhcHBlci5hcHBlbmRDaGlsZChtZW51KTtcbn1cblxuZnVuY3Rpb24gcmVuZGVySXRlbShpdGVtLCBtZW51KSB7XG4gIHZhciBkaXNwbGF5ID0gaXRlbS5kaXNwbGF5IHx8IGl0ZW0uc3BlYy5kaXNwbGF5IHx8IFwiaWNvblwiO1xuICBpZiAoZGlzcGxheSA9PSBcImljb25cIikgcmV0dXJuIHJlbmRlckljb24oaXRlbSwgbWVudSk7ZWxzZSBpZiAoZGlzcGxheSA9PSBcInNlbGVjdFwiKSByZXR1cm4gcmVuZGVyU2VsZWN0KGl0ZW0sIG1lbnUpO2Vsc2UgaWYgKCFkaXNwbGF5KSB0aHJvdyBuZXcgRXJyb3IoXCJDb21tYW5kIFwiICsgaXRlbS5uYW1lICsgXCIgY2FuIG5vdCBiZSBzaG93biBpbiBhIG1lbnVcIik7ZWxzZSByZXR1cm4gZGlzcGxheS5jYWxsKGl0ZW0sIG1lbnUpO1xufVxuXG5mdW5jdGlvbiBidWlsZFBhcmFtRm9ybShwbSwgY29tbWFuZCkge1xuICB2YXIgcHJlZmlsbCA9IGNvbW1hbmQuc3BlYy5wcmVmaWxsUGFyYW1zICYmIGNvbW1hbmQuc3BlYy5wcmVmaWxsUGFyYW1zKHBtKTtcbiAgdmFyIGZpZWxkcyA9IGNvbW1hbmQucGFyYW1zLm1hcChmdW5jdGlvbiAocGFyYW0sIGkpIHtcbiAgICB2YXIgZmllbGQgPSB1bmRlZmluZWQsXG4gICAgICAgIG5hbWUgPSBcImZpZWxkX1wiICsgaTtcbiAgICB2YXIgdmFsID0gcHJlZmlsbCA/IHByZWZpbGxbaV0gOiBwYXJhbVtcImRlZmF1bHRcIl0gfHwgXCJcIjtcbiAgICBpZiAocGFyYW0udHlwZSA9PSBcInRleHRcIikgZmllbGQgPSAoMCwgX2RvbS5lbHQpKFwiaW5wdXRcIiwgeyBuYW1lOiBuYW1lLCB0eXBlOiBcInRleHRcIixcbiAgICAgIHBsYWNlaG9sZGVyOiBwYXJhbS5sYWJlbCxcbiAgICAgIHZhbHVlOiB2YWwsXG4gICAgICBhdXRvY29tcGxldGU6IFwib2ZmXCIgfSk7ZWxzZSBpZiAocGFyYW0udHlwZSA9PSBcInNlbGVjdFwiKSBmaWVsZCA9ICgwLCBfZG9tLmVsdCkoXCJzZWxlY3RcIiwgeyBuYW1lOiBuYW1lIH0sIChwYXJhbS5vcHRpb25zLmNhbGwgPyBwYXJhbS5vcHRpb25zKHBtKSA6IHBhcmFtLm9wdGlvbnMpLm1hcChmdW5jdGlvbiAobykge1xuICAgICAgcmV0dXJuICgwLCBfZG9tLmVsdCkoXCJvcHRpb25cIiwgeyB2YWx1ZTogby52YWx1ZSwgc2VsZWN0ZWQ6IG8udmFsdWUgPT0gdmFsIH0sIG8ubGFiZWwpO1xuICAgIH0pKTtlbHNlIC8vIEZJWE1FIG1vcmUgdHlwZXNcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIHBhcmFtZXRlciB0eXBlOiBcIiArIHBhcmFtLnR5cGUpO1xuICAgIHJldHVybiAoMCwgX2RvbS5lbHQpKFwiZGl2XCIsIG51bGwsIGZpZWxkKTtcbiAgfSk7XG4gIHJldHVybiAoMCwgX2RvbS5lbHQpKFwiZm9ybVwiLCBudWxsLCBmaWVsZHMpO1xufVxuXG5mdW5jdGlvbiBnYXRoZXJQYXJhbXMocG0sIGNvbW1hbmQsIGZvcm0pIHtcbiAgdmFyIGJhZCA9IGZhbHNlO1xuICB2YXIgcGFyYW1zID0gY29tbWFuZC5wYXJhbXMubWFwKGZ1bmN0aW9uIChwYXJhbSwgaSkge1xuICAgIHZhciB2YWwgPSBmb3JtLmVsZW1lbnRzW1wiZmllbGRfXCIgKyBpXS52YWx1ZTtcbiAgICBpZiAodmFsKSByZXR1cm4gdmFsO1xuICAgIGlmIChwYXJhbVtcImRlZmF1bHRcIl0gPT0gbnVsbCkgYmFkID0gdHJ1ZTtlbHNlIHJldHVybiBwYXJhbVtcImRlZmF1bHRcIl0uY2FsbCA/IHBhcmFtW1wiZGVmYXVsdFwiXShwbSkgOiBwYXJhbVtcImRlZmF1bHRcIl07XG4gIH0pO1xuICByZXR1cm4gYmFkID8gbnVsbCA6IHBhcmFtcztcbn1cblxuZnVuY3Rpb24gcGFyYW1Gb3JtKHBtLCBjb21tYW5kLCBjYWxsYmFjaykge1xuICB2YXIgZm9ybSA9IGJ1aWxkUGFyYW1Gb3JtKHBtLCBjb21tYW5kKSxcbiAgICAgIGRvbmUgPSBmYWxzZTtcblxuICB2YXIgZmluaXNoID0gZnVuY3Rpb24gZmluaXNoKHJlc3VsdCkge1xuICAgIGlmICghZG9uZSkge1xuICAgICAgZG9uZSA9IHRydWU7XG4gICAgICBjYWxsYmFjayhyZXN1bHQpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgc3VibWl0ID0gZnVuY3Rpb24gc3VibWl0KCkge1xuICAgIC8vIEZJWE1FIGVycm9yIG1lc3NhZ2VzXG4gICAgZmluaXNoKGdhdGhlclBhcmFtcyhwbSwgY29tbWFuZCwgZm9ybSkpO1xuICB9O1xuICBmb3JtLmFkZEV2ZW50TGlzdGVuZXIoXCJzdWJtaXRcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgc3VibWl0KCk7XG4gIH0pO1xuICBmb3JtLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKGUua2V5Q29kZSA9PSAyNykge1xuICAgICAgZmluaXNoKG51bGwpO1xuICAgIH0gZWxzZSBpZiAoZS5rZXlDb2RlID09IDEzICYmICEoZS5jdHJsS2V5IHx8IGUubWV0YUtleSB8fCBlLnNoaWZ0S2V5KSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc3VibWl0KCk7XG4gICAgfVxuICB9KTtcbiAgLy8gRklYTUUgdG9vIGhhY2t5P1xuICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaW5wdXQgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dCwgdGV4dGFyZWFcIik7XG4gICAgaWYgKGlucHV0KSBpbnB1dC5mb2N1cygpO1xuICB9LCAyMCk7XG5cbiAgcmV0dXJuIGZvcm07XG59XG5cbmZ1bmN0aW9uIHJlYWRQYXJhbXMoY29tbWFuZCkge1xuICByZXR1cm4geyBkaXNwbGF5OiBmdW5jdGlvbiBkaXNwbGF5KG1lbnUpIHtcbiAgICAgIHJldHVybiBwYXJhbUZvcm0obWVudS5wbSwgY29tbWFuZCwgZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICBtZW51LnBtLmZvY3VzKCk7XG4gICAgICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgICBjb21tYW5kLmV4ZWMobWVudS5wbSwgcGFyYW1zKTtcbiAgICAgICAgICBtZW51LnJlc2V0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWVudS5sZWF2ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IH07XG59XG5cbnZhciBzZXBhcmF0b3IgPSB7XG4gIGRpc3BsYXk6IGZ1bmN0aW9uIGRpc3BsYXkoKSB7XG4gICAgcmV0dXJuICgwLCBfZG9tLmVsdCkoXCJkaXZcIiwgeyBcImNsYXNzXCI6IFwiUHJvc2VNaXJyb3ItbWVudXNlcGFyYXRvclwiIH0pO1xuICB9XG59O1xuXG5mdW5jdGlvbiBjb21tYW5kR3JvdXBzKHBtKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBuYW1lcyA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBuYW1lc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gbmFtZXMubWFwKGZ1bmN0aW9uIChncm91cCkge1xuICAgIHZhciBmb3VuZCA9IFtdO1xuICAgIGZvciAodmFyIF9uYW1lIGluIHBtLmNvbW1hbmRzKSB7XG4gICAgICB2YXIgY21kID0gcG0uY29tbWFuZHNbX25hbWVdO1xuICAgICAgaWYgKGNtZC5zcGVjLm1lbnVHcm91cCAmJiBjbWQuc3BlYy5tZW51R3JvdXAgPT0gZ3JvdXApICgwLCBfdXRpbFNvcnRlZGluc2VydDJbXCJkZWZhdWx0XCJdKShmb3VuZCwgY21kLCBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICByZXR1cm4gKGEuc3BlYy5tZW51UmFuayB8fCA1MCkgLSAoYi5zcGVjLm1lbnVSYW5rIHx8IDUwKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZm91bmQ7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB0b29sdGlwUGFyYW1IYW5kbGVyKHBtLCBjb21tYW5kLCBjYWxsYmFjaykge1xuICB2YXIgdG9vbHRpcCA9IG5ldyBfdG9vbHRpcC5Ub29sdGlwKHBtLCBcImNlbnRlclwiKTtcbiAgdG9vbHRpcC5vcGVuKHBhcmFtRm9ybShwbSwgY29tbWFuZCwgZnVuY3Rpb24gKHBhcmFtcykge1xuICAgIHBtLmZvY3VzKCk7XG4gICAgdG9vbHRpcC5jbG9zZSgpO1xuICAgIGNhbGxiYWNrKHBhcmFtcyk7XG4gIH0pKTtcbn1cblxuKDAsIF9lZGl0LmRlZmluZVBhcmFtSGFuZGxlcikoXCJkZWZhdWx0XCIsIHRvb2x0aXBQYXJhbUhhbmRsZXIpO1xuKDAsIF9lZGl0LmRlZmluZVBhcmFtSGFuZGxlcikoXCJ0b29sdGlwXCIsIHRvb2x0aXBQYXJhbUhhbmRsZXIpO1xuXG4vLyBGSVhNRSBjaGVjayBmb3Igb2Jzb2xldGUgc3R5bGVzXG4oMCwgX2RvbS5pbnNlcnRDU1MpKFwiXFxuXFxuLlByb3NlTWlycm9yLW1lbnUge1xcbiAgbWFyZ2luOiAwIC00cHg7XFxuICBsaW5lLWhlaWdodDogMTtcXG4gIHdoaXRlLXNwYWNlOiBwcmU7XFxufVxcbi5Qcm9zZU1pcnJvci10b29sdGlwIC5Qcm9zZU1pcnJvci1tZW51IHtcXG4gIHdpZHRoOiAtd2Via2l0LWZpdC1jb250ZW50O1xcbiAgd2lkdGg6IGZpdC1jb250ZW50O1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItdG9vbHRpcC1iYWNrLXdyYXBwZXIge1xcbiAgcGFkZGluZy1sZWZ0OiAxMnB4O1xcbn1cXG4uUHJvc2VNaXJyb3ItdG9vbHRpcC1iYWNrIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogNXB4OyBsZWZ0OiA1cHg7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5Qcm9zZU1pcnJvci10b29sdGlwLWJhY2s6YWZ0ZXIge1xcbiAgY29udGVudDogXFxcIsKrXFxcIjtcXG59XFxuXFxuLlByb3NlTWlycm9yLW1lbnVpY29uIHtcXG4gIG1hcmdpbjogMCA3cHg7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1tZW51c2VwYXJhdG9yIHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuLlByb3NlTWlycm9yLW1lbnVzZXBhcmF0b3I6YWZ0ZXIge1xcbiAgY29udGVudDogXFxcIu+4mVxcXCI7XFxuICBvcGFjaXR5OiAwLjU7XFxuICBwYWRkaW5nOiAwIDRweDtcXG4gIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcXG59XFxuXFxuLlByb3NlTWlycm9yLXNlbGVjdCwgLlByb3NlTWlycm9yLXNlbGVjdC1tZW51IHtcXG4gIGJvcmRlcjogMXB4IHNvbGlkICM3Nzc7XFxuICBib3JkZXItcmFkaXVzOiAzcHg7XFxuICBmb250LXNpemU6IDkwJTtcXG59XFxuXFxuLlByb3NlTWlycm9yLXNlbGVjdCB7XFxuICBwYWRkaW5nOiAxcHggMTJweCAxcHggNHB4O1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG4gIG1hcmdpbjogMCA4cHg7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1zZWxlY3QtY29tbWFuZC10ZXh0YmxvY2tUeXBlIHtcXG4gIG1pbi13aWR0aDogMy4yZW07XFxufVxcblxcbi5Qcm9zZU1pcnJvci1zZWxlY3Q6YWZ0ZXIge1xcbiAgY29udGVudDogXFxcIuKWv1xcXCI7XFxuICBjb2xvcjogIzc3NztcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHJpZ2h0OiA0cHg7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1zZWxlY3QtbWVudSB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBiYWNrZ3JvdW5kOiAjNDQ0O1xcbiAgY29sb3I6IHdoaXRlO1xcbiAgcGFkZGluZzogMnB4IDJweDtcXG4gIHotaW5kZXg6IDE1O1xcbn1cXG4uUHJvc2VNaXJyb3Itc2VsZWN0LW1lbnUgZGl2IHtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG4gIHBhZGRpbmc6IDAgMWVtIDAgMnB4O1xcbn1cXG4uUHJvc2VNaXJyb3Itc2VsZWN0LW1lbnUgZGl2OmhvdmVyIHtcXG4gIGJhY2tncm91bmQ6ICM3Nzc7XFxufVxcblxcblwiKTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgX2VkaXQgPSByZXF1aXJlKFwiLi4vZWRpdFwiKTtcblxudmFyIF9kb20gPSByZXF1aXJlKFwiLi4vZG9tXCIpO1xuXG52YXIgX3VwZGF0ZSA9IHJlcXVpcmUoXCIuL3VwZGF0ZVwiKTtcblxudmFyIF9tZW51ID0gcmVxdWlyZShcIi4vbWVudVwiKTtcblxuKDAsIF9lZGl0LmRlZmluZU9wdGlvbikoXCJtZW51QmFyXCIsIGZhbHNlLCBmdW5jdGlvbiAocG0sIHZhbHVlKSB7XG4gIGlmIChwbS5tb2QubWVudUJhcikgcG0ubW9kLm1lbnVCYXIuZGV0YWNoKCk7XG4gIHBtLm1vZC5tZW51QmFyID0gdmFsdWUgPyBuZXcgTWVudUJhcihwbSwgdmFsdWUpIDogbnVsbDtcbn0pO1xuXG52YXIgQmFyRGlzcGxheSA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEJhckRpc3BsYXkoY29udGFpbmVyLCByZXNldEZ1bmMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQmFyRGlzcGxheSk7XG5cbiAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICB0aGlzLnJlc2V0RnVuYyA9IHJlc2V0RnVuYztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhCYXJEaXNwbGF5LCBbe1xuICAgIGtleTogXCJjbGVhclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLnRleHRDb250ZW50ID0gXCJcIjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVzZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICB0aGlzLnJlc2V0RnVuYygpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzaG93XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNob3coZG9tKSB7XG4gICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChkb20pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlbnRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbnRlcihkb20sIGJhY2spIHtcbiAgICAgIHZhciBjdXJyZW50ID0gdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZDtcbiAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgIGN1cnJlbnQuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgIGN1cnJlbnQuc3R5bGUub3BhY2l0eSA9IFwiMC41XCI7XG4gICAgICB9XG4gICAgICB2YXIgYmFja0J1dHRvbiA9ICgwLCBfZG9tLmVsdCkoXCJkaXZcIiwgeyBcImNsYXNzXCI6IFwiUHJvc2VNaXJyb3ItbWVudWJhci1iYWNrXCIgfSk7XG4gICAgICBiYWNrQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO2Uuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGJhY2soKTtcbiAgICAgIH0pO1xuICAgICAgdmFyIGFkZGVkID0gKDAsIF9kb20uZWx0KShcImRpdlwiLCB7IFwiY2xhc3NcIjogXCJQcm9zZU1pcnJvci1tZW51YmFyLXNsaWRpbmdcIiB9LCBiYWNrQnV0dG9uLCBkb20pO1xuICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQoYWRkZWQpO1xuICAgICAgYWRkZWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7IC8vIEZvcmNlIGxheW91dCBmb3IgdHJhbnNpdGlvblxuICAgICAgYWRkZWQuc3R5bGUubGVmdCA9IFwiMFwiO1xuICAgICAgYWRkZWQuYWRkRXZlbnRMaXN0ZW5lcihcInRyYW5zaXRpb25lbmRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoY3VycmVudCAmJiBjdXJyZW50LnBhcmVudE5vZGUpIGN1cnJlbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjdXJyZW50KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBCYXJEaXNwbGF5O1xufSkoKTtcblxudmFyIE1lbnVCYXIgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBNZW51QmFyKHBtLCBjb25maWcpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1lbnVCYXIpO1xuXG4gICAgdGhpcy5wbSA9IHBtO1xuXG4gICAgdGhpcy5tZW51RWx0ID0gKDAsIF9kb20uZWx0KShcImRpdlwiLCB7IFwiY2xhc3NcIjogXCJQcm9zZU1pcnJvci1tZW51YmFyLWlubmVyXCIgfSk7XG4gICAgdGhpcy53cmFwcGVyID0gKDAsIF9kb20uZWx0KShcImRpdlwiLCB7IFwiY2xhc3NcIjogXCJQcm9zZU1pcnJvci1tZW51YmFyXCIgfSwgKDAsIF9kb20uZWx0KShcImRpdlwiLCB7IFwiY2xhc3NcIjogXCJQcm9zZU1pcnJvci1tZW51XCIsIHN0eWxlOiBcInZpc2liaWxpdHk6IGhpZmZkZGVuOyB6LWluZGV4OiAxMDBcIiB9LCAoMCwgX2RvbS5lbHQpKFwic3BhblwiLCB7IFwiY2xhc3NcIjogXCJQcm9zZU1pcnJvci1tZW51aWNvblwiIH0sICgwLCBfZG9tLmVsdCkoXCJkaXZcIiwgeyBcImNsYXNzXCI6IFwiUHJvc2VNaXJyb3ItaWNvblwiIH0sIFwieFwiKSkpLCB0aGlzLm1lbnVFbHQpO1xuICAgIHBtLndyYXBwZXIuaW5zZXJ0QmVmb3JlKHRoaXMud3JhcHBlciwgcG0ud3JhcHBlci5maXJzdENoaWxkKTtcblxuICAgIHRoaXMudXBkYXRlID0gbmV3IF91cGRhdGUuTWVudVVwZGF0ZShwbSwgXCJzZWxlY3Rpb25DaGFuZ2UgY2hhbmdlIGFjdGl2ZU1hcmtDaGFuZ2VcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnByZXBhcmVVcGRhdGUoKTtcbiAgICB9KTtcbiAgICB0aGlzLm1lbnUgPSBuZXcgX21lbnUuTWVudShwbSwgbmV3IEJhckRpc3BsYXkodGhpcy5tZW51RWx0LCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMucmVzZXRNZW51KCk7XG4gICAgfSkpO1xuXG4gICAgdGhpcy5tZW51SXRlbXMgPSBjb25maWcgJiYgY29uZmlnLml0ZW1zIHx8ICgwLCBfbWVudS5jb21tYW5kR3JvdXBzKShwbSwgXCJpbmxpbmVcIiwgXCJibG9ja1wiLCBcImhpc3RvcnlcIik7XG4gICAgdGhpcy51cGRhdGUuZm9yY2UoKTtcblxuICAgIHRoaXMuZmxvYXRpbmcgPSBmYWxzZTtcbiAgICBpZiAoY29uZmlnICYmIGNvbmZpZy5mbG9hdCkge1xuICAgICAgdGhpcy51cGRhdGVGbG9hdCgpO1xuICAgICAgdGhpcy5zY3JvbGxGdW5jID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWRvY3VtZW50LmJvZHkuY29udGFpbnMoX3RoaXMucG0ud3JhcHBlcikpIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIF90aGlzLnNjcm9sbEZ1bmMpO2Vsc2UgX3RoaXMudXBkYXRlRmxvYXQoKTtcbiAgICAgIH07XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB0aGlzLnNjcm9sbEZ1bmMpO1xuICAgIH1cbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhNZW51QmFyLCBbe1xuICAgIGtleTogXCJkZXRhY2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGV0YWNoKCkge1xuICAgICAgdGhpcy51cGRhdGUuZGV0YWNoKCk7XG4gICAgICB0aGlzLndyYXBwZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLndyYXBwZXIpO1xuXG4gICAgICBpZiAodGhpcy5zY3JvbGxGdW5jKSB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB0aGlzLnNjcm9sbEZ1bmMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwcmVwYXJlVXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHByZXBhcmVVcGRhdGUoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIHNjcm9sbEN1cnNvciA9IHRoaXMucHJlcGFyZVNjcm9sbEN1cnNvcigpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFfdGhpczIubWVudS5hY3RpdmUpIF90aGlzMi5yZXNldE1lbnUoKTtcbiAgICAgICAgaWYgKHNjcm9sbEN1cnNvcikgc2Nyb2xsQ3Vyc29yKCk7XG4gICAgICB9O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZXNldE1lbnVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXRNZW51KCkge1xuICAgICAgdGhpcy5tZW51LnNob3codGhpcy5tZW51SXRlbXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1cGRhdGVGbG9hdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVGbG9hdCgpIHtcbiAgICAgIHZhciBlZGl0b3JSZWN0ID0gdGhpcy5wbS53cmFwcGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgaWYgKHRoaXMuZmxvYXRpbmcpIHtcbiAgICAgICAgaWYgKGVkaXRvclJlY3QudG9wID49IDAgfHwgZWRpdG9yUmVjdC5ib3R0b20gPCB0aGlzLm1lbnVFbHQub2Zmc2V0SGVpZ2h0ICsgMTApIHtcbiAgICAgICAgICB0aGlzLmZsb2F0aW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5tZW51RWx0LnN0eWxlLnBvc2l0aW9uID0gdGhpcy5tZW51RWx0LnN0eWxlLmxlZnQgPSB0aGlzLm1lbnVFbHQuc3R5bGUud2lkdGggPSBcIlwiO1xuICAgICAgICAgIHRoaXMubWVudUVsdC5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgYm9yZGVyID0gKHRoaXMucG0ud3JhcHBlci5vZmZzZXRXaWR0aCAtIHRoaXMucG0ud3JhcHBlci5jbGllbnRXaWR0aCkgLyAyO1xuICAgICAgICAgIHRoaXMubWVudUVsdC5zdHlsZS5sZWZ0ID0gZWRpdG9yUmVjdC5sZWZ0ICsgYm9yZGVyICsgXCJweFwiO1xuICAgICAgICAgIHRoaXMubWVudUVsdC5zdHlsZS5kaXNwbGF5ID0gZWRpdG9yUmVjdC50b3AgPiB3aW5kb3cuaW5uZXJIZWlnaHQgPyBcIm5vbmVcIiA6IFwiXCI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChlZGl0b3JSZWN0LnRvcCA8IDAgJiYgZWRpdG9yUmVjdC5ib3R0b20gPj0gdGhpcy5tZW51RWx0Lm9mZnNldEhlaWdodCArIDEwKSB7XG4gICAgICAgICAgdGhpcy5mbG9hdGluZyA9IHRydWU7XG4gICAgICAgICAgdmFyIG1lbnVSZWN0ID0gdGhpcy5tZW51RWx0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgIHRoaXMubWVudUVsdC5zdHlsZS5sZWZ0ID0gbWVudVJlY3QubGVmdCArIFwicHhcIjtcbiAgICAgICAgICB0aGlzLm1lbnVFbHQuc3R5bGUud2lkdGggPSBtZW51UmVjdC53aWR0aCArIFwicHhcIjtcbiAgICAgICAgICB0aGlzLm1lbnVFbHQuc3R5bGUucG9zaXRpb24gPSBcImZpeGVkXCI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicHJlcGFyZVNjcm9sbEN1cnNvclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwcmVwYXJlU2Nyb2xsQ3Vyc29yKCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIGlmICghdGhpcy5mbG9hdGluZykgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgaGVhZCA9IHRoaXMucG0uc2VsZWN0aW9uLmhlYWQ7XG4gICAgICBpZiAoIWhlYWQpIHJldHVybiBudWxsO1xuICAgICAgdmFyIGN1cnNvclBvcyA9IHRoaXMucG0uY29vcmRzQXRQb3MoaGVhZCk7XG4gICAgICB2YXIgbWVudVJlY3QgPSB0aGlzLm1lbnVFbHQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBpZiAoY3Vyc29yUG9zLnRvcCA8IG1lbnVSZWN0LmJvdHRvbSAmJiBjdXJzb3JQb3MuYm90dG9tID4gbWVudVJlY3QudG9wKSB7XG4gICAgICAgIHZhciBfcmV0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgc2Nyb2xsYWJsZSA9IGZpbmRXcmFwcGluZ1Njcm9sbGFibGUoX3RoaXMzLnBtLndyYXBwZXIpO1xuICAgICAgICAgIGlmIChzY3JvbGxhYmxlKSByZXR1cm4ge1xuICAgICAgICAgICAgICB2OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNjcm9sbGFibGUuc2Nyb2xsVG9wIC09IG1lbnVSZWN0LmJvdHRvbSAtIGN1cnNvclBvcy50b3A7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pKCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBfcmV0ID09PSBcIm9iamVjdFwiKSByZXR1cm4gX3JldC52O1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBNZW51QmFyO1xufSkoKTtcblxuZnVuY3Rpb24gZmluZFdyYXBwaW5nU2Nyb2xsYWJsZShub2RlKSB7XG4gIGZvciAodmFyIGN1ciA9IG5vZGUucGFyZW50Tm9kZTsgY3VyOyBjdXIgPSBjdXIucGFyZW50Tm9kZSkge1xuICAgIGlmIChjdXIuc2Nyb2xsSGVpZ2h0ID4gY3VyLmNsaWVudEhlaWdodCkgcmV0dXJuIGN1cjtcbiAgfVxufVxuXG4oMCwgX2RvbS5pbnNlcnRDU1MpKFwiXFxuLlByb3NlTWlycm9yLW1lbnViYXIge1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgbWFyZ2luLWJvdHRvbTogM3B4O1xcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogaW5oZXJpdDtcXG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiBpbmhlcml0O1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItbWVudWJhci1pbm5lciB7XFxuICBjb2xvcjogIzY2NjtcXG4gIHBhZGRpbmc6IDFweCA2cHg7XFxuICB0b3A6IDA7IGxlZnQ6IDA7IHJpZ2h0OiAwO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHNpbHZlcjtcXG4gIGJhY2tncm91bmQ6IHdoaXRlO1xcbiAgei1pbmRleDogMTA7XFxuICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IGluaGVyaXQ7XFxuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogaW5oZXJpdDtcXG59XFxuXFxuLlByb3NlTWlycm9yLW1lbnViYXIgLlByb3NlTWlycm9yLWljb24tYWN0aXZlIHtcXG4gIGJhY2tncm91bmQ6ICNlZWU7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1tZW51YmFyIGlucHV0W3R5cGU9XFxcInRleHRcXFwiXSxcXG4uUHJvc2VNaXJyb3ItbWVudWJhciB0ZXh0YXJlYSB7XFxuICBiYWNrZ3JvdW5kOiAjZWVlO1xcbiAgY29sb3I6IGJsYWNrO1xcbiAgYm9yZGVyOiBub25lO1xcbiAgb3V0bGluZTogbm9uZTtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgYm94LXNpemluZzogLW1vei1ib3JkZXItYm94O1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG59XFxuXFxuLlByb3NlTWlycm9yLW1lbnViYXIgaW5wdXRbdHlwZT1cXFwidGV4dFxcXCJdIHtcXG4gIHBhZGRpbmc6IDAgNHB4O1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItbWVudWJhciBmb3JtIHtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHBhZGRpbmc6IDJweCA0cHg7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1tZW51YmFyIC5Qcm9zZU1pcnJvci1ibG9ja3R5cGUge1xcbiAgYm9yZGVyOiAxcHggc29saWQgI2NjYztcXG4gIG1pbi13aWR0aDogNGVtO1xcbn1cXG4uUHJvc2VNaXJyb3ItbWVudWJhciAuUHJvc2VNaXJyb3ItYmxvY2t0eXBlOmFmdGVyIHtcXG4gIGNvbG9yOiAjY2NjO1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItbWVudWJhci1zbGlkaW5nIHtcXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogbGVmdCAwLjJzIGVhc2Utb3V0O1xcbiAgLW1vei10cmFuc2l0aW9uOiBsZWZ0IDAuMnMgZWFzZS1vdXQ7XFxuICB0cmFuc2l0aW9uOiBsZWZ0IDAuMnMgZWFzZS1vdXQ7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICBsZWZ0OiAxMDAlO1xcbiAgd2lkdGg6IDEwMCU7XFxuICBib3gtc2l6aW5nOiAtbW96LWJvcmRlci1ib3g7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgcGFkZGluZy1sZWZ0OiAxNnB4O1xcbiAgYmFja2dyb3VuZDogd2hpdGU7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1tZW51YmFyLWJhY2sge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbiAgbWFyZ2luLXRvcDogLTFweDtcXG4gIHBhZGRpbmctYm90dG9tOiAycHg7XFxuICB3aWR0aDogMTBweDtcXG4gIGxlZnQ6IDA7XFxuICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCBzaWx2ZXI7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5Qcm9zZU1pcnJvci1tZW51YmFyLWJhY2s6YWZ0ZXIge1xcbiAgY29udGVudDogXFxcIsKrXFxcIjtcXG59XFxuXFxuXCIpOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBfZG9tID0gcmVxdWlyZShcIi4uL2RvbVwiKTtcblxudmFyIHByZWZpeCA9IFwiUHJvc2VNaXJyb3ItdG9vbHRpcFwiO1xuXG52YXIgVG9vbHRpcCA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFRvb2x0aXAocG0sIGRpcikge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVG9vbHRpcCk7XG5cbiAgICB0aGlzLnBtID0gcG07XG4gICAgdGhpcy5kaXIgPSBkaXIgfHwgXCJhYm92ZVwiO1xuICAgIHRoaXMucG9pbnRlciA9IHBtLndyYXBwZXIuYXBwZW5kQ2hpbGQoKDAsIF9kb20uZWx0KShcImRpdlwiLCB7IFwiY2xhc3NcIjogcHJlZml4ICsgXCItcG9pbnRlci1cIiArIHRoaXMuZGlyICsgXCIgXCIgKyBwcmVmaXggKyBcIi1wb2ludGVyXCIgfSkpO1xuICAgIHRoaXMucG9pbnRlcldpZHRoID0gdGhpcy5wb2ludGVySGVpZ2h0ID0gbnVsbDtcbiAgICB0aGlzLmRvbSA9IHBtLndyYXBwZXIuYXBwZW5kQ2hpbGQoKDAsIF9kb20uZWx0KShcImRpdlwiLCB7IFwiY2xhc3NcIjogcHJlZml4IH0pKTtcbiAgICB0aGlzLmRvbS5hZGRFdmVudExpc3RlbmVyKFwidHJhbnNpdGlvbmVuZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMuZG9tLnN0eWxlLm9wYWNpdHkgPT0gXCIwXCIpIF90aGlzLmRvbS5zdHlsZS5kaXNwbGF5ID0gX3RoaXMucG9pbnRlci5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcbiAgICB9KTtcblxuICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgdGhpcy5sYXN0TGVmdCA9IHRoaXMubGFzdFJpZ2h0ID0gbnVsbDtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhUb29sdGlwLCBbe1xuICAgIGtleTogXCJkZXRhY2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGV0YWNoKCkge1xuICAgICAgdGhpcy5kb20ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmRvbSk7XG4gICAgICB0aGlzLnBvaW50ZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnBvaW50ZXIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRTaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFNpemUobm9kZSkge1xuICAgICAgdmFyIHdyYXAgPSB0aGlzLnBtLndyYXBwZXIuYXBwZW5kQ2hpbGQoKDAsIF9kb20uZWx0KShcImRpdlwiLCB7XG4gICAgICAgIFwiY2xhc3NcIjogcHJlZml4LFxuICAgICAgICBzdHlsZTogXCJkaXNwbGF5OiBibG9jazsgcG9zaXRpb246IGFic29sdXRlXCJcbiAgICAgIH0sIG5vZGUpKTtcbiAgICAgIHZhciBzaXplID0geyB3aWR0aDogd3JhcC5vZmZzZXRXaWR0aCwgaGVpZ2h0OiB3cmFwLm9mZnNldEhlaWdodCB9O1xuICAgICAgd3JhcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHdyYXApO1xuICAgICAgcmV0dXJuIHNpemU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm9wZW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb3Blbihub2RlLCBwb3MpIHtcbiAgICAgIHZhciBsZWZ0ID0gdGhpcy5sYXN0TGVmdCA9IHBvcyA/IHBvcy5sZWZ0IDogdGhpcy5sYXN0TGVmdDtcbiAgICAgIHZhciB0b3AgPSB0aGlzLmxhc3RUb3AgPSBwb3MgPyBwb3MudG9wIDogdGhpcy5sYXN0VG9wO1xuXG4gICAgICB2YXIgc2l6ZSA9IHRoaXMuZ2V0U2l6ZShub2RlKTtcblxuICAgICAgdmFyIGFyb3VuZCA9IHRoaXMucG0ud3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgZm9yICh2YXIgY2hpbGQgPSB0aGlzLmRvbS5maXJzdENoaWxkLCBuZXh0ID0gdW5kZWZpbmVkOyBjaGlsZDsgY2hpbGQgPSBuZXh0KSB7XG4gICAgICAgIG5leHQgPSBjaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgaWYgKGNoaWxkICE9IHRoaXMucG9pbnRlcikgdGhpcy5kb20ucmVtb3ZlQ2hpbGQoY2hpbGQpO1xuICAgICAgfVxuICAgICAgdGhpcy5kb20uYXBwZW5kQ2hpbGQobm9kZSk7XG5cbiAgICAgIHRoaXMuZG9tLnN0eWxlLmRpc3BsYXkgPSB0aGlzLnBvaW50ZXIuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcblxuICAgICAgaWYgKHRoaXMucG9pbnRlcldpZHRoID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5wb2ludGVyV2lkdGggPSB0aGlzLnBvaW50ZXIub2Zmc2V0V2lkdGggLSAxO1xuICAgICAgICB0aGlzLnBvaW50ZXJIZWlnaHQgPSB0aGlzLnBvaW50ZXIub2Zmc2V0SGVpZ2h0IC0gMTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kb20uc3R5bGUud2lkdGggPSBzaXplLndpZHRoICsgXCJweFwiO1xuICAgICAgdGhpcy5kb20uc3R5bGUuaGVpZ2h0ID0gc2l6ZS5oZWlnaHQgKyBcInB4XCI7XG5cbiAgICAgIHZhciBtYXJnaW4gPSA1O1xuICAgICAgaWYgKHRoaXMuZGlyID09IFwiYWJvdmVcIiB8fCB0aGlzLmRpciA9PSBcImJlbG93XCIpIHtcbiAgICAgICAgdmFyIHRpcExlZnQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihsZWZ0IC0gc2l6ZS53aWR0aCAvIDIsIHdpbmRvdy5pbm5lcldpZHRoIC0gc2l6ZS53aWR0aCkpO1xuICAgICAgICB0aGlzLmRvbS5zdHlsZS5sZWZ0ID0gdGlwTGVmdCAtIGFyb3VuZC5sZWZ0ICsgXCJweFwiO1xuICAgICAgICB0aGlzLnBvaW50ZXIuc3R5bGUubGVmdCA9IGxlZnQgLSBhcm91bmQubGVmdCAtIHRoaXMucG9pbnRlcldpZHRoIC8gMiArIFwicHhcIjtcbiAgICAgICAgaWYgKHRoaXMuZGlyID09IFwiYWJvdmVcIikge1xuICAgICAgICAgIHZhciB0aXBUb3AgPSB0b3AgLSBhcm91bmQudG9wIC0gbWFyZ2luIC0gdGhpcy5wb2ludGVySGVpZ2h0IC0gc2l6ZS5oZWlnaHQ7XG4gICAgICAgICAgdGhpcy5kb20uc3R5bGUudG9wID0gdGlwVG9wICsgXCJweFwiO1xuICAgICAgICAgIHRoaXMucG9pbnRlci5zdHlsZS50b3AgPSB0aXBUb3AgKyBzaXplLmhlaWdodCArIFwicHhcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBiZWxvd1xuICAgICAgICAgIHZhciB0aXBUb3AgPSB0b3AgLSBhcm91bmQudG9wICsgbWFyZ2luO1xuICAgICAgICAgIHRoaXMucG9pbnRlci5zdHlsZS50b3AgPSB0aXBUb3AgKyBcInB4XCI7XG4gICAgICAgICAgdGhpcy5kb20uc3R5bGUudG9wID0gdGlwVG9wICsgdGhpcy5wb2ludGVySGVpZ2h0ICsgXCJweFwiO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZGlyID09IFwibGVmdFwiIHx8IHRoaXMuZGlyID09IFwicmlnaHRcIikge1xuICAgICAgICB0aGlzLmRvbS5zdHlsZS50b3AgPSB0b3AgLSBhcm91bmQudG9wIC0gc2l6ZS5oZWlnaHQgLyAyICsgXCJweFwiO1xuICAgICAgICB0aGlzLnBvaW50ZXIuc3R5bGUudG9wID0gdG9wIC0gdGhpcy5wb2ludGVySGVpZ2h0IC8gMiAtIGFyb3VuZC50b3AgKyBcInB4XCI7XG4gICAgICAgIGlmICh0aGlzLmRpciA9PSBcImxlZnRcIikge1xuICAgICAgICAgIHZhciBwb2ludGVyTGVmdCA9IGxlZnQgLSBhcm91bmQubGVmdCAtIG1hcmdpbiAtIHRoaXMucG9pbnRlcldpZHRoO1xuICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLmxlZnQgPSBwb2ludGVyTGVmdCAtIHNpemUud2lkdGggKyBcInB4XCI7XG4gICAgICAgICAgdGhpcy5wb2ludGVyLnN0eWxlLmxlZnQgPSBwb2ludGVyTGVmdCArIFwicHhcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyByaWdodFxuICAgICAgICAgIHZhciBwb2ludGVyTGVmdCA9IGxlZnQgLSBhcm91bmQubGVmdCArIG1hcmdpbjtcbiAgICAgICAgICB0aGlzLmRvbS5zdHlsZS5sZWZ0ID0gcG9pbnRlckxlZnQgKyB0aGlzLnBvaW50ZXJXaWR0aCArIFwicHhcIjtcbiAgICAgICAgICB0aGlzLnBvaW50ZXIuc3R5bGUubGVmdCA9IHBvaW50ZXJMZWZ0ICsgXCJweFwiO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZGlyID09IFwiY2VudGVyXCIpIHtcbiAgICAgICAgdmFyIF90b3AgPSBNYXRoLm1heChhcm91bmQudG9wLCAwKSxcbiAgICAgICAgICAgIGJvdHRvbSA9IE1hdGgubWluKGFyb3VuZC5ib3R0b20sIHdpbmRvdy5pbm5lckhlaWdodCk7XG4gICAgICAgIHZhciBmcm9tVG9wID0gKGJvdHRvbSAtIF90b3AgLSBzaXplLmhlaWdodCkgLyAyO1xuICAgICAgICB0aGlzLmRvbS5zdHlsZS5sZWZ0ID0gKGFyb3VuZC53aWR0aCAtIHNpemUud2lkdGgpIC8gMiArIFwicHhcIjtcbiAgICAgICAgdGhpcy5kb20uc3R5bGUudG9wID0gX3RvcCAtIGFyb3VuZC50b3AgKyBmcm9tVG9wICsgXCJweFwiO1xuICAgICAgfVxuXG4gICAgICBnZXRDb21wdXRlZFN0eWxlKHRoaXMuZG9tKS5vcGFjaXR5O1xuICAgICAgZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLnBvaW50ZXIpLm9wYWNpdHk7XG4gICAgICB0aGlzLmRvbS5zdHlsZS5vcGFjaXR5ID0gdGhpcy5wb2ludGVyLnN0eWxlLm9wYWNpdHkgPSAxO1xuICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjbG9zZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbG9zZSgpIHtcbiAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRvbS5zdHlsZS5vcGFjaXR5ID0gdGhpcy5wb2ludGVyLnN0eWxlLm9wYWNpdHkgPSAwO1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBUb29sdGlwO1xufSkoKTtcblxuZXhwb3J0cy5Ub29sdGlwID0gVG9vbHRpcDtcblxuKDAsIF9kb20uaW5zZXJ0Q1NTKShcIlxcblxcbi5Qcm9zZU1pcnJvci10b29sdGlwIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGRpc3BsYXk6IG5vbmU7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItIGJveDtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxuXFxuICAtd2Via2l0LXRyYW5zaXRpb246IHdpZHRoIDAuNHMgZWFzZS1vdXQsIGhlaWdodCAwLjRzIGVhc2Utb3V0LCBsZWZ0IDAuNHMgZWFzZS1vdXQsIHRvcCAwLjRzIGVhc2Utb3V0LCBvcGFjaXR5IDAuMnM7XFxuICAtbW96LXRyYW5zaXRpb246IHdpZHRoIDAuNHMgZWFzZS1vdXQsIGhlaWdodCAwLjRzIGVhc2Utb3V0LCBsZWZ0IDAuNHMgZWFzZS1vdXQsIHRvcCAwLjRzIGVhc2Utb3V0LCBvcGFjaXR5IDAuMnM7XFxuICB0cmFuc2l0aW9uOiB3aWR0aCAwLjRzIGVhc2Utb3V0LCBoZWlnaHQgMC40cyBlYXNlLW91dCwgbGVmdCAwLjRzIGVhc2Utb3V0LCB0b3AgMC40cyBlYXNlLW91dCwgb3BhY2l0eSAwLjJzO1xcbiAgb3BhY2l0eTogMDtcXG5cXG4gIGJvcmRlci1yYWRpdXM6IDVweDtcXG4gIHBhZGRpbmc6IDNweCA3cHg7XFxuICBtYXJnaW46IDA7XFxuICBiYWNrZ3JvdW5kOiAjNDQ0O1xcbiAgYm9yZGVyLWNvbG9yOiAjNzc3O1xcbiAgY29sb3I6IHdoaXRlO1xcblxcbiAgei1pbmRleDogNTtcXG59XFxuXFxuLlByb3NlTWlycm9yLXRvb2x0aXAtcG9pbnRlciB7XFxuICBjb250ZW50OiBcXFwiXFxcIjtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGRpc3BsYXk6IG5vbmU7XFxuICB3aWR0aDogMDsgaGVpZ2h0OiAwO1xcblxcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiBsZWZ0IDAuNHMgZWFzZS1vdXQsIHRvcCAwLjRzIGVhc2Utb3V0LCBvcGFjaXR5IDAuMnM7XFxuICAtbW96LXRyYW5zaXRpb246IGxlZnQgMC40cyBlYXNlLW91dCwgdG9wIDAuNHMgZWFzZS1vdXQsIG9wYWNpdHkgMC4ycztcXG4gIHRyYW5zaXRpb246IGxlZnQgMC40cyBlYXNlLW91dCwgdG9wIDAuNHMgZWFzZS1vdXQsIG9wYWNpdHkgMC4ycztcXG4gIG9wYWNpdHk6IDA7XFxuXFxuICB6LWluZGV4OiAxMDtcXG59XFxuXFxuLlByb3NlTWlycm9yLXRvb2x0aXAtcG9pbnRlci1hYm92ZSB7XFxuICBib3JkZXItbGVmdDogNnB4IHNvbGlkIHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyLXJpZ2h0OiA2cHggc29saWQgdHJhbnNwYXJlbnQ7XFxuICBib3JkZXItdG9wOiA2cHggc29saWQgIzQ0NDtcXG59XFxuXFxuLlByb3NlTWlycm9yLXRvb2x0aXAtcG9pbnRlci1iZWxvdyB7XFxuICBib3JkZXItbGVmdDogNnB4IHNvbGlkIHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyLXJpZ2h0OiA2cHggc29saWQgdHJhbnNwYXJlbnQ7XFxuICBib3JkZXItYm90dG9tOiA2cHggc29saWQgIzQ0NDtcXG59XFxuXFxuLlByb3NlTWlycm9yLXRvb2x0aXAtcG9pbnRlci1yaWdodCB7XFxuICBib3JkZXItdG9wOiA2cHggc29saWQgdHJhbnNwYXJlbnQ7XFxuICBib3JkZXItYm90dG9tOiA2cHggc29saWQgdHJhbnNwYXJlbnQ7XFxuICBib3JkZXItcmlnaHQ6IDZweCBzb2xpZCAjNDQ0O1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItdG9vbHRpcC1wb2ludGVyLWxlZnQge1xcbiAgYm9yZGVyLXRvcDogNnB4IHNvbGlkIHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyLWJvdHRvbTogNnB4IHNvbGlkIHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyLWxlZnQ6IDZweCBzb2xpZCAjNDQ0O1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItdG9vbHRpcCBpbnB1dFt0eXBlPVxcXCJ0ZXh0XFxcIl0sXFxuLlByb3NlTWlycm9yLXRvb2x0aXAgdGV4dGFyZWEge1xcbiAgYmFja2dyb3VuZDogIzY2NjtcXG4gIGNvbG9yOiB3aGl0ZTtcXG4gIGJvcmRlcjogbm9uZTtcXG4gIG91dGxpbmU6IG5vbmU7XFxufVxcblxcbi5Qcm9zZU1pcnJvci10b29sdGlwIGlucHV0W3R5cGU9XFxcInRleHRcXFwiXSB7XFxuICBwYWRkaW5nOiAwIDRweDtcXG59XFxuXFxuXCIpOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBfbW9kZWwgPSByZXF1aXJlKFwiLi4vbW9kZWxcIik7XG5cbnZhciBfZWRpdCA9IHJlcXVpcmUoXCIuLi9lZGl0XCIpO1xuXG52YXIgX2RvbSA9IHJlcXVpcmUoXCIuLi9kb21cIik7XG5cbnZhciBfdXBkYXRlID0gcmVxdWlyZShcIi4vdXBkYXRlXCIpO1xuXG52YXIgX3Rvb2x0aXAgPSByZXF1aXJlKFwiLi90b29sdGlwXCIpO1xuXG52YXIgX21lbnUgPSByZXF1aXJlKFwiLi9tZW51XCIpO1xuXG52YXIgY2xhc3NQcmVmaXggPSBcIlByb3NlTWlycm9yLXRvb2x0aXBtZW51XCI7XG5cbigwLCBfZWRpdC5kZWZpbmVPcHRpb24pKFwidG9vbHRpcE1lbnVcIiwgZmFsc2UsIGZ1bmN0aW9uIChwbSwgdmFsdWUpIHtcbiAgaWYgKHBtLm1vZC50b29sdGlwTWVudSkgcG0ubW9kLnRvb2x0aXBNZW51LmRldGFjaCgpO1xuICBwbS5tb2QudG9vbHRpcE1lbnUgPSB2YWx1ZSA/IG5ldyBUb29sdGlwTWVudShwbSwgdmFsdWUpIDogbnVsbDtcbn0pO1xuXG52YXIgVG9vbHRpcE1lbnUgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBUb29sdGlwTWVudShwbSwgY29uZmlnKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUb29sdGlwTWVudSk7XG5cbiAgICB0aGlzLnBtID0gcG07XG4gICAgdGhpcy5pbmxpbmVJdGVtcyA9IGNvbmZpZyAmJiBjb25maWcuaW5saW5lSXRlbXMgfHwgKDAsIF9tZW51LmNvbW1hbmRHcm91cHMpKHBtLCBcImlubGluZVwiKTtcbiAgICB0aGlzLmJsb2NrSXRlbXMgPSBjb25maWcgJiYgY29uZmlnLmJsb2NrSXRlbXMgfHwgKDAsIF9tZW51LmNvbW1hbmRHcm91cHMpKHBtLCBcImJsb2NrXCIpO1xuICAgIHRoaXMuc2hvd0xpbmtzID0gY29uZmlnID8gY29uZmlnLnNob3dMaW5rcyAhPT0gZmFsc2UgOiB0cnVlO1xuICAgIHRoaXMuc2VsZWN0ZWRCbG9ja01lbnUgPSBjb25maWcgJiYgY29uZmlnLnNlbGVjdGVkQmxvY2tNZW51O1xuICAgIHRoaXMudXBkYXRlID0gbmV3IF91cGRhdGUuTWVudVVwZGF0ZShwbSwgXCJjaGFuZ2Ugc2VsZWN0aW9uQ2hhbmdlIGJsdXJcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnByZXBhcmVVcGRhdGUoKTtcbiAgICB9KTtcblxuICAgIHRoaXMudG9vbHRpcCA9IG5ldyBfdG9vbHRpcC5Ub29sdGlwKHBtLCBcImFib3ZlXCIpO1xuICAgIHRoaXMubWVudSA9IG5ldyBfbWVudS5NZW51KHBtLCBuZXcgX21lbnUuVG9vbHRpcERpc3BsYXkodGhpcy50b29sdGlwLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMudXBkYXRlLmZvcmNlKCk7XG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgeCBhbmQgeSBjb29yZGluYXRlcyBhdCB0aGUgdG9wIGNlbnRlciBvZiB0aGUgY3VycmVudCBET00gc2VsZWN0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuXG4gIF9jcmVhdGVDbGFzcyhUb29sdGlwTWVudSwgW3tcbiAgICBrZXk6IFwiZGV0YWNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRldGFjaCgpIHtcbiAgICAgIHRoaXMudXBkYXRlLmRldGFjaCgpO1xuICAgICAgdGhpcy50b29sdGlwLmRldGFjaCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwcmVwYXJlVXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHByZXBhcmVVcGRhdGUoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMubWVudS5hY3RpdmUpIHJldHVybiBudWxsO1xuXG4gICAgICB2YXIgX3BtJHNlbGVjdGlvbiA9IHRoaXMucG0uc2VsZWN0aW9uO1xuICAgICAgdmFyIGVtcHR5ID0gX3BtJHNlbGVjdGlvbi5lbXB0eTtcbiAgICAgIHZhciBub2RlID0gX3BtJHNlbGVjdGlvbi5ub2RlO1xuICAgICAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uLmZyb207XG4gICAgICB2YXIgdG8gPSBfcG0kc2VsZWN0aW9uLnRvO3ZhciBsaW5rID0gdW5kZWZpbmVkO1xuICAgICAgaWYgKCF0aGlzLnBtLmhhc0ZvY3VzKCkpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMyLnRvb2x0aXAuY2xvc2UoKTtcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZSAmJiBub2RlLmlzQmxvY2spIHtcbiAgICAgICAgdmFyIF9yZXQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBjb29yZHMgPSB0b3BPZk5vZGVTZWxlY3Rpb24oX3RoaXMyLnBtKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLm1lbnUuc2hvdyhfdGhpczIuYmxvY2tJdGVtcywgY29vcmRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9KSgpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgX3JldCA9PT0gXCJvYmplY3RcIikgcmV0dXJuIF9yZXQudjtcbiAgICAgIH0gZWxzZSBpZiAoIWVtcHR5KSB7XG4gICAgICAgIHZhciBfcmV0MiA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGNvb3JkcyA9IG5vZGUgPyB0b3BPZk5vZGVTZWxlY3Rpb24oX3RoaXMyLnBtKSA6IHRvcENlbnRlck9mU2VsZWN0aW9uKCk7XG4gICAgICAgICAgdmFyIHNob3dCbG9jayA9IF90aGlzMi5zZWxlY3RlZEJsb2NrTWVudSAmJiBfbW9kZWwuUG9zLnNhbWVQYXRoKGZyb20ucGF0aCwgdG8ucGF0aCkgJiYgZnJvbS5vZmZzZXQgPT0gMCAmJiB0by5vZmZzZXQgPT0gX3RoaXMyLnBtLmRvYy5wYXRoKGZyb20ucGF0aCkuc2l6ZTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLm1lbnUuc2hvdyhzaG93QmxvY2sgPyBbX3RoaXMyLmlubGluZUl0ZW1zLCBfdGhpczIuYmxvY2tJdGVtc10gOiBfdGhpczIuaW5saW5lSXRlbXMsIGNvb3Jkcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfSkoKTtcblxuICAgICAgICBpZiAodHlwZW9mIF9yZXQyID09PSBcIm9iamVjdFwiKSByZXR1cm4gX3JldDIudjtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZEJsb2NrTWVudSAmJiB0aGlzLnBtLmRvYy5wYXRoKGZyb20ucGF0aCkuc2l6ZSA9PSAwKSB7XG4gICAgICAgIHZhciBfcmV0MyA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGNvb3JkcyA9IF90aGlzMi5wbS5jb29yZHNBdFBvcyhmcm9tKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLm1lbnUuc2hvdyhfdGhpczIuYmxvY2tJdGVtcywgY29vcmRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9KSgpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgX3JldDMgPT09IFwib2JqZWN0XCIpIHJldHVybiBfcmV0My52O1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnNob3dMaW5rcyAmJiAobGluayA9IHRoaXMubGlua1VuZGVyQ3Vyc29yKCkpKSB7XG4gICAgICAgIHZhciBfcmV0NCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGNvb3JkcyA9IF90aGlzMi5wbS5jb29yZHNBdFBvcyhmcm9tKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLnNob3dMaW5rKGxpbmssIGNvb3Jkcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfSkoKTtcblxuICAgICAgICBpZiAodHlwZW9mIF9yZXQ0ID09PSBcIm9iamVjdFwiKSByZXR1cm4gX3JldDQudjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMi50b29sdGlwLmNsb3NlKCk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImxpbmtVbmRlckN1cnNvclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsaW5rVW5kZXJDdXJzb3IoKSB7XG4gICAgICB2YXIgaGVhZCA9IHRoaXMucG0uc2VsZWN0aW9uLmhlYWQ7XG4gICAgICBpZiAoIWhlYWQpIHJldHVybiBudWxsO1xuICAgICAgdmFyIG1hcmtzID0gdGhpcy5wbS5kb2MubWFya3NBdChoZWFkKTtcbiAgICAgIHJldHVybiBtYXJrcy5yZWR1Y2UoZnVuY3Rpb24gKGZvdW5kLCBtKSB7XG4gICAgICAgIHJldHVybiBmb3VuZCB8fCBtLnR5cGUubmFtZSA9PSBcImxpbmtcIiAmJiBtO1xuICAgICAgfSwgbnVsbCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNob3dMaW5rXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNob3dMaW5rKGxpbmssIHBvcykge1xuICAgICAgdmFyIG5vZGUgPSAoMCwgX2RvbS5lbHQpKFwiZGl2XCIsIHsgXCJjbGFzc1wiOiBjbGFzc1ByZWZpeCArIFwiLWxpbmt0ZXh0XCIgfSwgKDAsIF9kb20uZWx0KShcImFcIiwgeyBocmVmOiBsaW5rLmF0dHJzLmhyZWYsIHRpdGxlOiBsaW5rLmF0dHJzLnRpdGxlIH0sIGxpbmsuYXR0cnMuaHJlZikpO1xuICAgICAgdGhpcy50b29sdGlwLm9wZW4obm9kZSwgcG9zKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVG9vbHRpcE1lbnU7XG59KSgpO1xuXG5mdW5jdGlvbiB0b3BDZW50ZXJPZlNlbGVjdGlvbigpIHtcbiAgdmFyIHJlY3RzID0gd2luZG93LmdldFNlbGVjdGlvbigpLmdldFJhbmdlQXQoMCkuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgdmFyIF9yZWN0cyQwID0gcmVjdHNbMF07XG4gIHZhciBsZWZ0ID0gX3JlY3RzJDAubGVmdDtcbiAgdmFyIHJpZ2h0ID0gX3JlY3RzJDAucmlnaHQ7XG4gIHZhciB0b3AgPSBfcmVjdHMkMC50b3A7dmFyIGkgPSAxO1xuICB3aGlsZSAobGVmdCA9PSByaWdodCAmJiByZWN0cy5sZW5ndGggPiBpKSB7XG4gICAgO3ZhciBfcmVjdHMgPSByZWN0c1tpKytdO1xuICAgIGxlZnQgPSBfcmVjdHMubGVmdDtcbiAgICByaWdodCA9IF9yZWN0cy5yaWdodDtcbiAgICB0b3AgPSBfcmVjdHMudG9wO1xuICB9XG4gIGZvciAoOyBpIDwgcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAocmVjdHNbaV0udG9wIDwgcmVjdHNbMF0uYm90dG9tIC0gMSAmJiAoXG4gICAgLy8gQ2hyb21lIGJ1ZyB3aGVyZSBib2d1cyByZWN0YW5nbGVzIGFyZSBpbnNlcnRlZCBhdCBzcGFuIGJvdW5kYXJpZXNcbiAgICBpID09IHJlY3RzLmxlbmd0aCAtIDEgfHwgTWF0aC5hYnMocmVjdHNbaSArIDFdLmxlZnQgLSByZWN0c1tpXS5sZWZ0KSA+IDEpKSB7XG4gICAgICBsZWZ0ID0gTWF0aC5taW4obGVmdCwgcmVjdHNbaV0ubGVmdCk7XG4gICAgICByaWdodCA9IE1hdGgubWF4KHJpZ2h0LCByZWN0c1tpXS5yaWdodCk7XG4gICAgICB0b3AgPSBNYXRoLm1pbih0b3AsIHJlY3RzW2ldLnRvcCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IHRvcDogdG9wLCBsZWZ0OiAobGVmdCArIHJpZ2h0KSAvIDIgfTtcbn1cblxuZnVuY3Rpb24gdG9wT2ZOb2RlU2VsZWN0aW9uKHBtKSB7XG4gIHZhciBzZWxlY3RlZCA9IHBtLmNvbnRlbnQucXVlcnlTZWxlY3RvcihcIi5Qcm9zZU1pcnJvci1zZWxlY3RlZG5vZGVcIik7XG4gIGlmICghc2VsZWN0ZWQpIHJldHVybiB7IGxlZnQ6IDAsIHRvcDogMCB9O1xuICB2YXIgYm94ID0gc2VsZWN0ZWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHJldHVybiB7IGxlZnQ6IE1hdGgubWluKChib3gubGVmdCArIGJveC5yaWdodCkgLyAyLCBib3gubGVmdCArIDIwKSwgdG9wOiBib3gudG9wIH07XG59XG5cbigwLCBfZG9tLmluc2VydENTUykoXCJcXG5cXG4uUHJvc2VNaXJyb3ItdG9vbHRpcG1lbnUtbGlua3RleHQgYSB7XFxuICBjb2xvcjogd2hpdGU7XFxuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxuICBwYWRkaW5nOiAwIDVweDtcXG59XFxuXFxuLlByb3NlTWlycm9yLXRvb2x0aXBtZW51LWxpbmt0ZXh0IGE6aG92ZXIge1xcbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XFxufVxcblxcblwiKTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgTUlOX0ZMVVNIX0RFTEFZID0gMjAwO1xudmFyIFVQREFURV9USU1FT1VUID0gMjAwO1xuXG52YXIgTWVudVVwZGF0ZSA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE1lbnVVcGRhdGUocG0sIGV2ZW50cywgcHJlcGFyZSkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTWVudVVwZGF0ZSk7XG5cbiAgICB0aGlzLnBtID0gcG07XG4gICAgdGhpcy5wcmVwYXJlID0gcHJlcGFyZTtcblxuICAgIHRoaXMubXVzdFVwZGF0ZSA9IGZhbHNlO1xuICAgIHRoaXMudXBkYXRlSW5mbyA9IG51bGw7XG4gICAgdGhpcy50aW1lb3V0ID0gbnVsbDtcbiAgICB0aGlzLmxhc3RGbHVzaCA9IDA7XG5cbiAgICB0aGlzLmV2ZW50cyA9IGV2ZW50cy5zcGxpdChcIiBcIik7XG4gICAgdGhpcy5vbkV2ZW50ID0gdGhpcy5vbkV2ZW50LmJpbmQodGhpcyk7XG4gICAgdGhpcy5mb3JjZSA9IHRoaXMuZm9yY2UuYmluZCh0aGlzKTtcbiAgICB0aGlzLmV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgcmV0dXJuIHBtLm9uKGV2ZW50LCBfdGhpcy5vbkV2ZW50KTtcbiAgICB9KTtcbiAgICBwbS5vbihcImZsdXNoXCIsIHRoaXMub25GbHVzaCA9IHRoaXMub25GbHVzaC5iaW5kKHRoaXMpKTtcbiAgICBwbS5vbihcImZsdXNoZWRcIiwgdGhpcy5vbkZsdXNoZWQgPSB0aGlzLm9uRmx1c2hlZC5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhNZW51VXBkYXRlLCBbe1xuICAgIGtleTogXCJkZXRhY2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGV0YWNoKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xuICAgICAgdGhpcy5ldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMi5wbS5vZmYoZXZlbnQsIF90aGlzMi5vbkV2ZW50KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5wbS5vZmYoXCJmbHVzaFwiLCB0aGlzLm9uRmx1c2gpO1xuICAgICAgdGhpcy5wbS5vZmYoXCJmbHVzaGVkXCIsIHRoaXMub25GbHVzaGVkKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwib25GbHVzaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbkZsdXNoKCkge1xuICAgICAgdmFyIG5vdyA9IERhdGUubm93KCk7XG4gICAgICBpZiAodGhpcy5tdXN0VXBkYXRlICYmIG5vdyAtIHRoaXMubGFzdEZsdXNoID49IE1JTl9GTFVTSF9ERUxBWSkge1xuICAgICAgICB0aGlzLmxhc3RGbHVzaCA9IG5vdztcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XG4gICAgICAgIHRoaXMubXVzdFVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnVwZGF0ZSA9IHRoaXMucHJlcGFyZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvbkZsdXNoZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25GbHVzaGVkKCkge1xuICAgICAgaWYgKHRoaXMudXBkYXRlKSB7XG4gICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIHRoaXMudXBkYXRlID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwib25FdmVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbkV2ZW50KCkge1xuICAgICAgdGhpcy5tdXN0VXBkYXRlID0gdHJ1ZTtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xuICAgICAgdGhpcy50aW1lb3V0ID0gc2V0VGltZW91dCh0aGlzLmZvcmNlLCBVUERBVEVfVElNRU9VVCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZvcmNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZvcmNlKCkge1xuICAgICAgaWYgKHRoaXMucG0ub3BlcmF0aW9uKSB7XG4gICAgICAgIHRoaXMub25FdmVudCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5tdXN0VXBkYXRlID0gZmFsc2U7XG4gICAgICAgIHRoaXMudXBkYXRlSW5mbyA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdEZsdXNoID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XG4gICAgICAgIHZhciB1cGRhdGUgPSB0aGlzLnByZXBhcmUoKTtcbiAgICAgICAgaWYgKHVwZGF0ZSkgdXBkYXRlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE1lbnVVcGRhdGU7XG59KSgpO1xuXG5leHBvcnRzLk1lbnVVcGRhdGUgPSBNZW51VXBkYXRlOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbnZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KF94LCBfeDIsIF94MykgeyB2YXIgX2FnYWluID0gdHJ1ZTsgX2Z1bmN0aW9uOiB3aGlsZSAoX2FnYWluKSB7IHZhciBvYmplY3QgPSBfeCwgcHJvcGVydHkgPSBfeDIsIHJlY2VpdmVyID0gX3gzOyBfYWdhaW4gPSBmYWxzZTsgaWYgKG9iamVjdCA9PT0gbnVsbCkgb2JqZWN0ID0gRnVuY3Rpb24ucHJvdG90eXBlOyB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7IGlmIChkZXNjID09PSB1bmRlZmluZWQpIHsgdmFyIHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpOyBpZiAocGFyZW50ID09PSBudWxsKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gZWxzZSB7IF94ID0gcGFyZW50OyBfeDIgPSBwcm9wZXJ0eTsgX3gzID0gcmVjZWl2ZXI7IF9hZ2FpbiA9IHRydWU7IGRlc2MgPSBwYXJlbnQgPSB1bmRlZmluZWQ7IGNvbnRpbnVlIF9mdW5jdGlvbjsgfSB9IGVsc2UgaWYgKFwidmFsdWVcIiBpbiBkZXNjKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfSB9O1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIF9zY2hlbWEgPSByZXF1aXJlKFwiLi9zY2hlbWFcIik7XG5cbi8vIDs7ICN0b2M9XCJEZWZhdWx0IHNjaGVtYVwiIFRoZSBkZWZhdWx0IHRvcC1sZXZlbCBkb2N1bWVudCBub2RlIHR5cGUuXG5cbnZhciBEb2MgPSAoZnVuY3Rpb24gKF9CbG9jaykge1xuICBfaW5oZXJpdHMoRG9jLCBfQmxvY2spO1xuXG4gIGZ1bmN0aW9uIERvYygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRG9jKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKERvYy5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICAvLyA7OyAjdG9jPWZhbHNlIFRoZSBkZWZhdWx0IGJsb2NrcXVvdGUgbm9kZSB0eXBlLlxuXG4gIF9jcmVhdGVDbGFzcyhEb2MsIG51bGwsIFt7XG4gICAga2V5OiBcImtpbmRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBcIi5cIjtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRG9jO1xufSkoX3NjaGVtYS5CbG9jayk7XG5cbmV4cG9ydHMuRG9jID0gRG9jO1xuXG52YXIgQmxvY2tRdW90ZSA9IChmdW5jdGlvbiAoX0Jsb2NrMikge1xuICBfaW5oZXJpdHMoQmxvY2tRdW90ZSwgX0Jsb2NrMik7XG5cbiAgZnVuY3Rpb24gQmxvY2tRdW90ZSgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQmxvY2tRdW90ZSk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihCbG9ja1F1b3RlLnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIC8vIDs7ICN0b2M9ZmFsc2UgVGhlIGRlZmF1bHQgb3JkZXJlZCBsaXN0IG5vZGUgdHlwZS4gSGFzIGEgc2luZ2xlIGF0dHJpYnV0ZSxcbiAgLy8gYG9yZGVyYCwgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIGF0IHdoaWNoIHRoZSBsaXN0IHN0YXJ0c1xuICAvLyBjb3VudGluZywgYW5kIGRlZmF1bHRzIHRvIDEuXG4gIHJldHVybiBCbG9ja1F1b3RlO1xufSkoX3NjaGVtYS5CbG9jayk7XG5cbmV4cG9ydHMuQmxvY2tRdW90ZSA9IEJsb2NrUXVvdGU7XG5cbnZhciBPcmRlcmVkTGlzdCA9IChmdW5jdGlvbiAoX0Jsb2NrMykge1xuICBfaW5oZXJpdHMoT3JkZXJlZExpc3QsIF9CbG9jazMpO1xuXG4gIGZ1bmN0aW9uIE9yZGVyZWRMaXN0KCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBPcmRlcmVkTGlzdCk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihPcmRlcmVkTGlzdC5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoT3JkZXJlZExpc3QsIG51bGwsIFt7XG4gICAga2V5OiBcImNvbnRhaW5zXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gXCJsaXN0X2l0ZW1cIjtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gT3JkZXJlZExpc3Q7XG59KShfc2NoZW1hLkJsb2NrKTtcblxuZXhwb3J0cy5PcmRlcmVkTGlzdCA9IE9yZGVyZWRMaXN0O1xuXG5PcmRlcmVkTGlzdC5hdHRyaWJ1dGVzID0geyBvcmRlcjogbmV3IF9zY2hlbWEuQXR0cmlidXRlKHsgXCJkZWZhdWx0XCI6IFwiMVwiIH0pIH07XG5cbi8vIDs7ICN0b2M9ZmFsc2UgVGhlIGRlZmF1bHQgYnVsbGV0IGxpc3Qgbm9kZSB0eXBlLlxuXG52YXIgQnVsbGV0TGlzdCA9IChmdW5jdGlvbiAoX0Jsb2NrNCkge1xuICBfaW5oZXJpdHMoQnVsbGV0TGlzdCwgX0Jsb2NrNCk7XG5cbiAgZnVuY3Rpb24gQnVsbGV0TGlzdCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQnVsbGV0TGlzdCk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihCdWxsZXRMaXN0LnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIC8vIDs7ICN0b2M9ZmFsc2UgVGhlIGRlZmF1bHQgbGlzdCBpdGVtIG5vZGUgdHlwZS5cblxuICBfY3JlYXRlQ2xhc3MoQnVsbGV0TGlzdCwgbnVsbCwgW3tcbiAgICBrZXk6IFwiY29udGFpbnNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBcImxpc3RfaXRlbVwiO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBCdWxsZXRMaXN0O1xufSkoX3NjaGVtYS5CbG9jayk7XG5cbmV4cG9ydHMuQnVsbGV0TGlzdCA9IEJ1bGxldExpc3Q7XG5cbnZhciBMaXN0SXRlbSA9IChmdW5jdGlvbiAoX0Jsb2NrNSkge1xuICBfaW5oZXJpdHMoTGlzdEl0ZW0sIF9CbG9jazUpO1xuXG4gIGZ1bmN0aW9uIExpc3RJdGVtKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBMaXN0SXRlbSk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihMaXN0SXRlbS5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICAvLyA7OyAjdG9jPWZhbHNlIFRoZSBkZWZhdWx0IGhvcml6b250YWwgcnVsZSBub2RlIHR5cGUuXG5cbiAgX2NyZWF0ZUNsYXNzKExpc3RJdGVtLCBudWxsLCBbe1xuICAgIGtleTogXCJraW5kXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gXCIuXCI7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIExpc3RJdGVtO1xufSkoX3NjaGVtYS5CbG9jayk7XG5cbmV4cG9ydHMuTGlzdEl0ZW0gPSBMaXN0SXRlbTtcblxudmFyIEhvcml6b250YWxSdWxlID0gKGZ1bmN0aW9uIChfQmxvY2s2KSB7XG4gIF9pbmhlcml0cyhIb3Jpem9udGFsUnVsZSwgX0Jsb2NrNik7XG5cbiAgZnVuY3Rpb24gSG9yaXpvbnRhbFJ1bGUoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEhvcml6b250YWxSdWxlKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKEhvcml6b250YWxSdWxlLnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIC8vIDs7ICN0b2M9ZmFsc2UgVGhlIGRlZmF1bHQgaGVhZGluZyBub2RlIHR5cGUuIEhhcyBhIHNpbmdsZSBhdHRyaWJ1dGVcbiAgLy8gYGxldmVsYCwgd2hpY2ggaW5kaWNhdGVzIHRoZSBoZWFkaW5nIGxldmVsLCBhbmQgZGVmYXVsdHMgdG8gMS5cblxuICBfY3JlYXRlQ2xhc3MoSG9yaXpvbnRhbFJ1bGUsIG51bGwsIFt7XG4gICAga2V5OiBcImNvbnRhaW5zXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSG9yaXpvbnRhbFJ1bGU7XG59KShfc2NoZW1hLkJsb2NrKTtcblxuZXhwb3J0cy5Ib3Jpem9udGFsUnVsZSA9IEhvcml6b250YWxSdWxlO1xuXG52YXIgSGVhZGluZyA9IChmdW5jdGlvbiAoX1RleHRibG9jaykge1xuICBfaW5oZXJpdHMoSGVhZGluZywgX1RleHRibG9jayk7XG5cbiAgZnVuY3Rpb24gSGVhZGluZygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSGVhZGluZyk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihIZWFkaW5nLnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBIZWFkaW5nO1xufSkoX3NjaGVtYS5UZXh0YmxvY2spO1xuXG5leHBvcnRzLkhlYWRpbmcgPSBIZWFkaW5nO1xuXG5IZWFkaW5nLmF0dHJpYnV0ZXMgPSB7IGxldmVsOiBuZXcgX3NjaGVtYS5BdHRyaWJ1dGUoeyBcImRlZmF1bHRcIjogXCIxXCIgfSkgfTtcblxuLy8gOzsgI3RvYz1mYWxzZSBUaGUgZGVmYXVsdCBjb2RlIGJsb2NrIC8gbGlzdGluZyBub2RlIHR5cGUuIE9ubHlcbi8vIGFsbG93cyB1bm1hcmtlZCB0ZXh0IG5vZGVzIGluc2lkZSBvZiBpdC5cblxudmFyIENvZGVCbG9jayA9IChmdW5jdGlvbiAoX1RleHRibG9jazIpIHtcbiAgX2luaGVyaXRzKENvZGVCbG9jaywgX1RleHRibG9jazIpO1xuXG4gIGZ1bmN0aW9uIENvZGVCbG9jaygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29kZUJsb2NrKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKENvZGVCbG9jay5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICAvLyA7OyAjdG9jPWZhbHNlIFRoZSBkZWZhdWx0IHBhcmFncmFwaCBub2RlIHR5cGUuXG5cbiAgX2NyZWF0ZUNsYXNzKENvZGVCbG9jaywgW3tcbiAgICBrZXk6IFwiY29udGFpbnNNYXJrc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc0NvZGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImNvbnRhaW5zXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gXCJ0ZXh0XCI7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIENvZGVCbG9jaztcbn0pKF9zY2hlbWEuVGV4dGJsb2NrKTtcblxuZXhwb3J0cy5Db2RlQmxvY2sgPSBDb2RlQmxvY2s7XG5cbnZhciBQYXJhZ3JhcGggPSAoZnVuY3Rpb24gKF9UZXh0YmxvY2szKSB7XG4gIF9pbmhlcml0cyhQYXJhZ3JhcGgsIF9UZXh0YmxvY2szKTtcblxuICBmdW5jdGlvbiBQYXJhZ3JhcGgoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBhcmFncmFwaCk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihQYXJhZ3JhcGgucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgLy8gOzsgI3RvYz1mYWxzZSBUaGUgZGVmYXVsdCBpbmxpbmUgaW1hZ2Ugbm9kZSB0eXBlLiBIYXMgdGhlc2VcbiAgLy8gYXR0cmlidXRlczpcbiAgLy9cbiAgLy8gLSAqKmBzcmNgKiogKHJlcXVpcmVkKTogVGhlIFVSTCBvZiB0aGUgaW1hZ2UuXG4gIC8vIC0gKipgYWx0YCoqOiBUaGUgYWx0IHRleHQuXG4gIC8vIC0gKipgdGl0bGVgKio6IFRoZSB0aXRsZSBvZiB0aGUgaW1hZ2UuXG5cbiAgX2NyZWF0ZUNsYXNzKFBhcmFncmFwaCwgW3tcbiAgICBrZXk6IFwiZGVmYXVsdFRleHRibG9ja1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFBhcmFncmFwaDtcbn0pKF9zY2hlbWEuVGV4dGJsb2NrKTtcblxuZXhwb3J0cy5QYXJhZ3JhcGggPSBQYXJhZ3JhcGg7XG5cbnZhciBJbWFnZSA9IChmdW5jdGlvbiAoX0lubGluZSkge1xuICBfaW5oZXJpdHMoSW1hZ2UsIF9JbmxpbmUpO1xuXG4gIGZ1bmN0aW9uIEltYWdlKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBJbWFnZSk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihJbWFnZS5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gSW1hZ2U7XG59KShfc2NoZW1hLklubGluZSk7XG5cbmV4cG9ydHMuSW1hZ2UgPSBJbWFnZTtcblxuSW1hZ2UuYXR0cmlidXRlcyA9IHtcbiAgc3JjOiBuZXcgX3NjaGVtYS5BdHRyaWJ1dGUoKSxcbiAgYWx0OiBuZXcgX3NjaGVtYS5BdHRyaWJ1dGUoeyBcImRlZmF1bHRcIjogXCJcIiB9KSxcbiAgdGl0bGU6IG5ldyBfc2NoZW1hLkF0dHJpYnV0ZSh7IFwiZGVmYXVsdFwiOiBcIlwiIH0pXG59O1xuXG4vLyA7OyAjdG9jPWZhbHNlIFRoZSBkZWZhdWx0IGhhcmQgYnJlYWsgbm9kZSB0eXBlLlxuXG52YXIgSGFyZEJyZWFrID0gKGZ1bmN0aW9uIChfSW5saW5lMikge1xuICBfaW5oZXJpdHMoSGFyZEJyZWFrLCBfSW5saW5lMik7XG5cbiAgZnVuY3Rpb24gSGFyZEJyZWFrKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBIYXJkQnJlYWspO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoSGFyZEJyZWFrLnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIC8vIDs7ICN0b2M9ZmFsc2UgVGhlIGRlZmF1bHQgZW1waGFzaXMgbWFyayB0eXBlLlxuXG4gIF9jcmVhdGVDbGFzcyhIYXJkQnJlYWssIFt7XG4gICAga2V5OiBcInNlbGVjdGFibGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNCUlwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEhhcmRCcmVhaztcbn0pKF9zY2hlbWEuSW5saW5lKTtcblxuZXhwb3J0cy5IYXJkQnJlYWsgPSBIYXJkQnJlYWs7XG5cbnZhciBFbU1hcmsgPSAoZnVuY3Rpb24gKF9NYXJrVHlwZSkge1xuICBfaW5oZXJpdHMoRW1NYXJrLCBfTWFya1R5cGUpO1xuXG4gIGZ1bmN0aW9uIEVtTWFyaygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRW1NYXJrKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKEVtTWFyay5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICAvLyA7OyAjdG9jPWZhbHNlIFRoZSBkZWZhdWx0IHN0cm9uZyBtYXJrIHR5cGUuXG5cbiAgX2NyZWF0ZUNsYXNzKEVtTWFyaywgbnVsbCwgW3tcbiAgICBrZXk6IFwicmFua1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIDUxO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBFbU1hcms7XG59KShfc2NoZW1hLk1hcmtUeXBlKTtcblxuZXhwb3J0cy5FbU1hcmsgPSBFbU1hcms7XG5cbnZhciBTdHJvbmdNYXJrID0gKGZ1bmN0aW9uIChfTWFya1R5cGUyKSB7XG4gIF9pbmhlcml0cyhTdHJvbmdNYXJrLCBfTWFya1R5cGUyKTtcblxuICBmdW5jdGlvbiBTdHJvbmdNYXJrKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTdHJvbmdNYXJrKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKFN0cm9uZ01hcmsucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgLy8gOzsgI3RvYz1mYWxzZSBUaGUgZGVmYXVsdCBsaW5rIG1hcmsgdHlwZS4gSGFzIHRoZXNlIGF0dHJpYnV0ZXM6XG4gIC8vXG4gIC8vIC0gKipgaHJlZmAqKiAocmVxdWlyZWQpOiBUaGUgbGluayB0YXJnZXQuXG4gIC8vIC0gKipgdGl0bGVgKio6IFRoZSBsaW5rJ3MgdGl0bGUuXG5cbiAgX2NyZWF0ZUNsYXNzKFN0cm9uZ01hcmssIG51bGwsIFt7XG4gICAga2V5OiBcInJhbmtcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiA1MjtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gU3Ryb25nTWFyaztcbn0pKF9zY2hlbWEuTWFya1R5cGUpO1xuXG5leHBvcnRzLlN0cm9uZ01hcmsgPSBTdHJvbmdNYXJrO1xuXG52YXIgTGlua01hcmsgPSAoZnVuY3Rpb24gKF9NYXJrVHlwZTMpIHtcbiAgX2luaGVyaXRzKExpbmtNYXJrLCBfTWFya1R5cGUzKTtcblxuICBmdW5jdGlvbiBMaW5rTWFyaygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTGlua01hcmspO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoTGlua01hcmsucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKExpbmtNYXJrLCBudWxsLCBbe1xuICAgIGtleTogXCJyYW5rXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gNTM7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIExpbmtNYXJrO1xufSkoX3NjaGVtYS5NYXJrVHlwZSk7XG5cbmV4cG9ydHMuTGlua01hcmsgPSBMaW5rTWFyaztcblxuTGlua01hcmsuYXR0cmlidXRlcyA9IHtcbiAgaHJlZjogbmV3IF9zY2hlbWEuQXR0cmlidXRlKCksXG4gIHRpdGxlOiBuZXcgX3NjaGVtYS5BdHRyaWJ1dGUoeyBcImRlZmF1bHRcIjogXCJcIiB9KVxufTtcblxuLy8gOzsgI3RvYz1mYWxzZSBUaGUgZGVmYXVsdCBjb2RlIGZvbnQgbWFyayB0eXBlLlxuXG52YXIgQ29kZU1hcmsgPSAoZnVuY3Rpb24gKF9NYXJrVHlwZTQpIHtcbiAgX2luaGVyaXRzKENvZGVNYXJrLCBfTWFya1R5cGU0KTtcblxuICBmdW5jdGlvbiBDb2RlTWFyaygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29kZU1hcmspO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoQ29kZU1hcmsucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgLy8gOjogU2NoZW1hU3BlY1xuICAvLyBUaGUgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIGRlZmF1bHQgc2NoZW1hLlxuXG4gIF9jcmVhdGVDbGFzcyhDb2RlTWFyaywgW3tcbiAgICBrZXk6IFwiaXNDb2RlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJyYW5rXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gMTAxO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBDb2RlTWFyaztcbn0pKF9zY2hlbWEuTWFya1R5cGUpO1xuXG5leHBvcnRzLkNvZGVNYXJrID0gQ29kZU1hcms7XG52YXIgZGVmYXVsdFNwZWMgPSBuZXcgX3NjaGVtYS5TY2hlbWFTcGVjKHtcbiAgZG9jOiBEb2MsXG4gIGJsb2NrcXVvdGU6IEJsb2NrUXVvdGUsXG4gIG9yZGVyZWRfbGlzdDogT3JkZXJlZExpc3QsXG4gIGJ1bGxldF9saXN0OiBCdWxsZXRMaXN0LFxuICBsaXN0X2l0ZW06IExpc3RJdGVtLFxuICBob3Jpem9udGFsX3J1bGU6IEhvcml6b250YWxSdWxlLFxuXG4gIHBhcmFncmFwaDogUGFyYWdyYXBoLFxuICBoZWFkaW5nOiBIZWFkaW5nLFxuICBjb2RlX2Jsb2NrOiBDb2RlQmxvY2ssXG5cbiAgdGV4dDogX3NjaGVtYS5UZXh0LFxuICBpbWFnZTogSW1hZ2UsXG4gIGhhcmRfYnJlYWs6IEhhcmRCcmVha1xufSwge1xuICBlbTogRW1NYXJrLFxuICBzdHJvbmc6IFN0cm9uZ01hcmssXG4gIGxpbms6IExpbmtNYXJrLFxuICBjb2RlOiBDb2RlTWFya1xufSk7XG5cbi8vIDo6IFNjaGVtYVxuLy8gUHJvc2VNaXJyb3IncyBkZWZhdWx0IGRvY3VtZW50IHNjaGVtYS5cbnZhciBkZWZhdWx0U2NoZW1hID0gbmV3IF9zY2hlbWEuU2NoZW1hKGRlZmF1bHRTcGVjKTtcbmV4cG9ydHMuZGVmYXVsdFNjaGVtYSA9IGRlZmF1bHRTY2hlbWE7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmZpbmREaWZmU3RhcnQgPSBmaW5kRGlmZlN0YXJ0O1xuZXhwb3J0cy5maW5kRGlmZkVuZCA9IGZpbmREaWZmRW5kO1xuXG52YXIgX3BvcyA9IHJlcXVpcmUoXCIuL3Bvc1wiKTtcblxuLy8gOjogKE5vZGUsIE5vZGUpIOKGkiA/UG9zXG4vLyBGaW5kIHRoZSBmaXJzdCBwb3NpdGlvbiBhdCB3aGljaCBub2RlcyBgYWAgYW5kIGBiYCBkaWZmZXIsIG9yXG4vLyBgbnVsbGAgaWYgdGhleSBhcmUgdGhlIHNhbWUuXG5cbmZ1bmN0aW9uIGZpbmREaWZmU3RhcnQoYSwgYikge1xuICB2YXIgcGF0aCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMiB8fCBhcmd1bWVudHNbMl0gPT09IHVuZGVmaW5lZCA/IFtdIDogYXJndW1lbnRzWzJdO1xuXG4gIHZhciBpQSA9IGEuaXRlcigpLFxuICAgICAgaUIgPSBiLml0ZXIoKSxcbiAgICAgIG9mZnNldCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICBpZiAoaUEuYXRFbmQoKSB8fCBpQi5hdEVuZCgpKSB7XG4gICAgICBpZiAoYS5zaXplID09IGIuc2l6ZSkgcmV0dXJuIG51bGw7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgY2hpbGRBID0gaUEubmV4dCgpLFxuICAgICAgICBjaGlsZEIgPSBpQi5uZXh0KCk7XG4gICAgaWYgKGNoaWxkQSA9PSBjaGlsZEIpIHtcbiAgICAgIG9mZnNldCArPSBjaGlsZEEud2lkdGg7Y29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFjaGlsZEEuc2FtZU1hcmt1cChjaGlsZEIpKSBicmVhaztcblxuICAgIGlmIChjaGlsZEEuaXNUZXh0ICYmIGNoaWxkQS50ZXh0ICE9IGNoaWxkQi50ZXh0KSB7XG4gICAgICBmb3IgKHZhciBqID0gMDsgY2hpbGRBLnRleHRbal0gPT0gY2hpbGRCLnRleHRbal07IGorKykge1xuICAgICAgICBvZmZzZXQrKztcbiAgICAgIH1icmVhaztcbiAgICB9XG5cbiAgICBpZiAoY2hpbGRBLnNpemUgfHwgY2hpbGRCLnNpemUpIHtcbiAgICAgIHBhdGgucHVzaChvZmZzZXQpO1xuICAgICAgdmFyIGlubmVyID0gZmluZERpZmZTdGFydChjaGlsZEEuY29udGVudCwgY2hpbGRCLmNvbnRlbnQsIHBhdGgpO1xuICAgICAgaWYgKGlubmVyKSByZXR1cm4gaW5uZXI7XG4gICAgICBwYXRoLnBvcCgpO1xuICAgIH1cbiAgICBvZmZzZXQgKz0gY2hpbGRBLndpZHRoO1xuICB9XG4gIHJldHVybiBuZXcgX3Bvcy5Qb3MocGF0aCwgb2Zmc2V0KTtcbn1cblxuLy8gOjogKE5vZGUsIE5vZGUpIOKGkiA/e2E6IFBvcywgYjogUG9zfVxuLy8gRmluZCB0aGUgZmlyc3QgcG9zaXRpb24sIHNlYXJjaGluZyBmcm9tIHRoZSBlbmQsIGF0IHdoaWNoIG5vZGVzIGBhYFxuLy8gYW5kIGBiYCBkaWZmZXIsIG9yIGBudWxsYCBpZiB0aGV5IGFyZSB0aGUgc2FtZS4gU2luY2UgdGhpcyBwb3NpdGlvblxuLy8gd2lsbCBub3QgYmUgdGhlIHNhbWUgaW4gYm90aCBub2RlcywgYW4gb2JqZWN0IHdpdGggdHdvIHNlcGFyYXRlXG4vLyBwb3NpdGlvbnMgaXMgcmV0dXJuZWQuXG5cbmZ1bmN0aW9uIGZpbmREaWZmRW5kKGEsIGIpIHtcbiAgdmFyIHBhdGhBID0gYXJndW1lbnRzLmxlbmd0aCA8PSAyIHx8IGFyZ3VtZW50c1syXSA9PT0gdW5kZWZpbmVkID8gW10gOiBhcmd1bWVudHNbMl07XG4gIHZhciBwYXRoQiA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMyB8fCBhcmd1bWVudHNbM10gPT09IHVuZGVmaW5lZCA/IFtdIDogYXJndW1lbnRzWzNdO1xuXG4gIHZhciBpQSA9IGEucmV2ZXJzZUl0ZXIoKSxcbiAgICAgIGlCID0gYi5yZXZlcnNlSXRlcigpO1xuICB2YXIgb2ZmQSA9IGEuc2l6ZSxcbiAgICAgIG9mZkIgPSBiLnNpemU7XG5cbiAgZm9yICg7Oykge1xuICAgIGlmIChpQS5hdEVuZCgpIHx8IGlCLmF0RW5kKCkpIHtcbiAgICAgIGlmIChhLnNpemUgPT0gYi5zaXplKSByZXR1cm4gbnVsbDtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB2YXIgY2hpbGRBID0gaUEubmV4dCgpLFxuICAgICAgICBjaGlsZEIgPSBpQi5uZXh0KCk7XG4gICAgaWYgKGNoaWxkQSA9PSBjaGlsZEIpIHtcbiAgICAgIG9mZkEgLT0gY2hpbGRBLndpZHRoO29mZkIgLT0gY2hpbGRCLndpZHRoO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFjaGlsZEEuc2FtZU1hcmt1cChjaGlsZEIpKSBicmVhaztcblxuICAgIGlmIChjaGlsZEEuaXNUZXh0ICYmIGNoaWxkQS50ZXh0ICE9IGNoaWxkQi50ZXh0KSB7XG4gICAgICB2YXIgc2FtZSA9IDAsXG4gICAgICAgICAgbWluU2l6ZSA9IE1hdGgubWluKGNoaWxkQS50ZXh0Lmxlbmd0aCwgY2hpbGRCLnRleHQubGVuZ3RoKTtcbiAgICAgIHdoaWxlIChzYW1lIDwgbWluU2l6ZSAmJiBjaGlsZEEudGV4dFtjaGlsZEEudGV4dC5sZW5ndGggLSBzYW1lIC0gMV0gPT0gY2hpbGRCLnRleHRbY2hpbGRCLnRleHQubGVuZ3RoIC0gc2FtZSAtIDFdKSB7XG4gICAgICAgIHNhbWUrKztvZmZBLS07b2ZmQi0tO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIG9mZkEgLT0gY2hpbGRBLndpZHRoO29mZkIgLT0gY2hpbGRCLndpZHRoO1xuICAgIGlmIChjaGlsZEEuc2l6ZSB8fCBjaGlsZEIuc2l6ZSkge1xuICAgICAgcGF0aEEucHVzaChvZmZBKTtwYXRoQi5wdXNoKG9mZkIpO1xuICAgICAgdmFyIGlubmVyID0gZmluZERpZmZFbmQoY2hpbGRBLmNvbnRlbnQsIGNoaWxkQi5jb250ZW50LCBwYXRoQSwgcGF0aEIpO1xuICAgICAgaWYgKGlubmVyKSByZXR1cm4gaW5uZXI7XG4gICAgICBwYXRoQS5wb3AoKTtwYXRoQi5wb3AoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgYTogbmV3IF9wb3MuUG9zKHBhdGhBLCBvZmZBKSwgYjogbmV3IF9wb3MuUG9zKHBhdGhCLCBvZmZCKSB9O1xufSIsIi8vIDs7IEEgZnJhZ21lbnQgaXMgYW4gYWJzdHJhY3QgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCBhIG5vZGUnc1xuLy8gY29sbGVjdGlvbiBvZiBjaGlsZCBub2Rlcy4gSXQgdHJpZXMgdG8gaGlkZSBjb25zaWRlcmF0aW9ucyBhYm91dFxuLy8gdGhlIGFjdHVhbCB3YXkgaW4gd2hpY2ggdGhlIGNoaWxkIG5vZGVzIGFyZSBzdG9yZWQsIHNvIHRoYXRcbi8vIGRpZmZlcmVudCByZXByZXNlbnRhdGlvbnMgKG5vZGVzIHRoYXQgb25seSBjb250YWluIHNpbXBsZSBub2Rlc1xuLy8gdmVyc3VzIG5vZGVzIHRoYXQgYWxzbyBjb250YWluIHRleHQpIGNhbiBiZSBhcHByb2FjaGVkIHVzaW5nIHRoZVxuLy8gc2FtZSBBUEkuXG4vL1xuLy8gRnJhZ21lbnRzIGFyZSBwZXJzaXN0ZW50IGRhdGEgc3RydWN0dXJlcy4gVGhhdCBtZWFucyB5b3Ugc2hvdWxkXG4vLyBfbm90XyBtdXRhdGUgdGhlbSBvciB0aGVpciBjb250ZW50LCBidXQgY3JlYXRlIG5ldyBpbnN0YW5jZXNcbi8vIHdoZW5ldmVyIG5lZWRlZC4gVGhlIEFQSSB0cmllcyB0byBtYWtlIHRoaXMgZWFzeS5cblwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2dldCA9IGZ1bmN0aW9uIGdldChfeDE2LCBfeDE3LCBfeDE4KSB7IHZhciBfYWdhaW4gPSB0cnVlOyBfZnVuY3Rpb246IHdoaWxlIChfYWdhaW4pIHsgdmFyIG9iamVjdCA9IF94MTYsIHByb3BlcnR5ID0gX3gxNywgcmVjZWl2ZXIgPSBfeDE4OyBfYWdhaW4gPSBmYWxzZTsgaWYgKG9iamVjdCA9PT0gbnVsbCkgb2JqZWN0ID0gRnVuY3Rpb24ucHJvdG90eXBlOyB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7IGlmIChkZXNjID09PSB1bmRlZmluZWQpIHsgdmFyIHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpOyBpZiAocGFyZW50ID09PSBudWxsKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gZWxzZSB7IF94MTYgPSBwYXJlbnQ7IF94MTcgPSBwcm9wZXJ0eTsgX3gxOCA9IHJlY2VpdmVyOyBfYWdhaW4gPSB0cnVlOyBkZXNjID0gcGFyZW50ID0gdW5kZWZpbmVkOyBjb250aW51ZSBfZnVuY3Rpb247IH0gfSBlbHNlIGlmIChcInZhbHVlXCIgaW4gZGVzYykgeyByZXR1cm4gZGVzYy52YWx1ZTsgfSBlbHNlIHsgdmFyIGdldHRlciA9IGRlc2MuZ2V0OyBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpOyB9IH0gfTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIEZyYWdtZW50ID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRnJhZ21lbnQoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEZyYWdtZW50KTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhGcmFnbWVudCwgW3tcbiAgICBrZXk6IFwiYXBwZW5kXCIsXG5cbiAgICAvLyA6OiAoRnJhZ21lbnQsIG51bWJlciwgbnVtYmVyKSDihpIgRnJhZ21lbnRcbiAgICAvLyBDcmVhdGUgYSBmcmFnbWVudCB0aGF0IGNvbWJpbmVzIHRoaXMgb25lIHdpdGggYW5vdGhlciBmcmFnbWVudC5cbiAgICAvLyBUYWtlcyBjYXJlIG9mIG1lcmdpbmcgYWRqYWNlbnQgdGV4dCBub2RlcyBhbmQgY2FuIGFsc28gbWVyZ2VcbiAgICAvLyDigJxvcGVu4oCdIG5vZGVzIGF0IHRoZSBib3VuZGFyeS4gYGpvaW5MZWZ0YCBhbmQgYGpvaW5SaWdodGAgZ2l2ZSB0aGVcbiAgICAvLyBkZXB0aCB0byB3aGljaCB0aGUgbGVmdCBhbmQgcmlnaHQgZnJhZ21lbnRzIGFyZSBvcGVuLiBJZiBvcGVuXG4gICAgLy8gbm9kZXMgd2l0aCB0aGUgc2FtZSBtYXJrdXAgYXJlIGZvdW5kIG9uIGJvdGggc2lkZXMsIHRoZXkgYXJlXG4gICAgLy8gam9pbmVkLiBJZiBub3QsIHRoZSBvcGVuIG5vZGVzIGFyZSBbY2xvc2VkXSgjTm9kZS5jbG9zZSkuXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFwcGVuZChvdGhlcikge1xuICAgICAgdmFyIGpvaW5MZWZ0ID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8gMCA6IGFyZ3VtZW50c1sxXTtcbiAgICAgIHZhciBqb2luUmlnaHQgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDIgfHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyAwIDogYXJndW1lbnRzWzJdO1xuXG4gICAgICBpZiAoIXRoaXMuc2l6ZSkgcmV0dXJuIGpvaW5SaWdodCA/IG90aGVyLnJlcGxhY2UoMCwgb3RoZXIuZmlyc3RDaGlsZC5jbG9zZShqb2luUmlnaHQgLSAxLCBcInN0YXJ0XCIpKSA6IG90aGVyO1xuICAgICAgaWYgKCFvdGhlci5zaXplKSByZXR1cm4gam9pbkxlZnQgPyB0aGlzLnJlcGxhY2UodGhpcy5zaXplIC0gMSwgdGhpcy5sYXN0Q2hpbGQuY2xvc2Uoam9pbkxlZnQgLSAxLCBcImVuZFwiKSkgOiB0aGlzO1xuICAgICAgcmV0dXJuIHRoaXMuYXBwZW5kSW5uZXIob3RoZXIsIGpvaW5MZWZ0LCBqb2luUmlnaHQpO1xuICAgIH1cblxuICAgIC8vIDo6IHN0cmluZ1xuICAgIC8vIENvbmNhdGVuYXRlIGFsbCB0aGUgdGV4dCBub2RlcyBmb3VuZCBpbiB0aGlzIGZyYWdtZW50IGFuZCBpdHNcbiAgICAvLyBjaGlsZHJlbi5cbiAgfSwge1xuICAgIGtleTogXCJ0b1N0cmluZ1wiLFxuXG4gICAgLy8gOjogKCkg4oaSIHN0cmluZ1xuICAgIC8vIFJldHVybiBhIGRlYnVnZ2luZyBzdHJpbmcgdGhhdCBkZXNjcmliZXMgdGhpcyBmcmFnbWVudC5cbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICB2YXIgc3RyID0gXCJcIjtcbiAgICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAobikge1xuICAgICAgICByZXR1cm4gc3RyICs9IChzdHIgPyBcIiwgXCIgOiBcIlwiKSArIG4udG9TdHJpbmcoKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICAvLyA6OiAobnVtYmVyLCBudW1iZXIsID8oTm9kZSkg4oaSIE5vZGUpIOKGkiBbTm9kZV1cbiAgICAvLyBQcm9kdWNlIGFuIGFycmF5IHdpdGggdGhlIGNoaWxkIG5vZGVzIGJldHdlZW4gdGhlIGdpdmVuXG4gICAgLy8gYm91bmRhcmllcywgb3B0aW9uYWxseSBtYXBwaW5nIGEgZnVuY3Rpb24gb3ZlciB0aGVtLlxuICB9LCB7XG4gICAga2V5OiBcInRvQXJyYXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9BcnJheShmcm9tLCB0bywgZikge1xuICAgICAgaWYgKGZyb20gPT09IHVuZGVmaW5lZCkgZnJvbSA9IDA7XG4gICAgICBpZiAodG8gPT09IHVuZGVmaW5lZCkgdG8gPSB0aGlzLnNpemU7XG5cbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGZvciAodmFyIGl0ZXIgPSB0aGlzLml0ZXIoZnJvbSwgdG8pLCBuID0gdW5kZWZpbmVkOyBuID0gaXRlci5uZXh0KCkudmFsdWU7KSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGYgPyBmKG4pIDogbik7XG4gICAgICB9cmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyA6OiAoKE5vZGUpIOKGkiBOb2RlKSDihpIgRnJhZ21lbnRcbiAgICAvLyBQcm9kdWNlIGEgbmV3IEZyYWdtZW50IGJ5IG1hcHBpbmcgYWxsIHRoaXMgZnJhZ21lbnQncyBjaGlsZHJlblxuICAgIC8vIHRocm91Z2ggYSBmdW5jdGlvbi5cbiAgfSwge1xuICAgIGtleTogXCJtYXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFwKGYpIHtcbiAgICAgIC8vIEZJWE1FIGpvaW4gdGV4dCBub2Rlcz9cbiAgICAgIHJldHVybiBGcmFnbWVudC5mcm9tQXJyYXkodGhpcy50b0FycmF5KHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBmKSk7XG4gICAgfVxuXG4gICAgLy8gOjogKChOb2RlKSDihpIgYm9vbCkg4oaSIGJvb2xcbiAgICAvLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gZnVuY3Rpb24gcmV0dXJuZWQgYHRydWVgIGZvciBhbnkgb2ZcbiAgICAvLyB0aGUgZnJhZ21lbnQncyBjaGlsZHJlbi5cbiAgfSwge1xuICAgIGtleTogXCJzb21lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNvbWUoZikge1xuICAgICAgZm9yICh2YXIgaXRlciA9IHRoaXMuaXRlcigpLCBuID0gdW5kZWZpbmVkOyBuID0gaXRlci5uZXh0KCkudmFsdWU7KSB7XG4gICAgICAgIGlmIChmKG4pKSByZXR1cm4gbjtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2xvc2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xvc2UoZGVwdGgsIHNpZGUpIHtcbiAgICAgIHZhciBjaGlsZCA9IHNpZGUgPT0gXCJzdGFydFwiID8gdGhpcy5maXJzdENoaWxkIDogdGhpcy5sYXN0Q2hpbGQ7XG4gICAgICB2YXIgY2xvc2VkID0gY2hpbGQuY2xvc2UoZGVwdGggLSAxLCBzaWRlKTtcbiAgICAgIGlmIChjbG9zZWQgPT0gY2hpbGQpIHJldHVybiB0aGlzO1xuICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZShzaWRlID09IFwic3RhcnRcIiA/IDAgOiB0aGlzLnNpemUgLSAxLCBjbG9zZWQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJub2Rlc0JldHdlZW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbm9kZXNCZXR3ZWVuKGZyb20sIHRvLCBmLCBwYXRoLCBwYXJlbnQpIHtcbiAgICAgIHZhciBtb3JlRnJvbSA9IGZyb20gJiYgZnJvbS5kZXB0aCA+IHBhdGgubGVuZ3RoLFxuICAgICAgICAgIG1vcmVUbyA9IHRvICYmIHRvLmRlcHRoID4gcGF0aC5sZW5ndGg7XG4gICAgICB2YXIgc3RhcnQgPSBtb3JlRnJvbSA/IGZyb20ucGF0aFtwYXRoLmxlbmd0aF0gOiBmcm9tID8gZnJvbS5vZmZzZXQgOiAwO1xuICAgICAgdmFyIGVuZCA9IG1vcmVUbyA/IHRvLnBhdGhbcGF0aC5sZW5ndGhdICsgMSA6IHRvID8gdG8ub2Zmc2V0IDogdGhpcy5zaXplO1xuICAgICAgZm9yICh2YXIgaXRlciA9IHRoaXMuaXRlcihzdGFydCwgZW5kKSwgbm9kZSA9IHVuZGVmaW5lZDsgbm9kZSA9IGl0ZXIubmV4dCgpLnZhbHVlOykge1xuICAgICAgICB2YXIgc3RhcnRPZmZzZXQgPSBpdGVyLm9mZnNldCAtIG5vZGUud2lkdGg7XG4gICAgICAgIHBhdGgucHVzaChzdGFydE9mZnNldCk7XG4gICAgICAgIG5vZGUubm9kZXNCZXR3ZWVuKG1vcmVGcm9tICYmIHN0YXJ0T2Zmc2V0ID09IHN0YXJ0ID8gZnJvbSA6IG51bGwsIG1vcmVUbyAmJiBpdGVyLm9mZnNldCA9PSBlbmQgPyB0byA6IG51bGwsIGYsIHBhdGgsIHBhcmVudCk7XG4gICAgICAgIHBhdGgucG9wKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gOjogKD9Qb3MsID9Qb3MpIOKGkiBGcmFnbWVudFxuICAgIC8vIFNsaWNlIG91dCB0aGUgc3ViLWZyYWdtZW50IGJldHdlZW4gdGhlIHR3byBnaXZlbiBwb3NpdGlvbnMuXG4gICAgLy8gYG51bGxgIGNhbiBiZSBwYXNzZWQgZm9yIGVpdGhlciB0byBpbmRpY2F0ZSB0aGUgc2xpY2Ugc2hvdWxkIGdvXG4gICAgLy8gYWxsIHRoZSB3YXkgdG8gdGhlIHN0YXJ0IG9yIGVuZCBvZiB0aGUgZnJhZ21lbnQuXG4gIH0sIHtcbiAgICBrZXk6IFwic2xpY2VCZXR3ZWVuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNsaWNlQmV0d2Vlbihmcm9tLCB0bykge1xuICAgICAgdmFyIGRlcHRoID0gYXJndW1lbnRzLmxlbmd0aCA8PSAyIHx8IGFyZ3VtZW50c1syXSA9PT0gdW5kZWZpbmVkID8gMCA6IGFyZ3VtZW50c1syXTtcblxuICAgICAgdmFyIG1vcmVGcm9tID0gZnJvbSAmJiBmcm9tLmRlcHRoID4gZGVwdGgsXG4gICAgICAgICAgbW9yZVRvID0gdG8gJiYgdG8uZGVwdGggPiBkZXB0aDtcbiAgICAgIHZhciBzdGFydCA9IG1vcmVGcm9tID8gZnJvbS5wYXRoW2RlcHRoXSA6IGZyb20gPyBmcm9tLm9mZnNldCA6IDA7XG4gICAgICB2YXIgZW5kID0gbW9yZVRvID8gdG8ucGF0aFtkZXB0aF0gKyAxIDogdG8gPyB0by5vZmZzZXQgOiB0aGlzLnNpemU7XG4gICAgICB2YXIgbm9kZXMgPSBbXTtcbiAgICAgIGZvciAodmFyIGl0ZXIgPSB0aGlzLml0ZXIoc3RhcnQsIGVuZCksIG5vZGUgPSB1bmRlZmluZWQ7IG5vZGUgPSBpdGVyLm5leHQoKS52YWx1ZTspIHtcbiAgICAgICAgdmFyIHBhc3NGcm9tID0gbW9yZUZyb20gJiYgaXRlci5vZmZzZXQgLSBub2RlLndpZHRoID09IHN0YXJ0ID8gZnJvbSA6IG51bGw7XG4gICAgICAgIHZhciBwYXNzVG8gPSBtb3JlVG8gJiYgaXRlci5vZmZzZXQgPT0gZW5kID8gdG8gOiBudWxsO1xuICAgICAgICBpZiAocGFzc0Zyb20gfHwgcGFzc1RvKSBub2RlID0gbm9kZS5zbGljZUJldHdlZW4ocGFzc0Zyb20sIHBhc3NUbywgZGVwdGggKyAxKTtcbiAgICAgICAgbm9kZXMucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcihub2Rlcyk7XG4gICAgfVxuXG4gICAgLy8gOjogKFNjaGVtYSwgT2JqZWN0KSDihpIgRnJhZ21lbnRcbiAgICAvLyBEZXNlcmlhbGl6ZSBhIGZyYWdtZW50IGZyb20gaXRzIEpTT04gcmVwcmVzZW50YXRpb24uXG4gIH0sIHtcbiAgICBrZXk6IFwidGV4dENvbnRlbnRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHZhciB0ZXh0ID0gXCJcIjtcbiAgICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAobikge1xuICAgICAgICByZXR1cm4gdGV4dCArPSBuLnRleHRDb250ZW50O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJmcm9tSlNPTlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tSlNPTihzY2hlbWEsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPyB0aGlzLmZyb21BcnJheSh2YWx1ZS5tYXAoc2NoZW1hLm5vZGVGcm9tSlNPTikpIDogZW1wdHlGcmFnbWVudDtcbiAgICB9XG5cbiAgICAvLyA6OiAoW05vZGVdKSDihpIgRnJhZ21lbnRcbiAgICAvLyBCdWlsZCBhIGZyYWdtZW50IGZyb20gYW4gYXJyYXkgb2Ygbm9kZXMuXG4gIH0sIHtcbiAgICBrZXk6IFwiZnJvbUFycmF5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZyb21BcnJheShhcnJheSkge1xuICAgICAgaWYgKCFhcnJheS5sZW5ndGgpIHJldHVybiBlbXB0eUZyYWdtZW50O1xuICAgICAgdmFyIGhhc1RleHQgPSBmYWxzZTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGFycmF5W2ldLmlzVGV4dCkgaGFzVGV4dCA9IHRydWU7XG4gICAgICB9cmV0dXJuIG5ldyAoaGFzVGV4dCA/IFRleHRGcmFnbWVudCA6IEZsYXRGcmFnbWVudCkoYXJyYXkpO1xuICAgIH1cblxuICAgIC8vIDo6ICg/dW5pb248RnJhZ21lbnQsIE5vZGUsIFtOb2RlXT4pIOKGkiBGcmFnbWVudFxuICAgIC8vIENyZWF0ZSBhIGZyYWdtZW50IGZyb20gc29tZXRoaW5nIHRoYXQgY2FuIGJlIGludGVycHJldGVkIGFzIGEgc2V0XG4gICAgLy8gb2Ygbm9kZXMuIEZvciBgbnVsbGAsIGl0IHJldHVybnMgdGhlIGVtcHR5IGZyYWdtZW50LiBGb3IgYVxuICAgIC8vIGZyYWdtZW50LCB0aGUgZnJhZ21lbnQgaXRzZWxmLiBGb3IgYSBub2RlIG9yIGFycmF5IG9mIG5vZGVzLCBhXG4gICAgLy8gZnJhZ21lbnQgY29udGFpbmluZyB0aG9zZSBub2Rlcy5cbiAgfSwge1xuICAgIGtleTogXCJmcm9tXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZyb20obm9kZXMpIHtcbiAgICAgIGlmICghbm9kZXMpIHJldHVybiBlbXB0eUZyYWdtZW50O1xuICAgICAgaWYgKG5vZGVzIGluc3RhbmNlb2YgRnJhZ21lbnQpIHJldHVybiBub2RlcztcbiAgICAgIHJldHVybiB0aGlzLmZyb21BcnJheShBcnJheS5pc0FycmF5KG5vZGVzKSA/IG5vZGVzIDogW25vZGVzXSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEZyYWdtZW50O1xufSkoKTtcblxuZXhwb3J0cy5GcmFnbWVudCA9IEZyYWdtZW50O1xuXG52YXIgaXRlckVuZCA9IHsgZG9uZTogdHJ1ZSB9O1xuXG52YXIgRmxhdEl0ZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRmxhdEl0ZXJhdG9yKGFycmF5LCBwb3MsIGVuZCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGbGF0SXRlcmF0b3IpO1xuXG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xuICAgIHRoaXMucG9zID0gcG9zO1xuICAgIHRoaXMuZW5kID0gZW5kO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEZsYXRJdGVyYXRvciwgW3tcbiAgICBrZXk6IFwiY29weVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb3B5KCkge1xuICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuYXJyYXksIHRoaXMucG9zLCB0aGlzLmVuZCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImF0RW5kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGF0RW5kKCkge1xuICAgICAgcmV0dXJuIHRoaXMucG9zID09IHRoaXMuZW5kO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJuZXh0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wb3MgPT0gdGhpcy5lbmQgPyBpdGVyRW5kIDogdGhpcy5hcnJheVt0aGlzLnBvcysrXTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwib2Zmc2V0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wb3M7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEZsYXRJdGVyYXRvcjtcbn0pKCk7XG5cbnZhciBSZXZlcnNlRmxhdEl0ZXJhdG9yID0gKGZ1bmN0aW9uIChfRmxhdEl0ZXJhdG9yKSB7XG4gIF9pbmhlcml0cyhSZXZlcnNlRmxhdEl0ZXJhdG9yLCBfRmxhdEl0ZXJhdG9yKTtcblxuICBmdW5jdGlvbiBSZXZlcnNlRmxhdEl0ZXJhdG9yKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBSZXZlcnNlRmxhdEl0ZXJhdG9yKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKFJldmVyc2VGbGF0SXRlcmF0b3IucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgLy8gOzsgI2ZvcndhcmQ9RnJhZ21lbnRcblxuICBfY3JlYXRlQ2xhc3MoUmV2ZXJzZUZsYXRJdGVyYXRvciwgW3tcbiAgICBrZXk6IFwibmV4dFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgcmV0dXJuIHRoaXMucG9zID09IHRoaXMuZW5kID8gaXRlckVuZCA6IHRoaXMuYXJyYXlbLS10aGlzLnBvc107XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFJldmVyc2VGbGF0SXRlcmF0b3I7XG59KShGbGF0SXRlcmF0b3IpO1xuXG52YXIgRmxhdEZyYWdtZW50ID0gKGZ1bmN0aW9uIChfRnJhZ21lbnQpIHtcbiAgX2luaGVyaXRzKEZsYXRGcmFnbWVudCwgX0ZyYWdtZW50KTtcblxuICBmdW5jdGlvbiBGbGF0RnJhZ21lbnQoY29udGVudCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGbGF0RnJhZ21lbnQpO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoRmxhdEZyYWdtZW50LnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuY2FsbCh0aGlzKTtcbiAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xuICB9XG5cbiAgLy8gOjogRnJhZ21lbnRcbiAgLy8gQW4gZW1wdHkgZnJhZ21lbnQuIEludGVuZGVkIHRvIGJlIHJldXNlZCB3aGVuZXZlciBhIG5vZGUgZG9lc24ndFxuICAvLyBjb250YWluIGFueXRoaW5nIChyYXRoZXIgdGhhbiBhbGxvY2F0aW5nIGEgbmV3IGVtcHR5IGZyYWdtZW50IGZvclxuICAvLyBlYWNoIGxlYWYgbm9kZSkuXG5cbiAgLy8gOjogKD9udW1iZXIsID9udW1iZXIpIOKGkiBJdGVyYXRvcjxOb2RlPlxuICAvLyBDcmVhdGUgYSBmb3J3YXJkIGl0ZXJhdG9yIG92ZXIgdGhlIGNvbnRlbnQgb2YgdGhlIGZyYWdtZW50LiBBblxuICAvLyBleHBsaWNpdCBzdGFydCBhbmQgZW5kIG9mZnNldCBjYW4gYmUgZ2l2ZW4gdG8gaGF2ZSB0aGUgaXRlcmF0b3JcbiAgLy8gZ28gb3ZlciBvbmx5IHBhcnQgb2YgdGhlIGNvbnRlbnQuIElmIGFuIGl0ZXJhdGlvbiBib3VuZCBmYWxsc1xuICAvLyB3aXRoaW4gYSB0ZXh0IG5vZGUsIG9ubHkgdGhlIHBhcnQgdGhhdCBpcyB3aXRoaW4gdGhlIGJvdW5kcyBpc1xuICAvLyB5aWVsZGVkLlxuXG4gIF9jcmVhdGVDbGFzcyhGbGF0RnJhZ21lbnQsIFt7XG4gICAga2V5OiBcIml0ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXRlcigpIHtcbiAgICAgIHZhciBzdGFydCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IDAgOiBhcmd1bWVudHNbMF07XG4gICAgICB2YXIgZW5kID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8gdGhpcy5zaXplIDogYXJndW1lbnRzWzFdO1xuXG4gICAgICByZXR1cm4gbmV3IEZsYXRJdGVyYXRvcih0aGlzLmNvbnRlbnQsIHN0YXJ0LCBlbmQpO1xuICAgIH1cblxuICAgIC8vIDo6ICg/bnVtYmVyLCA/bnVtYmVyKSDihpIgSXRlcmF0b3I8Tm9kZT5cbiAgICAvLyBDcmVhdGUgYSByZXZlcnNlIGl0ZXJhdG9yIG92ZXIgdGhlIGNvbnRlbnQgb2YgdGhlIGZyYWdtZW50LiBBblxuICAgIC8vIGV4cGxpY2l0IHN0YXJ0IGFuZCBlbmQgb2Zmc2V0IGNhbiBiZSBnaXZlbiB0byBoYXZlIHRoZSBpdGVyYXRvclxuICAgIC8vIGdvIG92ZXIgb25seSBwYXJ0IG9mIHRoZSBjb250ZW50LiAqKk5vdGUqKjogYHN0YXJ0YCBzaG91bGQgYmVcbiAgICAvLyBncmVhdGVyIHRoYW4gYGVuZGAsIHdoZW4gcGFzc2VkLlxuICB9LCB7XG4gICAga2V5OiBcInJldmVyc2VJdGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJldmVyc2VJdGVyKCkge1xuICAgICAgdmFyIHN0YXJ0ID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gdGhpcy5zaXplIDogYXJndW1lbnRzWzBdO1xuICAgICAgdmFyIGVuZCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IDAgOiBhcmd1bWVudHNbMV07XG5cbiAgICAgIHJldHVybiBuZXcgUmV2ZXJzZUZsYXRJdGVyYXRvcih0aGlzLmNvbnRlbnQsIHN0YXJ0LCBlbmQpO1xuICAgIH1cblxuICAgIC8vIDo6IG51bWJlclxuICAgIC8vIFRoZSBtYXhpbXVtIG9mZnNldCBpbiB0aGlzIGZyYWdtZW50LlxuICB9LCB7XG4gICAga2V5OiBcImNoaWxkXCIsXG5cbiAgICAvLyA6OiAobnVtYmVyKSDihpIgTm9kZVxuICAgIC8vIEdldCB0aGUgY2hpbGQgYXQgdGhlIGdpdmVuIG9mZnNldC4gTWlnaHQgcmV0dXJuIGEgdGV4dCBub2RlIHRoYXRcbiAgICAvLyBzdHJldGNoZXMgYmVmb3JlIGFuZC9vciBhZnRlciB0aGUgb2Zmc2V0LlxuICAgIHZhbHVlOiBmdW5jdGlvbiBjaGlsZChvZmYpIHtcbiAgICAgIGlmIChvZmYgPCAwIHx8IG9mZiA+PSB0aGlzLmNvbnRlbnQubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoXCJPZmZzZXQgXCIgKyBvZmYgKyBcIiBvdXQgb2YgcmFuZ2VcIik7XG4gICAgICByZXR1cm4gdGhpcy5jb250ZW50W29mZl07XG4gICAgfVxuXG4gICAgLy8gOjogKChub2RlOiBOb2RlLCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikpXG4gICAgLy8gQ2FsbCB0aGUgZ2l2ZW4gZnVuY3Rpb24gZm9yIGVhY2ggbm9kZSBpbiB0aGUgZnJhZ21lbnQsIHBhc3NpbmcgaXRcbiAgICAvLyB0aGUgbm9kZSwgaXRzIHN0YXJ0IG9mZnNldCwgYW5kIGl0cyBlbmQgb2Zmc2V0LlxuICB9LCB7XG4gICAga2V5OiBcImZvckVhY2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZm9yRWFjaChmKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29udGVudC5sZW5ndGg7IGkrKykge1xuICAgICAgICBmKHRoaXMuY29udGVudFtpXSwgaSwgaSArIDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDo6IChudW1iZXIpIOKGkiB7c3RhcnQ6IG51bWJlciwgbm9kZTogTm9kZX1cbiAgICAvLyBGaW5kIHRoZSBub2RlIGJlZm9yZSB0aGUgZ2l2ZW4gb2Zmc2V0LiBSZXR1cm5zIGFuIG9iamVjdFxuICAgIC8vIGNvbnRhaW5pbmcgdGhlIG5vZGUgYXMgd2VsbCBhcyBpdHMgc3RhcnQgaW5kZXguIE9mZnNldCBzaG91bGQgYmVcbiAgICAvLyBncmVhdGVyIHRoYW4gemVyby5cbiAgfSwge1xuICAgIGtleTogXCJjaHVua0JlZm9yZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjaHVua0JlZm9yZShvZmYpIHtcbiAgICAgIHJldHVybiB7IG5vZGU6IHRoaXMuY2hpbGQob2ZmIC0gMSksIHN0YXJ0OiBvZmYgLSAxIH07XG4gICAgfVxuXG4gICAgLy8gOjogKG51bWJlcikg4oaSIHtzdGFydDogbnVtYmVyLCBub2RlOiBOb2RlfVxuICAgIC8vIEZpbmQgdGhlIG5vZGUgYWZ0ZXIgdGhlIGdpdmVuIG9mZnNldC4gUmV0dXJucyBhbiBvYmplY3RcbiAgICAvLyBjb250YWluaW5nIHRoZSBub2RlIGFzIHdlbGwgYXMgaXRzIHN0YXJ0IGluZGV4LiBPZmZzZXQgc2hvdWxkIGJlXG4gICAgLy8gbGVzcyB0aGFuIHRoZSBmcmFnbWVudCdzIHNpemUuXG4gIH0sIHtcbiAgICBrZXk6IFwiY2h1bmtBZnRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjaHVua0FmdGVyKG9mZikge1xuICAgICAgcmV0dXJuIHsgbm9kZTogdGhpcy5jaGlsZChvZmYpLCBzdGFydDogb2ZmIH07XG4gICAgfVxuXG4gICAgLy8gOjogKG51bWJlciwgP251bWJlcikg4oaSIEZyYWdtZW50XG4gICAgLy8gUmV0dXJuIGEgZnJhZ21lbnQgd2l0aCBvbmx5IHRoZSBub2RlcyBiZXR3ZWVuIHRoZSBnaXZlbiBvZmZzZXRzLlxuICAgIC8vIFdoZW4gYHRvYCBpcyBub3QgZ2l2ZW4sIHRoZSBzbGljZSB3aWxsIGdvIHRvIHRoZSBlbmQgb2YgdGhlXG4gICAgLy8gZnJhZ21lbnQuXG4gIH0sIHtcbiAgICBrZXk6IFwic2xpY2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2xpY2UoZnJvbSkge1xuICAgICAgdmFyIHRvID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8gdGhpcy5zaXplIDogYXJndW1lbnRzWzFdO1xuXG4gICAgICBpZiAoZnJvbSA9PSB0bykgcmV0dXJuIGVtcHR5RnJhZ21lbnQ7XG4gICAgICByZXR1cm4gbmV3IEZsYXRGcmFnbWVudCh0aGlzLmNvbnRlbnQuc2xpY2UoZnJvbSwgdG8pKTtcbiAgICB9XG5cbiAgICAvLyA6OiAobnVtYmVyLCBOb2RlKSDihpIgRnJhZ21lbnRcbiAgICAvLyBSZXR1cm4gYSBmcmFnbWVudCBpbiB3aGljaCB0aGUgbm9kZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IGlzXG4gICAgLy8gcmVwbGFjZWQgYnkgdGhlIGdpdmVuIG5vZGUuIFRoZSBub2RlLCBhcyB3ZWxsIGFzIHRoZSBvbmUgaXRcbiAgICAvLyByZXBsYWNlcywgc2hvdWxkIG5vdCBiZSB0ZXh0IG5vZGVzLlxuICB9LCB7XG4gICAga2V5OiBcInJlcGxhY2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVwbGFjZShvZmZzZXQsIG5vZGUpIHtcbiAgICAgIGlmIChub2RlLmlzVGV4dCkgdGhyb3cgbmV3IEVycm9yKFwiQXJndW1lbnQgdG8gcmVwbGFjZSBzaG91bGQgYmUgYSBub24tdGV4dCBub2RlXCIpO1xuICAgICAgdmFyIGNvcHkgPSB0aGlzLmNvbnRlbnQuc2xpY2UoKTtcbiAgICAgIGNvcHlbb2Zmc2V0XSA9IG5vZGU7XG4gICAgICByZXR1cm4gbmV3IEZsYXRGcmFnbWVudChjb3B5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYXBwZW5kSW5uZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXBwZW5kSW5uZXIob3RoZXIsIGpvaW5MZWZ0LCBqb2luUmlnaHQpIHtcbiAgICAgIHZhciBsYXN0ID0gdGhpcy5jb250ZW50Lmxlbmd0aCAtIDEsXG4gICAgICAgICAgY29udGVudCA9IHRoaXMuY29udGVudC5zbGljZSgwLCBsYXN0KTtcbiAgICAgIHZhciBiZWZvcmUgPSB0aGlzLmNvbnRlbnRbbGFzdF0sXG4gICAgICAgICAgYWZ0ZXIgPSBvdGhlci5maXJzdENoaWxkO1xuICAgICAgaWYgKGpvaW5MZWZ0ID4gMCAmJiBqb2luUmlnaHQgPiAwICYmIGJlZm9yZS5zYW1lTWFya3VwKGFmdGVyKSkgY29udGVudC5wdXNoKGJlZm9yZS5hcHBlbmQoYWZ0ZXIuY29udGVudCwgam9pbkxlZnQgLSAxLCBqb2luUmlnaHQgLSAxKSk7ZWxzZSBjb250ZW50LnB1c2goYmVmb3JlLmNsb3NlKGpvaW5MZWZ0IC0gMSwgXCJlbmRcIiksIGFmdGVyLmNsb3NlKGpvaW5SaWdodCAtIDEsIFwic3RhcnRcIikpO1xuICAgICAgcmV0dXJuIEZyYWdtZW50LmZyb21BcnJheShjb250ZW50LmNvbmNhdChvdGhlci50b0FycmF5KGFmdGVyLndpZHRoKSkpO1xuICAgIH1cblxuICAgIC8vIDo6ICgpIOKGkiBPYmplY3RcbiAgICAvLyBDcmVhdGUgYSBKU09OLXNlcmlhbGl6ZWFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBmcmFnbWVudC5cbiAgfSwge1xuICAgIGtleTogXCJ0b0pTT05cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9KU09OKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGVudC5tYXAoZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgcmV0dXJuIG4udG9KU09OKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2l6ZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGVudC5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gOjogP05vZGVcbiAgICAvLyBUaGUgZmlyc3QgY2hpbGQgb2YgdGhlIGZyYWdtZW50LCBvciBgbnVsbGAgaWYgaXQgaXMgZW1wdHkuXG4gIH0sIHtcbiAgICBrZXk6IFwiZmlyc3RDaGlsZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGVudC5sZW5ndGggPyB0aGlzLmNvbnRlbnRbMF0gOiBudWxsO1xuICAgIH1cblxuICAgIC8vIDo6ID9Ob2RlXG4gICAgLy8gVGhlIGxhc3QgY2hpbGQgb2YgdGhlIGZyYWdtZW50LCBvciBgbnVsbGAgaWYgaXQgaXMgZW1wdHkuXG4gIH0sIHtcbiAgICBrZXk6IFwibGFzdENoaWxkXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250ZW50Lmxlbmd0aCA/IHRoaXMuY29udGVudFt0aGlzLmNvbnRlbnQubGVuZ3RoIC0gMV0gOiBudWxsO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBGbGF0RnJhZ21lbnQ7XG59KShGcmFnbWVudCk7XG5cbnZhciBlbXB0eUZyYWdtZW50ID0gbmV3IEZsYXRGcmFnbWVudChbXSk7XG5cbmV4cG9ydHMuZW1wdHlGcmFnbWVudCA9IGVtcHR5RnJhZ21lbnQ7XG5cbnZhciBUZXh0SXRlcmF0b3IgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBUZXh0SXRlcmF0b3IoZnJhZ21lbnQsIHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQpIHtcbiAgICB2YXIgcG9zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAzIHx8IGFyZ3VtZW50c1szXSA9PT0gdW5kZWZpbmVkID8gLTEgOiBhcmd1bWVudHNbM107XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVGV4dEl0ZXJhdG9yKTtcblxuICAgIHRoaXMuZnJhZyA9IGZyYWdtZW50O1xuICAgIHRoaXMub2Zmc2V0ID0gc3RhcnRPZmZzZXQ7XG4gICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgdGhpcy5lbmRPZmZzZXQgPSBlbmRPZmZzZXQ7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoVGV4dEl0ZXJhdG9yLCBbe1xuICAgIGtleTogXCJjb3B5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvcHkoKSB7XG4gICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5mcmFnLCB0aGlzLm9mZnNldCwgdGhpcy5lbmRPZmZzZXQsIHRoaXMucG9zKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYXRFbmRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXRFbmQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5vZmZzZXQgPT0gdGhpcy5lbmRPZmZzZXQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm5leHRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIGlmICh0aGlzLnBvcyA9PSAtMSkge1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLmluaXQoKTtcbiAgICAgICAgaWYgKHN0YXJ0KSByZXR1cm4gc3RhcnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5vZmZzZXQgPT0gdGhpcy5lbmRPZmZzZXQgPyBpdGVyRW5kIDogdGhpcy5hZHZhbmNlKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFkdmFuY2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWR2YW5jZSgpIHtcbiAgICAgIHZhciBub2RlID0gdGhpcy5mcmFnLmNvbnRlbnRbdGhpcy5wb3MrK10sXG4gICAgICAgICAgZW5kID0gdGhpcy5vZmZzZXQgKyBub2RlLndpZHRoO1xuICAgICAgaWYgKGVuZCA+IHRoaXMuZW5kT2Zmc2V0KSB7XG4gICAgICAgIG5vZGUgPSBub2RlLmNvcHkobm9kZS50ZXh0LnNsaWNlKDAsIHRoaXMuZW5kT2Zmc2V0IC0gdGhpcy5vZmZzZXQpKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSB0aGlzLmVuZE9mZnNldDtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICB9XG4gICAgICB0aGlzLm9mZnNldCA9IGVuZDtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbml0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICB0aGlzLnBvcyA9IDA7XG4gICAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICAgIHdoaWxlIChvZmZzZXQgPCB0aGlzLm9mZnNldCkge1xuICAgICAgICB2YXIgbm9kZSA9IHRoaXMuZnJhZy5jb250ZW50W3RoaXMucG9zKytdLFxuICAgICAgICAgICAgZW5kID0gb2Zmc2V0ICsgbm9kZS53aWR0aDtcbiAgICAgICAgaWYgKGVuZCA9PSB0aGlzLm9mZnNldCkgYnJlYWs7XG4gICAgICAgIGlmIChlbmQgPiB0aGlzLm9mZnNldCkge1xuICAgICAgICAgIHZhciBzbGljZUVuZCA9IG5vZGUud2lkdGg7XG4gICAgICAgICAgaWYgKGVuZCA+IHRoaXMuZW5kT2Zmc2V0KSB7XG4gICAgICAgICAgICBzbGljZUVuZCA9IHRoaXMuZW5kT2Zmc2V0IC0gb2Zmc2V0O1xuICAgICAgICAgICAgZW5kID0gdGhpcy5lbmRPZmZzZXQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5vZGUgPSBub2RlLmNvcHkobm9kZS50ZXh0LnNsaWNlKHRoaXMub2Zmc2V0IC0gb2Zmc2V0LCBzbGljZUVuZCkpO1xuICAgICAgICAgIHRoaXMub2Zmc2V0ID0gZW5kO1xuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIG9mZnNldCA9IGVuZDtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVGV4dEl0ZXJhdG9yO1xufSkoKTtcblxudmFyIFJldmVyc2VUZXh0SXRlcmF0b3IgPSAoZnVuY3Rpb24gKF9UZXh0SXRlcmF0b3IpIHtcbiAgX2luaGVyaXRzKFJldmVyc2VUZXh0SXRlcmF0b3IsIF9UZXh0SXRlcmF0b3IpO1xuXG4gIGZ1bmN0aW9uIFJldmVyc2VUZXh0SXRlcmF0b3IoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJldmVyc2VUZXh0SXRlcmF0b3IpO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoUmV2ZXJzZVRleHRJdGVyYXRvci5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUmV2ZXJzZVRleHRJdGVyYXRvciwgW3tcbiAgICBrZXk6IFwiYWR2YW5jZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZHZhbmNlKCkge1xuICAgICAgdmFyIG5vZGUgPSB0aGlzLmZyYWcuY29udGVudFstLXRoaXMucG9zXSxcbiAgICAgICAgICBlbmQgPSB0aGlzLm9mZnNldCAtIG5vZGUud2lkdGg7XG4gICAgICBpZiAoZW5kIDwgdGhpcy5lbmRPZmZzZXQpIHtcbiAgICAgICAgbm9kZSA9IG5vZGUuY29weShub2RlLnRleHQuc2xpY2UodGhpcy5lbmRPZmZzZXQgLSBlbmQpKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSB0aGlzLmVuZE9mZnNldDtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICB9XG4gICAgICB0aGlzLm9mZnNldCA9IGVuZDtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbml0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICB0aGlzLnBvcyA9IHRoaXMuZnJhZy5jb250ZW50Lmxlbmd0aDtcbiAgICAgIHZhciBvZmZzZXQgPSB0aGlzLmZyYWcuc2l6ZTtcbiAgICAgIHdoaWxlIChvZmZzZXQgPiB0aGlzLm9mZnNldCkge1xuICAgICAgICB2YXIgbm9kZSA9IHRoaXMuZnJhZy5jb250ZW50Wy0tdGhpcy5wb3NdLFxuICAgICAgICAgICAgZW5kID0gb2Zmc2V0IC0gbm9kZS53aWR0aDtcbiAgICAgICAgaWYgKGVuZCA9PSB0aGlzLm9mZnNldCkgYnJlYWs7XG4gICAgICAgIGlmIChlbmQgPCB0aGlzLm9mZnNldCkge1xuICAgICAgICAgIGlmIChlbmQgPCB0aGlzLmVuZE9mZnNldCkge1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUuY29weShub2RlLnRleHQuc2xpY2UodGhpcy5lbmRPZmZzZXQgLSBlbmQsIHRoaXMub2Zmc2V0IC0gZW5kKSk7XG4gICAgICAgICAgICBlbmQgPSB0aGlzLmVuZE9mZnNldDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUuY29weShub2RlLnRleHQuc2xpY2UoMCwgdGhpcy5vZmZzZXQgLSBlbmQpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5vZmZzZXQgPSBlbmQ7XG4gICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgb2Zmc2V0ID0gZW5kO1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBSZXZlcnNlVGV4dEl0ZXJhdG9yO1xufSkoVGV4dEl0ZXJhdG9yKTtcblxudmFyIFRleHRGcmFnbWVudCA9IChmdW5jdGlvbiAoX0ZyYWdtZW50Mikge1xuICBfaW5oZXJpdHMoVGV4dEZyYWdtZW50LCBfRnJhZ21lbnQyKTtcblxuICBmdW5jdGlvbiBUZXh0RnJhZ21lbnQoY29udGVudCwgc2l6ZSkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUZXh0RnJhZ21lbnQpO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoVGV4dEZyYWdtZW50LnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuY2FsbCh0aGlzKTtcbiAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xuICAgIHRoaXMuc2l6ZSA9IHNpemUgfHwgMDtcbiAgICBpZiAoc2l6ZSA9PSBudWxsKSBmb3IgKHZhciBpID0gMDsgaSA8IGNvbnRlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuc2l6ZSArPSBjb250ZW50W2ldLndpZHRoO1xuICAgIH1cbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhUZXh0RnJhZ21lbnQsIFt7XG4gICAga2V5OiBcIml0ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXRlcigpIHtcbiAgICAgIHZhciBmcm9tID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gMCA6IGFyZ3VtZW50c1swXTtcbiAgICAgIHZhciB0byA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHRoaXMuc2l6ZSA6IGFyZ3VtZW50c1sxXTtcblxuICAgICAgcmV0dXJuIG5ldyBUZXh0SXRlcmF0b3IodGhpcywgZnJvbSwgdG8pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZXZlcnNlSXRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXZlcnNlSXRlcigpIHtcbiAgICAgIHZhciBmcm9tID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gdGhpcy5zaXplIDogYXJndW1lbnRzWzBdO1xuICAgICAgdmFyIHRvID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8gMCA6IGFyZ3VtZW50c1sxXTtcblxuICAgICAgcmV0dXJuIG5ldyBSZXZlcnNlVGV4dEl0ZXJhdG9yKHRoaXMsIGZyb20sIHRvKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2hpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2hpbGQob2ZmKSB7XG4gICAgICBpZiAob2ZmIDwgMCB8fCBvZmYgPj0gdGhpcy5zaXplKSB0aHJvdyBuZXcgRXJyb3IoXCJPZmZzZXQgXCIgKyBvZmYgKyBcIiBvdXQgb2YgcmFuZ2VcIik7XG4gICAgICBmb3IgKHZhciBpID0gMCwgY3VyT2ZmID0gMDsgaSA8IHRoaXMuY29udGVudC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNvbnRlbnRbaV07XG4gICAgICAgIGN1ck9mZiArPSBjaGlsZC53aWR0aDtcbiAgICAgICAgaWYgKGN1ck9mZiA+IG9mZikgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmb3JFYWNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZvckVhY2goZikge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIG9mZiA9IDA7IGkgPCB0aGlzLmNvbnRlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5jb250ZW50W2ldO1xuICAgICAgICBmKGNoaWxkLCBvZmYsIG9mZiArPSBjaGlsZC53aWR0aCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNodW5rQmVmb3JlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNodW5rQmVmb3JlKG9mZikge1xuICAgICAgaWYgKCFvZmYpIHRocm93IG5ldyBFcnJvcihcIk5vIGNodW5rIGJlZm9yZSBzdGFydCBvZiBub2RlXCIpO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGN1ck9mZiA9IDA7IGkgPCB0aGlzLmNvbnRlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5jb250ZW50W2ldLFxuICAgICAgICAgICAgZW5kID0gY3VyT2ZmICsgY2hpbGQud2lkdGg7XG4gICAgICAgIGlmIChlbmQgPj0gb2ZmKSByZXR1cm4geyBub2RlOiBjaGlsZCwgc3RhcnQ6IGN1ck9mZiB9O1xuICAgICAgICBjdXJPZmYgPSBlbmQ7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNodW5rQWZ0ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2h1bmtBZnRlcihvZmYpIHtcbiAgICAgIGlmIChvZmYgPT0gdGhpcy5zaXplKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjaHVuayBhZnRlciBlbmQgb2Ygbm9kZVwiKTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBjdXJPZmYgPSAwOyBpIDwgdGhpcy5jb250ZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY29udGVudFtpXSxcbiAgICAgICAgICAgIGVuZCA9IGN1ck9mZiArIGNoaWxkLndpZHRoO1xuICAgICAgICBpZiAoZW5kID4gb2ZmKSByZXR1cm4geyBub2RlOiBjaGlsZCwgc3RhcnQ6IGN1ck9mZiB9O1xuICAgICAgICBjdXJPZmYgPSBlbmQ7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNsaWNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNsaWNlKCkge1xuICAgICAgdmFyIGZyb20gPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyAwIDogYXJndW1lbnRzWzBdO1xuICAgICAgdmFyIHRvID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8gdGhpcy5zaXplIDogYXJndW1lbnRzWzFdO1xuXG4gICAgICBpZiAoZnJvbSA9PSB0bykgcmV0dXJuIGVtcHR5RnJhZ21lbnQ7XG4gICAgICByZXR1cm4gbmV3IFRleHRGcmFnbWVudCh0aGlzLnRvQXJyYXkoZnJvbSwgdG8pKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVwbGFjZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXBsYWNlKG9mZiwgbm9kZSkge1xuICAgICAgaWYgKG5vZGUuaXNUZXh0KSB0aHJvdyBuZXcgRXJyb3IoXCJBcmd1bWVudCB0byByZXBsYWNlIHNob3VsZCBiZSBhIG5vbi10ZXh0IG5vZGVcIik7XG4gICAgICB2YXIgY3VyTm9kZSA9IHVuZGVmaW5lZCxcbiAgICAgICAgICBpbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgIGZvciAodmFyIGN1ck9mZiA9IDA7IGN1ck9mZiA8IG9mZjsgaW5kZXgrKykge1xuICAgICAgICBjdXJOb2RlID0gdGhpcy5jb250ZW50W2luZGV4XTtcbiAgICAgICAgY3VyT2ZmICs9IGN1ck5vZGUud2lkdGg7XG4gICAgICB9XG4gICAgICBpZiAoY3VyTm9kZS5pc1RleHQpIHRocm93IG5ldyBFcnJvcihcIkNhbiBub3QgcmVwbGFjZSB0ZXh0IGNvbnRlbnQgd2l0aCByZXBsYWNlIG1ldGhvZFwiKTtcbiAgICAgIHZhciBjb3B5ID0gdGhpcy5jb250ZW50LnNsaWNlKCk7XG4gICAgICBjb3B5W2luZGV4XSA9IG5vZGU7XG4gICAgICByZXR1cm4gbmV3IFRleHRGcmFnbWVudChjb3B5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYXBwZW5kSW5uZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXBwZW5kSW5uZXIob3RoZXIsIGpvaW5MZWZ0LCBqb2luUmlnaHQpIHtcbiAgICAgIHZhciBsYXN0ID0gdGhpcy5jb250ZW50Lmxlbmd0aCAtIDEsXG4gICAgICAgICAgY29udGVudCA9IHRoaXMuY29udGVudC5zbGljZSgwLCBsYXN0KTtcbiAgICAgIHZhciBiZWZvcmUgPSB0aGlzLmNvbnRlbnRbbGFzdF0sXG4gICAgICAgICAgYWZ0ZXIgPSBvdGhlci5maXJzdENoaWxkO1xuICAgICAgdmFyIHNhbWUgPSBiZWZvcmUuc2FtZU1hcmt1cChhZnRlcik7XG4gICAgICBpZiAoc2FtZSAmJiBiZWZvcmUuaXNUZXh0KSBjb250ZW50LnB1c2goYmVmb3JlLmNvcHkoYmVmb3JlLnRleHQgKyBhZnRlci50ZXh0KSk7ZWxzZSBpZiAoc2FtZSAmJiBqb2luTGVmdCA+IDAgJiYgam9pblJpZ2h0ID4gMCkgY29udGVudC5wdXNoKGJlZm9yZS5hcHBlbmQoYWZ0ZXIuY29udGVudCwgam9pbkxlZnQgLSAxLCBqb2luUmlnaHQgLSAxKSk7ZWxzZSBjb250ZW50LnB1c2goYmVmb3JlLmNsb3NlKGpvaW5MZWZ0IC0gMSwgXCJlbmRcIiksIGFmdGVyLmNsb3NlKGpvaW5SaWdodCAtIDEsIFwic3RhcnRcIikpO1xuICAgICAgcmV0dXJuIEZyYWdtZW50LmZyb21BcnJheShjb250ZW50LmNvbmNhdChvdGhlci50b0FycmF5KGFmdGVyLndpZHRoKSkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b0pTT05cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9KU09OKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGVudC5tYXAoZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgcmV0dXJuIG4udG9KU09OKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZmlyc3RDaGlsZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2l6ZSA/IHRoaXMuY29udGVudFswXSA6IG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImxhc3RDaGlsZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2l6ZSA/IHRoaXMuY29udGVudFt0aGlzLmNvbnRlbnQubGVuZ3RoIC0gMV0gOiBudWxsO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBUZXh0RnJhZ21lbnQ7XG59KShGcmFnbWVudCk7XG5cbmlmICh0eXBlb2YgU3ltYm9sICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgLy8gOjogKCkg4oaSIEl0ZXJhdG9yPE5vZGU+XG4gIC8vIEEgZnJhZ21lbnQgaXMgaXRlcmFibGUsIGluIHRoZSBFUzYgc2Vuc2UuXG4gIEZyYWdtZW50LnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLml0ZXIoKTtcbiAgfTtcbiAgRmxhdEl0ZXJhdG9yLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gVGV4dEl0ZXJhdG9yLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xufSIsIi8vICEhXG4vLyBUaGlzIG1vZHVsZSBkZWZpbmVzIFByb3NlTWlycm9yJ3MgZG9jdW1lbnQgbW9kZWwsIHRoZSBkYXRhXG4vLyBzdHJ1Y3R1cmUgdXNlZCB0byBkZWZpbmUgYW5kIGluc3BlY3QgY29udGVudCBkb2N1bWVudHMuIEl0XG4vLyBpbmNsdWRlczpcbi8vXG4vLyAqIFRoZSBbbm9kZV0oI05vZGUpIHR5cGUgdGhhdCByZXByZXNlbnRzIGRvY3VtZW50IGVsZW1lbnRzXG4vL1xuLy8gKiBUaGUgW3NjaGVtYV0oI1NjaGVtYSkgdHlwZXMgdXNlZCB0byB0YWcgYW5kIGNvbnN0cmFpbiB0aGVcbi8vICAgZG9jdW1lbnQgc3RydWN0dXJlXG4vL1xuLy8gKiBUaGUgZGF0YSB0eXBlIGZvciBkb2N1bWVudCBbcG9zaXRpb25zXSgjUG9zKVxuLy9cbi8vIFRoaXMgbW9kdWxlIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgYnJvd3NlciBBUEkgYmVpbmcgYXZhaWxhYmxlXG4vLyAoaS5lLiB5b3UgY2FuIGxvYWQgaXQgaW50byBhbnkgSmF2YVNjcmlwdCBlbnZpcm9ubWVudCkuXG5cblwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX25vZGUgPSByZXF1aXJlKFwiLi9ub2RlXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb2RlXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9ub2RlLk5vZGU7XG4gICAgICAgIH1cbn0pO1xuXG52YXIgX2ZyYWdtZW50ID0gcmVxdWlyZShcIi4vZnJhZ21lbnRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkZyYWdtZW50XCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mcmFnbWVudC5GcmFnbWVudDtcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJlbXB0eUZyYWdtZW50XCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mcmFnbWVudC5lbXB0eUZyYWdtZW50O1xuICAgICAgICB9XG59KTtcblxudmFyIF9tYXJrID0gcmVxdWlyZShcIi4vbWFya1wiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWFya1wiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfbWFyay5NYXJrO1xuICAgICAgICB9XG59KTtcblxudmFyIF9zY2hlbWEgPSByZXF1aXJlKFwiLi9zY2hlbWFcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNjaGVtYVNwZWNcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3NjaGVtYS5TY2hlbWFTcGVjO1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNjaGVtYVwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfc2NoZW1hLlNjaGVtYTtcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJTY2hlbWFFcnJvclwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfc2NoZW1hLlNjaGVtYUVycm9yO1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vZGVUeXBlXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9zY2hlbWEuTm9kZVR5cGU7XG4gICAgICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQmxvY2tcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3NjaGVtYS5CbG9jaztcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUZXh0YmxvY2tcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3NjaGVtYS5UZXh0YmxvY2s7XG4gICAgICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiSW5saW5lXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9zY2hlbWEuSW5saW5lO1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRleHRcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3NjaGVtYS5UZXh0O1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk1hcmtUeXBlXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9zY2hlbWEuTWFya1R5cGU7XG4gICAgICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQXR0cmlidXRlXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9zY2hlbWEuQXR0cmlidXRlO1xuICAgICAgICB9XG59KTtcblxudmFyIF9kZWZhdWx0c2NoZW1hID0gcmVxdWlyZShcIi4vZGVmYXVsdHNjaGVtYVwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZGVmYXVsdFNjaGVtYVwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZGVmYXVsdHNjaGVtYS5kZWZhdWx0U2NoZW1hO1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkRvY1wiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZGVmYXVsdHNjaGVtYS5Eb2M7XG4gICAgICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQmxvY2tRdW90ZVwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZGVmYXVsdHNjaGVtYS5CbG9ja1F1b3RlO1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk9yZGVyZWRMaXN0XCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0c2NoZW1hLk9yZGVyZWRMaXN0O1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkJ1bGxldExpc3RcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRzY2hlbWEuQnVsbGV0TGlzdDtcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJMaXN0SXRlbVwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZGVmYXVsdHNjaGVtYS5MaXN0SXRlbTtcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJIb3Jpem9udGFsUnVsZVwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZGVmYXVsdHNjaGVtYS5Ib3Jpem9udGFsUnVsZTtcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJQYXJhZ3JhcGhcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRzY2hlbWEuUGFyYWdyYXBoO1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkhlYWRpbmdcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRzY2hlbWEuSGVhZGluZztcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb2RlQmxvY2tcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRzY2hlbWEuQ29kZUJsb2NrO1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkltYWdlXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0c2NoZW1hLkltYWdlO1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkhhcmRCcmVha1wiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZGVmYXVsdHNjaGVtYS5IYXJkQnJlYWs7XG4gICAgICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29kZU1hcmtcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRzY2hlbWEuQ29kZU1hcms7XG4gICAgICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiRW1NYXJrXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0c2NoZW1hLkVtTWFyaztcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJTdHJvbmdNYXJrXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0c2NoZW1hLlN0cm9uZ01hcms7XG4gICAgICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTGlua01hcmtcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRzY2hlbWEuTGlua01hcms7XG4gICAgICAgIH1cbn0pO1xuXG52YXIgX3BvcyA9IHJlcXVpcmUoXCIuL3Bvc1wiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUG9zXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9wb3MuUG9zO1xuICAgICAgICB9XG59KTtcblxudmFyIF9kaWZmID0gcmVxdWlyZShcIi4vZGlmZlwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZmluZERpZmZTdGFydFwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZGlmZi5maW5kRGlmZlN0YXJ0O1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImZpbmREaWZmRW5kXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9kaWZmLmZpbmREaWZmRW5kO1xuICAgICAgICB9XG59KTsiLCIvLyA7OyBBIG1hcmsgaXMgYSBwaWVjZSBvZiBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhIG5vZGUsXG4vLyBzdWNoIGFzIGl0IGJlaW5nIGVtcGhhc2l6ZWQsIGluIGNvZGUgZm9udCwgb3IgYSBsaW5rLiBJdCBoYXMgYSB0eXBlXG4vLyBhbmQgb3B0aW9uYWxseSBhIHNldCBvZiBhdHRyaWJ1dGVzIHRoYXQgcHJvdmlkZSBmdXJ0aGVyIGluZm9ybWF0aW9uXG4vLyAoc3VjaCBhcyB0aGUgdGFyZ2V0IG9mIHRoZSBsaW5rKS4gTWFya3MgYXJlIGNyZWF0ZWQgdGhyb3VnaCBhXG4vLyBgU2NoZW1hYCwgd2hpY2ggY29udHJvbHMgd2hpY2ggdHlwZXMgZXhpc3QgYW5kIHdoaWNoXG4vLyBhdHRyaWJ1dGVzIHRoZXkgaGF2ZS5cblwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBNYXJrID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTWFyayh0eXBlLCBhdHRycykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNYXJrKTtcblxuICAgIC8vIDo6IE1hcmtUeXBlXG4gICAgLy8gVGhlIHR5cGUgb2YgdGhpcyBtYXJrLlxuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgLy8gOjogT2JqZWN0XG4gICAgLy8gVGhlIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWFyay5cbiAgICB0aGlzLmF0dHJzID0gYXR0cnM7XG4gIH1cblxuICAvLyA6OiAoKSDihpIgT2JqZWN0XG4gIC8vIENvbnZlcnQgdGhpcyBtYXJrIHRvIGEgSlNPTi1zZXJpYWxpemVhYmxlIHJlcHJlc2VudGF0aW9uLlxuXG4gIF9jcmVhdGVDbGFzcyhNYXJrLCBbe1xuICAgIGtleTogXCJ0b0pTT05cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9KU09OKCkge1xuICAgICAgaWYgKHRoaXMudHlwZS5pbnN0YW5jZSkgcmV0dXJuIHRoaXMudHlwZS5uYW1lO1xuICAgICAgdmFyIG9iaiA9IHsgXzogdGhpcy50eXBlLm5hbWUgfTtcbiAgICAgIGZvciAodmFyIGF0dHIgaW4gdGhpcy5hdHRycykge1xuICAgICAgICBvYmpbYXR0cl0gPSB0aGlzLmF0dHJzW2F0dHJdO1xuICAgICAgfXJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgLy8gOjogKFtNYXJrXSkg4oaSIFtNYXJrXVxuICAgIC8vIEdpdmVuIGEgc2V0IG9mIG1hcmtzLCBjcmVhdGUgYSBuZXcgc2V0IHdoaWNoIGNvbnRhaW5zIHRoaXMgb25lIGFzXG4gICAgLy8gd2VsbCwgaW4gdGhlIHJpZ2h0IHBvc2l0aW9uLiBJZiB0aGlzIG1hcmsgb3IgYW5vdGhlciBvZiBpdHMgdHlwZVxuICAgIC8vIGlzIGFscmVhZHkgaW4gdGhlIHNldCwgdGhlIHNldCBpdHNlbGYgaXMgcmV0dXJuZWQuXG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkVG9TZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkVG9TZXQoc2V0KSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgb3RoZXIgPSBzZXRbaV07XG4gICAgICAgIGlmIChvdGhlci50eXBlID09IHRoaXMudHlwZSkge1xuICAgICAgICAgIGlmICh0aGlzLmVxKG90aGVyKSkgcmV0dXJuIHNldDtlbHNlIHJldHVybiBzZXQuc2xpY2UoMCwgaSkuY29uY2F0KHRoaXMpLmNvbmNhdChzZXQuc2xpY2UoaSArIDEpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3RoZXIudHlwZS5yYW5rID4gdGhpcy50eXBlLnJhbmspIHJldHVybiBzZXQuc2xpY2UoMCwgaSkuY29uY2F0KHRoaXMpLmNvbmNhdChzZXQuc2xpY2UoaSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNldC5jb25jYXQodGhpcyk7XG4gICAgfVxuXG4gICAgLy8gOjogKFtNYXJrXSkg4oaSIFtNYXJrXVxuICAgIC8vIFJlbW92ZSB0aGlzIG1hcmsgZnJvbSB0aGUgZ2l2ZW4gc2V0LCByZXR1cm5pbmcgYSBuZXcgc2V0LiBJZiB0aGlzXG4gICAgLy8gbWFyayBpcyBub3QgaW4gdGhlIHNldCwgdGhlIHNldCBpdHNlbGYgaXMgcmV0dXJuZWQuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlRnJvbVNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVGcm9tU2V0KHNldCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIGlmICh0aGlzLmVxKHNldFtpXSkpIHJldHVybiBzZXQuc2xpY2UoMCwgaSkuY29uY2F0KHNldC5zbGljZShpICsgMSkpO1xuICAgICAgcmV0dXJuIHNldDtcbiAgICB9XG5cbiAgICAvLyA6OiAoW01hcmtdKSDihpIgYm9vbFxuICAgIC8vIFRlc3Qgd2hldGhlciB0aGlzIG1hcmsgaXMgaW4gdGhlIGdpdmVuIHNldCBvZiBtYXJrcy5cbiAgfSwge1xuICAgIGtleTogXCJpc0luU2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzSW5TZXQoc2V0KSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodGhpcy5lcShzZXRbaV0pKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1yZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gOjogKE1hcmspIOKGkiBib29sXG4gICAgLy8gVGVzdCB3aGV0aGVyIHRoaXMgbWFyayBoYXMgdGhlIHNhbWUgdHlwZSBhbmQgYXR0cmlidXRlcyBhc1xuICAgIC8vIGFub3RoZXIgbWFyay5cbiAgfSwge1xuICAgIGtleTogXCJlcVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlcShvdGhlcikge1xuICAgICAgaWYgKHRoaXMgPT0gb3RoZXIpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKHRoaXMudHlwZSAhPSBvdGhlci50eXBlKSByZXR1cm4gZmFsc2U7XG4gICAgICBmb3IgKHZhciBhdHRyIGluIHRoaXMuYXR0cnMpIHtcbiAgICAgICAgaWYgKG90aGVyLmF0dHJzW2F0dHJdICE9IHRoaXMuYXR0cnNbYXR0cl0pIHJldHVybiBmYWxzZTtcbiAgICAgIH1yZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyA6OiAoW01hcmtdLCBbTWFya10pIOKGkiBib29sXG4gICAgLy8gVGVzdCB3aGV0aGVyIHR3byBzZXRzIG9mIG1hcmtzIGFyZSBpZGVudGljYWwuXG4gIH1dLCBbe1xuICAgIGtleTogXCJzYW1lU2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNhbWVTZXQoYSwgYikge1xuICAgICAgaWYgKGEgPT0gYikgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIWFbaV0uZXEoYltpXSkpIHJldHVybiBmYWxzZTtcbiAgICAgIH1yZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyA6OiAoP3VuaW9uPE1hcmssIFtNYXJrXT4pIOKGkiBbTWFya11cbiAgICAvLyBDcmVhdGUgYSBwcm9wZXJseSBzb3J0ZWQgbWFyayBzZXQgZnJvbSBudWxsLCBhIHNpbmdsZSBtYXJrLCBvciBhblxuICAgIC8vIHVuc29ydGVkIGFycmF5IG9mIG1hcmtzLlxuICB9LCB7XG4gICAga2V5OiBcInNldEZyb21cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0RnJvbShtYXJrcykge1xuICAgICAgaWYgKCFtYXJrcyB8fCBtYXJrcy5sZW5ndGggPT0gMCkgcmV0dXJuIGVtcHR5O1xuICAgICAgaWYgKG1hcmtzIGluc3RhbmNlb2YgTWFyaykgcmV0dXJuIFttYXJrc107XG4gICAgICB2YXIgY29weSA9IG1hcmtzLnNsaWNlKCk7XG4gICAgICBjb3B5LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGEudHlwZS5yYW5rIC0gYi50eXBlLnJhbms7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjb3B5O1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBNYXJrO1xufSkoKTtcblxuZXhwb3J0cy5NYXJrID0gTWFyaztcblxudmFyIGVtcHR5ID0gW107IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KF94OCwgX3g5LCBfeDEwKSB7IHZhciBfYWdhaW4gPSB0cnVlOyBfZnVuY3Rpb246IHdoaWxlIChfYWdhaW4pIHsgdmFyIG9iamVjdCA9IF94OCwgcHJvcGVydHkgPSBfeDksIHJlY2VpdmVyID0gX3gxMDsgX2FnYWluID0gZmFsc2U7IGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyBfeDggPSBwYXJlbnQ7IF94OSA9IHByb3BlcnR5OyBfeDEwID0gcmVjZWl2ZXI7IF9hZ2FpbiA9IHRydWU7IGRlc2MgPSBwYXJlbnQgPSB1bmRlZmluZWQ7IGNvbnRpbnVlIF9mdW5jdGlvbjsgfSB9IGVsc2UgaWYgKFwidmFsdWVcIiBpbiBkZXNjKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfSB9O1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgX2ZyYWdtZW50ID0gcmVxdWlyZShcIi4vZnJhZ21lbnRcIik7XG5cbnZhciBfbWFyayA9IHJlcXVpcmUoXCIuL21hcmtcIik7XG5cbnZhciBfcG9zID0gcmVxdWlyZShcIi4vcG9zXCIpO1xuXG52YXIgZW1wdHlBcnJheSA9IFtdLFxuICAgIGVtcHR5QXR0cnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4vLyA7OyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBub2RlIGluIHRoZSB0cmVlIHRoYXQgbWFrZXMgdXAgYVxuLy8gUHJvc2VNaXJyb3IgZG9jdW1lbnQuIFNvIGEgZG9jdW1lbnQgaXMgYW4gaW5zdGFuY2Ugb2YgYE5vZGVgLCB3aXRoXG4vLyBjaGlsZHJlbiB0aGF0IGFyZSBhbHNvIGluc3RhbmNlcyBvZiBgTm9kZWAuXG4vL1xuLy8gTm9kZXMgYXJlIHBlcnNpc3RlbnQgZGF0YSBzdHJ1Y3R1cmVzLiBJbnN0ZWFkIG9mIGNoYW5naW5nIHRoZW0sIHlvdVxuLy8gY3JlYXRlIG5ldyBvbmVzIHdpdGggdGhlIGNvbnRlbnQgeW91IHdhbnQuIE9sZCBvbmVzIGtlZXAgcG9pbnRpbmdcbi8vIGF0IHRoZSBvbGQgZG9jdW1lbnQgc2hhcGUuIFRoaXMgaXMgbWFkZSBjaGVhcGVyIGJ5IHNoYXJpbmdcbi8vIHN0cnVjdHVyZSBiZXR3ZWVuIHRoZSBvbGQgYW5kIG5ldyBkYXRhIGFzIG11Y2ggYXMgcG9zc2libGUsIHdoaWNoIGFcbi8vIHRyZWUgc2hhcGUgbGlrZSB0aGlzICh3aXRob3V0IGJhY2sgcG9pbnRlcnMpIG1ha2VzIGVhc3kuXG4vL1xuLy8gKipOZXZlcioqIGRpcmVjdGx5IG11dGF0ZSB0aGUgcHJvcGVydGllcyBvZiBhIGBOb2RlYCBvYmplY3QuXG5cbnZhciBOb2RlID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTm9kZSh0eXBlLCBhdHRycywgY29udGVudCwgbWFya3MpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTm9kZSk7XG5cbiAgICAvLyA6OiBOb2RlVHlwZVxuICAgIC8vIFRoZSB0eXBlIG9mIG5vZGUgdGhhdCB0aGlzIGlzLlxuICAgIHRoaXMudHlwZSA9IHR5cGU7XG5cbiAgICAvLyA6OiBPYmplY3RcbiAgICAvLyBBbiBvYmplY3QgbWFwcGluZyBhdHRyaWJ1dGUgbmFtZXMgdG8gc3RyaW5nIHZhbHVlcy4gVGhlIGtpbmQgb2ZcbiAgICAvLyBhdHRyaWJ1dGVzIGFsbG93ZWQgYW5kIHJlcXVpcmVkIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBub2RlXG4gICAgLy8gdHlwZS5cbiAgICB0aGlzLmF0dHJzID0gYXR0cnM7XG5cbiAgICAvLyA6OiBGcmFnbWVudFxuICAgIC8vIFRoZSBub2RlJ3MgY29udGVudC5cbiAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50IHx8IF9mcmFnbWVudC5lbXB0eUZyYWdtZW50O1xuXG4gICAgLy8gOjogW01hcmtdXG4gICAgLy8gVGhlIG1hcmtzICh0aGluZ3MgbGlrZSB3aGV0aGVyIGl0IGlzIGVtcGhhc2l6ZWQgb3IgcGFydCBvZiBhXG4gICAgLy8gbGluaykgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS5cbiAgICB0aGlzLm1hcmtzID0gbWFya3MgfHwgZW1wdHlBcnJheTtcbiAgfVxuXG4gIC8vIDo6IG51bWJlclxuICAvLyBUaGUgc2l6ZSBvZiB0aGUgbm9kZSdzIGNvbnRlbnQsIHdoaWNoIGlzIHRoZSBtYXhpbXVtIG9mZnNldCBpblxuICAvLyB0aGUgbm9kZS4gRm9yIG5vZGVzIHRoYXQgZG9uJ3QgY29udGFpbiB0ZXh0LCB0aGlzIGlzIGFsc28gdGhlXG4gIC8vIG51bWJlciBvZiBjaGlsZCBub2RlcyB0aGF0IHRoZSBub2RlIGhhcy5cblxuICBfY3JlYXRlQ2xhc3MoTm9kZSwgW3tcbiAgICBrZXk6IFwiY2hpbGRcIixcblxuICAgIC8vIDo6IChudW1iZXIpIOKGkiBOb2RlXG4gICAgLy8gUmV0cmlldmUgdGhlIGNoaWxkIGF0IHRoZSBnaXZlbiBvZmZzZXQuIE5vdGUgdGhhdCB0aGlzIGlzICoqbm90KipcbiAgICAvLyB0aGUgYXBwcm9wcmlhdGUgd2F5IHRvIGxvb3Agb3ZlciBhIG5vZGUuIGBjaGlsZGAncyBjb21wbGV4aXR5IG1heVxuICAgIC8vIGJlIG5vbi1jb25zdGFudCBmb3Igc29tZSBub2RlcywgYW5kIGl0IHdpbGwgcmV0dXJuIHRoZSBzYW1lIG5vZGVcbiAgICAvLyBtdWx0aXBsZSB0aW1lcyB3aGVuIGNhbGxpbmcgaXQgZm9yIGRpZmZlcmVudCBvZmZzZXRzIHdpdGhpbiBhXG4gICAgLy8gdGV4dCBub2RlLlxuICAgIHZhbHVlOiBmdW5jdGlvbiBjaGlsZChvZmYpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQuY2hpbGQob2ZmKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoP251bWJlciwgP251bWJlcikg4oaSIEl0ZXJhdG9yPE5vZGU+XG4gICAgLy8gQ3JlYXRlIGFuIGl0ZXJhdG9yIG92ZXIgdGhpcyBub2RlJ3MgY2hpbGRyZW4sIG9wdGlvbmFsbHkgc3RhcnRpbmdcbiAgICAvLyBhbmQgZW5kaW5nIGF0IGEgZ2l2ZW4gb2Zmc2V0LlxuICB9LCB7XG4gICAga2V5OiBcIml0ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXRlcihzdGFydCwgZW5kKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250ZW50Lml0ZXIoc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLy8gOjogKD9udW1iZXIsID9udW1iZXIpIOKGkiBJdGVyYXRvcjxOb2RlPlxuICAgIC8vIENyZWF0ZSBhIHJldmVyc2UgaXRlcmF0b3IgKGl0ZXJhdGluZyBmcm9tIHRoZSBub2RlJ3MgZW5kIHRvd2FyZHNcbiAgICAvLyBpdHMgc3RhcnQpIG92ZXIgdGhpcyBub2RlJ3MgY2hpbGRyZW4sIG9wdGlvbmFsbHkgc3RhcnRpbmcgYW5kXG4gICAgLy8gZW5kaW5nIGF0IGEgZ2l2ZW4gb2Zmc2V0LiAqKk5vdGUqKjogaWYgZ2l2ZW4sIGBzdGFydGAgc2hvdWxkIGJlXG4gICAgLy8gZ3JlYXRlciB0aGFuIChvciBlcXVhbCkgdG8gYGVuZGAuXG4gIH0sIHtcbiAgICBrZXk6IFwicmV2ZXJzZUl0ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmV2ZXJzZUl0ZXIoc3RhcnQsIGVuZCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGVudC5yZXZlcnNlSXRlcihzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvLyA6OiAobnVtYmVyKSDihpIge3N0YXJ0OiBudW1iZXIsIG5vZGU6IE5vZGV9XG4gICAgLy8gRmluZCB0aGUgbm9kZSB0aGF0IHNpdHMgYmVmb3JlIGEgZ2l2ZW4gb2Zmc2V0LiBDYW4gYmUgdXNlZCB0b1xuICAgIC8vIGZpbmQgb3V0IHdoaWNoIHRleHQgbm9kZSBjb3ZlcnMgYSBnaXZlbiBvZmZzZXQuIFRoZSBgc3RhcnRgXG4gICAgLy8gcHJvcGVydHkgb2YgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgc3RhcnRpbmcgb2Zmc2V0IG9mIHRoZVxuICAgIC8vIHJldHVybmVkIG5vZGUuIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgdGhpcyB3aXRoIG9mZnNldCAwLlxuICB9LCB7XG4gICAga2V5OiBcImNodW5rQmVmb3JlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNodW5rQmVmb3JlKG9mZikge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGVudC5jaHVua0JlZm9yZShvZmYpO1xuICAgIH1cblxuICAgIC8vIDo6IChudW1iZXIpIOKGkiB7c3RhcnQ6IG51bWJlciwgbm9kZTogTm9kZX1cbiAgICAvLyBGaW5kIHRoZSBub2RlIHRoYXQgc2l0cyBhZnRlciBhIGdpdmVuIG9mZnNldC4gVGhlIGBzdGFydGBcbiAgICAvLyBwcm9wZXJ0eSBvZiB0aGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBzdGFydGluZyBvZmZzZXQgb2YgdGhlXG4gICAgLy8gcmV0dXJuZWQgbm9kZS4gSXQgaXMgYW4gZXJyb3IgdG8gY2FsbCB0aGlzIHdpdGggb2Zmc2V0XG4gICAgLy8gY29ycmVzcG9uZGluZyB0byB0aGUgZW5kIG9mIHRoZSBub2RlLlxuICB9LCB7XG4gICAga2V5OiBcImNodW5rQWZ0ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2h1bmtBZnRlcihvZmYpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQuY2h1bmtBZnRlcihvZmYpO1xuICAgIH1cblxuICAgIC8vIDo6ICgobm9kZTogTm9kZSwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpKVxuICAgIC8vIENhbGwgdGhlIGdpdmVuIGZ1bmN0aW9uIGZvciBlYWNoIGNoaWxkIG5vZGUuIFRoZSBmdW5jdGlvbiB3aWxsIGJlXG4gICAgLy8gZ2l2ZW4gdGhlIG5vZGUsIGFzIHdlbGwgYXMgaXRzIHN0YXJ0IGFuZCBlbmQgb2Zmc2V0cywgYXNcbiAgICAvLyBhcmd1bWVudHMuXG4gIH0sIHtcbiAgICBrZXk6IFwiZm9yRWFjaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmb3JFYWNoKGYpIHtcbiAgICAgIHRoaXMuY29udGVudC5mb3JFYWNoKGYpO1xuICAgIH1cblxuICAgIC8vIDo6IHN0cmluZ1xuICAgIC8vIENvbmNhdGVuYXRlIGFsbCB0aGUgdGV4dCBub2RlcyBmb3VuZCBpbiB0aGlzIGZyYWdtZW50IGFuZCBpdHNcbiAgICAvLyBjaGlsZHJlbi5cbiAgfSwge1xuICAgIGtleTogXCJzYW1lTWFya3VwXCIsXG5cbiAgICAvLyA6OiAoTm9kZSkg4oaSIGJvb2xcbiAgICAvLyBDb21wYXJlIHRoZSBtYXJrdXAgKHR5cGUsIGF0dHJpYnV0ZXMsIGFuZCBtYXJrcykgb2YgdGhpcyBub2RlIHRvXG4gICAgLy8gdGhvc2Ugb2YgYW5vdGhlci4gUmV0dXJucyBgdHJ1ZWAgaWYgYm90aCBoYXZlIHRoZSBzYW1lIG1hcmt1cC5cbiAgICB2YWx1ZTogZnVuY3Rpb24gc2FtZU1hcmt1cChvdGhlcikge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzTWFya3VwKG90aGVyLnR5cGUsIG90aGVyLmF0dHJzLCBvdGhlci5tYXJrcyk7XG4gICAgfVxuXG4gICAgLy8gOjogKE5vZGVUeXBlLCA/T2JqZWN0LCA/W01hcmtdKSDihpIgYm9vbFxuICAgIC8vIENoZWNrIHdoZXRoZXIgdGhpcyBub2RlJ3MgbWFya3VwIGNvcnJlc3BvbmQgdG8gdGhlIGdpdmVuIHR5cGUsXG4gICAgLy8gYXR0cmlidXRlcywgYW5kIG1hcmtzLlxuICB9LCB7XG4gICAga2V5OiBcImhhc01hcmt1cFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYXNNYXJrdXAodHlwZSwgYXR0cnMsIG1hcmtzKSB7XG4gICAgICByZXR1cm4gdGhpcy50eXBlID09IHR5cGUgJiYgTm9kZS5zYW1lQXR0cnModGhpcy5hdHRycywgYXR0cnMgfHwgZW1wdHlBdHRycykgJiYgX21hcmsuTWFyay5zYW1lU2V0KHRoaXMubWFya3MsIG1hcmtzIHx8IGVtcHR5QXJyYXkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb3B5XCIsXG5cbiAgICAvLyA6OiAoP0ZyYWdtZW50KSDihpIgTm9kZVxuICAgIC8vIENyZWF0ZSBhIG5ldyBub2RlIHdpdGggdGhlIHNhbWUgbWFya3VwIGFzIHRoaXMgbm9kZSwgY29udGFpbmluZ1xuICAgIC8vIHRoZSBnaXZlbiBjb250ZW50IChvciBlbXB0eSwgaWYgbm8gY29udGVudCBpcyBnaXZlbikuXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvcHkoKSB7XG4gICAgICB2YXIgY29udGVudCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IG51bGwgOiBhcmd1bWVudHNbMF07XG5cbiAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLnR5cGUsIHRoaXMuYXR0cnMsIGNvbnRlbnQsIHRoaXMubWFya3MpO1xuICAgIH1cblxuICAgIC8vIDo6IChbTWFya10pIOKGkiBOb2RlXG4gICAgLy8gQ3JlYXRlIGEgY29weSBvZiB0aGlzIG5vZGUsIHdpdGggdGhlIGdpdmVuIHNldCBvZiBtYXJrcyBpbnN0ZWFkXG4gICAgLy8gb2YgdGhlIG5vZGUncyBvd24gbWFya3MuXG4gIH0sIHtcbiAgICBrZXk6IFwibWFya1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXJrKG1hcmtzKSB7XG4gICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy50eXBlLCB0aGlzLmF0dHJzLCB0aGlzLmNvbnRlbnQsIG1hcmtzKTtcbiAgICB9XG5cbiAgICAvLyA6OiAobnVtYmVyLCA/bnVtYmVyKSDihpIgTm9kZVxuICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhpcyBub2RlIHdpdGggb25seSB0aGUgY29udGVudCBiZXR3ZWVuIHRoZVxuICAgIC8vIGdpdmVuIG9mZnNldHMuIElmIGB0b2AgaXMgbm90IGdpdmVuLCBpdCBkZWZhdWx0cyB0byB0aGUgZW5kIG9mXG4gICAgLy8gdGhlIG5vZGUuXG4gIH0sIHtcbiAgICBrZXk6IFwic2xpY2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2xpY2UoZnJvbSwgdG8pIHtcbiAgICAgIHJldHVybiB0aGlzLmNvcHkodGhpcy5jb250ZW50LnNsaWNlKGZyb20sIHRvKSk7XG4gICAgfVxuXG4gICAgLy8gOjogKG51bWJlciwgbnVtYmVyLCBGcmFnbWVudCkg4oaSIE5vZGVcbiAgICAvLyBDcmVhdGUgYSBjb3B5IG9mIHRoaXMgbm9kZSB3aXRoIHRoZSBjb250ZW50IGJldHdlZW4gdGhlIGdpdmVuXG4gICAgLy8gb2Zmc2V0cyByZXBsYWNlZCBieSB0aGUgZ2l2ZW4gZnJhZ21lbnQuXG4gIH0sIHtcbiAgICBrZXk6IFwic3BsaWNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNwbGljZShmcm9tLCB0bywgcmVwbGFjZSkge1xuICAgICAgcmV0dXJuIHRoaXMuY29weSh0aGlzLmNvbnRlbnQuc2xpY2UoMCwgZnJvbSkuYXBwZW5kKHJlcGxhY2UpLmFwcGVuZCh0aGlzLmNvbnRlbnQuc2xpY2UodG8pKSk7XG4gICAgfVxuXG4gICAgLy8gOjogKEZyYWdtZW50LCA/bnVtYmVyLCA/bnVtYmVyKSDihpIgTm9kZVxuICAgIC8vIFtBcHBlbmRdKCNGcmFnbWVudC5hcHBlbmQpIHRoZSBnaXZlbiBmcmFnbWVudCB0byB0aGlzIG5vZGUnc1xuICAgIC8vIGNvbnRlbnQsIGFuZCBjcmVhdGUgYSBuZXcgbm9kZSB3aXRoIHRoZSByZXN1bHQuXG4gIH0sIHtcbiAgICBrZXk6IFwiYXBwZW5kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFwcGVuZChmcmFnbWVudCkge1xuICAgICAgdmFyIGpvaW5MZWZ0ID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8gMCA6IGFyZ3VtZW50c1sxXTtcbiAgICAgIHZhciBqb2luUmlnaHQgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDIgfHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyAwIDogYXJndW1lbnRzWzJdO1xuXG4gICAgICByZXR1cm4gdGhpcy5jb3B5KHRoaXMuY29udGVudC5hcHBlbmQoZnJhZ21lbnQsIGpvaW5MZWZ0LCBqb2luUmlnaHQpKTtcbiAgICB9XG5cbiAgICAvLyA6OiAobnVtYmVyLCBOb2RlKSDihpIgTm9kZVxuICAgIC8vIFJldHVybiBhIGNvcHkgb2YgdGhpcyBub2RlIHdpdGggdGhlIGNoaWxkIGF0IHRoZSBnaXZlbiBvZmZzZXRcbiAgICAvLyByZXBsYWNlZCBieSB0aGUgZ2l2ZW4gbm9kZS4gKipOb3RlKio6IFRoZSBvZmZzZXQgc2hvdWxkIG5vdCBmYWxsXG4gICAgLy8gd2l0aGluIGEgdGV4dCBub2RlLlxuICB9LCB7XG4gICAga2V5OiBcInJlcGxhY2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVwbGFjZShwb3MsIG5vZGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvcHkodGhpcy5jb250ZW50LnJlcGxhY2UocG9zLCBub2RlKSk7XG4gICAgfVxuXG4gICAgLy8gOjogKFtudW1iZXJdLCBOb2RlKSDihpIgTm9kZVxuICAgIC8vIFJldHVybiBhIGNvcHkgb2YgdGhpcyBub2RlIHdpdGggdGhlIGRlc2NlbmRhbnQgYXQgYHBhdGhgIHJlcGxhY2VkXG4gICAgLy8gYnkgdGhlIGdpdmVuIHJlcGxhY2VtZW50IG5vZGUuIFRoaXMgd2lsbCBjb3B5IGFzIG1hbnkgc3ViLW5vZGVzIGFzXG4gICAgLy8gdGhlcmUgYXJlIGVsZW1lbnRzIGluIGBwYXRoYC5cbiAgfSwge1xuICAgIGtleTogXCJyZXBsYWNlRGVlcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXBsYWNlRGVlcChwYXRoLCBub2RlKSB7XG4gICAgICB2YXIgZGVwdGggPSBhcmd1bWVudHMubGVuZ3RoIDw9IDIgfHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyAwIDogYXJndW1lbnRzWzJdO1xuXG4gICAgICBpZiAoZGVwdGggPT0gcGF0aC5sZW5ndGgpIHJldHVybiBub2RlO1xuICAgICAgdmFyIHBvcyA9IHBhdGhbZGVwdGhdO1xuICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZShwb3MsIHRoaXMuY2hpbGQocG9zKS5yZXBsYWNlRGVlcChwYXRoLCBub2RlLCBkZXB0aCArIDEpKTtcbiAgICB9XG5cbiAgICAvLyA6OiAobnVtYmVyLCBzdHJpbmcpIOKGkiBOb2RlXG4gICAgLy8g4oCcQ2xvc2XigJ0gdGhpcyBub2RlIGJ5IG1ha2luZyBzdXJlIHRoYXQsIGlmIGl0IGlzIGVtcHR5LCBhbmQgaXMgbm90XG4gICAgLy8gYWxsb3dlZCB0byBiZSBzbywgaXQgaGFzIGl0cyBkZWZhdWx0IGNvbnRlbnQgaW5zZXJ0ZWQuIFdoZW4gZGVwdGhcbiAgICAvLyBpcyBncmVhdGVyIHRoYW4gemVybywgc3ViLW5vZGVzIGF0IHRoZSBnaXZlbiBzaWRlICh3aGljaCBjYW4gYmVcbiAgICAvLyBgXCJzdGFydFwiYCBvciBgXCJlbmRcImApIGFyZSBjbG9zZWQgdG9vLiBSZXR1cm5zIGl0c2VsZiBpZiBubyB3b3JrXG4gICAgLy8gaXMgbmVjZXNzYXJ5LCBvciBhIGNsb3NlZCBjb3B5IGlmIHNvbWV0aGluZyBkaWQgbmVlZCB0byBoYXBwZW4uXG4gIH0sIHtcbiAgICBrZXk6IFwiY2xvc2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xvc2UoZGVwdGgsIHNpZGUpIHtcbiAgICAgIGlmIChkZXB0aCA9PSAwICYmIHRoaXMuc2l6ZSA9PSAwICYmICF0aGlzLnR5cGUuY2FuQmVFbXB0eSkgcmV0dXJuIHRoaXMuY29weSh0aGlzLnR5cGUuZGVmYXVsdENvbnRlbnQoKSk7XG4gICAgICB2YXIgY2xvc2VkQ29udGVudCA9IHVuZGVmaW5lZDtcbiAgICAgIGlmIChkZXB0aCA+IDAgJiYgKGNsb3NlZENvbnRlbnQgPSB0aGlzLmNvbnRlbnQuY2xvc2UoZGVwdGggLSAxLCBzaWRlKSkgIT0gdGhpcy5jb250ZW50KSByZXR1cm4gdGhpcy5jb3B5KGNsb3NlZENvbnRlbnQpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gOjogKFtudW1iZXJdKSDihpIgTm9kZVxuICAgIC8vIEdldCB0aGUgZGVzY2VuZGFudCBub2RlIGF0IHRoZSBnaXZlbiBwYXRoLCB3aGljaCBpcyBpbnRlcnByZXRlZFxuICAgIC8vIGFzIGEgc2VyaWVzIG9mIG9mZnNldHMgaW50byBzdWNjZXNzaXZlbHkgZGVlcGVyIG5vZGVzLlxuICB9LCB7XG4gICAga2V5OiBcInBhdGhcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGF0aChfcGF0aCkge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGUgPSB0aGlzOyBpIDwgX3BhdGgubGVuZ3RoOyBub2RlID0gbm9kZS5jaGlsZChfcGF0aFtpXSksIGkrKykge31cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIC8vIDo6IChQb3MpIOKGkiBOb2RlXG4gICAgLy8gR2V0IHRoZSBub2RlIGFmdGVyIHRoZSBnaXZlbiBwb3NpdGlvbi5cbiAgfSwge1xuICAgIGtleTogXCJub2RlQWZ0ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbm9kZUFmdGVyKHBvcykge1xuICAgICAgcmV0dXJuIHRoaXMucGF0aChwb3MucGF0aCkuY2hpbGQocG9zLm9mZnNldCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhdGhOb2Rlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXRoTm9kZXMocGF0aCkge1xuICAgICAgdmFyIG5vZGVzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMCwgbm9kZSA9IHRoaXM7OyBpKyspIHtcbiAgICAgICAgbm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgaWYgKGkgPT0gcGF0aC5sZW5ndGgpIGJyZWFrO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZChwYXRoW2ldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBub2RlcztcbiAgICB9XG5cbiAgICAvLyA6OiAoUG9zLCA/Ym9vbCkg4oaSIGJvb2xcbiAgICAvLyBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gcG9zaXRpb24gaXMgdmFsaWQgaW4gdGhpcyBub2RlLiBXaGVuXG4gICAgLy8gYHJlcXVpcmVUZXh0YmxvY2tgIGlzIHRydWUsIG9ubHkgcG9zaXRpb25zIGluc2lkZSB0ZXh0YmxvY2tzIGFyZVxuICAgIC8vIGNvbnNpZGVyZWQgdmFsaWQuXG4gIH0sIHtcbiAgICBrZXk6IFwiaXNWYWxpZFBvc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc1ZhbGlkUG9zKHBvcywgcmVxdWlyZVRleHRibG9jaykge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGUgPSB0aGlzOzsgaSsrKSB7XG4gICAgICAgIGlmIChpID09IHBvcy5wYXRoLmxlbmd0aCkge1xuICAgICAgICAgIGlmIChyZXF1aXJlVGV4dGJsb2NrICYmICFub2RlLmlzVGV4dGJsb2NrKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIHBvcy5vZmZzZXQgPD0gbm9kZS5zaXplO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBuID0gcG9zLnBhdGhbaV07XG4gICAgICAgICAgaWYgKG4gPj0gbm9kZS5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQobik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA6OiAoUG9zLCBQb3MpIOKGkiB7ZnJvbTogUG9zLCB0bzogUG9zfVxuICAgIC8vIEZpbmRzIHRoZSBuYXJyb3dlc3Qgc2libGluZyByYW5nZSAodHdvIHBvc2l0aW9ucyB0aGF0IGJvdGggcG9pbnRcbiAgICAvLyBpbnRvIHRoZSBzYW1lIG5vZGUpIHRoYXQgZW5jbG9zZXMgdGhlIGdpdmVuIHBvc2l0aW9ucy5cbiAgfSwge1xuICAgIGtleTogXCJzaWJsaW5nUmFuZ2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2libGluZ1JhbmdlKGZyb20sIHRvKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbm9kZSA9IHRoaXM7OyBpKyspIHtcbiAgICAgICAgaWYgKG5vZGUuaXNUZXh0YmxvY2spIHtcbiAgICAgICAgICB2YXIgcGF0aCA9IGZyb20ucGF0aC5zbGljZSgwLCBpIC0gMSksXG4gICAgICAgICAgICAgIG9mZnNldCA9IGZyb20ucGF0aFtpIC0gMV07XG4gICAgICAgICAgcmV0dXJuIHsgZnJvbTogbmV3IF9wb3MuUG9zKHBhdGgsIG9mZnNldCksIHRvOiBuZXcgX3Bvcy5Qb3MocGF0aCwgb2Zmc2V0ICsgMSkgfTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZnJvbUVuZCA9IGkgPT0gZnJvbS5wYXRoLmxlbmd0aCxcbiAgICAgICAgICAgIHRvRW5kID0gaSA9PSB0by5wYXRoLmxlbmd0aDtcbiAgICAgICAgdmFyIGxlZnQgPSBmcm9tRW5kID8gZnJvbS5vZmZzZXQgOiBmcm9tLnBhdGhbaV07XG4gICAgICAgIHZhciByaWdodCA9IHRvRW5kID8gdG8ub2Zmc2V0IDogdG8ucGF0aFtpXTtcbiAgICAgICAgaWYgKGZyb21FbmQgfHwgdG9FbmQgfHwgbGVmdCAhPSByaWdodCkge1xuICAgICAgICAgIHZhciBwYXRoID0gZnJvbS5wYXRoLnNsaWNlKDAsIGkpO1xuICAgICAgICAgIHJldHVybiB7IGZyb206IG5ldyBfcG9zLlBvcyhwYXRoLCBsZWZ0KSwgdG86IG5ldyBfcG9zLlBvcyhwYXRoLCByaWdodCArICh0b0VuZCA/IDAgOiAxKSkgfTtcbiAgICAgICAgfVxuICAgICAgICBub2RlID0gbm9kZS5jaGlsZChsZWZ0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA6OiAoP1BvcywgP1BvcywgKG5vZGU6IE5vZGUsIHBhdGg6IFtudW1iZXJdLCBwYXJlbnQ6IE5vZGUpKVxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgbm9kZXMgYmV0d2VlbiB0aGUgZ2l2ZW4gdHdvIHBvc2l0aW9ucywgY2FsbGluZ1xuICAgIC8vIHRoZSBjYWxsYmFjayB3aXRoIHRoZSBub2RlLCB0aGUgcGF0aCB0b3dhcmRzIGl0LCBhbmQgaXRzIHBhcmVudFxuICAgIC8vIG5vZGUsIGFzIGFyZ3VtZW50cy4gYGZyb21gIGFuZCBgdG9gIG1heSBiZSBgbnVsbGAgdG8gZGVub3RlXG4gICAgLy8gc3RhcnRpbmcgYXQgdGhlIHN0YXJ0IG9mIHRoZSBub2RlIG9yIGVuZGluZyBhdCBpdHMgZW5kLiBOb3RlIHRoYXRcbiAgICAvLyB0aGUgcGF0aCBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrIGlzIG11dGF0ZWQgYXMgaXRlcmF0aW9uXG4gICAgLy8gY29udGludWVzLCBzbyBpZiB5b3Ugd2FudCB0byBwcmVzZXJ2ZSBpdCwgbWFrZSBhIGNvcHkuXG4gIH0sIHtcbiAgICBrZXk6IFwibm9kZXNCZXR3ZWVuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5vZGVzQmV0d2Vlbihmcm9tLCB0bywgZikge1xuICAgICAgdmFyIHBhdGggPSBhcmd1bWVudHMubGVuZ3RoIDw9IDMgfHwgYXJndW1lbnRzWzNdID09PSB1bmRlZmluZWQgPyBbXSA6IGFyZ3VtZW50c1szXTtcbiAgICAgIHZhciBwYXJlbnQgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDQgfHwgYXJndW1lbnRzWzRdID09PSB1bmRlZmluZWQgPyBudWxsIDogYXJndW1lbnRzWzRdO1xuXG4gICAgICBpZiAoZih0aGlzLCBwYXRoLCBwYXJlbnQpID09PSBmYWxzZSkgcmV0dXJuO1xuICAgICAgdGhpcy5jb250ZW50Lm5vZGVzQmV0d2Vlbihmcm9tLCB0bywgZiwgcGF0aCwgdGhpcyk7XG4gICAgfVxuXG4gICAgLy8gOjogKD9Qb3MsID9Qb3MsIChub2RlOiBOb2RlLCBwYXRoOiBbbnVtYmVyXSwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIHBhcmVudDogTm9kZSkpXG4gICAgLy8gQ2FsbHMgdGhlIGdpdmVuIGZ1bmN0aW9uIGZvciBlYWNoIGlubGluZSBub2RlIGJldHdlZW4gdGhlIHR3b1xuICAgIC8vIGdpdmVuIHBvc2l0aW9ucy4gUGFzcyBudWxsIGZvciBgZnJvbWAgb3IgYHRvYCB0byBzdGFydCBvciBlbmQgYXRcbiAgICAvLyB0aGUgc3RhcnQgb3IgZW5kIG9mIHRoZSBub2RlLlxuICB9LCB7XG4gICAga2V5OiBcImlubGluZU5vZGVzQmV0d2VlblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbmxpbmVOb2Rlc0JldHdlZW4oZnJvbSwgdG8sIGYpIHtcbiAgICAgIHRoaXMubm9kZXNCZXR3ZWVuKGZyb20sIHRvLCBmdW5jdGlvbiAobm9kZSwgcGF0aCwgcGFyZW50KSB7XG4gICAgICAgIGlmIChub2RlLmlzSW5saW5lKSB7XG4gICAgICAgICAgdmFyIGxhc3QgPSBwYXRoLmxlbmd0aCAtIDE7XG4gICAgICAgICAgZihub2RlLCBwYXRoLnNsaWNlKDAsIGxhc3QpLCBwYXRoW2xhc3RdLCBwYXRoW2xhc3RdICsgbm9kZS53aWR0aCwgcGFyZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gOjogKD9Qb3MsID9Qb3MpIOKGkiBOb2RlXG4gICAgLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBub2RlIGNvbnRhaW5pbmcgb25seSB0aGUgY29udGVudCBiZXR3ZWVuXG4gICAgLy8gYGZyb21gIGFuZCBgdG9gLiBZb3UgY2FuIHBhc3MgYG51bGxgIGZvciBlaXRoZXIgb2YgdGhlbSB0byBzdGFydFxuICAgIC8vIG9yIGVuZCBhdCB0aGUgc3RhcnQgb3IgZW5kIG9mIHRoZSBub2RlLlxuICB9LCB7XG4gICAga2V5OiBcInNsaWNlQmV0d2VlblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzbGljZUJldHdlZW4oZnJvbSwgdG8pIHtcbiAgICAgIHZhciBkZXB0aCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMiB8fCBhcmd1bWVudHNbMl0gPT09IHVuZGVmaW5lZCA/IDAgOiBhcmd1bWVudHNbMl07XG5cbiAgICAgIHJldHVybiB0aGlzLmNvcHkodGhpcy5jb250ZW50LnNsaWNlQmV0d2Vlbihmcm9tLCB0bywgZGVwdGgpKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoUG9zKSDihpIgW01hcmtdXG4gICAgLy8gR2V0IHRoZSBtYXJrcyBvZiB0aGUgbm9kZSBiZWZvcmUgdGhlIGdpdmVuIHBvc2l0aW9uIG9yLCBpZiB0aGF0XG4gICAgLy8gcG9zaXRpb24gaXMgYXQgdGhlIHN0YXJ0IG9mIGEgbm9uLWVtcHR5IG5vZGUsIHRob3NlIG9mIHRoZSBub2RlXG4gICAgLy8gYWZ0ZXIgaXQuXG4gIH0sIHtcbiAgICBrZXk6IFwibWFya3NBdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXJrc0F0KHBvcykge1xuICAgICAgdmFyIHBhcmVudCA9IHRoaXMucGF0aChwb3MucGF0aCk7XG4gICAgICBpZiAoIXBhcmVudC5pc1RleHRibG9jayB8fCAhcGFyZW50LnNpemUpIHJldHVybiBlbXB0eUFycmF5O1xuICAgICAgcmV0dXJuIHBhcmVudC5jaHVua0JlZm9yZShwb3Mub2Zmc2V0IHx8IDEpLm5vZGUubWFya3M7XG4gICAgfVxuXG4gICAgLy8gOjogKD9Qb3MsID9Qb3MsIE1hcmtUeXBlKSDihpIgYm9vbFxuICAgIC8vIFRlc3Qgd2hldGhlciBhIG1hcmsgb2YgdGhlIGdpdmVuIHR5cGUgb2NjdXJzIGluIHRoaXMgZG9jdW1lbnRcbiAgICAvLyBiZXR3ZWVuIHRoZSB0d28gZ2l2ZW4gcG9zaXRpb25zLlxuICB9LCB7XG4gICAga2V5OiBcInJhbmdlSGFzTWFya1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByYW5nZUhhc01hcmsoZnJvbSwgdG8sIHR5cGUpIHtcbiAgICAgIHZhciBmb3VuZCA9IGZhbHNlO1xuICAgICAgdGhpcy5ub2Rlc0JldHdlZW4oZnJvbSwgdG8sIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIGlmICh0eXBlLmlzSW5TZXQobm9kZS5tYXJrcykpIGZvdW5kID0gdHJ1ZTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZvdW5kO1xuICAgIH1cblxuICAgIC8vIDo6IGJvb2xcbiAgICAvLyBUcnVlIHdoZW4gdGhpcyBpcyBhIGJsb2NrIChub24taW5saW5lIG5vZGUpXG4gIH0sIHtcbiAgICBrZXk6IFwidG9TdHJpbmdcIixcblxuICAgIC8vIDo6ICgpIOKGkiBzdHJpbmdcbiAgICAvLyBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBub2RlIGZvciBkZWJ1Z2dpbmdcbiAgICAvLyBwdXJwb3Nlcy5cbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICB2YXIgbmFtZSA9IHRoaXMudHlwZS5uYW1lO1xuICAgICAgaWYgKHRoaXMuY29udGVudC5zaXplKSBuYW1lICs9IFwiKFwiICsgdGhpcy5jb250ZW50LnRvU3RyaW5nKCkgKyBcIilcIjtcbiAgICAgIHJldHVybiB3cmFwTWFya3ModGhpcy5tYXJrcywgbmFtZSk7XG4gICAgfVxuXG4gICAgLy8gOjogKCkg4oaSIE9iamVjdFxuICAgIC8vIFJldHVybiBhIEpTT04tc2VyaWFsaXplYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG5vZGUuXG4gIH0sIHtcbiAgICBrZXk6IFwidG9KU09OXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICAgIHZhciBvYmogPSB7IHR5cGU6IHRoaXMudHlwZS5uYW1lIH07XG4gICAgICBmb3IgKHZhciBfIGluIHRoaXMuYXR0cnMpIHtcbiAgICAgICAgb2JqLmF0dHJzID0gdGhpcy5hdHRycztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zaXplKSBvYmouY29udGVudCA9IHRoaXMuY29udGVudC50b0pTT04oKTtcbiAgICAgIGlmICh0aGlzLm1hcmtzLmxlbmd0aCkgb2JqLm1hcmtzID0gdGhpcy5tYXJrcy5tYXAoZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgcmV0dXJuIG4udG9KU09OKCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBpcyBhIGhhY2sgdG8gYmUgYWJsZSB0byB0cmVhdCBhIG5vZGUgb2JqZWN0IGFzIGFuIGl0ZXJhdG9yIHJlc3VsdFxuICB9LCB7XG4gICAga2V5OiBcInNpemVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQuc2l6ZTtcbiAgICB9XG5cbiAgICAvLyA6OiBudW1iZXJcbiAgICAvLyBUaGUgd2lkdGggb2YgdGhpcyBub2RlLiBBbHdheXMgMSBmb3Igbm9uLXRleHQgbm9kZXMsIGFuZCB0aGVcbiAgICAvLyBsZW5ndGggb2YgdGhlIHRleHQgZm9yIHRleHQgbm9kZXMuXG4gIH0sIHtcbiAgICBrZXk6IFwid2lkdGhcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0ZXh0Q29udGVudFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGVudC50ZXh0Q29udGVudDtcbiAgICB9XG5cbiAgICAvLyA6OiA/Tm9kZVxuICAgIC8vIFJldHVybnMgdGhpcyBub2RlJ3MgZmlyc3QgY2hpbGQsIG9yIGBudWxsYCBpZiB0aGVyZSBhcmUgbm9cbiAgICAvLyBjaGlsZHJlbi5cbiAgfSwge1xuICAgIGtleTogXCJmaXJzdENoaWxkXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250ZW50LmZpcnN0Q2hpbGQ7XG4gICAgfVxuXG4gICAgLy8gOjogP05vZGVcbiAgICAvLyBSZXR1cm5zIHRoaXMgbm9kZSdzIGxhc3QgY2hpbGQsIG9yIGBudWxsYCBpZiB0aGVyZSBhcmUgbm9cbiAgICAvLyBjaGlsZHJlbi5cbiAgfSwge1xuICAgIGtleTogXCJsYXN0Q2hpbGRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQubGFzdENoaWxkO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc0Jsb2NrXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy50eXBlLmlzQmxvY2s7XG4gICAgfVxuXG4gICAgLy8gOjogYm9vbFxuICAgIC8vIFRydWUgd2hlbiB0aGlzIGlzIGEgdGV4dGJsb2NrIG5vZGUsIGEgYmxvY2sgbm9kZSB3aXRoIGlubGluZVxuICAgIC8vIGNvbnRlbnQuXG4gIH0sIHtcbiAgICBrZXk6IFwiaXNUZXh0YmxvY2tcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnR5cGUuaXNUZXh0YmxvY2s7XG4gICAgfVxuXG4gICAgLy8gOjogYm9vbFxuICAgIC8vIFRydWUgd2hlbiB0aGlzIGlzIGFuIGlubGluZSBub2RlIChhIHRleHQgbm9kZSBvciBhIG5vZGUgdGhhdCBjYW5cbiAgICAvLyBhcHBlYXIgYW1vbmcgdGV4dCkuXG4gIH0sIHtcbiAgICBrZXk6IFwiaXNJbmxpbmVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnR5cGUuaXNJbmxpbmU7XG4gICAgfVxuXG4gICAgLy8gOjogYm9vbFxuICAgIC8vIFRydWUgd2hlbiB0aGlzIGlzIGEgdGV4dCBub2RlLlxuICB9LCB7XG4gICAga2V5OiBcImlzVGV4dFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMudHlwZS5pc1RleHQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInZhbHVlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyA6OiAoU2NoZW1hLCBPYmplY3QpIOKGkiBOb2RlXG4gICAgLy8gRGVzZXJpYWxpemUgYSBub2RlIGZyb20gaXRzIEpTT04gcmVwcmVzZW50YXRpb24uXG4gIH1dLCBbe1xuICAgIGtleTogXCJzYW1lQXR0cnNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2FtZUF0dHJzKGEsIGIpIHtcbiAgICAgIGlmIChhID09IGIpIHJldHVybiB0cnVlO1xuICAgICAgZm9yICh2YXIgcHJvcCBpbiBhKSB7XG4gICAgICAgIGlmIChhW3Byb3BdICE9PSBiW3Byb3BdKSByZXR1cm4gZmFsc2U7XG4gICAgICB9cmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZyb21KU09OXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZyb21KU09OKHNjaGVtYSwganNvbikge1xuICAgICAgdmFyIHR5cGUgPSBzY2hlbWEubm9kZVR5cGUoanNvbi50eXBlKTtcbiAgICAgIHZhciBjb250ZW50ID0ganNvbi50ZXh0ICE9IG51bGwgPyBqc29uLnRleHQgOiBfZnJhZ21lbnQuRnJhZ21lbnQuZnJvbUpTT04oc2NoZW1hLCBqc29uLmNvbnRlbnQpO1xuICAgICAgcmV0dXJuIHR5cGUuY3JlYXRlKGpzb24uYXR0cnMsIGNvbnRlbnQsIGpzb24ubWFya3MgJiYganNvbi5tYXJrcy5tYXAoc2NoZW1hLm1hcmtGcm9tSlNPTikpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBOb2RlO1xufSkoKTtcblxuZXhwb3J0cy5Ob2RlID0gTm9kZTtcblxuaWYgKHR5cGVvZiBTeW1ib2wgIT0gXCJ1bmRlZmluZWRcIikge1xuICAvLyA6OiAoKSDihpIgSXRlcmF0b3I8Tm9kZT5cbiAgLy8gQSBmcmFnbWVudCBpcyBpdGVyYWJsZSwgaW4gdGhlIEVTNiBzZW5zZS5cbiAgTm9kZS5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5pdGVyKCk7XG4gIH07XG59XG5cbi8vIDs7ICNmb3J3YXJkPU5vZGVcblxudmFyIFRleHROb2RlID0gKGZ1bmN0aW9uIChfTm9kZSkge1xuICBfaW5oZXJpdHMoVGV4dE5vZGUsIF9Ob2RlKTtcblxuICBmdW5jdGlvbiBUZXh0Tm9kZSh0eXBlLCBhdHRycywgY29udGVudCwgbWFya3MpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVGV4dE5vZGUpO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoVGV4dE5vZGUucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5jYWxsKHRoaXMsIHR5cGUsIGF0dHJzLCBudWxsLCBtYXJrcyk7XG4gICAgLy8gOjogP3N0cmluZ1xuICAgIC8vIEZvciB0ZXh0IG5vZGVzLCB0aGlzIGNvbnRhaW5zIHRoZSBub2RlJ3MgdGV4dCBjb250ZW50LlxuICAgIHRoaXMudGV4dCA9IGNvbnRlbnQ7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoVGV4dE5vZGUsIFt7XG4gICAga2V5OiBcInRvU3RyaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgcmV0dXJuIHdyYXBNYXJrcyh0aGlzLm1hcmtzLCBKU09OLnN0cmluZ2lmeSh0aGlzLnRleHQpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibWFya1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXJrKG1hcmtzKSB7XG4gICAgICByZXR1cm4gbmV3IFRleHROb2RlKHRoaXMudHlwZSwgdGhpcy5hdHRycywgdGhpcy50ZXh0LCBtYXJrcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvSlNPTlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgICB2YXIgYmFzZSA9IF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKFRleHROb2RlLnByb3RvdHlwZSksIFwidG9KU09OXCIsIHRoaXMpLmNhbGwodGhpcyk7XG4gICAgICBiYXNlLnRleHQgPSB0aGlzLnRleHQ7XG4gICAgICByZXR1cm4gYmFzZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidGV4dENvbnRlbnRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnRleHQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIndpZHRoXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZXh0Lmxlbmd0aDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVGV4dE5vZGU7XG59KShOb2RlKTtcblxuZXhwb3J0cy5UZXh0Tm9kZSA9IFRleHROb2RlO1xuXG5mdW5jdGlvbiB3cmFwTWFya3MobWFya3MsIHN0cikge1xuICBmb3IgKHZhciBpID0gbWFya3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBzdHIgPSBtYXJrc1tpXS50eXBlLm5hbWUgKyBcIihcIiArIHN0ciArIFwiKVwiO1xuICB9cmV0dXJuIHN0cjtcbn0iLCIvLyA7OyBJbnN0YW5jZXMgb2YgdGhlIGBQb3NgIGNsYXNzIHJlcHJlc2VudCBwb3NpdGlvbnMgaW4gYSBkb2N1bWVudC5cbi8vIEEgcG9zaXRpb24gYW4gYXJyYXkgb2YgaW50ZWdlcnMgdGhhdCBkZXNjcmliZSBhIHBhdGggdG8gdGhlIHRhcmdldFxuLy8gbm9kZSAoc2VlIGBOb2RlLnBhdGhgKSBhbmQgYW4gaW50ZWdlciBvZmZzZXQgaW50byB0aGF0IHRhcmdldCBub2RlLlxuXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgUG9zID0gKGZ1bmN0aW9uICgpIHtcbiAgLy8gOjogKHBhdGg6IFtudW1iZXJdLCBudW1iZXIpXG5cbiAgZnVuY3Rpb24gUG9zKHBhdGgsIG9mZnNldCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQb3MpO1xuXG4gICAgLy8gOjogW251bWJlcl0gVGhlIHBhdGggdG8gdGhlIHRhcmdldCBub2RlLlxuICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgLy8gOjogbnVtYmVyIFRoZSBvZmZzZXQgaW50byB0aGUgdGFyZ2V0IG5vZGUuXG4gICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7XG4gIH1cblxuICAvLyA7OyBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBhdGggb2YgdGhlIGZvcm1cbiAgLy8gYFwiMC8yOjEwXCJgLCB3aGVyZSB0aGUgbnVtYmVycyBiZWZvcmUgdGhlIGNvbG9uIGFyZSB0aGUgcGF0aCwgYW5kXG4gIC8vIHRoZSBudW1iZXIgYWZ0ZXIgaXQgaXMgdGhlIG9mZnNldC5cblxuICBfY3JlYXRlQ2xhc3MoUG9zLCBbe1xuICAgIGtleTogXCJ0b1N0cmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhdGguam9pbihcIi9cIikgKyBcIjpcIiArIHRoaXMub2Zmc2V0O1xuICAgIH1cblxuICAgIC8vIDo6IG51bWJlclxuICAgIC8vIFRoZSBsZW5ndGggb2YgdGhlIHBvc2l0aW9uJ3MgcGF0aC5cbiAgfSwge1xuICAgIGtleTogXCJtYXhcIixcblxuICAgIC8vIDo6IChQb3MpIOKGkiBQb3NcbiAgICAvLyBSZXR1cm4gdGhlIGdyZWF0ZXIgb2YgdHdvIHBvc2l0aW9ucy5cbiAgICB2YWx1ZTogZnVuY3Rpb24gbWF4KG90aGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5jbXAob3RoZXIpID4gMCA/IHRoaXMgOiBvdGhlcjtcbiAgICB9XG5cbiAgICAvLyA6OiAoUG9zKSDihpIgUG9zXG4gICAgLy8gUmV0dXJuIHRoZSBsZXNzZXIgb2YgdHdvIHBvc2l0aW9ucy5cbiAgfSwge1xuICAgIGtleTogXCJtbWluXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1taW4ob3RoZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmNtcChvdGhlcikgPCAwID8gdGhpcyA6IG90aGVyO1xuICAgIH1cblxuICAgIC8vIDo6IChbbnVtYmVyXSwgW251bWJlcl0pIOKGkiBib29sXG4gICAgLy8gQ29tcGFyZXMgdHdvIHBhdGhzIGFuZCByZXR1cm5zIHRydWUgd2hlbiB0aGV5IGFyZSB0aGUgc2FtZS5cbiAgfSwge1xuICAgIGtleTogXCJjbXBcIixcblxuICAgIC8vIDo6IChQb3MpIOKGkiBudW1iZXJcbiAgICAvLyBDb21wYXJlcyB0aGlzIHBvc2l0aW9uIHRvIGFub3RoZXIgcG9zaXRpb24sIGFuZCByZXR1cm5zIGEgbnVtYmVyLlxuICAgIC8vIE9mIHRoaXMgcmVzdWx0IG51bWJlciwgb25seSB0aGUgc2lnbiBpcyBzaWduaWZpY2FudC4gSXQgaXNcbiAgICAvLyBuZWdhdGl2ZSBpZiB0aGlzIHBvc2l0aW9uIGlzIGxlc3MgdGhhbiB0aGUgb3RoZXIgb25lLCB6ZXJvIGlmXG4gICAgLy8gdGhleSBhcmUgdGhlIHNhbWUsIGFuZCBwb3NpdGl2ZSBpZiB0aGlzIHBvc2l0aW9uIGlzIGdyZWF0ZXIuXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNtcChvdGhlcikge1xuICAgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybiAwO1xuICAgICAgcmV0dXJuIFBvcy5jbXAodGhpcy5wYXRoLCB0aGlzLm9mZnNldCwgb3RoZXIucGF0aCwgb3RoZXIub2Zmc2V0KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2hvcnRlblwiLFxuXG4gICAgLy8gOjogKD9udW1iZXIsID9udW1iZXIpIOKGkiBQb3NcbiAgICAvLyBDcmVhdGUgYSBwb3NpdGlvbiBwb2ludGluZyBpbnRvIGEgcGFyZW50IG9mIHRoaXMgcG9zaXRpb24nc1xuICAgIC8vIHRhcmdldC4gV2hlbiBgdG9gIGlzIGdpdmVuLCBpdCBkZXRlcm1pbmVzIHRoZSBuZXcgbGVuZ3RoIG9mIHRoZVxuICAgIC8vIHBhdGguIEJ5IGRlZmF1bHQsIHRoZSBwYXRoIGJlY29tZXMgb25lIHNob3J0ZXIuIFRoZSBgb2Zmc2V0YFxuICAgIC8vIHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hlcmUgaW4gdGhpcyBwYXJlbnQgdGhlXG4gICAgLy8gcG9zaXRpb24gcG9pbnRzLiBCeSBkZWZhdWx0LCBpdCBwb2ludHMgYmVmb3JlIHRoZSBvbGQgdGFyZ2V0LiBZb3VcbiAgICAvLyBjYW4gcGFzcyBhIG5lZ2F0aXZlIG9yIHBvc2l0aXZlIGludGVnZXIgdG8gbW92ZSBpdCBiYWNrd2FyZCBvclxuICAgIC8vIGZvcndhcmQgKCoqbm90ZSoqOiB0aGlzIG1ldGhvZCBwZXJmb3JtcyBubyBib3VuZHMgY2hlY2tpbmcpLlxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG9ydGVuKCkge1xuICAgICAgdmFyIHRvID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGFyZ3VtZW50c1swXTtcbiAgICAgIHZhciBvZmZzZXQgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyAwIDogYXJndW1lbnRzWzFdO1xuXG4gICAgICBpZiAodG8gPj0gdGhpcy5kZXB0aCkgcmV0dXJuIHRoaXM7XG4gICAgICByZXR1cm4gUG9zLnNob3J0ZW4odGhpcy5wYXRoLCB0bywgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICAvLyA6OiAobnVtYmVyKSDihpIgUG9zXG4gICAgLy8gQ3JlYXRlIGEgcG9zaXRpb24gd2l0aCBhbiBvZmZzZXQgbW92ZWQgcmVsYXRpdmUgdG8gdGhpc1xuICAgIC8vIHBvc2l0aW9uJ3Mgb2Zmc2V0LiBGb3IgZXhhbXBsZSBtb3ZpbmcgYDAvMToxMGAgYnkgYC0yYCB5aWVsZHNcbiAgICAvLyBgMC8xOjhgLlxuICB9LCB7XG4gICAga2V5OiBcIm1vdmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbW92ZShieSkge1xuICAgICAgcmV0dXJuIG5ldyBQb3ModGhpcy5wYXRoLCB0aGlzLm9mZnNldCArIGJ5KTtcbiAgICB9XG5cbiAgICAvLyA6OiAoP251bWJlcikg4oaSIFtudW1iZXJdXG4gICAgLy8gQ29udmVydCB0aGlzIHBvc2l0aW9uIHRvIGFuIGFycmF5IG9mIG51bWJlcnMgKGluY2x1ZGluZyBpdHNcbiAgICAvLyBvZmZzZXQpLiBPcHRpb25hbGx5IHBhc3MgYW4gYXJndW1lbnQgdG8gYWRqdXN0IHRoZSB2YWx1ZSBvZiB0aGVcbiAgICAvLyBvZmZzZXQuXG4gIH0sIHtcbiAgICBrZXk6IFwidG9QYXRoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvUGF0aCgpIHtcbiAgICAgIHZhciBtb3ZlID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gMCA6IGFyZ3VtZW50c1swXTtcblxuICAgICAgcmV0dXJuIHRoaXMucGF0aC5jb25jYXQodGhpcy5vZmZzZXQgKyBtb3ZlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZXh0ZW5kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGV4dGVuZChwb3MpIHtcbiAgICAgIHZhciBwYXRoID0gdGhpcy5wYXRoLnNsaWNlKCksXG4gICAgICAgICAgYWRkID0gdGhpcy5vZmZzZXQ7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvcy5wYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHBhdGgucHVzaChwb3MucGF0aFtpXSArIGFkZCk7XG4gICAgICAgIGFkZCA9IDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFBvcyhwYXRoLCBwb3Mub2Zmc2V0ICsgYWRkKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoKSDihpIgT2JqZWN0XG4gICAgLy8gQ29udmVydCB0aGUgcG9zaXRpb24gdG8gYSBKU09OLXNhZmUgcmVwcmVzZW50YXRpb24uXG4gIH0sIHtcbiAgICBrZXk6IFwidG9KU09OXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIDo6IChbbnVtYmVyXSwgP251bWJlcikg4oaSIFBvc1xuICAgIC8vIEJ1aWxkIGEgcG9zaXRpb24gZnJvbSBhbiBhcnJheSBvZiBudW1iZXJzIChhcyBpblxuICAgIC8vIFtgdG9QYXRoYF0oI1Bvcy50b1BhdGgpKSwgdGFraW5nIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIGFycmF5IGFzXG4gICAgLy8gb2Zmc2V0IGFuZCBvcHRpb25hbGx5IG1vdmluZyBpdCBieSBgbW92ZWAuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGVwdGhcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhdGgubGVuZ3RoO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImNtcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbXAocGF0aEEsIG9mZnNldEEsIHBhdGhCLCBvZmZzZXRCKSB7XG4gICAgICB2YXIgbGVuQSA9IHBhdGhBLmxlbmd0aCxcbiAgICAgICAgICBsZW5CID0gcGF0aEIubGVuZ3RoO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGVuZCA9IE1hdGgubWluKGxlbkEsIGxlbkIpOyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgdmFyIGRpZmYgPSBwYXRoQVtpXSAtIHBhdGhCW2ldO1xuICAgICAgICBpZiAoZGlmZiAhPSAwKSByZXR1cm4gZGlmZjtcbiAgICAgIH1cbiAgICAgIGlmIChsZW5BID4gbGVuQikgcmV0dXJuIG9mZnNldEIgPD0gcGF0aEFbaV0gPyAxIDogLTE7ZWxzZSBpZiAobGVuQiA+IGxlbkEpIHJldHVybiBvZmZzZXRBIDw9IHBhdGhCW2ldID8gLTEgOiAxO2Vsc2UgcmV0dXJuIG9mZnNldEEgLSBvZmZzZXRCO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzYW1lUGF0aFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzYW1lUGF0aChwYXRoQSwgcGF0aEIpIHtcbiAgICAgIGlmIChwYXRoQS5sZW5ndGggIT0gcGF0aEIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhBLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwYXRoQVtpXSAhPT0gcGF0aEJbaV0pIHJldHVybiBmYWxzZTtcbiAgICAgIH1yZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2hvcnRlblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG9ydGVuKHBhdGgpIHtcbiAgICAgIHZhciB0byA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IG51bGwgOiBhcmd1bWVudHNbMV07XG4gICAgICB2YXIgb2Zmc2V0ID0gYXJndW1lbnRzLmxlbmd0aCA8PSAyIHx8IGFyZ3VtZW50c1syXSA9PT0gdW5kZWZpbmVkID8gMCA6IGFyZ3VtZW50c1syXTtcblxuICAgICAgaWYgKHRvID09IG51bGwpIHRvID0gcGF0aC5sZW5ndGggLSAxO1xuICAgICAgcmV0dXJuIG5ldyBQb3MocGF0aC5zbGljZSgwLCB0byksIHBhdGhbdG9dICsgb2Zmc2V0KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZnJvbVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tKGFycmF5KSB7XG4gICAgICB2YXIgbW92ZSA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IDAgOiBhcmd1bWVudHNbMV07XG5cbiAgICAgIGlmICghYXJyYXkubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBjcmVhdGUgYSBwb3MgZnJvbSBhbiBlbXB0eSBhcnJheVwiKTtcbiAgICAgIHJldHVybiBuZXcgUG9zKGFycmF5LnNsaWNlKDAsIGFycmF5Lmxlbmd0aCAtIDEpLCBhcnJheVthcnJheS5sZW5ndGggLSAxXSArIG1vdmUpO1xuICAgIH1cblxuICAgIC8vIDo6IChPYmplY3QpIOKGkiBQb3NcbiAgICAvLyBDcmVhdGUgYSBwb3NpdGlvbiBmcm9tIGEgSlNPTiByZXByZXNlbnRhdGlvbi5cbiAgfSwge1xuICAgIGtleTogXCJmcm9tSlNPTlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tSlNPTihqc29uKSB7XG4gICAgICByZXR1cm4gbmV3IFBvcyhqc29uLnBhdGgsIGpzb24ub2Zmc2V0KTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUG9zO1xufSkoKTtcblxuZXhwb3J0cy5Qb3MgPSBQb3M7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheSA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIHNsaWNlSXRlcmF0b3IoYXJyLCBpKSB7IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2YXIgX2UgPSB1bmRlZmluZWQ7IHRyeSB7IGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fyci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0gY2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdKSBfaVtcInJldHVyblwiXSgpOyB9IGZpbmFsbHkgeyBpZiAoX2QpIHRocm93IF9lOyB9IH0gcmV0dXJuIF9hcnI7IH0gcmV0dXJuIGZ1bmN0aW9uIChhcnIsIGkpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyByZXR1cm4gYXJyOyB9IGVsc2UgaWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYXJyKSkgeyByZXR1cm4gc2xpY2VJdGVyYXRvcihhcnIsIGkpOyB9IGVsc2UgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTsgfSB9OyB9KSgpO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbnZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KF94MiwgX3gzLCBfeDQpIHsgdmFyIF9hZ2FpbiA9IHRydWU7IF9mdW5jdGlvbjogd2hpbGUgKF9hZ2FpbikgeyB2YXIgb2JqZWN0ID0gX3gyLCBwcm9wZXJ0eSA9IF94MywgcmVjZWl2ZXIgPSBfeDQ7IF9hZ2FpbiA9IGZhbHNlOyBpZiAob2JqZWN0ID09PSBudWxsKSBvYmplY3QgPSBGdW5jdGlvbi5wcm90b3R5cGU7IHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTsgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkgeyB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChwYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSBlbHNlIHsgX3gyID0gcGFyZW50OyBfeDMgPSBwcm9wZXJ0eTsgX3g0ID0gcmVjZWl2ZXI7IF9hZ2FpbiA9IHRydWU7IGRlc2MgPSBwYXJlbnQgPSB1bmRlZmluZWQ7IGNvbnRpbnVlIF9mdW5jdGlvbjsgfSB9IGVsc2UgaWYgKFwidmFsdWVcIiBpbiBkZXNjKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfSB9O1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIF9ub2RlID0gcmVxdWlyZShcIi4vbm9kZVwiKTtcblxudmFyIF9mcmFnbWVudCA9IHJlcXVpcmUoXCIuL2ZyYWdtZW50XCIpO1xuXG52YXIgX21hcmsgPSByZXF1aXJlKFwiLi9tYXJrXCIpO1xuXG52YXIgX3V0aWxFcnJvciA9IHJlcXVpcmUoXCIuLi91dGlsL2Vycm9yXCIpO1xuXG4vLyA7OyAjdG9jPWZhbHNlIFRoZSBleGNlcHRpb24gdHlwZSB1c2VkIHRvIHNpZ25hbCBzY2hlbWEtcmVsYXRlZFxuLy8gZXJyb3JzLlxuXG52YXIgU2NoZW1hRXJyb3IgPSAoZnVuY3Rpb24gKF9Qcm9zZU1pcnJvckVycm9yKSB7XG4gIF9pbmhlcml0cyhTY2hlbWFFcnJvciwgX1Byb3NlTWlycm9yRXJyb3IpO1xuXG4gIGZ1bmN0aW9uIFNjaGVtYUVycm9yKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTY2hlbWFFcnJvcik7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihTY2hlbWFFcnJvci5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gU2NoZW1hRXJyb3I7XG59KShfdXRpbEVycm9yLlByb3NlTWlycm9yRXJyb3IpO1xuXG5leHBvcnRzLlNjaGVtYUVycm9yID0gU2NoZW1hRXJyb3I7XG5cbmZ1bmN0aW9uIGZpbmRLaW5kcyh0eXBlLCBuYW1lLCBzY2hlbWEsIG92ZXJyaWRlKSB7XG4gIGZ1bmN0aW9uIHNldChzdWIsIHN1cCkge1xuICAgIGlmIChzdWIgaW4gc2NoZW1hLmtpbmRzKSB7XG4gICAgICBpZiAoc2NoZW1hLmtpbmRzW3N1Yl0gPT0gc3VwKSByZXR1cm47XG4gICAgICBTY2hlbWFFcnJvci5yYWlzZShcIkluY29uc2lzdGVudCBzdXBlcmtpbmRzIGZvciBraW5kIFwiICsgc3ViICsgXCI6IFwiICsgc3VwICsgXCIgYW5kIFwiICsgc2NoZW1hLmtpbmRzW3N1Yl0pO1xuICAgIH1cbiAgICBpZiAoc2NoZW1hLnN1YktpbmQoc3ViLCBzdXApKSBTY2hlbWFFcnJvci5yYWlzZShcIkNvbmZsaWN0aW5nIGtpbmQgaGllcmFyY2h5IHRocm91Z2ggXCIgKyBzdWIgKyBcIiBhbmQgXCIgKyBzdXApO1xuICAgIHNjaGVtYS5raW5kc1tzdWJdID0gc3VwO1xuICB9XG5cbiAgZm9yICh2YXIgY3VyID0gdHlwZTs7IGN1ciA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXIpKSB7XG4gICAgdmFyIGN1cktpbmQgPSBvdmVycmlkZSAhPSBudWxsICYmIGN1ciA9PSB0eXBlID8gb3ZlcnJpZGUgOiBjdXIua2luZDtcbiAgICBpZiAoY3VyS2luZCAhPSBudWxsKSB7XG4gICAgICB2YXIgXyQkZXhlYyA9IC9eKC4qPykoXFwuKT8kLy5leGVjKGN1cktpbmQpO1xuXG4gICAgICB2YXIgXyQkZXhlYzIgPSBfc2xpY2VkVG9BcnJheShfJCRleGVjLCAzKTtcblxuICAgICAgdmFyIF8gPSBfJCRleGVjMlswXTtcbiAgICAgIHZhciBraW5kID0gXyQkZXhlYzJbMV07XG4gICAgICB2YXIgZW5kID0gXyQkZXhlYzJbMl07XG5cbiAgICAgIGlmIChraW5kKSB7XG4gICAgICAgIHNldChuYW1lLCBraW5kKTtcbiAgICAgICAgbmFtZSA9IGtpbmQ7XG4gICAgICB9XG4gICAgICBpZiAoZW5kKSB7XG4gICAgICAgIHNldChuYW1lLCBudWxsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyA7OyBOb2RlIHR5cGVzIGFyZSBvYmplY3RzIGFsbG9jYXRlZCBvbmNlIHBlciBgU2NoZW1hYFxuLy8gYW5kIHVzZWQgdG8gdGFnIGBOb2RlYCBpbnN0YW5jZXMgd2l0aCBhIHR5cGUuIFRoZXkgYXJlXG4vLyBpbnN0YW5jZXMgb2Ygc3ViLXR5cGVzIG9mIHRoaXMgY2xhc3MsIGFuZCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0XG4vLyB0aGUgbm9kZSB0eXBlIChpdHMgbmFtZSwgaXRzIGFsbG93ZWQgYXR0cmlidXRlcywgbWV0aG9kcyBmb3Jcbi8vIHNlcmlhbGl6aW5nIGl0IHRvIHZhcmlvdXMgZm9ybWF0cywgaW5mb3JtYXRpb24gdG8gZ3VpZGVcbi8vIGRlc2VyaWFsaXphdGlvbiwgYW5kIHNvIG9uKS5cblxudmFyIE5vZGVUeXBlID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTm9kZVR5cGUobmFtZSwgY29udGFpbnMsIGF0dHJzLCBzY2hlbWEpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTm9kZVR5cGUpO1xuXG4gICAgLy8gOjogc3RyaW5nXG4gICAgLy8gVGhlIG5hbWUgdGhlIG5vZGUgdHlwZSBoYXMgaW4gdGhpcyBzY2hlbWEuXG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAvLyA6OiA/c3RyaW5nXG4gICAgLy8gVGhlIGtpbmQgb2Ygbm9kZXMgdGhpcyBub2RlIG1heSBjb250YWluLiBgbnVsbGAgbWVhbnMgaXQncyBhXG4gICAgLy8gbGVhZiBub2RlLlxuICAgIHRoaXMuY29udGFpbnMgPSBjb250YWlucztcbiAgICAvLyA6OiBPYmplY3Q8QXR0cmlidXRlPlxuICAgIC8vIFRoZSBhdHRyaWJ1dGVzIGFsbG93ZWQgb24gdGhpcyBub2RlIHR5cGUuXG4gICAgdGhpcy5hdHRycyA9IGF0dHJzO1xuICAgIC8vIDo6IFNjaGVtYVxuICAgIC8vIEEgbGluayBiYWNrIHRvIHRoZSBgU2NoZW1hYCB0aGUgbm9kZSB0eXBlIGJlbG9uZ3MgdG8uXG4gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgdGhpcy5kZWZhdWx0QXR0cnMgPSBnZXREZWZhdWx0QXR0cnMoYXR0cnMpO1xuICB9XG5cbiAgLy8gOjogT2JqZWN0PEF0dHJpYnV0ZT5cbiAgLy8gVGhlIGRlZmF1bHQgc2V0IG9mIGF0dHJpYnV0ZXMgdG8gYXNzb2NpYXRlIHdpdGggYSBnaXZlbiB0eXBlLiBOb3RlXG4gIC8vIHRoYXQgc2NoZW1hcyBtYXkgYWRkIGFkZGl0aW9uYWwgYXR0cmlidXRlcyB0byBpbnN0YW5jZXMgb2YgdGhlXG4gIC8vIHR5cGUuXG5cbiAgLy8gOjogYm9vbFxuICAvLyBUcnVlIGlmIHRoaXMgaXMgYSBibG9jayB0eXBlLlxuXG4gIF9jcmVhdGVDbGFzcyhOb2RlVHlwZSwgW3tcbiAgICBrZXk6IFwiY2FuQ29udGFpbkZyYWdtZW50XCIsXG5cbiAgICAvLyA6OiAoRnJhZ21lbnQpIOKGkiBib29sXG4gICAgLy8gVGVzdCB3aGV0aGVyIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBmcmFnbWVudCBjb3VsZCBiZSBjb250YWluZWRcbiAgICAvLyBpbiB0aGlzIG5vZGUgdHlwZS5cbiAgICB2YWx1ZTogZnVuY3Rpb24gY2FuQ29udGFpbkZyYWdtZW50KGZyYWdtZW50KSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB2YXIgb2sgPSB0cnVlO1xuICAgICAgZnJhZ21lbnQuZm9yRWFjaChmdW5jdGlvbiAobikge1xuICAgICAgICBpZiAoIV90aGlzLmNhbkNvbnRhaW4obikpIG9rID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBvaztcbiAgICB9XG5cbiAgICAvLyA6OiAoTm9kZSkg4oaSIGJvb2xcbiAgICAvLyBUZXN0IHdoZXRoZXIgdGhlIGdpdmVuIG5vZGUgY291bGQgYmUgY29udGFpbmVkIGluIHRoaXMgbm9kZSB0eXBlLlxuICB9LCB7XG4gICAga2V5OiBcImNhbkNvbnRhaW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2FuQ29udGFpbihub2RlKSB7XG4gICAgICBpZiAoIXRoaXMuY2FuQ29udGFpblR5cGUobm9kZS50eXBlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLm1hcmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghdGhpcy5jYW5Db250YWluTWFyayhub2RlLm1hcmtzW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfXJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIDo6IChNYXJrKSDihpIgYm9vbFxuICAgIC8vIFRlc3Qgd2hldGhlciB0aGlzIG5vZGUgdHlwZSBjYW4gY29udGFpbiBjaGlsZHJlbiB3aXRoIHRoZSBnaXZlblxuICAgIC8vIG1hcmsuXG4gIH0sIHtcbiAgICBrZXk6IFwiY2FuQ29udGFpbk1hcmtcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2FuQ29udGFpbk1hcmsobWFyaykge1xuICAgICAgdmFyIGNvbnRhaW5zID0gdGhpcy5jb250YWluc01hcmtzO1xuICAgICAgaWYgKGNvbnRhaW5zID09PSB0cnVlKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChjb250YWlucykgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250YWlucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoY29udGFpbnNbaV0gPT0gbWFyay5uYW1lKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1yZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gOjogKE5vZGVUeXBlKSDihpIgYm9vbFxuICAgIC8vIFRlc3Qgd2hldGhlciB0aGlzIG5vZGUgdHlwZSBjYW4gY29udGFpbiBub2RlcyBvZiB0aGUgZ2l2ZW4gbm9kZVxuICAgIC8vIHR5cGUuXG4gIH0sIHtcbiAgICBrZXk6IFwiY2FuQ29udGFpblR5cGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2FuQ29udGFpblR5cGUodHlwZSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLnN1YktpbmQodHlwZS5uYW1lLCB0aGlzLmNvbnRhaW5zKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoTm9kZVR5cGUpIOKGkiBib29sXG4gICAgLy8gVGVzdCB3aGV0aGVyIHRoZSBub2RlcyB0aGF0IGNhbiBiZSBjb250YWluZWQgaW4gdGhlIGdpdmVuIG5vZGVcbiAgICAvLyB0eXBlIGFyZSBhIHN1Yi10eXBlIG9mIHRoZSBub2RlcyB0aGF0IGNhbiBiZSBjb250YWluZWQgaW4gdGhpc1xuICAgIC8vIHR5cGUuXG4gIH0sIHtcbiAgICBrZXk6IFwiY2FuQ29udGFpbkNvbnRlbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2FuQ29udGFpbkNvbnRlbnQodHlwZSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLnN1YktpbmQodHlwZS5jb250YWlucywgdGhpcy5jb250YWlucyk7XG4gICAgfVxuXG4gICAgLy8gOjogKE5vZGVUeXBlKSDihpIgW05vZGVUeXBlXVxuICAgIC8vIEZpbmQgYSBzZXQgb2YgaW50ZXJtZWRpYXRlIG5vZGUgdHlwZXMsIHBvc3NpYmx5IGVtcHR5LCB0aGF0IGhhdmVcbiAgICAvLyB0byBiZSBpbnNlcnRlZCBiZXR3ZWVuIHRoaXMgdHlwZSBhbmQgYG90aGVyYCB0byBwdXQgYSBub2RlIG9mXG4gICAgLy8gdHlwZSBgb3RoZXJgIGludG8gdGhpcyB0eXBlLlxuICB9LCB7XG4gICAga2V5OiBcImZpbmRDb25uZWN0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZpbmRDb25uZWN0aW9uKG90aGVyKSB7XG4gICAgICAvLyBGSVhNRSBzb21laG93IGRlZmluZSBhbiBvcmRlciBpbiB3aGljaCB0aGVzZSBhcmUgdHJpZWRcbiAgICAgIGlmICh0aGlzLmNhbkNvbnRhaW5UeXBlKG90aGVyKSkgcmV0dXJuIFtdO1xuXG4gICAgICB2YXIgc2VlbiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICB2YXIgYWN0aXZlID0gW3sgZnJvbTogdGhpcywgdmlhOiBbXSB9XTtcbiAgICAgIHdoaWxlIChhY3RpdmUubGVuZ3RoKSB7XG4gICAgICAgIHZhciBjdXJyZW50ID0gYWN0aXZlLnNoaWZ0KCk7XG4gICAgICAgIGZvciAodmFyIF9uYW1lIGluIHRoaXMuc2NoZW1hLm5vZGVzKSB7XG4gICAgICAgICAgdmFyIHR5cGUgPSB0aGlzLnNjaGVtYS5ub2Rlc1tfbmFtZV07XG4gICAgICAgICAgaWYgKHR5cGUuZGVmYXVsdEF0dHJzICYmICEodHlwZS5jb250YWlucyBpbiBzZWVuKSAmJiBjdXJyZW50LmZyb20uY2FuQ29udGFpblR5cGUodHlwZSkpIHtcbiAgICAgICAgICAgIHZhciB2aWEgPSBjdXJyZW50LnZpYS5jb25jYXQodHlwZSk7XG4gICAgICAgICAgICBpZiAodHlwZS5jYW5Db250YWluVHlwZShvdGhlcikpIHJldHVybiB2aWE7XG4gICAgICAgICAgICBhY3RpdmUucHVzaCh7IGZyb206IHR5cGUsIHZpYTogdmlhIH0pO1xuICAgICAgICAgICAgc2Vlblt0eXBlLmNvbnRhaW5zXSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJ1aWxkQXR0cnNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRBdHRycyhhdHRycywgY29udGVudCkge1xuICAgICAgaWYgKCFhdHRycyAmJiB0aGlzLmRlZmF1bHRBdHRycykgcmV0dXJuIHRoaXMuZGVmYXVsdEF0dHJzO2Vsc2UgcmV0dXJuIF9idWlsZEF0dHJzKHRoaXMuYXR0cnMsIGF0dHJzLCB0aGlzLCBjb250ZW50KTtcbiAgICB9XG5cbiAgICAvLyA6OiAoP09iamVjdCwgP0ZyYWdtZW50LCA/W01hcmtdKSDihpIgTm9kZVxuICAgIC8vIENyZWF0ZSBhIGBOb2RlYCBvZiB0aGlzIHR5cGUuIFRoZSBnaXZlbiBhdHRyaWJ1dGVzIGFyZVxuICAgIC8vIGNoZWNrZWQgYW5kIGRlZmF1bHRlZCAoeW91IGNhbiBwYXNzIGBudWxsYCB0byB1c2UgdGhlIHR5cGUnc1xuICAgIC8vIGRlZmF1bHRzIGVudGlyZWx5LCBpZiBubyByZXF1aXJlZCBhdHRyaWJ1dGVzIGV4aXN0KS4gYGNvbnRlbnRgXG4gICAgLy8gbWF5IGJlIGEgYEZyYWdtZW50YCwgYSBub2RlLCBhbiBhcnJheSBvZiBub2Rlcywgb3JcbiAgICAvLyBgbnVsbGAuIFNpbWlsYXJseSBgbWFya3NgIG1heSBiZSBgbnVsbGAgdG8gZGVmYXVsdCB0byB0aGUgZW1wdHlcbiAgICAvLyBzZXQgb2YgbWFya3MuXG4gIH0sIHtcbiAgICBrZXk6IFwiY3JlYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZShhdHRycywgY29udGVudCwgbWFya3MpIHtcbiAgICAgIHJldHVybiBuZXcgX25vZGUuTm9kZSh0aGlzLCB0aGlzLmJ1aWxkQXR0cnMoYXR0cnMsIGNvbnRlbnQpLCBfZnJhZ21lbnQuRnJhZ21lbnQuZnJvbShjb250ZW50KSwgX21hcmsuTWFyay5zZXRGcm9tKG1hcmtzKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNyZWF0ZUF1dG9GaWxsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZUF1dG9GaWxsKGF0dHJzLCBjb250ZW50LCBtYXJrcykge1xuICAgICAgaWYgKCghY29udGVudCB8fCBjb250ZW50Lmxlbmd0aCA9PSAwKSAmJiAhdGhpcy5jYW5CZUVtcHR5KSBjb250ZW50ID0gdGhpcy5kZWZhdWx0Q29udGVudCgpO1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlKGF0dHJzLCBjb250ZW50LCBtYXJrcyk7XG4gICAgfVxuXG4gICAgLy8gOjogYm9vbFxuICAgIC8vIENvbnRyb2xzIHdoZXRoZXIgdGhpcyBub2RlIGlzIGFsbG93ZWQgdG8gYmUgZW1wdHkuXG4gIH0sIHtcbiAgICBrZXk6IFwiaXNCbG9ja1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIDo6IGJvb2xcbiAgICAvLyBUcnVlIGlmIHRoaXMgaXMgYSB0ZXh0YmxvY2sgdHlwZSwgYSBibG9jayB0aGF0IGNvbnRhaW5zIGlubGluZVxuICAgIC8vIGNvbnRlbnQuXG4gIH0sIHtcbiAgICBrZXk6IFwiaXNUZXh0YmxvY2tcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyA6OiBib29sXG4gICAgLy8gVHJ1ZSBpZiB0aGlzIGlzIGFuIGlubGluZSB0eXBlLlxuICB9LCB7XG4gICAga2V5OiBcImlzSW5saW5lXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gOjogYm9vbFxuICAgIC8vIFRydWUgaWYgdGhpcyBpcyB0aGUgdGV4dCBub2RlIHR5cGUuXG4gIH0sIHtcbiAgICBrZXk6IFwiaXNUZXh0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gOjogYm9vbFxuICAgIC8vIENvbnRyb2xzIHdoZXRoZXIgbm9kZXMgb2YgdGhpcyB0eXBlIGNhbiBiZSBzZWxlY3RlZCAoYXMgYSB1c2VyXG4gICAgLy8gbm9kZSBzZWxlY3Rpb24pLlxuICB9LCB7XG4gICAga2V5OiBcInNlbGVjdGFibGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIDo6IGJvb2xcbiAgICAvLyBDb250cm9scyB3aGV0aGVyIHRoaXMgbm9kZSB0eXBlIGlzIGxvY2tlZC5cbiAgfSwge1xuICAgIGtleTogXCJsb2NrZWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyA6OiBzdHJpbmdcbiAgICAvLyBDb250cm9scyB0aGUgX2tpbmRfIG9mIHRoZSBub2RlLCB3aGljaCBpcyB1c2VkIHRvIGRldGVybWluZSB2YWxpZFxuICAgIC8vIHBhcmVudC9jaGlsZCByZWxhdGlvbnMuIENhbiBiZSBhIHdvcmQsIHdoaWNoIGFkZHMgdGhhdCBraW5kIHRvXG4gICAgLy8gdGhlIHNldCBvZiBraW5kcyBvZiB0aGUgc3VwZXJjbGFzcywgYSB3b3JkIGZvbGxvd2VkIGJ5IGEgZG90LCB0b1xuICAgIC8vIGlnbm9yZSB0aGUga2luZHMgb2YgdGhlIHN1cGVyY2xhc3MgYW5kIHVzZSBvbmx5IHRoYXQgd29yZCAoYWxvbmdcbiAgICAvLyB3aXRoIHRoZSBub2RlJ3MgbmFtZSkgYXMga2luZCwgb3Igb25seSBhIGRvdCwgaW4gd2hpY2ggY2FzZSB0aGVcbiAgICAvLyBvbmx5IGtpbmQgdGhlIG5vZGUgaGFzIGlzIGl0cyBvd24gbmFtZS5cbiAgfSwge1xuICAgIGtleTogXCJjYW5CZUVtcHR5XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29udGFpbnNNYXJrc1wiLFxuXG4gICAgLy8gOjogdW5pb248Ym9vbCwgW3N0cmluZ10+XG4gICAgLy8gVGhlIG1hcmsgdHlwZXMgdGhhdCBjaGlsZCBub2RlcyBvZiB0aGlzIG5vZGUgbWF5IGhhdmUuIGBmYWxzZWBcbiAgICAvLyBtZWFucyBubyBtYXJrcywgYHRydWVgIG1lYW5zIGFueSBtYXJrLCBhbmQgYW4gYXJyYXkgb2Ygc3RyaW5nc1xuICAgIC8vIGNhbiBiZSB1c2VkIHRvIGV4cGxpY2l0bHkgbGlzdCB0aGUgYWxsb3dlZCBtYXJrIHR5cGVzLlxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImNvbXBpbGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcGlsZSh0eXBlcywgc2NoZW1hKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIGZvciAodmFyIF9uYW1lMiBpbiB0eXBlcykge1xuICAgICAgICB2YXIgaW5mbyA9IHR5cGVzW19uYW1lMl07XG4gICAgICAgIHZhciB0eXBlID0gaW5mby50eXBlIHx8IFNjaGVtYUVycm9yLnJhaXNlKFwiTWlzc2luZyBub2RlIHR5cGUgZm9yIFwiICsgX25hbWUyKTtcbiAgICAgICAgZmluZEtpbmRzKHR5cGUsIF9uYW1lMiwgc2NoZW1hLCBpbmZvLmtpbmQpO1xuICAgICAgICB2YXIgY29udGFpbnMgPSBcImNvbnRhaW5zXCIgaW4gaW5mbyA/IGluZm8uY29udGFpbnMgOiB0eXBlLmNvbnRhaW5zO1xuICAgICAgICB2YXIgYXR0cnMgPSB0eXBlLmF0dHJpYnV0ZXM7XG4gICAgICAgIGlmIChpbmZvLmF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICBhdHRycyA9IGNvcHlPYmooYXR0cnMpO1xuICAgICAgICAgIGZvciAodmFyIGFOYW1lIGluIGluZm8uYXR0cmlidXRlcykgYXR0cnNbYU5hbWVdID0gaW5mby5hdHRyaWJ1dGVzW2FOYW1lXTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRbX25hbWUyXSA9IG5ldyB0eXBlKF9uYW1lMiwgY29udGFpbnMsIGF0dHJzLCBzY2hlbWEpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgX25hbWUzIGluIHJlc3VsdCkge1xuICAgICAgICB2YXIgY29udGFpbnMgPSByZXN1bHRbX25hbWUzXS5jb250YWlucztcbiAgICAgICAgaWYgKGNvbnRhaW5zICYmICEoY29udGFpbnMgaW4gc2NoZW1hLmtpbmRzKSkgU2NoZW1hRXJyb3IucmFpc2UoXCJOb2RlIHR5cGUgXCIgKyBfbmFtZTMgKyBcIiBpcyBzcGVjaWZpZWQgdG8gY29udGFpbiBub24tZXhpc3Rpbmcga2luZCBcIiArIGNvbnRhaW5zKTtcbiAgICAgIH1cbiAgICAgIGlmICghcmVzdWx0LmRvYykgU2NoZW1hRXJyb3IucmFpc2UoXCJFdmVyeSBzY2hlbWEgbmVlZHMgYSAnZG9jJyB0eXBlXCIpO1xuICAgICAgaWYgKCFyZXN1bHQudGV4dCkgU2NoZW1hRXJyb3IucmFpc2UoXCJFdmVyeSBzY2hlbWEgbmVlZHMgYSAndGV4dCcgdHlwZVwiKTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyA6OiAoc3RyaW5nLCAqKVxuICAgIC8vIFJlZ2lzdGVyIGFuIGVsZW1lbnQgaW4gdGhpcyB0eXBlJ3MgcmVnaXN0cnkuIFRoYXQgaXMsIGFkZCBgdmFsdWVgXG4gICAgLy8gdG8gdGhlIGFycmF5IGFzc29jaWF0ZWQgd2l0aCBgbmFtZWAgaW4gdGhlIHJlZ2lzdHJ5IHN0b3JlZCBpblxuICAgIC8vIHR5cGUncyBgcHJvdG90eXBlYC4gVGhpcyBpcyBtb3N0bHkgdXNlZCB0byBhdHRhY2ggdGhpbmdzIGxpa2VcbiAgICAvLyBjb21tYW5kcyBhbmQgcGFyc2luZyBzdHJhdGVnaWVzIHRvIG5vZGUgdHlwZXMuIFNlZSBgU2NoZW1hLnJlZ2lzdHJ5YC5cbiAgfSwge1xuICAgIGtleTogXCJyZWdpc3RlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZWdpc3RlcihuYW1lLCB2YWx1ZSkge1xuICAgICAgdmFyIHJlZ2lzdHJ5ID0gdGhpcy5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkoXCJyZWdpc3RyeVwiKSA/IHRoaXMucHJvdG90eXBlLnJlZ2lzdHJ5IDogdGhpcy5wcm90b3R5cGUucmVnaXN0cnkgPSBPYmplY3QuY3JlYXRlKG51bGwpOyhyZWdpc3RyeVtuYW1lXSB8fCAocmVnaXN0cnlbbmFtZV0gPSBbXSkpLnB1c2godmFsdWUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJraW5kXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gXCIuXCI7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE5vZGVUeXBlO1xufSkoKTtcblxuZXhwb3J0cy5Ob2RlVHlwZSA9IE5vZGVUeXBlO1xuTm9kZVR5cGUuYXR0cmlidXRlcyA9IHt9O1xuXG4vLyA7OyAjdG9jPWZhbHNlIEJhc2UgdHlwZSBmb3IgYmxvY2sgbm9kZXR5cGVzLlxuXG52YXIgQmxvY2sgPSAoZnVuY3Rpb24gKF9Ob2RlVHlwZSkge1xuICBfaW5oZXJpdHMoQmxvY2ssIF9Ob2RlVHlwZSk7XG5cbiAgZnVuY3Rpb24gQmxvY2soKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJsb2NrKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKEJsb2NrLnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIC8vIDs7ICN0b2M9ZmFsc2UgQmFzZSB0eXBlIGZvciB0ZXh0YmxvY2sgbm9kZSB0eXBlcy5cblxuICBfY3JlYXRlQ2xhc3MoQmxvY2ssIFt7XG4gICAga2V5OiBcImRlZmF1bHRDb250ZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlZmF1bHRDb250ZW50KCkge1xuICAgICAgdmFyIGlubmVyID0gdGhpcy5zY2hlbWEuZGVmYXVsdFRleHRibG9ja1R5cGUoKS5jcmVhdGUoKTtcbiAgICAgIHZhciBjb25uID0gdGhpcy5maW5kQ29ubmVjdGlvbihpbm5lci50eXBlKTtcbiAgICAgIGlmICghY29ubikgU2NoZW1hRXJyb3IucmFpc2UoXCJDYW4ndCBjcmVhdGUgZGVmYXVsdCBjb250ZW50IGZvciBcIiArIHRoaXMubmFtZSk7XG4gICAgICBmb3IgKHZhciBpID0gY29ubi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBpbm5lciA9IGNvbm5baV0uY3JlYXRlKG51bGwsIGlubmVyKTtcbiAgICAgIH1yZXR1cm4gX2ZyYWdtZW50LkZyYWdtZW50LmZyb20oaW5uZXIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc0Jsb2NrXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2FuQmVFbXB0eVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGFpbnMgPT0gbnVsbDtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJjb250YWluc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFwiYmxvY2tcIjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwia2luZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFwiYmxvY2suXCI7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEJsb2NrO1xufSkoTm9kZVR5cGUpO1xuXG5leHBvcnRzLkJsb2NrID0gQmxvY2s7XG5cbnZhciBUZXh0YmxvY2sgPSAoZnVuY3Rpb24gKF9CbG9jaykge1xuICBfaW5oZXJpdHMoVGV4dGJsb2NrLCBfQmxvY2spO1xuXG4gIGZ1bmN0aW9uIFRleHRibG9jaygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVGV4dGJsb2NrKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKFRleHRibG9jay5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICAvLyA7OyAjdG9jPWZhbHNlIEJhc2UgdHlwZSBmb3IgaW5saW5lIG5vZGUgdHlwZXMuXG5cbiAgX2NyZWF0ZUNsYXNzKFRleHRibG9jaywgW3tcbiAgICBrZXk6IFwiY29udGFpbnNNYXJrc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzVGV4dGJsb2NrXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2FuQmVFbXB0eVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiY29udGFpbnNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBcImlubGluZVwiO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBUZXh0YmxvY2s7XG59KShCbG9jayk7XG5cbmV4cG9ydHMuVGV4dGJsb2NrID0gVGV4dGJsb2NrO1xuXG52YXIgSW5saW5lID0gKGZ1bmN0aW9uIChfTm9kZVR5cGUyKSB7XG4gIF9pbmhlcml0cyhJbmxpbmUsIF9Ob2RlVHlwZTIpO1xuXG4gIGZ1bmN0aW9uIElubGluZSgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSW5saW5lKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKElubGluZS5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICAvLyA7OyAjdG9jPWZhbHNlIFRoZSB0ZXh0IG5vZGUgdHlwZS5cblxuICBfY3JlYXRlQ2xhc3MoSW5saW5lLCBbe1xuICAgIGtleTogXCJpc0lubGluZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiY29udGFpbnNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJraW5kXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gXCJpbmxpbmUuXCI7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIElubGluZTtcbn0pKE5vZGVUeXBlKTtcblxuZXhwb3J0cy5JbmxpbmUgPSBJbmxpbmU7XG5cbnZhciBUZXh0ID0gKGZ1bmN0aW9uIChfSW5saW5lKSB7XG4gIF9pbmhlcml0cyhUZXh0LCBfSW5saW5lKTtcblxuICBmdW5jdGlvbiBUZXh0KCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUZXh0KTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKFRleHQucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgLy8gQXR0cmlidXRlIGRlc2NyaXB0b3JzXG5cbiAgLy8gOzsgQXR0cmlidXRlcyBhcmUgbmFtZWQgc3RyaW5ncyBhc3NvY2lhdGVkIHdpdGggbm9kZXMgYW5kIG1hcmtzLlxuICAvLyBFYWNoIG5vZGUgdHlwZSBvciBtYXJrIHR5cGUgaGFzIGEgZml4ZWQgc2V0IG9mIGF0dHJpYnV0ZXMsIHdoaWNoXG4gIC8vIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFyZSB1c2VkIHRvIGNvbnRyb2wuXG5cbiAgX2NyZWF0ZUNsYXNzKFRleHQsIFt7XG4gICAga2V5OiBcImNyZWF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGUoYXR0cnMsIGNvbnRlbnQsIG1hcmtzKSB7XG4gICAgICByZXR1cm4gbmV3IF9ub2RlLlRleHROb2RlKHRoaXMsIHRoaXMuYnVpbGRBdHRycyhhdHRycywgY29udGVudCksIGNvbnRlbnQsIG1hcmtzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2VsZWN0YWJsZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc1RleHRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBUZXh0O1xufSkoSW5saW5lKTtcblxuZXhwb3J0cy5UZXh0ID0gVGV4dDtcblxudmFyIEF0dHJpYnV0ZSA9IChmdW5jdGlvbiAoKSB7XG4gIC8vIDo6IChPYmplY3QpXG4gIC8vIENyZWF0ZSBhbiBhdHRyaWJ1dGUuIGBvcHRpb25zYCBpcyBhbiBvYmplY3QgY29udGFpbmluZyB0aGVcbiAgLy8gc2V0dGluZ3MgZm9yIHRoZSBhdHRyaWJ1dGVzLiBUaGUgZm9sbG93aW5nIHNldHRpbmdzIGFyZVxuICAvLyBzdXBwb3J0ZWQ6XG4gIC8vXG4gIC8vICoqYGRlZmF1bHRgKio6IGA/c3RyaW5nYFxuICAvLyA6IFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGF0dHJpYnV0ZSwgdG8gY2hvb3NlIHdoZW4gbm9cbiAgLy8gICBleHBsaWNpdCB2YWx1ZSBpcyBwcm92aWRlZC5cbiAgLy9cbiAgLy8gKipgY29tcHV0ZWAqKjogYD8oRnJhZ21lbnQpIOKGkiBzdHJpbmdgXG4gIC8vIDogQSBmdW5jdGlvbiB0aGF0IGNvbXB1dGVzIGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSBmcm9tXG4gIC8vICAgdGhlIG5vZGUncyBjb250ZW50LlxuICAvL1xuICAvLyBBdHRyaWJ1dGVzIHRoYXQgaGF2ZSBubyBkZWZhdWx0IG9yIGNvbXB1dGUgcHJvcGVydHkgbXVzdCBiZVxuICAvLyBwcm92aWRlZCB3aGVuZXZlciBhIG5vZGUgb3IgbWFyayBvZiBhIHR5cGUgdGhhdCBoYXMgdGhlbSBpc1xuICAvLyBjcmVhdGVkLlxuXG4gIGZ1bmN0aW9uIEF0dHJpYnV0ZSgpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IHt9IDogYXJndW1lbnRzWzBdO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEF0dHJpYnV0ZSk7XG5cbiAgICB0aGlzW1wiZGVmYXVsdFwiXSA9IG9wdGlvbnNbXCJkZWZhdWx0XCJdO1xuICAgIHRoaXMuY29tcHV0ZSA9IG9wdGlvbnMuY29tcHV0ZTtcbiAgICB0aGlzLnJlZ2lzdHJ5ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuXG4gIC8vIE1hcmtzXG5cbiAgLy8gOzsgTGlrZSBub2RlcywgbWFya3MgKHdoaWNoIGFyZSBhc3NvY2lhdGVkIHdpdGggbm9kZXMgdG8gc2lnbmlmeVxuICAvLyB0aGluZ3MgbGlrZSBlbXBoYXNpcyBvciBiZWluZyBwYXJ0IG9mIGEgbGluaykgYXJlIHRhZ2dlZCB3aXRoIHR5cGVcbiAgLy8gb2JqZWN0cywgd2hpY2ggYXJlIGluc3RhbnRpYXRlZCBvbmNlIHBlciBgU2NoZW1hYC5cblxuICAvLyA6OiAoc3RyaW5nLCAqKVxuICAvLyBSZWdpc3RlciBhIHZhbHVlIGluIHRoaXMgYXR0cmlidXRlJ3MgcmVnaXN0cnkuIFNlZVxuICAvLyBgTm9kZVR5cGUucmVnaXN0ZXJgIGFuZCBgU2NoZW1hLnJlZ2lzdHJ5YC5cblxuICBfY3JlYXRlQ2xhc3MoQXR0cmlidXRlLCBbe1xuICAgIGtleTogXCJyZWdpc3RlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZWdpc3RlcihuYW1lLCB2YWx1ZSkge1xuICAgICAgOyh0aGlzLnJlZ2lzdHJ5W25hbWVdIHx8ICh0aGlzLnJlZ2lzdHJ5W25hbWVdID0gW10pKS5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQXR0cmlidXRlO1xufSkoKTtcblxuZXhwb3J0cy5BdHRyaWJ1dGUgPSBBdHRyaWJ1dGU7XG5cbnZhciBNYXJrVHlwZSA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE1hcmtUeXBlKG5hbWUsIGF0dHJzLCByYW5rLCBzY2hlbWEpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTWFya1R5cGUpO1xuXG4gICAgLy8gOjogc3RyaW5nXG4gICAgLy8gVGhlIG5hbWUgb2YgdGhlIG1hcmsgdHlwZS5cbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIC8vIDo6IE9iamVjdDxBdHRyaWJ1dGU+XG4gICAgLy8gVGhlIGF0dHJpYnV0ZXMgc3VwcG9ydGVkIGJ5IHRoaXMgdHlwZSBvZiBtYXJrLlxuICAgIHRoaXMuYXR0cnMgPSBhdHRycztcbiAgICB0aGlzLnJhbmsgPSByYW5rO1xuICAgIC8vIDo6IFNjaGVtYVxuICAgIC8vIFRoZSBzY2hlbWEgdGhhdCB0aGlzIG1hcmsgdHlwZSBpbnN0YW5jZSBpcyBwYXJ0IG9mLlxuICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgIHZhciBkZWZhdWx0cyA9IGdldERlZmF1bHRBdHRycyh0aGlzLmF0dHJzKTtcbiAgICB0aGlzLmluc3RhbmNlID0gZGVmYXVsdHMgJiYgbmV3IF9tYXJrLk1hcmsodGhpcywgZGVmYXVsdHMpO1xuICB9XG5cbiAgLy8gOjogT2JqZWN0PEF0dHJpYnV0ZT5cbiAgLy8gVGhlIGRlZmF1bHQgc2V0IG9mIGF0dHJpYnV0ZXMgdG8gYXNzb2NpYXRlIHdpdGggYSBtYXJrIHR5cGUuIEJ5XG4gIC8vIGRlZmF1bHQsIHRoaXMgcmV0dXJucyBhbiBlbXB0eSBvYmplY3QuXG5cbiAgLy8gOjogbnVtYmVyXG4gIC8vIE1hcmsgdHlwZSByYW5rcyBhcmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIG9yZGVyIGluIHdoaWNoIG1hcmtcbiAgLy8gYXJyYXlzIGFyZSBzb3J0ZWQuIChJZiBtdWx0aXBsZSBtYXJrIHR5cGVzIGVuZCB1cCB3aXRoIHRoZSBzYW1lXG4gIC8vIHJhbmssIHRoZXkgc3RpbGwgZ2V0IGEgZml4ZWQgb3JkZXIgaW4gdGhlIHNjaGVtYSwgYnV0IHRoZXJlJ3Mgbm9cbiAgLy8gZ3VhcmFudGVlIHdoYXQgaXQgd2lsbCBiZS4pXG5cbiAgX2NyZWF0ZUNsYXNzKE1hcmtUeXBlLCBbe1xuICAgIGtleTogXCJjcmVhdGVcIixcblxuICAgIC8vIDo6IChPYmplY3QpIOKGkiBNYXJrXG4gICAgLy8gQ3JlYXRlIGEgbWFyayBvZiB0aGlzIHR5cGUuIGBhdHRyc2AgbWF5IGJlIGBudWxsYCBvciBhbiBvYmplY3RcbiAgICAvLyBjb250YWluaW5nIG9ubHkgc29tZSBvZiB0aGUgbWFyaydzIGF0dHJpYnV0ZXMuIFRoZSBvdGhlcnMsIGlmXG4gICAgLy8gdGhleSBoYXZlIGRlZmF1bHRzLCB3aWxsIGJlIGFkZGVkLlxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGUoYXR0cnMpIHtcbiAgICAgIGlmICghYXR0cnMgJiYgdGhpcy5pbnN0YW5jZSkgcmV0dXJuIHRoaXMuaW5zdGFuY2U7XG4gICAgICByZXR1cm4gbmV3IF9tYXJrLk1hcmsodGhpcywgX2J1aWxkQXR0cnModGhpcy5hdHRycywgYXR0cnMsIHRoaXMpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlRnJvbVNldFwiLFxuXG4gICAgLy8gOjogKFtNYXJrXSkg4oaSIFtNYXJrXVxuICAgIC8vIFdoZW4gdGhlcmUgaXMgYSBtYXJrIG9mIHRoaXMgdHlwZSBpbiB0aGUgZ2l2ZW4gc2V0LCBhIG5ldyBzZXRcbiAgICAvLyB3aXRob3V0IGl0IGlzIHJldHVybmVkLiBPdGhlcndpc2UsIHRoZSBpbnB1dCBzZXQgaXMgcmV0dXJuZWQuXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZUZyb21TZXQoc2V0KSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykgaWYgKHNldFtpXS50eXBlID09IHRoaXMpIHJldHVybiBzZXQuc2xpY2UoMCwgaSkuY29uY2F0KHNldC5zbGljZShpICsgMSkpO1xuICAgICAgcmV0dXJuIHNldDtcbiAgICB9XG5cbiAgICAvLyA6OiAoW01hcmtdKSDihpIgYm9vbFxuICAgIC8vIFRlc3RzIHdoZXRoZXIgdGhlcmUgaXMgYSBtYXJrIG9mIHRoaXMgdHlwZSBpbiB0aGUgZ2l2ZW4gc2V0LlxuICB9LCB7XG4gICAga2V5OiBcImlzSW5TZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNJblNldChzZXQpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChzZXRbaV0udHlwZSA9PSB0aGlzKSByZXR1cm4gc2V0W2ldO1xuICAgICAgfVxuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImdldE9yZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE9yZGVyKG1hcmtzKSB7XG4gICAgICB2YXIgc29ydGVkID0gW107XG4gICAgICBmb3IgKHZhciBfbmFtZTQgaW4gbWFya3MpIHtcbiAgICAgICAgc29ydGVkLnB1c2goeyBuYW1lOiBfbmFtZTQsIHJhbms6IG1hcmtzW19uYW1lNF0udHlwZS5yYW5rIH0pO1xuICAgICAgfXNvcnRlZC5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiBhLnJhbmsgLSBiLnJhbms7XG4gICAgICB9KTtcbiAgICAgIHZhciByYW5rcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNvcnRlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICByYW5rc1tzb3J0ZWRbaV0ubmFtZV0gPSBpO1xuICAgICAgfXJldHVybiByYW5rcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcGlsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21waWxlKG1hcmtzLCBzY2hlbWEpIHtcbiAgICAgIHZhciBvcmRlciA9IHRoaXMuZ2V0T3JkZXIobWFya3MpO1xuICAgICAgdmFyIHJlc3VsdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICBmb3IgKHZhciBfbmFtZTUgaW4gbWFya3MpIHtcbiAgICAgICAgdmFyIGluZm8gPSBtYXJrc1tfbmFtZTVdO1xuICAgICAgICB2YXIgYXR0cnMgPSBpbmZvLmF0dHJpYnV0ZXMgfHwgaW5mby50eXBlLmF0dHJpYnV0ZXM7XG4gICAgICAgIHJlc3VsdFtfbmFtZTVdID0gbmV3IGluZm8udHlwZShfbmFtZTUsIGF0dHJzLCBvcmRlcltfbmFtZTVdLCBzY2hlbWEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmFua1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIDUwO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBNYXJrVHlwZTtcbn0pKCk7XG5cbmV4cG9ydHMuTWFya1R5cGUgPSBNYXJrVHlwZTtcbk1hcmtUeXBlLmF0dHJpYnV0ZXMgPSB7fTtcblxuLy8gOjogKHN0cmluZywgKilcbi8vIFJlZ2lzdGVyIGEgbWV0YWRhdGEgZWxlbWVudCBmb3IgdGhpcyBtYXJrIHR5cGUuIFNlZSBhbHNvXG4vLyBgTm9kZVR5cGUucmVnaXN0ZXJgLlxuTWFya1R5cGUucmVnaXN0ZXIgPSBOb2RlVHlwZS5yZWdpc3RlcjtcblxuLy8gU2NoZW1hIHNwZWNpZmljYXRpb25zIGFyZSBkYXRhIHN0cnVjdHVyZXMgdGhhdCBzcGVjaWZ5IGEgc2NoZW1hIC0tXG4vLyBhIHNldCBvZiBub2RlIHR5cGVzLCB0aGVpciBuYW1lcywgYXR0cmlidXRlcywgYW5kIG5lc3RpbmcgYmVoYXZpb3IuXG5cbmZ1bmN0aW9uIGNvcHlPYmoob2JqLCBmKSB7XG4gIHZhciByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBmb3IgKHZhciBwcm9wIGluIG9iaikge1xuICAgIHJlc3VsdFtwcm9wXSA9IGYgPyBmKG9ialtwcm9wXSkgOiBvYmpbcHJvcF07XG4gIH1yZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBlbnN1cmVXcmFwcGVkKG9iaikge1xuICByZXR1cm4gb2JqIGluc3RhbmNlb2YgRnVuY3Rpb24gPyB7IHR5cGU6IG9iaiB9IDogb2JqO1xufVxuXG5mdW5jdGlvbiBvdmVybGF5T2JqKG9iaiwgb3ZlcmxheSkge1xuICB2YXIgY29weSA9IGNvcHlPYmoob2JqKTtcbiAgZm9yICh2YXIgX25hbWU2IGluIG92ZXJsYXkpIHtcbiAgICB2YXIgaW5mbyA9IGVuc3VyZVdyYXBwZWQob3ZlcmxheVtfbmFtZTZdKTtcbiAgICBpZiAoaW5mbyA9PSBudWxsKSB7XG4gICAgICBkZWxldGUgY29weVtfbmFtZTZdO1xuICAgIH0gZWxzZSBpZiAoaW5mby50eXBlKSB7XG4gICAgICBjb3B5W19uYW1lNl0gPSBpbmZvO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZXhpc3RpbmcgPSBjb3B5W19uYW1lNl0gPSBjb3B5T2JqKGNvcHlbX25hbWU2XSk7XG4gICAgICBmb3IgKHZhciBwcm9wIGluIGluZm8pIHtcbiAgICAgICAgZXhpc3RpbmdbcHJvcF0gPSBpbmZvW3Byb3BdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY29weTtcbn1cblxuLy8gOzsgQSBzY2hlbWEgc3BlY2lmaWNhdGlvbiBpcyBhIGJsdWVwcmludCBmb3IgYW4gYWN0dWFsXG4vLyBgU2NoZW1hYC4gSXQgbWFwcyBuYW1lcyB0byBub2RlIGFuZCBtYXJrIHR5cGVzLCBhbG9uZ1xuLy8gd2l0aCBleHRyYSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgYW5kIGNoYW5nZXNcbi8vIHRvIG5vZGUga2luZHMgYW5kIHJlbGF0aW9ucy5cbi8vXG4vLyBBIHNwZWNpZmljYXRpb24gY29uc2lzdHMgb2YgYW4gb2JqZWN0IHRoYXQgbWFwcyBub2RlIG5hbWVzIHRvIG5vZGVcbi8vIHR5cGUgY29uc3RydWN0b3JzIGFuZCBhbm90aGVyIHNpbWlsYXIgb2JqZWN0IG1hcHBpbmcgbWFyayBuYW1lcyB0b1xuLy8gbWFyayB0eXBlIGNvbnN0cnVjdG9ycy5cbi8vXG4vLyBGb3IgZmxleGliaWxpdHkgYW5kIHJldXNhYmlsaXR5LCBub2RlIGFuZCBtYXJrIHR5cGUgY2xhc3NlcyBkbyBub3Rcbi8vIGRlY2xhcmUgdGhlaXIgb3duIG5hbWUuIEluc3RlYWQsIGVhY2ggc2NoZW1hIHRoYXQgaW5jbHVkZXMgdGhlbSBjYW5cbi8vIGFzc2lnbiBhIG5hbWUgdG8gdGhlbSwgYXMgd2VsbCBhcyBvdmVycmlkZSB0aGVpclxuLy8gW2tpbmRdKCNOb2RlVHlwZS5raW5kKSBhbmQgW2NvbnRhaW5lZCBraW5kXSgjTm9kZVR5cGUuY29udGFpbnMpLCBvclxuLy8gYWRkaW5nIGV4dHJhIFthdHRyaWJ1dGVzXSgjTm9kZVR5cGUuYXR0cmlidXRlcykuXG5cbnZhciBTY2hlbWFTcGVjID0gKGZ1bmN0aW9uICgpIHtcbiAgLy8gOjogKD9PYmplY3Q8e3R5cGU6IE5vZGVUeXBlfT4sID9PYmplY3Q8e3R5cGU6IE1hcmtUeXBlfT4pXG4gIC8vIENyZWF0ZSBhIHNjaGVtYSBzcGVjaWZpY2F0aW9uIGZyb20gc2NyYXRjaC4gVGhlIGFyZ3VtZW50cyBtYXBcbiAgLy8gbm9kZSBuYW1lcyB0byBub2RlIHR5cGUgY29uc3RydWN0b3JzIGFuZCBtYXJrIG5hbWVzIHRvIG1hcmsgdHlwZVxuICAvLyBjb25zdHJ1Y3RvcnMuIFRoZWlyIHByb3BlcnR5IHZhbHVlIHNob3VsZCBiZSBlaXRoZXIgdGhlIHR5cGVcbiAgLy8gY29uc3RydWN0b3JzIHRoZW1zZWx2ZXMsIG9yIG9iamVjdHMgd2l0aCBhIHR5cGUgY29uc3RydWN0b3IgdW5kZXJcbiAgLy8gdGhlaXIgYHR5cGVgIHByb3BlcnR5LCBhbmQgb3B0aW9uYWxseSB0aGVzZSBvdGhlciBwcm9wZXJ0aWVzOlxuICAvL1xuICAvLyAqKmBjb250YWluc2AqKmA6IHN0cmluZ2BcbiAgLy8gICA6IE9ubHkgdmFsaWQgZm9yIGBub2Rlc2AuIFRoZSBba2luZF0oI05vZGVUeXBlLmtpbmQpIG9mIHRoZVxuICAvLyAgICAgbm9kZXMgdGhhdCB0aGlzIG5vZGUgY2FuIGNvbnRhaW4gaW4gdGhpcyBzY2hlbWEuXG4gIC8vXG4gIC8vICoqYGtpbmRgKipgOiBzdHJpbmdgXG4gIC8vICA6IE9ubHkgdmFsaWQgZm9yIGBub2Rlc2AuIE92ZXJyaWRlcyB0aGUga2luZCBvZiB0aGlzIG5vZGUgaW5cbiAgLy8gICAgdGhpcyBzY2hlbWEuIFNhbWUgZm9ybWF0IGFzIGBOb2RlVHlwZS5raW5kYC5cbiAgLy9cbiAgLy8gKipgYXR0cmlidXRlc2AqKmA6IE9iamVjdDxBdHRyaWJ1dGU+YFxuICAvLyAgIDogRXh0cmEgYXR0cmlidXRlcyB0byBhdHRhY2ggdG8gdGhpcyBub2RlIGluIHRoaXMgc2NoZW1hLlxuXG4gIGZ1bmN0aW9uIFNjaGVtYVNwZWMobm9kZXMsIG1hcmtzKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFNjaGVtYVNwZWMpO1xuXG4gICAgdGhpcy5ub2RlcyA9IG5vZGVzID8gY29weU9iaihub2RlcywgZW5zdXJlV3JhcHBlZCkgOiBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMubWFya3MgPSBtYXJrcyA/IGNvcHlPYmoobWFya3MsIGVuc3VyZVdyYXBwZWQpIDogT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuXG4gIC8vIEZvciBub2RlIHR5cGVzIHdoZXJlIGFsbCBhdHRycyBoYXZlIGEgZGVmYXVsdCB2YWx1ZSAob3Igd2hpY2ggZG9uJ3RcbiAgLy8gaGF2ZSBhbnkgYXR0cmlidXRlcyksIGJ1aWxkIHVwIGEgc2luZ2xlIHJldXNhYmxlIGRlZmF1bHQgYXR0cmlidXRlXG4gIC8vIG9iamVjdCwgYW5kIHVzZSBpdCBmb3IgYWxsIG5vZGVzIHRoYXQgZG9uJ3Qgc3BlY2lmeSBzcGVjaWZpY1xuICAvLyBhdHRyaWJ1dGVzLlxuXG4gIC8vIDo6ICg/T2JqZWN0PD97dHlwZTogTm9kZVR5cGV9PiwgP09iamVjdDw/e3R5cGU6IE1hcmtUeXBlfT4pIOKGkiBTY2hlbWFTcGVjXG4gIC8vIEJhc2UgYSBuZXcgc2NoZW1hIHNwZWMgb24gdGhpcyBvbmUgYnkgc3BlY2lmeWluZyBub2RlcyBhbmQgbWFya3NcbiAgLy8gdG8gYWRkLCBjaGFuZ2UsIG9yIHJlbW92ZS5cbiAgLy9cbiAgLy8gV2hlbiBgbm9kZXNgIGlzIHBhc3NlZCwgaXQgc2hvdWxkIGJlIGFuIG9iamVjdCBtYXBwaW5nIHR5cGUgbmFtZXNcbiAgLy8gdG8gZWl0aGVyIGBudWxsYCwgdG8gZGVsZXRlIHRoZSB0eXBlIG9mIHRoYXQgbmFtZSwgdG8gYVxuICAvLyBgTm9kZVR5cGVgLCB0byBhZGQgb3IgcmVwbGFjZSB0aGUgbm9kZSB0eXBlIG9mIHRoYXQgbmFtZSwgb3IgdG9cbiAgLy8gYW4gb2JqZWN0IGNvbnRhaW5pbmcgW2V4dGVuc2lvblxuICAvLyBwcm9wZXJ0aWVzXSgjU2NoZW1hU3BlY19jb25zdHJ1Y3RvciksIHRvIGFkZCB0byB0aGUgZXhpc3RpbmdcbiAgLy8gZGVzY3JpcHRpb24gb2YgdGhhdCBub2RlIHR5cGUuXG4gIC8vXG4gIC8vIFNpbWlsYXJseSwgYG1hcmtzYCBjYW4gYmUgYW4gb2JqZWN0IHRvIGFkZCwgY2hhbmdlLCBvciByZW1vdmVcbiAgLy8gbWFya3MgaW4gdGhlIHNjaGVtYS5cblxuICBfY3JlYXRlQ2xhc3MoU2NoZW1hU3BlYywgW3tcbiAgICBrZXk6IFwidXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZShub2RlcywgbWFya3MpIHtcbiAgICAgIHJldHVybiBuZXcgU2NoZW1hU3BlYyhub2RlcyA/IG92ZXJsYXlPYmoodGhpcy5ub2Rlcywgbm9kZXMpIDogdGhpcy5ub2RlcywgbWFya3MgPyBvdmVybGF5T2JqKHRoaXMubWFya3MsIG1hcmtzKSA6IHRoaXMubWFya3MpO1xuICAgIH1cblxuICAgIC8vIDo6ICg/dW5pb248c3RyaW5nLCAobmFtZTogc3RyaW5nLCB0eXBlOiBOb2RlVHlwZSkg4oaSIGJvb2w+LCBzdHJpbmcsIEF0dHJpYnV0ZSkg4oaSIFNjaGVtYVNwZWNcbiAgICAvLyBDcmVhdGUgYSBuZXcgc2NoZW1hIHNwZWMgd2l0aCBhdHRyaWJ1dGVzIGFkZGVkIHRvIHNlbGVjdGVkIG5vZGVcbiAgICAvLyB0eXBlcy4gYGZpbHRlcmAgY2FuIGJlIGBudWxsYCwgdG8gYWRkIHRoZSBhdHRyaWJ1dGUgdG8gYWxsIG5vZGVcbiAgICAvLyB0eXBlcywgYSBzdHJpbmcsIHRvIGFkZCBpdCBvbmx5IHRvIHRoZSBuYW1lZCBub2RlIHR5cGUsIG9yIGFcbiAgICAvLyBwcmVkaWNhdGUgZnVuY3Rpb24sIHRvIGFkZCBpdCB0byBub2RlIHR5cGVzIHRoYXQgcGFzcyB0aGVcbiAgICAvLyBwcmVkaWNhdGUuXG4gICAgLy9cbiAgICAvLyBUaGlzIGF0dHJpYnV0ZSB3aWxsIGJlIGFkZGVkIGFsb25nc2lkZSB0aGUgbm9kZSB0eXBlJ3MgW2RlZmF1bHRcbiAgICAvLyBhdHRyaWJ1dGVzXSgjTm9kZVR5cGUuYXR0cmlidXRlcykuXG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkQXR0cmlidXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZEF0dHJpYnV0ZShmaWx0ZXIsIGF0dHJOYW1lLCBhdHRyKSB7XG4gICAgICB2YXIgY29weSA9IGNvcHlPYmoodGhpcy5ub2Rlcyk7XG4gICAgICBmb3IgKHZhciBfbmFtZTcgaW4gY29weSkge1xuICAgICAgICBpZiAodHlwZW9mIGZpbHRlciA9PSBcInN0cmluZ1wiID8gZmlsdGVyID09IF9uYW1lNyA6IHR5cGVvZiBmaWx0ZXIgPT0gXCJmdW5jdGlvblwiID8gZmlsdGVyKF9uYW1lNywgY29weVtfbmFtZTddKSA6IGZpbHRlciA/IGZpbHRlciA9PSBjb3B5W19uYW1lN10gOiB0cnVlKSB7XG4gICAgICAgICAgdmFyIGluZm8gPSBjb3B5W19uYW1lN10gPSBjb3B5T2JqKGNvcHlbX25hbWU3XSk7KGluZm8uYXR0cmlidXRlcyB8fCAoaW5mby5hdHRyaWJ1dGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKSkpW2F0dHJOYW1lXSA9IGF0dHI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgU2NoZW1hU3BlYyhjb3B5LCB0aGlzLm1hcmtzKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gU2NoZW1hU3BlYztcbn0pKCk7XG5cbmV4cG9ydHMuU2NoZW1hU3BlYyA9IFNjaGVtYVNwZWM7XG5mdW5jdGlvbiBnZXREZWZhdWx0QXR0cnMoYXR0cnMpIHtcbiAgdmFyIGRlZmF1bHRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgZm9yICh2YXIgYXR0ck5hbWUgaW4gYXR0cnMpIHtcbiAgICB2YXIgYXR0ciA9IGF0dHJzW2F0dHJOYW1lXTtcbiAgICBpZiAoYXR0cltcImRlZmF1bHRcIl0gPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgZGVmYXVsdHNbYXR0ck5hbWVdID0gYXR0cltcImRlZmF1bHRcIl07XG4gIH1cbiAgcmV0dXJuIGRlZmF1bHRzO1xufVxuXG5mdW5jdGlvbiBfYnVpbGRBdHRycyhhdHRyU3BlYywgYXR0cnMsIGFyZzEsIGFyZzIpIHtcbiAgdmFyIGJ1aWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgZm9yICh2YXIgX25hbWU4IGluIGF0dHJTcGVjKSB7XG4gICAgdmFyIHZhbHVlID0gYXR0cnMgJiYgYXR0cnNbX25hbWU4XTtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgdmFyIGF0dHIgPSBhdHRyU3BlY1tfbmFtZThdO1xuICAgICAgaWYgKGF0dHJbXCJkZWZhdWx0XCJdICE9IG51bGwpIHZhbHVlID0gYXR0cltcImRlZmF1bHRcIl07ZWxzZSBpZiAoYXR0ci5jb21wdXRlKSB2YWx1ZSA9IGF0dHIuY29tcHV0ZShhcmcxLCBhcmcyKTtlbHNlIFNjaGVtYUVycm9yLnJhaXNlKFwiTm8gdmFsdWUgc3VwcGxpZWQgZm9yIGF0dHJpYnV0ZSBcIiArIF9uYW1lOCk7XG4gICAgfVxuICAgIGJ1aWx0W19uYW1lOF0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gYnVpbHQ7XG59XG5cbi8vIDs7IEVhY2ggZG9jdW1lbnQgaXMgYmFzZWQgb24gYSBzaW5nbGUgc2NoZW1hLCB3aGljaCBwcm92aWRlcyB0aGVcbi8vIG5vZGUgYW5kIG1hcmsgdHlwZXMgdGhhdCBpdCBpcyBtYWRlIHVwIG9mICh3aGljaCwgaW4gdHVybixcbi8vIGRldGVybWluZSB0aGUgc3RydWN0dXJlIGl0IGlzIGFsbG93ZWQgdG8gaGF2ZSkuXG5cbnZhciBTY2hlbWEgPSAoZnVuY3Rpb24gKCkge1xuICAvLyA6OiAoU2NoZW1hU3BlYylcbiAgLy8gQ29uc3RydWN0IGEgc2NoZW1hIGZyb20gYSBzcGVjaWZpY2F0aW9uLlxuXG4gIGZ1bmN0aW9uIFNjaGVtYShzcGVjKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFNjaGVtYSk7XG5cbiAgICAvLyA6OiBTY2hlbWFTcGVjXG4gICAgLy8gVGhlIHNwZWNpZmljYXRpb24gb24gd2hpY2ggdGhlIHNjaGVtYSBpcyBiYXNlZC5cbiAgICB0aGlzLnNwZWMgPSBzcGVjO1xuICAgIHRoaXMua2luZHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIC8vIDo6IE9iamVjdDxOb2RlVHlwZT5cbiAgICAvLyBBbiBvYmplY3QgbWFwcGluZyB0aGUgc2NoZW1hJ3Mgbm9kZSBuYW1lcyB0byBub2RlIHR5cGUgb2JqZWN0cy5cbiAgICB0aGlzLm5vZGVzID0gTm9kZVR5cGUuY29tcGlsZShzcGVjLm5vZGVzLCB0aGlzKTtcbiAgICAvLyA6OiBPYmplY3Q8TWFya1R5cGU+XG4gICAgLy8gQSBtYXAgZnJvbSBtYXJrIG5hbWVzIHRvIG1hcmsgdHlwZSBvYmplY3RzLlxuICAgIHRoaXMubWFya3MgPSBNYXJrVHlwZS5jb21waWxlKHNwZWMubWFya3MsIHRoaXMpO1xuICAgIC8vIDo6IE9iamVjdFxuICAgIC8vIEFuIG9iamVjdCBmb3Igc3RvcmluZyB3aGF0ZXZlciB2YWx1ZXMgbW9kdWxlcyBtYXkgd2FudCB0b1xuICAgIC8vIGNvbXB1dGUgYW5kIGNhY2hlIHBlciBzY2hlbWEuIChJZiB5b3Ugd2FudCB0byBzdG9yZSBzb21ldGhpbmdcbiAgICAvLyBpbiBpdCwgdHJ5IHRvIHVzZSBwcm9wZXJ0eSBuYW1lcyB1bmxpa2VseSB0byBjbGFzaC4pXG4gICAgdGhpcy5jYWNoZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLmJpbmQodGhpcyk7XG4gICAgdGhpcy50ZXh0ID0gdGhpcy50ZXh0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5ub2RlRnJvbUpTT04gPSB0aGlzLm5vZGVGcm9tSlNPTi5iaW5kKHRoaXMpO1xuICAgIHRoaXMubWFya0Zyb21KU09OID0gdGhpcy5tYXJrRnJvbUpTT04uYmluZCh0aGlzKTtcbiAgfVxuXG4gIC8vIDo6ICh1bmlvbjxzdHJpbmcsIE5vZGVUeXBlPiwgP09iamVjdCwgP3VuaW9uPEZyYWdtZW50LCBOb2RlLCBbTm9kZV0+LCA/W01hcmtdKSDihpIgTm9kZVxuICAvLyBDcmVhdGUgYSBub2RlIGluIHRoaXMgc2NoZW1hLiBUaGUgYHR5cGVgIG1heSBiZSBhIHN0cmluZyBvciBhXG4gIC8vIGBOb2RlVHlwZWAgaW5zdGFuY2UuIEF0dHJpYnV0ZXMgd2lsbCBiZSBleHRlbmRlZFxuICAvLyB3aXRoIGRlZmF1bHRzLCBgY29udGVudGAgbWF5IGJlIGEgYEZyYWdtZW50YCxcbiAgLy8gYG51bGxgLCBhIGBOb2RlYCwgb3IgYW4gYXJyYXkgb2Ygbm9kZXMuXG4gIC8vXG4gIC8vIFdoZW4gY3JlYXRpbmcgYSB0ZXh0IG5vZGUsIGBjb250ZW50YCBzaG91bGQgYmUgYSBzdHJpbmcgYW5kIGlzXG4gIC8vIGludGVycHJldGVkIGFzIHRoZSBub2RlJ3MgdGV4dC5cbiAgLy9cbiAgLy8gVGhpcyBtZXRob2QgaXMgYm91bmQgdG8gdGhlIFNjaGVtYSwgbWVhbmluZyB5b3UgZG9uJ3QgaGF2ZSB0b1xuICAvLyBjYWxsIGl0IGFzIGEgbWV0aG9kLCBidXQgY2FuIHBhc3MgaXQgdG8gaGlnaGVyLW9yZGVyIGZ1bmN0aW9uc1xuICAvLyBhbmQgc3VjaC5cblxuICBfY3JlYXRlQ2xhc3MoU2NoZW1hLCBbe1xuICAgIGtleTogXCJub2RlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5vZGUodHlwZSwgYXR0cnMsIGNvbnRlbnQsIG1hcmtzKSB7XG4gICAgICBpZiAodHlwZW9mIHR5cGUgPT0gXCJzdHJpbmdcIikgdHlwZSA9IHRoaXMubm9kZVR5cGUodHlwZSk7ZWxzZSBpZiAoISh0eXBlIGluc3RhbmNlb2YgTm9kZVR5cGUpKSBTY2hlbWFFcnJvci5yYWlzZShcIkludmFsaWQgbm9kZSB0eXBlOiBcIiArIHR5cGUpO2Vsc2UgaWYgKHR5cGUuc2NoZW1hICE9IHRoaXMpIFNjaGVtYUVycm9yLnJhaXNlKFwiTm9kZSB0eXBlIGZyb20gZGlmZmVyZW50IHNjaGVtYSB1c2VkIChcIiArIHR5cGUubmFtZSArIFwiKVwiKTtcblxuICAgICAgcmV0dXJuIHR5cGUuY3JlYXRlKGF0dHJzLCBjb250ZW50LCBtYXJrcyk7XG4gICAgfVxuXG4gICAgLy8gOjogKHN0cmluZywgP1tNYXJrXSkg4oaSIE5vZGVcbiAgICAvLyBDcmVhdGUgYSB0ZXh0IG5vZGUgaW4gdGhlIHNjaGVtYS4gVGhpcyBtZXRob2QgaXMgYm91bmQgdG8gdGhlIFNjaGVtYS5cbiAgfSwge1xuICAgIGtleTogXCJ0ZXh0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRleHQoX3RleHQsIG1hcmtzKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2Rlcy50ZXh0LmNyZWF0ZShudWxsLCBfdGV4dCwgX21hcmsuTWFyay5zZXRGcm9tKG1hcmtzKSk7XG4gICAgfVxuXG4gICAgLy8gOjogKCkg4oaSID9Ob2RlVHlwZVxuICAgIC8vIFJldHVybiB0aGUgZGVmYXVsdCB0ZXh0YmxvY2sgdHlwZSBmb3IgdGhpcyBzY2hlbWEsIG9yIGBudWxsYCBpZlxuICAgIC8vIGl0IGRvZXMgbm90IGNvbnRhaW4gYSBub2RlIHR5cGUgd2l0aCBhIGBkZWZhdWx0VGV4dGJsb2NrYFxuICAgIC8vIHByb3BlcnR5LlxuICB9LCB7XG4gICAga2V5OiBcImRlZmF1bHRUZXh0YmxvY2tUeXBlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlZmF1bHRUZXh0YmxvY2tUeXBlKCkge1xuICAgICAgdmFyIGNhY2hlZCA9IHRoaXMuY2FjaGVkLmRlZmF1bHRUZXh0YmxvY2tUeXBlO1xuICAgICAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gY2FjaGVkO1xuICAgICAgZm9yICh2YXIgX25hbWU5IGluIHRoaXMubm9kZXMpIHtcbiAgICAgICAgaWYgKHRoaXMubm9kZXNbX25hbWU5XS5kZWZhdWx0VGV4dGJsb2NrKSByZXR1cm4gdGhpcy5jYWNoZWQuZGVmYXVsdFRleHRibG9ja1R5cGUgPSB0aGlzLm5vZGVzW19uYW1lOV07XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZWQuZGVmYXVsdFRleHRibG9ja1R5cGUgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIDo6IChzdHJpbmcsID9PYmplY3QpIOKGkiBNYXJrXG4gICAgLy8gQ3JlYXRlIGEgbWFyayB3aXRoIHRoZSBuYW1lZCB0eXBlXG4gIH0sIHtcbiAgICBrZXk6IFwibWFya1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXJrKG5hbWUsIGF0dHJzKSB7XG4gICAgICB2YXIgc3BlYyA9IHRoaXMubWFya3NbbmFtZV0gfHwgU2NoZW1hRXJyb3IucmFpc2UoXCJObyBtYXJrIG5hbWVkIFwiICsgbmFtZSk7XG4gICAgICByZXR1cm4gc3BlYy5jcmVhdGUoYXR0cnMpO1xuICAgIH1cblxuICAgIC8vIDo6IChPYmplY3QpIOKGkiBOb2RlXG4gICAgLy8gRGVzZXJpYWxpemUgYSBub2RlIGZyb20gaXRzIEpTT04gcmVwcmVzZW50YXRpb24uIFRoaXMgbWV0aG9kIGlzXG4gICAgLy8gYm91bmQuXG4gIH0sIHtcbiAgICBrZXk6IFwibm9kZUZyb21KU09OXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5vZGVGcm9tSlNPTihqc29uKSB7XG4gICAgICByZXR1cm4gX25vZGUuTm9kZS5mcm9tSlNPTih0aGlzLCBqc29uKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoT2JqZWN0KSDihpIgTWFya1xuICAgIC8vIERlc2VyaWFsaXplIGEgbWFyayBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLiBUaGlzIG1ldGhvZCBpc1xuICAgIC8vIGJvdW5kLlxuICB9LCB7XG4gICAga2V5OiBcIm1hcmtGcm9tSlNPTlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXJrRnJvbUpTT04oanNvbikge1xuICAgICAgaWYgKHR5cGVvZiBqc29uID09IFwic3RyaW5nXCIpIHJldHVybiB0aGlzLm1hcmsoanNvbik7XG4gICAgICByZXR1cm4gdGhpcy5tYXJrKGpzb24uXywganNvbik7XG4gICAgfVxuXG4gICAgLy8gOjogKHN0cmluZykg4oaSIE5vZGVUeXBlXG4gICAgLy8gR2V0IHRoZSBgTm9kZVR5cGVgIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpblxuICAgIC8vIHRoaXMgc2NoZW1hLCBvciByYWlzZSBhbiBlcnJvciBpZiBpdCBkb2VzIG5vdCBleGlzdC5cbiAgfSwge1xuICAgIGtleTogXCJub2RlVHlwZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBub2RlVHlwZShuYW1lKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2Rlc1tuYW1lXSB8fCBTY2hlbWFFcnJvci5yYWlzZShcIlVua25vd24gbm9kZSB0eXBlOiBcIiArIG5hbWUpO1xuICAgIH1cblxuICAgIC8vIDo6IChzdHJpbmcsIHN0cmluZykg4oaSIGJvb2xcbiAgICAvLyBUZXN0IHdoZXRoZXIgYSBub2RlIGtpbmQgaXMgYSBzdWIta2luZCBvZiBhbm90aGVyIGtpbmQuXG4gIH0sIHtcbiAgICBrZXk6IFwic3ViS2luZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdWJLaW5kKHN1Yiwgc3VwKSB7XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmIChzdWIgPT0gc3VwKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgc3ViID0gdGhpcy5raW5kc1tzdWJdO1xuICAgICAgICBpZiAoIXN1YikgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDo6IChzdHJpbmcsICh2YWx1ZTogKiwgc291cmNlOiB1bmlvbjxOb2RlVHlwZSwgTWFya1R5cGUsIEF0dHJpYnV0ZT4pKVxuICAgIC8vIFJldHJpZXZlIGFsbCByZWdpc3RlcmVkIGl0ZW1zIHVuZGVyIHRoZSBnaXZlbiBuYW1lIGZyb20gdGhpc1xuICAgIC8vIHNjaGVtYS4gVGhlIGdpdmVuIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGggZWFjaCBpdGVtIGFuZCwgYXNcbiAgICAvLyBhIHNlY29uZCBhcmd1bWVudCwgdGhlIGVsZW1lbnTigJRub2RlIHR5cGUsIG1hcmsgdHlwZSwgb3JcbiAgICAvLyBhdHRyaWJ1dGXigJR0aGF0IGl0IHdhcyBhc3NvY2lhdGVkIHdpdGguXG4gIH0sIHtcbiAgICBrZXk6IFwicmVnaXN0cnlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVnaXN0cnkobmFtZSwgZikge1xuICAgICAgdmFyIGF0dHJzU2VlbiA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyOyBpKyspIHtcbiAgICAgICAgdmFyIG9iaiA9IGkgPyB0aGlzLm1hcmtzIDogdGhpcy5ub2RlcztcbiAgICAgICAgZm9yICh2YXIgdG5hbWUgaW4gb2JqKSB7XG4gICAgICAgICAgdmFyIHR5cGUgPSBvYmpbdG5hbWVdO1xuICAgICAgICAgIGlmICh0eXBlLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShcInJlZ2lzdHJ5XCIpKSB7XG4gICAgICAgICAgICB2YXIgcmVnID0gdHlwZS5yZWdpc3RyeVtuYW1lXTtcbiAgICAgICAgICAgIGlmIChyZWcpIGZvciAodmFyIGogPSAwOyBqIDwgcmVnLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgIGYocmVnW2pdLCB0eXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yICh2YXIgYW5hbWUgaW4gdHlwZS5hdHRycykge1xuICAgICAgICAgICAgdmFyIGF0dHIgPSB0eXBlLmF0dHJzW2FuYW1lXSxcbiAgICAgICAgICAgICAgICByZWcgPSBhdHRyLnJlZ2lzdHJ5W25hbWVdO1xuICAgICAgICAgICAgaWYgKHJlZyAmJiBhdHRyc1NlZW4uaW5kZXhPZihhdHRyKSA9PSAtMSkge1xuICAgICAgICAgICAgICBhdHRyc1NlZW4ucHVzaChhdHRyKTtcbiAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCByZWcubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBmKHJlZ1tqXSwgYXR0cik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gU2NoZW1hO1xufSkoKTtcblxuZXhwb3J0cy5TY2hlbWEgPSBTY2hlbWE7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZXhwb3J0cy5mcm9tRE9NID0gZnJvbURPTTtcbmV4cG9ydHMuZnJvbUhUTUwgPSBmcm9tSFRNTDtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIF9tb2RlbCA9IHJlcXVpcmUoXCIuLi9tb2RlbFwiKTtcblxudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2luZGV4XCIpO1xuXG4vLyA6OiAoU2NoZW1hLCBET01Ob2RlLCA/T2JqZWN0KSDihpIgTm9kZVxuLy8gUGFyc2UgZG9jdW1lbnQgZnJvbSB0aGUgY29udGVudCBvZiBhIERPTSBub2RlLiBUbyBwYXNzIGFuIGV4cGxpY2l0XG4vLyBwYXJlbnQgZG9jdW1lbnQgKGZvciBleGFtcGxlLCB3aGVuIG5vdCBpbiBhIGJyb3dzZXIgd2luZG93XG4vLyBlbnZpcm9ubWVudCwgd2hlcmUgd2Ugc2ltcGx5IHVzZSB0aGUgZ2xvYmFsIGRvY3VtZW50KSwgcGFzcyBpdCBhc1xuLy8gdGhlIGBkb2N1bWVudGAgcHJvcGVydHkgb2YgYG9wdGlvbnNgLlxuXG5mdW5jdGlvbiBmcm9tRE9NKHNjaGVtYSwgZG9tLCBvcHRpb25zKSB7XG4gIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9O1xuICB2YXIgY29udGV4dCA9IG5ldyBET01QYXJzZVN0YXRlKHNjaGVtYSwgb3B0aW9ucy50b3BOb2RlIHx8IHNjaGVtYS5ub2RlKFwiZG9jXCIpLCBvcHRpb25zKTtcbiAgdmFyIHN0YXJ0ID0gb3B0aW9ucy5mcm9tID8gZG9tLmNoaWxkTm9kZXNbb3B0aW9ucy5mcm9tXSA6IGRvbS5maXJzdENoaWxkO1xuICB2YXIgZW5kID0gb3B0aW9ucy50byAhPSBudWxsICYmIGRvbS5jaGlsZE5vZGVzW29wdGlvbnMudG9dIHx8IG51bGw7XG4gIGNvbnRleHQuYWRkQWxsKHN0YXJ0LCBlbmQsIHRydWUpO1xuICB2YXIgZG9jID0gdW5kZWZpbmVkO1xuICB3aGlsZSAoY29udGV4dC5zdGFjay5sZW5ndGgpIGRvYyA9IGNvbnRleHQubGVhdmUoKTtcbiAgcmV0dXJuIGRvYztcbn1cblxuLy8gOzsgI3BhdGg9RE9NUGFyc2VTcGVjICNraW5kPWludGVyZmFjZSAjdG9jPWZhbHNlXG4vLyBUbyBkZWZpbmUgdGhlIHdheSBbbm9kZV0oI05vZGVUeXBlKSBhbmQgW21hcmtdKCNNYXJrVHlwZSkgdHlwZXMgYXJlXG4vLyBwYXJzZWQsIHlvdSBjYW4gYXNzb2NpYXRlIG9uZSBvciBtb3JlIERPTSBwYXJzaW5nIHNwZWNpZmljYXRpb25zIHRvXG4vLyB0aGVtIHVzaW5nIHRoZSBbYHJlZ2lzdGVyYF0oI05vZGVUeXBlLnJlZ2lzdGVyKSBtZXRob2Qgd2l0aCB0aGVcbi8vIGBwYXJzZURPTWAgcHJvcGVydHkgbmFtZS4gRWFjaCBvZiB0aGVtIGRlZmluZXMgYSBwYXJzaW5nIHN0cmF0ZWd5XG4vLyBmb3IgYSBjZXJ0YWluIHR5cGUgb2YgRE9NIG5vZGUuXG4vL1xuLy8gTm90ZSB0aGF0IGBBdHRyaWJ1dGVgcyBtYXkgYWxzbyBjb250YWluIGEgYHBhcnNlRE9NYCBwcm9wZXJ0eSxcbi8vIHdoaWNoIHNob3VsZCBfbm90XyBiZSBhIGBET01QYXJzZVNwZWNgLCBidXQgc2ltcGx5IGEgZnVuY3Rpb24gdGhhdFxuLy8gY29tcHV0ZXMgdGhlIGF0dHJpYnV0ZSdzIHZhbHVlIGZyb20gYSBET00gbm9kZS5cblxuLy8gOjogP3N0cmluZyAjcGF0aD1ET01QYXJzZVNwZWMudGFnXG4vLyBUaGUgKGxvd2VyLWNhc2UpIHRhZyBuYW1lIGZvciB3aGljaCB0byBhY3RpdmF0ZSB0aGlzIHBhcnNlci4gV2hlblxuLy8gbm90IGdpdmVuLCBpdCBpcyBhY3RpdmF0ZWQgZm9yIGFsbCBub2Rlcy5cblxuLy8gOjogP251bWJlciAjcGF0aD1ET01QYXJzZVNwZWMucmFua1xuLy8gVGhlIHByZWNlZGVuY2Ugb2YgdGhpcyBwYXJzaW5nIHN0cmF0ZWd5LiBTaG91bGQgYmUgYSBudW1iZXIgYmV0d2VlblxuLy8gMCBhbmQgMTAwLCB3aGljaCBkZXRlcm1pbmVzIHdoZW4gdGhpcyBwYXJzZXIgZ2V0cyBhIGNoYW5jZSByZWxhdGl2ZVxuLy8gdG8gb3RoZXJzIHRoYXQgYXBwbHkgdG8gdGhlIG5vZGUgKGxvdyByYW5rcyBnbyBmaXJzdCkuIERlZmF1bHRzIHRvXG4vLyA1MC5cblxuLy8gOjogdW5pb248c3RyaW5nLCAoZG9tOiBET01Ob2RlLCBzdGF0ZTogRE9NUGFyc2VTdGF0ZSkg4oaSID9ib29sPiAjcGF0aD1ET01QYXJzZVNwZWMucGFyc2Vcbi8vIFRoZSBmdW5jdGlvbiB0aGF0LCBnaXZlbiBhIERPTSBub2RlLCBwYXJzZXMgaXQsIHVwZGF0aW5nIHRoZSBwYXJzZVxuLy8gc3RhdGUuIEl0IHNob3VsZCByZXR1cm4gKHRoZSBleGFjdCB2YWx1ZSkgYGZhbHNlYCB3aGVuIGl0IHdhbnRzIHRvXG4vLyBpbmRpY2F0ZSB0aGF0IGl0IHdhcyBub3QgYWJsZSB0byBwYXJzZSB0aGlzIG5vZGUuIFRoaXMgZnVuY3Rpb24gaXNcbi8vIGNhbGxlZCBpbiBzdWNoIGEgd2F5IHRoYXQgYHRoaXNgIGlzIGJvdW5kIHRvIHRoZSB0eXBlIHRoYXQgdGhlXG4vLyBwYXJzZSBzcGVjIHdhcyBhc3NvY2lhdGVkIHdpdGguXG4vL1xuLy8gV2hlbiB0aGlzIGlzIHNldCB0byB0aGUgc3RyaW5nIGBcImJsb2NrXCJgLCB0aGUgY29udGVudCBvZiB0aGUgRE9NXG4vLyBub2RlIGlzIHBhcnNlZCBhcyB0aGUgY29udGVudCBpbiBhIG5vZGUgb2YgdGhlIHR5cGUgdGhhdCB0aGlzIHNwZWNcbi8vIHdhcyBhc3NvY2lhdGVkIHdpdGguXG4vL1xuLy8gV2hlbiBzZXQgdG8gdGhlIHN0cmluZyBgXCJtYXJrXCJgLCB0aGUgY29udGVudCBvZiB0aGUgRE9NIG5vZGUgaXNcbi8vIHBhcnNlZCB3aXRoIGFuIGluc3RhbmNlIG9mIHRoZSBtYXJrIHRoYXQgdGhpcyBzcGVjIHdhcyBhc3NvY2lhdGVkXG4vLyB3aXRoIGFkZGVkIHRvIHRoZWlyIG1hcmtzLlxuXG4oMCwgX2luZGV4LmRlZmluZVNvdXJjZSkoXCJkb21cIiwgZnJvbURPTSk7XG5cbi8vIDo6IChTY2hlbWEsIHN0cmluZywgP09iamVjdCkg4oaSIE5vZGVcbi8vIFBhcnNlcyB0aGUgSFRNTCBpbnRvIGEgRE9NLCBhbmQgdGhlbiBjYWxscyB0aHJvdWdoIHRvIGBmcm9tRE9NYC5cblxuZnVuY3Rpb24gZnJvbUhUTUwoc2NoZW1hLCBodG1sLCBvcHRpb25zKSB7XG4gIHZhciB3cmFwID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5kb2N1bWVudCB8fCB3aW5kb3cuZG9jdW1lbnQpLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIHdyYXAuaW5uZXJIVE1MID0gaHRtbDtcbiAgcmV0dXJuIGZyb21ET00oc2NoZW1hLCB3cmFwLCBvcHRpb25zKTtcbn1cblxuKDAsIF9pbmRleC5kZWZpbmVTb3VyY2UpKFwiaHRtbFwiLCBmcm9tSFRNTCk7XG5cbnZhciBibG9ja0VsZW1lbnRzID0ge1xuICBhZGRyZXNzOiB0cnVlLCBhcnRpY2xlOiB0cnVlLCBhc2lkZTogdHJ1ZSwgYmxvY2txdW90ZTogdHJ1ZSwgY2FudmFzOiB0cnVlLFxuICBkZDogdHJ1ZSwgZGl2OiB0cnVlLCBkbDogdHJ1ZSwgZmllbGRzZXQ6IHRydWUsIGZpZ2NhcHRpb246IHRydWUsIGZpZ3VyZTogdHJ1ZSxcbiAgZm9vdGVyOiB0cnVlLCBmb3JtOiB0cnVlLCBoMTogdHJ1ZSwgaDI6IHRydWUsIGgzOiB0cnVlLCBoNDogdHJ1ZSwgaDU6IHRydWUsXG4gIGg2OiB0cnVlLCBoZWFkZXI6IHRydWUsIGhncm91cDogdHJ1ZSwgaHI6IHRydWUsIGxpOiB0cnVlLCBub3NjcmlwdDogdHJ1ZSwgb2w6IHRydWUsXG4gIG91dHB1dDogdHJ1ZSwgcDogdHJ1ZSwgcHJlOiB0cnVlLCBzZWN0aW9uOiB0cnVlLCB0YWJsZTogdHJ1ZSwgdGZvb3Q6IHRydWUsIHVsOiB0cnVlXG59O1xuXG52YXIgbm9NYXJrcyA9IFtdO1xuXG4vLyA7OyAjdG9jPWZhbHNlIEEgc3RhdGUgb2JqZWN0IHVzZWQgdG8gdHJhY2sgY29udGV4dCBkdXJpbmcgYSBwYXJzZSxcbi8vIGFuZCB0byBleHBvc2UgbWV0aG9kcyB0byBjdXN0b20gcGFyc2luZyBmdW5jdGlvbnMuXG5cbnZhciBET01QYXJzZVN0YXRlID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRE9NUGFyc2VTdGF0ZShzY2hlbWEsIHRvcE5vZGUsIG9wdGlvbnMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRE9NUGFyc2VTdGF0ZSk7XG5cbiAgICAvLyA6OiBPYmplY3QgVGhlIG9wdGlvbnMgcGFzc2VkIHRvIHRoaXMgcGFyc2UuXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAvLyA6OiBTY2hlbWEgVGhlIHNjaGVtYSB0aGF0IHdlIGFyZSBwYXJzaW5nIGludG8uXG4gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgdGhpcy5zdGFjayA9IFtdO1xuICAgIHRoaXMubWFya3MgPSBub01hcmtzO1xuICAgIHRoaXMuY2xvc2luZyA9IGZhbHNlO1xuICAgIHRoaXMuZW50ZXIodG9wTm9kZS50eXBlLCB0b3BOb2RlLmF0dHJzKTtcbiAgICB0aGlzLm5vZGVJbmZvID0gbm9kZUluZm8oc2NoZW1hKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhET01QYXJzZVN0YXRlLCBbe1xuICAgIGtleTogXCJwYXJzZUF0dHJzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhcnNlQXR0cnMoZG9tLCB0eXBlLCBhdHRycykge1xuICAgICAgZm9yICh2YXIgYXR0ciBpbiB0eXBlLmF0dHJzKSB7XG4gICAgICAgIHZhciBkZXNjID0gdHlwZS5hdHRyc1thdHRyXTtcbiAgICAgICAgaWYgKGRlc2MucGFyc2VET00gJiYgKCFhdHRycyB8fCAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGF0dHJzLCBhdHRyKSkpIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBkZXNjLnBhcnNlRE9NKGRvbSwgdGhpcy5vcHRpb25zLCBkZXNjLCB0eXBlKTtcbiAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKCFhdHRycykgYXR0cnMgPSB7fTtcbiAgICAgICAgICAgIGF0dHJzW2F0dHJdID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYXR0cnM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFkZERPTVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRET00oZG9tKSB7XG4gICAgICBpZiAoZG9tLm5vZGVUeXBlID09IDMpIHtcbiAgICAgICAgLy8gRklYTUUgZGVmaW5lIGEgY29oZXJlbnQgc3RyYXRlZ3kgZm9yIGRlYWxpbmcgd2l0aCB0cmFpbGluZywgbGVhZGluZywgYW5kIG11bHRpcGxlIHNwYWNlcyAodGhpcyBpc24ndCBvbmUpXG4gICAgICAgIHZhciB2YWx1ZSA9IGRvbS5ub2RlVmFsdWU7XG4gICAgICAgIHZhciBfdG9wID0gdGhpcy50b3AsXG4gICAgICAgICAgICBsYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoL1xcUy8udGVzdCh2YWx1ZSkgfHwgX3RvcC50eXBlLmlzVGV4dGJsb2NrKSB7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9cXHMrL2csIFwiIFwiKTtcbiAgICAgICAgICBpZiAoL15cXHMvLnRlc3QodmFsdWUpICYmIChsYXN0ID0gX3RvcC5jb250ZW50W190b3AuY29udGVudC5sZW5ndGggLSAxXSkgJiYgbGFzdC50eXBlLm5hbWUgPT0gXCJ0ZXh0XCIgJiYgL1xccyQvLnRlc3QobGFzdC50ZXh0KSkgdmFsdWUgPSB2YWx1ZS5zbGljZSgxKTtcbiAgICAgICAgICBpZiAodmFsdWUpIHRoaXMuaW5zZXJ0KHRoaXMuc2NoZW1hLnRleHQodmFsdWUsIHRoaXMubWFya3MpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkb20ubm9kZVR5cGUgIT0gMSB8fCBkb20uaGFzQXR0cmlidXRlKFwicG0taWdub3JlXCIpKSB7XG4gICAgICAgIC8vIElnbm9yZSBub24tdGV4dCBub24tZWxlbWVudCBub2Rlc1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5wYXJzZU5vZGVUeXBlKGRvbSkpIHtcbiAgICAgICAgICB0aGlzLmFkZEFsbChkb20uZmlyc3RDaGlsZCwgbnVsbCk7XG4gICAgICAgICAgdmFyIF9uYW1lID0gZG9tLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgaWYgKGJsb2NrRWxlbWVudHMuaGFzT3duUHJvcGVydHkoX25hbWUpICYmIHRoaXMudG9wLnR5cGUgPT0gdGhpcy5zY2hlbWEuZGVmYXVsdFRleHRibG9ja1R5cGUoKSkgdGhpcy5jbG9zaW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0cnlQYXJzZXJzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRyeVBhcnNlcnMocGFyc2VycywgZG9tKSB7XG4gICAgICBpZiAocGFyc2VycykgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJzZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBwYXJzZXIgPSBwYXJzZXJzW2ldO1xuICAgICAgICBpZiAocGFyc2VyLnBhcnNlLmNhbGwocGFyc2VyLnR5cGUsIGRvbSwgdGhpcykgIT09IGZhbHNlKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGFyc2VOb2RlVHlwZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZU5vZGVUeXBlKGRvbSkge1xuICAgICAgcmV0dXJuIHRoaXMudHJ5UGFyc2Vycyh0aGlzLm5vZGVJbmZvW2RvbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSwgZG9tKSB8fCB0aGlzLnRyeVBhcnNlcnModGhpcy5ub2RlSW5mby5fLCBkb20pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRBbGxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkQWxsKGZyb20sIHRvLCBzeW5jKSB7XG4gICAgICB2YXIgc3RhY2sgPSBzeW5jICYmIHRoaXMuc3RhY2suc2xpY2UoKTtcbiAgICAgIGZvciAodmFyIGRvbSA9IGZyb207IGRvbSAhPSB0bzsgZG9tID0gZG9tLm5leHRTaWJsaW5nKSB7XG4gICAgICAgIHRoaXMuYWRkRE9NKGRvbSk7XG4gICAgICAgIGlmIChzeW5jICYmIGJsb2NrRWxlbWVudHMuaGFzT3duUHJvcGVydHkoZG9tLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKSB0aGlzLnN5bmMoc3RhY2spO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkb0Nsb3NlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRvQ2xvc2UoKSB7XG4gICAgICBpZiAoIXRoaXMuY2xvc2luZyB8fCB0aGlzLnN0YWNrLmxlbmd0aCA8IDIpIHJldHVybjtcbiAgICAgIHZhciBsZWZ0ID0gdGhpcy5sZWF2ZSgpO1xuICAgICAgdGhpcy5lbnRlcihsZWZ0LnR5cGUsIGxlZnQuYXR0cnMpO1xuICAgICAgdGhpcy5jbG9zaW5nID0gZmFsc2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImluc2VydFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnNlcnQobm9kZSkge1xuICAgICAgaWYgKHRoaXMudG9wLnR5cGUuY2FuQ29udGFpbihub2RlKSkge1xuICAgICAgICB0aGlzLmRvQ2xvc2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAodmFyIGkgPSB0aGlzLnN0YWNrLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgdmFyIHJvdXRlID0gdGhpcy5zdGFja1tpXS50eXBlLmZpbmRDb25uZWN0aW9uKG5vZGUudHlwZSk7XG4gICAgICAgICAgaWYgKCFyb3V0ZSkgY29udGludWU7XG4gICAgICAgICAgaWYgKGkgPT0gdGhpcy5zdGFjay5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICB0aGlzLmRvQ2xvc2UoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2hpbGUgKHRoaXMuc3RhY2subGVuZ3RoID4gaSArIDEpIHRoaXMubGVhdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCByb3V0ZS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdGhpcy5lbnRlcihyb3V0ZVtqXSk7XG4gICAgICAgICAgfWlmICh0aGlzLm1hcmtzLmxlbmd0aCkgdGhpcy5tYXJrcyA9IG5vTWFya3M7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMudG9wLmNvbnRlbnQucHVzaChub2RlKTtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIC8vIDo6IChET01Ob2RlLCBOb2RlVHlwZSwgP09iamVjdCwgW05vZGVdKSDihpIgTm9kZVxuICAgIC8vIEluc2VydCBhIG5vZGUgb2YgdGhlIGdpdmVuIHR5cGUsIHdpdGggdGhlIGdpdmVuIGNvbnRlbnQsIGJhc2VkIG9uXG4gICAgLy8gYGRvbWAsIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBkb2N1bWVudC5cbiAgfSwge1xuICAgIGtleTogXCJpbnNlcnRGcm9tXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluc2VydEZyb20oZG9tLCB0eXBlLCBhdHRycywgY29udGVudCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0KHR5cGUuY3JlYXRlQXV0b0ZpbGwodGhpcy5wYXJzZUF0dHJzKGRvbSwgdHlwZSwgYXR0cnMpLCBjb250ZW50LCB0aGlzLm1hcmtzKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVudGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVudGVyKHR5cGUsIGF0dHJzKSB7XG4gICAgICBpZiAodGhpcy5tYXJrcy5sZW5ndGgpIHRoaXMubWFya3MgPSBub01hcmtzO1xuICAgICAgdGhpcy5zdGFjay5wdXNoKHsgdHlwZTogdHlwZSwgYXR0cnM6IGF0dHJzLCBjb250ZW50OiBbXSB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZW50ZXJGcm9tXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVudGVyRnJvbShkb20sIHR5cGUsIGF0dHJzKSB7XG4gICAgICB0aGlzLmVudGVyKHR5cGUsIHRoaXMucGFyc2VBdHRycyhkb20sIHR5cGUsIGF0dHJzKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImxlYXZlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxlYXZlKCkge1xuICAgICAgdmFyIHRvcCA9IHRoaXMuc3RhY2sucG9wKCk7XG4gICAgICB2YXIgbm9kZSA9IHRvcC50eXBlLmNyZWF0ZUF1dG9GaWxsKHRvcC5hdHRycywgdG9wLmNvbnRlbnQpO1xuICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoKSB0aGlzLmluc2VydChub2RlKTtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzeW5jXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN5bmMoc3RhY2spIHtcbiAgICAgIHdoaWxlICh0aGlzLnN0YWNrLmxlbmd0aCA+IHN0YWNrLmxlbmd0aCkgdGhpcy5sZWF2ZSgpO1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICB2YXIgbiA9IHRoaXMuc3RhY2subGVuZ3RoIC0gMSxcbiAgICAgICAgICAgIG9uZSA9IHRoaXMuc3RhY2tbbl0sXG4gICAgICAgICAgICB0d28gPSBzdGFja1tuXTtcbiAgICAgICAgaWYgKG9uZS50eXBlID09IHR3by50eXBlICYmIF9tb2RlbC5Ob2RlLnNhbWVBdHRycyhvbmUuYXR0cnMsIHR3by5hdHRycykpIGJyZWFrO1xuICAgICAgICB0aGlzLmxlYXZlKCk7XG4gICAgICB9XG4gICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gdGhpcy5zdGFjay5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGFkZCA9IHN0YWNrW3RoaXMuc3RhY2subGVuZ3RoXTtcbiAgICAgICAgdGhpcy5lbnRlcihhZGQudHlwZSwgYWRkLmF0dHJzKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm1hcmtzLmxlbmd0aCkgdGhpcy5tYXJrcyA9IG5vTWFya3M7XG4gICAgICB0aGlzLmNsb3NpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyA6OiAoRE9NTm9kZSwgTm9kZVR5cGUsID9PYmplY3QpXG4gICAgLy8gUGFyc2UgdGhlIGNvbnRlbnRzIG9mIGBkb21gIGFzIGNoaWxkcmVuIG9mIGEgbm9kZSBvZiB0aGUgZ2l2ZW5cbiAgICAvLyB0eXBlLlxuICB9LCB7XG4gICAga2V5OiBcIndyYXBJblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB3cmFwSW4oZG9tLCB0eXBlLCBhdHRycykge1xuICAgICAgdGhpcy5lbnRlckZyb20oZG9tLCB0eXBlLCBhdHRycyk7XG4gICAgICB0aGlzLmFkZEFsbChkb20uZmlyc3RDaGlsZCwgbnVsbCwgdHJ1ZSk7XG4gICAgICB0aGlzLmxlYXZlKCk7XG4gICAgfVxuXG4gICAgLy8gOjogKERPTU5vZGUsIE1hcmspXG4gICAgLy8gUGFyc2UgdGhlIGNvbnRlbnRzIG9mIGBkb21gLCB3aXRoIGBtYXJrYCBhZGRlZCB0byB0aGUgc2V0IG9mXG4gICAgLy8gY3VycmVudCBtYXJrcy5cbiAgfSwge1xuICAgIGtleTogXCJ3cmFwTWFya1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB3cmFwTWFyayhkb20sIG1hcmspIHtcbiAgICAgIHZhciBvbGQgPSB0aGlzLm1hcmtzO1xuICAgICAgdGhpcy5tYXJrcyA9IChtYXJrLmluc3RhbmNlIHx8IG1hcmspLmFkZFRvU2V0KG9sZCk7XG4gICAgICB0aGlzLmFkZEFsbChkb20uZmlyc3RDaGlsZCwgbnVsbCk7XG4gICAgICB0aGlzLm1hcmtzID0gb2xkO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b3BcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIERPTVBhcnNlU3RhdGU7XG59KSgpO1xuXG5mdW5jdGlvbiBub2RlSW5mbyhzY2hlbWEpIHtcbiAgcmV0dXJuIHNjaGVtYS5jYWNoZWQucGFyc2VET01Ob2RlcyB8fCAoc2NoZW1hLmNhY2hlZC5wYXJzZURPTU5vZGVzID0gc3VtbWFyaXplTm9kZUluZm8oc2NoZW1hKSk7XG59XG5cbmZ1bmN0aW9uIHN1bW1hcml6ZU5vZGVJbmZvKHNjaGVtYSkge1xuICB2YXIgdGFncyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHRhZ3MuXyA9IFtdO1xuICBzY2hlbWEucmVnaXN0cnkoXCJwYXJzZURPTVwiLCBmdW5jdGlvbiAoaW5mbywgdHlwZSkge1xuICAgIHZhciB0YWcgPSBpbmZvLnRhZyB8fCBcIl9cIjtcbiAgICB2YXIgcGFyc2UgPSBpbmZvLnBhcnNlO1xuICAgIGlmIChwYXJzZSA9PSBcImJsb2NrXCIpIHBhcnNlID0gZnVuY3Rpb24gKGRvbSwgc3RhdGUpIHtcbiAgICAgIHN0YXRlLndyYXBJbihkb20sIHRoaXMpO1xuICAgIH07ZWxzZSBpZiAocGFyc2UgPT0gXCJtYXJrXCIpIHBhcnNlID0gZnVuY3Rpb24gKGRvbSwgc3RhdGUpIHtcbiAgICAgIHN0YXRlLndyYXBNYXJrKGRvbSwgdGhpcyk7XG4gICAgfTsodGFnc1t0YWddIHx8ICh0YWdzW3RhZ10gPSBbXSkpLnB1c2goe1xuICAgICAgdHlwZTogdHlwZSwgcGFyc2U6IHBhcnNlLFxuICAgICAgcmFuazogaW5mby5yYW5rID09IG51bGwgPyA1MCA6IGluZm8ucmFua1xuICAgIH0pO1xuICB9KTtcbiAgZm9yICh2YXIgdGFnIGluIHRhZ3MpIHtcbiAgICB0YWdzW3RhZ10uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEucmFuayAtIGIucmFuaztcbiAgICB9KTtcbiAgfXJldHVybiB0YWdzO1xufVxuXG5fbW9kZWwuUGFyYWdyYXBoLnJlZ2lzdGVyKFwicGFyc2VET01cIiwgeyB0YWc6IFwicFwiLCBwYXJzZTogXCJibG9ja1wiIH0pO1xuXG5fbW9kZWwuQmxvY2tRdW90ZS5yZWdpc3RlcihcInBhcnNlRE9NXCIsIHsgdGFnOiBcImJsb2NrcXVvdGVcIiwgcGFyc2U6IFwiYmxvY2tcIiB9KTtcblxudmFyIF9sb29wID0gZnVuY3Rpb24gKGkpIHtcbiAgX21vZGVsLkhlYWRpbmcucmVnaXN0ZXIoXCJwYXJzZURPTVwiLCB7XG4gICAgdGFnOiBcImhcIiArIGksXG4gICAgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlKGRvbSwgc3RhdGUpIHtcbiAgICAgIHN0YXRlLndyYXBJbihkb20sIHRoaXMsIHsgbGV2ZWw6IGkgfSk7XG4gICAgfVxuICB9KTtcbn07XG5cbmZvciAodmFyIGkgPSAxOyBpIDw9IDY7IGkrKykge1xuICBfbG9vcChpKTtcbn1fbW9kZWwuSG9yaXpvbnRhbFJ1bGUucmVnaXN0ZXIoXCJwYXJzZURPTVwiLCB7IHRhZzogXCJoclwiLCBwYXJzZTogXCJibG9ja1wiIH0pO1xuXG5fbW9kZWwuQ29kZUJsb2NrLnJlZ2lzdGVyKFwicGFyc2VET01cIiwgeyB0YWc6IFwicHJlXCIsIHBhcnNlOiBmdW5jdGlvbiBwYXJzZShkb20sIHN0YXRlKSB7XG4gICAgdmFyIHBhcmFtcyA9IGRvbS5maXJzdENoaWxkICYmIC9eY29kZSQvaS50ZXN0KGRvbS5maXJzdENoaWxkLm5vZGVOYW1lKSAmJiBkb20uZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKTtcbiAgICBpZiAocGFyYW1zICYmIC9mZW5jZS8udGVzdChwYXJhbXMpKSB7XG4gICAgICB2YXIgZm91bmQgPSBbXSxcbiAgICAgICAgICByZSA9IC8oPzpefFxccylsYW5nLShcXFMrKS9nLFxuICAgICAgICAgIG0gPSB1bmRlZmluZWQ7XG4gICAgICB3aGlsZSAobSA9IHJlLnRlc3QocGFyYW1zKSkgZm91bmQucHVzaChtWzFdKTtcbiAgICAgIHBhcmFtcyA9IGZvdW5kLmpvaW4oXCIgXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJhbXMgPSBudWxsO1xuICAgIH1cbiAgICB2YXIgdGV4dCA9IGRvbS50ZXh0Q29udGVudDtcbiAgICBzdGF0ZS5pbnNlcnRGcm9tKGRvbSwgdGhpcywgeyBwYXJhbXM6IHBhcmFtcyB9LCB0ZXh0ID8gW3N0YXRlLnNjaGVtYS50ZXh0KHRleHQpXSA6IFtdKTtcbiAgfSB9KTtcblxuX21vZGVsLkJ1bGxldExpc3QucmVnaXN0ZXIoXCJwYXJzZURPTVwiLCB7IHRhZzogXCJ1bFwiLCBwYXJzZTogXCJibG9ja1wiIH0pO1xuXG5fbW9kZWwuT3JkZXJlZExpc3QucmVnaXN0ZXIoXCJwYXJzZURPTVwiLCB7IHRhZzogXCJvbFwiLCBwYXJzZTogZnVuY3Rpb24gcGFyc2UoZG9tLCBzdGF0ZSkge1xuICAgIHZhciBhdHRycyA9IHsgb3JkZXI6IGRvbS5nZXRBdHRyaWJ1dGUoXCJzdGFydFwiKSB8fCAxIH07XG4gICAgc3RhdGUud3JhcEluKGRvbSwgdGhpcywgYXR0cnMpO1xuICB9IH0pO1xuXG5fbW9kZWwuTGlzdEl0ZW0ucmVnaXN0ZXIoXCJwYXJzZURPTVwiLCB7IHRhZzogXCJsaVwiLCBwYXJzZTogXCJibG9ja1wiIH0pO1xuXG5fbW9kZWwuSGFyZEJyZWFrLnJlZ2lzdGVyKFwicGFyc2VET01cIiwgeyB0YWc6IFwiYnJcIiwgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlKGRvbSwgc3RhdGUpIHtcbiAgICBzdGF0ZS5pbnNlcnRGcm9tKGRvbSwgdGhpcyk7XG4gIH0gfSk7XG5cbl9tb2RlbC5JbWFnZS5yZWdpc3RlcihcInBhcnNlRE9NXCIsIHsgdGFnOiBcImltZ1wiLCBwYXJzZTogZnVuY3Rpb24gcGFyc2UoZG9tLCBzdGF0ZSkge1xuICAgIHN0YXRlLmluc2VydEZyb20oZG9tLCB0aGlzLCB7XG4gICAgICBzcmM6IGRvbS5nZXRBdHRyaWJ1dGUoXCJzcmNcIiksXG4gICAgICB0aXRsZTogZG9tLmdldEF0dHJpYnV0ZShcInRpdGxlXCIpIHx8IG51bGwsXG4gICAgICBhbHQ6IGRvbS5nZXRBdHRyaWJ1dGUoXCJhbHRcIikgfHwgbnVsbFxuICAgIH0pO1xuICB9IH0pO1xuXG4vLyBJbmxpbmUgc3R5bGUgdG9rZW5zXG5cbl9tb2RlbC5MaW5rTWFyay5yZWdpc3RlcihcInBhcnNlRE9NXCIsIHsgdGFnOiBcImFcIiwgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlKGRvbSwgc3RhdGUpIHtcbiAgICB2YXIgaHJlZiA9IGRvbS5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpO1xuICAgIGlmICghaHJlZikgcmV0dXJuIGZhbHNlO1xuICAgIHN0YXRlLndyYXBNYXJrKGRvbSwgdGhpcy5jcmVhdGUoeyBocmVmOiBocmVmLCB0aXRsZTogZG9tLmdldEF0dHJpYnV0ZShcInRpdGxlXCIpIH0pKTtcbiAgfSB9KTtcblxuX21vZGVsLkVtTWFyay5yZWdpc3RlcihcInBhcnNlRE9NXCIsIHsgdGFnOiBcImlcIiwgcGFyc2U6IFwibWFya1wiIH0pO1xuX21vZGVsLkVtTWFyay5yZWdpc3RlcihcInBhcnNlRE9NXCIsIHsgdGFnOiBcImVtXCIsIHBhcnNlOiBcIm1hcmtcIiB9KTtcblxuX21vZGVsLlN0cm9uZ01hcmsucmVnaXN0ZXIoXCJwYXJzZURPTVwiLCB7IHRhZzogXCJiXCIsIHBhcnNlOiBcIm1hcmtcIiB9KTtcbl9tb2RlbC5TdHJvbmdNYXJrLnJlZ2lzdGVyKFwicGFyc2VET01cIiwgeyB0YWc6IFwic3Ryb25nXCIsIHBhcnNlOiBcIm1hcmtcIiB9KTtcblxuX21vZGVsLkNvZGVNYXJrLnJlZ2lzdGVyKFwicGFyc2VET01cIiwgeyB0YWc6IFwiY29kZVwiLCBwYXJzZTogXCJtYXJrXCIgfSk7IiwiLy8gISEgVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBhIHdheSB0byByZWdpc3RlciBhbmQgYWNjZXNzIHBhcnNlcnMgZnJvbVxuLy8gdmFyaW91cyBpbnB1dCBmb3JtYXRzIHRvIFByb3NlTWlycm9yJ3MgW2RvY3VtZW50IGZvcm1hdF0oI05vZGUpLiBUb1xuLy8gbG9hZCB0aGUgYWN0dWFsIHBhcnNlcnMsIHlvdSBuZWVkIHRvIGltcG9ydCBwYXJzZXIgbW9kdWxlcyBsaWtlXG4vLyBgcGFyc2UvZG9tYCBvciBgcGFyc2UvbWFya2Rvd25gLCB3aGljaCB3aWxsIHRoZW4gcmVnaXN0ZXJcbi8vIHRoZW1zZWx2ZXMgaGVyZSwgYXMgd2VsbCBhcyBleHBvcnQgc3BlY2lhbC1wdXJwb3NlIHBhcnNpbmdcbi8vIGZ1bmN0aW9ucy5cbi8vXG4vLyBUaGVzZSBhcmUgdGhlIHBhcnNlcyBpbiB0aGUgZGlzdHJpYnV0aW9uOlxuLy9cbi8vICoqYFwianNvblwiYCoqXG4vLyAgIDogVGhlIHRvcC1sZXZlbCBtb2R1bGUgZGVmaW5lcyBhIHNpbmdsZSBwYXJzZXIgYFwianNvblwiYCwgd2hpY2hcbi8vICAgICB1c2VzIGBOb2RlLmZyb21KU09OYCB0byBwYXJzZSBKU09OIGRhdGEuXG4vL1xuLy8gKipgXCJkb21cImAqKlxuLy8gICA6IFBhcnNlcyBbRE9NXG4vLyAgICAgbm9kZXNdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Ob2RlKS5cbi8vICAgICBEZWZpbmVkIGluIGBwYXJzZS9kb21gLiBTZWUgYGZyb21ET01gLlxuLy9cbi8vICoqYFwiaHRtbFwiYCoqXG4vLyAgIDogUGFyc2VzIHN0cmluZ3Mgb2YgSFRNTCBjb250ZW50LiBEZWZpbmVkIGluIGBwYXJzZS9kb21gLlxuLy9cbi8vICoqYFwibWFya2Rvd25cImAqKlxuLy8gICA6IFBhcnNlcyBzdHJpbmdzIG9mXG4vLyAgICAgW0NvbW1vbk1hcmtdKGh0dHA6Ly9jb21tb25tYXJrLm9yZy8pLWZvcm1hdHRlZCB0ZXh0LiBEZWZpbmVkIGluXG4vLyAgICAgYHBhcnNlL21hcmtkb3duYC4gU2VlIGBmcm9tTWFya2Rvd25gLlxuLy9cbi8vICoqYFwidGV4dFwiYCoqXG4vLyAgIDogU2ltcGx5IHNwbGl0cyBhIHN0cmluZyBvZiB0ZXh0IG9uIGJsYW5rIGxpbmVzIGFuZCBjcmVhdGVzIGFcbi8vICAgICBkb2N1bWVudCBjb250YWluaW5nIHRob3NlIGxpbmVzIGFzIHBhcmFncmFwaHMuIERlZmluZWQgaW5cbi8vICAgICBgcGFyc2UvdGV4dGAuIFNlZSBgZnJvbVRleHRgLlxuXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMucGFyc2VGcm9tID0gcGFyc2VGcm9tO1xuZXhwb3J0cy5rbm93blNvdXJjZSA9IGtub3duU291cmNlO1xuZXhwb3J0cy5kZWZpbmVTb3VyY2UgPSBkZWZpbmVTb3VyY2U7XG52YXIgcGFyc2VycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbi8vIDo6IChTY2hlbWEsIGFueSwgc3RyaW5nLCA/T2JqZWN0KSDihpIgTm9kZVxuLy8gUGFyc2UgZG9jdW1lbnQgYHZhbHVlYCBmcm9tIHRoZSBmb3JtYXQgbmFtZWQgYnkgYGZvcm1hdGAuIElmXG4vLyBgb3B0aW9uc2AgaXMgZ2l2ZW4sIGl0IGlzIHBhc3NlZCBhbG9uZyB0byB0aGUgcGFyc2VyIGZ1bmN0aW9uLlxuXG5mdW5jdGlvbiBwYXJzZUZyb20oc2NoZW1hLCB2YWx1ZSwgZm9ybWF0LCBvcHRpb25zKSB7XG4gIHZhciBjb252ZXJ0ZXIgPSBwYXJzZXJzW2Zvcm1hdF07XG4gIGlmICghY29udmVydGVyKSB0aHJvdyBuZXcgRXJyb3IoXCJTb3VyY2UgZm9ybWF0IFwiICsgZm9ybWF0ICsgXCIgbm90IGRlZmluZWRcIik7XG4gIHJldHVybiBjb252ZXJ0ZXIoc2NoZW1hLCB2YWx1ZSwgb3B0aW9ucyk7XG59XG5cbi8vIDo6IChzdHJpbmcpIOKGkiBib29sXG4vLyBRdWVyeSB3aGV0aGVyIGEgcGFyc2VyIGZvciB0aGUgbmFtZWQgZm9ybWF0IGhhcyBiZWVuIHJlZ2lzdGVyZWQuXG5cbmZ1bmN0aW9uIGtub3duU291cmNlKGZvcm1hdCkge1xuICByZXR1cm4gISFwYXJzZXJzW2Zvcm1hdF07XG59XG5cbi8vIDo6IChzdHJpbmcsIChTY2hlbWEsIGFueSwgP09iamVjdCkg4oaSIE5vZGUpXG4vLyBSZWdpc3RlciBhIHBhcnNlciBmdW5jdGlvbiBmb3IgYGZvcm1hdGAuXG5cbmZ1bmN0aW9uIGRlZmluZVNvdXJjZShmb3JtYXQsIGZ1bmMpIHtcbiAgcGFyc2Vyc1tmb3JtYXRdID0gZnVuYztcbn1cblxuZGVmaW5lU291cmNlKFwianNvblwiLCBmdW5jdGlvbiAoc2NoZW1hLCBqc29uKSB7XG4gIHJldHVybiBzY2hlbWEubm9kZUZyb21KU09OKGpzb24pO1xufSk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmZyb21UZXh0ID0gZnJvbVRleHQ7XG5cbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9pbmRleFwiKTtcblxuLy8gRklYTUUgaXMgaXQgbWVhbmluZ2Z1bCB0byB0cnkgYW5kIGF0dGFjaCB0ZXh0LXBhcnNpbmcgaW5mb3JtYXRpb25cbi8vIHRvIG5vZGUgdHlwZXM/XG5cbi8vIDo6IChTY2hlbWEsIHN0cmluZykg4oaSIE5vZGVcbi8vIENvbnZlcnQgYSBzdHJpbmcgaW50byBhIHNpbXBsZSBQcm9zZU1pcnJvciBkb2N1bWVudC5cblxuZnVuY3Rpb24gZnJvbVRleHQoc2NoZW1hLCB0ZXh0KSB7XG4gIHZhciBibG9ja3MgPSB0ZXh0LnRyaW0oKS5zcGxpdCgvXFxuezIsfS8pO1xuICB2YXIgbm9kZXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc3BhbnMgPSBbXTtcbiAgICB2YXIgcGFydHMgPSBibG9ja3NbaV0uc3BsaXQoXCJcXG5cIik7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBwYXJ0cy5sZW5ndGg7IGorKykge1xuICAgICAgaWYgKGopIHNwYW5zLnB1c2goc2NoZW1hLm5vZGUoXCJoYXJkX2JyZWFrXCIpKTtcbiAgICAgIGlmIChwYXJ0c1tqXSkgc3BhbnMucHVzaChzY2hlbWEudGV4dChwYXJ0c1tqXSkpO1xuICAgIH1cbiAgICBub2Rlcy5wdXNoKHNjaGVtYS5ub2RlKFwicGFyYWdyYXBoXCIsIG51bGwsIHNwYW5zKSk7XG4gIH1cbiAgaWYgKCFub2Rlcy5sZW5ndGgpIG5vZGVzLnB1c2goc2NoZW1hLm5vZGUoXCJwYXJhZ3JhcGhcIikpO1xuICByZXR1cm4gc2NoZW1hLm5vZGUoXCJkb2NcIiwgbnVsbCwgbm9kZXMpO1xufVxuXG4oMCwgX2luZGV4LmRlZmluZVNvdXJjZSkoXCJ0ZXh0XCIsIGZyb21UZXh0KTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5leHBvcnRzLnRvRE9NID0gdG9ET007XG5leHBvcnRzLnJlbmRlck5vZGVUb0RPTSA9IHJlbmRlck5vZGVUb0RPTTtcbmV4cG9ydHMudG9IVE1MID0gdG9IVE1MO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgX21vZGVsID0gcmVxdWlyZShcIi4uL21vZGVsXCIpO1xuXG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vaW5kZXhcIik7XG5cbi8vIDs7ICN0b2M9ZmFsc2UgT2JqZWN0IHVzZWQgdG8gdG8gZXhwb3NlIHJlbGV2YW50IHZhbHVlcyBhbmQgbWV0aG9kc1xuLy8gdG8gRE9NIHNlcmlhbGl6ZXIgZnVuY3Rpb25zLlxuXG52YXIgRE9NU2VyaWFsaXplciA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIERPTVNlcmlhbGl6ZXIob3B0aW9ucykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBET01TZXJpYWxpemVyKTtcblxuICAgIC8vIDo6IE9iamVjdCBUaGUgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIHNlcmlhbGl6ZXIuXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAvLyA6OiBET01Eb2N1bWVudCBUaGUgRE9NIGRvY3VtZW50IGluIHdoaWNoIHdlIGFyZSB3b3JraW5nLlxuICAgIHRoaXMuZG9jID0gdGhpcy5vcHRpb25zLmRvY3VtZW50IHx8IHdpbmRvdy5kb2N1bWVudDtcbiAgfVxuXG4gIC8vIDo6IChOb2RlLCA/T2JqZWN0KSDihpIgRE9NRnJhZ21lbnRcbiAgLy8gU2VyaWFsaXplIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBub2RlIHRvIGEgRE9NIGZyYWdtZW50LiBXaGVuIG5vdFxuICAvLyBpbiB0aGUgYnJvd3NlciwgdGhlIGBkb2N1bWVudGAgb3B0aW9uLCBjb250YWluaW5nIGEgRE9NIGRvY3VtZW50LFxuICAvLyBzaG91bGQgYmUgcGFzc2VkIHNvIHRoYXQgdGhlIHNlcmlhbGl6ZSBjYW4gY3JlYXRlIG5vZGVzLlxuICAvL1xuICAvLyBUbyBkZWZpbmUgcmVuZGVyaW5nIGJlaGF2aW9yIGZvciB5b3VyIG93biBbbm9kZV0oI05vZGVUeXBlKSBhbmRcbiAgLy8gW21hcmtdKCNNYXJrVHlwZSkgdHlwZXMsIGdpdmUgdGhlbSBhIGBzZXJpYWxpemVET01gIG1ldGhvZC4gVGhpc1xuICAvLyBtZXRob2QgaXMgcGFzc2VkIGEgYE5vZGVgIGFuZCBhIGBET01TZXJpYWxpemVyYCwgYW5kIHNob3VsZCByZXR1cm5cbiAgLy8gdGhlIFtET01cbiAgLy8gbm9kZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL05vZGUpIHRoYXRcbiAgLy8gcmVwcmVzZW50cyB0aGlzIG5vZGUgYW5kIGl0cyBjb250ZW50LiBGb3IgbWFya3MsIHRoYXQgc2hvdWxkIGJlIGFuXG4gIC8vIGlubGluZSB3cmFwcGluZyBub2RlIGxpa2UgYDxhPmAgb3IgYDxzdHJvbmc+YC5cbiAgLy9cbiAgLy8gSW5kaXZpZHVhbCBhdHRyaWJ1dGVzIGNhbiBhbHNvIGRlZmluZSBzZXJpYWxpemF0aW9uIGJlaGF2aW9yLiBJZiBhblxuICAvLyBgQXR0cmlidXRlYCBvYmplY3QgaGFzIGEgYHNlcmlhbGl6ZURPTWAgbWV0aG9kLCB0aGF0IHdpbGwgYmUgY2FsbGVkXG4gIC8vIHdpdGggdGhlIERPTSBub2RlIHJlcHJlc2VudGluZyB0aGUgbm9kZSB0aGF0IHRoZSBhdHRyaWJ1dGUgYXBwbGllc1xuICAvLyB0byBhbmQgdGhlIGF0dHRyaWJ1dGUncyB2YWx1ZSwgc28gdGhhdCBpdCBjYW4gc2V0IGFkZGl0aW9uYWwgRE9NXG4gIC8vIGF0dHJpYnV0ZXMgb24gdGhlIERPTSBub2RlLlxuXG4gIC8vIDo6IChzdHJpbmcsID9PYmplY3QsIC4uLnVuaW9uPHN0cmluZywgRE9NTm9kZT4pIOKGkiBET01Ob2RlXG4gIC8vIENyZWF0ZSBhIERPTSBub2RlIG9mIHRoZSBnaXZlbiB0eXBlLCB3aXRoIChvcHRpb25hbGx5KSB0aGUgZ2l2ZW5cbiAgLy8gYXR0cmlidXRlcyBhbmQgY29udGVudC4gQ29udGVudCBlbGVtZW50cyBtYXkgYmUgc3RyaW5ncyAoZm9yIHRleHRcbiAgLy8gbm9kZXMpIG9yIG90aGVyIERPTSBub2Rlcy5cblxuICBfY3JlYXRlQ2xhc3MoRE9NU2VyaWFsaXplciwgW3tcbiAgICBrZXk6IFwiZWx0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVsdCh0eXBlLCBhdHRycykge1xuICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuZG9jLmNyZWF0ZUVsZW1lbnQodHlwZSk7XG4gICAgICBpZiAoYXR0cnMpIGZvciAodmFyIF9uYW1lIGluIGF0dHJzKSB7XG4gICAgICAgIGlmIChfbmFtZSA9PSBcInN0eWxlXCIpIHJlc3VsdC5zdHlsZS5jc3NUZXh0ID0gYXR0cnNbX25hbWVdO2Vsc2UgaWYgKGF0dHJzW19uYW1lXSkgcmVzdWx0LnNldEF0dHJpYnV0ZShfbmFtZSwgYXR0cnNbX25hbWVdKTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGNvbnRlbnQgPSBBcnJheShfbGVuID4gMiA/IF9sZW4gLSAyIDogMCksIF9rZXkgPSAyOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGNvbnRlbnRbX2tleSAtIDJdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbnRlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzdWx0LmFwcGVuZENoaWxkKHR5cGVvZiBjb250ZW50W2ldID09IFwic3RyaW5nXCIgPyB0aGlzLmRvYy5jcmVhdGVUZXh0Tm9kZShjb250ZW50W2ldKSA6IGNvbnRlbnRbaV0pO1xuICAgICAgfXJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlck5vZGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyTm9kZShub2RlLCBvZmZzZXQpIHtcbiAgICAgIHZhciBkb20gPSBub2RlLnR5cGUuc2VyaWFsaXplRE9NKG5vZGUsIHRoaXMpO1xuICAgICAgZm9yICh2YXIgYXR0ciBpbiBub2RlLnR5cGUuYXR0cnMpIHtcbiAgICAgICAgdmFyIGRlc2MgPSBub2RlLnR5cGUuYXR0cnNbYXR0cl07XG4gICAgICAgIGlmIChkZXNjLnNlcmlhbGl6ZURPTSkgZGVzYy5zZXJpYWxpemVET00oZG9tLCBub2RlLmF0dHJzW2F0dHJdLCB0aGlzLCBub2RlKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25SZW5kZXIpIGRvbSA9IHRoaXMub3B0aW9ucy5vblJlbmRlcihub2RlLCBkb20sIG9mZnNldCkgfHwgZG9tO1xuICAgICAgcmV0dXJuIGRvbTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyQ29udGVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJDb250ZW50KG5vZGUsIHdoZXJlKSB7XG4gICAgICBpZiAoIXdoZXJlKSB3aGVyZSA9IHRoaXMuZG9jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICAgIGlmICghbm9kZS5pc1RleHRibG9jaykgdGhpcy5yZW5kZXJCbG9ja3NJbnRvKG5vZGUsIHdoZXJlKTtlbHNlIGlmICh0aGlzLm9wdGlvbnMucmVuZGVySW5saW5lRmxhdCkgdGhpcy5yZW5kZXJJbmxpbmVGbGF0SW50byhub2RlLCB3aGVyZSk7ZWxzZSB0aGlzLnJlbmRlcklubGluZUludG8obm9kZSwgd2hlcmUpO1xuICAgICAgcmV0dXJuIHdoZXJlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJCbG9ja3NJbnRvXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlckJsb2Nrc0ludG8ocGFyZW50LCB3aGVyZSkge1xuICAgICAgZm9yICh2YXIgaSA9IHBhcmVudC5pdGVyKCksIGNoaWxkID0gdW5kZWZpbmVkOyBjaGlsZCA9IGkubmV4dCgpLnZhbHVlOykge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBhdGgpIHRoaXMub3B0aW9ucy5wYXRoLnB1c2goaS5vZmZzZXQgLSBjaGlsZC53aWR0aCk7XG4gICAgICAgIHdoZXJlLmFwcGVuZENoaWxkKHRoaXMucmVuZGVyTm9kZShjaGlsZCwgaS5vZmZzZXQgLSBjaGlsZC53aWR0aCkpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBhdGgpIHRoaXMub3B0aW9ucy5wYXRoLnBvcCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJJbmxpbmVJbnRvXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcklubGluZUludG8ocGFyZW50LCB3aGVyZSkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIHRvcCA9IHdoZXJlO1xuICAgICAgdmFyIGFjdGl2ZSA9IFtdO1xuICAgICAgcGFyZW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGUsIG9mZnNldCkge1xuICAgICAgICB2YXIga2VlcCA9IDA7XG4gICAgICAgIGZvciAoOyBrZWVwIDwgTWF0aC5taW4oYWN0aXZlLmxlbmd0aCwgbm9kZS5tYXJrcy5sZW5ndGgpOyArK2tlZXApIGlmICghbm9kZS5tYXJrc1trZWVwXS5lcShhY3RpdmVba2VlcF0pKSBicmVhaztcbiAgICAgICAgd2hpbGUgKGtlZXAgPCBhY3RpdmUubGVuZ3RoKSB7XG4gICAgICAgICAgYWN0aXZlLnBvcCgpO1xuICAgICAgICAgIHRvcCA9IHRvcC5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChhY3RpdmUubGVuZ3RoIDwgbm9kZS5tYXJrcy5sZW5ndGgpIHtcbiAgICAgICAgICB2YXIgYWRkID0gbm9kZS5tYXJrc1thY3RpdmUubGVuZ3RoXTtcbiAgICAgICAgICBhY3RpdmUucHVzaChhZGQpO1xuICAgICAgICAgIHRvcCA9IHRvcC5hcHBlbmRDaGlsZChfdGhpcy5yZW5kZXJNYXJrKGFkZCkpO1xuICAgICAgICB9XG4gICAgICAgIHRvcC5hcHBlbmRDaGlsZChfdGhpcy5yZW5kZXJOb2RlKG5vZGUsIG9mZnNldCkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlcklubGluZUZsYXRJbnRvXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcklubGluZUZsYXRJbnRvKHBhcmVudCwgd2hlcmUpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICBwYXJlbnQuZm9yRWFjaChmdW5jdGlvbiAobm9kZSwgc3RhcnQpIHtcbiAgICAgICAgdmFyIGRvbSA9IF90aGlzMi5yZW5kZXJOb2RlKG5vZGUsIHN0YXJ0KTtcbiAgICAgICAgZG9tID0gX3RoaXMyLndyYXBJbmxpbmVGbGF0KGRvbSwgbm9kZS5tYXJrcyk7XG4gICAgICAgIGRvbSA9IF90aGlzMi5vcHRpb25zLnJlbmRlcklubGluZUZsYXQobm9kZSwgZG9tLCBzdGFydCkgfHwgZG9tO1xuICAgICAgICB3aGVyZS5hcHBlbmRDaGlsZChkb20pO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlck1hcmtcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyTWFyayhtYXJrKSB7XG4gICAgICB2YXIgZG9tID0gbWFyay50eXBlLnNlcmlhbGl6ZURPTShtYXJrLCB0aGlzKTtcbiAgICAgIGZvciAodmFyIGF0dHIgaW4gbWFyay50eXBlLmF0dHJzKSB7XG4gICAgICAgIHZhciBkZXNjID0gbWFyay50eXBlLmF0dHJzW2F0dHJdO1xuICAgICAgICBpZiAoZGVzYy5zZXJpYWxpemVET00pIGRlc2Muc2VyaWFsaXplRE9NKGRvbSwgbWFyay5hdHRyc1thdHRyXSwgdGhpcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZG9tO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ3cmFwSW5saW5lRmxhdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB3cmFwSW5saW5lRmxhdChkb20sIG1hcmtzKSB7XG4gICAgICBmb3IgKHZhciBpID0gbWFya3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIHdyYXAgPSB0aGlzLnJlbmRlck1hcmsobWFya3NbaV0pO1xuICAgICAgICB3cmFwLmFwcGVuZENoaWxkKGRvbSk7XG4gICAgICAgIGRvbSA9IHdyYXA7XG4gICAgICB9XG4gICAgICByZXR1cm4gZG9tO1xuICAgIH1cblxuICAgIC8vIDo6IChOb2RlLCBzdHJpbmcsID9PYmplY3QpIOKGkiBET01Ob2RlXG4gICAgLy8gUmVuZGVyIHRoZSBjb250ZW50IG9mIFByb3NlTWlycm9yIG5vZGUgaW50byBhIERPTSBub2RlIHdpdGggdGhlXG4gICAgLy8gZ2l2ZW4gdGFnIG5hbWUgYW5kIGF0dHJpYnV0ZXMuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyQXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyQXMobm9kZSwgdGFnTmFtZSwgdGFnQXR0cnMpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlckNvbnRlbnQobm9kZSwgdGhpcy5lbHQodGFnTmFtZSwgdGFnQXR0cnMpKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRE9NU2VyaWFsaXplcjtcbn0pKCk7XG5cbmZ1bmN0aW9uIHRvRE9NKG5vZGUpIHtcbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1sxXTtcblxuICByZXR1cm4gbmV3IERPTVNlcmlhbGl6ZXIob3B0aW9ucykucmVuZGVyQ29udGVudChub2RlKTtcbn1cblxuKDAsIF9pbmRleC5kZWZpbmVUYXJnZXQpKFwiZG9tXCIsIHRvRE9NKTtcblxuLy8gOjogKE5vZGUsID9PYmplY3QpIOKGkiBET01Ob2RlXG4vLyBTZXJpYWxpemUgYSBnaXZlbiBub2RlIHRvIGEgRE9NIG5vZGUuIFRoaXMgaXMgdXNlZnVsIHdoZW4geW91IG5lZWRcbi8vIHRvIHNlcmlhbGl6ZSBhIHBhcnQgb2YgYSBkb2N1bWVudCwgYXMgb3Bwb3NlZCB0byB0aGUgd2hvbGVcbi8vIGRvY3VtZW50LlxuXG5mdW5jdGlvbiByZW5kZXJOb2RlVG9ET00obm9kZSwgb3B0aW9ucywgb2Zmc2V0KSB7XG4gIHZhciBzZXJpYWxpemVyID0gbmV3IERPTVNlcmlhbGl6ZXIob3B0aW9ucyk7XG4gIHZhciBkb20gPSBzZXJpYWxpemVyLnJlbmRlck5vZGUobm9kZSwgb2Zmc2V0KTtcbiAgaWYgKG5vZGUuaXNJbmxpbmUpIHtcbiAgICBkb20gPSBzZXJpYWxpemVyLndyYXBJbmxpbmVGbGF0KGRvbSwgbm9kZS5tYXJrcyk7XG4gICAgaWYgKHNlcmlhbGl6ZXIub3B0aW9ucy5yZW5kZXJJbmxpbmVGbGF0KSBkb20gPSBvcHRpb25zLnJlbmRlcklubGluZUZsYXQobm9kZSwgZG9tLCBvZmZzZXQpIHx8IGRvbTtcbiAgfVxuICByZXR1cm4gZG9tO1xufVxuXG4vLyA6OiAoTm9kZSwgP09iamVjdCkg4oaSIHN0cmluZ1xuLy8gU2VyaWFsaXplIGEgbm9kZSBhcyBhbiBIVE1MIHN0cmluZy4gR29lcyB0aHJvdWdoIGB0b0RPTWAgYW5kIHRoZW5cbi8vIHNlcmlhbGl6ZXMgdGhlIHJlc3VsdC4gQWdhaW4sIHlvdSBtdXN0IHBhc3MgYSBgZG9jdW1lbnRgIG9wdGlvblxuLy8gd2hlbiBub3QgaW4gdGhlIGJyb3dzZXIuXG5cbmZ1bmN0aW9uIHRvSFRNTChub2RlLCBvcHRpb25zKSB7XG4gIHZhciBzZXJpYWxpemVyID0gbmV3IERPTVNlcmlhbGl6ZXIob3B0aW9ucyk7XG4gIHZhciB3cmFwID0gc2VyaWFsaXplci5lbHQoXCJkaXZcIik7XG4gIHdyYXAuYXBwZW5kQ2hpbGQoc2VyaWFsaXplci5yZW5kZXJDb250ZW50KG5vZGUpKTtcbiAgcmV0dXJuIHdyYXAuaW5uZXJIVE1MO1xufVxuXG4oMCwgX2luZGV4LmRlZmluZVRhcmdldCkoXCJodG1sXCIsIHRvSFRNTCk7XG5cbi8vIEJsb2NrIG5vZGVzXG5cbmZ1bmN0aW9uIGRlZihjbHMsIG1ldGhvZCkge1xuICBjbHMucHJvdG90eXBlLnNlcmlhbGl6ZURPTSA9IG1ldGhvZDtcbn1cblxuZGVmKF9tb2RlbC5CbG9ja1F1b3RlLCBmdW5jdGlvbiAobm9kZSwgcykge1xuICByZXR1cm4gcy5yZW5kZXJBcyhub2RlLCBcImJsb2NrcXVvdGVcIik7XG59KTtcblxuX21vZGVsLkJsb2NrUXVvdGUucHJvdG90eXBlLmNvdW50Q29vcmRzQXNDaGlsZCA9IGZ1bmN0aW9uIChfLCBwYXRoLCBkb20sIGNvb3Jkcykge1xuICB2YXIgY2hpbGRCb3ggPSBkb20uZmlyc3RDaGlsZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgaWYgKGNvb3Jkcy5sZWZ0IDwgY2hpbGRCb3gubGVmdCAtIDIpIHJldHVybiBfbW9kZWwuUG9zLmZyb20ocGF0aCk7XG59O1xuXG5kZWYoX21vZGVsLkJ1bGxldExpc3QsIGZ1bmN0aW9uIChub2RlLCBzKSB7XG4gIHJldHVybiBzLnJlbmRlckFzKG5vZGUsIFwidWxcIik7XG59KTtcblxuZGVmKF9tb2RlbC5PcmRlcmVkTGlzdCwgZnVuY3Rpb24gKG5vZGUsIHMpIHtcbiAgcmV0dXJuIHMucmVuZGVyQXMobm9kZSwgXCJvbFwiLCB7IHN0YXJ0OiBub2RlLmF0dHJzLm9yZGVyICE9IFwiMVwiICYmIG5vZGUuYXR0cnMub3JkZXIgfSk7XG59KTtcblxuX21vZGVsLk9yZGVyZWRMaXN0LnByb3RvdHlwZS5jb3VudENvb3Jkc0FzQ2hpbGQgPSBfbW9kZWwuQnVsbGV0TGlzdC5wcm90b3R5cGUuY291bnRDb29yZHNBc0NoaWxkID0gZnVuY3Rpb24gKF8sIHBhdGgsIGRvbSwgY29vcmRzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZG9tLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY2hpbGQgPSBkb20uY2hpbGROb2Rlc1tpXTtcbiAgICBpZiAoIWNoaWxkLmhhc0F0dHJpYnV0ZShcInBtLW9mZnNldFwiKSkgY29udGludWU7XG4gICAgdmFyIGNoaWxkQm94ID0gY2hpbGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgaWYgKGNvb3Jkcy5sZWZ0ID4gY2hpbGRCb3gubGVmdCAtIDIpIHJldHVybiBudWxsO1xuICAgIGlmIChjaGlsZEJveC50b3AgPD0gY29vcmRzLnRvcCAmJiBjaGlsZEJveC5ib3R0b20gPj0gY29vcmRzLnRvcCkgcmV0dXJuIG5ldyBfbW9kZWwuUG9zKHBhdGgsIGkpO1xuICB9XG59O1xuXG5kZWYoX21vZGVsLkxpc3RJdGVtLCBmdW5jdGlvbiAobm9kZSwgcykge1xuICByZXR1cm4gcy5yZW5kZXJBcyhub2RlLCBcImxpXCIpO1xufSk7XG5cbmRlZihfbW9kZWwuSG9yaXpvbnRhbFJ1bGUsIGZ1bmN0aW9uIChfLCBzKSB7XG4gIHJldHVybiBzLmVsdChcImhyXCIpO1xufSk7XG5cbmRlZihfbW9kZWwuUGFyYWdyYXBoLCBmdW5jdGlvbiAobm9kZSwgcykge1xuICByZXR1cm4gcy5yZW5kZXJBcyhub2RlLCBcInBcIik7XG59KTtcblxuZGVmKF9tb2RlbC5IZWFkaW5nLCBmdW5jdGlvbiAobm9kZSwgcykge1xuICByZXR1cm4gcy5yZW5kZXJBcyhub2RlLCBcImhcIiArIG5vZGUuYXR0cnMubGV2ZWwpO1xufSk7XG5cbmRlZihfbW9kZWwuQ29kZUJsb2NrLCBmdW5jdGlvbiAobm9kZSwgcykge1xuICB2YXIgY29kZSA9IHMucmVuZGVyQXMobm9kZSwgXCJjb2RlXCIpO1xuICBpZiAobm9kZS5hdHRycy5wYXJhbXMgIT0gbnVsbCkgY29kZS5jbGFzc05hbWUgPSBcImZlbmNlIFwiICsgbm9kZS5hdHRycy5wYXJhbXMucmVwbGFjZSgvKF58XFxzKykvZywgXCIkJmxhbmctXCIpO1xuICByZXR1cm4gcy5lbHQoXCJwcmVcIiwgbnVsbCwgY29kZSk7XG59KTtcblxuLy8gSW5saW5lIGNvbnRlbnRcblxuZGVmKF9tb2RlbC5UZXh0LCBmdW5jdGlvbiAobm9kZSwgcykge1xuICByZXR1cm4gcy5kb2MuY3JlYXRlVGV4dE5vZGUobm9kZS50ZXh0KTtcbn0pO1xuXG5kZWYoX21vZGVsLkltYWdlLCBmdW5jdGlvbiAobm9kZSwgcykge1xuICByZXR1cm4gcy5lbHQoXCJpbWdcIiwge1xuICAgIHNyYzogbm9kZS5hdHRycy5zcmMsXG4gICAgYWx0OiBub2RlLmF0dHJzLmFsdCxcbiAgICB0aXRsZTogbm9kZS5hdHRycy50aXRsZVxuICB9KTtcbn0pO1xuXG5kZWYoX21vZGVsLkhhcmRCcmVhaywgZnVuY3Rpb24gKF8sIHMpIHtcbiAgcmV0dXJuIHMuZWx0KFwiYnJcIik7XG59KTtcblxuLy8gSW5saW5lIHN0eWxlc1xuXG5kZWYoX21vZGVsLkVtTWFyaywgZnVuY3Rpb24gKF8sIHMpIHtcbiAgcmV0dXJuIHMuZWx0KFwiZW1cIik7XG59KTtcblxuZGVmKF9tb2RlbC5TdHJvbmdNYXJrLCBmdW5jdGlvbiAoXywgcykge1xuICByZXR1cm4gcy5lbHQoXCJzdHJvbmdcIik7XG59KTtcblxuZGVmKF9tb2RlbC5Db2RlTWFyaywgZnVuY3Rpb24gKF8sIHMpIHtcbiAgcmV0dXJuIHMuZWx0KFwiY29kZVwiKTtcbn0pO1xuXG5kZWYoX21vZGVsLkxpbmtNYXJrLCBmdW5jdGlvbiAobWFyaywgcykge1xuICByZXR1cm4gcy5lbHQoXCJhXCIsIHsgaHJlZjogbWFyay5hdHRycy5ocmVmLFxuICAgIHRpdGxlOiBtYXJrLmF0dHJzLnRpdGxlIH0pO1xufSk7IiwiLy8gISEgVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSB3YXkgdG8gcmVnaXN0ZXIgYW5kIGFjY2VzcyBmdW5jdGlvbnMgdGhhdFxuLy8gc2VyaWFsaXplIFByb3NlTWlycm9yIFtkb2N1bWVudHNdKCNOb2RlKSB0byB2YXJpb3VzIGZvcm1hdHMuIFRvXG4vLyBsb2FkIHRoZSBhY3R1YWwgc2VyaWFsaXplcnMsIHlvdSBuZWVkIHRvIGluY2x1ZGUgc3VibW9kdWxlcyBvZiB0aGlzXG4vLyBtb2R1bGUgKG9yIDNyZCBwYXJ0eSBzZXJpYWxpemF0aW9uIG1vZHVsZXMpLCB3aGljaCB3aWxsIHJlZ2lzdGVyXG4vLyB0aGVtc2VsdmVzIHRvIHRoaXMgbW9kdWxlLlxuLy9cbi8vIFRoZXNlIGFyZSB0aGUgc2VyaWFsaXplcnMgZGVmaW5lZDpcbi8vXG4vLyAqKmBcImpzb25cImAqKlxuLy8gICA6IFVzZSBgTm9kZS50b0pTT05gIHRvIHNlcmlhbGl6ZSB0aGUgbm9kZSBhcyBKU09OLiBEZWZpbmVkIGJ5IHRoZVxuLy8gICAgIHRvcC1sZXZlbCBgc2VyaWFsaXplYCBtb2R1bGUuXG4vL1xuLy8gKipgXCJkb21cImAqKlxuLy8gICA6IFNlcmlhbGl6ZSB0byBhIFtET01cbi8vICAgICBmcmFnbWVudF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RvY3VtZW50RnJhZ21lbnQpLlxuLy8gICAgIERlZmluZWQgaW4gYHNlcmlhbGl6ZS9kb21gLiBTZWUgYHRvRE9NYC5cbi8vXG4vLyAqKmBcImh0bWxcImAqKlxuLy8gICA6IFNlcmlhbGl6ZSB0byBIVE1MIHRleHQuIERlZmluZWQgaW4gYHNlcmlhbGl6ZS9kb21gLiBTZWUgYHRvSFRNTGAuXG4vL1xuLy8gKipgXCJtYXJrZG93blwiYCoqXG4vLyAgIDogU2VyaWFsaXplIHRvIFtDb21tb25NYXJrXShodHRwOi8vY29tbW9ubWFyay5vcmcvKSBtYXJrZWQtdXBcbi8vICAgICB0ZXh0LiBEZWZpbmVkIGluIGBzZXJpYWxpemUvbWFya2Rvd25gLiBTZWUgYHRvTWFya2Rvd25gLlxuLy9cbi8vICoqYFwidGV4dFwiYCoqXG4vLyAgIDogU2VyaWFsaXplIHRvIHBsYWluIHRleHQuIERlZmluZWQgaW4gYHNlcmlhbGl6ZS90ZXh0YC4gU2VlIGB0b1RleHRgLlxuXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuc2VyaWFsaXplVG8gPSBzZXJpYWxpemVUbztcbmV4cG9ydHMua25vd25UYXJnZXQgPSBrbm93blRhcmdldDtcbmV4cG9ydHMuZGVmaW5lVGFyZ2V0ID0gZGVmaW5lVGFyZ2V0O1xudmFyIHNlcmlhbGl6ZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuLy8gOjogKE5vZGUsIHN0cmluZywgP09iamVjdCkg4oaSIGFueVxuLy8gU2VyaWFsaXplIHRoZSBnaXZlbiBkb2N1bWVudCB0byB0aGUgZ2l2ZW4gZm9ybWF0LiBJZiBgb3B0aW9uc2AgaXNcbi8vIGdpdmVuLCBpdCB3aWxsIGJlIHBhc3NlZCBhbG9uZyB0byB0aGUgc2VyaWFsaXplciBmdW5jdGlvbi5cblxuZnVuY3Rpb24gc2VyaWFsaXplVG8oZG9jLCBmb3JtYXQsIG9wdGlvbnMpIHtcbiAgdmFyIGNvbnZlcnRlciA9IHNlcmlhbGl6ZXJzW2Zvcm1hdF07XG4gIGlmICghY29udmVydGVyKSB0aHJvdyBuZXcgRXJyb3IoXCJUYXJnZXQgZm9ybWF0IFwiICsgZm9ybWF0ICsgXCIgbm90IGRlZmluZWRcIik7XG4gIHJldHVybiBjb252ZXJ0ZXIoZG9jLCBvcHRpb25zKTtcbn1cblxuLy8gOjogKHN0cmluZykg4oaSIGJvb2xcbi8vIFF1ZXJ5IHdoZXRoZXIgYSBnaXZlbiBzZXJpYWxpemF0aW9uIGZvcm1hdCBoYXMgYmVlbiByZWdpc3RlcmVkLlxuXG5mdW5jdGlvbiBrbm93blRhcmdldChmb3JtYXQpIHtcbiAgcmV0dXJuICEhc2VyaWFsaXplcnNbZm9ybWF0XTtcbn1cblxuLy8gOjogKHN0cmluZywgKE5vZGUsID9PYmplY3QpIOKGkiBhbnkpXG4vLyBSZWdpc3RlciBhIGZ1bmN0aW9uIGFzIHRoZSBzZXJpYWxpemVyIGZvciBgZm9ybWF0YC5cblxuZnVuY3Rpb24gZGVmaW5lVGFyZ2V0KGZvcm1hdCwgZnVuYykge1xuICBzZXJpYWxpemVyc1tmb3JtYXRdID0gZnVuYztcbn1cblxuZGVmaW5lVGFyZ2V0KFwianNvblwiLCBmdW5jdGlvbiAoZG9jKSB7XG4gIHJldHVybiBkb2MudG9KU09OKCk7XG59KTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudG9UZXh0ID0gdG9UZXh0O1xuXG52YXIgX21vZGVsID0gcmVxdWlyZShcIi4uL21vZGVsXCIpO1xuXG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vaW5kZXhcIik7XG5cbl9tb2RlbC5CbG9jay5wcm90b3R5cGUuc2VyaWFsaXplVGV4dCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gIHZhciBhY2N1bSA9IFwiXCI7XG4gIG5vZGUuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gYWNjdW0gKz0gY2hpbGQudHlwZS5zZXJpYWxpemVUZXh0KGNoaWxkKTtcbiAgfSk7XG4gIHJldHVybiBhY2N1bTtcbn07XG5cbl9tb2RlbC5UZXh0YmxvY2sucHJvdG90eXBlLnNlcmlhbGl6ZVRleHQgPSBmdW5jdGlvbiAobm9kZSkge1xuICB2YXIgdGV4dCA9IF9tb2RlbC5CbG9jay5wcm90b3R5cGUuc2VyaWFsaXplVGV4dChub2RlKTtcbiAgcmV0dXJuIHRleHQgJiYgdGV4dCArIFwiXFxuXFxuXCI7XG59O1xuXG5fbW9kZWwuSW5saW5lLnByb3RvdHlwZS5zZXJpYWxpemVUZXh0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gXCJcIjtcbn07XG5cbl9tb2RlbC5IYXJkQnJlYWsucHJvdG90eXBlLnNlcmlhbGl6ZVRleHQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBcIlxcblwiO1xufTtcblxuX21vZGVsLlRleHQucHJvdG90eXBlLnNlcmlhbGl6ZVRleHQgPSBmdW5jdGlvbiAobm9kZSkge1xuICByZXR1cm4gbm9kZS50ZXh0O1xufTtcblxuLy8gOjogKE5vZGUpIOKGkiBzdHJpbmdcbi8vIFNlcmlhbGl6ZSBhIG5vZGUgYXMgYSBwbGFpbiB0ZXh0IHN0cmluZy5cblxuZnVuY3Rpb24gdG9UZXh0KGRvYykge1xuICByZXR1cm4gZG9jLnR5cGUuc2VyaWFsaXplVGV4dChkb2MpLnRyaW0oKTtcbn1cblxuKDAsIF9pbmRleC5kZWZpbmVUYXJnZXQpKFwidGV4dFwiLCB0b1RleHQpOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5jYW5MaWZ0ID0gY2FuTGlmdDtcbmV4cG9ydHMuY2FuV3JhcCA9IGNhbldyYXA7XG5cbnZhciBfbW9kZWwgPSByZXF1aXJlKFwiLi4vbW9kZWxcIik7XG5cbnZhciBfdHJhbnNmb3JtID0gcmVxdWlyZShcIi4vdHJhbnNmb3JtXCIpO1xuXG52YXIgX3N0ZXAgPSByZXF1aXJlKFwiLi9zdGVwXCIpO1xuXG52YXIgX3RyZWUgPSByZXF1aXJlKFwiLi90cmVlXCIpO1xuXG52YXIgX21hcCA9IHJlcXVpcmUoXCIuL21hcFwiKTtcblxuLy8gISEgKipgYW5jZXN0b3JgKipcbi8vICAgIDogQ2hhbmdlIHRoZSBzdGFjayBvZiBub2RlcyB0aGF0IHdyYXAgdGhlIHBhcnQgb2YgdGhlIGRvY3VtZW50XG4vLyAgICAgIGJldHdlZW4gYGZyb21gIGFuZCBgdG9gLCB3aGljaCBtdXN0IHBvaW50IGludG8gdGhlIHNhbWUgcGFyZW50XG4vLyAgICAgIG5vZGUuXG4vL1xuLy8gICAgICBUaGUgc2V0IG9mIGFuY2VzdG9ycyB0byByZXBsYWNlIGlzIGRldGVybWluZWQgYnkgdGhlIGBkZXB0aGBcbi8vICAgICAgcHJvcGVydHkgb2YgdGhlIHN0ZXAncyBwYXJhbWV0ZXIuIElmIHRoaXMgaXMgZ3JlYXRlciB0aGFuXG4vLyAgICAgIHplcm8sIGBmcm9tYCBhbmQgYHRvYCBtdXN0IHBvaW50IGF0IHRoZSBzdGFydCBhbmQgZW5kIG9mIGFcbi8vICAgICAgc3RhY2sgb2Ygbm9kZXMsIG9mIHRoYXQgZGVwdGgsIHNpbmNlIHRoaXMgc3RlcCB3aWxsIG5vdCBzcGxpdFxuLy8gICAgICBub2Rlcy5cbi8vXG4vLyAgICAgIFRoZSBzZXQgb2YgbmV3IGFuY2VzdG9ycyB0byB3cmFwIHdpdGggaXMgZGV0ZXJtaW5lZCBieSB0aGVcbi8vICAgICAgYHR5cGVzYCBhbmQgYGF0dHJzYCBwcm9wZXJ0aWVzIG9mIHRoZSBwYXJhbWV0ZXIuIFRoZSBmaXJzdFxuLy8gICAgICBzaG91bGQgYmUgYW4gYXJyYXkgb2YgYE5vZGVUeXBlYHMsIGFuZCB0aGUgc2Vjb25kLCBvcHRpb25hbGx5LFxuLy8gICAgICBhbiBhcnJheSBvZiBhdHRyaWJ1dGUgb2JqZWN0cy5cblxuX3N0ZXAuU3RlcC5kZWZpbmUoXCJhbmNlc3RvclwiLCB7XG4gIGFwcGx5OiBmdW5jdGlvbiBhcHBseShkb2MsIHN0ZXApIHtcbiAgICB2YXIgZnJvbSA9IHN0ZXAuZnJvbSxcbiAgICAgICAgdG8gPSBzdGVwLnRvO1xuICAgIGlmICghKDAsIF90cmVlLmlzRmxhdFJhbmdlKShmcm9tLCB0bykpIHJldHVybiBudWxsO1xuICAgIHZhciB0b1BhcmVudCA9IGZyb20ucGF0aCxcbiAgICAgICAgc3RhcnQgPSBmcm9tLm9mZnNldCxcbiAgICAgICAgZW5kID0gdG8ub2Zmc2V0O1xuICAgIHZhciBfc3RlcCRwYXJhbSA9IHN0ZXAucGFyYW07XG4gICAgdmFyIF9zdGVwJHBhcmFtJGRlcHRoID0gX3N0ZXAkcGFyYW0uZGVwdGg7XG4gICAgdmFyIGRlcHRoID0gX3N0ZXAkcGFyYW0kZGVwdGggPT09IHVuZGVmaW5lZCA/IDAgOiBfc3RlcCRwYXJhbSRkZXB0aDtcbiAgICB2YXIgX3N0ZXAkcGFyYW0kdHlwZXMgPSBfc3RlcCRwYXJhbS50eXBlcztcbiAgICB2YXIgdHlwZXMgPSBfc3RlcCRwYXJhbSR0eXBlcyA9PT0gdW5kZWZpbmVkID8gW10gOiBfc3RlcCRwYXJhbSR0eXBlcztcbiAgICB2YXIgX3N0ZXAkcGFyYW0kYXR0cnMgPSBfc3RlcCRwYXJhbS5hdHRycztcbiAgICB2YXIgYXR0cnMgPSBfc3RlcCRwYXJhbSRhdHRycyA9PT0gdW5kZWZpbmVkID8gW10gOiBfc3RlcCRwYXJhbSRhdHRycztcblxuICAgIHZhciBpbm5lciA9IGRvYy5wYXRoKGZyb20ucGF0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZXB0aDsgaSsrKSB7XG4gICAgICBpZiAoc3RhcnQgPiAwIHx8IGVuZCA8IGRvYy5wYXRoKHRvUGFyZW50KS5zaXplIHx8IHRvUGFyZW50Lmxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbDtcbiAgICAgIHN0YXJ0ID0gdG9QYXJlbnRbdG9QYXJlbnQubGVuZ3RoIC0gMV07XG4gICAgICBlbmQgPSBzdGFydCArIDE7XG4gICAgICB0b1BhcmVudCA9IHRvUGFyZW50LnNsaWNlKDAsIHRvUGFyZW50Lmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgICBpZiAoZGVwdGggPT0gMCAmJiB0eXBlcy5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgICB2YXIgcGFyZW50ID0gZG9jLnBhdGgodG9QYXJlbnQpLFxuICAgICAgICBwYXJlbnRTaXplID0gcGFyZW50LnNpemUsXG4gICAgICAgIG5ld1BhcmVudCA9IHVuZGVmaW5lZDtcbiAgICBpZiAocGFyZW50LnR5cGUubG9ja2VkKSByZXR1cm4gbnVsbDtcbiAgICBpZiAodHlwZXMubGVuZ3RoKSB7XG4gICAgICB2YXIgX3JldCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBsYXN0V3JhcHBlciA9IHR5cGVzW3R5cGVzLmxlbmd0aCAtIDFdO1xuICAgICAgICB2YXIgY29udGVudCA9IGlubmVyLmNvbnRlbnQuc2xpY2UoZnJvbS5vZmZzZXQsIHRvLm9mZnNldCk7XG4gICAgICAgIGlmICghcGFyZW50LnR5cGUuY2FuQ29udGFpblR5cGUodHlwZXNbMF0pIHx8IGNvbnRlbnQuc29tZShmdW5jdGlvbiAobikge1xuICAgICAgICAgIHJldHVybiAhbGFzdFdyYXBwZXIuY2FuQ29udGFpbihuKTtcbiAgICAgICAgfSkgfHwgIWlubmVyLnNpemUgJiYgIWxhc3RXcmFwcGVyLmNhbkJlRW1wdHkgfHwgbGFzdFdyYXBwZXIubG9ja2VkKSByZXR1cm4ge1xuICAgICAgICAgICAgdjogbnVsbFxuICAgICAgICAgIH07XG4gICAgICAgIHZhciBub2RlID0gbnVsbDtcbiAgICAgICAgZm9yICh2YXIgaSA9IHR5cGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgbm9kZSA9IHR5cGVzW2ldLmNyZWF0ZShhdHRyc1tpXSwgbm9kZSB8fCBjb250ZW50KTtcbiAgICAgICAgfW5ld1BhcmVudCA9IHBhcmVudC5zcGxpY2Uoc3RhcnQsIGVuZCwgX21vZGVsLkZyYWdtZW50LmZyb20obm9kZSkpO1xuICAgICAgfSkoKTtcblxuICAgICAgaWYgKHR5cGVvZiBfcmV0ID09PSBcIm9iamVjdFwiKSByZXR1cm4gX3JldC52O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXBhcmVudC50eXBlLmNhbkNvbnRhaW5GcmFnbWVudChpbm5lci5jb250ZW50KSB8fCAhaW5uZXIuc2l6ZSAmJiBzdGFydCA9PSAwICYmIGVuZCA9PSBwYXJlbnQuc2l6ZSAmJiAhcGFyZW50LnR5cGUuY2FuQmVFbXB0eSkgcmV0dXJuIG51bGw7XG4gICAgICBuZXdQYXJlbnQgPSBwYXJlbnQuc3BsaWNlKHN0YXJ0LCBlbmQsIGlubmVyLmNvbnRlbnQpO1xuICAgIH1cbiAgICB2YXIgY29weSA9IGRvYy5yZXBsYWNlRGVlcCh0b1BhcmVudCwgbmV3UGFyZW50KTtcblxuICAgIHZhciB0b0lubmVyID0gdG9QYXJlbnQuc2xpY2UoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0b0lubmVyLnB1c2goaSA/IDAgOiBzdGFydCk7XG4gICAgfXZhciBzdGFydE9mSW5uZXIgPSBuZXcgX21vZGVsLlBvcyh0b0lubmVyLCB0eXBlcy5sZW5ndGggPyAwIDogc3RhcnQpO1xuICAgIHZhciByZXBsYWNlZCA9IG51bGw7XG4gICAgdmFyIGluc2VydGVkU2l6ZSA9IHR5cGVzLmxlbmd0aCA/IDEgOiB0by5vZmZzZXQgLSBmcm9tLm9mZnNldDtcbiAgICBpZiAoZGVwdGggIT0gdHlwZXMubGVuZ3RoIHx8IGRlcHRoID4gMSB8fCB0eXBlcy5sZW5ndGggPiAxKSB7XG4gICAgICB2YXIgcG9zQmVmb3JlID0gbmV3IF9tb2RlbC5Qb3ModG9QYXJlbnQsIHN0YXJ0KTtcbiAgICAgIHZhciBwb3NBZnRlcjEgPSBuZXcgX21vZGVsLlBvcyh0b1BhcmVudCwgZW5kKSxcbiAgICAgICAgICBwb3NBZnRlcjIgPSBuZXcgX21vZGVsLlBvcyh0b1BhcmVudCwgc3RhcnQgKyBpbnNlcnRlZFNpemUpO1xuICAgICAgdmFyIGVuZE9mSW5uZXIgPSBuZXcgX21vZGVsLlBvcyh0b0lubmVyLCBzdGFydE9mSW5uZXIub2Zmc2V0ICsgKHRvLm9mZnNldCAtIGZyb20ub2Zmc2V0KSk7XG4gICAgICByZXBsYWNlZCA9IFtuZXcgX21hcC5SZXBsYWNlZFJhbmdlKHBvc0JlZm9yZSwgZnJvbSwgcG9zQmVmb3JlLCBzdGFydE9mSW5uZXIpLCBuZXcgX21hcC5SZXBsYWNlZFJhbmdlKHRvLCBwb3NBZnRlcjEsIGVuZE9mSW5uZXIsIHBvc0FmdGVyMiwgcG9zQWZ0ZXIxLCBwb3NBZnRlcjIpXTtcbiAgICB9XG4gICAgdmFyIG1vdmVkID0gW25ldyBfbWFwLk1vdmVkUmFuZ2UoZnJvbSwgdG8ub2Zmc2V0IC0gZnJvbS5vZmZzZXQsIHN0YXJ0T2ZJbm5lcildO1xuICAgIGlmIChlbmQgLSBzdGFydCAhPSBpbnNlcnRlZFNpemUpIG1vdmVkLnB1c2gobmV3IF9tYXAuTW92ZWRSYW5nZShuZXcgX21vZGVsLlBvcyh0b1BhcmVudCwgZW5kKSwgcGFyZW50U2l6ZSAtIGVuZCwgbmV3IF9tb2RlbC5Qb3ModG9QYXJlbnQsIHN0YXJ0ICsgaW5zZXJ0ZWRTaXplKSkpO1xuICAgIHJldHVybiBuZXcgX3N0ZXAuU3RlcFJlc3VsdChjb3B5LCBuZXcgX21hcC5Qb3NNYXAobW92ZWQsIHJlcGxhY2VkKSk7XG4gIH0sXG4gIGludmVydDogZnVuY3Rpb24gaW52ZXJ0KHN0ZXAsIG9sZERvYywgbWFwKSB7XG4gICAgdmFyIHR5cGVzID0gW10sXG4gICAgICAgIGF0dHJzID0gW107XG4gICAgaWYgKHN0ZXAucGFyYW0uZGVwdGgpIGZvciAodmFyIGkgPSAwOyBpIDwgc3RlcC5wYXJhbS5kZXB0aDsgaSsrKSB7XG4gICAgICB2YXIgX3BhcmVudCA9IG9sZERvYy5wYXRoKHN0ZXAuZnJvbS5wYXRoLnNsaWNlKDAsIHN0ZXAuZnJvbS5wYXRoLmxlbmd0aCAtIGkpKTtcbiAgICAgIHR5cGVzLnVuc2hpZnQoX3BhcmVudC50eXBlKTtcbiAgICAgIGF0dHJzLnVuc2hpZnQoX3BhcmVudC5hdHRycyk7XG4gICAgfVxuICAgIHZhciBuZXdGcm9tID0gbWFwLm1hcChzdGVwLmZyb20pLnBvcztcbiAgICB2YXIgbmV3VG8gPSBzdGVwLmZyb20uY21wKHN0ZXAudG8pID8gbWFwLm1hcChzdGVwLnRvLCAtMSkucG9zIDogbmV3RnJvbTtcbiAgICByZXR1cm4gbmV3IF9zdGVwLlN0ZXAoXCJhbmNlc3RvclwiLCBuZXdGcm9tLCBuZXdUbywgbnVsbCwgeyBkZXB0aDogc3RlcC5wYXJhbS50eXBlcyA/IHN0ZXAucGFyYW0udHlwZXMubGVuZ3RoIDogMCxcbiAgICAgIHR5cGVzOiB0eXBlcywgYXR0cnM6IGF0dHJzIH0pO1xuICB9LFxuICBwYXJhbVRvSlNPTjogZnVuY3Rpb24gcGFyYW1Ub0pTT04ocGFyYW0pIHtcbiAgICByZXR1cm4geyBkZXB0aDogcGFyYW0uZGVwdGgsXG4gICAgICB0eXBlczogcGFyYW0udHlwZXMgJiYgcGFyYW0udHlwZXMubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0Lm5hbWU7XG4gICAgICB9KSxcbiAgICAgIGF0dHJzOiBwYXJhbS5hdHRycyB9O1xuICB9LFxuICBwYXJhbUZyb21KU09OOiBmdW5jdGlvbiBwYXJhbUZyb21KU09OKHNjaGVtYSwganNvbikge1xuICAgIHJldHVybiB7IGRlcHRoOiBqc29uLmRlcHRoLFxuICAgICAgdHlwZXM6IGpzb24udHlwZXMgJiYganNvbi50eXBlcy5tYXAoZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS5ub2RlVHlwZShuKTtcbiAgICAgIH0pLFxuICAgICAgYXR0cnM6IGpzb24uYXR0cnMgfTtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIGNhbkJlTGlmdGVkKGRvYywgcmFuZ2UpIHtcbiAgdmFyIGNvbnRlbnQgPSBbZG9jLnBhdGgocmFuZ2UuZnJvbS5wYXRoKV0sXG4gICAgICB1bndyYXAgPSBmYWxzZTtcbiAgZm9yICg7Oykge1xuICAgIHZhciBwYXJlbnREZXB0aCA9IC0xO1xuXG4gICAgdmFyIF9sb29wID0gZnVuY3Rpb24gKF9ub2RlLCBpKSB7XG4gICAgICBpZiAoIWNvbnRlbnQuc29tZShmdW5jdGlvbiAoaW5uZXIpIHtcbiAgICAgICAgcmV0dXJuICFfbm9kZS50eXBlLmNhbkNvbnRhaW5Db250ZW50KGlubmVyLnR5cGUpO1xuICAgICAgfSkpIHBhcmVudERlcHRoID0gaTtcbiAgICAgIF9ub2RlID0gX25vZGUuY2hpbGQocmFuZ2UuZnJvbS5wYXRoW2ldKTtcbiAgICAgIG5vZGUgPSBfbm9kZTtcbiAgICB9O1xuXG4gICAgZm9yICh2YXIgbm9kZSA9IGRvYywgaSA9IDA7IGkgPCByYW5nZS5mcm9tLnBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIF9sb29wKG5vZGUsIGkpO1xuICAgIH1cbiAgICBpZiAocGFyZW50RGVwdGggPiAtMSkgcmV0dXJuIHsgcGF0aDogcmFuZ2UuZnJvbS5wYXRoLnNsaWNlKDAsIHBhcmVudERlcHRoKSwgdW53cmFwOiB1bndyYXAgfTtcbiAgICBpZiAodW53cmFwIHx8ICFjb250ZW50WzBdLmlzQmxvY2spIHJldHVybiBudWxsO1xuICAgIGNvbnRlbnQgPSBjb250ZW50WzBdLmNvbnRlbnQuc2xpY2UocmFuZ2UuZnJvbS5vZmZzZXQsIHJhbmdlLnRvLm9mZnNldCk7XG4gICAgdW53cmFwID0gdHJ1ZTtcbiAgfVxufVxuXG4vLyA6OiAoTm9kZSwgUG9zLCA/UG9zKSDihpIgYm9vbFxuLy8gVGVsbHMgeW91IHdoZXRoZXIgdGhlIGdpdmVuIHBvc2l0aW9ucycgW3NpYmxpbmdcbi8vIHJhbmdlXSgjTm9kZS5zaWJsaW5nUmFuZ2UpLCBvciBhbnkgb2YgaXRzIGFuY2VzdG9yIG5vZGVzLCBjYW4gYmVcbi8vIGxpZnRlZCBvdXQgb2YgYSBwYXJlbnQuXG5cbmZ1bmN0aW9uIGNhbkxpZnQoZG9jLCBmcm9tLCB0bykge1xuICB2YXIgcmFuZ2UgPSBkb2Muc2libGluZ1JhbmdlKGZyb20sIHRvIHx8IGZyb20pO1xuICB2YXIgZm91bmQgPSBjYW5CZUxpZnRlZChkb2MsIHJhbmdlKTtcbiAgaWYgKGZvdW5kKSByZXR1cm4geyBmb3VuZDogZm91bmQsIHJhbmdlOiByYW5nZSB9O1xufVxuXG4vLyA6OiAoUG9zLCA/UG9zKSDihpIgVHJhbnNmb3JtXG4vLyBMaWZ0IHRoZSBuZWFyZXN0IGxpZnRhYmxlIGFuY2VzdG9yIG9mIHRoZSBbc2libGluZ1xuLy8gcmFuZ2VdKCNOb2RlLnNpYmxpbmdSYW5nZSkgb2YgdGhlIGdpdmVuIHBvc2l0aW9ucyBvdXQgb2YgaXRzXG4vLyBwYXJlbnQgKG9yIGRvIG5vdGhpbmcgaWYgbm8gc3VjaCBub2RlIGV4aXN0cykuXG5fdHJhbnNmb3JtLlRyYW5zZm9ybS5wcm90b3R5cGUubGlmdCA9IGZ1bmN0aW9uIChmcm9tKSB7XG4gIHZhciB0byA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IGZyb20gOiBhcmd1bWVudHNbMV07XG4gIHJldHVybiAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBjYW4gPSBjYW5MaWZ0KHRoaXMuZG9jLCBmcm9tLCB0byk7XG4gICAgaWYgKCFjYW4pIHJldHVybiB0aGlzO1xuICAgIHZhciBmb3VuZCA9IGNhbi5mb3VuZDtcbiAgICB2YXIgcmFuZ2UgPSBjYW4ucmFuZ2U7XG5cbiAgICB2YXIgZGVwdGggPSByYW5nZS5mcm9tLnBhdGgubGVuZ3RoIC0gZm91bmQucGF0aC5sZW5ndGg7XG4gICAgdmFyIHJhbmdlTm9kZSA9IGZvdW5kLnVud3JhcCAmJiB0aGlzLmRvYy5wYXRoKHJhbmdlLmZyb20ucGF0aCk7XG5cbiAgICBmb3IgKHZhciBkID0gMCwgcG9zID0gcmFuZ2UudG87OyBkKyspIHtcbiAgICAgIGlmIChwb3Mub2Zmc2V0IDwgdGhpcy5kb2MucGF0aChwb3MucGF0aCkuc2l6ZSkge1xuICAgICAgICB0aGlzLnNwbGl0KHBvcywgZGVwdGggLSBkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoZCA9PSBkZXB0aCAtIDEpIGJyZWFrO1xuICAgICAgcG9zID0gcG9zLnNob3J0ZW4obnVsbCwgMSk7XG4gICAgfVxuICAgIGZvciAodmFyIGQgPSAwLCBwb3MgPSByYW5nZS5mcm9tOzsgZCsrKSB7XG4gICAgICBpZiAocG9zLm9mZnNldCA+IDApIHtcbiAgICAgICAgdGhpcy5zcGxpdChwb3MsIGRlcHRoIC0gZCk7XG4gICAgICAgIHZhciBjdXQgPSByYW5nZS5mcm9tLnBhdGgubGVuZ3RoIC0gZGVwdGgsXG4gICAgICAgICAgICBwYXRoID0gcG9zLnBhdGguc2xpY2UoMCwgY3V0KS5jb25jYXQocG9zLnBhdGhbY3V0XSArIDEpO1xuICAgICAgICB3aGlsZSAocGF0aC5sZW5ndGggPCByYW5nZS5mcm9tLnBhdGgubGVuZ3RoKSBwYXRoLnB1c2goMCk7XG4gICAgICAgIHJhbmdlID0geyBmcm9tOiBuZXcgX21vZGVsLlBvcyhwYXRoLCAwKSwgdG86IG5ldyBfbW9kZWwuUG9zKHBhdGgsIHJhbmdlLnRvLm9mZnNldCAtIHJhbmdlLmZyb20ub2Zmc2V0KSB9O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChkID09IGRlcHRoIC0gMSkgYnJlYWs7XG4gICAgICBwb3MgPSBwb3Muc2hvcnRlbigpO1xuICAgIH1cbiAgICBpZiAoZm91bmQudW53cmFwKSB7XG4gICAgICBmb3IgKHZhciBpID0gcmFuZ2UudG8ub2Zmc2V0IC0gMTsgaSA+IHJhbmdlLmZyb20ub2Zmc2V0OyBpLS0pIHtcbiAgICAgICAgdGhpcy5qb2luKG5ldyBfbW9kZWwuUG9zKHJhbmdlLmZyb20ucGF0aCwgaSkpO1xuICAgICAgfXZhciBzaXplID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSByYW5nZU5vZGUuaXRlcihyYW5nZS5mcm9tLm9mZnNldCwgcmFuZ2UudG8ub2Zmc2V0KSwgY2hpbGQgPSB1bmRlZmluZWQ7IGNoaWxkID0gaS5uZXh0KCkudmFsdWU7KSB7XG4gICAgICAgIHNpemUgKz0gY2hpbGQuc2l6ZTtcbiAgICAgIH12YXIgcGF0aCA9IHJhbmdlLmZyb20ucGF0aC5jb25jYXQocmFuZ2UuZnJvbS5vZmZzZXQpO1xuICAgICAgcmFuZ2UgPSB7IGZyb206IG5ldyBfbW9kZWwuUG9zKHBhdGgsIDApLCB0bzogbmV3IF9tb2RlbC5Qb3MocGF0aCwgc2l6ZSkgfTtcbiAgICAgICsrZGVwdGg7XG4gICAgfVxuICAgIHRoaXMuc3RlcChcImFuY2VzdG9yXCIsIHJhbmdlLmZyb20sIHJhbmdlLnRvLCBudWxsLCB7IGRlcHRoOiBkZXB0aCB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5cbi8vIDo6IChOb2RlLCBQb3MsID9Qb3MsIE5vZGVUeXBlKSDihpIgYm9vbFxuLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBbc2libGluZyByYW5nZV0oI05vZGUuc2libGluZ1JhbmdlKSBvZiB0aGVcbi8vIGdpdmVuIHBvc2l0aW9ucyBjYW4gYmUgd3JhcHBlZCBpbiB0aGUgZ2l2ZW4gbm9kZSB0eXBlLlxuXG5mdW5jdGlvbiBjYW5XcmFwKGRvYywgZnJvbSwgdG8sIHR5cGUpIHtcbiAgdmFyIHJhbmdlID0gZG9jLnNpYmxpbmdSYW5nZShmcm9tLCB0byB8fCBmcm9tKTtcbiAgaWYgKHJhbmdlLmZyb20ub2Zmc2V0ID09IHJhbmdlLnRvLm9mZnNldCkgcmV0dXJuIG51bGw7XG4gIHZhciBwYXJlbnQgPSBkb2MucGF0aChyYW5nZS5mcm9tLnBhdGgpO1xuICB2YXIgYXJvdW5kID0gcGFyZW50LnR5cGUuZmluZENvbm5lY3Rpb24odHlwZSk7XG4gIHZhciBpbnNpZGUgPSB0eXBlLmZpbmRDb25uZWN0aW9uKHBhcmVudC5jaGlsZChyYW5nZS5mcm9tLm9mZnNldCkudHlwZSk7XG4gIGlmIChhcm91bmQgJiYgaW5zaWRlKSByZXR1cm4geyByYW5nZTogcmFuZ2UsIGFyb3VuZDogYXJvdW5kLCBpbnNpZGU6IGluc2lkZSB9O1xufVxuXG4vLyA6OiAoUG9zLCA/UG9zLCBOb2RlVHlwZSwgP09iamVjdCkg4oaSIFRyYW5zZm9ybVxuLy8gV3JhcCB0aGUgW3NpYmxpbmcgcmFuZ2VdKCNOb2RlLnNpYmxpbmdSYW5nZSkgb2YgdGhlIGdpdmVuIHBvc2l0aW9uc1xuLy8gaW4gYSBub2RlIG9mIHRoZSBnaXZlbiB0eXBlLCB3aXRoIHRoZSBnaXZlbiBhdHRyaWJ1dGVzIChpZlxuLy8gcG9zc2libGUpLlxuX3RyYW5zZm9ybS5UcmFuc2Zvcm0ucHJvdG90eXBlLndyYXAgPSBmdW5jdGlvbiAoZnJvbSwgdG8sIHR5cGUsIHdyYXBBdHRycykge1xuICB2YXIgY2FuID0gY2FuV3JhcCh0aGlzLmRvYywgZnJvbSwgdG8sIHR5cGUpO1xuICBpZiAoIWNhbikgcmV0dXJuIHRoaXM7XG4gIHZhciByYW5nZSA9IGNhbi5yYW5nZTtcbiAgdmFyIGFyb3VuZCA9IGNhbi5hcm91bmQ7XG4gIHZhciBpbnNpZGUgPSBjYW4uaW5zaWRlO1xuXG4gIHZhciB0eXBlcyA9IGFyb3VuZC5jb25jYXQodHlwZSkuY29uY2F0KGluc2lkZSk7XG4gIHZhciBhdHRycyA9IGFyb3VuZC5tYXAoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9KS5jb25jYXQod3JhcEF0dHJzKS5jb25jYXQoaW5zaWRlLm1hcChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0pKTtcbiAgdGhpcy5zdGVwKFwiYW5jZXN0b3JcIiwgcmFuZ2UuZnJvbSwgcmFuZ2UudG8sIG51bGwsIHsgdHlwZXM6IHR5cGVzLCBhdHRyczogYXR0cnMgfSk7XG4gIGlmIChpbnNpZGUubGVuZ3RoKSB7XG4gICAgdmFyIHRvSW5uZXIgPSByYW5nZS5mcm9tLnBhdGguc2xpY2UoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyb3VuZC5sZW5ndGggKyBpbnNpZGUubGVuZ3RoICsgMTsgaSsrKSB7XG4gICAgICB0b0lubmVyLnB1c2goaSA/IDAgOiByYW5nZS5mcm9tLm9mZnNldCk7XG4gICAgfWZvciAodmFyIGkgPSByYW5nZS50by5vZmZzZXQgLSAxIC0gcmFuZ2UuZnJvbS5vZmZzZXQ7IGkgPiAwOyBpLS0pIHtcbiAgICAgIHRoaXMuc3BsaXQobmV3IF9tb2RlbC5Qb3ModG9Jbm5lciwgaSksIGluc2lkZS5sZW5ndGgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIDo6IChQb3MsID9Qb3MsIE5vZGVUeXBlLCA/T2JqZWN0KSDihpIgVHJhbnNmb3JtXG4vLyBTZXQgdGhlIHR5cGUgb2YgYWxsIHRleHRibG9ja3MgKHBhcnRseSkgYmV0d2VlbiBgZnJvbWAgYW5kIGB0b2AgdG9cbi8vIHRoZSBnaXZlbiBub2RlIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcy5cbl90cmFuc2Zvcm0uVHJhbnNmb3JtLnByb3RvdHlwZS5zZXRCbG9ja1R5cGUgPSBmdW5jdGlvbiAoZnJvbSwgdG8sIHR5cGUsIGF0dHJzKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdGhpcy5kb2Mubm9kZXNCZXR3ZWVuKGZyb20sIHRvIHx8IGZyb20sIGZ1bmN0aW9uIChub2RlLCBwYXRoKSB7XG4gICAgaWYgKG5vZGUuaXNUZXh0YmxvY2sgJiYgIW5vZGUuaGFzTWFya3VwKHR5cGUsIGF0dHJzKSkge1xuICAgICAgcGF0aCA9IHBhdGguc2xpY2UoKTtcbiAgICAgIC8vIEVuc3VyZSBhbGwgbWFya3VwIHRoYXQgaXNuJ3QgYWxsb3dlZCBpbiB0aGUgbmV3IG5vZGUgdHlwZSBpcyBjbGVhcmVkXG4gICAgICBfdGhpcy5jbGVhck1hcmt1cChuZXcgX21vZGVsLlBvcyhwYXRoLCAwKSwgbmV3IF9tb2RlbC5Qb3MocGF0aCwgbm9kZS5zaXplKSwgdHlwZSk7XG4gICAgICBfdGhpcy5zdGVwKFwiYW5jZXN0b3JcIiwgbmV3IF9tb2RlbC5Qb3MocGF0aCwgMCksIG5ldyBfbW9kZWwuUG9zKHBhdGgsIF90aGlzLmRvYy5wYXRoKHBhdGgpLnNpemUpLCBudWxsLCB7IGRlcHRoOiAxLCB0eXBlczogW3R5cGVdLCBhdHRyczogW2F0dHJzXSB9KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIDo6IChQb3MsIE5vZGVUeXBlLCA/T2JqZWN0KSDihpIgVHJhbnNmb3JtXG4vLyBDaGFuZ2UgdGhlIHR5cGUgYW5kIGF0dHJpYnV0ZXMgb2YgdGhlIG5vZGUgYWZ0ZXIgYHBvc2AuXG5fdHJhbnNmb3JtLlRyYW5zZm9ybS5wcm90b3R5cGUuc2V0Tm9kZVR5cGUgPSBmdW5jdGlvbiAocG9zLCB0eXBlLCBhdHRycykge1xuICB2YXIgbm9kZSA9IHRoaXMuZG9jLm5vZGVBZnRlcihwb3MpO1xuICB2YXIgcGF0aCA9IHBvcy50b1BhdGgoKTtcbiAgdGhpcy5zdGVwKFwiYW5jZXN0b3JcIiwgbmV3IF9tb2RlbC5Qb3MocGF0aCwgMCksIG5ldyBfbW9kZWwuUG9zKHBhdGgsIG5vZGUuc2l6ZSksIG51bGwsIHsgZGVwdGg6IDEsIHR5cGVzOiBbdHlwZV0sIGF0dHJzOiBbYXR0cnNdIH0pO1xuICByZXR1cm4gdGhpcztcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnJlcXVpcmUoXCIuL21hcmtcIik7XG5cbnJlcXVpcmUoXCIuL3NwbGl0XCIpO1xuXG5yZXF1aXJlKFwiLi9yZXBsYWNlXCIpO1xuXG4vLyAhISBUaGlzIG1vZHVsZSBkZWZpbmVzIGEgd2F5IHRvIHRyYW5zZm9ybSBkb2N1bWVudHMuIFRyYW5zZm9ybWluZ1xuLy8gaGFwcGVucyBpbiBgU3RlcGBzLCB3aGljaCBhcmUgYXRvbWljLCB3ZWxsLWRlZmluZWQgbW9kaWZpY2F0aW9ucyB0b1xuLy8gYSBkb2N1bWVudC4gW0FwcGx5aW5nXShgU3RlcC5hcHBseWApIGEgc3RlcCBwcm9kdWNlcyBhIG5ldyBkb2N1bWVudFxuLy8gYW5kIGEgW3Bvc2l0aW9uIG1hcF0oI1Bvc01hcCkgdGhhdCBtYXBzIHBvc2l0aW9ucyBpbiB0aGUgb2xkXG4vLyBkb2N1bWVudCB0byBwb3NpdGlvbiBpbiB0aGUgbmV3IGRvY3VtZW50LiBTdGVwcyBjYW4gYmVcbi8vIFtpbnZlcnRlZF0oI1N0ZXAuaW52ZXJ0KSB0byBjcmVhdGUgYSBzdGVwIHRoYXQgdW5kb2VzIHRoZWlyIGVmZmVjdCxcbi8vIGFuZCBjaGFpbmVkIHRvZ2V0aGVyIGluIGEgY29udmVuaWVuY2Ugb2JqZWN0IGNhbGxlZCBhIGBUcmFuc2Zvcm1gLlxuLy9cbi8vIFRoaXMgbW9kdWxlIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgYnJvd3NlciBBUEkgYmVpbmcgYXZhaWxhYmxlXG4vLyAoaS5lLiB5b3UgY2FuIGxvYWQgaXQgaW50byBhbnkgSmF2YVNjcmlwdCBlbnZpcm9ubWVudCkuXG4vL1xuLy8gVGhlc2UgYXJlIHRoZSB0eXBlcyBvZiBzdGVwcyBkZWZpbmVkOlxudmFyIF90cmFuc2Zvcm0gPSByZXF1aXJlKFwiLi90cmFuc2Zvcm1cIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRyYW5zZm9ybVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdHJhbnNmb3JtLlRyYW5zZm9ybTtcbiAgfVxufSk7XG5cbnZhciBfc3RlcCA9IHJlcXVpcmUoXCIuL3N0ZXBcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlN0ZXBcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3N0ZXAuU3RlcDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJTdGVwUmVzdWx0XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9zdGVwLlN0ZXBSZXN1bHQ7XG4gIH1cbn0pO1xuXG52YXIgX2FuY2VzdG9yID0gcmVxdWlyZShcIi4vYW5jZXN0b3JcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImNhbkxpZnRcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2FuY2VzdG9yLmNhbkxpZnQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY2FuV3JhcFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfYW5jZXN0b3IuY2FuV3JhcDtcbiAgfVxufSk7XG5cbnZhciBfam9pbiA9IHJlcXVpcmUoXCIuL2pvaW5cIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImpvaW5Qb2ludFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfam9pbi5qb2luUG9pbnQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiam9pbmFibGVCbG9ja3NcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2pvaW4uam9pbmFibGVCbG9ja3M7XG4gIH1cbn0pO1xuXG52YXIgX21hcCA9IHJlcXVpcmUoXCIuL21hcFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUG9zTWFwXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9tYXAuUG9zTWFwO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk1hcFJlc3VsdFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfbWFwLk1hcFJlc3VsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZW1hcHBpbmdcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX21hcC5SZW1hcHBpbmc7XG4gIH1cbn0pOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5qb2luYWJsZUJsb2NrcyA9IGpvaW5hYmxlQmxvY2tzO1xuZXhwb3J0cy5qb2luUG9pbnQgPSBqb2luUG9pbnQ7XG5cbnZhciBfbW9kZWwgPSByZXF1aXJlKFwiLi4vbW9kZWxcIik7XG5cbnZhciBfdHJhbnNmb3JtID0gcmVxdWlyZShcIi4vdHJhbnNmb3JtXCIpO1xuXG52YXIgX3N0ZXAgPSByZXF1aXJlKFwiLi9zdGVwXCIpO1xuXG52YXIgX21hcCA9IHJlcXVpcmUoXCIuL21hcFwiKTtcblxuLy8gISEgKipgam9pbmAqKlxuLy8gICA6IEpvaW4gdHdvIGJsb2NrIGVsZW1lbnRzIHRvZ2V0aGVyLiBgZnJvbWAgYW5kIGB0b2AgbXVzdCBwb2ludCBhdFxuLy8gICAgIHRoZSBlbmQgb2YgdGhlIGZpcnN0IGFuZCBzdGFydCBvZiB0aGUgc2Vjb25kIGVsZW1lbnQgKHNvIHRoYXRcbi8vICAgICB0aGUgaW50ZW50aW9uIGlzIHByZXNlcnZlZCBldmVuIHdoZW4gdGhlIHBvc2l0aW9ucyBhcmUgbWFwcGVkKS5cblxuX3N0ZXAuU3RlcC5kZWZpbmUoXCJqb2luXCIsIHtcbiAgYXBwbHk6IGZ1bmN0aW9uIGFwcGx5KGRvYywgc3RlcCkge1xuICAgIHZhciBiZWZvcmUgPSBkb2MucGF0aChzdGVwLmZyb20ucGF0aCk7XG4gICAgdmFyIGFmdGVyID0gZG9jLnBhdGgoc3RlcC50by5wYXRoKTtcbiAgICBpZiAoc3RlcC5mcm9tLm9mZnNldCA8IGJlZm9yZS5zaXplIHx8IHN0ZXAudG8ub2Zmc2V0ID4gMCB8fCAhYmVmb3JlLnR5cGUuY2FuQ29udGFpbkZyYWdtZW50KGFmdGVyLmNvbnRlbnQpKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgcEZyb20gPSBzdGVwLmZyb20ucGF0aCxcbiAgICAgICAgcFRvID0gc3RlcC50by5wYXRoO1xuICAgIHZhciBsYXN0ID0gcEZyb20ubGVuZ3RoIC0gMSxcbiAgICAgICAgb2Zmc2V0ID0gcEZyb21bbGFzdF0gKyAxO1xuICAgIGlmIChwRnJvbS5sZW5ndGggIT0gcFRvLmxlbmd0aCB8fCBwRnJvbS5sZW5ndGggPT0gMCB8fCBvZmZzZXQgIT0gcFRvW2xhc3RdKSByZXR1cm4gbnVsbDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhc3Q7IGkrKykge1xuICAgICAgaWYgKHBGcm9tW2ldICE9IHBUb1tpXSkgcmV0dXJuIG51bGw7XG4gICAgfXZhciB0YXJnZXRQYXRoID0gcEZyb20uc2xpY2UoMCwgbGFzdCk7XG4gICAgdmFyIHRhcmdldCA9IGRvYy5wYXRoKHRhcmdldFBhdGgpLFxuICAgICAgICBvbGRTaXplID0gdGFyZ2V0LnNpemU7XG4gICAgaWYgKHRhcmdldC50eXBlLmxvY2tlZCkgcmV0dXJuIG51bGw7XG4gICAgdmFyIGpvaW5lZCA9IGJlZm9yZS5hcHBlbmQoYWZ0ZXIuY29udGVudCk7XG4gICAgdmFyIGNvcHkgPSBkb2MucmVwbGFjZURlZXAodGFyZ2V0UGF0aCwgdGFyZ2V0LnNwbGljZShvZmZzZXQgLSAxLCBvZmZzZXQgKyAxLCBfbW9kZWwuRnJhZ21lbnQuZnJvbShqb2luZWQpKSk7XG5cbiAgICB2YXIgbWFwID0gbmV3IF9tYXAuUG9zTWFwKFtuZXcgX21hcC5Nb3ZlZFJhbmdlKHN0ZXAudG8sIGFmdGVyLnNpemUsIHN0ZXAuZnJvbSksIG5ldyBfbWFwLk1vdmVkUmFuZ2UobmV3IF9tb2RlbC5Qb3ModGFyZ2V0UGF0aCwgb2Zmc2V0ICsgMSksIG9sZFNpemUgLSBvZmZzZXQgLSAxLCBuZXcgX21vZGVsLlBvcyh0YXJnZXRQYXRoLCBvZmZzZXQpKV0sIFtuZXcgX21hcC5SZXBsYWNlZFJhbmdlKHN0ZXAuZnJvbSwgc3RlcC50bywgc3RlcC5mcm9tLCBzdGVwLmZyb20sIHN0ZXAudG8uc2hvcnRlbigpKV0pO1xuICAgIHJldHVybiBuZXcgX3N0ZXAuU3RlcFJlc3VsdChjb3B5LCBtYXApO1xuICB9LFxuICBpbnZlcnQ6IGZ1bmN0aW9uIGludmVydChzdGVwLCBvbGREb2MpIHtcbiAgICByZXR1cm4gbmV3IF9zdGVwLlN0ZXAoXCJzcGxpdFwiLCBudWxsLCBudWxsLCBzdGVwLmZyb20sIG9sZERvYy5wYXRoKHN0ZXAudG8ucGF0aCkuY29weSgpKTtcbiAgfVxufSk7XG5cbi8vIDo6IChOb2RlLCBQb3MpIOKGkiBib29sXG4vLyBUZXN0IHdoZXRoZXIgdGhlIGJsb2NrcyBiZWZvcmUgYW5kIGFmdGVyIGEgZ2l2ZW4gcG9zaXRpb24gY2FuIGJlXG4vLyBqb2luZWQuXG5cbmZ1bmN0aW9uIGpvaW5hYmxlQmxvY2tzKGRvYywgcG9zKSB7XG4gIGlmIChwb3Mub2Zmc2V0ID09IDApIHJldHVybiBmYWxzZTtcbiAgdmFyIHBhcmVudCA9IGRvYy5wYXRoKHBvcy5wYXRoKTtcbiAgaWYgKHBhcmVudC5pc1RleHRibG9jayB8fCBwb3Mub2Zmc2V0ID09IHBhcmVudC5zaXplKSByZXR1cm4gZmFsc2U7XG4gIHZhciB0eXBlID0gcGFyZW50LmNoaWxkKHBvcy5vZmZzZXQgLSAxKS50eXBlO1xuICByZXR1cm4gIXR5cGUuaXNUZXh0YmxvY2sgJiYgdHlwZS5jb250YWlucyAmJiB0eXBlID09IHBhcmVudC5jaGlsZChwb3Mub2Zmc2V0KS50eXBlO1xufVxuXG4vLyA6OiAoTm9kZSwgUG9zLCA/bnVtYmVyKSDihpIgP1Bvc1xuLy8gRmluZCBhbiBhbmNlc3RvciBvZiB0aGUgZ2l2ZW4gcG9zaXRpb24gdGhhdCBjYW4gYmUgam9pbmVkIHRvIHRoZVxuLy8gYmxvY2sgYmVmb3JlIChvciBhZnRlciBpZiBgZGlyYCBpcyBwb3NpdGl2ZSkuIFJldHVybnMgdGhlIGpvaW5hYmxlXG4vLyBwb2ludCwgaWYgYW55LlxuXG5mdW5jdGlvbiBqb2luUG9pbnQoZG9jLCBwb3MpIHtcbiAgdmFyIGRpciA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMiB8fCBhcmd1bWVudHNbMl0gPT09IHVuZGVmaW5lZCA/IC0xIDogYXJndW1lbnRzWzJdO1xuXG4gIGZvciAoOzspIHtcbiAgICBpZiAoam9pbmFibGVCbG9ja3MoZG9jLCBwb3MpKSByZXR1cm4gcG9zO1xuICAgIGlmIChwb3MuZGVwdGggPT0gMCkgcmV0dXJuIG51bGw7XG4gICAgcG9zID0gcG9zLnNob3J0ZW4obnVsbCwgZGlyIDwgMCA/IDAgOiAxKTtcbiAgfVxufVxuXG4vLyA6OiAoUG9zKSDihpIgVHJhbnNmb3JtXG4vLyBKb2luIHRoZSBibG9ja3MgYXJvdW5kIHRoZSBnaXZlbiBwb3NpdGlvbi5cbl90cmFuc2Zvcm0uVHJhbnNmb3JtLnByb3RvdHlwZS5qb2luID0gZnVuY3Rpb24gKGF0KSB7XG4gIHZhciBwYXJlbnQgPSB0aGlzLmRvYy5wYXRoKGF0LnBhdGgpO1xuICBpZiAoYXQub2Zmc2V0ID09IDAgfHwgYXQub2Zmc2V0ID09IHBhcmVudC5zaXplIHx8IHBhcmVudC5pc1RleHRibG9jaykgcmV0dXJuIHRoaXM7XG4gIHRoaXMuc3RlcChcImpvaW5cIiwgbmV3IF9tb2RlbC5Qb3MoYXQucGF0aC5jb25jYXQoYXQub2Zmc2V0IC0gMSksIHBhcmVudC5jaGlsZChhdC5vZmZzZXQgLSAxKS5zaXplKSwgbmV3IF9tb2RlbC5Qb3MoYXQucGF0aC5jb25jYXQoYXQub2Zmc2V0KSwgMCkpO1xuICByZXR1cm4gdGhpcztcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIF9tb2RlbCA9IHJlcXVpcmUoXCIuLi9tb2RlbFwiKTtcblxuLy8gOzsgI2tpbmQ9aW50ZXJmYWNlICNwYXRoPU1hcHBhYmxlICN0b2M9ZmFsc2Vcbi8vIFRoZXJlIGFyZSB2YXJpb3VzIHRoaW5ncyB0aGF0IHBvc2l0aW9ucyBjYW4gYmUgbWFwcGVkIHRocm91Z2guXG4vLyBXZSdsbCBkZW5vdGUgdGhvc2UgYXMgJ21hcHBhYmxlJy4gVGhpcyBpcyBub3QgYW4gYWN0dWFsIGNsYXNzIGluXG4vLyB0aGUgY29kZWJhc2UsIG9ubHkgYW4gYWdyZWVkLW9uIGludGVyZmFjZS5cblxuLy8gOjogKHBvczogUG9zLCBiaWFzOiA/bnVtYmVyKSDihpIgTWFwUmVzdWx0XG4vLyAjcGF0aD1NYXBwYWJsZS5tYXBcbi8vIE1hcCBhIHBvc2l0aW9uIHRocm91Z2ggdGhpcyBvYmplY3QuIFdoZW4gZ2l2ZW4sIHRoZSBgYmlhc2Bcbi8vIGRldGVybWluZXMgaW4gd2hpY2ggZGlyZWN0aW9uIHRvIG1vdmUgd2hlbiBhIGNodW5rIG9mIGNvbnRlbnQgaXNcbi8vIGluc2VydGVkIGF0IG9yIGFyb3VuZCB0aGUgbWFwcGVkIHBvc2l0aW9uLlxuXG52YXIgTW92ZWRSYW5nZSA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE1vdmVkUmFuZ2Uoc3RhcnQsIHNpemUpIHtcbiAgICB2YXIgZGVzdCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMiB8fCBhcmd1bWVudHNbMl0gPT09IHVuZGVmaW5lZCA/IG51bGwgOiBhcmd1bWVudHNbMl07XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTW92ZWRSYW5nZSk7XG5cbiAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7XG4gICAgdGhpcy5zaXplID0gc2l6ZTtcbiAgICB0aGlzLmRlc3QgPSBkZXN0O1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKE1vdmVkUmFuZ2UsIFt7XG4gICAga2V5OiBcInRvU3RyaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgcmV0dXJuIFwiW21vdmVkIFwiICsgdGhpcy5zdGFydCArIFwiK1wiICsgdGhpcy5zaXplICsgXCIgdG8gXCIgKyB0aGlzLmRlc3QgKyBcIl1cIjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZW5kXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gbmV3IF9tb2RlbC5Qb3ModGhpcy5zdGFydC5wYXRoLCB0aGlzLnN0YXJ0Lm9mZnNldCArIHRoaXMuc2l6ZSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE1vdmVkUmFuZ2U7XG59KSgpO1xuXG5leHBvcnRzLk1vdmVkUmFuZ2UgPSBNb3ZlZFJhbmdlO1xuXG52YXIgU2lkZSA9IGZ1bmN0aW9uIFNpZGUoZnJvbSwgdG8sIHJlZikge1xuICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU2lkZSk7XG5cbiAgdGhpcy5mcm9tID0gZnJvbTtcbiAgdGhpcy50byA9IHRvO1xuICB0aGlzLnJlZiA9IHJlZjtcbn07XG5cbnZhciBSZXBsYWNlZFJhbmdlID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUmVwbGFjZWRSYW5nZShmcm9tLCB0bywgbmV3RnJvbSwgbmV3VG8pIHtcbiAgICB2YXIgcmVmID0gYXJndW1lbnRzLmxlbmd0aCA8PSA0IHx8IGFyZ3VtZW50c1s0XSA9PT0gdW5kZWZpbmVkID8gZnJvbSA6IGFyZ3VtZW50c1s0XTtcbiAgICB2YXIgbmV3UmVmID0gYXJndW1lbnRzLmxlbmd0aCA8PSA1IHx8IGFyZ3VtZW50c1s1XSA9PT0gdW5kZWZpbmVkID8gbmV3RnJvbSA6IGFyZ3VtZW50c1s1XTtcbiAgICByZXR1cm4gKGZ1bmN0aW9uICgpIHtcbiAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBSZXBsYWNlZFJhbmdlKTtcblxuICAgICAgdGhpcy5iZWZvcmUgPSBuZXcgU2lkZShmcm9tLCB0bywgcmVmKTtcbiAgICAgIHRoaXMuYWZ0ZXIgPSBuZXcgU2lkZShuZXdGcm9tLCBuZXdUbywgbmV3UmVmKTtcbiAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFJlcGxhY2VkUmFuZ2UsIFt7XG4gICAga2V5OiBcInRvU3RyaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgcmV0dXJuIFwiW3JlcGxhY2VkIFwiICsgdGhpcy5iZWZvcmUuZnJvbSArIFwiLVwiICsgdGhpcy5iZWZvcmUudG8gKyBcIiB3aXRoIFwiICsgdGhpcy5hZnRlci5mcm9tICsgXCItXCIgKyB0aGlzLmFmdGVyLnRvICsgXCJdXCI7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFJlcGxhY2VkUmFuZ2U7XG59KSgpO1xuXG5leHBvcnRzLlJlcGxhY2VkUmFuZ2UgPSBSZXBsYWNlZFJhbmdlO1xuXG52YXIgZW1wdHkgPSBbXTtcblxuZnVuY3Rpb24gb2Zmc2V0RnJvbShiYXNlLCBwb3MpIHtcbiAgaWYgKHBvcy5wYXRoLmxlbmd0aCA+IGJhc2UucGF0aC5sZW5ndGgpIHtcbiAgICB2YXIgcGF0aCA9IFtwb3MucGF0aFtiYXNlLnBhdGgubGVuZ3RoXSAtIGJhc2Uub2Zmc2V0XTtcbiAgICBmb3IgKHZhciBpID0gYmFzZS5wYXRoLmxlbmd0aCArIDE7IGkgPCBwb3MucGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgcGF0aC5wdXNoKHBvcy5wYXRoW2ldKTtcbiAgICB9cmV0dXJuIG5ldyBfbW9kZWwuUG9zKHBhdGgsIHBvcy5vZmZzZXQpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgX21vZGVsLlBvcyhbXSwgcG9zLm9mZnNldCAtIGJhc2Uub2Zmc2V0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXBUaHJvdWdoKG1hcCwgcG9zLCBiaWFzLCBiYWNrKSB7XG4gIGlmIChiaWFzID09PSB1bmRlZmluZWQpIGJpYXMgPSAxO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbWFwLnJlcGxhY2VkLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHJhbmdlID0gbWFwLnJlcGxhY2VkW2ldLFxuICAgICAgICBzaWRlID0gYmFjayA/IHJhbmdlLmFmdGVyIDogcmFuZ2UuYmVmb3JlO1xuICAgIHZhciBsZWZ0ID0gdW5kZWZpbmVkLFxuICAgICAgICByaWdodCA9IHVuZGVmaW5lZDtcbiAgICBpZiAoKGxlZnQgPSBwb3MuY21wKHNpZGUuZnJvbSkpID49IDAgJiYgKHJpZ2h0ID0gcG9zLmNtcChzaWRlLnRvKSkgPD0gMCkge1xuICAgICAgdmFyIG90aGVyID0gYmFjayA/IHJhbmdlLmJlZm9yZSA6IHJhbmdlLmFmdGVyO1xuICAgICAgcmV0dXJuIG5ldyBNYXBSZXN1bHQoYmlhcyA8IDAgPyBvdGhlci5mcm9tIDogb3RoZXIudG8sICEhKGxlZnQgJiYgcmlnaHQpLCB7IHJhbmdlSUQ6IGksIG9mZnNldDogb2Zmc2V0RnJvbShzaWRlLnJlZiwgcG9zKSB9KTtcbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcC5tb3ZlZC5sZW5ndGg7IGkrKykge1xuICAgIHZhciByYW5nZSA9IG1hcC5tb3ZlZFtpXTtcbiAgICB2YXIgc3RhcnQgPSBiYWNrID8gcmFuZ2UuZGVzdCA6IHJhbmdlLnN0YXJ0O1xuICAgIGlmIChwb3MuY21wKHN0YXJ0KSA+PSAwICYmIF9tb2RlbC5Qb3MuY21wKHBvcy5wYXRoLCBwb3Mub2Zmc2V0LCBzdGFydC5wYXRoLCBzdGFydC5vZmZzZXQgKyByYW5nZS5zaXplKSA8PSAwKSB7XG4gICAgICB2YXIgZGVzdCA9IGJhY2sgPyByYW5nZS5zdGFydCA6IHJhbmdlLmRlc3Q7XG4gICAgICB2YXIgZGVwdGggPSBzdGFydC5kZXB0aDtcbiAgICAgIGlmIChwb3MuZGVwdGggPiBkZXB0aCkge1xuICAgICAgICB2YXIgb2Zmc2V0ID0gZGVzdC5vZmZzZXQgKyAocG9zLnBhdGhbZGVwdGhdIC0gc3RhcnQub2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXBSZXN1bHQobmV3IF9tb2RlbC5Qb3MoZGVzdC5wYXRoLmNvbmNhdChvZmZzZXQpLmNvbmNhdChwb3MucGF0aC5zbGljZShkZXB0aCArIDEpKSwgcG9zLm9mZnNldCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXBSZXN1bHQobmV3IF9tb2RlbC5Qb3MoZGVzdC5wYXRoLCBkZXN0Lm9mZnNldCArIChwb3Mub2Zmc2V0IC0gc3RhcnQub2Zmc2V0KSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgTWFwUmVzdWx0KHBvcyk7XG59XG5cbi8vIDs7IEEgcG9zaXRpb24gbWFwLCBob2xkaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSB3YXkgcG9zaXRpb25zIGluXG4vLyB0aGUgcHJlLXN0ZXAgdmVyc2lvbiBvZiBhIGRvY3VtZW50IGNvcnJlc3BvbmQgdG8gcG9zaXRpb25zIGluIHRoZVxuLy8gcG9zdC1zdGVwIHZlcnNpb24uIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBgTWFwcGFibGVgLlxuXG52YXIgUG9zTWFwID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUG9zTWFwKG1vdmVkLCByZXBsYWNlZCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQb3NNYXApO1xuXG4gICAgdGhpcy5tb3ZlZCA9IG1vdmVkIHx8IGVtcHR5O1xuICAgIHRoaXMucmVwbGFjZWQgPSByZXBsYWNlZCB8fCBlbXB0eTtcbiAgfVxuXG4gIC8vIDs7ICN0b2M9ZmFsc2UgVGhlIHJldHVybiB2YWx1ZSBvZiBtYXBwaW5nIGEgcG9zaXRpb24uXG5cbiAgX2NyZWF0ZUNsYXNzKFBvc01hcCwgW3tcbiAgICBrZXk6IFwicmVjb3ZlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZWNvdmVyKG9mZnNldCkge1xuICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZWRbb2Zmc2V0LnJhbmdlSURdLmFmdGVyLnJlZi5leHRlbmQob2Zmc2V0Lm9mZnNldCk7XG4gICAgfVxuXG4gICAgLy8gOjogKFBvcywgP251bWJlcikg4oaSIE1hcFJlc3VsdFxuICAgIC8vIE1hcCB0aGUgZ2l2ZW4gcG9zaXRpb24gdGhyb3VnaCB0aGlzIG1hcC4gVGhlIGBiaWFzYCBwYXJhbWV0ZXIgY2FuXG4gICAgLy8gYmUgdXNlZCB0byBjb250cm9sIHdoYXQgaGFwcGVucyB3aGVuIHRoZSB0cmFuc2Zvcm0gaW5zZXJ0ZWRcbiAgICAvLyBjb250ZW50IGF0IChvciBhcm91bmQpIHRoaXMgcG9zaXRpb27igJRpZiBgYmlhc2AgaXMgbmVnYXRpdmUsIHRoZSBhXG4gICAgLy8gcG9zaXRpb24gYmVmb3JlIHRoZSBpbnNlcnRlZCBjb250ZW50IHdpbGwgYmUgcmV0dXJuZWQsIGlmIGl0IGlzXG4gICAgLy8gcG9zaXRpdmUsIGEgcG9zaXRpb24gYWZ0ZXIgdGhlIGluc2VydGlvbiBpcyByZXR1cm5lZC5cbiAgfSwge1xuICAgIGtleTogXCJtYXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFwKHBvcywgYmlhcykge1xuICAgICAgcmV0dXJuIG1hcFRocm91Z2godGhpcywgcG9zLCBiaWFzLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLy8gOjogKCkg4oaSIFBvc01hcFxuICAgIC8vIENyZWF0ZSBhbiBpbnZlcnRlZCB2ZXJzaW9uIG9mIHRoaXMgbWFwLiBUaGUgcmVzdWx0IGNhbiBiZSB1c2VkIHRvXG4gICAgLy8gbWFwIHBvc2l0aW9ucyBpbiB0aGUgcG9zdC1zdGVwIGRvY3VtZW50IHRvIHRoZSBwcmUtc3RlcCBkb2N1bWVudC5cbiAgfSwge1xuICAgIGtleTogXCJpbnZlcnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW52ZXJ0KCkge1xuICAgICAgcmV0dXJuIG5ldyBJbnZlcnRlZFBvc01hcCh0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9TdHJpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tb3ZlZC5jb25jYXQodGhpcy5yZXBsYWNlZCkuam9pbihcIiBcIik7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFBvc01hcDtcbn0pKCk7XG5cbmV4cG9ydHMuUG9zTWFwID0gUG9zTWFwO1xuXG52YXIgTWFwUmVzdWx0ID0gZnVuY3Rpb24gTWFwUmVzdWx0KHBvcykge1xuICB2YXIgZGVsZXRlZCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogYXJndW1lbnRzWzFdO1xuICB2YXIgcmVjb3ZlciA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMiB8fCBhcmd1bWVudHNbMl0gPT09IHVuZGVmaW5lZCA/IG51bGwgOiBhcmd1bWVudHNbMl07XG5cbiAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1hcFJlc3VsdCk7XG5cbiAgLy8gOjogUG9zIFRoZSBtYXBwZWQgdmVyc2lvbiBvZiB0aGUgcG9zaXRpb24uXG4gIHRoaXMucG9zID0gcG9zO1xuICAvLyA6OiBib29sIFRlbGxzIHlvdSB3aGV0aGVyIHRoZSBwb3NpdGlvbiB3YXMgZGVsZXRlZCwgdGhhdCBpcyxcbiAgLy8gd2hldGhlciB0aGUgc3RlcCByZW1vdmVkIGl0cyBzdXJyb3VuZGluZ3MgZnJvbSB0aGUgZG9jdW1lbnQuXG4gIHRoaXMuZGVsZXRlZCA9IGRlbGV0ZWQ7XG4gIHRoaXMucmVjb3ZlciA9IHJlY292ZXI7XG59O1xuXG5leHBvcnRzLk1hcFJlc3VsdCA9IE1hcFJlc3VsdDtcblxudmFyIEludmVydGVkUG9zTWFwID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gSW52ZXJ0ZWRQb3NNYXAobWFwKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEludmVydGVkUG9zTWFwKTtcblxuICAgIHRoaXMuaW5uZXIgPSBtYXA7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoSW52ZXJ0ZWRQb3NNYXAsIFt7XG4gICAga2V5OiBcInJlY292ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVjb3ZlcihvZmZzZXQpIHtcbiAgICAgIHJldHVybiB0aGlzLmlubmVyLnJlcGxhY2VkW29mZnNldC5yYW5nZUlEXS5iZWZvcmUucmVmLmV4dGVuZChvZmZzZXQub2Zmc2V0KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibWFwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hcChwb3MsIGJpYXMpIHtcbiAgICAgIHJldHVybiBtYXBUaHJvdWdoKHRoaXMuaW5uZXIsIHBvcywgYmlhcywgdHJ1ZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImludmVydFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnZlcnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbm5lcjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9TdHJpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICByZXR1cm4gXCItXCIgKyB0aGlzLmlubmVyO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBJbnZlcnRlZFBvc01hcDtcbn0pKCk7XG5cbnZhciBudWxsTWFwID0gbmV3IFBvc01hcCgpO1xuXG5leHBvcnRzLm51bGxNYXAgPSBudWxsTWFwO1xuLy8gOzsgQSByZW1hcHBpbmcgcmVwcmVzZW50cyBhIHBpcGVsaW5lIG9mIHplcm8gb3IgbW9yZSBtYXBwaW5ncy4gSXRcbi8vIGlzIGEgc3BlY2lhbGl6ZWQgZGF0YSBzdHJ1Y3R1cmVkIHVzZWQgdG8gbWFuYWdlIG1hcHBpbmcgdGhyb3VnaCBhXG4vLyBzZXJpZXMgb2Ygc3RlcHMsIHR5cGljYWxseSBpbmNsdWRpbmcgaW52ZXJ0ZWQgYW5kIG5vbi1pbnZlcnRlZFxuLy8gdmVyc2lvbnMgb2YgdGhlIHNhbWUgc3RlcC4gKFRoaXMgY29tZXMgdXAgd2hlbiDigJhyZWJhc2luZ+KAmSBzdGVwcyBmb3Jcbi8vIGNvbGxhYm9yYXRpb24gb3IgaGlzdG9yeSBtYW5hZ2VtZW50LikgVGhpcyBjbGFzcyBpbXBsZW1lbnRzXG4vLyBgTWFwcGFibGVgLlxuXG52YXIgUmVtYXBwaW5nID0gKGZ1bmN0aW9uICgpIHtcbiAgLy8gOjogKD9bUG9zTWFwXSwgP1tQb3NNYXBdKVxuXG4gIGZ1bmN0aW9uIFJlbWFwcGluZygpIHtcbiAgICB2YXIgaGVhZCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IFtdIDogYXJndW1lbnRzWzBdO1xuICAgIHZhciB0YWlsID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8gW10gOiBhcmd1bWVudHNbMV07XG4gICAgdmFyIG1pcnJvciA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMiB8fCBhcmd1bWVudHNbMl0gPT09IHVuZGVmaW5lZCA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiBhcmd1bWVudHNbMl07XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUmVtYXBwaW5nKTtcblxuICAgIC8vIDo6IFtQb3NNYXBdXG4gICAgLy8gVGhlIG1hcHMgaW4gdGhlIGhlYWQgb2YgdGhlIG1hcHBpbmcgYXJlIGFwcGxpZWQgdG8gaW5wdXRcbiAgICAvLyBwb3NpdGlvbnMgZmlyc3QsIGJhY2stdG8tZnJvbnQuIFNvIHRoZSBtYXAgYXQgdGhlIGVuZCBvZiB0aGlzXG4gICAgLy8gYXJyYXkgKGlmIGFueSkgaXMgdGhlIHZlcnkgZmlyc3Qgb25lIGFwcGxpZWQuXG4gICAgdGhpcy5oZWFkID0gaGVhZDtcbiAgICAvLyBUaGUgbWFwcyBpbiB0aGUgdGFpbCBhcmUgYXBwbGllZCBsYXN0LCBmcm9udC10by1iYWNrLlxuICAgIHRoaXMudGFpbCA9IHRhaWw7XG4gICAgdGhpcy5taXJyb3IgPSBtaXJyb3I7XG4gIH1cblxuICAvLyA6OiAoUG9zTWFwLCA/bnVtYmVyKSDihpIgbnVtYmVyXG4gIC8vIEFkZCBhIG1hcCB0byB0aGUgbWFwcGluZydzIGZyb250LiBJZiB0aGlzIG1hcCBpcyB0aGUgbWlycm9yIGltYWdlXG4gIC8vIChwcm9kdWNlZCBieSBhbiBpbnZlcnRlZCBzdGVwKSBvZiBhbm90aGVyIG1hcCBpbiB0aGlzIG1hcHBpbmcsXG4gIC8vIHRoYXQgbWFwJ3MgaWQgKGFzIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIG9yXG4gIC8vIFtgYWRkVG9CYWNrYF0oI1JlbWFwcGluZy5hZGRUb0JhY2spKSBzaG91bGQgYmUgcGFzc2VkIGFzIGEgc2Vjb25kXG4gIC8vIHBhcmFtZXRlciB0byByZWdpc3RlciB0aGUgY29ycmVzcG9uZGVuY2UuXG5cbiAgX2NyZWF0ZUNsYXNzKFJlbWFwcGluZywgW3tcbiAgICBrZXk6IFwiYWRkVG9Gcm9udFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRUb0Zyb250KG1hcCwgY29ycikge1xuICAgICAgdGhpcy5oZWFkLnB1c2gobWFwKTtcbiAgICAgIHZhciBpZCA9IC10aGlzLmhlYWQubGVuZ3RoO1xuICAgICAgaWYgKGNvcnIgIT0gbnVsbCkgdGhpcy5taXJyb3JbaWRdID0gY29ycjtcbiAgICAgIHJldHVybiBpZDtcbiAgICB9XG5cbiAgICAvLyA6OiAoUG9zTWFwLCA/bnVtYmVyKSDihpIgbnVtYmVyXG4gICAgLy8gQWRkIGEgbWFwIHRvIHRoZSBtYXBwaW5nJ3MgYmFjay4gSWYgdGhlIG1hcCBpcyB0aGUgbWlycm9yIGltYWdlXG4gICAgLy8gb2YgYW5vdGhlciBtYXBwaW5nIGluIHRoaXMgb2JqZWN0LCB0aGUgaWQgb2YgdGhhdCBtYXAgc2hvdWxkIGJlXG4gICAgLy8gcGFzc2VkIHRvIHJlZ2lzdGVyIHRoZSBjb3JyZXNwb25kZW5jZS5cbiAgfSwge1xuICAgIGtleTogXCJhZGRUb0JhY2tcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkVG9CYWNrKG1hcCwgY29ycikge1xuICAgICAgdGhpcy50YWlsLnB1c2gobWFwKTtcbiAgICAgIHZhciBpZCA9IHRoaXMudGFpbC5sZW5ndGggLSAxO1xuICAgICAgaWYgKGNvcnIgIT0gbnVsbCkgdGhpcy5taXJyb3JbY29ycl0gPSBpZDtcbiAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldChpZCkge1xuICAgICAgcmV0dXJuIGlkIDwgMCA/IHRoaXMuaGVhZFstaWQgLSAxXSA6IHRoaXMudGFpbFtpZF07XG4gICAgfVxuXG4gICAgLy8gOjogKFBvcywgP251bWJlcikg4oaSIE1hcFJlc3VsdFxuICAgIC8vIE1hcCBhIHBvc2l0aW9uIHRocm91Z2ggdGhpcyByZW1hcHBpbmcsIG9wdGlvbmFsbHkgcGFzc2luZyBhIGJpYXNcbiAgICAvLyBkaXJlY3Rpb24uXG4gIH0sIHtcbiAgICBrZXk6IFwibWFwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hcChwb3MsIGJpYXMpIHtcbiAgICAgIHZhciBkZWxldGVkID0gZmFsc2U7XG5cbiAgICAgIGZvciAodmFyIGkgPSAtdGhpcy5oZWFkLmxlbmd0aDsgaSA8IHRoaXMudGFpbC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbWFwID0gdGhpcy5nZXQoaSk7XG4gICAgICAgIHZhciByZXN1bHQgPSBtYXAubWFwKHBvcywgYmlhcyk7XG4gICAgICAgIGlmIChyZXN1bHQucmVjb3Zlcikge1xuICAgICAgICAgIHZhciBjb3JyID0gdGhpcy5taXJyb3JbaV07XG4gICAgICAgICAgaWYgKGNvcnIgIT0gbnVsbCkge1xuICAgICAgICAgICAgaSA9IGNvcnI7XG4gICAgICAgICAgICBwb3MgPSB0aGlzLmdldChjb3JyKS5yZWNvdmVyKHJlc3VsdC5yZWNvdmVyKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LmRlbGV0ZWQpIGRlbGV0ZWQgPSB0cnVlO1xuICAgICAgICBwb3MgPSByZXN1bHQucG9zO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IE1hcFJlc3VsdChwb3MsIGRlbGV0ZWQpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBSZW1hcHBpbmc7XG59KSgpO1xuXG5leHBvcnRzLlJlbWFwcGluZyA9IFJlbWFwcGluZzsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9tb2RlbCA9IHJlcXVpcmUoXCIuLi9tb2RlbFwiKTtcblxudmFyIF90cmFuc2Zvcm0gPSByZXF1aXJlKFwiLi90cmFuc2Zvcm1cIik7XG5cbnZhciBfc3RlcCA9IHJlcXVpcmUoXCIuL3N0ZXBcIik7XG5cbnZhciBfdHJlZSA9IHJlcXVpcmUoXCIuL3RyZWVcIik7XG5cbi8vICEhXG4vLyAqKmBhZGRNYXJrYCoqXG4vLyAgIDogQWRkIHRoZSBgTWFya2AgZ2l2ZW4gYXMgdGhlIHN0ZXAncyBwYXJhbWV0ZXIgdG8gYWxsXG4vLyAgICAgaW5saW5lIGNvbnRlbnQgYmV0d2VlbiBgZnJvbWAgYW5kIGB0b2AgKHdoZW4gYWxsb3dlZCkuXG4vL1xuLy8gKipgcmVtb3ZlTWFya2AqKlxuLy8gICA6IFJlbW92ZSB0aGUgYE1hcmtgIGdpdmVuIGFzIHRoZSBzdGVwJ3MgcGFyYW1ldGVyIGZyb20gYWxsIGlubGluZVxuLy8gICAgIGNvbnRlbnQgYmV0d2VlbiBgZnJvbWAgYW5kIGB0b2AuXG5cbl9zdGVwLlN0ZXAuZGVmaW5lKFwiYWRkTWFya1wiLCB7XG4gIGFwcGx5OiBmdW5jdGlvbiBhcHBseShkb2MsIHN0ZXApIHtcbiAgICByZXR1cm4gbmV3IF9zdGVwLlN0ZXBSZXN1bHQoKDAsIF90cmVlLmNvcHlTdHJ1Y3R1cmUpKGRvYywgc3RlcC5mcm9tLCBzdGVwLnRvLCBmdW5jdGlvbiAobm9kZSwgZnJvbSwgdG8pIHtcbiAgICAgIGlmICghbm9kZS50eXBlLmNhbkNvbnRhaW5NYXJrKHN0ZXAucGFyYW0pKSByZXR1cm4gbm9kZTtcbiAgICAgIHJldHVybiAoMCwgX3RyZWUuY29weUlubGluZSkobm9kZSwgZnJvbSwgdG8sIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLm1hcmsoc3RlcC5wYXJhbS5hZGRUb1NldChub2RlLm1hcmtzKSk7XG4gICAgICB9KTtcbiAgICB9KSk7XG4gIH0sXG4gIGludmVydDogZnVuY3Rpb24gaW52ZXJ0KHN0ZXAsIF9vbGREb2MsIG1hcCkge1xuICAgIHJldHVybiBuZXcgX3N0ZXAuU3RlcChcInJlbW92ZU1hcmtcIiwgc3RlcC5mcm9tLCBtYXAubWFwKHN0ZXAudG8pLnBvcywgbnVsbCwgc3RlcC5wYXJhbSk7XG4gIH0sXG4gIHBhcmFtVG9KU09OOiBmdW5jdGlvbiBwYXJhbVRvSlNPTihwYXJhbSkge1xuICAgIHJldHVybiBwYXJhbS50b0pTT04oKTtcbiAgfSxcbiAgcGFyYW1Gcm9tSlNPTjogZnVuY3Rpb24gcGFyYW1Gcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICByZXR1cm4gc2NoZW1hLm1hcmtGcm9tSlNPTihqc29uKTtcbiAgfVxufSk7XG5cbi8vIDo6IChQb3MsIFBvcywgTWFyaykg4oaSIFRyYW5zZm9ybVxuLy8gQWRkIHRoZSBnaXZlbiBtYXJrIHRvIHRoZSBpbmxpbmUgY29udGVudCBiZXR3ZWVuIGBmcm9tYCBhbmQgYHRvYC5cbl90cmFuc2Zvcm0uVHJhbnNmb3JtLnByb3RvdHlwZS5hZGRNYXJrID0gZnVuY3Rpb24gKGZyb20sIHRvLCBtYXJrKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdmFyIHJlbW92ZWQgPSBbXSxcbiAgICAgIGFkZGVkID0gW10sXG4gICAgICByZW1vdmluZyA9IG51bGwsXG4gICAgICBhZGRpbmcgPSBudWxsO1xuICB0aGlzLmRvYy5pbmxpbmVOb2Rlc0JldHdlZW4oZnJvbSwgdG8sIGZ1bmN0aW9uIChfcmVmLCBwYXRoLCBzdGFydCwgZW5kLCBwYXJlbnQpIHtcbiAgICB2YXIgbWFya3MgPSBfcmVmLm1hcmtzO1xuXG4gICAgaWYgKG1hcmsuaXNJblNldChtYXJrcykgfHwgIXBhcmVudC50eXBlLmNhbkNvbnRhaW5NYXJrKG1hcmsudHlwZSkpIHtcbiAgICAgIGFkZGluZyA9IHJlbW92aW5nID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHJtID0gbWFyay50eXBlLmlzSW5TZXQobWFya3MpO1xuICAgICAgaWYgKHJtKSB7XG4gICAgICAgIGlmIChyZW1vdmluZyAmJiByZW1vdmluZy5wYXJhbS5lcShybSkpIHtcbiAgICAgICAgICByZW1vdmluZy50byA9IG5ldyBfbW9kZWwuUG9zKHBhdGgsIGVuZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVtb3ZpbmcgPSBuZXcgX3N0ZXAuU3RlcChcInJlbW92ZU1hcmtcIiwgbmV3IF9tb2RlbC5Qb3MocGF0aCwgc3RhcnQpLCBuZXcgX21vZGVsLlBvcyhwYXRoLCBlbmQpLCBudWxsLCBybSk7XG4gICAgICAgICAgcmVtb3ZlZC5wdXNoKHJlbW92aW5nKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChyZW1vdmluZykge1xuICAgICAgICByZW1vdmluZyA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoYWRkaW5nKSB7XG4gICAgICAgIGFkZGluZy50byA9IG5ldyBfbW9kZWwuUG9zKHBhdGgsIGVuZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhZGRpbmcgPSBuZXcgX3N0ZXAuU3RlcChcImFkZE1hcmtcIiwgbmV3IF9tb2RlbC5Qb3MocGF0aCwgc3RhcnQpLCBuZXcgX21vZGVsLlBvcyhwYXRoLCBlbmQpLCBudWxsLCBtYXJrKTtcbiAgICAgICAgYWRkZWQucHVzaChhZGRpbmcpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJlbW92ZWQuZm9yRWFjaChmdW5jdGlvbiAocykge1xuICAgIHJldHVybiBfdGhpcy5zdGVwKHMpO1xuICB9KTtcbiAgYWRkZWQuZm9yRWFjaChmdW5jdGlvbiAocykge1xuICAgIHJldHVybiBfdGhpcy5zdGVwKHMpO1xuICB9KTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5fc3RlcC5TdGVwLmRlZmluZShcInJlbW92ZU1hcmtcIiwge1xuICBhcHBseTogZnVuY3Rpb24gYXBwbHkoZG9jLCBzdGVwKSB7XG4gICAgcmV0dXJuIG5ldyBfc3RlcC5TdGVwUmVzdWx0KCgwLCBfdHJlZS5jb3B5U3RydWN0dXJlKShkb2MsIHN0ZXAuZnJvbSwgc3RlcC50bywgZnVuY3Rpb24gKG5vZGUsIGZyb20sIHRvKSB7XG4gICAgICByZXR1cm4gKDAsIF90cmVlLmNvcHlJbmxpbmUpKG5vZGUsIGZyb20sIHRvLCBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5tYXJrKHN0ZXAucGFyYW0ucmVtb3ZlRnJvbVNldChub2RlLm1hcmtzKSk7XG4gICAgICB9KTtcbiAgICB9KSk7XG4gIH0sXG4gIGludmVydDogZnVuY3Rpb24gaW52ZXJ0KHN0ZXAsIF9vbGREb2MsIG1hcCkge1xuICAgIHJldHVybiBuZXcgX3N0ZXAuU3RlcChcImFkZE1hcmtcIiwgc3RlcC5mcm9tLCBtYXAubWFwKHN0ZXAudG8pLnBvcywgbnVsbCwgc3RlcC5wYXJhbSk7XG4gIH0sXG4gIHBhcmFtVG9KU09OOiBmdW5jdGlvbiBwYXJhbVRvSlNPTihwYXJhbSkge1xuICAgIHJldHVybiBwYXJhbS50b0pTT04oKTtcbiAgfSxcbiAgcGFyYW1Gcm9tSlNPTjogZnVuY3Rpb24gcGFyYW1Gcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICByZXR1cm4gc2NoZW1hLm1hcmtGcm9tSlNPTihqc29uKTtcbiAgfVxufSk7XG5cbi8vIDo6IChQb3MsIFBvcywgdW5pb248TWFyaywgTWFya1R5cGU+KSDihpIgVHJhbnNmb3JtXG4vLyBSZW1vdmUgdGhlIGdpdmVuIG1hcmssIG9yIGFsbCBtYXJrcyBvZiB0aGUgZ2l2ZW4gdHlwZSwgZnJvbSBpbmxpbmVcbi8vIG5vZGVzIGJldHdlZW4gYGZyb21gIGFuZCBgdG9gLlxuX3RyYW5zZm9ybS5UcmFuc2Zvcm0ucHJvdG90eXBlLnJlbW92ZU1hcmsgPSBmdW5jdGlvbiAoZnJvbSwgdG8pIHtcbiAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgdmFyIG1hcmsgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDIgfHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyBudWxsIDogYXJndW1lbnRzWzJdO1xuXG4gIHZhciBtYXRjaGVkID0gW10sXG4gICAgICBzdGVwID0gMDtcbiAgdGhpcy5kb2MuaW5saW5lTm9kZXNCZXR3ZWVuKGZyb20sIHRvLCBmdW5jdGlvbiAoX3JlZjIsIHBhdGgsIHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgbWFya3MgPSBfcmVmMi5tYXJrcztcblxuICAgIHN0ZXArKztcbiAgICB2YXIgdG9SZW1vdmUgPSBudWxsO1xuICAgIGlmIChtYXJrIGluc3RhbmNlb2YgX21vZGVsLk1hcmtUeXBlKSB7XG4gICAgICB2YXIgZm91bmQgPSBtYXJrLmlzSW5TZXQobWFya3MpO1xuICAgICAgaWYgKGZvdW5kKSB0b1JlbW92ZSA9IFtmb3VuZF07XG4gICAgfSBlbHNlIGlmIChtYXJrKSB7XG4gICAgICBpZiAobWFyay5pc0luU2V0KG1hcmtzKSkgdG9SZW1vdmUgPSBbbWFya107XG4gICAgfSBlbHNlIHtcbiAgICAgIHRvUmVtb3ZlID0gbWFya3M7XG4gICAgfVxuICAgIGlmICh0b1JlbW92ZSAmJiB0b1JlbW92ZS5sZW5ndGgpIHtcbiAgICAgIHBhdGggPSBwYXRoLnNsaWNlKCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBybSA9IHRvUmVtb3ZlW2ldLFxuICAgICAgICAgICAgZm91bmQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbWF0Y2hlZC5sZW5ndGg7IGorKykge1xuICAgICAgICAgIHZhciBtID0gbWF0Y2hlZFtqXTtcbiAgICAgICAgICBpZiAobS5zdGVwID09IHN0ZXAgLSAxICYmIHJtLmVxKG1hdGNoZWRbal0uc3R5bGUpKSBmb3VuZCA9IG07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgZm91bmQudG8gPSBuZXcgX21vZGVsLlBvcyhwYXRoLCBlbmQpO1xuICAgICAgICAgIGZvdW5kLnN0ZXAgPSBzdGVwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1hdGNoZWQucHVzaCh7IHN0eWxlOiBybSwgZnJvbTogbmV3IF9tb2RlbC5Qb3MocGF0aCwgc3RhcnQpLCB0bzogbmV3IF9tb2RlbC5Qb3MocGF0aCwgZW5kKSwgc3RlcDogc3RlcCB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIG1hdGNoZWQuZm9yRWFjaChmdW5jdGlvbiAobSkge1xuICAgIHJldHVybiBfdGhpczIuc3RlcChcInJlbW92ZU1hcmtcIiwgbS5mcm9tLCBtLnRvLCBudWxsLCBtLnN0eWxlKTtcbiAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gOjogKFBvcywgUG9zLCA/Tm9kZVR5cGUpIOKGkiBUcmFuc2Zvcm1cbi8vIFJlbW92ZSBhbGwgbWFya3MgYW5kIG5vbi10ZXh0IGlubGluZSBub2Rlcywgb3IgaWYgYG5ld1BhcmVudGAgaXNcbi8vIGdpdmVuLCBhbGwgbWFya3MgYW5kIGlubGluZSBub2RlcyB0aGF0IG1heSBub3QgYXBwZWFyIGFzIGNvbnRlbnQgb2Zcbi8vIGBuZXdQYXJlbnRgLCBmcm9tIHRoZSBnaXZlbiByYW5nZS5cbl90cmFuc2Zvcm0uVHJhbnNmb3JtLnByb3RvdHlwZS5jbGVhck1hcmt1cCA9IGZ1bmN0aW9uIChmcm9tLCB0bywgbmV3UGFyZW50KSB7XG4gIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gIHZhciBkZWxTdGVwcyA9IFtdOyAvLyBNdXN0IGJlIGFjY3VtdWxhdGVkIGFuZCBhcHBsaWVkIGluIGludmVyc2Ugb3JkZXJcbiAgdGhpcy5kb2MuaW5saW5lTm9kZXNCZXR3ZWVuKGZyb20sIHRvLCBmdW5jdGlvbiAoX3JlZjMsIHBhdGgsIHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgbWFya3MgPSBfcmVmMy5tYXJrcztcbiAgICB2YXIgdHlwZSA9IF9yZWYzLnR5cGU7XG5cbiAgICBpZiAobmV3UGFyZW50ID8gIW5ld1BhcmVudC5jYW5Db250YWluVHlwZSh0eXBlKSA6ICF0eXBlLmlzVGV4dCkge1xuICAgICAgcGF0aCA9IHBhdGguc2xpY2UoKTtcbiAgICAgIHZhciBfZnJvbSA9IG5ldyBfbW9kZWwuUG9zKHBhdGgsIHN0YXJ0KTtcbiAgICAgIGRlbFN0ZXBzLnB1c2gobmV3IF9zdGVwLlN0ZXAoXCJyZXBsYWNlXCIsIF9mcm9tLCBuZXcgX21vZGVsLlBvcyhwYXRoLCBlbmQpLCBfZnJvbSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbWFyayA9IG1hcmtzW2ldO1xuICAgICAgaWYgKCFuZXdQYXJlbnQgfHwgIW5ld1BhcmVudC5jYW5Db250YWluTWFyayhtYXJrLnR5cGUpKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnNsaWNlKCk7XG4gICAgICAgIF90aGlzMy5zdGVwKFwicmVtb3ZlTWFya1wiLCBuZXcgX21vZGVsLlBvcyhwYXRoLCBzdGFydCksIG5ldyBfbW9kZWwuUG9zKHBhdGgsIGVuZCksIG51bGwsIG1hcmspO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIGZvciAodmFyIGkgPSBkZWxTdGVwcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHRoaXMuc3RlcChkZWxTdGVwc1tpXSk7XG4gIH1yZXR1cm4gdGhpcztcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnJlcGxhY2UgPSByZXBsYWNlO1xuXG52YXIgX21vZGVsID0gcmVxdWlyZShcIi4uL21vZGVsXCIpO1xuXG52YXIgX3RyYW5zZm9ybSA9IHJlcXVpcmUoXCIuL3RyYW5zZm9ybVwiKTtcblxudmFyIF9zdGVwID0gcmVxdWlyZShcIi4vc3RlcFwiKTtcblxudmFyIF9tYXAgPSByZXF1aXJlKFwiLi9tYXBcIik7XG5cbnZhciBfdHJlZSA9IHJlcXVpcmUoXCIuL3RyZWVcIik7XG5cbi8vICEhICoqYHJlcGxhY2VgKipcblxuLy8gICA6IERlbGV0ZSB0aGUgcGFydCBvZiB0aGUgZG9jdW1lbnQgYmV0d2VlbiBgZnJvbWAgYW5kIGB0b2AgYW5kXG4vLyAgICAgb3B0aW9uYWxseSByZXBsYWNlIGl0IHdpdGggYW5vdGhlciBjaHVuayBvZiBjb250ZW50LiBgcG9zYCBtdXN0XG4vLyAgICAgcG9pbnQgYXQgdGhlIOKAmHJvb3TigJkgYXQgd2hpY2ggdGhlIGN1dCBzdGFydHPigJRhIHBvc2l0aW9uIGJldHdlZW5cbi8vICAgICBhbmQgYWJvdmUgYGZyb21gIGFuZCBgdG9gLlxuLy9cbi8vICAgICBXaGVuIG5ldyBjb250ZW50IGlzIHRvIGJlIGluc2VydGVkLCB0aGUgc3RlcCdzIHBhcmFtZXRlciBzaG91bGRcbi8vICAgICBiZSBhbiBvYmplY3Qgb2Ygc2hhcGUgYHtjb250ZW50OiBgW2BGcmFnbWVudGBdKCNGcmFnbWVudClgLFxuLy8gICAgIG9wZW5MZWZ0OiBudW1iZXIsIG9wZW5SaWdodDogbnVtYmVyfWAuIFRoZSBzdGVwIHdpbGwgaW5zZXJ0IHRoZVxuLy8gICAgIGdpdmVuIGNvbnRlbnQgYXQgdGhlIHJvb3Qgb2YgdGhlIGN1dCwgYW5kIGBvcGVuTGVmdGAgYW5kXG4vLyAgICAgYG9wZW5SaWdodGAgaW5kaWNhdGUgaG93IG11Y2ggb2YgdGhlIGNvbnRlbnQgb24gYm90aCBzaWRlc1xuLy8gICAgIHNob3VsZCBiZSBjb25zaWRlZCDigJhvcGVu4oCZLlxuLy9cbi8vICAgICBBIHJlcGxhY2Ugc3RlcCB3aWxsIHRyeSB0byBqb2luIG9wZW4gbm9kZXMgb24gYm90aCBzaWRlcyBvZiB0aGVcbi8vICAgICBjdXQuIFRoYXQgaXMsIG5vZGVzIGluIHRoZSBvcmlnaW5hbCBkb2N1bWVudCB0aGF0IGFyZSBwYXJ0aWFsbHlcbi8vICAgICBjdXQgb2ZmIGJ5IGBmcm9tYCBhbmQgYHRvYCwgYW5kIG5vZGVzIGF0IHRoZSBzaWRlcyBvZiB0aGVcbi8vICAgICByZXBsYWNlbWVudCBjb250ZW50IGFzIHNwZWNpZmljZWQgYnkgYG9wZW5MZWZ0YCBhbmRcbi8vICAgICBgb3BlblJpZ2h0YC4gRm9yIGV4YW1wbGUsIGlmIGBvcGVuTGVmdGAgaXMgMiwgdGhlIGZpcnN0IG5vZGUgb2Zcbi8vICAgICB0aGUgcmVwbGFjZW1lbnQgY29udGVudCBhcyB3ZWxsIGFzIGl0cyBmaXJzdCBjaGlsZCBpc1xuLy8gICAgIGNvbnNpZGVyZWQgb3Blbi4gV2hlbmV2ZXIgdHdvIG9wZW4gbm9kZXMgd2l0aCB0aGUgc2FtZVxuLy8gICAgIFttYXJrdXBdKCNOb2RlLnNhbWVNYXJrdXApIGVuZCB1cCBuZXh0IHRvIGVhY2ggb3RoZXIsIHRoZXkgYXJlXG4vLyAgICAgam9pbmVkLiBPcGVuIG5vZGVzIHRoYXQgYXJlbid0IGpvaW5lZCBhcmUgW2Nsb3NlZF0oI05vZGUuY2xvc2UpXG4vLyAgICAgdG8gZW5zdXJlIHRoZWlyIGNvbnRlbnQgKG9yIGxhY2sgb2YgaXQpIGlzIHZhbGlkLlxuXG5mdW5jdGlvbiBmaW5kTW92ZWRDaHVua3Mob2xkTm9kZSwgb2xkUGF0aCwgbmV3Tm9kZSwgc3RhcnREZXB0aCkge1xuICB2YXIgbW92ZWQgPSBbXTtcbiAgdmFyIG5ld1BhdGggPSBvbGRQYXRoLnBhdGguc2xpY2UoMCwgc3RhcnREZXB0aCk7XG5cbiAgZm9yICh2YXIgZGVwdGggPSBzdGFydERlcHRoOzsgZGVwdGgrKykge1xuICAgIHZhciBqb2luZWQgPSBkZXB0aCA9PSBvbGRQYXRoLmRlcHRoID8gMCA6IDE7XG4gICAgdmFyIGN1dCA9IGRlcHRoID09IG9sZFBhdGguZGVwdGggPyBvbGRQYXRoLm9mZnNldCA6IG9sZFBhdGgucGF0aFtkZXB0aF07XG4gICAgdmFyIGFmdGVyQ3V0ID0gb2xkTm9kZS5zaXplIC0gY3V0O1xuICAgIHZhciBuZXdPZmZzZXQgPSBuZXdOb2RlLnNpemUgLSBhZnRlckN1dDtcblxuICAgIHZhciBmcm9tID0gb2xkUGF0aC5zaG9ydGVuKGRlcHRoLCBqb2luZWQpO1xuICAgIHZhciB0byA9IG5ldyBfbW9kZWwuUG9zKG5ld1BhdGgsIG5ld09mZnNldCArIGpvaW5lZCk7XG4gICAgaWYgKGZyb20uY21wKHRvKSkgbW92ZWQucHVzaChuZXcgX21hcC5Nb3ZlZFJhbmdlKGZyb20sIGFmdGVyQ3V0IC0gam9pbmVkLCB0bykpO1xuXG4gICAgaWYgKCFqb2luZWQpIHJldHVybiBtb3ZlZDtcblxuICAgIG9sZE5vZGUgPSBvbGROb2RlLmNoaWxkKGN1dCk7XG4gICAgbmV3Tm9kZSA9IG5ld05vZGUuY2hpbGQobmV3T2Zmc2V0KTtcbiAgICBuZXdQYXRoID0gbmV3UGF0aC5jb25jYXQobmV3T2Zmc2V0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYWNlKG5vZGUsIGZyb20sIHRvLCByb290LCByZXBsKSB7XG4gIHZhciBkZXB0aCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gNSB8fCBhcmd1bWVudHNbNV0gPT09IHVuZGVmaW5lZCA/IDAgOiBhcmd1bWVudHNbNV07XG5cbiAgaWYgKGRlcHRoID09IHJvb3QubGVuZ3RoKSB7XG4gICAgdmFyIGJlZm9yZSA9IG5vZGUuc2xpY2VCZXR3ZWVuKG51bGwsIGZyb20sIGRlcHRoKTtcbiAgICB2YXIgYWZ0ZXIgPSBub2RlLnNsaWNlQmV0d2Vlbih0bywgbnVsbCwgZGVwdGgpLFxuICAgICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKCFiZWZvcmUudHlwZS5jYW5Db250YWluRnJhZ21lbnQocmVwbC5jb250ZW50KSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHJlcGwuY29udGVudC5zaXplKSByZXN1bHQgPSBiZWZvcmUuYXBwZW5kKHJlcGwuY29udGVudCwgZnJvbS5kZXB0aCAtIGRlcHRoLCByZXBsLm9wZW5MZWZ0KS5hcHBlbmQoYWZ0ZXIuY29udGVudCwgcmVwbC5vcGVuUmlnaHQsIHRvLmRlcHRoIC0gZGVwdGgpO2Vsc2UgcmVzdWx0ID0gYmVmb3JlLmFwcGVuZChhZnRlci5jb250ZW50LCBmcm9tLmRlcHRoIC0gZGVwdGgsIHRvLmRlcHRoIC0gZGVwdGgpO1xuICAgIGlmICghcmVzdWx0LnNpemUgJiYgIXJlc3VsdC50eXBlLmNhbkJlRW1wdHkpIHJlc3VsdCA9IHJlc3VsdC5jb3B5KHJlc3VsdC50eXBlLmRlZmF1bHRDb250ZW50KCkpO1xuICAgIHJldHVybiB7IGRvYzogcmVzdWx0LCBtb3ZlZDogZmluZE1vdmVkQ2h1bmtzKG5vZGUsIHRvLCByZXN1bHQsIGRlcHRoKSB9O1xuICB9IGVsc2Uge1xuICAgIHZhciBwb3MgPSByb290W2RlcHRoXTtcbiAgICB2YXIgcmVzdWx0ID0gcmVwbGFjZShub2RlLmNoaWxkKHBvcyksIGZyb20sIHRvLCByb290LCByZXBsLCBkZXB0aCArIDEpO1xuICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4geyBkb2M6IG5vZGUucmVwbGFjZShwb3MsIHJlc3VsdC5kb2MpLCBtb3ZlZDogcmVzdWx0Lm1vdmVkIH07XG4gIH1cbn1cblxudmFyIG51bGxSZXBsID0geyBjb250ZW50OiBfbW9kZWwuZW1wdHlGcmFnbWVudCwgb3BlbkxlZnQ6IDAsIG9wZW5SaWdodDogMCB9O1xuXG5fc3RlcC5TdGVwLmRlZmluZShcInJlcGxhY2VcIiwge1xuICBhcHBseTogZnVuY3Rpb24gYXBwbHkoZG9jLCBzdGVwKSB7XG4gICAgdmFyIHJvb3RQb3MgPSBzdGVwLnBvcyxcbiAgICAgICAgcm9vdCA9IHJvb3RQb3MucGF0aDtcbiAgICBpZiAoc3RlcC5mcm9tLmRlcHRoIDwgcm9vdC5sZW5ndGggfHwgc3RlcC50by5kZXB0aCA8IHJvb3QubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvb3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChzdGVwLmZyb20ucGF0aFtpXSAhPSByb290W2ldIHx8IHN0ZXAudG8ucGF0aFtpXSAhPSByb290W2ldKSByZXR1cm4gbnVsbDtcbiAgICB9dmFyIHJlc3VsdCA9IHJlcGxhY2UoZG9jLCBzdGVwLmZyb20sIHN0ZXAudG8sIHJvb3RQb3MucGF0aCwgc3RlcC5wYXJhbSB8fCBudWxsUmVwbCk7XG4gICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgIHZhciBvdXQgPSByZXN1bHQuZG9jO1xuICAgIHZhciBtb3ZlZCA9IHJlc3VsdC5tb3ZlZDtcblxuICAgIHZhciBlbmQgPSBtb3ZlZC5sZW5ndGggPyBtb3ZlZFttb3ZlZC5sZW5ndGggLSAxXS5kZXN0IDogc3RlcC50bztcbiAgICB2YXIgcmVwbGFjZWQgPSBuZXcgX21hcC5SZXBsYWNlZFJhbmdlKHN0ZXAuZnJvbSwgc3RlcC50bywgc3RlcC5mcm9tLCBlbmQsIHJvb3RQb3MsIHJvb3RQb3MpO1xuICAgIHJldHVybiBuZXcgX3N0ZXAuU3RlcFJlc3VsdChvdXQsIG5ldyBfbWFwLlBvc01hcChtb3ZlZCwgW3JlcGxhY2VkXSkpO1xuICB9LFxuICBpbnZlcnQ6IGZ1bmN0aW9uIGludmVydChzdGVwLCBvbGREb2MsIG1hcCkge1xuICAgIHZhciBkZXB0aCA9IHN0ZXAucG9zLmRlcHRoO1xuICAgIHJldHVybiBuZXcgX3N0ZXAuU3RlcChcInJlcGxhY2VcIiwgc3RlcC5mcm9tLCBtYXAubWFwKHN0ZXAudG8pLnBvcywgc3RlcC5mcm9tLnNob3J0ZW4oZGVwdGgpLCB7XG4gICAgICBjb250ZW50OiBvbGREb2MucGF0aChzdGVwLnBvcy5wYXRoKS5jb250ZW50LnNsaWNlQmV0d2VlbihzdGVwLmZyb20sIHN0ZXAudG8sIGRlcHRoKSxcbiAgICAgIG9wZW5MZWZ0OiBzdGVwLmZyb20uZGVwdGggLSBkZXB0aCxcbiAgICAgIG9wZW5SaWdodDogc3RlcC50by5kZXB0aCAtIGRlcHRoXG4gICAgfSk7XG4gIH0sXG4gIHBhcmFtVG9KU09OOiBmdW5jdGlvbiBwYXJhbVRvSlNPTihwYXJhbSkge1xuICAgIHJldHVybiBwYXJhbSAmJiB7IGNvbnRlbnQ6IHBhcmFtLmNvbnRlbnQuc2l6ZSAmJiBwYXJhbS5jb250ZW50LnRvSlNPTigpLFxuICAgICAgb3BlbkxlZnQ6IHBhcmFtLm9wZW5MZWZ0LCBvcGVuUmlnaHQ6IHBhcmFtLm9wZW5SaWdodCB9O1xuICB9LFxuICBwYXJhbUZyb21KU09OOiBmdW5jdGlvbiBwYXJhbUZyb21KU09OKHNjaGVtYSwganNvbikge1xuICAgIHJldHVybiBqc29uICYmIHsgY29udGVudDogX21vZGVsLkZyYWdtZW50LmZyb21KU09OKHNjaGVtYSwganNvbi5jb250ZW50KSxcbiAgICAgIG9wZW5MZWZ0OiBqc29uLm9wZW5MZWZ0LCBvcGVuUmlnaHQ6IGpzb24ub3BlblJpZ2h0IH07XG4gIH1cbn0pO1xuXG5mdW5jdGlvbiBzaGlmdEZyb21TdGFjayhzdGFjaywgZGVwdGgpIHtcbiAgdmFyIHNoaWZ0ZWQgPSBzdGFja1tkZXB0aF0gPSBzdGFja1tkZXB0aF0uc3BsaWNlKDAsIDEsIF9tb2RlbC5lbXB0eUZyYWdtZW50KTtcbiAgZm9yICh2YXIgaSA9IGRlcHRoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBzaGlmdGVkID0gc3RhY2tbaV0gPSBzdGFja1tpXS5yZXBsYWNlKDAsIHNoaWZ0ZWQpO1xuICB9XG59XG5cbi8vIEZJWE1FIGZpbmQgYSBub3Qgc28gaG9ycmlibHkgY29uZnVzaW5nIHdheSB0byBleHByZXNzIHRoaXNcbmZ1bmN0aW9uIGJ1aWxkSW5zZXJ0ZWQobm9kZXNMZWZ0LCBzb3VyY2UsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHNsaWNlZCA9IHNvdXJjZS5zbGljZUJldHdlZW4oc3RhcnQsIGVuZCk7XG4gIHZhciBub2Rlc1JpZ2h0ID0gW107XG4gIGZvciAodmFyIG5vZGUgPSBzbGljZWQsIGkgPSAwOyBpIDw9IHN0YXJ0LnBhdGgubGVuZ3RoOyBpKyssIG5vZGUgPSBub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICBub2Rlc1JpZ2h0LnB1c2gobm9kZSk7XG4gIH12YXIgc2FtZSA9ICgwLCBfdHJlZS5zYW1lUGF0aERlcHRoKShzdGFydCwgZW5kKTtcbiAgdmFyIHNlYXJjaExlZnQgPSBub2Rlc0xlZnQubGVuZ3RoIC0gMSxcbiAgICAgIHNlYXJjaFJpZ2h0ID0gbm9kZXNSaWdodC5sZW5ndGggLSAxO1xuICB2YXIgcmVzdWx0ID0gbnVsbDtcblxuICB2YXIgaW5uZXIgPSBub2Rlc1JpZ2h0W3NlYXJjaFJpZ2h0XTtcbiAgaWYgKGlubmVyLmlzVGV4dGJsb2NrICYmIGlubmVyLnNpemUgJiYgbm9kZXNMZWZ0W3NlYXJjaExlZnRdLmlzVGV4dGJsb2NrKSB7XG4gICAgcmVzdWx0ID0gbm9kZXNMZWZ0W3NlYXJjaExlZnQtLV0uY29weShpbm5lci5jb250ZW50KTtcbiAgICAtLXNlYXJjaFJpZ2h0O1xuICAgIHNoaWZ0RnJvbVN0YWNrKG5vZGVzUmlnaHQsIHNlYXJjaFJpZ2h0KTtcbiAgfVxuXG4gIGZvciAoOzspIHtcbiAgICB2YXIgbm9kZSA9IG5vZGVzUmlnaHRbc2VhcmNoUmlnaHRdLFxuICAgICAgICB0eXBlID0gbm9kZS50eXBlLFxuICAgICAgICBtYXRjaGVkID0gbnVsbDtcbiAgICB2YXIgb3V0c2lkZSA9IHNlYXJjaFJpZ2h0IDw9IHNhbWU7XG4gICAgZm9yICh2YXIgaSA9IHNlYXJjaExlZnQ7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgbGVmdCA9IG5vZGVzTGVmdFtpXTtcbiAgICAgIGlmIChvdXRzaWRlID8gbGVmdC50eXBlLmNhbkNvbnRhaW5Db250ZW50KG5vZGUudHlwZSkgOiBsZWZ0LnR5cGUgPT0gdHlwZSkge1xuICAgICAgICBtYXRjaGVkID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtYXRjaGVkICE9IG51bGwpIHtcbiAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgIHJlc3VsdCA9IG5vZGVzTGVmdFttYXRjaGVkXS5jb3B5KG5vZGUuY29udGVudCk7XG4gICAgICAgIHNlYXJjaExlZnQgPSBtYXRjaGVkIC0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdoaWxlIChzZWFyY2hMZWZ0ID49IG1hdGNoZWQpIHtcbiAgICAgICAgICB2YXIgd3JhcCA9IG5vZGVzTGVmdFtzZWFyY2hMZWZ0XTtcbiAgICAgICAgICB2YXIgY29udGVudCA9IF9tb2RlbC5GcmFnbWVudC5mcm9tKHJlc3VsdCk7XG4gICAgICAgICAgcmVzdWx0ID0gd3JhcC5jb3B5KHNlYXJjaExlZnQgPT0gbWF0Y2hlZCA/IGNvbnRlbnQuYXBwZW5kKG5vZGUuY29udGVudCkgOiBjb250ZW50KTtcbiAgICAgICAgICBzZWFyY2hMZWZ0LS07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG1hdGNoZWQgIT0gbnVsbCB8fCBub2RlLnNpemUgPT0gMCkge1xuICAgICAgaWYgKG91dHNpZGUpIGJyZWFrO1xuICAgICAgaWYgKHNlYXJjaFJpZ2h0KSBzaGlmdEZyb21TdGFjayhub2Rlc1JpZ2h0LCBzZWFyY2hSaWdodCAtIDEpO1xuICAgIH1cbiAgICBzZWFyY2hSaWdodC0tO1xuICB9XG5cbiAgdmFyIHJlcGwgPSB7IGNvbnRlbnQ6IHJlc3VsdCA/IHJlc3VsdC5jb250ZW50IDogX21vZGVsLmVtcHR5RnJhZ21lbnQsXG4gICAgb3BlbkxlZnQ6IHN0YXJ0LmRlcHRoIC0gc2VhcmNoUmlnaHQsXG4gICAgb3BlblJpZ2h0OiBlbmQuZGVwdGggLSBzZWFyY2hSaWdodCB9O1xuICByZXR1cm4geyByZXBsOiByZXBsLCBkZXB0aDogc2VhcmNoTGVmdCArIDEgfTtcbn1cblxuZnVuY3Rpb24gbW92ZVRleHQodHIsIGRvYywgYmVmb3JlLCBhZnRlcikge1xuICB2YXIgcm9vdCA9ICgwLCBfdHJlZS5zYW1lUGF0aERlcHRoKShiZWZvcmUsIGFmdGVyKTtcbiAgdmFyIGN1dEF0ID0gYWZ0ZXIuc2hvcnRlbihudWxsLCAxKTtcbiAgd2hpbGUgKGN1dEF0LnBhdGgubGVuZ3RoID4gcm9vdCAmJiBkb2MucGF0aChjdXRBdC5wYXRoKS5zaXplID09IDEpIGN1dEF0ID0gY3V0QXQuc2hvcnRlbihudWxsLCAxKTtcbiAgdHIuc3BsaXQoY3V0QXQsIGN1dEF0LnBhdGgubGVuZ3RoIC0gcm9vdCk7XG4gIHZhciBzdGFydCA9IGFmdGVyLFxuICAgICAgZW5kID0gbmV3IF9tb2RlbC5Qb3Moc3RhcnQucGF0aCwgZG9jLnBhdGgoc3RhcnQucGF0aCkuc2l6ZSk7XG4gIHZhciBwYXJlbnQgPSBkb2MucGF0aChzdGFydC5wYXRoLnNsaWNlKDAsIHJvb3QpKTtcbiAgdmFyIHdhbnRlZCA9IHBhcmVudC5wYXRoTm9kZXMoYmVmb3JlLnBhdGguc2xpY2Uocm9vdCkpO1xuICB2YXIgZXhpc3RpbmcgPSBwYXJlbnQucGF0aE5vZGVzKHN0YXJ0LnBhdGguc2xpY2Uocm9vdCkpO1xuICB3aGlsZSAod2FudGVkLmxlbmd0aCAmJiBleGlzdGluZy5sZW5ndGggJiYgd2FudGVkWzBdLnNhbWVNYXJrdXAoZXhpc3RpbmdbMF0pKSB7XG4gICAgd2FudGVkLnNoaWZ0KCk7XG4gICAgZXhpc3Rpbmcuc2hpZnQoKTtcbiAgfVxuICBpZiAoZXhpc3RpbmcubGVuZ3RoIHx8IHdhbnRlZC5sZW5ndGgpIHRyLnN0ZXAoXCJhbmNlc3RvclwiLCBzdGFydCwgZW5kLCBudWxsLCB7XG4gICAgZGVwdGg6IGV4aXN0aW5nLmxlbmd0aCxcbiAgICB0eXBlczogd2FudGVkLm1hcChmdW5jdGlvbiAobikge1xuICAgICAgcmV0dXJuIG4udHlwZTtcbiAgICB9KSxcbiAgICBhdHRyczogd2FudGVkLm1hcChmdW5jdGlvbiAobikge1xuICAgICAgcmV0dXJuIG4uYXR0cnM7XG4gICAgfSlcbiAgfSk7XG4gIGZvciAodmFyIGkgPSByb290OyBpIDwgYmVmb3JlLnBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICB0ci5qb2luKGJlZm9yZS5zaG9ydGVuKGksIDEpKTtcbiAgfVxufVxuXG4vLyA6OiAoUG9zLCBQb3MpIOKGkiBUcmFuc2Zvcm1cbi8vIERlbGV0ZSB0aGUgY29udGVudCBiZXR3ZWVuIHRoZSBnaXZlbiBwb3NpdGlvbnMuXG5fdHJhbnNmb3JtLlRyYW5zZm9ybS5wcm90b3R5cGVbXCJkZWxldGVcIl0gPSBmdW5jdGlvbiAoZnJvbSwgdG8pIHtcbiAgaWYgKGZyb20uY21wKHRvKSkgdGhpcy5yZXBsYWNlKGZyb20sIHRvKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyA6OiAoUG9zLCBQb3MsIE5vZGUsIFBvcywgUG9zKSDihpIgVHJhbnNmb3JtXG4vLyBSZXBsYWNlIHRoZSBwYXJ0IG9mIHRoZSBkb2N1bWVudCBiZXR3ZWVuIGBmcm9tYCBhbmQgYHRvYCB3aXRoIHRoZVxuLy8gcGFydCBvZiB0aGUgYHNvdXJjZWAgYmV0d2VlbiBgc3RhcnRgIGFuZCBgZW5kYC5cbl90cmFuc2Zvcm0uVHJhbnNmb3JtLnByb3RvdHlwZS5yZXBsYWNlID0gZnVuY3Rpb24gKGZyb20sIHRvLCBzb3VyY2UsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJlcGwgPSB1bmRlZmluZWQsXG4gICAgICBkZXB0aCA9IHVuZGVmaW5lZCxcbiAgICAgIGRvYyA9IHRoaXMuZG9jLFxuICAgICAgbWF4RGVwdGggPSAoMCwgX3RyZWUuc2FtZVBhdGhEZXB0aCkoZnJvbSwgdG8pO1xuICBpZiAoc291cmNlKSB7XG4gICAgO1xuICAgIHZhciBfYnVpbGRJbnNlcnRlZCA9IGJ1aWxkSW5zZXJ0ZWQoZG9jLnBhdGhOb2Rlcyhmcm9tLnBhdGgpLCBzb3VyY2UsIHN0YXJ0LCBlbmQpO1xuXG4gICAgcmVwbCA9IF9idWlsZEluc2VydGVkLnJlcGw7XG4gICAgZGVwdGggPSBfYnVpbGRJbnNlcnRlZC5kZXB0aDtcblxuICAgIHdoaWxlIChkZXB0aCA+IG1heERlcHRoKSB7XG4gICAgICBpZiAocmVwbC5jb250ZW50LnNpemUpIHJlcGwgPSB7IGNvbnRlbnQ6IF9tb2RlbC5GcmFnbWVudC5mcm9tKGRvYy5wYXRoKGZyb20ucGF0aC5zbGljZSgwLCBkZXB0aCkpLmNvcHkocmVwbC5jb250ZW50KSksXG4gICAgICAgIG9wZW5MZWZ0OiByZXBsLm9wZW5MZWZ0ICsgMSwgb3BlblJpZ2h0OiByZXBsLm9wZW5SaWdodCArIDEgfTtcbiAgICAgIGRlcHRoLS07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJlcGwgPSBudWxsUmVwbDtcbiAgICBkZXB0aCA9IG1heERlcHRoO1xuICB9XG4gIHZhciByb290ID0gZnJvbS5zaG9ydGVuKGRlcHRoKSxcbiAgICAgIGRvY0FmdGVyID0gZG9jLFxuICAgICAgYWZ0ZXIgPSB0bztcbiAgaWYgKHJlcGwuY29udGVudC5zaXplIHx8ICgwLCBfdHJlZS5yZXBsYWNlSGFzRWZmZWN0KShkb2MsIGZyb20sIHRvKSkge1xuICAgIHZhciByZXN1bHQgPSB0aGlzLnN0ZXAoXCJyZXBsYWNlXCIsIGZyb20sIHRvLCByb290LCByZXBsKTtcbiAgICBkb2NBZnRlciA9IHJlc3VsdC5kb2M7XG4gICAgYWZ0ZXIgPSByZXN1bHQubWFwLm1hcCh0bykucG9zO1xuICB9XG5cbiAgLy8gSWYgbm8gdGV4dCBub2RlcyBiZWZvcmUgb3IgYWZ0ZXIgZW5kIG9mIHJlcGxhY2VtZW50LCBkb24ndCBnbHVlIHRleHRcbiAgaWYgKCFkb2MucGF0aCh0by5wYXRoKS5pc1RleHRibG9jaykgcmV0dXJuIHRoaXM7XG4gIGlmICghKHJlcGwuY29udGVudC5zaXplID8gc291cmNlLnBhdGgoZW5kLnBhdGgpLmlzVGV4dGJsb2NrIDogZG9jLnBhdGgoZnJvbS5wYXRoKS5pc1RleHRibG9jaykpIHJldHVybiB0aGlzO1xuXG4gIHZhciBub2Rlc0FmdGVyID0gZG9jLnBhdGgocm9vdC5wYXRoKS5wYXRoTm9kZXModG8ucGF0aC5zbGljZShkZXB0aCkpLnNsaWNlKDEpO1xuICB2YXIgbm9kZXNCZWZvcmUgPSB1bmRlZmluZWQ7XG4gIGlmIChyZXBsLmNvbnRlbnQuc2l6ZSkge1xuICAgIHZhciBpbnNlcnRlZCA9IHJlcGwuY29udGVudDtcbiAgICBub2Rlc0JlZm9yZSA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVwbC5vcGVuUmlnaHQ7IGkrKykge1xuICAgICAgdmFyIGxhc3QgPSBpbnNlcnRlZC5jaGlsZChpbnNlcnRlZC5zaXplIC0gMSk7XG4gICAgICBub2Rlc0JlZm9yZS5wdXNoKGxhc3QpO1xuICAgICAgaW5zZXJ0ZWQgPSBsYXN0LmNvbnRlbnQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5vZGVzQmVmb3JlID0gZG9jLnBhdGgocm9vdC5wYXRoKS5wYXRoTm9kZXMoZnJvbS5wYXRoLnNsaWNlKGRlcHRoKSkuc2xpY2UoMSk7XG4gIH1cblxuICBpZiAobm9kZXNCZWZvcmUubGVuZ3RoICYmIChub2Rlc0FmdGVyLmxlbmd0aCAhPSBub2Rlc0JlZm9yZS5sZW5ndGggfHwgIW5vZGVzQWZ0ZXIuZXZlcnkoZnVuY3Rpb24gKG4sIGkpIHtcbiAgICByZXR1cm4gbi5zYW1lTWFya3VwKG5vZGVzQmVmb3JlW2ldKTtcbiAgfSkpKSB7XG4gICAgdmFyIF9hZnRlciRzaG9ydGVuID0gYWZ0ZXIuc2hvcnRlbihyb290LmRlcHRoKTtcblxuICAgIHZhciBwYXRoID0gX2FmdGVyJHNob3J0ZW4ucGF0aDtcbiAgICB2YXIgb2Zmc2V0ID0gX2FmdGVyJHNob3J0ZW4ub2Zmc2V0O3ZhciBiZWZvcmUgPSB1bmRlZmluZWQ7XG4gICAgZm9yICh2YXIgbm9kZSA9IGRvY0FmdGVyLnBhdGgocGF0aCksIGkgPSAwOzsgaSsrKSB7XG4gICAgICBpZiAoaSA9PSBub2Rlc0JlZm9yZS5sZW5ndGgpIHtcbiAgICAgICAgYmVmb3JlID0gbmV3IF9tb2RlbC5Qb3MocGF0aCwgb2Zmc2V0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBwYXRoLnB1c2gob2Zmc2V0IC0gMSk7XG4gICAgICBub2RlID0gbm9kZS5jaGlsZChvZmZzZXQgLSAxKTtcbiAgICAgIG9mZnNldCA9IG5vZGUuc2l6ZTtcbiAgICB9XG4gICAgbW92ZVRleHQodGhpcywgZG9jQWZ0ZXIsIGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gOjogKFBvcywgUG9zLCB1bmlvbjxGcmFnbWVudCwgTm9kZSwgW05vZGVdPikg4oaSIFRyYW5zZm9ybVxuLy8gUmVwbGFjZSB0aGUgZ2l2ZW4gc2libGluZyByYW5nZSAocG9zaXRpb24gcG9udGluZyBpbnRvIHRoZSBzYW1lXG4vLyBwYXJlbnQpIHdpdGggdGhlIGdpdmVuIGNvbnRlbnQsIHdoaWNoIG1heSBiZSBhIGZyYWdtZW50LCBub2RlLCBvclxuLy8gYXJyYXkgb2Ygbm9kZXMuXG5fdHJhbnNmb3JtLlRyYW5zZm9ybS5wcm90b3R5cGUucmVwbGFjZVdpdGggPSBmdW5jdGlvbiAoZnJvbSwgdG8sIGNvbnRlbnQpIHtcbiAgaWYgKCEoY29udGVudCBpbnN0YW5jZW9mIF9tb2RlbC5GcmFnbWVudCkpIGNvbnRlbnQgPSBfbW9kZWwuRnJhZ21lbnQuZnJvbShjb250ZW50KTtcbiAgaWYgKCFfbW9kZWwuUG9zLnNhbWVQYXRoKGZyb20ucGF0aCwgdG8ucGF0aCkpIHJldHVybiB0aGlzO1xuICB0aGlzLnN0ZXAoXCJyZXBsYWNlXCIsIGZyb20sIHRvLCBmcm9tLCB7IGNvbnRlbnQ6IGNvbnRlbnQsIG9wZW5MZWZ0OiAwLCBvcGVuUmlnaHQ6IDAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gOjogKFBvcywgdW5pb248RnJhZ21lbnQsIE5vZGUsIFtOb2RlXT4pIOKGkiBUcmFuc2Zvcm1cbi8vIEluc2VydCB0aGUgZ2l2ZW4gY29udGVudCBhdCB0aGUgYHBvc2AuXG5fdHJhbnNmb3JtLlRyYW5zZm9ybS5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24gKHBvcywgY29udGVudCkge1xuICByZXR1cm4gdGhpcy5yZXBsYWNlV2l0aChwb3MsIHBvcywgY29udGVudCk7XG59O1xuXG4vLyA6OiAoUG9zLCBzdHJpbmcpIOKGkiBUcmFuc2Zvcm1cbi8vIEluc2VydCB0aGUgZ2l2ZW4gdGV4dCBhdCBgcG9zYCwgaW5oZXJpdGluZyB0aGUgbWFya3Mgb2YgdGhlXG4vLyBleGlzdGluZyBjb250ZW50IGF0IHRoYXQgcG9zaXRpb24uXG5fdHJhbnNmb3JtLlRyYW5zZm9ybS5wcm90b3R5cGUuaW5zZXJ0VGV4dCA9IGZ1bmN0aW9uIChwb3MsIHRleHQpIHtcbiAgcmV0dXJuIHRoaXMuaW5zZXJ0KHBvcywgdGhpcy5kb2MudHlwZS5zY2hlbWEudGV4dCh0ZXh0LCB0aGlzLmRvYy5tYXJrc0F0KHBvcykpKTtcbn07XG5cbi8vIDo6IChQb3MsIE5vZGUpIOKGkiBUcmFuc2Zvcm1cbi8vIEluc2VydCB0aGUgZ2l2ZW4gbm9kZSBhdCBgcG9zYCwgaW5oZXJpdGluZyB0aGUgbWFya3Mgb2YgdGhlXG4vLyBleGlzdGluZyBjb250ZW50IGF0IHRoYXQgcG9zaXRpb24uXG5fdHJhbnNmb3JtLlRyYW5zZm9ybS5wcm90b3R5cGUuaW5zZXJ0SW5saW5lID0gZnVuY3Rpb24gKHBvcywgbm9kZSkge1xuICByZXR1cm4gdGhpcy5pbnNlcnQocG9zLCBub2RlLm1hcmsodGhpcy5kb2MubWFya3NBdChwb3MpKSk7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX21vZGVsID0gcmVxdWlyZShcIi4uL21vZGVsXCIpO1xuXG52YXIgX3RyYW5zZm9ybSA9IHJlcXVpcmUoXCIuL3RyYW5zZm9ybVwiKTtcblxudmFyIF9zdGVwID0gcmVxdWlyZShcIi4vc3RlcFwiKTtcblxudmFyIF9tYXAgPSByZXF1aXJlKFwiLi9tYXBcIik7XG5cbi8vICEhICoqYHNwbGl0YCoqXG4vLyAgIDogU3BsaXQgYSBibG9jayBub2RlIGF0IGBwb3NgLiBUaGUgcGFyYW1ldGVyLCBpZiBnaXZlbiwgbWF5IGJlXG4vLyAgICAgYHt0eXBlLCA/YXR0cnN9YCBvYmplY3QgZ2l2aW5nIHRoZSBub2RlIHR5cGUgYW5kIG9wdGlvbmFsbHkgdGhlXG4vLyAgICAgYXR0cmlidXRlcyBvZiB0aGUgbm9kZSBjcmVhdGVkIHRvIGhvbGQgdGhlIGNvbnRlbnQgYWZ0ZXIgdGhlXG4vLyAgICAgc3BsaXQuXG5cbl9zdGVwLlN0ZXAuZGVmaW5lKFwic3BsaXRcIiwge1xuICBhcHBseTogZnVuY3Rpb24gYXBwbHkoZG9jLCBzdGVwKSB7XG4gICAgdmFyIHBvcyA9IHN0ZXAucG9zO1xuICAgIGlmIChwb3MuZGVwdGggPT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgICB2YXIgX3BvcyRzaG9ydGVuID0gcG9zLnNob3J0ZW4oKTtcblxuICAgIHZhciBwYXJlbnRQYXRoID0gX3BvcyRzaG9ydGVuLnBhdGg7XG4gICAgdmFyIG9mZnNldCA9IF9wb3Mkc2hvcnRlbi5vZmZzZXQ7XG5cbiAgICB2YXIgcGFyZW50ID0gZG9jLnBhdGgocGFyZW50UGF0aCk7XG4gICAgdmFyIHRhcmdldCA9IHBhcmVudC5jaGlsZChvZmZzZXQpLFxuICAgICAgICB0YXJnZXRTaXplID0gdGFyZ2V0LnNpemU7XG5cbiAgICB2YXIgX3JlZiA9IHN0ZXAucGFyYW0gfHwgdGFyZ2V0O1xuXG4gICAgdmFyIHR5cGVBZnRlciA9IF9yZWYudHlwZTtcbiAgICB2YXIgYXR0cnNBZnRlciA9IF9yZWYuYXR0cnM7XG5cbiAgICB2YXIgc3BsaXRBdCA9IHBvcy5vZmZzZXQ7XG4gICAgaWYgKHNwbGl0QXQgPT0gMCAmJiAhdGFyZ2V0LnR5cGUuY2FuQmVFbXB0eSB8fCB0YXJnZXQudHlwZS5sb2NrZWQgfHwgc3BsaXRBdCA9PSB0YXJnZXQuc2l6ZSAmJiAhdHlwZUFmdGVyLmNhbkJlRW1wdHkpIHJldHVybiBudWxsO1xuICAgIHZhciBuZXdQYXJlbnQgPSBwYXJlbnQuc3BsaWNlKG9mZnNldCwgb2Zmc2V0ICsgMSwgX21vZGVsLkZyYWdtZW50LmZyb20oW3RhcmdldC5zbGljZSgwLCBzcGxpdEF0KSwgdHlwZUFmdGVyLmNyZWF0ZShhdHRyc0FmdGVyLCB0YXJnZXQuY29udGVudC5zbGljZShzcGxpdEF0KSldKSk7XG4gICAgdmFyIGNvcHkgPSBkb2MucmVwbGFjZURlZXAocGFyZW50UGF0aCwgbmV3UGFyZW50KTtcblxuICAgIHZhciBkZXN0ID0gbmV3IF9tb2RlbC5Qb3MocGFyZW50UGF0aC5jb25jYXQob2Zmc2V0ICsgMSksIDApO1xuICAgIHZhciBtYXAgPSBuZXcgX21hcC5Qb3NNYXAoW25ldyBfbWFwLk1vdmVkUmFuZ2UocG9zLCB0YXJnZXRTaXplIC0gcG9zLm9mZnNldCwgZGVzdCksIG5ldyBfbWFwLk1vdmVkUmFuZ2UobmV3IF9tb2RlbC5Qb3MocGFyZW50UGF0aCwgb2Zmc2V0ICsgMSksIG5ld1BhcmVudC5zaXplIC0gMiAtIG9mZnNldCwgbmV3IF9tb2RlbC5Qb3MocGFyZW50UGF0aCwgb2Zmc2V0ICsgMikpXSwgW25ldyBfbWFwLlJlcGxhY2VkUmFuZ2UocG9zLCBwb3MsIHBvcywgZGVzdCwgcG9zLCBwb3Muc2hvcnRlbihudWxsLCAxKSldKTtcbiAgICByZXR1cm4gbmV3IF9zdGVwLlN0ZXBSZXN1bHQoY29weSwgbWFwKTtcbiAgfSxcbiAgaW52ZXJ0OiBmdW5jdGlvbiBpbnZlcnQoc3RlcCwgX29sZERvYywgbWFwKSB7XG4gICAgcmV0dXJuIG5ldyBfc3RlcC5TdGVwKFwiam9pblwiLCBzdGVwLnBvcywgbWFwLm1hcChzdGVwLnBvcykucG9zKTtcbiAgfSxcbiAgcGFyYW1Ub0pTT046IGZ1bmN0aW9uIHBhcmFtVG9KU09OKHBhcmFtKSB7XG4gICAgcmV0dXJuIHBhcmFtICYmIHsgdHlwZTogcGFyYW0udHlwZS5uYW1lLCBhdHRyczogcGFyYW0uYXR0cnMgfTtcbiAgfSxcbiAgcGFyYW1Gcm9tSlNPTjogZnVuY3Rpb24gcGFyYW1Gcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICByZXR1cm4ganNvbiAmJiB7IHR5cGU6IHNjaGVtYS5ub2RlVHlwZShqc29uLnR5cGUpLCBhdHRyczoganNvbi5hdHRycyB9O1xuICB9XG59KTtcblxuLy8gOjogKFBvcywgP251bWJlciwgP05vZGVUeXBlLCA/T2JqZWN0KSDihpIgVHJhbnNmb3JtXG4vLyBTcGxpdCB0aGUgbm9kZSBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24sIGFuZCBvcHRpb25hbGx5LCBpZiBgZGVwdGhgIGlzXG4vLyBncmVhdGVyIHRoYW4gb25lLCBhbnkgbnVtYmVyIG9mIG5vZGVzIGFib3ZlIHRoYXQuIEJ5IGRlZmF1bHQsIHRoZSBwYXJ0XG4vLyBzcGxpdCBvZmYgd2lsbCBpbmhlcml0IHRoZSBub2RlIHR5cGUgb2YgdGhlIG9yaWdpbmFsIG5vZGUuIFRoaXMgY2FuXG4vLyBiZSBjaGFuZ2VkIGJ5IHBhc3NpbmcgYHR5cGVBZnRlcmAgYW5kIGBhdHRyc0FmdGVyYC5cbl90cmFuc2Zvcm0uVHJhbnNmb3JtLnByb3RvdHlwZS5zcGxpdCA9IGZ1bmN0aW9uIChwb3MsIGRlcHRoLCB0eXBlQWZ0ZXIsIGF0dHJzQWZ0ZXIpIHtcbiAgaWYgKGRlcHRoID09PSB1bmRlZmluZWQpIGRlcHRoID0gMTtcblxuICBpZiAoZGVwdGggPT0gMCkgcmV0dXJuIHRoaXM7XG4gIGZvciAodmFyIGkgPSAwOzsgaSsrKSB7XG4gICAgdGhpcy5zdGVwKFwic3BsaXRcIiwgbnVsbCwgbnVsbCwgcG9zLCB0eXBlQWZ0ZXIgJiYgeyB0eXBlOiB0eXBlQWZ0ZXIsIGF0dHJzOiBhdHRyc0FmdGVyIH0pO1xuICAgIGlmIChpID09IGRlcHRoIC0gMSkgcmV0dXJuIHRoaXM7XG4gICAgdHlwZUFmdGVyID0gbnVsbDtcbiAgICBwb3MgPSBwb3Muc2hvcnRlbihudWxsLCAxKTtcbiAgfVxufTtcblxuLy8gOjogKFBvcywgP251bWJlcikg4oaSIFRyYW5zZm9ybVxuLy8gU3BsaXQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLCBfaWZfIHRoYXQgcG9zaXRpb24gaXNuJ3QgYWxyZWFkeSBhdFxuLy8gdGhlIHN0YXJ0IG9yIGVuZCBvZiBhIG5vZGUuIElmIGBkZXB0aGAgaXMgZ3JlYXRlciB0aGFuIG9uZSwgYWxzbyBkb1xuLy8gc28gZm9yIHBhcmVudCBwb3NpdGlvbnMgYWJvdmUgdGhlIGdpdmVuIHBvc2l0aW9uLlxuX3RyYW5zZm9ybS5UcmFuc2Zvcm0ucHJvdG90eXBlLnNwbGl0SWZOZWVkZWQgPSBmdW5jdGlvbiAocG9zKSB7XG4gIHZhciBkZXB0aCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IDEgOiBhcmd1bWVudHNbMV07XG5cbiAgZm9yICh2YXIgb2ZmID0gMDsgb2ZmIDwgZGVwdGg7IG9mZisrKSB7XG4gICAgdmFyIGhlcmUgPSBwb3Muc2hvcnRlbihwb3MuZGVwdGggLSBvZmYpO1xuICAgIGlmIChoZXJlLm9mZnNldCAmJiBoZXJlLm9mZnNldCA8IHRoaXMuZG9jLnBhdGgoaGVyZS5wYXRoKS5zaXplKSB0aGlzLnN0ZXAoXCJzcGxpdFwiLCBudWxsLCBudWxsLCBoZXJlKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIF9tb2RlbCA9IHJlcXVpcmUoXCIuLi9tb2RlbFwiKTtcblxudmFyIF9tYXAgPSByZXF1aXJlKFwiLi9tYXBcIik7XG5cbi8vIDs7IEEgc3RlcCBvYmplY3Qgd3JhcHMgYW4gYXRvbWljIG9wZXJhdGlvbi4gSXQgZ2VuZXJhbGx5IGFwcGxpZXNcbi8vIG9ubHkgdG8gdGhlIGRvY3VtZW50IGl0IHdhcyBjcmVhdGVkIGZvciwgc2luY2UgdGhlIHBvc2l0aW9uc1xuLy8gYXNzb2NpYXRlZCB3aXRoIGl0IHdpbGwgb25seSBtYWtlIHNlbnNlIGZvciB0aGF0IGRvY3VtZW50LlxuXG52YXIgU3RlcCA9IChmdW5jdGlvbiAoKSB7XG4gIC8vIDo6IChzdHJpbmcsID9Qb3MsID9Qb3MsID9Qb3MsID9hbnkpXG4gIC8vIEJ1aWxkIGEgc3RlcC4gVGhlIHR5cGUgc2hvdWxkIG5hbWUgYSBbZGVmaW5lZF0oU3RlcC5kZWZpbmUpIHN0ZXBcbiAgLy8gdHlwZSwgYW5kIHRoZSBzaGFwZSBvZiB0aGUgcG9zaXRpb25zIGFuZCBwYXJhbWV0ZXIgc2hvdWxkIGJlXG4gIC8vIGFwcHJvcHJpYXRlIGZvciB0aGF0IHR5cGUuXG5cbiAgZnVuY3Rpb24gU3RlcCh0eXBlLCBmcm9tLCB0bywgcG9zKSB7XG4gICAgdmFyIHBhcmFtID0gYXJndW1lbnRzLmxlbmd0aCA8PSA0IHx8IGFyZ3VtZW50c1s0XSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGFyZ3VtZW50c1s0XTtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTdGVwKTtcblxuICAgIGlmICghKHR5cGUgaW4gc3RlcHMpKSB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHN0ZXAgdHlwZTogXCIgKyB0eXBlKTtcbiAgICAvLyA6OiBzdHJpbmdcbiAgICAvLyBUaGUgdHlwZSBvZiB0aGUgc3RlcC5cbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIC8vIDo6ID9Qb3NcbiAgICAvLyBUaGUgc3RhcnQgb2YgdGhlIHN0ZXAncyByYW5nZSwgaWYgYW55LiBXaGljaCBvZiB0aGUgdGhyZWVcbiAgICAvLyBvcHRpb25hbCBwb3NpdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgc3RlcCBhIGdpdmVuIHN0ZXAgdHlwZVxuICAgIC8vIHVzZXMgZGlmZmVycy4gVGhlIHdheSBlYWNoIG9mIHRoZXNlIHBvc2l0aW9ucyBpcyBtYXBwZWQgd2hlblxuICAgIC8vIHRoZSBzdGVwIGlzIG1hcHBlZCBvdmVyIGEgW3Bvc2l0aW9uIG1hcHBpbmddKCNQb3NNYXApIGRlcGVuZHNcbiAgICAvLyBvbiBpdHMgcm9sZS5cbiAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgIC8vIDo6ID9Qb3NcbiAgICAvLyBUaGUgZW5kIG9mIHRoZSBzdGVwJ3MgcmFuZ2UuXG4gICAgdGhpcy50byA9IHRvO1xuICAgIC8vIDo6ID9Qb3NcbiAgICAvLyBUaGUgYmFzZSBwb3NpdGlvbiBmb3IgdGhpcyBzdGVwLlxuICAgIHRoaXMucG9zID0gcG9zO1xuICAgIC8vIDo6ID9hbnlcbiAgICAvLyBFeHRyYSBzdGVwLXR5cGUtc3BlY2lmaWMgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBzdGVwLlxuICAgIHRoaXMucGFyYW0gPSBwYXJhbTtcbiAgfVxuXG4gIC8vIDs7ICN0b2M9ZmFsc2UgT2JqZWN0cyBvZiB0aGlzIHR5cGUgYXJlIHJldHVybmVkIGFzIHRoZSByZXN1bHQgb2ZcbiAgLy8gYXBwbHlpbmcgYSB0cmFuc2Zvcm0gc3RlcCB0byBhIGRvY3VtZW50LlxuXG4gIC8vIDo6IChOb2RlKSDihpIgP1N0ZXBSZXN1bHRcbiAgLy8gQXBwbGllcyB0aGlzIHN0ZXAgdG8gdGhlIGdpdmVuIGRvY3VtZW50LCByZXR1cm5pbmcgYSByZXN1bHRcbiAgLy8gY29udGFpbmluZyB0aGUgdHJhbnNmb3JtZWQgZG9jdW1lbnQgKHRoZSBpbnB1dCBkb2N1bWVudCBpcyBub3RcbiAgLy8gY2hhbmdlZCkgYW5kIGEgYFBvc01hcGAuIElmIHRoZSBzdGVwIGNvdWxkIG5vdCBtZWFuaW5nZnVsbHkgYmVcbiAgLy8gYXBwbGllZCB0byB0aGUgZ2l2ZW4gZG9jdW1lbnQsIHRoaXMgcmV0dXJucyBgbnVsbGAuXG5cbiAgX2NyZWF0ZUNsYXNzKFN0ZXAsIFt7XG4gICAga2V5OiBcImFwcGx5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFwcGx5KGRvYykge1xuICAgICAgcmV0dXJuIHN0ZXBzW3RoaXMudHlwZV0uYXBwbHkoZG9jLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoTm9kZSwgUG9zTWFwKSDihpIgU3RlcFxuICAgIC8vIENyZWF0ZSBhbiBpbnZlcnRlZCB2ZXJzaW9uIG9mIHRoaXMgc3RlcC4gTmVlZHMgdGhlIGRvY3VtZW50IGFzIGl0XG4gICAgLy8gd2FzIGJlZm9yZSB0aGUgc3RlcCwgYXMgd2VsbCBhcyBgUG9zTWFwYCBjcmVhdGVkIGJ5IGFwcGx5aW5nIHRoZVxuICAgIC8vIHN0ZXAgdG8gdGhhdCBkb2N1bWVudCwgYXMgaW5wdXQuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW52ZXJ0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludmVydChvbGREb2MsIG1hcCkge1xuICAgICAgcmV0dXJuIHN0ZXBzW3RoaXMudHlwZV0uaW52ZXJ0KHRoaXMsIG9sZERvYywgbWFwKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoTWFwcGFibGUpIOKGkiA/U3RlcFxuICAgIC8vIE1hcCB0aGlzIHN0ZXAgdGhyb3VnaCBhIG1hcHBhYmxlIHRoaW5nLCByZXR1cm5pbmcgZWl0aGVyIGFcbiAgICAvLyB2ZXJzaW9uIG9mIHRoYXQgc3RlcCB3aXRoIGl0cyBwb3NpdGlvbnMgYWRqdXN0ZWQsIG9yIGBudWxsYCBpZlxuICAgIC8vIHRoZSBzdGVwIHdhcyBlbnRpcmVseSBkZWxldGVkIGJ5IHRoZSBtYXBwaW5nLlxuICB9LCB7XG4gICAga2V5OiBcIm1hcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXAocmVtYXBwaW5nKSB7XG4gICAgICB2YXIgYWxsRGVsZXRlZCA9IHRydWU7XG4gICAgICB2YXIgZnJvbSA9IG51bGwsXG4gICAgICAgICAgdG8gPSBudWxsLFxuICAgICAgICAgIHBvcyA9IG51bGw7XG5cbiAgICAgIGlmICh0aGlzLmZyb20pIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlbWFwcGluZy5tYXAodGhpcy5mcm9tLCAxKTtcbiAgICAgICAgZnJvbSA9IHJlc3VsdC5wb3M7XG4gICAgICAgIGlmICghcmVzdWx0LmRlbGV0ZWQpIGFsbERlbGV0ZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnRvKSB7XG4gICAgICAgIGlmICh0aGlzLnRvLmNtcCh0aGlzLmZyb20pID09IDApIHtcbiAgICAgICAgICB0byA9IGZyb207XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IHJlbWFwcGluZy5tYXAodGhpcy50bywgLTEpO1xuICAgICAgICAgIHRvID0gcmVzdWx0LnBvcy5tYXgoZnJvbSk7XG4gICAgICAgICAgaWYgKCFyZXN1bHQuZGVsZXRlZCkgYWxsRGVsZXRlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5wb3MpIHtcbiAgICAgICAgaWYgKGZyb20gJiYgdGhpcy5wb3MuY21wKHRoaXMuZnJvbSkgPT0gMCkge1xuICAgICAgICAgIHBvcyA9IGZyb207XG4gICAgICAgIH0gZWxzZSBpZiAodG8gJiYgdGhpcy5wb3MuY21wKHRoaXMudG8pID09IDApIHtcbiAgICAgICAgICBwb3MgPSB0bztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gcmVtYXBwaW5nLm1hcCh0aGlzLnBvcywgMSk7XG4gICAgICAgICAgcG9zID0gcmVzdWx0LnBvcztcbiAgICAgICAgICBpZiAoIXJlc3VsdC5kZWxldGVkKSBhbGxEZWxldGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhbGxEZWxldGVkID8gbnVsbCA6IG5ldyBTdGVwKHRoaXMudHlwZSwgZnJvbSwgdG8sIHBvcywgdGhpcy5wYXJhbSk7XG4gICAgfVxuXG4gICAgLy8gOjogKCkg4oaSIE9iamVjdFxuICAgIC8vIENyZWF0ZSBhIEpTT04tc2VyaWFsaXplYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHN0ZXAuXG4gIH0sIHtcbiAgICBrZXk6IFwidG9KU09OXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICAgIHZhciBpbXBsID0gc3RlcHNbdGhpcy50eXBlXTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgZnJvbTogdGhpcy5mcm9tLFxuICAgICAgICB0bzogdGhpcy50byxcbiAgICAgICAgcG9zOiB0aGlzLnBvcyxcbiAgICAgICAgcGFyYW06IGltcGwucGFyYW1Ub0pTT04gPyBpbXBsLnBhcmFtVG9KU09OKHRoaXMucGFyYW0pIDogdGhpcy5wYXJhbVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyA6OiAoU2NoZW1hLCBPYmplY3QpIOKGkiBTdGVwXG4gICAgLy8gRGVzZXJpYWxpemUgYSBzdGVwIGZyb20gaXRzIEpTT04gcmVwcmVzZW50YXRpb24uXG4gIH1dLCBbe1xuICAgIGtleTogXCJmcm9tSlNPTlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgIHZhciBpbXBsID0gc3RlcHNbanNvbi50eXBlXTtcbiAgICAgIHJldHVybiBuZXcgU3RlcChqc29uLnR5cGUsIGpzb24uZnJvbSAmJiBfbW9kZWwuUG9zLmZyb21KU09OKGpzb24uZnJvbSksIGpzb24udG8gJiYgX21vZGVsLlBvcy5mcm9tSlNPTihqc29uLnRvKSwganNvbi5wb3MgJiYgX21vZGVsLlBvcy5mcm9tSlNPTihqc29uLnBvcyksIGltcGwucGFyYW1Gcm9tSlNPTiA/IGltcGwucGFyYW1Gcm9tSlNPTihzY2hlbWEsIGpzb24ucGFyYW0pIDoganNvbi5wYXJhbSk7XG4gICAgfVxuXG4gICAgLy8gOjogKHN0cmluZywgT2JqZWN0KVxuICAgIC8vIERlZmluZSBhIG5ldyB0eXBlIG9mIHN0ZXAuIEltcGxlbWVudGF0aW9uIHNob3VsZCBoYXZlIHRoZVxuICAgIC8vIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgIC8vXG4gICAgLy8gKipgYXBwbHlgKipgKGRvYzogTm9kZSwgc3RlcDogU3RlcCkg4oaSID9TdGVwUmVzdWx0XG4gICAgLy8gICA6IEFwcGxpZXMgdGhlIHN0ZXAgdG8gYSBkb2N1bWVudC5cbiAgICAvLyAqKmBpbnZlcnRgKipgKHN0ZXA6IFN0ZXAsIG9sZERvYzogTm9kZSwgbWFwOiBQb3NNYXApIOKGkiBTdGVwXG4gICAgLy8gICA6IENyZWF0ZSBhbiBpbnZlcnRlZCB2ZXJzaW9uIG9mIHRoZSBzdGVwLlxuICAgIC8vICoqYHBhcmFtVG9KU09OYCoqYChwYXJhbTogP2FueSkg4oaSID9PYmplY3RcbiAgICAvLyAgIDogU2VyaWFsaXplIHRoaXMgc3RlcCB0eXBlJ3MgcGFyYW1ldGVyIHRvIEpTT04uXG4gICAgLy8gKipgcGFyYW1Gcm9tSlNPTmAqKmAoc2NoZW1hOiBTY2hlbWEsIGpzb246ID9PYmplY3QpIOKGkiA/YW55XG4gICAgLy8gICA6IERlc2VyaWFsaXplIHRoaXMgc3RlcCB0eXBlJ3MgcGFyYW1ldGVyIGZyb20gSlNPTi5cbiAgfSwge1xuICAgIGtleTogXCJkZWZpbmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVmaW5lKHR5cGUsIGltcGxlbWVudGF0aW9uKSB7XG4gICAgICBzdGVwc1t0eXBlXSA9IGltcGxlbWVudGF0aW9uO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBTdGVwO1xufSkoKTtcblxuZXhwb3J0cy5TdGVwID0gU3RlcDtcblxudmFyIFN0ZXBSZXN1bHQgPSBmdW5jdGlvbiBTdGVwUmVzdWx0KGRvYykge1xuICB2YXIgbWFwID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8gX21hcC5udWxsTWFwIDogYXJndW1lbnRzWzFdO1xuXG4gIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTdGVwUmVzdWx0KTtcblxuICAvLyA6OiBOb2RlIFRoZSB0cmFuc2Zvcm1lZCBkb2N1bWVudC5cbiAgdGhpcy5kb2MgPSBkb2M7XG4gIC8vIDo6IFBvc01hcFxuICAvLyBUaGUgcG9zaXRpb24gbWFwIHRoYXQgZGVzY3JpYmVzIHRoZSBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIHRoZVxuICAvLyBvbGQgYW5kIHRoZSBuZXcgZG9jdW1lbnQuXG4gIHRoaXMubWFwID0gbWFwO1xufTtcblxuZXhwb3J0cy5TdGVwUmVzdWx0ID0gU3RlcFJlc3VsdDtcblxudmFyIHN0ZXBzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgX3N0ZXAyID0gcmVxdWlyZShcIi4vc3RlcFwiKTtcblxudmFyIF9tYXAgPSByZXF1aXJlKFwiLi9tYXBcIik7XG5cbi8vIDs7IEEgY2hhbmdlIHRvIGEgZG9jdW1lbnQgb2Z0ZW4gY29uc2lzdHMgb2YgYSBzZXJpZXMgb2Zcbi8vIFtzdGVwc10oI1N0ZXApLiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgY29udmVuaWVuY2UgYWJzdHJhY3Rpb24gdG9cbi8vIGJ1aWxkIHVwIGFuZCB0cmFjayBzdWNoIGFuIGFycmF5IG9mIHN0ZXBzLiBBIGBUcmFuc2Zvcm1gIG9iamVjdFxuLy8gaW1wbGVtZW50cyBgTWFwcGFibGVgLlxuLy9cbi8vIFRoZSBoaWdoLWxldmVsIHRyYW5zZm9ybWluZyBtZXRob2RzIHJldHVybiB0aGUgYFRyYW5zZm9ybWAgb2JqZWN0XG4vLyBpdHNlbGYsIHNvIHRoYXQgdGhleSBjYW4gYmUgY2hhaW5lZC5cblxudmFyIFRyYW5zZm9ybSA9IChmdW5jdGlvbiAoKSB7XG4gIC8vIDo6IChOb2RlKVxuICAvLyBDcmVhdGUgYSB0cmFuc2Zvcm1hdGlvbiB0aGF0IHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBkb2N1bWVudC5cblxuICBmdW5jdGlvbiBUcmFuc2Zvcm0oZG9jKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRyYW5zZm9ybSk7XG5cbiAgICAvLyA6OiBbU3RlcF1cbiAgICAvLyBUaGUgYWNjdW11bGF0ZWQgc3RlcHMuXG4gICAgdGhpcy5zdGVwcyA9IFtdO1xuICAgIC8vIDo6IFtOb2RlXVxuICAgIC8vIFRoZSBpbmRpdmlkdWFsIGRvY3VtZW50IHZlcnNpb25zLiBBbHdheXMgaGFzIGEgbGVuZ3RoIG9uZSBtb3JlXG4gICAgLy8gdGhhbiBgc3RlcHNgLCBzaW5jZSBpdCBhbHNvIGluY2x1ZGVzIHRoZSBvcmlnaW5hbCBzdGFydGluZ1xuICAgIC8vIGRvY3VtZW50LlxuICAgIHRoaXMuZG9jcyA9IFtkb2NdO1xuICAgIC8vIDo6IFtQb3NNYXBdXG4gICAgLy8gVGhlIHBvc2l0aW9uIG1hcHMgcHJvZHVjZWQgYnkgdGhlIHN0ZXBzLiBIYXMgdGhlIHNhbWUgbGVuZ3RoIGFzXG4gICAgLy8gYHN0ZXBzYC5cbiAgICB0aGlzLm1hcHMgPSBbXTtcbiAgfVxuXG4gIC8vIDo6IE5vZGVcbiAgLy8gVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgdHJhbnNmb3JtZWQgZG9jdW1lbnQuXG5cbiAgX2NyZWF0ZUNsYXNzKFRyYW5zZm9ybSwgW3tcbiAgICBrZXk6IFwic3RlcFwiLFxuXG4gICAgLy8gOjogKFN0ZXApIOKGkiA/U3RlcFJlc3VsdFxuICAgIC8vIEFkZCBhIHN0ZXAgdG8gdGhpcyB0cmFuc2Zvcm1hdGlvbi4gSWYgdGhlIHN0ZXAgY2FuIGJlXG4gICAgLy8gW2FwcGxpZWRdKCNTdGVwLmFwcGx5KSB0byB0aGUgY3VycmVudCBkb2N1bWVudCwgdGhlIHJlc3VsdCBvZlxuICAgIC8vIGFwcGx5aW5nIGl0IGlzIHJldHVybmVkLCBhbmQgYW4gZWxlbWVudCBpcyBhZGRlZCB0byB0aGVcbiAgICAvLyBbYHN0ZXBzYF0oI1RyYW5zZm9ybS5zdGVwcyksIFtgZG9jc2BdKCNUcmFuc2Zvcm0uZG9jcyksIGFuZFxuICAgIC8vIFtgbWFwc2BdKCNUcmFuc2Zvcm0ubWFwcykgYXJyYXlzLlxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdGVwKF9zdGVwLCBmcm9tLCB0bywgcG9zLCBwYXJhbSkge1xuICAgICAgaWYgKHR5cGVvZiBfc3RlcCA9PSBcInN0cmluZ1wiKSBfc3RlcCA9IG5ldyBfc3RlcDIuU3RlcChfc3RlcCwgZnJvbSwgdG8sIHBvcywgcGFyYW0pO1xuICAgICAgdmFyIHJlc3VsdCA9IF9zdGVwLmFwcGx5KHRoaXMuZG9jKTtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5zdGVwcy5wdXNoKF9zdGVwKTtcbiAgICAgICAgdGhpcy5tYXBzLnB1c2gocmVzdWx0Lm1hcCk7XG4gICAgICAgIHRoaXMuZG9jcy5wdXNoKHJlc3VsdC5kb2MpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyA6OiAoUG9zLCA/bnVtYmVyKSDihpIgTWFwUmVzdWx0XG4gICAgLy8gTWFwIGEgcG9zaXRpb24gdGhyb3VnaCB0aGUgd2hvbGUgdHJhbnNmb3JtYXRpb24gKGFsbCB0aGUgcG9zaXRpb25cbiAgICAvLyBtYXBzIGluIFtgbWFwc2BdKCNUcmFuc2Zvcm0ubWFwcykpLCBhbmQgcmV0dXJuIHRoZSByZXN1bHQuXG4gIH0sIHtcbiAgICBrZXk6IFwibWFwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hcChwb3MsIGJpYXMpIHtcbiAgICAgIHZhciBkZWxldGVkID0gZmFsc2U7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubWFwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5tYXBzW2ldLm1hcChwb3MsIGJpYXMpO1xuICAgICAgICBwb3MgPSByZXN1bHQucG9zO1xuICAgICAgICBpZiAocmVzdWx0LmRlbGV0ZWQpIGRlbGV0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBfbWFwLk1hcFJlc3VsdChwb3MsIGRlbGV0ZWQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkb2NcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRvY3NbdGhpcy5kb2NzLmxlbmd0aCAtIDFdO1xuICAgIH1cblxuICAgIC8vIDo6IE5vZGVcbiAgICAvLyBUaGUgb3JpZ2luYWwgaW5wdXQgZG9jdW1lbnQuXG4gIH0sIHtcbiAgICBrZXk6IFwiYmVmb3JlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5kb2NzWzBdO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBUcmFuc2Zvcm07XG59KSgpO1xuXG5leHBvcnRzLlRyYW5zZm9ybSA9IFRyYW5zZm9ybTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuY29weVN0cnVjdHVyZSA9IGNvcHlTdHJ1Y3R1cmU7XG5leHBvcnRzLmNvcHlJbmxpbmUgPSBjb3B5SW5saW5lO1xuZXhwb3J0cy5pc0ZsYXRSYW5nZSA9IGlzRmxhdFJhbmdlO1xuZXhwb3J0cy5yZXBsYWNlSGFzRWZmZWN0ID0gcmVwbGFjZUhhc0VmZmVjdDtcbmV4cG9ydHMuc2FtZVBhdGhEZXB0aCA9IHNhbWVQYXRoRGVwdGg7XG5cbnZhciBfbW9kZWwgPSByZXF1aXJlKFwiLi4vbW9kZWxcIik7XG5cbmZ1bmN0aW9uIGNvcHlTdHJ1Y3R1cmUobm9kZSwgZnJvbSwgdG8sIGYpIHtcbiAgdmFyIGRlcHRoID0gYXJndW1lbnRzLmxlbmd0aCA8PSA0IHx8IGFyZ3VtZW50c1s0XSA9PT0gdW5kZWZpbmVkID8gMCA6IGFyZ3VtZW50c1s0XTtcblxuICBpZiAobm9kZS5pc1RleHRibG9jaykge1xuICAgIHJldHVybiBmKG5vZGUsIGZyb20gPyBmcm9tLm9mZnNldCA6IDAsIHRvID8gdG8ub2Zmc2V0IDogbm9kZS5zaXplKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIW5vZGUuc2l6ZSkgcmV0dXJuIG5vZGU7XG4gICAgdmFyIHN0YXJ0ID0gZnJvbSA/IGZyb20ucGF0aFtkZXB0aF0gOiAwO1xuICAgIHZhciBlbmQgPSB0byA/IHRvLnBhdGhbZGVwdGhdICsgMSA6IG5vZGUuc2l6ZTtcbiAgICB2YXIgY29udGVudCA9IG5vZGUuY29udGVudC50b0FycmF5KDAsIHN0YXJ0KTtcbiAgICBmb3IgKHZhciBpdGVyID0gbm9kZS5pdGVyKHN0YXJ0LCBlbmQpLCBjaGlsZCA9IHVuZGVmaW5lZDsgY2hpbGQgPSBpdGVyLm5leHQoKS52YWx1ZTspIHtcbiAgICAgIHZhciBwYXNzRnJvbSA9IGl0ZXIub2Zmc2V0IC0gY2hpbGQud2lkdGggPT0gc3RhcnQgPyBmcm9tIDogbnVsbDtcbiAgICAgIHZhciBwYXNzVG8gPSBpdGVyLm9mZnNldCA9PSBlbmQgPyB0byA6IG51bGw7XG4gICAgICBjb250ZW50LnB1c2goY29weVN0cnVjdHVyZShjaGlsZCwgcGFzc0Zyb20sIHBhc3NUbywgZiwgZGVwdGggKyAxKSk7XG4gICAgfVxuICAgIHJldHVybiBub2RlLmNvcHkoX21vZGVsLkZyYWdtZW50LmZyb21BcnJheShjb250ZW50LmNvbmNhdChub2RlLmNvbnRlbnQudG9BcnJheShlbmQpKSkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvcHlJbmxpbmUobm9kZSwgZnJvbSwgdG8sIGYpIHtcbiAgcmV0dXJuIG5vZGUuc3BsaWNlKGZyb20sIHRvLCBub2RlLmNvbnRlbnQuc2xpY2UoZnJvbSwgdG8pLm1hcChmKSk7XG59XG5cbmZ1bmN0aW9uIGlzRmxhdFJhbmdlKGZyb20sIHRvKSB7XG4gIGlmIChmcm9tLnBhdGgubGVuZ3RoICE9IHRvLnBhdGgubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZnJvbS5wYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGZyb20ucGF0aFtpXSAhPSB0by5wYXRoW2ldKSByZXR1cm4gZmFsc2U7XG4gIH1yZXR1cm4gZnJvbS5vZmZzZXQgPD0gdG8ub2Zmc2V0O1xufVxuXG5mdW5jdGlvbiBjYW5CZUpvaW5lZChub2RlLCBvZmZzZXQsIGRlcHRoKSB7XG4gIGlmICghZGVwdGggfHwgb2Zmc2V0ID09IDAgfHwgb2Zmc2V0ID09IG5vZGUuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICB2YXIgbGVmdCA9IG5vZGUuY2hpbGQob2Zmc2V0IC0gMSksXG4gICAgICByaWdodCA9IG5vZGUuY2hpbGQob2Zmc2V0KTtcbiAgcmV0dXJuIGxlZnQuc2FtZU1hcmt1cChyaWdodCk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VIYXNFZmZlY3QoZG9jLCBmcm9tLCB0bykge1xuICBmb3IgKHZhciBkZXB0aCA9IDAsIG5vZGUgPSBkb2M7OyBkZXB0aCsrKSB7XG4gICAgdmFyIGZyb21FbmQgPSBkZXB0aCA9PSBmcm9tLmRlcHRoLFxuICAgICAgICB0b0VuZCA9IGRlcHRoID09IHRvLmRlcHRoO1xuICAgIGlmIChmcm9tRW5kIHx8IHRvRW5kIHx8IGZyb20ucGF0aFtkZXB0aF0gIT0gdG8ucGF0aFtkZXB0aF0pIHtcbiAgICAgIHZhciBnYXBTdGFydCA9IHVuZGVmaW5lZCxcbiAgICAgICAgICBnYXBFbmQgPSB1bmRlZmluZWQ7XG4gICAgICBpZiAoZnJvbUVuZCkge1xuICAgICAgICBnYXBTdGFydCA9IGZyb20ub2Zmc2V0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2FwU3RhcnQgPSBmcm9tLnBhdGhbZGVwdGhdICsgMTtcbiAgICAgICAgZm9yICh2YXIgaSA9IGRlcHRoICsgMSwgbiA9IG5vZGUuY2hpbGQoZ2FwU3RhcnQgLSAxKTsgaSA8PSBmcm9tLnBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoaSA9PSBmcm9tLnBhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoZnJvbS5vZmZzZXQgPCBuLnNpemUpIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZnJvbS5wYXRoW2ldICsgMSA8IG4uc2l6ZSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBuID0gbi5jaGlsZChmcm9tLnBhdGhbaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRvRW5kKSB7XG4gICAgICAgIGdhcEVuZCA9IHRvLm9mZnNldDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdhcEVuZCA9IHRvLnBhdGhbZGVwdGhdO1xuICAgICAgICBmb3IgKHZhciBpID0gZGVwdGggKyAxOyBpIDw9IHRvLnBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoKGkgPT0gdG8ucGF0aC5sZW5ndGggPyB0by5vZmZzZXQgOiB0by5wYXRoW2ldKSA+IDApIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZ2FwU3RhcnQgIT0gZ2FwRW5kKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHJldHVybiBjYW5CZUpvaW5lZChub2RlLCBnYXBTdGFydCwgTWF0aC5taW4oZnJvbS5kZXB0aCwgdG8uZGVwdGgpIC0gZGVwdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlID0gbm9kZS5jaGlsZChmcm9tLnBhdGhbZGVwdGhdKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2FtZVBhdGhEZXB0aChhLCBiKSB7XG4gIGZvciAodmFyIGkgPSAwOzsgaSsrKSB7XG4gICAgaWYgKGkgPT0gYS5wYXRoLmxlbmd0aCB8fCBpID09IGIucGF0aC5sZW5ndGggfHwgYS5wYXRoW2ldICE9IGIucGF0aFtpXSkgcmV0dXJuIGk7XG4gIH1cbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG52YXIgX2dldCA9IGZ1bmN0aW9uIGdldChfeCwgX3gyLCBfeDMpIHsgdmFyIF9hZ2FpbiA9IHRydWU7IF9mdW5jdGlvbjogd2hpbGUgKF9hZ2FpbikgeyB2YXIgb2JqZWN0ID0gX3gsIHByb3BlcnR5ID0gX3gyLCByZWNlaXZlciA9IF94MzsgX2FnYWluID0gZmFsc2U7IGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyBfeCA9IHBhcmVudDsgX3gyID0gcHJvcGVydHk7IF94MyA9IHJlY2VpdmVyOyBfYWdhaW4gPSB0cnVlOyBkZXNjID0gcGFyZW50ID0gdW5kZWZpbmVkOyBjb250aW51ZSBfZnVuY3Rpb247IH0gfSBlbHNlIGlmIChcInZhbHVlXCIgaW4gZGVzYykgeyByZXR1cm4gZGVzYy52YWx1ZTsgfSBlbHNlIHsgdmFyIGdldHRlciA9IGRlc2MuZ2V0OyBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpOyB9IH0gfTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBQcm9zZU1pcnJvckVycm9yID0gKGZ1bmN0aW9uIChfRXJyb3IpIHtcbiAgX2luaGVyaXRzKFByb3NlTWlycm9yRXJyb3IsIF9FcnJvcik7XG5cbiAgZnVuY3Rpb24gUHJvc2VNaXJyb3JFcnJvcihtZXNzYWdlKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFByb3NlTWlycm9yRXJyb3IpO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoUHJvc2VNaXJyb3JFcnJvci5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmNhbGwodGhpcywgbWVzc2FnZSk7XG4gICAgaWYgKHRoaXMubWVzc2FnZSAhPSBtZXNzYWdlKSB7XG4gICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLm5hbWUpO2Vsc2UgdGhpcy5zdGFjayA9IG5ldyBFcnJvcihtZXNzYWdlKS5zdGFjaztcbiAgICB9XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUHJvc2VNaXJyb3JFcnJvciwgW3tcbiAgICBrZXk6IFwibmFtZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IubmFtZSB8fCBmdW5jdGlvbk5hbWUodGhpcy5jb25zdHJ1Y3RvcikgfHwgXCJQcm9zZU1pcnJvckVycm9yXCI7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwicmFpc2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmFpc2UobWVzc2FnZSkge1xuICAgICAgdGhyb3cgbmV3IHRoaXMobWVzc2FnZSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFByb3NlTWlycm9yRXJyb3I7XG59KShFcnJvcik7XG5cbmV4cG9ydHMuUHJvc2VNaXJyb3JFcnJvciA9IFByb3NlTWlycm9yRXJyb3I7XG5cbmZ1bmN0aW9uIGZ1bmN0aW9uTmFtZShmKSB7XG4gIHZhciBtYXRjaCA9IC9eZnVuY3Rpb24gKFxcdyspLy5leGVjKGYudG9TdHJpbmcoKSk7XG4gIHJldHVybiBtYXRjaCAmJiBtYXRjaFsxXTtcbn0iLCIvLyA7OyAjcGF0aD1FdmVudE1peGluICNraW5kPWludGVyZmFjZVxuLy8gQSBzZXQgb2YgbWV0aG9kcyBmb3Igb2JqZWN0cyB0aGF0IGVtaXQgZXZlbnRzLiBBZGRlZCBieSBjYWxsaW5nXG4vLyBgZXZlbnRNaXhpbmAgb24gYSBjb25zdHJ1Y3Rvci5cblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmV2ZW50TWl4aW4gPSBldmVudE1peGluO1xudmFyIG1ldGhvZHMgPSB7XG4gIC8vIDo6ICh0eXBlOiBzdHJpbmcsIGhhbmRsZXI6ICguLi5hcmdzOiBbYW55XSkpICNwYXRoPUV2ZW50TWl4aW4ub25cbiAgLy8gUmVnaXN0ZXIgYW4gZXZlbnQgaGFuZGxlciBmb3IgdGhlIGdpdmVuIGV2ZW50IHR5cGUuXG4gIG9uOiBmdW5jdGlvbiBvbih0eXBlLCBmKSB7XG4gICAgdmFyIG1hcCA9IHRoaXMuX2hhbmRsZXJzIHx8ICh0aGlzLl9oYW5kbGVycyA9IHt9KTtcbiAgICB2YXIgYXJyID0gbWFwW3R5cGVdIHx8IChtYXBbdHlwZV0gPSBbXSk7XG4gICAgYXJyLnB1c2goZik7XG4gIH0sXG5cbiAgLy8gOjogKHR5cGU6IHN0cmluZywgaGFuZGxlcjogKC4uLmFyZ3M6IFthbnldKSkgI3BhdGg9RXZlbnRNaXhpbi5vZmZcbiAgLy8gVW5yZWdpc3RlciBhbiBldmVudCBoYW5kbGVyIGZvciB0aGUgZ2l2ZW4gZXZlbnQgdHlwZS5cbiAgb2ZmOiBmdW5jdGlvbiBvZmYodHlwZSwgZikge1xuICAgIHZhciBhcnIgPSB0aGlzLl9oYW5kbGVycyAmJiB0aGlzLl9oYW5kbGVyc1t0eXBlXTtcbiAgICBpZiAoYXJyKSBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkge1xuICAgICAgaWYgKGFycltpXSA9PSBmKSB7XG4gICAgICAgIGFyci5zcGxpY2UoaSwgMSk7YnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8vIDo6ICh0eXBlOiBzdHJpbmcsIC4uLmFyZ3M6IFthbnldKSAjcGF0aD1FdmVudE1peGluLnNpZ25hbFxuICAvLyBTaWduYWwgYW4gZXZlbnQgb2YgdGhlIGdpdmVuIHR5cGUsIHBhc3NpbmcgYW55IG51bWJlciBvZlxuICAvLyBhcmd1bWVudHMuIFdpbGwgY2FsbCB0aGUgaGFuZGxlcnMgZm9yIHRoZSBldmVudCwgcGFzc2luZyB0aGVtIHRoZVxuICAvLyBhcmd1bWVudHMuXG4gIHNpZ25hbDogZnVuY3Rpb24gc2lnbmFsKHR5cGUpIHtcbiAgICB2YXIgYXJyID0gdGhpcy5faGFuZGxlcnMgJiYgdGhpcy5faGFuZGxlcnNbdHlwZV07XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgdmFsdWVzID0gQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgdmFsdWVzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBpZiAoYXJyKSBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkge1xuICAgICAgYXJyW2ldLmFwcGx5KGFyciwgdmFsdWVzKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gOjogKHR5cGU6IHN0cmluZywgLi4uYXJnczogW2FueV0pICNwYXRoPUV2ZW50TWl4aW4uc2lnbmFsSGFuZGxlYWJsZVxuICAvLyBTaWduYWwgYSBoYW5kbGVhYmxlIGV2ZW50IG9mIHRoZSBnaXZlbiB0eXBlLiBBbGwgaGFuZGxlcnMgZm9yIHRoZVxuICAvLyBldmVudCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMsIHVudGlsIG9uZSBvZiB0aGVtXG4gIC8vIHJldHVybnMgc29tZXRoaW5nIHRoYXQgaXMgbm90IHRoZSB2YWx1ZSBgZmFsc2VgLiBXaGVuIHRoYXRcbiAgLy8gaGFwcGVucywgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGF0IGhhbmRsZXIgaXMgcmV0dXJuZWQuIElmIHRoYXRcbiAgLy8gZG9lcyBub3QgaGFwcGVuLCBgZmFsc2VgIGlzIHJldHVybmVkLlxuICBzaWduYWxIYW5kbGVhYmxlOiBmdW5jdGlvbiBzaWduYWxIYW5kbGVhYmxlKHR5cGUpIHtcbiAgICB2YXIgYXJyID0gdGhpcy5faGFuZGxlcnMgJiYgdGhpcy5faGFuZGxlcnNbdHlwZV07XG4gICAgaWYgKGFycikge1xuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCB2YWx1ZXMgPSBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIHZhbHVlc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGFycltpXS5hcHBseShhcnIsIHZhbHVlcyk7XG4gICAgICAgIGlmIChyZXN1bHQgIT09IGZhbHNlKSByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1yZXR1cm4gZmFsc2U7XG4gIH0sXG5cbiAgLy8gOjogKHR5cGU6IHN0cmluZykg4oaSIGJvb2wgI3BhdGg9RXZlbnRNaXhpbi5oYXNIYW5kbGVyXG4gIC8vIFF1ZXJ5IHdoZXRoZXIgdGhlcmUgYXJlIGFueSBoYW5kbGVycyBmb3IgdGhpcyBldmVudCB0eXBlLlxuICBoYXNIYW5kbGVyOiBmdW5jdGlvbiBoYXNIYW5kbGVyKHR5cGUpIHtcbiAgICB2YXIgYXJyID0gdGhpcy5faGFuZGxlcnMgJiYgdGhpcy5faGFuZGxlcnNbdHlwZV07XG4gICAgcmV0dXJuIGFyciAmJiBhcnIubGVuZ3RoID4gMDtcbiAgfVxufTtcblxuLy8gOjogKCgpKVxuLy8gQWRkIHRoZSBtZXRob2RzIGluIHRoZSBgRXZlbnRNaXhpbmAgaW50ZXJmYWNlIHRvIHRoZSBwcm90b3R5cGVcbi8vIG9iamVjdCBvZiB0aGUgZ2l2ZW4gY29uc3RydWN0b3IuXG5cbmZ1bmN0aW9uIGV2ZW50TWl4aW4oY3Rvcikge1xuICB2YXIgcHJvdG8gPSBjdG9yLnByb3RvdHlwZTtcbiAgZm9yICh2YXIgcHJvcCBpbiBtZXRob2RzKSBpZiAobWV0aG9kcy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgcHJvdG9bcHJvcF0gPSBtZXRob2RzW3Byb3BdO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBNYXAgPSB3aW5kb3cuTWFwIHx8IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIF9jbGFzcygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgX2NsYXNzKTtcblxuICAgIHRoaXMuY29udGVudCA9IFtdO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKF9jbGFzcywgW3tcbiAgICBrZXk6IFwic2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgZm91bmQgPSB0aGlzLmZpbmQoa2V5KTtcbiAgICAgIGlmIChmb3VuZCA+IC0xKSB0aGlzLmNvbnRlbnRbZm91bmQgKyAxXSA9IHZhbHVlO2Vsc2UgdGhpcy5jb250ZW50LnB1c2goa2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICB2YXIgZm91bmQgPSB0aGlzLmZpbmQoa2V5KTtcbiAgICAgIHJldHVybiBmb3VuZCA9PSAtMSA/IHVuZGVmaW5lZCA6IHRoaXMuY29udGVudFtmb3VuZCArIDFdO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuZmluZChrZXkpID4gLTE7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZpbmRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZmluZChrZXkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb250ZW50Lmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRbaV0gPT09IGtleSkgcmV0dXJuIGk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNsZWFyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgdGhpcy5jb250ZW50Lmxlbmd0aCA9IDA7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNpemVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQubGVuZ3RoIC8gMjtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gX2NsYXNzO1xufSkoKTtcbmV4cG9ydHMuTWFwID0gTWFwOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBzb3J0ZWRJbnNlcnQ7XG5cbmZ1bmN0aW9uIHNvcnRlZEluc2VydChhcnJheSwgZWx0LCBjb21wYXJlKSB7XG4gIHZhciBpID0gMDtcbiAgZm9yICg7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgaWYgKGNvbXBhcmUoYXJyYXlbaV0sIGVsdCkgPiAwKSBicmVhaztcbiAgYXJyYXkuc3BsaWNlKGksIDAsIGVsdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07Il19