├── .gitattributes ├── .gitignore ├── .travis.yml ├── CONTRIBUTING.md ├── Cargo.toml ├── LICENSE-APACHE ├── LICENSE-MIT ├── README.md ├── README.tpl ├── benches ├── bench.rs └── part-of-scala-js-source-map ├── ci └── script.sh ├── source-map-mappings-wasm-api ├── .gitignore ├── Cargo.toml ├── build.py ├── src │ └── lib.rs └── who-calls.py ├── src ├── comparators.rs └── lib.rs └── tests ├── cargo_readme_up_to_date.rs ├── quickcheck.rs └── tests.rs /.gitattributes: -------------------------------------------------------------------------------- 1 | README.md -diff -merge 2 | benches/part-of-scala-js-source-map -diff -merge 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | /target/ 3 | **/*.rs.bk 4 | Cargo.lock 5 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: rust 2 | cache: cargo 3 | 4 | rust: 5 | - stable 6 | - beta 7 | - nightly 8 | 9 | matrix: 10 | exclude: 11 | - rust: stable 12 | env: JOB="bench" 13 | - rust: beta 14 | env: JOB="bench" 15 | - rust: stable 16 | env: JOB="wasm" 17 | - rust: beta 18 | env: JOB="wasm" 19 | 20 | env: 21 | matrix: 22 | - JOB="test" 23 | - JOB="bench" 24 | - JOB="wasm" 25 | 26 | script: 27 | - ./ci/script.sh 28 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to `source-map-mappings` 2 | 3 | Hi! We'd love to have your contributions! If you want help or mentorship, reach 4 | out to us in a GitHub issue, or ping `fitzgen` in [#rust on irc.mozilla.org](irc://irc.mozilla.org#rust) 5 | and introduce yourself. 6 | 7 | 8 | 9 | 10 | 11 | - [Code of Conduct](#code-of-conduct) 12 | - [Building](#building) 13 | - [Testing](#testing) 14 | - [Automatic code formatting](#automatic-code-formatting) 15 | 16 | 17 | 18 | ## Code of Conduct 19 | 20 | We abide by the [Rust Code of Conduct][coc] and ask that you do as well. 21 | 22 | [coc]: https://www.rust-lang.org/en-US/conduct.html 23 | 24 | ## Building 25 | 26 | To build the core library for the host target (for use with testing): 27 | 28 | ``` 29 | $ cargo build 30 | ``` 31 | 32 | To build for WebAssembly, ensure that you have the `wasm32-unknown-unknown` target: 33 | 34 | ``` 35 | $ rustup update 36 | $ rustup target add wasm32-unknown-unknown --toolchain nightly 37 | ``` 38 | 39 | Then, cross compile to a `.wasm` file via the WebAssembly API crate: 40 | 41 | ``` 42 | $ cd source-map-mappings-wasm-api/ 43 | $ ./build.py -o output.wasm 44 | ``` 45 | 46 | The `build.py` script handles shrinking the size of the resulting `.wasm` file 47 | for you, with `wasm-gc`, `wasm-snip`, and `wasm-opt`. 48 | 49 | For more details, run: 50 | 51 | ``` 52 | $ ./build.py --help 53 | ``` 54 | 55 | ## Testing 56 | 57 | The tests require `cargo-readme` to be installed: 58 | 59 | ``` 60 | $ cargo install cargo-readme 61 | ``` 62 | 63 | To run all the tests: 64 | 65 | ``` 66 | $ cargo test 67 | ``` 68 | 69 | ## Automatic code formatting 70 | 71 | We use [`rustfmt`](https://github.com/rust-lang-nursery/rustfmt) to enforce a 72 | consistent code style across the whole code base. 73 | 74 | You can install the latest version of `rustfmt` with this command: 75 | 76 | ``` 77 | $ rustup update nightly 78 | $ cargo install -f rustfmt-nightly 79 | ``` 80 | 81 | Ensure that `~/.cargo/bin` is on your path. 82 | 83 | Once that is taken care of, you can (re)format all code by running this command: 84 | 85 | ``` 86 | $ cargo fmt 87 | ``` 88 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | authors = [ 3 | "Nick Fitzgerald ", 4 | "Tom Tromey ", 5 | ] 6 | categories = [ 7 | "development-tools::debugging", 8 | "parser-implementations", 9 | ] 10 | description = "Parse the `mappings` string from a source map." 11 | keywords = [ 12 | "sourcemap", 13 | "source", 14 | "map", 15 | "vlq", 16 | ] 17 | license = "Apache-2.0/MIT" 18 | name = "source-map-mappings" 19 | readme = "./README.md" 20 | repository = "https://github.com/fitzgen/source-map-mappings" 21 | version = "0.5.0" 22 | 23 | [badges.travis-ci] 24 | repository = "fitzgen/source-map-mappings" 25 | 26 | [dependencies] 27 | rand = "0.4.1" 28 | vlq = "0.5.1" 29 | 30 | [dev-dependencies] 31 | quickcheck = "0.5.0" 32 | [profile.release] 33 | debug = true 34 | -------------------------------------------------------------------------------- /LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /LICENSE-MIT: -------------------------------------------------------------------------------- 1 | Copyright (c) 2015 The Rust Project Developers 2 | 3 | Permission is hereby granted, free of charge, to any 4 | person obtaining a copy of this software and associated 5 | documentation files (the "Software"), to deal in the 6 | Software without restriction, including without 7 | limitation the rights to use, copy, modify, merge, 8 | publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software 10 | is furnished to do so, subject to the following 11 | conditions: 12 | 13 | The above copyright notice and this permission notice 14 | shall be included in all copies or substantial portions 15 | of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF 18 | ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 19 | TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 20 | PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT 21 | SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 22 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 23 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR 24 | IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 25 | DEALINGS IN THE SOFTWARE. 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # `source-map-mappings` 2 | 3 | [![](https://docs.rs/source-map-mappings/badge.svg)](https://docs.rs/source-map-mappings/) [![](https://img.shields.io/crates/v/source-map-mappings.svg)](https://crates.io/crates/source-map-mappings) [![](https://img.shields.io/crates/d/source-map-mappings.png)](https://crates.io/crates/source-map-mappings) [![Build Status](https://travis-ci.org/fitzgen/source-map-mappings.png?branch=master)](https://travis-ci.org/fitzgen/source-map-mappings) 4 | 5 | Parse the `"mappings"` string from a source map. 6 | 7 | This is intended to be compiled to WebAssembly and eventually used from the 8 | [`mozilla/source-map`][source-map] library. This is **not** a general purpose 9 | source maps library. 10 | 11 | [source-map]: https://github.com/mozilla/source-map 12 | 13 | * [Documentation](#documentation) 14 | * [License](#license) 15 | * [Contributing](#contributing) 16 | 17 | ### Documentation 18 | 19 | [📚 Documentation on `docs.rs` 📚][docs] 20 | 21 | [docs]: https://docs.rs/source-map-mappings 22 | 23 | ### License 24 | 25 | Licensed under either of 26 | 27 | * [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0) 28 | 29 | * [MIT license](http://opensource.org/licenses/MIT) 30 | 31 | at your option. 32 | 33 | ### Contributing 34 | 35 | See 36 | [CONTRIBUTING.md](https://github.com/fitzgen/source-map-mappings/blob/master/CONTRIBUTING.md) 37 | for hacking. 38 | 39 | Unless you explicitly state otherwise, any contribution intentionally submitted 40 | for inclusion in the work by you, as defined in the Apache-2.0 license, shall be 41 | dual licensed as above, without any additional terms or conditions. 42 | 43 | -------------------------------------------------------------------------------- /README.tpl: -------------------------------------------------------------------------------- 1 | # `{{crate}}` 2 | 3 | {{readme}} 4 | -------------------------------------------------------------------------------- /benches/bench.rs: -------------------------------------------------------------------------------- 1 | #![feature(test)] 2 | 3 | extern crate source_map_mappings; 4 | extern crate test; 5 | 6 | static FIXTURE: &'static [u8] = include_bytes!("./part-of-scala-js-source-map"); 7 | 8 | #[bench] 9 | fn bench_parse_part_of_scala_js_source_map(b: &mut test::Bencher) { 10 | b.iter(|| { 11 | let mut mappings = source_map_mappings::parse_mappings::<()>(FIXTURE).unwrap(); 12 | test::black_box( 13 | mappings 14 | .all_generated_locations_for(7, 2, None) 15 | .count(), 16 | ); 17 | }); 18 | } 19 | -------------------------------------------------------------------------------- /benches/part-of-scala-js-source-map: -------------------------------------------------------------------------------- 1 | AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxaA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;;ACxDM,UAAAA,CAAAA;EAAAA,CAAAA,CAAAA,eAAAA,CAAAA,oBAAAA,EAAAA;IAAAC,oBAAAA,EAAAA,IAAAA;IAAAC,kBAAAA,EAAAA,IAAAA;;GAAAF,mBAAAA,C;;ACAA,UAAAA,CAAAA;EAAAA,CAAAA,CAAAA,eAAAA,CAAAA,mBAAAA,EAAAA;IAAAG,mBAAAA,EAAAA,IAAAA;IAAAD,kBAAAA,EAAAA,IAAAA;;GAAAF,mBAAAA,C;;ACAA,UAAAA,CAAAA;EAAAA,CAAAA,CAAAA,aAAAA,CAAAA,4BAAAA,EAAAA,WAAAA,EAAAA;aAAAI,KAAAA,GAAAA;MAAAJ,CAAAA,CAAAA,CAAAA,CAAAA,sBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAAmB,KAAAK,YAAAA,GAAAA,IAAnBA;;IAAAD,KAAAA,CAAAA,SAAAA,GAAAA,MAAAA,CAAAA,MAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,sBAAAA,CAAAA,CAAAA,SAAAA,CAAAA;IAAAA,KAAAA,CAAAA,SAAAA,CAAAA,WAAAA,QAAAA;IAAAA,KACSA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA;MAAU,KAAAC,YAASA,CAAAA,UAAAA,CAAAA,EAAnBA;MADT;IAAAD,KAESA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA;MAAU,KAAAC,YAASA,CAAAA,UAAAA,CAAAA,EAAnBA;MAFT;IAAAD,KAGSA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAAMA,KAANA;MAAgB,KAAAC,YAASA,CAAAA,WAAAA,CAAAA,CAACA,KAADA,CAAzBA;MAHT;IAAAD,KAAkBA,CAAAA,SAAAA,CAAAA,gCAAAA,CAAAA,GAAAA,UAACA,OAADA,EAAAA;MAAC,KAAAC,YAAAA,UAADA;MAAAL,CAAAA,CAAAA,CAAAA,CAAAA,sBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;;MAAlB;aAAAI,OAAAA,CAAkBA,KAAlBA,EAAAA;MAAAA,KAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAAkB,YAAAE,gCAAAA,CAAAA,CAAAA,KAAAA,CAAlBA;;IAAAF,OAAAA,CAAAA,SAAAA,GAAAA,KAAAA,CAAAA,SAAAA;IAAAJ,CAAAA,CAAAA,WAAAA,CAAAA,4BAAAA,EAAAA,KAAAA,EAAAA,OAAAA,EAAAA,sBAAAA,EAAAA;MAAAI,4BAAAA,EAAAA,IAAAA;MAAAG,sBAAAA,EAAAA,IAAAA;MAAAC,mBAAAA,EAAAA,IAAAA;MAAAL,mBAAAA,EAAAA,IAAAA;MAAAD,kBAAAA,EAAAA,IAAAA;;;GAAAF,mBAAAA,C;;ACAA,UAAAA,CAAAA;EAAAA,CAAAA,CAAAA,eAAAA,CAAAA,mBAAAA,EAAAA;IAAAQ,mBAAAA,EAAAA,IAAAA;IAAAN,kBAAAA,EAAAA,IAAAA;;GAAAF,mBAAAA,C;;ACAS,UAAAA,CAAAA;EAAAA,CAAAA,CAAAA,aAAAA,CAAAA,sBAAAA,EAAAA,WAAAA,EAAAA;aAAAO,KAAAA;MAAAP,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;;IAAAO,KAAAA,CAAAA,SAAAA,GAAAA,MAAAA,CAAAA,MAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA;IAAAA,KAAAA,CAAAA,SAAAA,CAAAA,WAAAA,QAAAA;IAAAA,KACTA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA;MAAQ,UAAR;MADS;IAAAA,KAGTA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA;MAAQ,UAAR;MAHS;IAAAA,KAKTA,CAAAA,SAAAA,CAAAA,YAAAA,CAAAA,GAAAA,UAAMA,KAANA;MACF,IAAK,CAAAE,cAAAA,CAAAA,CAACA,KAADA,EAAIA,CAAJA,EAAOA,KAAEA,CAAAA,UAAAA,CAAAA,MAATA,CADHA;MALS;IAAAF,KASTA,CAAAA,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA,UAAMA,KAANA,EAAsBA,OAAtBA,EAAgCA,OAAhCA,EAA0CA;MACpC,IAAJG,YAAIA,GAAAA,OADoCA;MAE9B,IAAVC,eAAUA,GAAAA,CAAHA,OAAGA,GAACA,OAADA,CAF8BA;MAG5C,OAAS,CAAFD,YAAEA,GAAEA,eAAFA,CAATA,EAAiBA;QACf,IAAK,CAAAE,WAAAA,CAAAA,CAACA,KAACA,CAAAA,UAAAA,CAACA,YAADA,CAAFA,CADUA;QAEbF,YAAGA,GAAAA,CAADA,YAACA,GAACA,CAADA,CAFUA;OAH2B;KAA1C,CATS;IAAAH,KAAaA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA,YAAAA;MAAAP,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;;MAAb;IAAAO,KASTA,CAAAA,SAAAA,CAAAA,KAAAA,GAAAA,UAAAA,KAAAA,EAAAA,KAAAA,EAAAA,KAAAA;cAAAM,SAAAA,CAAAA,MAAAA;;UASA,YAAAC,KAAAA,CAAAA,KAAAA,QAAAA,CAAAA;wBAAAF,WAAAA,CAAAA,CAAAA,KAAAA,CAAAA;;YAbA,IAAAZ,CAAAA,CAAAA,UAAAA,CAAAA,KAAAA,EAAAA,cAAAA,CAAAA;0BAAAe,YAAAA,CAAAA,CAAAA,KAAAA,CAAAA;;;aAaA;WATA;;sBAAAN,cAAAA,CAAAA,CAAAA,KAAAA,EAAAA,KAAAA,EAAAA,KAAAA,CAAAA;;;;MATS;aAAAF,OAAAA,GAAAA;MAAAA,KAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAAa,YAAAS,UAAAA,CAAAA,EAAbA;;IAAAT,OAAAA,CAAAA,SAAAA,GAAAA,KAAAA,CAAAA,SAAAA;IAAAP,CAAAA,CAAAA,WAAAA,CAAAA,sBAAAA,EAAAA,KAAAA,EAAAA,OAAAA,EAAAA,kBAAAA,EAAAA;MAAAO,sBAAAA,EAAAA,IAAAA;MAAAC,mBAAAA,EAAAA,IAAAA;MAAAL,mBAAAA,EAAAA,IAAAA;MAAAD,kBAAAA,EAAAA,IAAAA;;;GAAAF,mBAAAA,C;;ACAT,UAAAA,CAAAA,EAAAA;EAAAA,CAAAA,CAAAA,aAAAA,CAAAA,qBAAAA,EAAAA,WAAAA,EAAAA;aAAAiB,KAAAA,GAAAA;MAAAjB,CAAAA,CAAAA,CAAAA,CAAAA,4BAAAA,CAAAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAAY,KAAAkB,aAAAA,GAAAA,IAAZA;MAAgC,KAAAC,kBAAAA,GAAAA,KAAhCA;MAgBA,KAAAC,iBAAAA,GAAAA,KAhBAA;;IAAAH,KAAAA,CAAAA,SAAAA,GAAAA,MAAAA,CAAAA,MAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,4BAAAA,CAAAA,CAAAA,SAAAA,CAAAA;IAAAA,KAAAA,CAAAA,SAAAA,CAAAA,WAAAA,QAAAA;IAAAA,KAOSA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAAMA,KAANA,EAAgBA;MAC3B,KAAAC,aAAUA,CAAAA,WAAAA,CAAAA,CAACA,KAADA,CADiBA;MAE3B,IAAc,CAAV,KAAAC,kBAAUA,IAAKA,CAAFA,KAAEA,KAAGA,EAAHA,CAALA,CAAdA;QAA0B,IAAK,CAAAE,UAAAA,CAAAA,EAA/BA;;;OAF2B;KAAhB,CAPT;IAAAJ,KAYAA,CAAAA,SAAAA,CAAAA,gCAAAA,CAAAA,GAAAA,UAAOA,KAAPA;MAAkB,WAAlB;MAZA;IAAAA,KAaAA,CAAAA,SAAAA,CAAAA,uDAAAA,CAAAA,GAAAA,UAAOA,OAAPA;MAA4B,WAA5B;MAbA;IAAAA,KAcAA,CAAAA,SAAAA,CAAAA,yDAAAA,CAAAA,GAAAA,UAAOA,OAAPA,EAA0BA,SAA1BA,EAAsCA,OAAtCA;MAAkD,WAAlD;MAdA;IAAAA,KAgBAA,CAAAA,SAAAA,CAAAA,aAAAA,CAAAA,GAAAA;kBAAAG,iBAAAA;MAhBA;IAAAH,KAgBAA,CAAAA,SAAAA,CAAAA,gBAAAA,CAAAA,GAAAA,UAhBAA,OAgBAA;WAAAG,iBAAAA,GAAAA,OAAAA;MAhBA;IAAAH,KAiBAA,CAAAA,SAAAA,CAAAA,eAAAA,CAAAA,GAAAA;MAAe,YAAAK,aAAAA,CAAAA,EAAfA;MAjBA;IAAAL,KAkBAA,CAAAA,SAAAA,CAAAA,aAAAA,CAAAA,GAAAA;MAAa,IAAS,CAAAM,gBAAAA,CAAAA,CAAEA,IAAFA,CAAtBA;MAlBA;IAAAN,KAmBAA,CAAAA,SAAAA,CAAAA,eAAAA,CAAAA,GAAAA;MAAe,IAAS,CAAAM,gBAAAA,CAAAA,CAAEA,KAAFA,CAAxBA;MAnBA;IAAAN,KAqBAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAAMA,KAANA;MAA0B,IAAK,CAAAO,WAAAA,CAAAA,CAACA,CAAAA,CAAAA,EAAAA,CAAAA,KAAAA,CAAEA,CAAAA,QAAAA,EAAHA,CAA/BA;MArBA;IAAAP,KAsBAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAAMA,KAANA;MAAuB,IAAK,CAAAO,WAAAA,CAAAA,CAACA,CAAAA,CAAAA,EAAAA,CAAAA,KAAAA,CAAEA,CAAAA,QAAAA,EAAHA,CAA5BA;MAtBA;IAAAP,KAuBAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAAMA,KAANA;MAAsB,IAAK,CAAAO,WAAAA,CAAAA,CAACA,CAAAA,CAAAA,EAAAA,CAAAA,KAAAA,CAAEA,CAAAA,QAAAA,EAAHA,CAA3BA;MAvBA;IAAAP,KAwBAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAAMA,KAANA;MAAuB,IAAK,CAAAO,WAAAA,CAAAA,CAACA,CAAAA,CAAAA,EAAAA,CAAAA,KAAAA,CAAEA,CAAAA,QAAAA,EAAHA,CAA5BA;MAxBA;IAAAP,KAyBAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAAMA,KAANA;MAAwB,IAAK,CAAAO,WAAAA,CAAAA,CAACA,CAAAA,CAAAA,EAAAA,CAAAA,KAAAA,CAAEA,CAAAA,QAAAA,EAAHA,CAA7BA;MAzBA;IAAAP,KA0BAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAAMA,KAANA;MAAyB,IAAK,CAAAO,WAAAA,CAAAA,CAACA,CAAAA,CAAAA,EAAAA,CAAAA,KAAAA,CAAEA,CAAAA,QAAAA,EAAHA,CAA9BA;MA1BA;IAAAP,KA2BAA,CAAAA,SAAAA,CAAAA,YAAAA,CAAAA,GAAAA,UAAMA,KAANA;MAA8B,IAAK,CAAAO,WAAAA,CAAAA,CAACA,iBAADA,CAAnCA;MA3BA;IAAAP,KA4BAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAAMA,KAANA;MAAyB,IAAM,CAAFQ,KAAEA,KAAGA,IAAHA,CAANA;QAAe,IAAK,CAAAD,WAAAA,CAAAA,CAACA,MAADA,CAApBA;;QAAkC,IAAW,CAAAE,iBAAAA,CAAAA,CAACA,KAADA,CAA7CA;OAAzB;MA5BA;IAAAT,KA6BAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAAMA,KAANA;MAAyB,IAAM,CAAFU,KAAEA,KAAGA,IAAHA,CAANA;QAAe,IAAK,CAAAH,WAAAA,CAAAA,CAACA,MAADA,CAApBA;;QAAkC,IAAK,CAAAA,WAAAA,CAAAA,CAACA,KAAEA,CAAAA,QAAAA,EAAHA,CAAvCA;OAAzB;MA7BA;IAAAP,KA+BUA,CAAAA,SAAAA,CAAAA,iBAAAA,CAAAA,GAAAA,UAAYA,KAAZA,EAAyBA;MACzB,IAARW,gBAAQA,GAAAA,CAAAA,CAAAA,cAAAA,CAAAA,CAAAA,CAAAA,UAAAA,CAAAA,YAAAA,CAAAA,CAAAA,KAAAA,EAAAA,CAAgBA,KAAEA,CAAAA,MAAlBA,CAAAA,CADyBA;yGAE3B5B,CAAAA,CAAAA,CAAAA,CAAAA,cAAAA,CAAAA,CAAAA,gBAAAA,CAAAA,CAAAA,CAAAA,CAF2BA,EAEnBA,KAAEA,CAAAA,MAFiBA;MAE9B,gBAAAA,CAAAA,CAAAA,CAAAA,CAAAA,4CAAAA,CAAAA,EAAAA,CAAAA,kCAAAA,CAAAA,CAAAA,IAAAA,EAAAA,KAAAA,EAAAA,gBAAAA,CAF8BA;MAE9B,MAAA6B,oCAAAA,CAAAA,CAAAA,KAAAA,CAF8BA;MAIrC,IAAK,CAAAd,YAAAA,CAAAA,CAACA,gBAADA,CAJgCA;KAAzB,CA/BV;IAAAE,KAsCAA,CAAAA,SAAAA,CAAAA,YAAAA,CAAAA,GAAAA;MAAkB,IAAK,CAAAL,WAAAA,CAAAA,CAACA,EAADA,CAAvBA;MAtCA;IAAAK,KAuCAA,CAAAA,SAAAA,CAAAA,aAAAA,CAAAA,GAAAA,UAAQA,KAARA,EAA4BA;MAAE,IAAK,CAAAa,WAAAA,CAAAA,CAACA,KAADA,CAAPA;MAAY,IAAO,CAAAC,YAAAA,CAAAA,EAAnBA;KAA5B,CAvCA;IAAAd,KAwCAA,CAAAA,SAAAA,CAAAA,aAAAA,CAAAA,GAAAA,UAAQA,KAARA,EAAyBA;MAAE,IAAK,CAAAe,WAAAA,CAAAA,CAACA,KAADA,CAAPA;MAAY,IAAO,CAAAD,YAAAA,CAAAA,EAAnBA;KAAzB,CAxCA;IAAAd,KAyCAA,CAAAA,SAAAA,CAAAA,aAAAA,CAAAA,GAAAA,UAAQA,KAARA,EAAwBA;MAAE,IAAK,CAAAgB,WAAAA,CAAAA,CAACA,KAADA,CAAPA;MAAY,IAAO,CAAAF,YAAAA,CAAAA,EAAnBA;KAAxB,CAzCA;IAAAd,KA0CAA,CAAAA,SAAAA,CAAAA,aAAAA,CAAAA,GAAAA,UAAQA,KAARA,EAAyBA;MAAE,IAAK,CAAAiB,WAAAA,CAAAA,CAACA,KAADA,CAAPA;MAAY,IAAO,CAAAH,YAAAA,CAAAA,EAAnBA;KAAzB,CA1CA;IAAAd,KA2CAA,CAAAA,SAAAA,CAAAA,aAAAA,CAAAA,GAAAA,UAAQA,KAARA,EAA0BA;MAAE,IAAK,CAAAkB,WAAAA,CAAAA,CAACA,KAADA,CAAPA;MAAY,IAAO,CAAAJ,YAAAA,CAAAA,EAAnBA;KAA1B,CA3CA;IAAAd,KA4CAA,CAAAA,SAAAA,CAAAA,aAAAA,CAAAA,GAAAA,UAAQA,KAARA,EAA2BA;MAAE,IAAK,CAAAmB,WAAAA,CAAAA,CAACA,KAADA,CAAPA;MAAY,IAAO,CAAAL,YAAAA,CAAAA,EAAnBA;KAA3B,CA5CA;IAAAd,KA6CAA,CAAAA,SAAAA,CAAAA,aAAAA,CAAAA,GAAAA,UAAQA,KAARA,EAA2BA;MAAE,IAAK,CAAAO,WAAAA,CAAAA,CAACA,KAADA,CAAPA;MAAY,IAAO,CAAAO,YAAAA,CAAAA,EAAnBA;KAA3B,CA7CA;IAAAd,KA8CAA,CAAAA,SAAAA,CAAAA,aAAAA,CAAAA,GAAAA,UAAQA,KAARA,EAA2BA;MAAE,IAAK,CAAAoB,WAAAA,CAAAA,CAACA,KAADA,CAAPA;MAAY,IAAO,CAAAN,YAAAA,CAAAA,EAAnBA;KAA3B,CA9CA;IAAAd,KAgDAA,CAAAA,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA,UAAOA,UAAPA,EAAuBA,QAAvBA;MAAoD,IAAK,CAAAO,WAAAA,CAAAA,CAACA,QAADA,CAAzDA;MAhDA;IAAAP,KAiDAA,CAAAA,SAAAA,CAAAA,gCAAAA,CAAAA,GAAAA,UAAOA,KAAPA,EAAkBA,UAAlBA,EAAkCA,QAAlCA;MAA+D,IAAK,CAAAO,WAAAA,CAAAA,CAACA,QAADA,CAApEA;MAjDA;IAAAP,KAkDAA,CAAAA,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA,UAAOA,UAAPA,EAAuBA,QAAvBA;MAAoD,IAAK,CAAAO,WAAAA,CAAAA,CAACA,QAADA,CAAzDA;MAlDA;IAAAP,KAmDAA,CAAAA,SAAAA,CAAAA,gCAAAA,CAAAA,GAAAA,UAAOA,KAAPA,EAAkBA,UAAlBA,EAAkCA,QAAlCA;MAA+D,IAAK,CAAAO,WAAAA,CAAAA,CAACA,QAADA,CAApEA;MAnDA;IAAAP,KAAAA,CAAAA,SAAAA,CAAAA,wDAAAA,CAAAA,GAAAA,ULGOA,OKHPA,ELG0BA,SKH1BA,ELGsCA,OKHtCA;kBAAAqB,yDAAAA,CAAAA,CAAAA,OAAAA,EAAAA,SAAAA,EAAAA,OAAAA,CAAAA;;IAAArB,KAAAA,CAAAA,SAAAA,CAAAA,sDAAAA,CAAAA,GAAAA,ULEOA,OKFPA;kBAAAsB,uDAAAA,CAAAA,CAAAA,OAAAA,CAAAA;;IAAAtB,KAAAA,CAAAA,SAAAA,CAAAA,+BAAAA,CAAAA,GAAAA,ULCOA,KKDPA;kBAAAuB,gCAAAA,CAAAA,CAAAA,KAAAA,CAAAA;;IAAAvB,KAAWA,CAAAA,SAAAA,CAAAA,kCAAAA,CAAAA,GAAAA,UAACA,QAADA,EAAqBA,aAArBA,EAAyCA,WAAzCA,EAAAA;MAAC,KAAAC,aAAAA,WAADA;MAAqB,KAAAC,kBAAAA,gBAArBA;MAAAnB,CAAAA,CAAAA,CAAAA,CAAAA,4BAAAA,CAAAA,CAAAA,SAAAA,CAAAA,gCAAAA,CAAAA,CAAAA,IAAAA,CAAAA,IAAAA,EACcA,QADdA,CAAAA;MAgBX,KAAAoB,iBAAAA,GAAWA,KAhBAA;;MAAX;IAAAH,KAIAA,CAAAA,SAAAA,CAAAA,gCAAAA,CAAAA,GAAAA,UAAKA,OAALA,EAAAA;MAA0B,KAAAwB,kCAAAA,CAAAA,CAAKA,OAALA,EAAUA,KAAVA,EAAiBA,EAAjBA,CAA1BA;;MAJA;IAAAxB,KAKAA,CAAAA,SAAAA,CAAAA,iCAAAA,CAAAA,GAAAA,UAAKA,OAALA,EAAwBA,aAAxBA,EAAAA;MAA8C,KAAAwB,kCAAAA,CAAAA,CAAKA,OAALA,EAAUA,aAAVA,EAAqBA,EAArBA,CAA9CA;;MALA;IAAAxB,KAcAA,CAAAA,SAAAA,CAAAA,MAAAA,GAAAA,UAAAA,KAAAA,EAAAA,KAAAA,EAAAA,KAAAA;cAAAJ,SAAAA,CAAAA,MAAAA;;UAFA,YAAAC,KAAAA,CAAAA,KAAAA,QAAAA,CAAAA;wBAAA0B,gCAAAA,CAAAA,CAAAA,KAAAA,CAAAA;;YACA,IAAAxC,CAAAA,CAAAA,UAAAA,CAAAA,KAAAA,EAAAA,wBAAAA,CAAAA;0BAAAuC,uDAAAA,CAAAA,CAAAA,KAAAA,CAAAA;;;aADA;WAEA;;sBAAAD,yDAAAA,CAAAA,CAAAA,KAAAA,EAAAA,KAAAA,EAAAA,KAAAA,CAAAA;;;;MAdA;IAAArB,KAgBAA,CAAAA,SAAAA,CAAAA,QAAAA,GAAAA;kBAAAK,aAAAA,CAAAA,EAAAA;MAhBA;IAAAL,KAgBAA,CAAAA,SAAAA,CAAAA,YAAAA,CAAAA,GAAAA,UAAAA,KAAAA;kBAAAM,gBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MAhBA;IAAAN,KAiBAA,CAAAA,SAAAA,CAAAA,UAAAA,GAAAA;kBAAAyB,eAAAA,CAAAA,EAAAA;MAjBA;IAAAzB,KAkBAA,CAAAA,SAAAA,CAAAA,QAAAA,GAAAA;kBAAA0B,aAAAA,CAAAA,EAAAA;MAlBA;IAAA1B,KAmBAA,CAAAA,SAAAA,CAAAA,UAAAA,GAAAA;kBAAA2B,eAAAA,CAAAA,EAAAA;MAnBA;IAAA3B,KA6BAA,CAAAA,SAAAA,CAAAA,KAAAA,GAAAA,UAAAA,KAAAA;MARA,YAAAH,KAAAA,CAAAA,KAAAA,SAAAA,CAAAA;oBAAAgB,WAAAA,CAAAA,CAAAA,KAAAA,CAAAA;;QACA,YAAAhB,KAAAA,CAAAA,KAAAA,QAAAA,CAAAA,EAAAA;sBAAAkB,WAAAA,CAAAA,CAAAA,KAAAA,CAAAA;UACA,YAAAC,WAAAA,CAAAA,CAAAA,KAAAA,CADAA;UAEA,YAAAC,WAAAA,CAAAA,CAAAA,KAAAA,CAFAA;UAGA,YAAAC,WAAAA,CAAAA,CAAAA,KAAAA,CAHAA;UAIA,YAAAC,WAAAA,CAAAA,CAAAA,KAAAA,CAJAA;;UAMA,YAAAtB,KAAAA,CAAAA,KAAAA,QAAAA,CAAAA;wBAAAU,WAAAA,CAAAA,CAAAA,KAAAA,CAAAA;;YADA,IAAAxB,CAAAA,CAAAA,UAAAA,CAAAA,KAAAA,EAAAA,cAAAA,CAAAA;0BAAA6C,YAAAA,CAAAA,CAAAA,KAAAA,CAAAA;;cAEA,IAAA7C,CAAAA,CAAAA,UAAAA,CAAAA,KAAAA,EAAAA,kBAAAA,CAAAA;4BAAAqC,WAAAA,CAAAA,CAAAA,KAAAA,CAAAA;;;eAFA;aACA;WANA;SADA;OAQA;MA7BA;IAAApB,KA8CAA,CAAAA,SAAAA,CAAAA,OAAAA,GAAAA,UAAAA,KAAAA;cAAAJ,SAAAA,CAAAA,MAAAA;;UARA,YAAAkB,YAAAA,CAAAA,EAQAA;;UAPA,YAAAjB,KAAAA,CAAAA,KAAAA,SAAAA,CAAAA;wBAAAgC,aAAAA,CAAAA,CAAAA,KAAAA,CAAAA;;YACA,YAAAhC,KAAAA,CAAAA,KAAAA,QAAAA,CAAAA,EAAAA;0BAAAiC,aAAAA,CAAAA,CAAAA,KAAAA,CAAAA;cACA,YAAAC,aAAAA,CAAAA,CAAAA,KAAAA,CADAA;cAEA,YAAAC,aAAAA,CAAAA,CAAAA,KAAAA,CAFAA;cAGA,YAAAC,aAAAA,CAAAA,CAAAA,KAAAA,CAHAA;cAIA,YAAAC,aAAAA,CAAAA,CAAAA,KAAAA,CAJAA;;cAKA,YAAArC,KAAAA,CAAAA,KAAAA,QAAAA,CAAAA;4BAAAsC,aAAAA,CAAAA,CAAAA,KAAAA,CAAAA;;gBACA,IAAApD,CAAAA,CAAAA,UAAAA,CAAAA,KAAAA,EAAAA,kBAAAA,CAAAA;8BAAAqD,aAAAA,CAAAA,CAAAA,KAAAA,CAAAA;;;iBADA;eALA;aADA;WAOA;;;;MA9CA;IAAApC,KAiDAA,CAAAA,SAAAA,CAAAA,MAAAA,GAAAA,UAAAA,KAAAA,EAAAA,KAAAA,EAAAA,KAAAA;cAAAJ,SAAAA,CAAAA,MAAAA;;UADA,YAAAyC,cAAAA,CAAAA,CAAAA,KAAAA,EAAAA,KAAAA,CACAA;;sBAAAC,gCAAAA,CAAAA,CAAAA,KAAAA,EAAAA,KAAAA,EAAAA,KAAAA,CAAAA;;;;MAjDA;IAAAtC,KAmDAA,CAAAA,SAAAA,CAAAA,MAAAA,GAAAA,UAAAA,KAAAA,EAAAA,KAAAA,EAAAA,KAAAA;cAAAJ,SAAAA,CAAAA,MAAAA;;UADA,YAAA2C,cAAAA,CAAAA,CAAAA,KAAAA,EAAAA,KAAAA,CACAA;;sBAAAC,gCAAAA,CAAAA,CAAAA,KAAAA,EAAAA,KAAAA,EAAAA,KAAAA,CAAAA;;;;MAnDA;aAAAxC,OAAAA,CAKAA,KALAA,EAKAA,KALAA,EAKAA,KALAA,EAAAA;MAAAA,KAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAKA,QAAAJ,SAAAA,CAAAA,MAAAA;;UADA,YAAAP,gCAAAA,CAAAA,CAAAA,KAAAA,CACAA;;sBAAAoD,iCAAAA,CAAAA,CAAAA,KAAAA,EAAAA,KAAAA,CAAAA;;UALW,YAAAjB,kCAAAA,CAAAA,CAAAA,KAAAA,EAAAA,KAAAA,EAAAA,KAAAA,CAKXA;;;OALA;;IAAAxB,OAAAA,CAAAA,SAAAA,GAAAA,KAAAA,CAAAA,SAAAA;IAAAjB,CAAAA,CAAAA,WAAAA,CAAAA,qBAAAA,EAAAA,KAAAA,EAAAA,OAAAA,EAAAA,4BAAAA,EAAAA;MAAAiB,qBAAAA,EAAAA,IAAAA;MAAAhB,oBAAAA,EAAAA,IAAAA;MAAAG,4BAAAA,EAAAA,IAAAA;MAAAG,sBAAAA,EAAAA,IAAAA;MAAAC,mBAAAA,EAAAA,IAAAA;MAAAL,mBAAAA,EAAAA,IAAAA;MAAAD,kBAAAA,EAAAA,IAAAA;;;EAiCKF,CAAAA,CAAAA,aAAAA,CAAAA,4CAAAA,EAAAA,WAAAA,EAAAA;aAAA2D,KAAAA,GAAAA;MAAA3D,CAAAA,CAAAA,CAAAA,CAAAA,yCAAAA,CAAAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;WAAA4D,YAAAA,GAAAA,IAAAA;WAAAC,gBAAAA,GAAAA,IAAAA;;IAAAF,KAAAA,CAAAA,SAAAA,GAAAA,MAAAA,CAAAA,MAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,yCAAAA,CAAAA,CAAAA,SAAAA,CAAAA;IAAAA,KAAAA,CAAAA,SAAAA,CAAAA,WAAAA,QAAAA;IAAAA,KAAAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAAFA,KAAEA;WAAAG,mBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;;IAAAH,KAAAA,CAAAA,SAAAA,CAAAA,mBAAAA,CAAAA,GAAAA;MACL,KAAAE,gBAASA,CAAAA,UAAAA,CAAHA,KAAGA,CAAAA,GAAEA,IAAAA,CAAAA,YAAQA,CAAAA,UAAAA,CAACA,KAADA,CADdA;;IAAAF,KAAAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,kBAAAA;WAAAI,WAAAA,CAAAA,CAAAA,CAAAA,CAAAA,EAAAA,CAAAA,MAAAA,CAAAA,CAAAA;aAAA/D,CAAAA,CAAAA,CAAAA,CAAAA,yBAAAA,CAAAA,CAAAA,iCAAAA,CAAAA,EAAAA;;IAAA2D,KAAAA,CAAAA,SAAAA,CAAAA,kCAAAA,CAAAA,GAAAA,UAAAA,UAAAA,EAAAA,OAAAA,EAAAA,WAAAA,EAAAA;WAAAC,YAAAA,UAAAA;WAAAC,gBAAAA,cAAAA;MAAA7D,CAAAA,CAAAA,CAAAA,CAAAA,yCAAAA,CAAAA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;;;aAAA2D,OAAAA,CAAAA,KAAAA,EAAAA,KAAAA,EAAAA,KAAAA,EAAAA;MAAAA,KAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;kBAAAK,kCAAAA,CAAAA,CAAAA,KAAAA,EAAAA,KAAAA,EAAAA,KAAAA,CAAAA;;IAAAL,OAAAA,CAAAA,SAAAA,GAAAA,KAAAA,CAAAA,SAAAA;IAAA3D,CAAAA,CAAAA,WAAAA,CAAAA,4CAAAA,EAAAA,KAAAA,EAAAA,OAAAA,EAAAA,yCAAAA,EAAAA;MAAA2D,4CAAAA,EAAAA,IAAAA;MAAAM,oBAAAA,EAAAA,IAAAA;MAAAC,sBAAAA,EAAAA,IAAAA;MAAAC,yCAAAA,EAAAA,IAAAA;MAAAC,yBAAAA,EAAAA,IAAAA;MAAAC,iCAAAA,EAAAA,IAAAA;MAAAC,iBAAAA,EAAAA,IAAAA;MAAApE,kBAAAA,EAAAA,IAAAA;;KAjCL;GAAAF,mBAAAA,C;;ACAA,UAAAA,CAAAA;EAAAA,CAAAA,CAAAA,eAAAA,CAAAA,sBAAAA,EAAAA;IAAAkE,sBAAAA,EAAAA,IAAAA;IAAAhE,kBAAAA,EAAAA,IAAAA;;GAAAF,mBAAAA,C;;ACsEA,UAAAA,CAAAA;EAAAA,CAAAA,CAAAA,aAAAA,CAAAA,0CAAAA,EAAAA,WAAAA,EAAAA;aAAAuE,KAAAA;MAAAvE,CAAAA,CAAAA,CAAAA,CAAAA,qCAAAA,CAAAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;;IAAAuE,KAAAA,CAAAA,SAAAA,GAAAA,MAAAA,CAAAA,MAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,qCAAAA,CAAAA,CAAAA,SAAAA,CAAAA;IAAAA,KAAAA,CAAAA,SAAAA,CAAAA,WAAAA,QAAAA;IAAAA,KAA8BA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAACA,KAADA,EAAAA;MAAAvE,CAAAA,CAAAA,CAAAA,CAAAA,qCAAAA,CAAAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,CAAAA,IAAAA,CAAAA,IAAAA,EAA8CA,KAA9CA,CAAAA;;MAA9B;IAAAuE,KACAA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA,YAAAA;MAAS,KAAAC,WAAAA,CAAAA,CAAKA,IAALA,CAATA;;MADA;aAAAD,OAAAA,CACAA,KADAA,EAAAA;MAAAA,KAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MACA,QAAA1D,SAAAA,CAAAA,MAAAA;;sBAAAG,UAAAA,CAAAA,EAAAA;;UAD8B,YAAAwD,WAAAA,CAAAA,CAAAA,KAAAA,CAC9BA;;;OADA;;IAAAD,OAAAA,CAAAA,SAAAA,GAAAA,KAAAA,CAAAA,SAAAA;IAAAvE,CAAAA,CAAAA,WAAAA,CAAAA,0CAAAA,EAAAA,KAAAA,EAAAA,OAAAA,EAAAA,qCAAAA,EAAAA;MAAAuE,0CAAAA,EAAAA,IAAAA;MAAAE,qCAAAA,EAAAA,IAAAA;MAAAC,4BAAAA,EAAAA,IAAAA;MAAAC,qBAAAA,EAAAA,IAAAA;MAAAC,qBAAAA,EAAAA,IAAAA;MAAA1E,kBAAAA,EAAAA,IAAAA;;;GAAAF,mBAAAA,C;;AAhDA,UAAAA,CAAAA;EAAAA,CAAAA,CAAAA,aAAAA,CAAAA,0BAAAA,EAAAA,WAAAA,EAAAA;aAAA6E,KAAAA;MAAA7E,CAAAA,CAAAA,CAAAA,CAAAA,qBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;;IAAA6E,KAAAA,CAAAA,SAAAA,GAAAA,MAAAA,CAAAA,MAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,qBAAAA,CAAAA,CAAAA,SAAAA,CAAAA;IAAAA,KAAAA,CAAAA,SAAAA,CAAAA,WAAAA,QAAAA;IAAAA,KAAeA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAASA,WAATA,EAAAA;MAAA7E,CAAAA,CAAAA,CAAAA,CAAAA,qBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,CAAAA,IAAAA,CAAAA,IAAAA,EAA4CA,WAA5CA,CAAAA;;MAAf;IAAA6E,KACAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAAKA,KAALA,EAAAA;MAAuB,IAAM,CAAFlD,KAAEA,KAAGA,IAAHA,CAANA;QAAe,IAAf,KAAe,OAAf;;QAA2B,IAA3B,KAA2B,GAAFA,KAAEA,CAAAA,QAAAA,EAA3BA;OAAvB;MAAkB,KAAA6C,WAAAA,CAAAA,CAAKA,KAALA,CAAlBA;;MADA;IAAAK,KAEAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAAKA,KAALA,EAAAA;MAAyB,KAAAL,WAAAA,CAAAA,CAAKA,CAAAA,CAAAA,EAAAA,CAAAA,KAAAA,CAAEA,CAAAA,QAAAA,EAAPA,CAAzBA;;MAFA;IAAAK,KAGAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAAKA,KAALA,EAAAA;MAAsB,KAAAL,WAAAA,CAAAA,CAAKA,CAAAA,CAAAA,EAAAA,CAAAA,KAAAA,CAAEA,CAAAA,QAAAA,EAAPA,CAAtBA;;MAHA;IAAAK,KAIAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAAKA,KAALA,EAAAA;MAAwB,KAAAL,WAAAA,CAAAA,CAAKA,CAAAA,CAAAA,EAAAA,CAAAA,KAAAA,CAAEA,CAAAA,QAAAA,EAAPA,CAAxBA;;MAJA;IAAAK,KAKAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAAKA,KAALA,EAAAA;MAAuB,KAAAL,WAAAA,CAAAA,CAAKA,CAAAA,CAAAA,EAAAA,CAAAA,KAAAA,CAAEA,CAAAA,QAAAA,EAAPA,CAAvBA;;MALA;IAAAK,KAMAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAAKA,KAALA,EAAAA;MAAqB,KAAAL,WAAAA,CAAAA,CAAKA,CAAAA,CAAAA,EAAAA,CAAAA,KAAAA,CAAEA,CAAAA,QAAAA,EAAPA,CAArBA;;MANA;IAAAK,KAOAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAAKA,KAALA,EAAAA;MAAsB,KAAAL,WAAAA,CAAAA,CAAKA,CAAAA,CAAAA,EAAAA,CAAAA,KAAAA,CAAEA,CAAAA,QAAAA,EAAPA,CAAtBA;;MAPA;aAAAK,OAAAA,CAOAA,KAPAA,EAAAA;MAAAA,KAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAEA,YAAA/D,KAAAA,CAAAA,KAAAA,SAAAA,CAAAA;oBAAAgE,WAAAA,CAAAA,CAAAA,KAAAA,CAAAA;;QACA,YAAAhE,KAAAA,CAAAA,KAAAA,QAAAA,CAAAA,EAAAA;sBAAAiE,WAAAA,CAAAA,CAAAA,KAAAA,CAAAA;UACA,YAAAC,WAAAA,CAAAA,CAAAA,KAAAA,CADAA;UAEA,YAAAC,WAAAA,CAAAA,CAAAA,KAAAA,CAFAA;UAGA,YAAAC,WAAAA,CAAAA,CAAAA,KAAAA,CAHAA;UAIA,YAAAC,WAAAA,CAAAA,CAAAA,KAAAA,CAJAA;;UAFA,IAAAnF,CAAAA,CAAAA,UAAAA,CAAAA,KAAAA,EAAAA,kBAAAA,CAAAA;wBAAAoF,WAAAA,CAAAA,CAAAA,KAAAA,CAAAA;;YAMA,4BANA;WAEA;SADA;OAFA;;IAAAP,OAAAA,CAAAA,SAAAA,GAAAA,KAAAA,CAAAA,SAAAA;IAAA7E,CAAAA,CAAAA,WAAAA,CAAAA,0BAAAA,EAAAA,KAAAA,EAAAA,OAAAA,EAAAA,qBAAAA,EAAAA;MAAA6E,0BAAAA,EAAAA,IAAAA;MAAAD,qBAAAA,EAAAA,IAAAA;MAAA1E,kBAAAA,EAAAA,IAAAA;;;GAAAF,mBAAAA,C;;ACtBA,UAAAA,CAAAA,EAAAA;EAAAA,CAAAA,CAAAA,aAAAA,CAAAA,mBAAAA,EAAAA,WAAAA,EAAAA;aAAAqF,KAAAA,GAAAA;MAAArF,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAAoB,KAAAsF,cAAAA,GAAAA,KAApBA;;IAAAD,KAAAA,CAAAA,SAAAA,GAAAA,MAAAA,CAAAA,MAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA;IAAAA,KAAAA,CAAAA,SAAAA,CAAAA,WAAAA,QAAAA;IAAAA,KAAoBA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA;kBAAAC,cAAAA;MAApB;IAAAD,KACAA,CAAAA,SAAAA,CAAAA,iBAAAA,CAAAA,GAAAA;MAAgC,YAAAE,UAAAA,CAAAA,EAAhCA;MADA;IAAAF,KAGSA,CAAAA,SAAAA,CAAAA,YAAAA,CAAAA,GAAAA,UAAOA,QAAPA;MACgB,QAAVrF,CAAAA,CAAAA,UAAAA,CAAjBA,QAAiBA,EAAAA,mBAAAA,CAAUA,IAAUA,CAANA,IAAAA,CAAAA,UAAAA,CAAAA,EAAMA,KAAoBA,CAAAA,CAAAA,UAAAA,CAAjBA,QAAiBA,EAAAA,mBAAAA,CAAUA,CAAAA,UAAAA,CAAAA,EAA9BA,CAAVA,CADhBA;MAHT;IAAAqF,KAMSA,CAAAA,SAAAA,CAAAA,aAAAA,CAAAA,GAAAA;MAAmB,IAAI,KAAAE,UAAAA,CAAAA,EAAJA;QAAW,aAAX;;QAAuB,cAAvB;OAAnB;MANT;IAAAF,KAQSA,CAAAA,SAAAA,CAAAA,aAAAA,CAAAA,GAAAA;MAAW,IAAI,KAAAE,UAAAA,CAAAA,EAAJA;QAAW,WAAX;;QAAqB,WAArB;OAAX;MART;IAAAF,KAAOA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAAaA,SAAbA,EAAAA;MAAa,KAAAC,cAAAA,YAAbA;MAAAtF,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;;MAAP;IAAAqF,KACAA,CAAAA,SAAAA,CAAAA,YAAAA,GAAAA;kBAAAG,iBAAAA,CAAAA,EAAAA;MADA;aAAAH,OAAAA,CAAOA,KAAPA,EAAAA;MAAAA,KAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAAO,YAAAP,WAAAA,CAAAA,CAAAA,KAAAA,CAAPA;;IAAAO,OAAAA,CAAAA,SAAAA,GAAAA,KAAAA,CAAAA,SAAAA;IAAArF,CAAAA,CAAAA,WAAAA,CAAAA,mBAAAA,EAAAA,KAAAA,EAAAA,OAAAA,EAAAA,kBAAAA,EAAAA;MAAAqF,mBAAAA,EAAAA,IAAAA;MAAAnF,kBAAAA,EAAAA,IAAAA;;;;;;MAYA,KAAAuF,aAAAA,GAAAA,IAZAA;MAaA,KAAAC,aAAAA,GAAAA,IAbAA;MAcA,KAAAC,cAAAA,GAAAA,IAdAA;;;;IAYA,MAAAC,SAAAA,CAAAA,yBAAAA,CAAAA,GAAAA;kBAAAH,aAAAA;MAZA;IAaA,MAAAG,SAAAA,CAAAA,2BAAAA,CAAAA,GAAAA;kBAAAF,aAAAA;MAbA;IAcA,MAAAE,SAAAA,CAAAA,4BAAAA,CAAAA,GAAAA;kBAAAD,cAAAA;MAdA;IAgBA,MAAAC,SAAAA,CAAAA,+BAAAA,CAAAA,GAAAA,UAAQA,gBAARA;MAAuC,IAAIC,gBAAJA;QAAkB,YAAAC,2BAAAA,CAAAA,EAAlBA;;QAA4B,YAAAC,4BAAAA,CAAAA,EAA5BA;OAAvC;MAhBA;IAkBA,MAAAH,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA,UAASA,KAATA;MAA6B,IAAII,KAAJA;QAAO,aAAP;;QAAmB,cAAnB;OAA7B;MAlBA;IAWS,MAAAJ,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA,YAAAA;MAAA5F,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAAAA,CAAAA,CAAAA,OAAAA,CAAAA,mBAAAA,CAAAA,CAAAA,SAAAA,GAAAA,IAAAA;MACT,KAAAyF,aAAAA,GAAcA,CAAAA,CAAAA,UAAAA,CAAAA,eAAAA,CAAAA,CAAAA,GADLA;MAET,KAAAC,aAAAA,GAAOA,IAAAA,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAAA,EAAAA,CAAAA,WAAAA,CAAAA,CAAYA,IAAZA,CAFEA;MAGT,KAAAC,cAAAA,GAAQA,IAAAA,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAAA,EAAAA,CAAAA,WAAAA,CAAAA,CAAYA,KAAZA,CAHCA;;MAXT;IAYA,MAAAC,SAAAA,CAAAA,IAAAA,GAAAA;kBAAAK,yBAAAA,CAAAA,EAAAA;MAZA;IAaA,MAAAL,SAAAA,CAAAA,IAAAA,GAAAA;kBAAAE,2BAAAA,CAAAA,EAAAA;MAbA;IAcA,MAAAF,SAAAA,CAAAA,KAAAA,GAAAA;kBAAAG,4BAAAA,CAAAA,EAAAA;MAdA;IAgBA,MAAAH,SAAAA,CAAAA,OAAAA,GAAAA,UAAAA,KAAAA;kBAAAM,+BAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MAhBA;IAkBA,MAAAN,SAAAA,CAAAA,QAAAA,GAAAA,UAAAA,KAAAA;cAAA/E,SAAAA,CAAAA,MAAAA;;;;sBAAAsF,cAAAA,CAAAA,CAAAA,KAAAA,CAAAA;;;;MAlBA;;;MAWS,YAAAnF,UAAAA,CAAAA,EAXTA;;;;;;;;EAWChB,CAAAA,CAAAA,cAAAA,CAAAA,mBAAAA,EAAAA,oBAAAA,CAXDA;GAAAA,mBAAAA,C;;AC6BM,UAAAA,CAAAA,EAAAA;EAAAA,CAAAA,CAAAA,aAAAA,CAAAA,gBAAAA,EAAAA,WAAAA,EAAAA;aAAAoG,KAAAA,GAAAA;MAAApG,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAAiB,KAAAsF,cAAAA,GAAAA,CAAjBA;MACU,KAAAe,cAAAA,GAAAA,KADVA;;IAAAD,KAAAA,CAAAA,SAAAA,GAAAA,MAAAA,CAAAA,MAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA;IAAAA,KAAAA,CAAAA,SAAAA,CAAAA,WAAAA,QAAAA;IAAAA,KAAiBA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA;kBAAAd,cAAAA;MAAjB;IAAAc,KACUA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA;kBAAAC,cAAAA;MADV;IAAAD,KAGGA,CAAAA,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA;MAAc,YAAAE,UAAAA,CAAAA,EAAdA;MAHH;IAAAF,KAIGA,CAAAA,SAAAA,CAAAA,eAAAA,CAAAA,GAAAA;MAAe,YAAAE,UAAAA,CAAAA,EAAfA;MAJH;IAAAF,KAKNA,CAAAA,SAAAA,CAAAA,aAAAA,CAAAA,GAAAA;MAAa,YAAAE,UAAAA,CAAAA,EAAbA;MALM;IAAAF,KAMNA,CAAAA,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA;MAAc,YAAAE,UAAAA,CAAAA,EAAdA;MANM;IAAAF,KAONA,CAAAA,SAAAA,CAAAA,eAAAA,CAAAA,GAAAA;MAAe,YAAAE,UAAAA,CAAAA,EAAfA;MAPM;IAAAF,KAQNA,CAAAA,SAAAA,CAAAA,gBAAAA,CAAAA,GAAAA;MAAgB,YAAAE,UAAAA,CAAAA,EAAhBA;MARM;IAAAF,KAUGA,CAAAA,SAAAA,CAAAA,YAAAA,CAAAA,GAAAA,UAAOA,QAAPA;MACa,QAAPpG,CAAAA,CAAAA,UAAAA,CAAjBA,QAAiBA,EAAAA,gBAAAA,CAAOA,IAAUA,CAANA,IAAAA,CAAAA,UAAAA,CAAAA,EAAMA,KAAoBA,CAAAA,CAAAA,UAAAA,CAAjBA,QAAiBA,EAAAA,gBAAAA,CAAOA,CAAAA,UAAAA,CAAAA,EAA3BA,CAAVA,CADbA;MAVH;IAAAoG,KAaGA,CAAAA,SAAAA,CAAAA,aAAAA,CAAAA,GAAAA;MAA6B,OAAjB,KAAAE,UAAAA,CAAAA,EAAiBA,CAAAA,QAAAA,EAA7BA;MAbH;IAAAF,KAAIA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAAaA,SAAbA,EAAAA;MAAa,KAAAd,cAAAA,YAAbA;MAAAtF,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MACM,KAAAqG,cAAAA,GAAQA,IADdA;;MAAJ;aAAAD,OAAAA,CAAIA,KAAJA,EAAAA;MAAAA,KAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAAI,YAAAG,WAAAA,CAAAA,CAAAA,KAAAA,CAAJA;;IAAAH,OAAAA,CAAAA,SAAAA,GAAAA,KAAAA,CAAAA,SAAAA;IAAApG,CAAAA,CAAAA,WAAAA,CAAAA,gBAAAA,EAAAA,KAAAA,EAAAA,OAAAA,EAAAA,kBAAAA,EAAAA;MAAAoG,gBAAAA,EAAAA,IAAAA;MAAAI,kBAAAA,EAAAA,IAAAA;MAAAtG,kBAAAA,EAAAA,IAAAA;;;;;;MAiBN,KAAAuF,aAAAA,GAAAA,IAjBMA;MAkBN,KAAAgB,kBAAAA,GAAAA,CAlBMA;MAmBN,KAAAC,kBAAAA,GAAAA,CAnBMA;;;;IAiBN,MAAAd,SAAAA,CAAAA,yBAAAA,CAAAA,GAAAA;kBAAAH,aAAAA;MAjBM;IAkBN,MAAAG,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA;kBAAAa,kBAAAA;MAlBM;IAmBN,MAAAb,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA;kBAAAc,kBAAAA;MAnBM;IAqBN,MAAAd,SAAAA,CAAAA,4BAAAA,CAAAA,GAAAA,UAAQA,aAARA;MAAiC,WAAA5F,CAAAA,CAAAA,CAAAA,CAAAA,gBAAAA,CAAAA,EAAAA,CAAAA,WAAAA,CAAAA,CAASA,aAATA,CAAjCA;MArBM;IAsBN,MAAA4F,SAAAA,CAAAA,eAAAA,CAAAA,GAAAA,UAAUA,KAAVA;MAAmD,OAAhB5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAgBA,CAAAA,cAAAA,CAAAA,CAACA,KAADA,CAAnDA;MAtBM;IAuBN,MAAA4F,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA,UAASA,KAATA;MAAmD,OAAzB5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAeA,CAAAA,+BAAAA,CAAAA,CAACA,KAADA,CAAUA,CAAAA,aAAAA,CAAAA,EAAnDA;MAvBM;IAgBA,MAAA4F,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA,YAAAA;MAAA5F,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAAAA,CAAAA,CAAAA,OAAAA,CAAAA,gBAAAA,CAAAA,CAAAA,SAAAA,GAAAA,IAAAA;MACN,KAAAyF,aAAAA,GAAcA,CAAAA,CAAAA,UAAAA,CAAAA,YAAAA,CAAAA,CAAAA,GADRA;MAEN,KAAAgB,kBAAAA,GAAyBA,IAFnBA;MAGN,KAAAC,kBAAAA,GAAwBA,GAHlBA;;MAhBA;IAiBN,MAAAd,SAAAA,CAAAA,IAAAA,GAAAA;kBAAAK,yBAAAA,CAAAA,EAAAA;MAjBM;IAkBN,MAAAL,SAAAA,CAAAA,SAAAA,GAAAA;kBAAAe,cAAAA,CAAAA,EAAAA;MAlBM;IAmBN,MAAAf,SAAAA,CAAAA,SAAAA,GAAAA;kBAAAgB,cAAAA,CAAAA,EAAAA;MAnBM;IAqBN,MAAAhB,SAAAA,CAAAA,OAAAA,GAAAA,UAAAA,KAAAA;kBAAAiB,4BAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MArBM;IAsBN,MAAAjB,SAAAA,CAAAA,SAAAA,GAAAA,UAAAA,KAAAA;kBAAAkB,eAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MAtBM;IAuBN,MAAAlB,SAAAA,CAAAA,QAAAA,GAAAA,UAAAA,KAAAA;cAAA/E,SAAAA,CAAAA,MAAAA;;;;sBAAAkG,cAAAA,CAAAA,CAAAA,KAAAA,CAAAA;;;;MAvBM;;;MAgBA,YAAA/F,UAAAA,CAAAA,EAhBAA;;;;;;;;EAgBLhB,CAAAA,CAAAA,cAAAA,CAAAA,gBAAAA,EAAAA,iBAAAA,CAhBKA;GAAAA,mBAAAA,C;;AC3BN,UAAAA,CAAAA,EAAAA;EAAAA,CAAAA,CAAAA,aAAAA,CAAAA,qBAAAA,EAAAA,WAAAA,EAAAA;aAAAgH,KAAAA,GAAAA;MAAAhH,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAAU,KAAAsF,cAAAA,GAAAA,CAAVA;;IAAA0B,KAAAA,CAAAA,SAAAA,GAAAA,MAAAA,CAAAA,MAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA;IAAAA,KAAAA,CAAAA,SAAAA,CAAAA,WAAAA,QAAAA;IAAAA,KACAA,CAAAA,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA;MAA0B,YAAA1B,cAA1BA;MADA;IAAA0B,KAGSA,CAAAA,SAAAA,CAAAA,YAAAA,CAAAA,GAAAA,UAAOA,QAAPA;MACkB,QAAZhH,CAAAA,CAAAA,UAAAA,CAAjBA,QAAiBA,EAAAA,qBAAAA,CAAYA,IAAUA,CAANA,IAAAA,CAAAA,cAAMA,KAAoBA,CAAAA,CAAAA,UAAAA,CAAjBA,QAAiBA,EAAAA,qBAAAA,CAAYA,CAAAA,cAAAA,CAAAA,EAAhCA,CAAVA,CADlBA;MAHT;IAAAgH,KAMSA,CAAAA,SAAAA,CAAAA,aAAAA,CAAAA,GAAAA;MAC0B,OAA1BhH,CAAAA,CAAAA,CAAAA,CAAAA,MAA0BA,CAA1BA,YAA0BA,CAACA,IAAAA,CAAAA,cAADA,CAD1BA;MANT;IAAAgH,KAASA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAACA,SAADA,EAAAA;MAAC,KAAA1B,cAAAA,YAADA;MAAAtF,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;;MAAT;IAAAgH,KACAA,CAAAA,SAAAA,CAAAA,SAAAA,GAAAA;kBAAAC,cAAAA,CAAAA,EAAAA;MADA;aAAAD,OAAAA,CAASA,KAATA,EAAAA;MAAAA,KAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAAS,YAAAjC,WAAAA,CAAAA,CAAAA,KAAAA,CAATA;;IAAAiC,OAAAA,CAAAA,SAAAA,GAAAA,KAAAA,CAAAA,SAAAA;IAAAhH,CAAAA,CAAAA,WAAAA,CAAAA,qBAAAA,EAAAA,KAAAA,EAAAA,OAAAA,EAAAA,kBAAAA,EAAAA;MAAAgH,qBAAAA,EAAAA,IAAAA;MAAA9G,kBAAAA,EAAAA,IAAAA;;;;;;MAWA,KAAAuF,aAAAA,GAAAA,IAXAA;MAYA,KAAAgB,kBAAAA,GAAAA,CAZAA;MAaA,KAAAC,kBAAAA,GAAAA,CAbAA;MAiBA,KAAAQ,yBAAAA,GAAAA,CAjBAA;MAkBA,KAAAC,yBAAAA,GAAAA,CAlBAA;MAmBA,KAAAC,qBAAAA,GAAAA,CAnBAA;MAoBA,KAAAC,yBAAAA,GAAAA,CApBAA;MAqBA,KAAAC,sBAAAA,GAAAA,CArBAA;MAsBA,KAAAC,+BAAAA,GAAAA,CAtBAA;MAuBA,KAAAC,uBAAAA,GAAAA,CAvBAA;MAwBA,KAAAC,yBAAAA,GAAAA,CAxBAA;MAyBA,KAAAC,wBAAAA,GAAAA,CAzBAA;MA0BA,KAAAC,6BAAAA,GAAAA,CA1BAA;MA2BA,KAAAC,kBAAAA,GAAAA,CA3BAA;MA6BA,KAAAC,kBAAAA,GAAAA,CA7BAA;;;;IAWA,MAAAjC,SAAAA,CAAAA,yBAAAA,CAAAA,GAAAA;kBAAAH,aAAAA;MAXA;IAYA,MAAAG,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA;kBAAAa,kBAAAA;MAZA;IAaA,MAAAb,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA;kBAAAc,kBAAAA;MAbA;IAeA,MAAAd,SAAAA,CAAAA,iCAAAA,CAAAA,GAAAA,UAAQA,aAARA;MAAiC,WAAA5F,CAAAA,CAAAA,CAAAA,CAAAA,qBAAAA,CAAAA,EAAAA,CAAAA,WAAAA,CAAAA,CAAcA,aAAdA,CAAjCA;MAfA;IAiBA,MAAA4F,SAAAA,CAAAA,qBAAAA,CAAAA,GAAAA;kBAAAsB,yBAAAA;MAjBA;IAkBA,MAAAtB,SAAAA,CAAAA,qBAAAA,CAAAA,GAAAA;kBAAAuB,yBAAAA;MAlBA;IAmBA,MAAAvB,SAAAA,CAAAA,iBAAAA,CAAAA,GAAAA;kBAAAwB,qBAAAA;MAnBA;IAoBA,MAAAxB,SAAAA,CAAAA,qBAAAA,CAAAA,GAAAA;kBAAAyB,yBAAAA;MApBA;IAqBA,MAAAzB,SAAAA,CAAAA,kBAAAA,CAAAA,GAAAA;kBAAA0B,sBAAAA;MArBA;IAsBA,MAAA1B,SAAAA,CAAAA,2BAAAA,CAAAA,GAAAA;kBAAA2B,+BAAAA;MAtBA;IAuBA,MAAA3B,SAAAA,CAAAA,mBAAAA,CAAAA,GAAAA;kBAAA4B,uBAAAA;MAvBA;IAwBA,MAAA5B,SAAAA,CAAAA,qBAAAA,CAAAA,GAAAA;kBAAA6B,yBAAAA;MAxBA;IAyBA,MAAA7B,SAAAA,CAAAA,oBAAAA,CAAAA,GAAAA;kBAAA8B,wBAAAA;MAzBA;IA0BA,MAAA9B,SAAAA,CAAAA,yBAAAA,CAAAA,GAAAA;kBAAA+B,6BAAAA;MA1BA;IA2BA,MAAA/B,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA;kBAAAgC,kBAAAA;MA3BA;IA6BA,MAAAhC,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA;kBAAAiC,kBAAAA;MA7BA;IAgCA,MAAAjC,SAAAA,CAAAA,aAAAA,CAAAA,GAAAA,UAAQA,MAARA;MAA8C,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAA9CA;MAhCA;IAiCA,MAAA4F,SAAAA,CAAAA,aAAAA,CAAAA,GAAAA,UAAQA,aAARA;MAAoD,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAApDA;MAjCA;IAkCA,MAAA4F,SAAAA,CAAAA,YAAAA,CAAAA,GAAAA,UAAMA,KAANA,EAAqBA,SAArBA;MAA6D,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAA7DA;MAlCA;IAmCA,MAAA4F,SAAAA,CAAAA,kBAAAA,CAAAA,GAAAA,UAAaA,KAAbA;MAAsD,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAAtDA;MAnCA;IAoCA,MAAA4F,SAAAA,CAAAA,aAAAA,CAAAA,GAAAA,UAAQA,KAARA;MAAiD,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAAjDA;MApCA;IAqCA,MAAA4F,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA,UAASA,KAATA;MAAkD,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAAlDA;MArCA;IAsCA,MAAA4F,SAAAA,CAAAA,qBAAAA,CAAAA,GAAAA,UAAgBA,KAAhBA;MAAyD,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAAzDA;MAtCA;IAuCA,MAAA4F,SAAAA,CAAAA,kBAAAA,CAAAA,GAAAA,UAAaA,KAAbA;MAAsD,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAAtDA;MAvCA;IAwCA,MAAA4F,SAAAA,CAAAA,iBAAAA,CAAAA,GAAAA,UAAYA,KAAZA;MAAqD,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAArDA;MAxCA;IAyCA,MAAA4F,SAAAA,CAAAA,qBAAAA,CAAAA,GAAAA,UAAgBA,KAAhBA;MAAyD,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAAzDA;MAzCA;IA0CA,MAAA4F,SAAAA,CAAAA,oBAAAA,CAAAA,GAAAA,UAAeA,KAAfA;MAAwD,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAAxDA;MA1CA;IA2CA,MAAA4F,SAAAA,CAAAA,8BAAAA,CAAAA,GAAAA,UAAyBA,KAAzBA;MAAkE,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAAlEA;MA3CA;IA4CA,MAAA4F,SAAAA,CAAAA,6BAAAA,CAAAA,GAAAA,UAAwBA,KAAxBA;MAAiE,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAAjEA;MA5CA;IA6CA,MAAA4F,SAAAA,CAAAA,2BAAAA,CAAAA,GAAAA,UAAsBA,KAAtBA;MAA+D,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAA/DA;MA7CA;IA8CA,MAAA4F,SAAAA,CAAAA,gBAAAA,CAAAA,GAAAA,UAAWA,KAAXA;MAAoD,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAApDA;MA9CA;IA+CA,MAAA4F,SAAAA,CAAAA,iBAAAA,CAAAA,GAAAA,UAAYA,KAAZA;MAAqD,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAArDA;MA/CA;IAgDA,MAAA4F,SAAAA,CAAAA,iBAAAA,CAAAA,GAAAA,UAAYA,KAAZA;MAAqD,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAArDA;MAhDA;IAiDA,MAAA4F,SAAAA,CAAAA,iBAAAA,CAAAA,GAAAA,UAAYA,KAAZA;MAAqD,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAArDA;MAjDA;IAkDA,MAAA4F,SAAAA,CAAAA,0BAAAA,CAAAA,GAAAA,UAAqBA,KAArBA;MAA8D,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAA9DA;MAlDA;IAoDA,MAAA4F,SAAAA,CAAAA,uBAAAA,CAAAA,GAAAA,UAAkBA,KAAlBA;MAAwD,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAAxDA;MApDA;IAuDA,MAAA4F,SAAAA,CAAAA,iBAAAA,CAAAA,GAAAA,UAAYA,KAAZA;MAAkD,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAAlDA;MAvDA;IAwDA,MAAA4F,SAAAA,CAAAA,iBAAAA,CAAAA,GAAAA,UAAYA,KAAZA;MAAkD,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAAlDA;MAxDA;IAyDA,MAAA4F,SAAAA,CAAAA,iBAAAA,CAAAA,GAAAA,UAAYA,KAAZA;MAAkD,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAAlDA;MAzDA;IA0DA,MAAA4F,SAAAA,CAAAA,qBAAAA,CAAAA,GAAAA,UAAgBA,KAAhBA;MAAqD,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAArDA;MA1DA;IA6DA,MAAA4F,SAAAA,CAAAA,kBAAAA,CAAAA,GAAAA,UAAaA,MAAbA;MAAoD,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAApDA;MA7DA;IA+DA,MAAA4F,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA,UAASA,KAATA;MAAqC,OAAX,IAAO,CAAAkC,iCAAAA,CAAAA,CAACA,KAADA,CAAIA,CAAAA,aAAAA,CAAAA,EAArCA;MA/DA;IAUW,MAAAlC,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA,YAAAA;MAAA5F,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAAAA,CAAAA,CAAAA,OAAAA,CAAAA,qBAAAA,CAAAA,CAAAA,SAAAA,GAAAA,IAAAA;MACX,KAAAyF,aAAAA,GAAcA,CAAAA,CAAAA,UAAAA,CAAAA,YAAAA,CAAAA,CAAAA,GADHA;MAEX,KAAAgB,kBAAAA,GAAwBA,CAFbA;MAGX,KAAAC,kBAAAA,GAAwBA,GAHbA;MAOX,KAAAQ,yBAAAA,GAA+BA,CAPpBA;MAQX,KAAAC,yBAAAA,GAA+BA,CARpBA;MASX,KAAAC,qBAAAA,GAA2BA,CAThBA;MAUX,KAAAC,yBAAAA,GAA+BA,CAVpBA;MAWX,KAAAC,sBAAAA,GAA4BA,CAXjBA;MAYX,KAAAC,+BAAAA,GAAqCA,CAZ1BA;MAaX,KAAAC,uBAAAA,GAA6BA,CAblBA;MAcX,KAAAC,yBAAAA,GAA+BA,CAdpBA;MAeX,KAAAC,wBAAAA,GAA8BA,CAfnBA;MAgBX,KAAAC,6BAAAA,GAAmCA,CAhBxBA;MAiBX,KAAAC,kBAAAA,GAAwBA,CAjBbA;MAmBX,KAAAC,kBAAAA,GAAuBA,CAnBZA;;MAVX;IAWA,MAAAjC,SAAAA,CAAAA,IAAAA,GAAAA;kBAAAK,yBAAAA,CAAAA,EAAAA;MAXA;IAYA,MAAAL,SAAAA,CAAAA,SAAAA,GAAAA;kBAAAmC,cAAAA,CAAAA,EAAAA;MAZA;IAaA,MAAAnC,SAAAA,CAAAA,SAAAA,GAAAA;kBAAAoC,cAAAA,CAAAA,EAAAA;MAbA;IAeA,MAAApC,SAAAA,CAAAA,OAAAA,GAAAA,UAAAA,KAAAA;kBAAAkC,iCAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MAfA;IAiBA,MAAAlC,SAAAA,CAAAA,gBAAAA,GAAAA;kBAAAqC,qBAAAA,CAAAA,EAAAA;MAjBA;IAkBA,MAAArC,SAAAA,CAAAA,gBAAAA,GAAAA;kBAAAsC,qBAAAA,CAAAA,EAAAA;MAlBA;IAmBA,MAAAtC,SAAAA,CAAAA,YAAAA,GAAAA;kBAAAuC,iBAAAA,CAAAA,EAAAA;MAnBA;IAoBA,MAAAvC,SAAAA,CAAAA,gBAAAA,GAAAA;kBAAAwC,qBAAAA,CAAAA,EAAAA;MApBA;IAqBA,MAAAxC,SAAAA,CAAAA,aAAAA,GAAAA;kBAAAyC,kBAAAA,CAAAA,EAAAA;MArBA;IAsBA,MAAAzC,SAAAA,CAAAA,sBAAAA,GAAAA;kBAAA0C,2BAAAA,CAAAA,EAAAA;MAtBA;IAuBA,MAAA1C,SAAAA,CAAAA,cAAAA,GAAAA;kBAAA2C,mBAAAA,CAAAA,EAAAA;MAvBA;IAwBA,MAAA3C,SAAAA,CAAAA,gBAAAA,GAAAA;kBAAA4C,qBAAAA,CAAAA,EAAAA;MAxBA;IAyBA,MAAA5C,SAAAA,CAAAA,eAAAA,GAAAA;kBAAA6C,oBAAAA,CAAAA,EAAAA;MAzBA;IA0BA,MAAA7C,SAAAA,CAAAA,oBAAAA,GAAAA;kBAAA8C,yBAAAA,CAAAA,EAAAA;MA1BA;IA2BA,MAAA9C,SAAAA,CAAAA,SAAAA,GAAAA;kBAAA+C,cAAAA,CAAAA,EAAAA;MA3BA;IA6BA,MAAA/C,SAAAA,CAAAA,SAAAA,GAAAA;kBAAAgD,cAAAA,CAAAA,EAAAA;MA7BA;IAiCA,MAAAhD,SAAAA,CAAAA,OAAAA,GAAAA,UAAAA,KAAAA,EAAAA;kBAAAiD,aAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MADA,YAAAC,aAAAA,CAAAA,CAAAA,KAAAA,CACAA;MAjCA;IAkCA,MAAAlD,SAAAA,CAAAA,KAAAA,GAAAA,UAAAA,KAAAA,EAAAA,KAAAA;kBAAAmD,YAAAA,CAAAA,CAAAA,KAAAA,EAAAA,KAAAA,CAAAA;MAlCA;IAmCA,MAAAnD,SAAAA,CAAAA,YAAAA,GAAAA,UAAAA,KAAAA;kBAAAoD,kBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MAnCA;IAoCA,MAAApD,SAAAA,CAAAA,OAAAA,GAAAA,UAAAA,KAAAA;kBAAAqD,aAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MApCA;IAqCA,MAAArD,SAAAA,CAAAA,QAAAA,GAAAA,UAAAA,KAAAA;kBAAAsD,cAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MArCA;IAsCA,MAAAtD,SAAAA,CAAAA,eAAAA,GAAAA,UAAAA,KAAAA;kBAAAuD,qBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MAtCA;IAuCA,MAAAvD,SAAAA,CAAAA,YAAAA,GAAAA,UAAAA,KAAAA;kBAAAwD,kBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MAvCA;IAwCA,MAAAxD,SAAAA,CAAAA,WAAAA,GAAAA,UAAAA,KAAAA;kBAAAyD,iBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MAxCA;IAyCA,MAAAzD,SAAAA,CAAAA,eAAAA,GAAAA,UAAAA,KAAAA;kBAAA0D,qBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MAzCA;IA0CA,MAAA1D,SAAAA,CAAAA,cAAAA,GAAAA,UAAAA,KAAAA;kBAAA2D,oBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MA1CA;IA2CA,MAAA3D,SAAAA,CAAAA,wBAAAA,GAAAA,UAAAA,KAAAA;kBAAA4D,8BAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MA3CA;IA4CA,MAAA5D,SAAAA,CAAAA,uBAAAA,GAAAA,UAAAA,KAAAA;kBAAA6D,6BAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MA5CA;IA6CA,MAAA7D,SAAAA,CAAAA,qBAAAA,GAAAA,UAAAA,KAAAA;kBAAA8D,2BAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MA7CA;IA8CA,MAAA9D,SAAAA,CAAAA,UAAAA,GAAAA,UAAAA,KAAAA;kBAAA+D,gBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MA9CA;IA+CA,MAAA/D,SAAAA,CAAAA,WAAAA,GAAAA,UAAAA,KAAAA;kBAAAgE,iBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MA/CA;IAgDA,MAAAhE,SAAAA,CAAAA,WAAAA,GAAAA,UAAAA,KAAAA;kBAAAiE,iBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MAhDA;IAiDA,MAAAjE,SAAAA,CAAAA,WAAAA,GAAAA,UAAAA,KAAAA;kBAAAkE,iBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MAjDA;IAkDA,MAAAlE,SAAAA,CAAAA,oBAAAA,GAAAA,UAAAA,KAAAA;kBAAAmE,0BAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MAlDA;IAoDA,MAAAnE,SAAAA,CAAAA,iBAAAA,GAAAA,UAAAA,KAAAA;kBAAAoE,uBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MApDA;IAuDA,MAAApE,SAAAA,CAAAA,WAAAA,GAAAA,UAAAA,KAAAA;kBAAAqE,iBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MAvDA;IAwDA,MAAArE,SAAAA,CAAAA,WAAAA,GAAAA,UAAAA,KAAAA;kBAAAsE,iBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MAxDA;IAyDA,MAAAtE,SAAAA,CAAAA,WAAAA,GAAAA,UAAAA,KAAAA;kBAAAuE,iBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MAzDA;IA0DA,MAAAvE,SAAAA,CAAAA,eAAAA,GAAAA,UAAAA,KAAAA;kBAAAwE,qBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MA1DA;IA6DA,MAAAxE,SAAAA,CAAAA,YAAAA,GAAAA,UAAAA,KAAAA;kBAAAyE,kBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MA7DA;IA+DA,MAAAzE,SAAAA,CAAAA,QAAAA,GAAAA,UAAAA,KAAAA;cAAA/E,SAAAA,CAAAA,MAAAA;;;;sBAAAyJ,cAAAA,CAAAA,CAAAA,KAAAA,CAAAA;;;;MA/DA;;;MAUW,YAAAtJ,UAAAA,CAAAA,EAVXA;;;;;;;;EAUChB,CAAAA,CAAAA,cAAAA,CAAAA,qBAAAA,EAAAA,sBAAAA,CAVDA;GAAAA,mBAAAA,C;;ACAM,UAAAA,CAAAA;EAAAA,CAAAA,CAAAA,aAAAA,CAAAA,iBAAAA,EAAAA,WAAAA,EAAAA;aAAAuK,KAAAA,GAAAA;MAAAvK,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAAmC,KAAAwK,YAAAA,GAAAA,IAAnCA;MACU,KAAAC,aAAAA,GAAAA,IADVA;;IAAAF,KAAAA,CAAAA,SAAAA,GAAAA,MAAAA,CAAAA,MAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA;IAAAA,KAAAA,CAAAA,SAAAA,CAAAA,WAAAA,QAAAA;IAAAA,KAAmCA,CAAAA,SAAAA,CAAAA,yBAAAA,CAAAA,GAAAA;kBAAAC,YAAAA;MAAnC;IAAAD,KACUA,CAAAA,SAAAA,CAAAA,0BAAAA,CAAAA,GAAAA;kBAAAE,aAAAA;MADV;IAAAF,KAGGA,CAAAA,SAAAA,CAAAA,aAAAA,CAAAA,GAAAA,YAE6BA;MADvC,IAAI,IAAW,CAAAG,gBAAAA,CAAAA,EAAfA;QAAmB,IAAnB,KAAmB,eAAnB;;QACG,IAAI,IAAW,CAAAC,gBAAAA,CAAAA,EAAfA;UAAmB,IADtB,KACsB,KAAnB;;UAA2B,IAD9B,KAC8B,WAA3B;SADH;OACuC;MAAQ,YAAP,IAAO,CAAAC,YAAAA,CAAAA,EAARA;cADvC,KACuC,GAAQ,KAAR;KAF7B,CAHH;IAAAL,KAQNA,CAAAA,SAAAA,CAAAA,gBAAAA,CAAAA,GAAAA,UAAWA,OAAXA;MACY,OAAd,KAAAM,yBAAAA,CAAAA,EAAcA,CAAdA,UAAcA,CAACA,OAADA,EAA2BA,IAAAA,CAAAA,0BAAAA,CAAAA,EAAAA,CAAAA,IAA3BA,CADZA;MARM;IAAAN,KAWNA,CAAAA,SAAAA,CAAAA,sCAAAA,CAAAA,GAAAA,UAAiBA,QAAjBA;MACF,SAAE,EAACO,QAAKA,CAAAA,0BAAAA,CAAAA,EAAAA,CAAAA,SAA4BA,CAACA,IAAKA,CAAAA,0BAAAA,CAAAA,EAAAA,CAAAA,IAANA,CAAlCA,CAAFA,CADEA;MAXM;IAAAP,KAcNA,CAAAA,SAAAA,CAAAA,gBAAAA,CAAAA,GAAAA;MACF,YAAAQ,0BAAAA,CAAAA,EAAAA,CAAAA,WADEA;MAdM;IAAAR,KAiBNA,CAAAA,SAAAA,CAAAA,YAAAA,CAAAA,GAAAA;MACF,YAAAQ,0BAAAA,CAAAA,EAAAA,CAAAA,OADEA;MAjBM;IAAAR,KAoBNA,CAAAA,SAAAA,CAAAA,gBAAAA,CAAAA,GAAAA;MACF,YAAAQ,0BAAAA,CAAAA,EAAAA,CAAAA,WADEA;MApBM;IAAAR,KAuBNA,CAAAA,SAAAA,CAAAA,YAAAA,CAAAA,GAAAA;MACF,YAAAQ,0BAAAA,CAAAA,EAAAA,CAAAA,WADEA;MAvBM;IAAAR,KA2BNA,CAAAA,SAAAA,CAAAA,kCAAAA,CAAAA,GAAAA;MACF,IAAI,EAAC,KAAAQ,0BAAAA,CAAAA,EAAAA,CAAAA,UAADA,CAAJA;QAAsB,WAAtB;;QACqC,OAAA/K,CAAAA,CAAAA,UAAAA,CAAhCA,IAAAA,CAAAA,0BAAAA,CAAAA,EAAAA,CAAAA,UAAAA,CAAAA,GAAgCA,EAAAA,iBAAAA,CADrCA;OADE;MA3BM;IAAAuK,KA+BNA,CAAAA,SAAAA,CAAAA,qCAAAA,CAAAA,GAAAA;MACF,IAAI,IAAO,CAAAS,YAAAA,CAAAA,EAAXA;QAAkD,OAAAhL,CAAAA,CAAAA,UAAAA,CAAnCA,IAAAA,CAAAA,0BAAAA,CAAAA,EAAAA,CAAAA,aAAAA,CAAAA,GAAmCA,EAAAA,iBAAAA,CAAlDA;;QACK,WADL;OADE;MA/BM;IAAAuK,KAASA,CAAAA,SAAAA,CAAAA,8CAAAA,CAAAA,GAAAA,UAA0BA,OAA1BA,EACCA,QADDA,EAAAA;MAA0B,KAAAC,YAAAA,UAA1BA;MACC,KAAAC,aAAAA,WADDA;MAAAzK,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;;MAAT;IAAAuK,KAQNA,CAAAA,SAAAA,CAAAA,UAAAA,GAAAA,UAAAA,KAAAA;kBAAAU,gBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MARM;IAAAV,KAWNA,CAAAA,SAAAA,CAAAA,gBAAAA,GAAAA,UAAAA,KAAAA;kBAAAW,sCAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MAXM;IAAAX,KAcNA,CAAAA,SAAAA,CAAAA,WAAAA,GAAAA;kBAAAG,gBAAAA,CAAAA,EAAAA;MAdM;IAAAH,KAiBNA,CAAAA,SAAAA,CAAAA,OAAAA,GAAAA;kBAAAS,YAAAA,CAAAA,EAAAA;MAjBM;IAAAT,KAoBNA,CAAAA,SAAAA,CAAAA,WAAAA,GAAAA;kBAAAI,gBAAAA,CAAAA,EAAAA;MApBM;IAAAJ,KAuBNA,CAAAA,SAAAA,CAAAA,OAAAA,GAAAA;kBAAAK,YAAAA,CAAAA,EAAAA;MAvBM;IAAAL,KA2BNA,CAAAA,SAAAA,CAAAA,aAAAA,GAAAA;kBAAAY,kCAAAA,CAAAA,EAAAA;MA3BM;IAAAZ,KA+BNA,CAAAA,SAAAA,CAAAA,gBAAAA,GAAAA;kBAAAa,qCAAAA,CAAAA,EAAAA;MA/BM;IAAAb,OAAAA,GAAAA,SAAAA;IAAAvK,CAAAA,CAAAA,WAAAA,CAAAA,iBAAAA,EAAAA,KAAAA,EAAAA,OAAAA,EAAAA,kBAAAA,EAAAA;MAAAuK,iBAAAA,EAAAA,IAAAA;MAAArK,kBAAAA,EAAAA,IAAAA;;;GAAAF,mBAAAA,C;;AJsDN,UAAAA,CAAAA;EAAAA,CAAAA,CAAAA,aAAAA,CAAAA,8BAAAA,EAAAA,WAAAA,EAAAA;aAAAqL,KAAAA;MAAArL,CAAAA,CAAAA,CAAAA,CAAAA,4BAAAA,CAAAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;;IAAAqL,KAAAA,CAAAA,SAAAA,GAAAA,MAAAA,CAAAA,MAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,4BAAAA,CAAAA,CAAAA,SAAAA,CAAAA;IAAAA,KAAAA,CAAAA,SAAAA,CAAAA,WAAAA,QAAAA;IAAAA,KAAkBA,CAAAA,SAAAA,CAAAA,gCAAAA,CAAAA,GAAAA,UAACA,WAADA,EAAkBA,SAAlBA,EAAAA;MAAArL,CAAAA,CAAAA,CAAAA,CAAAA,4BAAAA,CAAAA,CAAAA,SAAAA,CAAAA,gCAAAA,CAAAA,CAAAA,IAAAA,CAAAA,IAAAA,EAA6DA,WAA7DA,EAAsEA,SAAtEA,CAAAA;;MAAlB;IAAAqL,KACAA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA,YAAAA;MAAS,KAAAC,gCAAAA,CAAAA,CAAKA,IAALA,EAAWA,IAAXA,CAATA;;MADA;IAAAD,KAEAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAAKA,WAALA,EAAAA;MAAwB,KAAAC,gCAAAA,CAAAA,CAAKA,WAALA,EAAcA,IAAdA,CAAxBA;;MAFA;IAAAD,KAGAA,CAAAA,SAAAA,CAAAA,+BAAAA,CAAAA,GAAAA,UAAKA,SAALA,EAAAA;MAAyB,KAAAC,gCAAAA,CAAAA,CAAKA,IAALA,EAAWA,SAAXA,CAAzBA;;MAHA;aAAAD,OAAAA,CAGAA,KAHAA,EAGAA,KAHAA,EAAAA;MAAAA,KAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAGA,QAAAxK,SAAAA,CAAAA,MAAAA;;UAFA,YAAAG,UAAAA,CAAAA,EAEAA;;UADA,YAAAF,KAAAA,CAAAA,KAAAA,QAAAA,CAAAA;wBAAA0D,WAAAA,CAAAA,CAAAA,KAAAA,CAAAA;;YACA,IAAAxE,CAAAA,CAAAA,UAAAA,CAAAA,KAAAA,EAAAA,qBAAAA,CAAAA;0BAAAuL,+BAAAA,CAAAA,CAAAA,KAAAA,CAAAA;;;aADA;WACA;;UAHkB,YAAAD,gCAAAA,CAAAA,CAAAA,KAAAA,EAAAA,KAAAA,CAGlBA;;;OAHA;;IAAAD,OAAAA,CAAAA,SAAAA,GAAAA,KAAAA,CAAAA,SAAAA;IAAArL,CAAAA,CAAAA,WAAAA,CAAAA,8BAAAA,EAAAA,KAAAA,EAAAA,OAAAA,EAAAA,4BAAAA,EAAAA;MAAAqL,8BAAAA,EAAAA,IAAAA;MAAA3G,4BAAAA,EAAAA,IAAAA;MAAAC,qBAAAA,EAAAA,IAAAA;MAAAC,qBAAAA,EAAAA,IAAAA;MAAA1E,kBAAAA,EAAAA,IAAAA;;;GAAAF,mBAAAA,C;;AAMA,UAAAA,CAAAA;EAAAA,CAAAA,CAAAA,aAAAA,CAAAA,sCAAAA,EAAAA,WAAAA,EAAAA;aAAAwL,KAAAA;MAAAxL,CAAAA,CAAAA,CAAAA,CAAAA,qBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;;IAAAwL,KAAAA,CAAAA,SAAAA,GAAAA,MAAAA,CAAAA,MAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,qBAAAA,CAAAA,CAAAA,SAAAA,CAAAA;IAAAA,KAAAA,CAAAA,SAAAA,CAAAA,WAAAA,QAAAA;IAAAA,KAA0BA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAACA,KAADA,EAAAA;MAAAxL,CAAAA,CAAAA,CAAAA,CAAAA,qBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,CAAAA,IAAAA,CAAAA,IAAAA,EAA8BA,KAA9BA,CAAAA;;MAA1B;IAAAwL,KACAA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA,YAAAA;MAAS,KAAAhH,WAAAA,CAAAA,CAAKA,IAALA,CAATA;;MADA;aAAAgH,OAAAA,CACAA,KADAA,EAAAA;MAAAA,KAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MACA,QAAA3K,SAAAA,CAAAA,MAAAA;;sBAAAG,UAAAA,CAAAA,EAAAA;;UAD0B,YAAAwD,WAAAA,CAAAA,CAAAA,KAAAA,CAC1BA;;;OADA;;IAAAgH,OAAAA,CAAAA,SAAAA,GAAAA,KAAAA,CAAAA,SAAAA;IAAAxL,CAAAA,CAAAA,WAAAA,CAAAA,sCAAAA,EAAAA,KAAAA,EAAAA,OAAAA,EAAAA,qBAAAA,EAAAA;MAAAwL,sCAAAA,EAAAA,IAAAA;MAAA7G,qBAAAA,EAAAA,IAAAA;MAAAC,qBAAAA,EAAAA,IAAAA;MAAA1E,kBAAAA,EAAAA,IAAAA;;;GAAAF,mBAAAA,C;;AE2JM,UAAAA,CAAAA,EAAAA;EAAAA,CAAAA,CAAAA,aAAAA,CAAAA,kBAAAA,EAAAA,WAAAA,EAAAA;aAAAyL,KAAAA,GAAAA;MAAAzL,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAAmB,KAAAsF,cAAAA,GAAAA,GAAnBA;MACU,KAAAe,cAAAA,GAAAA,KADVA;;IAAAoF,KAAAA,CAAAA,SAAAA,GAAAA,MAAAA,CAAAA,MAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA;IAAAA,KAAAA,CAAAA,SAAAA,CAAAA,WAAAA,QAAAA;IAAAA,KAAmBA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA;kBAAAnG,cAAAA;MAAnB;IAAAmG,KACUA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA;kBAAApF,cAAAA;MADV;IAAAoF,KAGGA,CAAAA,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA;MAAoB,QAAN,KAAAC,UAAAA,CAAAA,EAAMA,GAAAA,CAAAA,CAApBA;MAHH;IAAAD,KAIGA,CAAAA,SAAAA,CAAAA,eAAAA,CAAAA,GAAAA;MAAqB,QAAN,KAAAC,UAAAA,CAAAA,EAAMA,GAAAA,CAAAA,CAArBA;MAJH;IAAAD,KAKNA,CAAAA,SAAAA,CAAAA,aAAAA,CAAAA,GAAAA;MAAmB,QAAN,KAAAC,UAAAA,CAAAA,EAAMA,GAAAA,CAAAA,CAAnBA;MALM;IAAAD,KAMNA,CAAAA,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA;MAAoB,OAAAzL,CAAAA,CAAAA,cAAAA,CAANA,IAAAA,CAAAA,UAAAA,CAAAA,EAAMA,CAApBA;MANM;IAAAyL,KAONA,CAAAA,SAAAA,CAAAA,eAAAA,CAAAA,GAAAA;MAAe,YAAAC,UAAAA,CAAAA,EAAfA;MAPM;IAAAD,KAQNA,CAAAA,SAAAA,CAAAA,gBAAAA,CAAAA,GAAAA;MAAgB,YAAAC,UAAAA,CAAAA,EAAhBA;MARM;IAAAD,KAUGA,CAAAA,SAAAA,CAAAA,YAAAA,CAAAA,GAAAA,UAAOA,QAAPA;MACe,QAATzL,CAAAA,CAAAA,UAAAA,CAAjBA,QAAiBA,EAAAA,kBAAAA,CAASA,IAAUA,CAANA,IAAAA,CAAAA,UAAAA,CAAAA,EAAMA,KAAoBA,CAAAA,CAAAA,UAAAA,CAAjBA,QAAiBA,EAAAA,kBAAAA,CAASA,CAAAA,UAAAA,CAAAA,EAA7BA,CAAVA,CADfA;MAVH;IAAAyL,KAaGA,CAAAA,SAAAA,CAAAA,aAAAA,CAAAA,GAAAA;MAA6B,OAAjB,KAAAC,UAAAA,CAAAA,EAAiBA,CAAAA,QAAAA,EAA7BA;MAbH;IAAAD,KAeNA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA;MAAmC,OAAZzL,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAYA,CAAAA,WAAAA,CAAAA,CAACA,IAAAA,CAAAA,UAAAA,CAAAA,EAADA,CAAnCA;MAfM;IAAAyL,KAAMA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAAaA,SAAbA,EAAAA;MAAa,KAAAnG,cAAAA,YAAbA;MAAAtF,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MACI,KAAAqG,cAAAA,GAAQA,KADZA;;MAAN;IAAAoF,KAeNA,CAAAA,SAAAA,CAAAA,KAAAA,GAAAA;kBAAAE,UAAAA,CAAAA,EAAAA;MAfM;aAAAF,OAAAA,CAAMA,KAANA,EAAAA;MAAAA,KAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAAM,YAAAzG,WAAAA,CAAAA,CAAAA,KAAAA,CAANA;;IAAAyG,OAAAA,CAAAA,SAAAA,GAAAA,KAAAA,CAAAA,SAAAA;IAAAzL,CAAAA,CAAAA,WAAAA,CAAAA,kBAAAA,EAAAA,KAAAA,EAAAA,OAAAA,EAAAA,kBAAAA,EAAAA;MAAAyL,kBAAAA,EAAAA,IAAAA;MAAAjF,kBAAAA,EAAAA,IAAAA;MAAAtG,kBAAAA,EAAAA,IAAAA;;;;;;MAmBN,KAAAuF,aAAAA,GAAAA,IAnBMA;MAoBN,KAAAmG,0BAAAA,GAAAA,GApBMA;MAqBN,KAAAC,0BAAAA,GAAAA,GArBMA;MAsBN,KAAAC,YAAAA,GAAAA,GAtBMA;MAuBN,KAAApF,kBAAAA,GAAAA,GAvBMA;MAwBN,KAAAqF,mBAAAA,GAAAA,GAxBMA;MAyBN,KAAAtF,kBAAAA,GAAAA,GAzBMA;MA0BN,KAAAuF,qBAAAA,GAAAA,CA1BMA;MA2BN,KAAAC,qBAAAA,GAAAA,CA3BMA;MA4BN,KAAAC,aAAAA,GAAAA,CA5BMA;;;;IAmBN,MAAAtG,SAAAA,CAAAA,yBAAAA,CAAAA,GAAAA;kBAAAH,aAAAA;MAnBM;IAoBN,MAAAG,SAAAA,CAAAA,sBAAAA,CAAAA,GAAAA;kBAAAgG,0BAAAA;MApBM;IAqBN,MAAAhG,SAAAA,CAAAA,sBAAAA,CAAAA,GAAAA;kBAAAiG,0BAAAA;MArBM;IAsBN,MAAAjG,SAAAA,CAAAA,QAAAA,CAAAA,GAAAA;kBAAAkG,YAAAA;MAtBM;IAuBN,MAAAlG,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA;kBAAAc,kBAAAA;MAvBM;IAwBN,MAAAd,SAAAA,CAAAA,eAAAA,CAAAA,GAAAA;kBAAAmG,mBAAAA;MAxBM;IAyBN,MAAAnG,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA;kBAAAa,kBAAAA;MAzBM;IA0BN,MAAAb,SAAAA,CAAAA,iBAAAA,CAAAA,GAAAA;kBAAAoG,qBAAAA;MA1BM;IA2BN,MAAApG,SAAAA,CAAAA,iBAAAA,CAAAA,GAAAA;kBAAAqG,qBAAAA;MA3BM;IA4BN,MAAArG,SAAAA,CAAAA,SAAAA,CAAAA,GAAAA;kBAAAsG,aAAAA;MA5BM;IA8BN,MAAAtG,SAAAA,CAAAA,8BAAAA,CAAAA,GAAAA,UAAQA,eAARA;MAAqC,WAAA5F,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,EAAAA,CAAAA,WAAAA,CAAAA,CAAWA,eAAXA,CAArCA;MA9BM;IA+BN,MAAA4F,SAAAA,CAAAA,iBAAAA,CAAAA,GAAAA,UAAYA,KAAZA;MAAuD,OAAhB5F,CAAAA,CAAAA,CAAAA,CAAAA,iBAAAA,CAAgBA,CAAAA,gBAAAA,CAAAA,CAACA,KAADA,CAAvDA;MA/BM;IAgCN,MAAA4F,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA,UAASA,KAATA;MAAqD,OAAzB5F,CAAAA,CAAAA,CAAAA,CAAAA,iBAAAA,CAAaA,CAAAA,6BAAAA,CAAAA,CAACA,KAADA,CAAYA,CAAAA,aAAAA,CAAAA,EAArDA;MAhCM;IAkCN,MAAA4F,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA,UAAQA,KAARA,EAAyBA,KAAzBA;MACF,IAAM,CAAFuG,KAAEA,KAAGA,KAAHA,CAANA;QAAY,QAAZ;;QACK,IAAM,CAAFA,KAAEA,GAAEA,KAAFA,CAANA;UAAY,SAAZ;;UACA,QADA;SADL;OADE;MAlCM;IAwCN,MAAAvG,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAAMA,KAANA;MAAiD,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAAjDA;MAxCM;IAyCN,MAAA4F,SAAAA,CAAAA,gBAAAA,CAAAA,GAAAA,UAAWA,KAAXA;MAAsD,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAAtDA;MAzCM;IA2CN,MAAA4F,SAAAA,CAAAA,sBAAAA,CAAAA,GAAAA,UAAiBA,QAAjBA;MAA4D,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAA5DA;MA3CM;IA4CN,MAAA4F,SAAAA,CAAAA,sBAAAA,CAAAA,GAAAA,UAAiBA,SAAjBA;MAA6D,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAA7DA;MA5CM;IAkBE,MAAA4F,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA,YAAAA;MAAA5F,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAAAA,CAAAA,CAAAA,OAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,GAAAA,IAAAA;MACR,KAAAyF,aAAAA,GAAcA,CAAAA,CAAAA,UAAAA,CAAAA,cAAAA,CAAAA,CAAAA,GADNA;MAER,KAAAmG,0BAAAA,GAAoBA,GAFZA;MAGR,KAAAC,0BAAAA,GAAoBA,GAHZA;MAIR,KAAAC,YAAAA,GAAMA,GAJEA;MAKR,KAAApF,kBAAAA,GAAYA,GALJA;MAMR,KAAAqF,mBAAAA,GAAaA,GANLA;MAOR,KAAAtF,kBAAAA,GAAYA,GAPJA;MAQR,KAAAuF,qBAAAA,GAAeA,IARPA;MASR,KAAAC,qBAAAA,GAAgBA,KATRA;MAUR,KAAAC,aAAAA,GAAOA,EAVCA;;MAlBF;IAmBN,MAAAtG,SAAAA,CAAAA,IAAAA,GAAAA;kBAAAK,yBAAAA,CAAAA,EAAAA;MAnBM;IAoBN,MAAAL,SAAAA,CAAAA,iBAAAA,GAAAA;kBAAAwG,sBAAAA,CAAAA,EAAAA;MApBM;IAqBN,MAAAxG,SAAAA,CAAAA,iBAAAA,GAAAA;kBAAAyG,sBAAAA,CAAAA,EAAAA;MArBM;IAsBN,MAAAzG,SAAAA,CAAAA,GAAAA,GAAAA;kBAAA0G,QAAAA,CAAAA,EAAAA;MAtBM;IAuBN,MAAA1G,SAAAA,CAAAA,SAAAA,GAAAA;kBAAA2G,cAAAA,CAAAA,EAAAA;MAvBM;IAwBN,MAAA3G,SAAAA,CAAAA,UAAAA,GAAAA;kBAAA4G,eAAAA,CAAAA,EAAAA;MAxBM;IAyBN,MAAA5G,SAAAA,CAAAA,SAAAA,GAAAA;kBAAA6G,cAAAA,CAAAA,EAAAA;MAzBM;IA0BN,MAAA7G,SAAAA,CAAAA,YAAAA,GAAAA;kBAAA8G,iBAAAA,CAAAA,EAAAA;MA1BM;IA2BN,MAAA9G,SAAAA,CAAAA,YAAAA,GAAAA;kBAAA+G,iBAAAA,CAAAA,EAAAA;MA3BM;IA4BN,MAAA/G,SAAAA,CAAAA,IAAAA,GAAAA;kBAAAgH,SAAAA,CAAAA,EAAAA;MA5BM;IA8BN,MAAAhH,SAAAA,CAAAA,OAAAA,GAAAA,UAAAA,KAAAA;kBAAAiH,8BAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MA9BM;IA+BN,MAAAjH,SAAAA,CAAAA,WAAAA,GAAAA,UAAAA,KAAAA;kBAAAkH,iBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MA/BM;IAgCN,MAAAlH,SAAAA,CAAAA,QAAAA,GAAAA,UAAAA,KAAAA;cAAA/E,SAAAA,CAAAA,MAAAA;;;;sBAAAkM,cAAAA,CAAAA,CAAAA,KAAAA,CAAAA;;;;MAhCM;IAkCN,MAAAnH,SAAAA,CAAAA,OAAAA,GAAAA,UAAAA,KAAAA,EAAAA,KAAAA;kBAAAoH,cAAAA,CAAAA,CAAAA,KAAAA,EAAAA,KAAAA,CAAAA;MAlCM;IAwCN,MAAApH,SAAAA,CAAAA,KAAAA,GAAAA,UAAAA,KAAAA;kBAAAqH,WAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MAxCM;IAyCN,MAAArH,SAAAA,CAAAA,UAAAA,GAAAA,UAAAA,KAAAA;kBAAAsH,gBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MAzCM;IA2CN,MAAAtH,SAAAA,CAAAA,gBAAAA,GAAAA,UAAAA,KAAAA;kBAAAuH,sBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MA3CM;IA4CN,MAAAvH,SAAAA,CAAAA,gBAAAA,GAAAA,UAAAA,KAAAA;kBAAAwH,sBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MA5CM;;;MAkBE,YAAApM,UAAAA,CAAAA,EAlBFA;;;;;;;;EAkBLhB,CAAAA,CAAAA,cAAAA,CAAAA,kBAAAA,EAAAA,mBAAAA,CAlBKA;GAAAA,mBAAAA,C;;AFzMN,UAAAA,CAAAA;EAAAA,CAAAA,CAAAA,aAAAA,CAAAA,iBAAAA,EAAAA,WAAAA,EAAAA;aAAAqN,KAAAA;MAAArN,CAAAA,CAAAA,CAAAA,CAAAA,qBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;;IAAAqN,KAAAA,CAAAA,SAAAA,GAAAA,MAAAA,CAAAA,MAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,qBAAAA,CAAAA,CAAAA,SAAAA,CAAAA;IAAAA,KAAAA,CAAAA,SAAAA,CAAAA,WAAAA,QAAAA;IAAAA,KAAKA,CAAAA,SAAAA,CAAAA,gCAAAA,CAAAA,GAAAA,UAACA,WAADA,EAAkBA,SAAlBA,EAAAA;MAAArN,CAAAA,CAAAA,CAAAA,CAAAA,qBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,gCAAAA,CAAAA,CAAAA,IAAAA,CAAAA,IAAAA,EAAsDA,WAAtDA,EAA+DA,SAA/DA,CAAAA;;MAAL;IAAAqN,KACAA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA,YAAAA;MAAS,KAAA/B,gCAAAA,CAAAA,CAAKA,IAALA,EAAWA,IAAXA,CAATA;;MADA;IAAA+B,KAEAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAAKA,WAALA,EAAAA;MAAwB,KAAA/B,gCAAAA,CAAAA,CAAKA,WAALA,EAAcA,IAAdA,CAAxBA;;MAFA;IAAA+B,KAGAA,CAAAA,SAAAA,CAAAA,+BAAAA,CAAAA,GAAAA,UAAKA,SAALA,EAAAA;MAAyB,KAAA/B,gCAAAA,CAAAA,CAAKA,IAALA,EAAWA,SAAXA,CAAzBA;;MAHA;aAAA+B,OAAAA,CAGAA,KAHAA,EAGAA,KAHAA,EAAAA;MAAAA,KAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAGA,QAAAxM,SAAAA,CAAAA,MAAAA;;UAFA,YAAAG,UAAAA,CAAAA,EAEAA;;UADA,YAAAF,KAAAA,CAAAA,KAAAA,QAAAA,CAAAA;wBAAA0D,WAAAA,CAAAA,CAAAA,KAAAA,CAAAA;;YACA,IAAAxE,CAAAA,CAAAA,UAAAA,CAAAA,KAAAA,EAAAA,qBAAAA,CAAAA;0BAAAuL,+BAAAA,CAAAA,CAAAA,KAAAA,CAAAA;;;aADA;WACA;;UAHK,YAAAD,gCAAAA,CAAAA,CAAAA,KAAAA,EAAAA,KAAAA,CAGLA;;;OAHA;;IAAA+B,OAAAA,CAAAA,SAAAA,GAAAA,KAAAA,CAAAA,SAAAA;IAAArN,CAAAA,CAAAA,WAAAA,CAAAA,iBAAAA,EAAAA,KAAAA,EAAAA,OAAAA,EAAAA,qBAAAA,EAAAA;MAAAqN,iBAAAA,EAAAA,IAAAA;MAAAzI,qBAAAA,EAAAA,IAAAA;MAAA1E,kBAAAA,EAAAA,IAAAA;;;GAAAF,mBAAAA,C;;AAgBA,UAAAA,CAAAA;EAAAA,CAAAA,CAAAA,aAAAA,CAAAA,qBAAAA,EAAAA,WAAAA,EAAAA;aAAA2E,KAAAA;MAAA3E,CAAAA,CAAAA,CAAAA,CAAAA,qBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;;IAAA2E,KAAAA,CAAAA,SAAAA,GAAAA,MAAAA,CAAAA,MAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,qBAAAA,CAAAA,CAAAA,SAAAA,CAAAA;IAAAA,KAAAA,CAAAA,SAAAA,CAAAA,WAAAA,QAAAA;IAAAA,KAASA,CAAAA,SAAAA,CAAAA,gCAAAA,CAAAA,GAAAA,UAACA,WAADA,EAAkBA,SAAlBA,EAAAA;MAAA3E,CAAAA,CAAAA,CAAAA,CAAAA,qBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,gCAAAA,CAAAA,CAAAA,IAAAA,CAAAA,IAAAA,EAAsDA,WAAtDA,EAA+DA,SAA/DA,CAAAA;;MAAT;IAAA2E,KACAA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA,YAAAA;MAAS,KAAA2G,gCAAAA,CAAAA,CAAKA,IAALA,EAAWA,IAAXA,CAATA;;MADA;IAAA3G,KAEAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAAKA,WAALA,EAAAA;MAAwB,KAAA2G,gCAAAA,CAAAA,CAAKA,WAALA,EAAcA,IAAdA,CAAxBA;;MAFA;IAAA3G,KAGAA,CAAAA,SAAAA,CAAAA,+BAAAA,CAAAA,GAAAA,UAAKA,SAALA,EAAAA;MAAyB,KAAA2G,gCAAAA,CAAAA,CAAKA,IAALA,EAAWA,SAAXA,CAAzBA;;MAHA;aAAA3G,OAAAA,CAGAA,KAHAA,EAGAA,KAHAA,EAAAA;MAAAA,KAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAGA,QAAA9D,SAAAA,CAAAA,MAAAA;;UAFA,YAAAG,UAAAA,CAAAA,EAEAA;;UADA,YAAAF,KAAAA,CAAAA,KAAAA,QAAAA,CAAAA;wBAAA0D,WAAAA,CAAAA,CAAAA,KAAAA,CAAAA;;YACA,IAAAxE,CAAAA,CAAAA,UAAAA,CAAAA,KAAAA,EAAAA,qBAAAA,CAAAA;0BAAAuL,+BAAAA,CAAAA,CAAAA,KAAAA,CAAAA;;;aADA;WACA;;UAHS,YAAAD,gCAAAA,CAAAA,CAAAA,KAAAA,EAAAA,KAAAA,CAGTA;;;OAHA;;IAAA3G,OAAAA,CAAAA,SAAAA,GAAAA,KAAAA,CAAAA,SAAAA;IAAA3E,CAAAA,CAAAA,WAAAA,CAAAA,qBAAAA,EAAAA,KAAAA,EAAAA,OAAAA,EAAAA,qBAAAA,EAAAA;MAAA2E,qBAAAA,EAAAA,IAAAA;MAAAC,qBAAAA,EAAAA,IAAAA;MAAA1E,kBAAAA,EAAAA,IAAAA;;;GAAAF,mBAAAA,C;;AEqIM,UAAAA,CAAAA,EAAAA;EAAAA,CAAAA,CAAAA,aAAAA,CAAAA,iBAAAA,EAAAA,WAAAA,EAAAA;aAAAsN,KAAAA,GAAAA;MAAAtN,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAAkB,KAAAsF,cAAAA,GAAAA,GAAlBA;MACU,KAAAe,cAAAA,GAAAA,KADVA;;IAAAiH,KAAAA,CAAAA,SAAAA,GAAAA,MAAAA,CAAAA,MAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA;IAAAA,KAAAA,CAAAA,SAAAA,CAAAA,WAAAA,QAAAA;IAAAA,KAAkBA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA;kBAAAhI,cAAAA;MAAlB;IAAAgI,KACUA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA;kBAAAjH,cAAAA;MADV;IAAAiH,KAGGA,CAAAA,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA;MAAoB,QAAN,KAAAC,UAAAA,CAAAA,EAAMA,GAAAA,CAAAA,CAApBA;MAHH;IAAAD,KAIGA,CAAAA,SAAAA,CAAAA,eAAAA,CAAAA,GAAAA;MAAqB,QAAN,KAAAC,UAAAA,CAAAA,EAAMA,GAAAA,CAAAA,CAArBA;MAJH;IAAAD,KAKNA,CAAAA,SAAAA,CAAAA,aAAAA,CAAAA,GAAAA;MAAmB,QAAN,KAAAC,UAAAA,CAAAA,EAAMA,GAAAA,CAAAA,CAAnBA;MALM;IAAAD,KAMNA,CAAAA,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA;MAAoB,OAAAtN,CAAAA,CAAAA,cAAAA,CAANA,IAAAA,CAAAA,UAAAA,CAAAA,EAAMA,CAApBA;MANM;IAAAsN,KAONA,CAAAA,SAAAA,CAAAA,eAAAA,CAAAA,GAAAA;MAAe,YAAAC,UAAAA,CAAAA,EAAfA;MAPM;IAAAD,KAQNA,CAAAA,SAAAA,CAAAA,gBAAAA,CAAAA,GAAAA;MAAgB,YAAAC,UAAAA,CAAAA,EAAhBA;MARM;IAAAD,KAUGA,CAAAA,SAAAA,CAAAA,YAAAA,CAAAA,GAAAA,UAAOA,QAAPA;MACc,QAARtN,CAAAA,CAAAA,UAAAA,CAAjBA,QAAiBA,EAAAA,iBAAAA,CAAQA,IAAUA,CAANA,IAAAA,CAAAA,UAAAA,CAAAA,EAAMA,KAAoBA,CAAAA,CAAAA,UAAAA,CAAjBA,QAAiBA,EAAAA,iBAAAA,CAAQA,CAAAA,UAAAA,CAAAA,EAA5BA,CAAVA,CADdA;MAVH;IAAAsN,KAaGA,CAAAA,SAAAA,CAAAA,aAAAA,CAAAA,GAAAA;MAA6B,OAAjB,KAAAC,UAAAA,CAAAA,EAAiBA,CAAAA,QAAAA,EAA7BA;MAbH;IAAAD,KAeNA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA;MAAkC,OAAXtN,CAAAA,CAAAA,CAAAA,CAAAA,iBAAAA,CAAWA,CAAAA,WAAAA,CAAAA,CAACA,IAAAA,CAAAA,UAAAA,CAAAA,EAADA,CAAlCA;MAfM;IAAAsN,KAAKA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAAaA,SAAbA,EAAAA;MAAa,KAAAhI,cAAAA,YAAbA;MAAAtF,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MACK,KAAAqG,cAAAA,GAAQA,KADbA;;MAAL;IAAAiH,KAeNA,CAAAA,SAAAA,CAAAA,KAAAA,GAAAA;kBAAA3B,UAAAA,CAAAA,EAAAA;MAfM;aAAA2B,OAAAA,CAAKA,KAALA,EAAAA;MAAAA,KAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAAK,YAAArI,WAAAA,CAAAA,CAAAA,KAAAA,CAALA;;IAAAqI,OAAAA,CAAAA,SAAAA,GAAAA,KAAAA,CAAAA,SAAAA;IAAAtN,CAAAA,CAAAA,WAAAA,CAAAA,iBAAAA,EAAAA,KAAAA,EAAAA,OAAAA,EAAAA,kBAAAA,EAAAA;MAAAsN,iBAAAA,EAAAA,IAAAA;MAAA9G,kBAAAA,EAAAA,IAAAA;MAAAtG,kBAAAA,EAAAA,IAAAA;;;;;;MAmBN,KAAAuF,aAAAA,GAAAA,IAnBMA;MAoBN,KAAAmG,0BAAAA,GAAAA,GApBMA;MAqBN,KAAAC,0BAAAA,GAAAA,GArBMA;MAsBN,KAAAC,YAAAA,GAAAA,GAtBMA;MAuBN,KAAApF,kBAAAA,GAAAA,GAvBMA;MAwBN,KAAAqF,mBAAAA,GAAAA,GAxBMA;MAyBN,KAAAtF,kBAAAA,GAAAA,GAzBMA;MA0BN,KAAAuF,qBAAAA,GAAAA,CA1BMA;MA2BN,KAAAC,qBAAAA,GAAAA,CA3BMA;MA4BN,KAAAC,aAAAA,GAAAA,CA5BMA;;;;IAmBN,MAAAtG,SAAAA,CAAAA,yBAAAA,CAAAA,GAAAA;kBAAAH,aAAAA;MAnBM;IAoBN,MAAAG,SAAAA,CAAAA,sBAAAA,CAAAA,GAAAA;kBAAAgG,0BAAAA;MApBM;IAqBN,MAAAhG,SAAAA,CAAAA,sBAAAA,CAAAA,GAAAA;kBAAAiG,0BAAAA;MArBM;IAsBN,MAAAjG,SAAAA,CAAAA,QAAAA,CAAAA,GAAAA;kBAAAkG,YAAAA;MAtBM;IAuBN,MAAAlG,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA;kBAAAc,kBAAAA;MAvBM;IAwBN,MAAAd,SAAAA,CAAAA,eAAAA,CAAAA,GAAAA;kBAAAmG,mBAAAA;MAxBM;IAyBN,MAAAnG,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA;kBAAAa,kBAAAA;MAzBM;IA0BN,MAAAb,SAAAA,CAAAA,iBAAAA,CAAAA,GAAAA;kBAAAoG,qBAAAA;MA1BM;IA2BN,MAAApG,SAAAA,CAAAA,iBAAAA,CAAAA,GAAAA;kBAAAqG,qBAAAA;MA3BM;IA4BN,MAAArG,SAAAA,CAAAA,SAAAA,CAAAA,GAAAA;kBAAAsG,aAAAA;MA5BM;IA8BN,MAAAtG,SAAAA,CAAAA,6BAAAA,CAAAA,GAAAA,UAAQA,cAARA;MAAmC,WAAA5F,CAAAA,CAAAA,CAAAA,CAAAA,iBAAAA,CAAAA,EAAAA,CAAAA,WAAAA,CAAAA,CAAUA,cAAVA,CAAnCA;MA9BM;IAgCN,MAAA4F,SAAAA,CAAAA,gBAAAA,CAAAA,GAAAA,UAAWA,KAAXA;MACW,OAAV5F,CAAAA,CAAAA,CAAUA,CAAAA,UAAAA,CAACA,KAADA,CADXA;MAhCM;IAmCN,MAAA4F,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA,UAASA,KAATA;MAAsC,OAAX,IAAO,CAAA4H,6BAAAA,CAAAA,CAACA,KAADA,CAAIA,CAAAA,aAAAA,CAAAA,EAAtCA;MAnCM;IAqCN,MAAA5H,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA,UAAQA,KAARA,EAAwBA,KAAxBA;MACF,IAAM,CAAFuG,KAAEA,KAAGA,KAAHA,CAANA;QAAY,QAAZ;;QACK,IAAM,CAAFA,KAAEA,GAAEA,KAAFA,CAANA;UAAY,SAAZ;;UACA,QADA;SADL;OADE;MArCM;IA2CN,MAAAvG,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAAMA,KAANA;MAAgD,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAAhDA;MA3CM;IA4CN,MAAA4F,SAAAA,CAAAA,gBAAAA,CAAAA,GAAAA,UAAWA,KAAXA;MAAqD,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAArDA;MA5CM;IA8CN,MAAA4F,SAAAA,CAAAA,oBAAAA,CAAAA,GAAAA,UAAeA,QAAfA;MAAwD,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAAxDA;MA9CM;IA+CN,MAAA4F,SAAAA,CAAAA,oBAAAA,CAAAA,GAAAA,UAAeA,SAAfA;MAAyD,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAAzDA;MA/CM;IAkBC,MAAA4F,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA,YAAAA;MAAA5F,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAAAA,CAAAA,CAAAA,OAAAA,CAAAA,iBAAAA,CAAAA,CAAAA,SAAAA,GAAAA,IAAAA;MACP,KAAAyF,aAAAA,GAAcA,CAAAA,CAAAA,UAAAA,CAAAA,aAAAA,CAAAA,CAAAA,GADPA;MAEP,KAAAmG,0BAAAA,GAAoBA,GAFbA;MAGP,KAAAC,0BAAAA,GAAoBA,GAHbA;MAIP,KAAAC,YAAAA,GAAMA,GAJCA;MAKP,KAAApF,kBAAAA,GAAYA,GALLA;MAMP,KAAAqF,mBAAAA,GAAaA,GANNA;MAOP,KAAAtF,kBAAAA,GAAYA,GAPLA;MAQP,KAAAuF,qBAAAA,GAAeA,GARRA;MASP,KAAAC,qBAAAA,GAAgBA,IATTA;MAUP,KAAAC,aAAAA,GAAOA,EAVAA;;MAlBD;IAmBN,MAAAtG,SAAAA,CAAAA,IAAAA,GAAAA;kBAAAK,yBAAAA,CAAAA,EAAAA;MAnBM;IAoBN,MAAAL,SAAAA,CAAAA,iBAAAA,GAAAA;kBAAA6H,sBAAAA,CAAAA,EAAAA;MApBM;IAqBN,MAAA7H,SAAAA,CAAAA,iBAAAA,GAAAA;kBAAA8H,sBAAAA,CAAAA,EAAAA;MArBM;IAsBN,MAAA9H,SAAAA,CAAAA,GAAAA,GAAAA;kBAAA+H,QAAAA,CAAAA,EAAAA;MAtBM;IAuBN,MAAA/H,SAAAA,CAAAA,SAAAA,GAAAA;kBAAAgI,cAAAA,CAAAA,EAAAA;MAvBM;IAwBN,MAAAhI,SAAAA,CAAAA,UAAAA,GAAAA;kBAAAiI,eAAAA,CAAAA,EAAAA;MAxBM;IAyBN,MAAAjI,SAAAA,CAAAA,SAAAA,GAAAA;kBAAAkI,cAAAA,CAAAA,EAAAA;MAzBM;IA0BN,MAAAlI,SAAAA,CAAAA,YAAAA,GAAAA;kBAAA8G,iBAAAA,CAAAA,EAAAA;MA1BM;IA2BN,MAAA9G,SAAAA,CAAAA,YAAAA,GAAAA;kBAAA+G,iBAAAA,CAAAA,EAAAA;MA3BM;IA4BN,MAAA/G,SAAAA,CAAAA,IAAAA,GAAAA;kBAAAgH,SAAAA,CAAAA,EAAAA;MA5BM;IA8BN,MAAAhH,SAAAA,CAAAA,OAAAA,GAAAA,UAAAA,KAAAA;kBAAA4H,6BAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MA9BM;IAgCN,MAAA5H,SAAAA,CAAAA,UAAAA,GAAAA,UAAAA,KAAAA;kBAAAmI,gBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MAhCM;IAmCN,MAAAnI,SAAAA,CAAAA,QAAAA,GAAAA,UAAAA,KAAAA;cAAA/E,SAAAA,CAAAA,MAAAA;;;;sBAAAmN,cAAAA,CAAAA,CAAAA,KAAAA,CAAAA;;;;MAnCM;IAqCN,MAAApI,SAAAA,CAAAA,OAAAA,GAAAA,UAAAA,KAAAA,EAAAA,KAAAA;kBAAAqI,cAAAA,CAAAA,CAAAA,KAAAA,EAAAA,KAAAA,CAAAA;MArCM;IA2CN,MAAArI,SAAAA,CAAAA,KAAAA,GAAAA,UAAAA,KAAAA;kBAAAsI,WAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MA3CM;IA4CN,MAAAtI,SAAAA,CAAAA,UAAAA,GAAAA,UAAAA,KAAAA;kBAAAuI,gBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MA5CM;IA8CN,MAAAvI,SAAAA,CAAAA,cAAAA,GAAAA,UAAAA,KAAAA;kBAAAwI,oBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MA9CM;IA+CN,MAAAxI,SAAAA,CAAAA,cAAAA,GAAAA,UAAAA,KAAAA;kBAAAyI,oBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MA/CM;;;MAkBC,YAAArN,UAAAA,CAAAA,EAlBDA;;;;;;;;EAkBLhB,CAAAA,CAAAA,cAAAA,CAAAA,iBAAAA,EAAAA,kBAAAA,CAlBKA;GAAAA,mBAAAA,C;;AFnFN,UAAAA,CAAAA;EAAAA,CAAAA,CAAAA,aAAAA,CAAAA,oCAAAA,EAAAA,WAAAA,EAAAA;aAAAsO,KAAAA;MAAAtO,CAAAA,CAAAA,CAAAA,CAAAA,4BAAAA,CAAAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;;IAAAsO,KAAAA,CAAAA,SAAAA,GAAAA,MAAAA,CAAAA,MAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,4BAAAA,CAAAA,CAAAA,SAAAA,CAAAA;IAAAA,KAAAA,CAAAA,SAAAA,CAAAA,WAAAA,QAAAA;IAAAA,KAAwBA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAACA,WAADA,EAAAA;MAAAtO,CAAAA,CAAAA,CAAAA,CAAAA,4BAAAA,CAAAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,CAAAA,IAAAA,CAAAA,IAAAA,EAA2CA,WAA3CA,CAAAA;;MAAxB;IAAAsO,KACAA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA,YAAAA;MAAS,KAAA9J,WAAAA,CAAAA,CAAKA,IAALA,CAATA;;MADA;aAAA8J,OAAAA,CACAA,KADAA,EAAAA;MAAAA,KAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MACA,QAAAzN,SAAAA,CAAAA,MAAAA;;sBAAAG,UAAAA,CAAAA,EAAAA;;UADwB,YAAAwD,WAAAA,CAAAA,CAAAA,KAAAA,CACxBA;;;OADA;;IAAA8J,OAAAA,CAAAA,SAAAA,GAAAA,KAAAA,CAAAA,SAAAA;IAAAtO,CAAAA,CAAAA,WAAAA,CAAAA,oCAAAA,EAAAA,KAAAA,EAAAA,OAAAA,EAAAA,4BAAAA,EAAAA;MAAAsO,oCAAAA,EAAAA,IAAAA;MAAA5J,4BAAAA,EAAAA,IAAAA;MAAAC,qBAAAA,EAAAA,IAAAA;MAAAC,qBAAAA,EAAAA,IAAAA;MAAA1E,kBAAAA,EAAAA,IAAAA;;;GAAAF,mBAAAA,C;;AAhBA,UAAAA,CAAAA;EAAAA,CAAAA,CAAAA,aAAAA,CAAAA,qCAAAA,EAAAA,WAAAA,EAAAA;aAAAyE,KAAAA;MAAAzE,CAAAA,CAAAA,CAAAA,CAAAA,4BAAAA,CAAAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;;IAAAyE,KAAAA,CAAAA,SAAAA,GAAAA,MAAAA,CAAAA,MAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,4BAAAA,CAAAA,CAAAA,SAAAA,CAAAA;IAAAA,KAAAA,CAAAA,SAAAA,CAAAA,WAAAA,QAAAA;IAAAA,KAAyBA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAACA,KAADA,EAAAA;MAAAzE,CAAAA,CAAAA,CAAAA,CAAAA,4BAAAA,CAAAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,CAAAA,IAAAA,CAAAA,IAAAA,EAAqCA,KAArCA,CAAAA;;MAAzB;IAAAyE,KACAA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA,YAAAA;MAAS,KAAAD,WAAAA,CAAAA,CAAKA,IAALA,CAATA;;MADA;aAAAC,OAAAA,CACAA,KADAA,EAAAA;MAAAA,KAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MACA,QAAA5D,SAAAA,CAAAA,MAAAA;;sBAAAG,UAAAA,CAAAA,EAAAA;;UADyB,YAAAwD,WAAAA,CAAAA,CAAAA,KAAAA,CACzBA;;;OADA;;IAAAC,OAAAA,CAAAA,SAAAA,GAAAA,KAAAA,CAAAA,SAAAA;IAAAzE,CAAAA,CAAAA,WAAAA,CAAAA,qCAAAA,EAAAA,KAAAA,EAAAA,OAAAA,EAAAA,4BAAAA,EAAAA;MAAAyE,qCAAAA,EAAAA,IAAAA;MAAAC,4BAAAA,EAAAA,IAAAA;MAAAC,qBAAAA,EAAAA,IAAAA;MAAAC,qBAAAA,EAAAA,IAAAA;MAAA1E,kBAAAA,EAAAA,IAAAA;;;GAAAF,mBAAAA,C;;AKlEA,UAAAA,CAAAA;EAAAA,CAAAA,CAAAA,aAAAA,CAAAA,kCAAAA,EAAAA,WAAAA,EAAAA;aAAAuO,KAAAA;MAAAvO,CAAAA,CAAAA,CAAAA,CAAAA,uBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;;IAAAuO,KAAAA,CAAAA,SAAAA,GAAAA,MAAAA,CAAAA,MAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,uBAAAA,CAAAA,CAAAA,SAAAA,CAAAA;IAAAA,KAAAA,CAAAA,SAAAA,CAAAA,WAAAA,QAAAA;IAAAA,KAA0BA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA,YAAAA;MAAAvO,CAAAA,CAAAA,CAAAA,CAAAA,uBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;;MAA1B;aAAAuO,OAAAA,GAAAA;MAAAA,KAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAA0B,YAAAvN,UAAAA,CAAAA,EAA1BA;;IAAAuN,OAAAA,CAAAA,SAAAA,GAAAA,KAAAA,CAAAA,SAAAA;IAAAvO,CAAAA,CAAAA,WAAAA,CAAAA,kCAAAA,EAAAA,KAAAA,EAAAA,OAAAA,EAAAA,uBAAAA,EAAAA;MAAAuO,kCAAAA,EAAAA,IAAAA;MAAAC,uBAAAA,EAAAA,IAAAA;MAAAtO,kBAAAA,EAAAA,IAAAA;;;GAAAF,mBAAAA,C;;AHuFM,UAAAA,CAAAA,EAAAA;EAAAA,CAAAA,CAAAA,aAAAA,CAAAA,mBAAAA,EAAAA,WAAAA,EAAAA;aAAAyO,KAAAA,GAAAA;MAAAzO,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAAoB,KAAAsF,cAAAA,GAAAA,CAApBA;MACU,KAAAe,cAAAA,GAAAA,KADVA;;IAAAoI,KAAAA,CAAAA,SAAAA,GAAAA,MAAAA,CAAAA,MAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA;IAAAA,KAAAA,CAAAA,SAAAA,CAAAA,WAAAA,QAAAA;IAAAA,KAAoBA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA;kBAAAnJ,cAAAA;MAApB;IAAAmJ,KACUA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA;kBAAApI,cAAAA;MADV;IAAAoI,KAGNA,CAAAA,SAAAA,CAAAA,aAAAA,CAAAA,GAAAA;MAAa,YAAAC,UAAAA,CAAAA,EAAbA;MAHM;IAAAD,KAINA,CAAAA,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA;MAAc,YAAAC,UAAAA,CAAAA,EAAdA;MAJM;IAAAD,KAKNA,CAAAA,SAAAA,CAAAA,eAAAA,CAAAA,GAAAA;MAAe,YAAAC,UAAAA,CAAAA,EAAfA;MALM;IAAAD,KAMNA,CAAAA,SAAAA,CAAAA,gBAAAA,CAAAA,GAAAA;MAAgB,YAAAC,UAAAA,CAAAA,EAAhBA;MANM;IAAAD,KAQGA,CAAAA,SAAAA,CAAAA,YAAAA,CAAAA,GAAAA,UAAOA,QAAPA;MACgB,QAAVzO,CAAAA,CAAAA,UAAAA,CAAjBA,QAAiBA,EAAAA,mBAAAA,CAAUA,IAAUA,CAANA,IAAAA,CAAAA,UAAAA,CAAAA,EAAMA,KAAoBA,CAAAA,CAAAA,UAAAA,CAAjBA,QAAiBA,EAAAA,mBAAAA,CAAUA,CAAAA,UAAAA,CAAAA,EAA9BA,CAAVA,CADhBA;MARH;IAAAyO,KAWGA,CAAAA,SAAAA,CAAAA,aAAAA,CAAAA,GAAAA;MAA6B,OAAjB,KAAAC,UAAAA,CAAAA,EAAiBA,CAAAA,QAAAA,EAA7BA;MAXH;IAAAD,KAAOA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAAaA,SAAbA,EAAAA;MAAa,KAAAnJ,cAAAA,YAAbA;MAAAtF,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MACG,KAAAqG,cAAAA,GAAQA,IADXA;;MAAP;aAAAoI,OAAAA,CAAOA,KAAPA,EAAAA;MAAAA,KAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAAO,YAAAvJ,WAAAA,CAAAA,CAAAA,KAAAA,CAAPA;;IAAAuJ,OAAAA,CAAAA,SAAAA,GAAAA,KAAAA,CAAAA,SAAAA;IAAAzO,CAAAA,CAAAA,WAAAA,CAAAA,mBAAAA,EAAAA,KAAAA,EAAAA,OAAAA,EAAAA,kBAAAA,EAAAA;MAAAyO,mBAAAA,EAAAA,IAAAA;MAAAjI,kBAAAA,EAAAA,IAAAA;MAAAtG,kBAAAA,EAAAA,IAAAA;;;;;;MAeN,KAAAuF,aAAAA,GAAAA,IAfMA;MAgBN,KAAAgB,kBAAAA,GAAAA,CAhBMA;MAiBN,KAAAC,kBAAAA,GAAAA,CAjBMA;;;;IAeN,MAAAd,SAAAA,CAAAA,yBAAAA,CAAAA,GAAAA;kBAAAH,aAAAA;MAfM;IAgBN,MAAAG,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA;kBAAAa,kBAAAA;MAhBM;IAiBN,MAAAb,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA;kBAAAc,kBAAAA;MAjBM;IAmBN,MAAAd,SAAAA,CAAAA,+BAAAA,CAAAA,GAAAA,UAAQA,YAARA;MAA+B,WAAA5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAAA,EAAAA,CAAAA,WAAAA,CAAAA,CAAYA,YAAZA,CAA/BA;MAnBM;IAqBN,MAAA4F,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA,UAASA,KAATA;MACa,QAAZ5F,CAAAA,CAAAA,CAAQA,CAAAA,QAAAA,CAACA,KAADA,CAAIA,GAAAA,CAAAA,CADbA;MArBM;IAwBN,MAAA4F,SAAAA,CAAAA,eAAAA,CAAAA,GAAAA,UAASA,KAATA,EAAoBA,SAApBA;MACoB,QAAnB5F,CAAAA,CAAAA,CAAQA,CAAAA,QAAAA,CAACA,KAADA,EAAIA,SAAJA,CAAWA,GAAAA,CAAAA,CADpBA;MAxBM;IA2BN,MAAA4F,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA,UAASA,KAATA;MAAoC,OAAX,IAAO,CAAA+I,+BAAAA,CAAAA,CAACA,KAADA,CAAIA,CAAAA,aAAAA,CAAAA,EAApCA;MA3BM;IA6BN,MAAA/I,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA,UAASA,KAATA;MAA6C,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAA7CA;MA7BM;IA8BN,MAAA4F,SAAAA,CAAAA,kBAAAA,CAAAA,GAAAA,UAAaA,KAAbA;MAAiD,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAAjDA;MA9BM;IA+BN,MAAA4F,SAAAA,CAAAA,iBAAAA,CAAAA,GAAAA,UAAWA,KAAXA,EAAyBA,YAAzBA;MAAoE,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAApEA;MA/BM;IAgCN,MAAA4F,SAAAA,CAAAA,kBAAAA,CAAAA,GAAAA,UAAYA,KAAZA,EAA0BA,YAA1BA;MAAqE,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAArEA;MAhCM;IAkCN,MAAA4F,SAAAA,CAAAA,oBAAAA,CAAAA,GAAAA,UAAeA,KAAfA;MAA6D,OAArBgJ,KAAqBA,CAAAA,QAAAA,CAACA,CAADA,CAA7DA;MAlCM;IAmCN,MAAAhJ,SAAAA,CAAAA,iBAAAA,CAAAA,GAAAA,UAAYA,KAAZA;MAA0D,OAArBgJ,KAAqBA,CAAAA,QAAAA,CAACA,EAADA,CAA1DA;MAnCM;IAoCN,MAAAhJ,SAAAA,CAAAA,mBAAAA,CAAAA,GAAAA,UAAcA,KAAdA;MAA4D,OAArBgJ,KAAqBA,CAAAA,QAAAA,CAACA,CAADA,CAA5DA;MApCM;IAcG,MAAAhJ,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA,YAAAA;MAAA5F,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAAAA,CAAAA,CAAAA,OAAAA,CAAAA,mBAAAA,CAAAA,CAAAA,SAAAA,GAAAA,IAAAA;MACT,KAAAyF,aAAAA,GAAcA,CAAAA,CAAAA,UAAAA,CAAAA,WAAAA,CAAAA,CAAAA,GADLA;MAET,KAAAgB,kBAAAA,GAAwBA,WAFfA;MAGT,KAAAC,kBAAAA,GAAuBA,UAHdA;;MAdH;IAeN,MAAAd,SAAAA,CAAAA,IAAAA,GAAAA;kBAAAK,yBAAAA,CAAAA,EAAAA;MAfM;IAgBN,MAAAL,SAAAA,CAAAA,SAAAA,GAAAA;kBAAAiJ,cAAAA,CAAAA,EAAAA;MAhBM;IAiBN,MAAAjJ,SAAAA,CAAAA,SAAAA,GAAAA;kBAAAkJ,cAAAA,CAAAA,EAAAA;MAjBM;IAmBN,MAAAlJ,SAAAA,CAAAA,OAAAA,GAAAA,UAAAA,KAAAA;kBAAA+I,+BAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MAnBM;IAwBN,MAAA/I,SAAAA,CAAAA,QAAAA,GAAAA,UAAAA,KAAAA,EAAAA,KAAAA;cAAA/E,SAAAA,CAAAA,MAAAA;;UAHA,YAAAkO,cAAAA,CAAAA,CAAAA,KAAAA,CAGAA;;sBAAAC,eAAAA,CAAAA,CAAAA,KAAAA,EAAAA,KAAAA,CAAAA;;;;MAxBM;IA2BN,MAAApJ,SAAAA,CAAAA,QAAAA,GAAAA,UAAAA,KAAAA;cAAA/E,SAAAA,CAAAA,MAAAA;;;;sBAAAoO,cAAAA,CAAAA,CAAAA,KAAAA,CAAAA;;;;MA3BM;IA6BN,MAAArJ,SAAAA,CAAAA,QAAAA,GAAAA,UAAAA,KAAAA;kBAAAsJ,cAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MA7BM;IA8BN,MAAAtJ,SAAAA,CAAAA,YAAAA,GAAAA,UAAAA,KAAAA;kBAAAuJ,kBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MA9BM;IA+BN,MAAAvJ,SAAAA,CAAAA,UAAAA,GAAAA,UAAAA,KAAAA,EAAAA,KAAAA;kBAAAwJ,iBAAAA,CAAAA,CAAAA,KAAAA,EAAAA,KAAAA,CAAAA;MA/BM;IAgCN,MAAAxJ,SAAAA,CAAAA,WAAAA,GAAAA,UAAAA,KAAAA,EAAAA,KAAAA;kBAAAyJ,kBAAAA,CAAAA,CAAAA,KAAAA,EAAAA,KAAAA,CAAAA;MAhCM;IAkCN,MAAAzJ,SAAAA,CAAAA,cAAAA,GAAAA,UAAAA,KAAAA;kBAAA0J,oBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MAlCM;IAmCN,MAAA1J,SAAAA,CAAAA,WAAAA,GAAAA,UAAAA,KAAAA;kBAAA2J,iBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MAnCM;IAoCN,MAAA3J,SAAAA,CAAAA,aAAAA,GAAAA,UAAAA,KAAAA;kBAAA4J,mBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MApCM;;;MAcG,YAAAxO,UAAAA,CAAAA,EAdHA;;;;;;;;EAcLhB,CAAAA,CAAAA,cAAAA,CAAAA,mBAAAA,EAAAA,oBAAAA,CAdKA;GAAAA,mBAAAA,C;;AAyCA,UAAAA,CAAAA,EAAAA;EAAAA,CAAAA,CAAAA,aAAAA,CAAAA,gBAAAA,EAAAA,WAAAA,EAAAA;aAAAyP,KAAAA,GAAAA;MAAAzP,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAAiB,KAAAsF,cAAAA,GAAAA,CAAjBA;MACU,KAAAe,cAAAA,GAAAA,KADVA;;IAAAoJ,KAAAA,CAAAA,SAAAA,GAAAA,MAAAA,CAAAA,MAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA;IAAAA,KAAAA,CAAAA,SAAAA,CAAAA,WAAAA,QAAAA;IAAAA,KAAiBA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA;kBAAAnK,cAAAA;MAAjB;IAAAmK,KACUA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA;kBAAApJ,cAAAA;MADV;IAAAoJ,KAGGA,CAAAA,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA;MAAc,YAAAC,UAAAA,CAAAA,EAAdA;MAHH;IAAAD,KAIGA,CAAAA,SAAAA,CAAAA,eAAAA,CAAAA,GAAAA;MAAe,YAAAC,UAAAA,CAAAA,EAAfA;MAJH;IAAAD,KAKNA,CAAAA,SAAAA,CAAAA,aAAAA,CAAAA,GAAAA;MAAa,YAAAC,UAAAA,CAAAA,EAAbA;MALM;IAAAD,KAMNA,CAAAA,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA;MAAc,YAAAC,UAAAA,CAAAA,EAAdA;MANM;IAAAD,KAONA,CAAAA,SAAAA,CAAAA,eAAAA,CAAAA,GAAAA;MAAe,YAAAC,UAAAA,CAAAA,EAAfA;MAPM;IAAAD,KAQNA,CAAAA,SAAAA,CAAAA,gBAAAA,CAAAA,GAAAA;MAAgB,YAAAC,UAAAA,CAAAA,EAAhBA;MARM;IAAAD,KAUGA,CAAAA,SAAAA,CAAAA,YAAAA,CAAAA,GAAAA,UAAOA,QAAPA;MACa,QAAPzP,CAAAA,CAAAA,UAAAA,CAAjBA,QAAiBA,EAAAA,gBAAAA,CAAOA,IAAUA,CAANA,IAAAA,CAAAA,UAAAA,CAAAA,EAAMA,KAAoBA,CAAAA,CAAAA,UAAAA,CAAjBA,QAAiBA,EAAAA,gBAAAA,CAAOA,CAAAA,UAAAA,CAAAA,EAA3BA,CAAVA,CADbA;MAVH;IAAAyP,KAaGA,CAAAA,SAAAA,CAAAA,aAAAA,CAAAA,GAAAA;MAA6B,OAAjB,KAAAC,UAAAA,CAAAA,EAAiBA,CAAAA,QAAAA,EAA7BA;MAbH;IAAAD,KAAIA,CAAAA,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAAaA,SAAbA,EAAAA;MAAa,KAAAnK,cAAAA,YAAbA;MAAAtF,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MACM,KAAAqG,cAAAA,GAAQA,IADdA;;MAAJ;aAAAoJ,OAAAA,CAAIA,KAAJA,EAAAA;MAAAA,KAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAAI,YAAAtK,WAAAA,CAAAA,CAAAA,KAAAA,CAAJA;;IAAAsK,OAAAA,CAAAA,SAAAA,GAAAA,KAAAA,CAAAA,SAAAA;IAAAzP,CAAAA,CAAAA,WAAAA,CAAAA,gBAAAA,EAAAA,KAAAA,EAAAA,OAAAA,EAAAA,kBAAAA,EAAAA;MAAAyP,gBAAAA,EAAAA,IAAAA;MAAAjJ,kBAAAA,EAAAA,IAAAA;MAAAtG,kBAAAA,EAAAA,IAAAA;;;;;;MAiBN,KAAAuF,aAAAA,GAAAA,IAjBMA;MAkBN,KAAAgB,kBAAAA,GAAAA,CAlBMA;MAmBN,KAAAC,kBAAAA,GAAAA,CAnBMA;;;;IAiBN,MAAAd,SAAAA,CAAAA,yBAAAA,CAAAA,GAAAA;kBAAAH,aAAAA;MAjBM;IAkBN,MAAAG,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA;kBAAAa,kBAAAA;MAlBM;IAmBN,MAAAb,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA;kBAAAc,kBAAAA;MAnBM;IAqBN,MAAAd,SAAAA,CAAAA,4BAAAA,CAAAA,GAAAA,UAAQA,aAARA;MAAiC,WAAA5F,CAAAA,CAAAA,CAAAA,CAAAA,gBAAAA,CAAAA,EAAAA,CAAAA,WAAAA,CAAAA,CAASA,aAATA,CAAjCA;MArBM;IAsBN,MAAA4F,SAAAA,CAAAA,eAAAA,CAAAA,GAAAA,UAAUA,KAAVA;MAAmD,OAAhB5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAgBA,CAAAA,cAAAA,CAAAA,CAACA,KAADA,CAAnDA;MAtBM;IAuBN,MAAA4F,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA,UAASA,KAATA;MAAmD,OAAzB5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAeA,CAAAA,+BAAAA,CAAAA,CAACA,KAADA,CAAUA,CAAAA,aAAAA,CAAAA,EAAnDA;MAvBM;IAyBN,MAAA4F,SAAAA,CAAAA,cAAAA,CAAAA,GAAAA,UAASA,KAATA;MAA+C,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAA/CA;MAzBM;IA0BN,MAAA4F,SAAAA,CAAAA,kBAAAA,CAAAA,GAAAA,UAAaA,KAAbA;MAAmD,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAAnDA;MA1BM;IA2BN,MAAA4F,SAAAA,CAAAA,iBAAAA,CAAAA,GAAAA,UAAWA,KAAXA,EAA0BA,YAA1BA;MAAsE,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAAtEA;MA3BM;IA4BN,MAAA4F,SAAAA,CAAAA,kBAAAA,CAAAA,GAAAA,UAAYA,KAAZA,EAA2BA,YAA3BA;MAAuE,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAAvEA;MA5BM;IA8BN,MAAA4F,SAAAA,CAAAA,oBAAAA,CAAAA,GAAAA,UAAeA,KAAfA;MAAiD,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAAjDA;MA9BM;IA+BN,MAAA4F,SAAAA,CAAAA,iBAAAA,CAAAA,GAAAA,UAAYA,KAAZA;MAA8C,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAA9CA;MA/BM;IAgCN,MAAA4F,SAAAA,CAAAA,mBAAAA,CAAAA,GAAAA,UAAcA,KAAdA;MAAgD,OAAL5F,CAAAA,CAAAA,CAAAA,CAAAA,mBAAAA,CAAKA,CAAAA,yBAAAA,CAAAA,CAACA,eAADA,CAAhDA;MAhCM;IAgBA,MAAA4F,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA,YAAAA;MAAA5F,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAAAA,CAAAA,CAAAA,OAAAA,CAAAA,gBAAAA,CAAAA,CAAAA,SAAAA,GAAAA,IAAAA;MACN,KAAAyF,aAAAA,GAAcA,CAAAA,CAAAA,UAAAA,CAAAA,YAAAA,CAAAA,CAAAA,GADRA;MAEN,KAAAgB,kBAAAA,GAAyBA,oBAFnBA;MAGN,KAAAC,kBAAAA,GAAwBA,mBAHlBA;;MAhBA;IAiBN,MAAAd,SAAAA,CAAAA,IAAAA,GAAAA;kBAAAK,yBAAAA,CAAAA,EAAAA;MAjBM;IAkBN,MAAAL,SAAAA,CAAAA,SAAAA,GAAAA;kBAAA+J,cAAAA,CAAAA,EAAAA;MAlBM;IAmBN,MAAA/J,SAAAA,CAAAA,SAAAA,GAAAA;kBAAAgK,cAAAA,CAAAA,EAAAA;MAnBM;IAqBN,MAAAhK,SAAAA,CAAAA,OAAAA,GAAAA,UAAAA,KAAAA;kBAAAiK,4BAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MArBM;IAsBN,MAAAjK,SAAAA,CAAAA,SAAAA,GAAAA,UAAAA,KAAAA;kBAAAkK,eAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MAtBM;IAuBN,MAAAlK,SAAAA,CAAAA,QAAAA,GAAAA,UAAAA,KAAAA;cAAA/E,SAAAA,CAAAA,MAAAA;;;;sBAAAkP,cAAAA,CAAAA,CAAAA,KAAAA,CAAAA;;;;MAvBM;IAyBN,MAAAnK,SAAAA,CAAAA,QAAAA,GAAAA,UAAAA,KAAAA;kBAAAoK,cAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MAzBM;IA0BN,MAAApK,SAAAA,CAAAA,YAAAA,GAAAA,UAAAA,KAAAA;kBAAAqK,kBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MA1BM;IA2BN,MAAArK,SAAAA,CAAAA,UAAAA,GAAAA,UAAAA,KAAAA,EAAAA,KAAAA;kBAAAsK,iBAAAA,CAAAA,CAAAA,KAAAA,EAAAA,KAAAA,CAAAA;MA3BM;IA4BN,MAAAtK,SAAAA,CAAAA,WAAAA,GAAAA,UAAAA,KAAAA,EAAAA,KAAAA;kBAAAuK,kBAAAA,CAAAA,CAAAA,KAAAA,EAAAA,KAAAA,CAAAA;MA5BM;IA8BN,MAAAvK,SAAAA,CAAAA,cAAAA,GAAAA,UAAAA,KAAAA;kBAAAwK,oBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MA9BM;IA+BN,MAAAxK,SAAAA,CAAAA,WAAAA,GAAAA,UAAAA,KAAAA;kBAAAyK,iBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MA/BM;IAgCN,MAAAzK,SAAAA,CAAAA,aAAAA,GAAAA,UAAAA,KAAAA;kBAAA0K,mBAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MAhCM;;;MAgBA,YAAAtP,UAAAA,CAAAA,EAhBAA;;;;;;;;EAgBLhB,CAAAA,CAAAA,cAAAA,CAAAA,gBAAAA,EAAAA,iBAAAA,CAhBKA;GAAAA,mBAAAA,C;;AI7HL,UAAAA,CAAAA,EAAAA;;;;MAwBO,KAAAuQ,eAAAA,GAAAA,IAxBPA;MA0BD,KAAAC,UAAAA,GAAAA,GA1BCA;MA2BD,KAAAC,WAAAA,GAAAA,GA3BCA;;;;IAwBO,MAAA7K,SAAAA,CAAAA,qCAAAA,CAAAA,GAAAA;kBAAA2K,eAAAA;MAxBP;IA0BD,MAAA3K,SAAAA,CAAAA,MAAAA,CAAAA,GAAAA;kBAAA4K,UAAAA;MA1BC;IA2BD,MAAA5K,SAAAA,CAAAA,OAAAA,CAAAA,GAAAA;kBAAA6K,WAAAA;MA3BC;IA6BD,MAAA7K,SAAAA,CAAAA,SAAAA,CAAAA,GAAAA,UAAIA,KAAJA;MAAkC,QAAd,KAAA8K,qCAAAA,CAAAA,EAAUA,CAAAA,GAAAA,CAACA,KAADA,CAAIA,GAAAA,CAAAA,CAAlCA;MA7BC;IA8BD,MAAA9K,SAAAA,CAAAA,SAAAA,CAAAA,GAAAA,UAAIA,KAAJA;MAAmC,OAAA5F,CAAAA,CAAAA,cAAAA,CAAdA,IAAAA,CAAAA,qCAAAA,CAAAA,EAAUA,CAAAA,GAAAA,CAACA,KAADA,CAAIA,CAAnCA;MA9BC;IA+BD,MAAA4F,SAAAA,CAAAA,SAAAA,CAAAA,GAAAA,UAAIA,KAAJA;MAAgC,OAAV,KAAA8K,qCAAAA,CAAAA,EAAUA,CAAAA,GAAAA,CAACA,KAADA,CAAhCA;MA/BC;IAgCD,MAAA9K,SAAAA,CAAAA,SAAAA,CAAAA,GAAAA,UAAIA,KAAJA;MAAiC,OAAV,KAAA8K,qCAAAA,CAAAA,EAAUA,CAAAA,GAAAA,CAACA,KAADA,CAAjCA;MAhCC;IAkCD,MAAA9K,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA,UAAIA,KAAJA,EAAkBA,KAAlBA;MAAmD,QAAjB,KAAA8K,qCAAAA,CAAAA,EAAUA,CAAAA,GAAAA,CAACA,KAADA,EAAIA,KAAJA,CAAOA,GAAAA,CAAAA,CAAnDA;MAlCC;IAmCD,MAAA9K,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA,UAAIA,KAAJA,EAAmBA,KAAnBA;MAAqD,OAAA5F,CAAAA,CAAAA,cAAAA,CAAjBA,IAAAA,CAAAA,qCAAAA,CAAAA,EAAUA,CAAAA,GAAAA,CAACA,KAADA,EAAIA,KAAJA,CAAOA,CAArDA;MAnCC;IAoCD,MAAA4F,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA,UAAIA,KAAJA,EAAoBA,KAApBA;MAAgD,OAAV,KAAA8K,qCAAAA,CAAAA,EAAUA,CAAAA,GAAAA,CAACA,KAADA,EAAIA,KAAJA,CAAhDA;MApCC;IAqCD,MAAA9K,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA,UAAIA,KAAJA,EAAqBA,KAArBA;MAAkD,OAAV,KAAA8K,qCAAAA,CAAAA,EAAUA,CAAAA,GAAAA,CAACA,KAADA,EAAIA,KAAJA,CAAlDA;MArCC;IAuCD,MAAA9K,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA,UAAIA,KAAJA,EAAkBA,KAAlBA;MAAmD,QAAjB,KAAA8K,qCAAAA,CAAAA,EAAUA,CAAAA,GAAAA,CAACA,KAADA,EAAIA,KAAJA,CAAOA,GAAAA,CAAAA,CAAnDA;MAvCC;IAwCD,MAAA9K,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA,UAAIA,KAAJA,EAAmBA,KAAnBA;MAAqD,OAAA5F,CAAAA,CAAAA,cAAAA,CAAjBA,IAAAA,CAAAA,qCAAAA,CAAAA,EAAUA,CAAAA,GAAAA,CAACA,KAADA,EAAIA,KAAJA,CAAOA,CAArDA;MAxCC;IAyCD,MAAA4F,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA,UAAIA,KAAJA,EAAoBA,KAApBA;MAAgD,OAAV,KAAA8K,qCAAAA,CAAAA,EAAUA,CAAAA,GAAAA,CAACA,KAADA,EAAIA,KAAJA,CAAhDA;MAzCC;IA0CD,MAAA9K,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA,UAAIA,KAAJA,EAAqBA,KAArBA;MAAkD,OAAV,KAAA8K,qCAAAA,CAAAA,EAAUA,CAAAA,GAAAA,CAACA,KAADA,EAAIA,KAAJA,CAAlDA;MA1CC;IA4CD,MAAA9K,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA,UAAKA,KAALA;MAAiD,OAAX,KAAA8K,qCAAAA,CAAAA,EAAWA,CAAAA,IAAAA,CAACA,KAADA,CAAjDA;MA5CC;IA6CD,MAAA9K,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAAMA,KAANA;MAAmD,OAAZ,KAAA8K,qCAAAA,CAAAA,EAAYA,CAAAA,KAAAA,CAACA,KAADA,CAAnDA;MA7CC;IA+CD,MAAA9K,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAAMA,KAANA;MAAmD,QAAhB,KAAA8K,qCAAAA,CAAAA,EAAYA,CAAAA,KAAAA,CAACA,KAADA,CAAIA,GAAAA,CAAAA,CAAnDA;MA/CC;IAgDD,MAAA9K,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA,UAAMA,KAANA;MAAqD,OAAA5F,CAAAA,CAAAA,cAAAA,CAAhBA,IAAAA,CAAAA,qCAAAA,CAAAA,EAAYA,CAAAA,KAAAA,CAACA,KAADA,CAAIA,CAArDA;MAhDC;IAkDD,MAAA4F,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA,UAAKA,KAALA;MAAiD,OAAX,KAAA8K,qCAAAA,CAAAA,EAAWA,CAAAA,IAAAA,CAACA,KAADA,CAAjDA;MAlDC;IAmDD,MAAA9K,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA,UAAIA,KAAJA,EAAqBA,KAArBA;MAAgE,OAAV,KAAA8K,qCAAAA,CAAAA,EAAUA,CAAAA,GAAAA,CAACA,KAADA,EAAIA,KAAJA,CAAhEA;MAnDC;IAqDD,MAAA9K,SAAAA,CAAAA,SAAAA,CAAAA,GAAAA,UAAIA,KAAJA;MAA+C,OAAV,KAAA8K,qCAAAA,CAAAA,EAAUA,CAAAA,GAAAA,CAACA,KAADA,CAA/CA;MArDC;IAsDD,MAAA9K,SAAAA,CAAAA,SAAAA,CAAAA,GAAAA,UAAIA,KAAJA;MAA+C,OAAV,KAAA8K,qCAAAA,CAAAA,EAAUA,CAAAA,GAAAA,CAACA,KAADA,CAA/CA;MAtDC;IAuDD,MAAA9K,SAAAA,CAAAA,SAAAA,CAAAA,GAAAA,UAAIA,KAAJA;MAA+C,OAAV,KAAA8K,qCAAAA,CAAAA,EAAUA,CAAAA,GAAAA,CAACA,KAADA,CAA/CA;MAvDC;IAwDD,MAAA9K,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA,UAAKA,KAALA;MAAiD,OAAX,KAAA8K,qCAAAA,CAAAA,EAAWA,CAAAA,IAAAA,CAACA,KAADA,CAAjDA;MAxDC;IAyDD,MAAA9K,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA,UAAKA,KAALA;MAAiD,OAAX,KAAA8K,qCAAAA,CAAAA,EAAWA,CAAAA,IAAAA,CAACA,KAADA,CAAjDA;MAzDC;IA0DD,MAAA9K,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA,UAAKA,KAALA;MAAiD,OAAX,KAAA8K,qCAAAA,CAAAA,EAAWA,CAAAA,IAAAA,CAACA,KAADA,CAAjDA;MA1DC;IA2DD,MAAA9K,SAAAA,CAAAA,YAAAA,CAAAA,GAAAA,UAAMA,KAANA,EAAuBA,KAAvBA;MAAoE,OAAZ,KAAA8K,qCAAAA,CAAAA,EAAYA,CAAAA,KAAAA,CAACA,KAADA,EAAIA,KAAJA,CAApEA;MA3DC;IA6DD,MAAA9K,SAAAA,CAAAA,WAAAA,CAAAA,GAAAA;MAAsC,OAAb,KAAA8K,qCAAAA,CAAAA,EAAaA,CAAAA,MAAAA,EAAtCA;MA7DC;IAAK,MAAA9K,SAAAA,CAAAA,UAAAA,CAAAA,GAAAA,YAAAA;MAAA5F,CAAAA,CAAAA,CAAAA,CAAAA,kBAAAA,CAAAA,CAAAA,SAAAA,CAAAA,UAAAA,CAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA;MAAAA,CAAAA,CAAAA,OAAAA,CAAAA,gBAAAA,CAAAA,CAAAA,SAAAA,GAAAA,IAAAA;MAwBE,KAAAuQ,eAAAA,GAAoBA,CAAAA,CAAAA,CAAAA,CAAAA,IAxBtBA;MA0BN,KAAAC,UAAAA,GAAkBA,IAAAA,CAAAA,qCAAAA,CAAAA,EAAOA,EA1BnBA;MA2BN,KAAAC,WAAAA,GAAmBA,IAAAA,CAAAA,qCAAAA,CAAAA,EAAOA,GA3BpBA;;MAAL;IA0BD,MAAA7K,SAAAA,CAAAA,CAAAA,GAAAA;kBAAA+K,MAAAA,CAAAA,EAAAA;MA1BC;IA2BD,MAAA/K,SAAAA,CAAAA,EAAAA,GAAAA;kBAAAgL,OAAAA,CAAAA,EAAAA;MA3BC;IAgCD,MAAAhL,SAAAA,CAAAA,GAAAA,GAAAA,UAAAA,KAAAA,EAAAA;kBAAAiL,SAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MADA,YAAAC,SAAAA,CAAAA,CAAAA,KAAAA,CACAA;MAFA,YAAAC,SAAAA,CAAAA,CAAAA,KAAAA,CAEAA;MAHA,YAAAC,SAAAA,CAAAA,CAAAA,KAAAA,CAGAA;MAhCC;IAqCD,MAAApL,SAAAA,CAAAA,GAAAA,GAAAA,UAAAA,KAAAA,EAAAA,KAAAA,EAAAA;kBAAAqL,UAAAA,CAAAA,CAAAA,KAAAA,EAAAA,KAAAA,CAAAA;MADA,YAAAC,UAAAA,CAAAA,CAAAA,KAAAA,EAAAA,KAAAA,CACAA;MAFA,YAAAC,UAAAA,CAAAA,CAAAA,KAAAA,EAAAA,KAAAA,CAEAA;MAHA,YAAAC,UAAAA,CAAAA,CAAAA,KAAAA,EAAAA,KAAAA,CAGAA;MArCC;IA0CD,MAAAxL,SAAAA,CAAAA,GAAAA,GAAAA,UAAAA,KAAAA,EAAAA,KAAAA,EAAAA;kBAAAyL,UAAAA,CAAAA,CAAAA,KAAAA,EAAAA,KAAAA,CAAAA;MADA,YAAAC,UAAAA,CAAAA,CAAAA,KAAAA,EAAAA,KAAAA,CACAA;MAFA,YAAAC,UAAAA,CAAAA,CAAAA,KAAAA,EAAAA,KAAAA,CAEAA;MAHA,YAAAC,UAAAA,CAAAA,CAAAA,KAAAA,EAAAA,KAAAA,CAGAA;MA1CC;IA4CD,MAAA5L,SAAAA,CAAAA,IAAAA,GAAAA,UAAAA,KAAAA;kBAAA6L,UAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MA5CC;IA6CD,MAAA7L,SAAAA,CAAAA,KAAAA,GAAAA,UAAAA,KAAAA;kBAAA8L,WAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MA7CC;IAgDD,MAAA9L,SAAAA,CAAAA,KAAAA,GAAAA,UAAAA,KAAAA,EAAAA;kBAAA+L,WAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MADA,YAAAC,WAAAA,CAAAA,CAAAA,KAAAA,CACAA;MAhDC;IAkDD,MAAAhM,SAAAA,CAAAA,IAAAA,GAAAA,UAAAA,KAAAA;kBAAAiM,UAAAA,CAAAA,CAAAA,KAAAA,CAAAA;MAlDC;IAmDD,MAAAjM,SAAAA,CAAAA,GAAAA,GAAAA,UAAAA,KAAAA,EAAAA,KAAAA;kBAAAkM,UAAAA,CAAAA,CAAAA,KAAAA,EAAAA,KAAAA,CAAAA;MAnDC;IAqDD,MAAAlM,SAAAA,CAAAA,GAAAA -------------------------------------------------------------------------------- /ci/script.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -eux 4 | 5 | case "$JOB" in 6 | "test") 7 | cargo install -f cargo-readme 8 | cargo test 9 | ;; 10 | "bench") 11 | cargo bench 12 | ;; 13 | "wasm") 14 | rustup target add wasm32-unknown-unknown 15 | cd source-map-mappings-wasm-api/ 16 | 17 | # Non-release builds are broken for wasm32-unknown-unknown targets right now. 18 | # cargo build --target wasm32-unknown-unknown 19 | # test -f target/wasm32-unknown-unknown/debug/source_map_mappings_wasm_api.wasm 20 | 21 | cargo build --release --target wasm32-unknown-unknown 22 | test -f target/wasm32-unknown-unknown/release/source_map_mappings_wasm_api.wasm 23 | 24 | rm target/wasm32-unknown-unknown/release/source_map_mappings_wasm_api.wasm 25 | cargo build --release --target wasm32-unknown-unknown --features profiling 26 | test -f target/wasm32-unknown-unknown/release/source_map_mappings_wasm_api.wasm 27 | ;; 28 | *) 29 | echo "Unknown \$JOB = '$JOB'" 30 | exit 1 31 | esac 32 | -------------------------------------------------------------------------------- /source-map-mappings-wasm-api/.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | -------------------------------------------------------------------------------- /source-map-mappings-wasm-api/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | authors = ["Nick Fitzgerald ", "Tom Tromey "] 3 | description = "Exported WebAssembly API for the `source-map-mappings` crate." 4 | license = "Apache-2.0/MIT" 5 | name = "source-map-mappings-wasm-api" 6 | readme = "../README.md" 7 | repository = "https://github.com/fitzgen/source-map-mappings" 8 | version = "0.5.0" 9 | 10 | [badges.travis-ci] 11 | repository = "fitzgen/source-map-mappings" 12 | 13 | [dependencies] 14 | source-map-mappings = { version = "0.5.0", path = ".." } 15 | 16 | [features] 17 | profiling = [] 18 | 19 | [lib] 20 | crate-type = ["cdylib"] 21 | 22 | [profile.release] 23 | debug = true 24 | -------------------------------------------------------------------------------- /source-map-mappings-wasm-api/build.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import argparse 4 | import os 5 | import re 6 | import subprocess 7 | import sys 8 | 9 | DESC = """ 10 | 11 | Build, trim, and optimize the `.wasm` file for inclusion in the 12 | `mozilla/source-map` library. 13 | 14 | Requires: 15 | 16 | - wasm-nm: https://github.com/fitzgen/wasm-nm 17 | - wasm-gc: https://github.com/alexcrichton/wasm-gc 18 | - wasm-snip: https://github.com/fitzgen/wasm-snip 19 | - wasm-opt: https://github.com/WebAssembly/binaryen 20 | 21 | """ 22 | 23 | parser = argparse.ArgumentParser( 24 | formatter_class=argparse.RawDescriptionHelpFormatter, 25 | description=DESC) 26 | 27 | parser.add_argument( 28 | "-g", 29 | "--debug", 30 | action="store_true", 31 | help="Include debug info (the \"name\" section) in the final `.wasm` file.") 32 | 33 | parser.add_argument( 34 | "-p", 35 | "--profiling", 36 | action="store_true", 37 | help="Enable the `profiling` cargo feature.") 38 | 39 | parser.add_argument( 40 | "-o", 41 | "--output", 42 | type=str, 43 | default=None, 44 | help="The path to write the output `.wasm` file to. If not supplied, the `.wasm` file is written to `stdout`.") 45 | 46 | parser.add_argument( 47 | "--no-wasm-opt", 48 | dest="wasm_opt", 49 | action="store_false", 50 | help="Do not run `wasm-opt`.") 51 | 52 | parser.add_argument( 53 | "--no-wasm-gc", 54 | dest="wasm_gc", 55 | action="store_false", 56 | help="Do not run `wasm-gc`.") 57 | 58 | parser.add_argument( 59 | "--no-wasm-snip", 60 | dest="wasm_snip", 61 | action="store_false", 62 | help="Do not run `wasm-snip`.") 63 | 64 | def decode(f): 65 | return f.decode(encoding="utf-8", errors="ignore") 66 | 67 | def run(cmd, **kwargs): 68 | sys.stderr.write(str(cmd) + "\n") 69 | 70 | if "stdout" not in kwargs: 71 | kwargs["stdout"] = subprocess.PIPE 72 | child = subprocess.run(cmd, **kwargs) 73 | if child.returncode != 0: 74 | raise Exception("{} did not exit OK".format(str(cmd))) 75 | return decode(child.stdout) 76 | 77 | def add_path_ext_prefix(path, prefix): 78 | (root, ext) = os.path.splitext(path) 79 | return root + "." + prefix + ext 80 | 81 | def build(args): 82 | cmd = ["cargo", "build", "--release", "--target", "wasm32-unknown-unknown"] 83 | if args.profiling: 84 | cmd.extend(["--features", "profiling"]) 85 | run(cmd) 86 | return "./target/wasm32-unknown-unknown/release/source_map_mappings_wasm_api.wasm" 87 | 88 | def wasm_gc(args, wasm_path): 89 | if not args.wasm_gc: 90 | return wasm_path 91 | 92 | out_path = add_path_ext_prefix(wasm_path, "gc") 93 | run(["wasm-gc", wasm_path, out_path]) 94 | return out_path 95 | 96 | SHOULD_SNIP = [ 97 | re.compile(r".*(std|core)(9|::)panicking.*"), 98 | re.compile(r".*(std|core)(3|::)fmt.*"), 99 | re.compile(r".*core(6|::)option(13|::)expect_failed.*"), 100 | re.compile(r".*core(5|::)slice(\d+|::)slice_index_.*_fail.*"), 101 | re.compile(r".*core(3|::)str(\d+|::)slice_.*_fail.*"), 102 | re.compile(r".*core(6|::)result(13|::)unwrap_failed.*"), 103 | re.compile(r".*std(6|::)thread(5|::)local.*"), 104 | re.compile(r".*std(2|::)io(5|::).*"), 105 | re.compile(r"__.*2"), 106 | re.compile(r".*(std|core)(5|::)error.*"), 107 | re.compile(r".*(std|core)(3|::)any(3|::)Any.*"), 108 | ] 109 | 110 | def wasm_snip(args, wasm_path): 111 | if not args.wasm_snip: 112 | return wasm_path 113 | 114 | out_path = add_path_ext_prefix(wasm_path, "snip") 115 | 116 | private_functions = run(["wasm-nm", "-j", wasm_path]).splitlines() 117 | 118 | snip_functions = set() 119 | for snip in SHOULD_SNIP: 120 | snip_functions.update(filter(lambda f: re.match(snip, f), 121 | private_functions)) 122 | 123 | run(["wasm-snip", "-o", out_path, wasm_path, *snip_functions]), 124 | return out_path 125 | 126 | def wasm_opt(args, wasm_path): 127 | if not args.wasm_opt: 128 | return wasm_path 129 | 130 | out_path = add_path_ext_prefix(wasm_path, "opt") 131 | 132 | cmd = [ 133 | "wasm-opt", 134 | "-O3", 135 | "-Oz", 136 | "--duplicate-function-elimination", 137 | "-o", out_path, 138 | wasm_path 139 | ] 140 | if args.debug: 141 | cmd.append("-g") 142 | run(cmd) 143 | return out_path 144 | 145 | def main(): 146 | args = parser.parse_args() 147 | os.chdir(os.path.dirname(sys.argv[0])) 148 | 149 | wasm_path = build(args) 150 | wasm_path = wasm_gc(args, wasm_path) 151 | wasm_path = wasm_snip(args, wasm_path) 152 | # GC again after snipping. 153 | wasm_path = wasm_gc(args, wasm_path) 154 | wasm_path = wasm_opt(args, wasm_path) 155 | 156 | if args.output: 157 | run(["cp", wasm_path, args.output]) 158 | else: 159 | run(["cat", wasm_path], stdout=subprocess.STDOUT) 160 | 161 | if __name__ == "__main__": 162 | main() 163 | -------------------------------------------------------------------------------- /source-map-mappings-wasm-api/src/lib.rs: -------------------------------------------------------------------------------- 1 | //! The public JS API to the `source-map-mappings` crate. 2 | //! 3 | //! ## Usage 4 | //! 5 | //! 1. Instantiate the WebAssembly module, supplying a JS implementation of 6 | //! `mapping_callback`. 7 | //! 8 | //! 2. Allocate space for the mappings string with `allocate_mappings`. 9 | //! 10 | //! 3. Initialize the mappings string by copying the JS `String`'s data into it. 11 | //! 12 | //! 4. Parse the mappings with `parse_mappings`. Handle errors, if any. 13 | //! 14 | //! 5. Query the resulting `Mappings` structure as needed with 15 | //! `by_generated_location`, `by_original_location`, `compute_column_spans`, 16 | //! `original_location_for`, `generated_location_for`, and 17 | //! `all_generated_locations_for` as needed. 18 | //! 19 | //! 6. When finished with `Mappings` structure, dispose of it with 20 | //! `free_mappings`. 21 | 22 | // NB: every exported function must be `#[no_mangle]` and `pub extern "C"`. 23 | 24 | #![deny(missing_docs)] 25 | 26 | extern crate source_map_mappings; 27 | 28 | use source_map_mappings::{Bias, Error, Mapping, Mappings}; 29 | use std::mem; 30 | use std::ptr; 31 | use std::process; 32 | use std::slice; 33 | 34 | #[cfg(feature = "profiling")] 35 | mod observer { 36 | use source_map_mappings; 37 | 38 | macro_rules! define_raii_observer { 39 | ( $name:ident , $ctor:ident , $dtor:ident ) => { 40 | #[derive(Debug)] 41 | pub struct $name; 42 | 43 | impl Default for $name { 44 | #[inline] 45 | fn default() -> $name { 46 | extern "C" { 47 | fn $ctor(); 48 | } 49 | unsafe { 50 | $ctor(); 51 | } 52 | $name 53 | } 54 | } 55 | 56 | impl Drop for $name { 57 | #[inline] 58 | fn drop(&mut self) { 59 | extern "C" { 60 | fn $dtor(); 61 | } 62 | unsafe { 63 | $dtor(); 64 | } 65 | } 66 | } 67 | } 68 | } 69 | 70 | define_raii_observer!(ParseMappings, start_parse_mappings, end_parse_mappings); 71 | define_raii_observer!( 72 | SortByOriginalLocation, 73 | start_sort_by_original_location, 74 | end_sort_by_original_location 75 | ); 76 | define_raii_observer!( 77 | SortByGeneratedLocation, 78 | start_sort_by_generated_location, 79 | end_sort_by_generated_location 80 | ); 81 | define_raii_observer!( 82 | ComputeColumnSpans, 83 | start_compute_column_spans, 84 | end_compute_column_spans 85 | ); 86 | define_raii_observer!( 87 | OriginalLocationFor, 88 | start_original_location_for, 89 | end_original_location_for 90 | ); 91 | define_raii_observer!( 92 | GeneratedLocationFor, 93 | start_generated_location_for, 94 | end_generated_location_for 95 | ); 96 | define_raii_observer!( 97 | AllGeneratedLocationsFor, 98 | start_all_generated_locations_for, 99 | end_all_generated_locations_for 100 | ); 101 | 102 | #[derive(Debug, Default)] 103 | pub struct Observer; 104 | 105 | impl source_map_mappings::Observer for Observer { 106 | type ParseMappings = ParseMappings; 107 | type SortByOriginalLocation = SortByOriginalLocation; 108 | type SortByGeneratedLocation = SortByGeneratedLocation; 109 | type ComputeColumnSpans = ComputeColumnSpans; 110 | type OriginalLocationFor = OriginalLocationFor; 111 | type GeneratedLocationFor = GeneratedLocationFor; 112 | type AllGeneratedLocationsFor = AllGeneratedLocationsFor; 113 | } 114 | } 115 | 116 | #[cfg(not(feature = "profiling"))] 117 | mod observer { 118 | pub type Observer = (); 119 | } 120 | 121 | use observer::Observer; 122 | 123 | static mut LAST_ERROR: Option = None; 124 | 125 | /// Get the last error's error code, or 0 if there was none. 126 | /// 127 | /// See `source_map_mappings::Error` for the error code definitions. 128 | #[no_mangle] 129 | pub extern "C" fn get_last_error() -> u32 { 130 | unsafe { 131 | match LAST_ERROR { 132 | None => 0, 133 | Some(e) => e as u32, 134 | } 135 | } 136 | } 137 | 138 | #[inline] 139 | fn assert_pointer_is_word_aligned(p: *mut u8) { 140 | debug_assert_eq!(p as usize & (mem::size_of::() - 1), 0); 141 | } 142 | 143 | /// Allocate space for a mappings string of the given size (in bytes). 144 | /// 145 | /// It is the JS callers responsibility to initialize the resulting buffer by 146 | /// copying the JS `String` holding the source map's "mappings" into it (encoded 147 | /// in ascii). 148 | #[no_mangle] 149 | pub extern "C" fn allocate_mappings(size: usize) -> *mut u8 { 150 | // Make sure that we don't lose any bytes from size in the remainder. 151 | let size_in_units_of_usize = (size + mem::size_of::() - 1) / mem::size_of::(); 152 | 153 | // Make room for two additional `usize`s: we'll stuff capacity and length in 154 | // there. 155 | let mut vec: Vec = Vec::with_capacity(size_in_units_of_usize + 2); 156 | 157 | // And do the stuffing. 158 | let capacity = vec.capacity(); 159 | vec.push(capacity); 160 | vec.push(size); 161 | 162 | // Leak the vec's elements and get a pointer to them. 163 | let ptr = vec.as_mut_ptr(); 164 | debug_assert!(!ptr.is_null()); 165 | mem::forget(vec); 166 | 167 | // Advance the pointer past our stuffed data and return it to JS, so that JS 168 | // can write the mappings string into it. 169 | let ptr = ptr.wrapping_offset(2) as *mut u8; 170 | assert_pointer_is_word_aligned(ptr); 171 | ptr 172 | } 173 | 174 | #[inline] 175 | fn constrain<'a, T>(_scope: &'a (), reference: &'a T) -> &'a T 176 | where 177 | T: ?Sized, 178 | { 179 | reference 180 | } 181 | 182 | /// Parse the given initialized mappings string into a `Mappings` structure. 183 | /// 184 | /// Returns `NULL` on failure, or a pointer to the parsed `Mappings` structure 185 | /// on success. 186 | /// 187 | /// In the case of failure, the error can be retrieved with `get_last_error`. 188 | /// 189 | /// In the case of success, the caller takes ownership of the result, and must 190 | /// call `free_mappings` to destroy it when finished. 191 | /// 192 | /// In both the success or failure cases, the caller gives up ownership of the 193 | /// input mappings string and must not use it again. 194 | #[no_mangle] 195 | pub extern "C" fn parse_mappings(mappings: *mut u8) -> *mut Mappings { 196 | assert_pointer_is_word_aligned(mappings); 197 | let mappings = mappings as *mut usize; 198 | 199 | // Unstuff the data we put just before the pointer to the mappings 200 | // string. 201 | let capacity_ptr = mappings.wrapping_offset(-2); 202 | debug_assert!(!capacity_ptr.is_null()); 203 | let capacity = unsafe { *capacity_ptr }; 204 | 205 | let size_ptr = mappings.wrapping_offset(-1); 206 | debug_assert!(!size_ptr.is_null()); 207 | let size = unsafe { *size_ptr }; 208 | 209 | // Construct the input slice from the pointer and parse the mappings. 210 | let result = unsafe { 211 | let input = slice::from_raw_parts(mappings as *const u8, size); 212 | let this_scope = (); 213 | let input = constrain(&this_scope, input); 214 | source_map_mappings::parse_mappings(input) 215 | }; 216 | 217 | // Deallocate the mappings string and its two prefix words. 218 | let size_in_usizes = (size + mem::size_of::() - 1) / mem::size_of::(); 219 | unsafe { 220 | Vec::::from_raw_parts(capacity_ptr, size_in_usizes + 2, capacity); 221 | } 222 | 223 | // Return the result, saving any errors on the side for later inspection by 224 | // JS if required. 225 | match result { 226 | Ok(mappings) => Box::into_raw(Box::new(mappings)), 227 | Err(e) => { 228 | unsafe { 229 | LAST_ERROR = Some(e); 230 | } 231 | ptr::null_mut() 232 | } 233 | } 234 | } 235 | 236 | /// Destroy the given `Mappings` structure. 237 | /// 238 | /// The caller gives up ownership of the mappings and must not use them again. 239 | #[no_mangle] 240 | pub extern "C" fn free_mappings(mappings: *mut Mappings) { 241 | unsafe { 242 | Box::from_raw(mappings); 243 | } 244 | } 245 | 246 | #[inline] 247 | unsafe fn mappings_mut<'a>( 248 | _scope: &'a (), 249 | mappings: *mut Mappings, 250 | ) -> &'a mut Mappings { 251 | mappings.as_mut().unwrap() 252 | } 253 | 254 | extern "C" { 255 | fn mapping_callback( 256 | // These two parameters are always valid. 257 | generated_line: u32, 258 | generated_column: u32, 259 | 260 | // The `last_generated_column` parameter is only valid if 261 | // `has_last_generated_column` is `true`. 262 | has_last_generated_column: bool, 263 | last_generated_column: u32, 264 | 265 | // The `source`, `original_line`, and `original_column` parameters are 266 | // only valid if `has_original` is `true`. 267 | has_original: bool, 268 | source: u32, 269 | original_line: u32, 270 | original_column: u32, 271 | 272 | // The `name` parameter is only valid if `has_name` is `true`. 273 | has_name: bool, 274 | name: u32, 275 | ); 276 | } 277 | 278 | #[inline] 279 | unsafe fn invoke_mapping_callback(mapping: &Mapping) { 280 | let generated_line = mapping.generated_line; 281 | let generated_column = mapping.generated_column; 282 | 283 | let (has_last_generated_column, last_generated_column) = 284 | if let Some(last_generated_column) = mapping.last_generated_column { 285 | (true, last_generated_column) 286 | } else { 287 | (false, 0) 288 | }; 289 | 290 | let (has_original, source, original_line, original_column, has_name, name) = 291 | if let Some(original) = mapping.original.as_ref() { 292 | let (has_name, name) = if let Some(name) = original.name { 293 | (true, name) 294 | } else { 295 | (false, 0) 296 | }; 297 | 298 | ( 299 | true, 300 | original.source, 301 | original.original_line, 302 | original.original_column, 303 | has_name, 304 | name, 305 | ) 306 | } else { 307 | (false, 0, 0, 0, false, 0) 308 | }; 309 | 310 | mapping_callback( 311 | generated_line, 312 | generated_column, 313 | has_last_generated_column, 314 | last_generated_column, 315 | has_original, 316 | source, 317 | original_line, 318 | original_column, 319 | has_name, 320 | name, 321 | ); 322 | } 323 | 324 | /// Invoke the `mapping_callback` on each mapping in the given `Mappings` 325 | /// structure, in order of generated location. 326 | #[no_mangle] 327 | pub extern "C" fn by_generated_location(mappings: *mut Mappings) { 328 | let this_scope = (); 329 | let mappings = unsafe { mappings_mut(&this_scope, mappings) }; 330 | 331 | mappings 332 | .by_generated_location() 333 | .iter() 334 | .for_each(|m| unsafe { 335 | invoke_mapping_callback(m); 336 | }); 337 | } 338 | 339 | /// Compute column spans for the given mappings. 340 | #[no_mangle] 341 | pub extern "C" fn compute_column_spans(mappings: *mut Mappings) { 342 | let this_scope = (); 343 | let mappings = unsafe { mappings_mut(&this_scope, mappings) }; 344 | 345 | mappings.compute_column_spans(); 346 | } 347 | 348 | /// Invoke the `mapping_callback` on each mapping in the given `Mappings` 349 | /// structure that has original location information, in order of original 350 | /// location. 351 | #[no_mangle] 352 | pub extern "C" fn by_original_location(mappings: *mut Mappings) { 353 | let this_scope = (); 354 | let mappings = unsafe { mappings_mut(&this_scope, mappings) }; 355 | 356 | mappings.by_original_location().for_each(|m| unsafe { 357 | invoke_mapping_callback(m); 358 | }); 359 | } 360 | 361 | #[inline] 362 | fn u32_to_bias(bias: u32) -> Bias { 363 | match bias { 364 | 1 => Bias::GreatestLowerBound, 365 | 2 => Bias::LeastUpperBound, 366 | otherwise => if cfg!(debug_assertions) { 367 | panic!( 368 | "Invalid `Bias = {}`; must be `Bias::GreatestLowerBound = {}` or \ 369 | `Bias::LeastUpperBound = {}`", 370 | otherwise, 371 | Bias::GreatestLowerBound as u32, 372 | Bias::LeastUpperBound as u32, 373 | ) 374 | } else { 375 | process::abort() 376 | }, 377 | } 378 | } 379 | 380 | /// Find the mapping for the given generated location, if any exists. 381 | /// 382 | /// If a mapping is found, the `mapping_callback` is invoked with it 383 | /// once. Otherwise, the `mapping_callback` is not invoked at all. 384 | #[no_mangle] 385 | pub extern "C" fn original_location_for( 386 | mappings: *mut Mappings, 387 | generated_line: u32, 388 | generated_column: u32, 389 | bias: u32, 390 | ) { 391 | let this_scope = (); 392 | let mappings = unsafe { mappings_mut(&this_scope, mappings) }; 393 | let bias = u32_to_bias(bias); 394 | 395 | if let Some(m) = mappings.original_location_for(generated_line, generated_column, bias) { 396 | unsafe { 397 | invoke_mapping_callback(m); 398 | } 399 | } 400 | } 401 | 402 | /// Find the mapping for the given original location, if any exists. 403 | /// 404 | /// If a mapping is found, the `mapping_callback` is invoked with it 405 | /// once. Otherwise, the `mapping_callback` is not invoked at all. 406 | #[no_mangle] 407 | pub extern "C" fn generated_location_for( 408 | mappings: *mut Mappings, 409 | source: u32, 410 | original_line: u32, 411 | original_column: u32, 412 | bias: u32, 413 | ) { 414 | let this_scope = (); 415 | let mappings = unsafe { mappings_mut(&this_scope, mappings) }; 416 | let bias = u32_to_bias(bias); 417 | 418 | if let Some(m) = mappings.generated_location_for(source, original_line, original_column, bias) { 419 | unsafe { 420 | invoke_mapping_callback(m); 421 | } 422 | } 423 | } 424 | 425 | /// Find all mappings for the given original location, and invoke the 426 | /// `mapping_callback` on each of them. 427 | /// 428 | /// If `has_original_column` is `true`, then the `mapping_callback` is only 429 | /// invoked with mappings with matching source and original line **and** 430 | /// original column is equal to `original_column`. If `has_original_column` is 431 | /// `false`, then the `original_column` argument is ignored, and the 432 | /// `mapping_callback` is invoked on all mappings with matching source and 433 | /// original line. 434 | #[no_mangle] 435 | pub extern "C" fn all_generated_locations_for( 436 | mappings: *mut Mappings, 437 | source: u32, 438 | original_line: u32, 439 | has_original_column: bool, 440 | original_column: u32, 441 | ) { 442 | let this_scope = (); 443 | let mappings = unsafe { mappings_mut(&this_scope, mappings) }; 444 | 445 | let original_column = if has_original_column { 446 | Some(original_column) 447 | } else { 448 | None 449 | }; 450 | 451 | for m in mappings.all_generated_locations_for(source, original_line, original_column) { 452 | unsafe { 453 | invoke_mapping_callback(m); 454 | } 455 | } 456 | } 457 | -------------------------------------------------------------------------------- /source-map-mappings-wasm-api/who-calls.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import argparse 4 | import re 5 | import subprocess 6 | 7 | DESC = """ 8 | 9 | List the callers of some function in the given `.wasm` file. 10 | 11 | Constructs the call graph of functions in the `.wasm` file and then queries 12 | edges in that call graph. 13 | 14 | Requires that the `wasm-objdump` tool from the WABT[0] is installed and on the 15 | `$PATH`. 16 | 17 | [0]: https://github.com/WebAssembly/wabt 18 | 19 | ## Example Usage 20 | 21 | Print every caller of `std::panicking::begin_panic`: 22 | 23 | $ ./who-calls.py path/to/something.wasm \\ 24 | --function "std::panicking::begin_panic::h59c9bbae5c8cc295" 25 | 26 | Print the top 5 largest functions and their callers: 27 | 28 | $ ./who-calls.py path/to/something.wasm --top 29 | 30 | """ 31 | 32 | parser = argparse.ArgumentParser( 33 | formatter_class=argparse.RawDescriptionHelpFormatter, 34 | description=DESC) 35 | 36 | parser.add_argument( 37 | "wasm_file", 38 | type=str, 39 | help="The input `.wasm` file.") 40 | 41 | parser.add_argument( 42 | "--function", 43 | type=str, 44 | help="The function whose callers should be listed.") 45 | 46 | parser.add_argument( 47 | "-t", 48 | "--top", 49 | type=int, 50 | default=None, 51 | help="Display the largest N functions and their callers") 52 | 53 | parser.add_argument( 54 | "-d", 55 | "--max-depth", 56 | type=int, 57 | default=None, 58 | help="The maximum call stack depth to display") 59 | 60 | def decode(f): 61 | return f.decode(encoding="utf-8", errors="ignore") 62 | 63 | def run(cmd, **kwargs): 64 | kwargs["stdout"] = subprocess.PIPE 65 | child = subprocess.run(cmd, **kwargs) 66 | if child.returncode != 0: 67 | raise Exception("{} did not exit OK".format(str(cmd))) 68 | return decode(child.stdout) 69 | 70 | def disassemble(args): 71 | return run(["wasm-objdump", "-d", args.wasm_file]) 72 | 73 | START_FUNCTION = re.compile(r"^(\w+) <([\w<>:\s]+)>:$") 74 | CALL_FUNCTION = re.compile(r"^ \w+: [\w ]*\|\s*call \w+ <([\w<>:\s]+)>$") 75 | 76 | def parse_call_graph(disassembly, args): 77 | call_graph = {} 78 | current_function = None 79 | 80 | for line in disassembly.splitlines(): 81 | match = re.match(START_FUNCTION, line) 82 | if match: 83 | current_function = match.groups()[1] 84 | call_graph[current_function] = set() 85 | continue 86 | 87 | match = re.match(CALL_FUNCTION, line) 88 | if match and current_function: 89 | call_graph[current_function].add(match.groups()[0]) 90 | 91 | return call_graph 92 | 93 | def parse_top_functions(disassembly, args): 94 | functions = [] 95 | last_function = None 96 | 97 | for line in disassembly.splitlines(): 98 | match = re.match(START_FUNCTION, line) 99 | if match: 100 | (start, function) = match.groups() 101 | start = int(start, 16) 102 | if last_function: 103 | (f, last_start) = last_function 104 | functions.append((f, start - last_start)) 105 | last_function = (function, start) 106 | 107 | top_functions = sorted(functions, key=lambda a: a[1], reverse=True) 108 | return top_functions[:args.top] 109 | 110 | def reverse_call_graph(call_graph, args): 111 | reversed_call_graph = {} 112 | 113 | for function, calls in call_graph.items(): 114 | if function not in reversed_call_graph: 115 | reversed_call_graph[function] = set() 116 | 117 | for call in calls: 118 | if call not in reversed_call_graph: 119 | reversed_call_graph[call] = set() 120 | reversed_call_graph[call].add(function) 121 | 122 | return reversed_call_graph 123 | 124 | def print_callers(reversed_call_graph, args, function=None, depth=0, seen=set()): 125 | if not function: 126 | function = args.function 127 | seen.add(function) 128 | 129 | if depth == 0: 130 | depth += 1 131 | print("{}".format(function)) 132 | if function not in reversed_call_graph: 133 | print(" ") 134 | return 135 | 136 | if args.max_depth is None or depth < args.max_depth: 137 | for caller in reversed_call_graph[function]: 138 | if caller in seen: 139 | continue 140 | 141 | indent = "" 142 | for _ in range(0, depth): 143 | indent += " " 144 | 145 | print("{}⬑ {}".format(indent, caller)) 146 | 147 | print_callers(reversed_call_graph, args, function=caller, depth=depth+1, seen=seen) 148 | 149 | seen.remove(function) 150 | 151 | def main(): 152 | args = parser.parse_args() 153 | disassembly = disassemble(args) 154 | call_graph = parse_call_graph(disassembly, args) 155 | reversed_call_graph = reverse_call_graph(call_graph, args) 156 | 157 | if args.function: 158 | print_callers(reversed_call_graph, args) 159 | elif args.top: 160 | top_functions = parse_top_functions(disassembly, args) 161 | for f, size in top_functions: 162 | print(size, "bytes: ", end="") 163 | print_callers(reversed_call_graph, args, function=f) 164 | else: 165 | raise Exception("Must use one of --function or --top") 166 | 167 | if __name__ == "__main__": 168 | main() 169 | -------------------------------------------------------------------------------- /src/comparators.rs: -------------------------------------------------------------------------------- 1 | //! Comparator functions for sorting mappings in different ways. 2 | 3 | use super::{Mapping, OriginalLocation}; 4 | use std::cmp::Ordering; 5 | use std::fmt; 6 | 7 | /// A function that can compare two `T`s. 8 | pub trait ComparatorFunction: fmt::Debug { 9 | /// Compare the given values. 10 | fn compare(&T, &T) -> Ordering; 11 | } 12 | 13 | impl ComparatorFunction> for F 14 | where 15 | F: ComparatorFunction, 16 | { 17 | #[inline] 18 | fn compare(a: &Option, b: &Option) -> Ordering { 19 | match (a, b) { 20 | (&None, &None) => Ordering::Equal, 21 | (&Some(_), &None) => Ordering::Less, 22 | (&None, &Some(_)) => Ordering::Greater, 23 | (&Some(ref a), &Some(ref b)) => F::compare(a, b), 24 | } 25 | } 26 | } 27 | 28 | // Yes, using this style of comparison instead of `cmp.then(cmp2).then(cmp3)` is 29 | // actually a big performance win in practice: 30 | // 31 | // ``` 32 | // $ cargo benchcmp control variable 33 | // name control ns/iter variable ns/iter diff ns/iter diff % speedup 34 | // bench_parse_part_of_scala_js_source_map 2,029,981 1,290,716 -739,265 -36.42% x 1.57 35 | // ``` 36 | // 37 | // This doesn't seem right, but you can't argue with those numbers... 38 | macro_rules! compare { 39 | ($a:expr, $b:expr) => { 40 | let cmp = ($a as i64) - ($b as i64); 41 | if cmp < 0 { 42 | return Ordering::Less; 43 | } else if cmp > 0 { 44 | return Ordering::Greater; 45 | } 46 | } 47 | } 48 | 49 | /// Sort mappings by their generated location, but don't compare generated 50 | /// lines. This is useful for when we know that all mappings being sorted have 51 | /// the same generated line number. 52 | #[derive(Debug)] 53 | pub struct ByGeneratedTail; 54 | 55 | impl ComparatorFunction for ByGeneratedTail { 56 | #[inline] 57 | fn compare(a: &Mapping, b: &Mapping) -> Ordering { 58 | compare!(a.generated_column, b.generated_column); 59 | ByOriginalLocation::compare(&a.original, &b.original) 60 | } 61 | } 62 | 63 | /// Sort mappings by their original locations, breaking ties by their generated 64 | /// locations. 65 | #[derive(Debug)] 66 | pub struct ByOriginalLocation; 67 | 68 | impl ComparatorFunction for ByOriginalLocation { 69 | #[inline] 70 | fn compare(a: &Mapping, b: &Mapping) -> Ordering { 71 | let c = ByOriginalLocation::compare(&a.original, &b.original); 72 | match c { 73 | Ordering::Less | Ordering::Greater => c, 74 | Ordering::Equal => { 75 | compare!(a.generated_line, b.generated_line); 76 | compare!(a.generated_column, b.generated_column); 77 | Ordering::Equal 78 | } 79 | } 80 | } 81 | } 82 | 83 | impl ComparatorFunction for ByOriginalLocation { 84 | #[inline] 85 | fn compare(a: &OriginalLocation, b: &OriginalLocation) -> Ordering { 86 | compare!(a.source, b.source); 87 | compare!(a.original_line, b.original_line); 88 | compare!(a.original_column, b.original_column); 89 | a.name.cmp(&b.name) 90 | } 91 | } 92 | 93 | /// Assuming mappings are in the same original source, sort mappings by their 94 | /// original locations, breaking ties by their generated locations. 95 | #[derive(Debug)] 96 | pub struct ByOriginalLocationSameSource; 97 | 98 | impl ComparatorFunction for ByOriginalLocationSameSource { 99 | #[inline] 100 | fn compare(a: &Mapping, b: &Mapping) -> Ordering { 101 | let c = ByOriginalLocationSameSource::compare(&a.original, &b.original); 102 | match c { 103 | Ordering::Less | Ordering::Greater => c, 104 | Ordering::Equal => { 105 | compare!(a.generated_line, b.generated_line); 106 | compare!(a.generated_column, b.generated_column); 107 | Ordering::Equal 108 | } 109 | } 110 | } 111 | } 112 | 113 | impl ComparatorFunction for ByOriginalLocationSameSource { 114 | #[inline] 115 | fn compare(a: &OriginalLocation, b: &OriginalLocation) -> Ordering { 116 | debug_assert_eq!(a.source, b.source); 117 | compare!(a.original_line, b.original_line); 118 | compare!(a.original_column, b.original_column); 119 | a.name.cmp(&b.name) 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | /*! 2 | 3 | [![](https://docs.rs/source-map-mappings/badge.svg)](https://docs.rs/source-map-mappings/) [![](https://img.shields.io/crates/v/source-map-mappings.svg)](https://crates.io/crates/source-map-mappings) [![](https://img.shields.io/crates/d/source-map-mappings.png)](https://crates.io/crates/source-map-mappings) [![Build Status](https://travis-ci.org/fitzgen/source-map-mappings.png?branch=master)](https://travis-ci.org/fitzgen/source-map-mappings) 4 | 5 | Parse the `"mappings"` string from a source map. 6 | 7 | This is intended to be compiled to WebAssembly and eventually used from the 8 | [`mozilla/source-map`][source-map] library. This is **not** a general purpose 9 | source maps library. 10 | 11 | [source-map]: https://github.com/mozilla/source-map 12 | 13 | * [Documentation](#documentation) 14 | * [License](#license) 15 | * [Contributing](#contributing) 16 | 17 | ## Documentation 18 | 19 | [📚 Documentation on `docs.rs` 📚][docs] 20 | 21 | [docs]: https://docs.rs/source-map-mappings 22 | 23 | ## License 24 | 25 | Licensed under either of 26 | 27 | * [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0) 28 | 29 | * [MIT license](http://opensource.org/licenses/MIT) 30 | 31 | at your option. 32 | 33 | ## Contributing 34 | 35 | See 36 | [CONTRIBUTING.md](https://github.com/fitzgen/source-map-mappings/blob/master/CONTRIBUTING.md) 37 | for hacking. 38 | 39 | Unless you explicitly state otherwise, any contribution intentionally submitted 40 | for inclusion in the work by you, as defined in the Apache-2.0 license, shall be 41 | dual licensed as above, without any additional terms or conditions. 42 | 43 | */ 44 | 45 | #![deny(missing_debug_implementations)] 46 | #![deny(missing_docs)] 47 | 48 | extern crate rand; 49 | extern crate vlq; 50 | 51 | pub mod comparators; 52 | 53 | use comparators::ComparatorFunction; 54 | use std::cmp; 55 | use std::marker::PhantomData; 56 | use std::mem; 57 | use std::slice; 58 | use std::u32; 59 | 60 | /// Errors that can occur during parsing. 61 | #[derive(Copy, Clone, Debug)] 62 | #[repr(u32)] 63 | pub enum Error { 64 | // NB: 0 is reserved for OK. 65 | /// The mappings contained a negative line, column, source index, or name 66 | /// index. 67 | UnexpectedNegativeNumber = 1, 68 | 69 | /// The mappings contained a number larger than `u32::MAX`. 70 | UnexpectedlyBigNumber = 2, 71 | 72 | /// Reached EOF while in the middle of parsing a VLQ. 73 | VlqUnexpectedEof = 3, 74 | 75 | /// Encountered an invalid base 64 character while parsing a VLQ. 76 | VlqInvalidBase64 = 4, 77 | 78 | /// VLQ encountered a number that, when decoded, would not fit in 79 | /// an i64. 80 | VlqOverflow = 5, 81 | } 82 | 83 | impl From for Error { 84 | #[inline] 85 | fn from(e: vlq::Error) -> Error { 86 | match e { 87 | vlq::Error::UnexpectedEof => Error::VlqUnexpectedEof, 88 | vlq::Error::InvalidBase64(_) => Error::VlqInvalidBase64, 89 | vlq::Error::Overflow => Error::VlqOverflow, 90 | } 91 | } 92 | } 93 | 94 | /// When doing fuzzy searching, whether to slide the next larger or next smaller 95 | /// mapping from the queried location. 96 | #[derive(Copy, Clone, Debug, PartialEq, Eq)] 97 | #[repr(u32)] 98 | pub enum Bias { 99 | // XXX: make sure these values always match `mozilla/source-map`'s 100 | // `SourceMapConsumer.{GreatestLower,LeastUpper}Bound` values! 101 | /// Slide to the next smaller mapping. 102 | GreatestLowerBound = 1, 103 | 104 | /// Slide to the next larger mapping. 105 | LeastUpperBound = 2, 106 | } 107 | 108 | impl Default for Bias { 109 | #[inline] 110 | fn default() -> Bias { 111 | Bias::GreatestLowerBound 112 | } 113 | } 114 | 115 | /// A trait for defining a set of RAII types that can observe the start and end 116 | /// of various operations and queries we perform in their constructors and 117 | /// destructors. 118 | /// 119 | /// This is also implemented for `()` as the "null observer" that doesn't 120 | /// actually do anything. 121 | pub trait Observer: Default { 122 | /// Observe the parsing of the `"mappings"` string. 123 | type ParseMappings: Default; 124 | 125 | /// Observe sorting parsed mappings by original location. 126 | type SortByOriginalLocation: Default; 127 | 128 | /// Observe sorting parsed mappings by generated location. 129 | type SortByGeneratedLocation: Default; 130 | 131 | /// Observe computing column spans. 132 | type ComputeColumnSpans: Default; 133 | 134 | /// Observe querying what the original location for some generated location 135 | /// is. 136 | type OriginalLocationFor: Default; 137 | 138 | /// Observe querying what the generated location for some original location 139 | /// is. 140 | type GeneratedLocationFor: Default; 141 | 142 | /// Observe querying what all generated locations for some original location 143 | /// is. 144 | type AllGeneratedLocationsFor: Default; 145 | } 146 | 147 | impl Observer for () { 148 | type ParseMappings = (); 149 | type SortByOriginalLocation = (); 150 | type SortByGeneratedLocation = (); 151 | type ComputeColumnSpans = (); 152 | type OriginalLocationFor = (); 153 | type GeneratedLocationFor = (); 154 | type AllGeneratedLocationsFor = (); 155 | } 156 | 157 | #[derive(Debug)] 158 | enum LazilySorted { 159 | Sorted(Vec, PhantomData, PhantomData), 160 | Unsorted(Vec), 161 | } 162 | 163 | impl LazilySorted 164 | where 165 | F: comparators::ComparatorFunction, 166 | O: Default, 167 | { 168 | #[inline] 169 | fn sort(&mut self) -> &[T] { 170 | let me = mem::replace(self, LazilySorted::Unsorted(vec![])); 171 | let items = match me { 172 | LazilySorted::Sorted(items, ..) => items, 173 | LazilySorted::Unsorted(mut items) => { 174 | let _observer = O::default(); 175 | items.sort_unstable_by(F::compare); 176 | items 177 | } 178 | }; 179 | mem::replace(self, LazilySorted::Sorted(items, PhantomData, PhantomData)); 180 | unwrap(self.sorted()) 181 | } 182 | 183 | #[inline] 184 | fn unsorted(&mut self) -> Option<&mut Vec> { 185 | match *self { 186 | LazilySorted::Unsorted(ref mut items) => Some(items), 187 | LazilySorted::Sorted(..) => None, 188 | } 189 | } 190 | 191 | #[inline] 192 | fn sorted(&self) -> Option<&[T]> { 193 | match *self { 194 | LazilySorted::Sorted(ref items, ..) => Some(items), 195 | LazilySorted::Unsorted(_) => None, 196 | } 197 | } 198 | 199 | #[inline] 200 | fn is_empty(&self) -> bool { 201 | match *self { 202 | LazilySorted::Sorted(ref items, ..) | 203 | LazilySorted::Unsorted(ref items) => items.is_empty() 204 | } 205 | } 206 | } 207 | 208 | /// A parsed set of mappings that can be queried. 209 | /// 210 | /// Constructed via `parse_mappings`. 211 | #[derive(Debug)] 212 | pub struct Mappings 213 | where 214 | O: Observer 215 | { 216 | by_generated: Vec, 217 | computed_column_spans: bool, 218 | observer: O, 219 | 220 | // The `by_original` field maps source index to mappings within that 221 | // original source. This lets us essentially do bucket sort on a per-source 222 | // basis, and also enables lazily sorting different source's mappings. 223 | by_original: Option>>, 224 | } 225 | 226 | #[cfg(debug_assertions)] 227 | fn unwrap(o: Option) -> T { 228 | o.unwrap() 229 | } 230 | 231 | #[cfg(not(debug_assertions))] 232 | #[inline] 233 | fn unwrap(o: Option) -> T { 234 | use std::process; 235 | match o { 236 | Some(t) => t, 237 | None => process::abort(), 238 | } 239 | } 240 | 241 | impl Mappings { 242 | /// Get the full set of mappings, ordered by generated location. 243 | #[inline] 244 | pub fn by_generated_location(&self) -> &[Mapping] { 245 | &self.by_generated 246 | } 247 | 248 | /// Compute the last generated column of each mapping. 249 | /// 250 | /// After this method has been called, any mappings with 251 | /// `last_generated_column == None` means that the mapping spans to the end 252 | /// of the line. 253 | #[inline] 254 | pub fn compute_column_spans(&mut self) { 255 | if self.computed_column_spans { 256 | return; 257 | } 258 | self.compute_column_spans_slow_path(); 259 | } 260 | 261 | #[inline(never)] 262 | fn compute_column_spans_slow_path(&mut self) { 263 | debug_assert!(!self.computed_column_spans); 264 | 265 | let _observer = O::ComputeColumnSpans::default(); 266 | 267 | let mut by_generated = self.by_generated.iter_mut().peekable(); 268 | while let Some(this_mapping) = by_generated.next() { 269 | if let Some(next_mapping) = by_generated.peek() { 270 | if this_mapping.generated_line == next_mapping.generated_line { 271 | this_mapping.last_generated_column = Some(next_mapping.generated_column); 272 | } 273 | } 274 | } 275 | 276 | self.computed_column_spans = true; 277 | } 278 | 279 | #[inline] 280 | fn source_buckets(&mut self) -> &mut [LazilySorted] { 281 | if let Some(ref mut buckets) = self.by_original { 282 | return buckets; 283 | } 284 | self.source_buckets_slow_path() 285 | } 286 | 287 | #[inline(never)] 288 | fn source_buckets_slow_path(&mut self) -> &mut [LazilySorted] { 289 | debug_assert!(self.by_original.is_none()); 290 | 291 | self.compute_column_spans(); 292 | 293 | let _observer = O::SortByOriginalLocation::default(); 294 | 295 | let mut originals = vec![]; 296 | for m in self.by_generated.iter().filter(|m| m.original.is_some()) { 297 | let source = unwrap(m.original.as_ref()).source as usize; 298 | while originals.len() <= source { 299 | originals.push(LazilySorted::Unsorted(vec![])); 300 | } 301 | unwrap(originals[source].unsorted()).push(m.clone()); 302 | } 303 | 304 | self.by_original = Some(originals); 305 | unwrap(self.by_original.as_mut().map(|x| &mut x[..])) 306 | } 307 | 308 | /// Get the set of mappings that have original location information for the 309 | /// given source and ordered by original location. 310 | #[inline] 311 | pub fn by_original_source(&mut self, source: u32) -> &[Mapping] { 312 | if let Some(ms) = self.source_buckets().get_mut(source as usize) { 313 | ms.sort() 314 | } else { 315 | &[] 316 | } 317 | } 318 | 319 | /// Iterate over all mappings that contain original location information, 320 | /// sorted by their original location information. 321 | #[inline] 322 | pub fn by_original_location(&mut self) -> ByOriginalLocation { 323 | ByOriginalLocation { 324 | buckets: self.source_buckets().iter_mut(), 325 | this_bucket: [].iter(), 326 | } 327 | } 328 | 329 | /// Get the mapping closest to the given generated location, if any exists. 330 | pub fn original_location_for( 331 | &self, 332 | generated_line: u32, 333 | generated_column: u32, 334 | bias: Bias, 335 | ) -> Option<&Mapping> { 336 | let _observer = O::OriginalLocationFor::default(); 337 | 338 | let by_generated = self.by_generated_location(); 339 | 340 | let position = by_generated.binary_search_by(|m| { 341 | m.generated_line 342 | .cmp(&generated_line) 343 | .then(m.generated_column.cmp(&generated_column)) 344 | }); 345 | 346 | match position { 347 | Ok(idx) => Some(&by_generated[idx]), 348 | Err(idx) => match bias { 349 | Bias::LeastUpperBound => by_generated.get(idx), 350 | Bias::GreatestLowerBound => if idx == 0 { 351 | None 352 | } else { 353 | by_generated.get(idx - 1) 354 | }, 355 | }, 356 | } 357 | } 358 | 359 | /// Get the mapping closest to the given original location, if any exists. 360 | pub fn generated_location_for( 361 | &mut self, 362 | source: u32, 363 | original_line: u32, 364 | original_column: u32, 365 | bias: Bias, 366 | ) -> Option<&Mapping> { 367 | let _observer = O::GeneratedLocationFor::default(); 368 | 369 | let position = { 370 | let by_original = self.by_original_source(source); 371 | 372 | by_original.binary_search_by(|m| { 373 | let original = unwrap(m.original.as_ref()); 374 | original 375 | .source 376 | .cmp(&source) 377 | .then(original.original_line.cmp(&original_line)) 378 | .then(original.original_column.cmp(&original_column)) 379 | }) 380 | }; 381 | 382 | let idx = match position { 383 | Ok(idx) => return Some(&self.by_original_source(source)[idx]), 384 | Err(idx) => idx, 385 | }; 386 | 387 | match bias { 388 | Bias::LeastUpperBound => if idx == self.by_original_source(source).len() { 389 | // Slide down to the next source's set of mappings. 390 | let mut source = source + 1; 391 | while unwrap(self.by_original.as_ref()) 392 | .get(source as usize) 393 | .map_or(false, |b| b.is_empty()) 394 | { 395 | source += 1; 396 | } 397 | unwrap(self.by_original.as_mut()) 398 | .get_mut(source as usize) 399 | .and_then(|ms| ms.sort().first()) 400 | } else { 401 | self.by_original_source(source).get(idx) 402 | }, 403 | 404 | Bias::GreatestLowerBound => if idx == 0 { 405 | if source == 0 { 406 | return None; 407 | } 408 | 409 | // Slide up to the previous source's set of mappings. 410 | let mut source = source - 1; 411 | while source > 0 && unwrap(self.by_original.as_ref()) 412 | .get(source as usize) 413 | .map_or(false, |b| b.is_empty()) 414 | { 415 | source -= 1; 416 | } 417 | unwrap(self.by_original.as_mut()) 418 | .get_mut(source as usize) 419 | .and_then(|ms| ms.sort().first()) 420 | } else { 421 | self.by_original_source(source).get(idx - 1) 422 | }, 423 | } 424 | } 425 | 426 | /// Get all mappings at the given original location. 427 | /// 428 | /// If `original_column` is `None`, get all mappings on the given source and 429 | /// original line regardless what columns they have. If `original_column` is 430 | /// `Some`, only return mappings for which all of source, original line, and 431 | /// original column match. 432 | pub fn all_generated_locations_for( 433 | &mut self, 434 | source: u32, 435 | original_line: u32, 436 | original_column: Option, 437 | ) -> AllGeneratedLocationsFor { 438 | let _observer = O::AllGeneratedLocationsFor::default(); 439 | 440 | let query_column = original_column.unwrap_or(0); 441 | 442 | let by_original = self.by_original_source(source); 443 | 444 | let compare = |m: &Mapping| { 445 | let original: &OriginalLocation = unwrap(m.original.as_ref()); 446 | debug_assert_eq!(unwrap(m.original.as_ref()).source, source); 447 | original.original_line.cmp(&original_line) 448 | .then(original.original_column.cmp(&query_column)) 449 | }; 450 | 451 | let idx = by_original.binary_search_by(&compare); 452 | let mut idx = match idx { 453 | Ok(idx) | Err(idx) => idx, 454 | }; 455 | 456 | // If there are multiple mappings for this original location, the binary 457 | // search gives no guarantees that this is the index for the first of 458 | // them, so back up to the first. 459 | while idx > 0 && compare(&by_original[idx - 1]) == cmp::Ordering::Equal { 460 | idx -= 1; 461 | } 462 | 463 | let (mappings, original_line, original_column) = if idx < by_original.len() { 464 | let orig = unwrap(by_original[idx].original.as_ref()); 465 | let mappings = by_original[idx..].iter(); 466 | 467 | // Fuzzy line matching only happens when we don't have a column. 468 | let original_line = if original_column.is_some() { 469 | original_line 470 | } else { 471 | orig.original_line 472 | }; 473 | 474 | let original_column = if original_column.is_some() { 475 | Some(orig.original_column) 476 | } else { 477 | None 478 | }; 479 | 480 | (mappings, original_line, original_column) 481 | } else { 482 | ([].iter(), original_line, original_column) 483 | }; 484 | 485 | AllGeneratedLocationsFor { 486 | mappings, 487 | original_line, 488 | original_column, 489 | } 490 | } 491 | } 492 | 493 | impl Default for Mappings { 494 | #[inline] 495 | fn default() -> Mappings { 496 | Mappings { 497 | by_generated: vec![], 498 | by_original: None, 499 | computed_column_spans: false, 500 | observer: Default::default(), 501 | } 502 | } 503 | } 504 | 505 | /// An iterator returned by `Mappings::by_original_location`. 506 | #[derive(Debug)] 507 | pub struct ByOriginalLocation<'a, O: 'a> { 508 | buckets: slice::IterMut<'a, LazilySorted>, 509 | this_bucket: slice::Iter<'a, Mapping>, 510 | } 511 | 512 | impl<'a, O: 'a + Default> Iterator for ByOriginalLocation<'a, O> { 513 | type Item = &'a Mapping; 514 | 515 | #[inline] 516 | fn next(&mut self) -> Option { 517 | loop { 518 | if let Some(m) = self.this_bucket.next() { 519 | return Some(m); 520 | } 521 | 522 | if let Some(b) = self.buckets.next() { 523 | self.this_bucket = b.sort().iter(); 524 | continue; 525 | } 526 | 527 | return None; 528 | } 529 | } 530 | } 531 | 532 | /// An iterator returned by `Mappings::all_generated_locations_for`. 533 | #[derive(Debug)] 534 | pub struct AllGeneratedLocationsFor<'a> { 535 | mappings: slice::Iter<'a, Mapping>, 536 | original_line: u32, 537 | original_column: Option, 538 | } 539 | 540 | impl<'a> Iterator for AllGeneratedLocationsFor<'a> { 541 | type Item = &'a Mapping; 542 | 543 | #[inline] 544 | fn next(&mut self) -> Option { 545 | match self.mappings.next() { 546 | None => None, 547 | Some(m) => { 548 | let m_orig = unwrap(m.original.as_ref()); 549 | 550 | if m_orig.original_line != self.original_line { 551 | return None; 552 | } 553 | 554 | if let Some(original_column) = self.original_column { 555 | if m_orig.original_column != original_column { 556 | return None; 557 | } 558 | } 559 | 560 | Some(m) 561 | } 562 | } 563 | } 564 | } 565 | 566 | /// A single bidirectional mapping. 567 | /// 568 | /// Always contains generated location information. 569 | /// 570 | /// Might contain original location information, and if so, might also have an 571 | /// associated name. 572 | #[derive(Clone, Debug, PartialEq, Eq)] 573 | pub struct Mapping { 574 | /// The generated line. 575 | pub generated_line: u32, 576 | 577 | /// The generated column. 578 | pub generated_column: u32, 579 | 580 | /// The end column of this mapping's generated location span. 581 | /// 582 | /// Before `Mappings::computed_column_spans` has been called, this is always 583 | /// `None`. After `Mappings::computed_column_spans` has been called, it 584 | /// either contains `Some` column at which the generated location ends 585 | /// (exclusive), or it contains `None` if it spans until the end of the 586 | /// generated line. 587 | pub last_generated_column: Option, 588 | 589 | /// The original location information, if any. 590 | pub original: Option, 591 | } 592 | 593 | impl Default for Mapping { 594 | #[inline] 595 | fn default() -> Mapping { 596 | Mapping { 597 | generated_line: 0, 598 | generated_column: 0, 599 | last_generated_column: None, 600 | original: None, 601 | } 602 | } 603 | } 604 | 605 | /// Original location information within a mapping. 606 | /// 607 | /// Contains a source filename, an original line, and an original column. Might 608 | /// also contain an associated name. 609 | #[derive(Clone, Debug, PartialEq, Eq)] 610 | pub struct OriginalLocation { 611 | /// The source filename. 612 | pub source: u32, 613 | 614 | /// The original line. 615 | pub original_line: u32, 616 | 617 | /// The original column. 618 | pub original_column: u32, 619 | 620 | /// The associated name, if any. 621 | pub name: Option, 622 | } 623 | 624 | #[inline] 625 | fn is_mapping_separator(byte: u8) -> bool { 626 | byte == b';' || byte == b',' 627 | } 628 | 629 | #[inline] 630 | fn read_relative_vlq(previous: &mut u32, input: &mut B) -> Result<(), Error> 631 | where 632 | B: Iterator, 633 | { 634 | let decoded = vlq::decode(input)?; 635 | let (new, overflowed) = (*previous as i64).overflowing_add(decoded); 636 | if overflowed || new > (u32::MAX as i64) { 637 | return Err(Error::UnexpectedlyBigNumber); 638 | } 639 | 640 | if new < 0 { 641 | return Err(Error::UnexpectedNegativeNumber); 642 | } 643 | 644 | *previous = new as u32; 645 | Ok(()) 646 | } 647 | 648 | /// Parse a source map's `"mappings"` string into a queryable `Mappings` 649 | /// structure. 650 | pub fn parse_mappings(input: &[u8]) -> Result, Error> { 651 | let _observer = O::ParseMappings::default(); 652 | 653 | let mut generated_line = 0; 654 | let mut generated_column = 0; 655 | let mut original_line = 0; 656 | let mut original_column = 0; 657 | let mut source = 0; 658 | let mut name = 0; 659 | let mut generated_line_start_index = 0; 660 | 661 | let mut mappings = Mappings::default(); 662 | 663 | // `input.len() / 2` is the upper bound on how many mappings the string 664 | // might contain. There would be some sequence like `A,A,A,...` or 665 | // `A;A;A;...`. 666 | let mut by_generated = Vec::with_capacity(input.len() / 2); 667 | 668 | let mut input = input.iter().cloned().peekable(); 669 | 670 | while let Some(byte) = input.peek().cloned() { 671 | match byte { 672 | b';' => { 673 | generated_line += 1; 674 | generated_column = 0; 675 | unwrap(input.next()); 676 | 677 | // Because mappings are sorted with regards to generated line 678 | // due to the encoding format, and sorting by generated location 679 | // starts by comparing generated line, we can sort only the 680 | // smaller subsequence of this generated line's mappings and end 681 | // up with a fully sorted array. 682 | if generated_line_start_index < by_generated.len() { 683 | let _observer = O::SortByGeneratedLocation::default(); 684 | by_generated[generated_line_start_index..].sort_unstable_by(comparators::ByGeneratedTail::compare); 685 | generated_line_start_index = by_generated.len(); 686 | } 687 | } 688 | b',' => { 689 | unwrap(input.next()); 690 | } 691 | _ => { 692 | let mut mapping = Mapping::default(); 693 | mapping.generated_line = generated_line; 694 | 695 | // First is a generated column that is always present. 696 | read_relative_vlq(&mut generated_column, &mut input)?; 697 | mapping.generated_column = generated_column as u32; 698 | 699 | // Read source, original line, and original column if the 700 | // mapping has them. 701 | mapping.original = if input.peek().cloned().map_or(true, is_mapping_separator) { 702 | None 703 | } else { 704 | read_relative_vlq(&mut source, &mut input)?; 705 | read_relative_vlq(&mut original_line, &mut input)?; 706 | read_relative_vlq(&mut original_column, &mut input)?; 707 | 708 | Some(OriginalLocation { 709 | source: source, 710 | original_line: original_line, 711 | original_column: original_column, 712 | name: if input.peek().cloned().map_or(true, is_mapping_separator) { 713 | None 714 | } else { 715 | read_relative_vlq(&mut name, &mut input)?; 716 | Some(name) 717 | }, 718 | }) 719 | }; 720 | 721 | by_generated.push(mapping); 722 | } 723 | } 724 | } 725 | 726 | if generated_line_start_index < by_generated.len() { 727 | let _observer = O::SortByGeneratedLocation::default(); 728 | by_generated[generated_line_start_index..].sort_unstable_by(comparators::ByGeneratedTail::compare); 729 | } 730 | 731 | mappings.by_generated = by_generated; 732 | Ok(mappings) 733 | } 734 | -------------------------------------------------------------------------------- /tests/cargo_readme_up_to_date.rs: -------------------------------------------------------------------------------- 1 | use std::fs::File; 2 | use std::io::Read; 3 | use std::process::Command; 4 | 5 | #[test] 6 | fn cargo_readme_up_to_date() { 7 | println!("Checking that `cargo readme > README.md` is up to date..."); 8 | 9 | let expected = Command::new("cargo") 10 | .arg("readme") 11 | .current_dir(env!("CARGO_MANIFEST_DIR")) 12 | .output() 13 | .expect("should run `cargo readme` OK") 14 | .stdout; 15 | let expected = String::from_utf8_lossy(&expected); 16 | 17 | let actual = { 18 | let mut file = File::open(concat!(env!("CARGO_MANIFEST_DIR"), "/README.md")) 19 | .expect("should open README.md file"); 20 | let mut s = String::new(); 21 | file.read_to_string(&mut s) 22 | .expect("should read contents of file to string"); 23 | s 24 | }; 25 | 26 | if actual != expected { 27 | panic!("Run `cargo readme > README.md` to update README.md"); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /tests/quickcheck.rs: -------------------------------------------------------------------------------- 1 | #[macro_use] 2 | extern crate quickcheck; 3 | extern crate source_map_mappings; 4 | extern crate vlq; 5 | 6 | use quickcheck::{Arbitrary, Gen}; 7 | use source_map_mappings::{Bias, Error}; 8 | use std::cmp::Ordering; 9 | use std::fmt; 10 | use std::i64; 11 | use std::iter; 12 | use std::marker::PhantomData; 13 | 14 | trait VlqRange: 'static + Send + Copy + Clone + fmt::Debug + fmt::Display { 15 | fn low() -> i64; 16 | fn high() -> i64; 17 | } 18 | 19 | #[derive(Copy, Clone, Debug)] 20 | struct Vlq(i64, PhantomData); 21 | 22 | impl Arbitrary for Vlq 23 | where 24 | R: VlqRange, 25 | { 26 | fn arbitrary(g: &mut G) -> Self { 27 | Vlq(g.gen_range(R::low(), R::high()), PhantomData) 28 | } 29 | 30 | fn shrink(&self) -> Box> { 31 | Box::new(self.0.shrink().map(|x| Vlq(x, PhantomData))) 32 | } 33 | } 34 | 35 | impl fmt::Display for Vlq { 36 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 37 | let mut v = vec![]; 38 | vlq::encode(self.0, &mut v).unwrap(); 39 | write!(f, "{}", String::from_utf8_lossy(&v)) 40 | } 41 | } 42 | 43 | #[derive(Clone, Debug)] 44 | enum Mapping { 45 | Generated { 46 | generated_column: Vlq, 47 | }, 48 | Original { 49 | generated_column: Vlq, 50 | source: Vlq, 51 | original_line: Vlq, 52 | original_column: Vlq, 53 | }, 54 | OriginalWithName { 55 | generated_column: Vlq, 56 | source: Vlq, 57 | original_line: Vlq, 58 | original_column: Vlq, 59 | name: Vlq, 60 | }, 61 | } 62 | 63 | impl Arbitrary for Mapping 64 | where 65 | R: VlqRange, 66 | { 67 | fn arbitrary(g: &mut G) -> Self { 68 | match g.gen_range(0, 3) { 69 | 0 => Mapping::Generated { 70 | generated_column: Vlq::::arbitrary(g), 71 | }, 72 | 1 => Mapping::Original { 73 | generated_column: Vlq::::arbitrary(g), 74 | source: Vlq::::arbitrary(g), 75 | original_line: Vlq::::arbitrary(g), 76 | original_column: Vlq::::arbitrary(g), 77 | }, 78 | 2 => Mapping::OriginalWithName { 79 | generated_column: Vlq::::arbitrary(g), 80 | source: Vlq::::arbitrary(g), 81 | original_line: Vlq::::arbitrary(g), 82 | original_column: Vlq::::arbitrary(g), 83 | name: Vlq::::arbitrary(g), 84 | }, 85 | _ => unreachable!(), 86 | } 87 | } 88 | 89 | fn shrink(&self) -> Box> { 90 | match *self { 91 | Mapping::Generated { generated_column } => Box::new( 92 | generated_column 93 | .shrink() 94 | .map(|generated_column| Mapping::Generated { generated_column }), 95 | ), 96 | Mapping::Original { 97 | generated_column, 98 | source, 99 | original_line, 100 | original_column, 101 | } => { 102 | let shrunkens = generated_column.shrink().zip( 103 | source 104 | .shrink() 105 | .zip(original_line.shrink().zip(original_column.shrink())), 106 | ); 107 | let shrunkens = shrunkens.map( 108 | move |(generated_column, (source, (original_line, original_column)))| { 109 | Mapping::Original { 110 | generated_column, 111 | source, 112 | original_line, 113 | original_column, 114 | } 115 | }, 116 | ); 117 | 118 | let generated = Mapping::Generated { generated_column }; 119 | Box::new(iter::once(generated).chain(shrunkens)) 120 | } 121 | Mapping::OriginalWithName { 122 | generated_column, 123 | source, 124 | original_line, 125 | original_column, 126 | name, 127 | } => { 128 | let shrunkens = generated_column.shrink().zip( 129 | source.shrink().zip( 130 | original_line 131 | .shrink() 132 | .zip(original_column.shrink().zip(name.shrink())), 133 | ), 134 | ); 135 | let shrunkens = shrunkens.map( 136 | move |( 137 | generated_column, 138 | (source, (original_line, (original_column, name))), 139 | )| { 140 | Mapping::OriginalWithName { 141 | generated_column, 142 | source, 143 | original_line, 144 | original_column, 145 | name, 146 | } 147 | }, 148 | ); 149 | 150 | let generated = Mapping::Generated { generated_column }; 151 | let original = Mapping::Original { 152 | generated_column, 153 | source, 154 | original_line, 155 | original_column, 156 | }; 157 | Box::new( 158 | iter::once(generated) 159 | .chain(iter::once(original)) 160 | .chain(shrunkens), 161 | ) 162 | } 163 | } 164 | } 165 | } 166 | 167 | impl fmt::Display for Mapping { 168 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 169 | match *self { 170 | Mapping::Generated { generated_column } => generated_column.fmt(f), 171 | Mapping::Original { 172 | generated_column, 173 | source, 174 | original_line, 175 | original_column, 176 | } => { 177 | generated_column.fmt(f)?; 178 | source.fmt(f)?; 179 | original_line.fmt(f)?; 180 | original_column.fmt(f) 181 | } 182 | Mapping::OriginalWithName { 183 | generated_column, 184 | source, 185 | original_line, 186 | original_column, 187 | name, 188 | } => { 189 | generated_column.fmt(f)?; 190 | source.fmt(f)?; 191 | original_line.fmt(f)?; 192 | original_column.fmt(f)?; 193 | name.fmt(f) 194 | } 195 | } 196 | } 197 | } 198 | 199 | #[derive(Clone, Debug)] 200 | struct GeneratedLine(Vec>); 201 | 202 | impl Arbitrary for GeneratedLine 203 | where 204 | R: VlqRange, 205 | { 206 | fn arbitrary(g: &mut G) -> Self { 207 | GeneratedLine(Vec::arbitrary(g)) 208 | } 209 | 210 | fn shrink(&self) -> Box> { 211 | Box::new(self.0.shrink().map(|v| GeneratedLine(v))) 212 | } 213 | } 214 | 215 | impl fmt::Display for GeneratedLine { 216 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 217 | let mut needs_comma = false; 218 | for m in &self.0 { 219 | if needs_comma { 220 | write!(f, ",")?; 221 | } 222 | m.fmt(f)?; 223 | needs_comma = true; 224 | } 225 | Ok(()) 226 | } 227 | } 228 | 229 | #[derive(Clone, Debug)] 230 | struct Mappings(Vec>); 231 | 232 | impl Arbitrary for Mappings 233 | where 234 | R: VlqRange, 235 | { 236 | fn arbitrary(g: &mut G) -> Self { 237 | Mappings(Vec::arbitrary(g)) 238 | } 239 | 240 | fn shrink(&self) -> Box> { 241 | Box::new(self.0.shrink().map(|v| Mappings(v))) 242 | } 243 | } 244 | 245 | impl fmt::Display for Mappings { 246 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 247 | let mut needs_semi = false; 248 | for line in &self.0 { 249 | if needs_semi { 250 | write!(f, ";")?; 251 | } 252 | line.fmt(f)?; 253 | needs_semi = true; 254 | } 255 | Ok(()) 256 | } 257 | } 258 | 259 | #[derive(Copy, Clone, Debug)] 260 | struct FullRange; 261 | 262 | impl fmt::Display for FullRange { 263 | fn fmt(&self, _: &mut fmt::Formatter) -> fmt::Result { 264 | Ok(()) 265 | } 266 | } 267 | 268 | impl VlqRange for FullRange { 269 | fn low() -> i64 { 270 | i64::MIN 271 | } 272 | fn high() -> i64 { 273 | i64::MAX 274 | } 275 | } 276 | 277 | #[derive(Copy, Clone, Debug)] 278 | struct SmallPositives; 279 | 280 | impl fmt::Display for SmallPositives { 281 | fn fmt(&self, _: &mut fmt::Formatter) -> fmt::Result { 282 | Ok(()) 283 | } 284 | } 285 | 286 | impl VlqRange for SmallPositives { 287 | fn low() -> i64 { 288 | 0 289 | } 290 | fn high() -> i64 { 291 | 5 292 | } 293 | } 294 | 295 | quickcheck! { 296 | fn parse_without_panicking(mappings: Mappings) -> () { 297 | let mappings_string = mappings.to_string(); 298 | let _ = source_map_mappings::parse_mappings::<()>(mappings_string.as_bytes()); 299 | } 300 | 301 | fn parse_valid_mappings(mappings: Mappings) -> Result<(), Error> { 302 | let mappings_string = mappings.to_string(); 303 | source_map_mappings::parse_mappings::<()>(mappings_string.as_bytes())?; 304 | Ok(()) 305 | } 306 | 307 | fn compute_column_spans(mappings: Mappings) -> Result<(), Error> { 308 | let mappings_string = mappings.to_string(); 309 | let mut mappings = source_map_mappings::parse_mappings::<()>(mappings_string.as_bytes())?; 310 | 311 | // Can compute column spans without panicking. 312 | mappings.compute_column_spans(); 313 | 314 | // And those column spans make sense. 315 | for window in mappings.by_generated_location().windows(2) { 316 | let this_mapping = &window[0]; 317 | let next_mapping = &window[1]; 318 | if this_mapping.generated_line == next_mapping.generated_line { 319 | assert_eq!(this_mapping.last_generated_column.unwrap(), next_mapping.generated_column); 320 | } else { 321 | assert!(this_mapping.last_generated_column.is_none()); 322 | } 323 | } 324 | 325 | Ok(()) 326 | } 327 | 328 | fn original_location_for( 329 | mappings: Mappings, 330 | line: u32, 331 | col: u32, 332 | lub: bool 333 | ) -> Result<(), Error> { 334 | let mappings_string = mappings.to_string(); 335 | let mappings = source_map_mappings::parse_mappings::<()>(mappings_string.as_bytes())?; 336 | if mappings.by_generated_location().is_empty() { 337 | return Ok(()); 338 | } 339 | 340 | // To make this more useful, wrap `line` and `col` around the maximum 341 | // line and column in the mappings respectively. 342 | let max_line = mappings.by_generated_location() 343 | .iter() 344 | .map(|m| m.generated_line) 345 | .max() 346 | .unwrap(); 347 | let max_col = mappings.by_generated_location() 348 | .iter() 349 | .map(|m| m.generated_column) 350 | .max() 351 | .unwrap(); 352 | let line = line % (max_line + 1); 353 | let col = col % (max_col + 1); 354 | 355 | let bias = if lub { 356 | Bias::LeastUpperBound 357 | } else { 358 | Bias::GreatestLowerBound 359 | }; 360 | 361 | // If we find a mapping, then it should either be an exact match or it 362 | // should have the proper ordering relation to our query line/column 363 | // based on the given bias. 364 | if let Some(mapping) = mappings.original_location_for(line, col, bias) { 365 | let found_line = mapping.generated_line; 366 | let found_col = mapping.generated_column; 367 | match line.cmp(&found_line).then(col.cmp(&found_col)) { 368 | Ordering::Equal => {} 369 | Ordering::Greater if bias == Bias::GreatestLowerBound => {} 370 | Ordering::Less if bias == Bias::LeastUpperBound => {} 371 | _ => panic!( 372 | "Found bad location {{ line = {}, col = {} }} when \ 373 | searching for {{ line = {}, col = {} }} with bias {:?}", 374 | found_line, 375 | found_col, 376 | line, 377 | col, 378 | bias 379 | ), 380 | } 381 | return Ok(()) 382 | } 383 | 384 | // If we didn't get any result, then every mapping should not match our 385 | // query, and should additionally be on the opposite side of ordering 386 | // from our requested bias. 387 | for m in mappings.by_generated_location().iter() { 388 | match m.generated_line.cmp(&line).then(m.generated_column.cmp(&col)) { 389 | Ordering::Equal => panic!("found matching mapping when we returned none"), 390 | Ordering::Less => { 391 | assert_eq!(bias, Bias::LeastUpperBound); 392 | } 393 | Ordering::Greater => { 394 | assert_eq!(bias, Bias::GreatestLowerBound); 395 | } 396 | } 397 | } 398 | 399 | Ok(()) 400 | } 401 | 402 | fn original_mappings_have_original( 403 | mappings: Mappings 404 | ) -> Result { 405 | let mappings_string = mappings.to_string(); 406 | let mut mappings = source_map_mappings::parse_mappings::<()>(mappings_string.as_bytes())?; 407 | Ok(mappings.by_original_location().all(|m| m.original.as_ref().is_some())) 408 | } 409 | 410 | fn generated_location_for( 411 | mappings: Mappings, 412 | source: u32, 413 | line: u32, 414 | col: u32, 415 | lub: bool 416 | ) -> Result<(), Error> { 417 | let mappings_string = mappings.to_string(); 418 | let mut mappings = source_map_mappings::parse_mappings::<()>(mappings_string.as_bytes())?; 419 | if !mappings.by_generated_location().iter().any(|m| m.original.is_some()) { 420 | return Ok(()); 421 | } 422 | 423 | // To make this more useful, wrap `source`, `line`, and `col` around the 424 | // maximums. 425 | let max_source = mappings.by_original_location() 426 | .map(|m| m.original.as_ref().unwrap().source) 427 | .max() 428 | .unwrap(); 429 | let max_line = mappings.by_original_location() 430 | .map(|m| m.original.as_ref().unwrap().original_line) 431 | .max() 432 | .unwrap(); 433 | let max_col = mappings.by_original_location() 434 | .map(|m| m.original.as_ref().unwrap().original_column) 435 | .max() 436 | .unwrap(); 437 | let source = source % (max_source + 1); 438 | let line = line % (max_line + 1); 439 | let col = col % (max_col + 1); 440 | 441 | let bias = if lub { 442 | Bias::LeastUpperBound 443 | } else { 444 | Bias::GreatestLowerBound 445 | }; 446 | 447 | // If we find a mapping, then it should either be an exact match or it 448 | // should have the proper ordering relation to our query line/column 449 | // based on the given bias. 450 | if let Some(mapping) = mappings.generated_location_for(source, line, col, bias) { 451 | let found_source = mapping.original.as_ref().unwrap().source; 452 | let found_line = mapping.original.as_ref().unwrap().original_line; 453 | let found_col = mapping.original.as_ref().unwrap().original_column; 454 | 455 | let order = source.cmp(&found_source) 456 | .then(line.cmp(&found_line)) 457 | .then(col.cmp(&found_col)); 458 | 459 | match order { 460 | Ordering::Equal => {} 461 | Ordering::Greater if bias == Bias::GreatestLowerBound => {} 462 | Ordering::Less if bias == Bias::LeastUpperBound => {} 463 | _ => panic!( 464 | "Found bad location {{ line = {}, col = {} }} when \ 465 | searching for {{ line = {}, col = {} }} with bias {:?}", 466 | found_line, 467 | found_col, 468 | line, 469 | col, 470 | bias 471 | ), 472 | } 473 | return Ok(()) 474 | } 475 | 476 | // If we didn't get any result, then every mapping should not match our 477 | // query, and should additionally be on the opposite side of ordering 478 | // from our requested bias. 479 | for m in mappings.by_original_location() { 480 | let m_orig = m.original.as_ref().unwrap(); 481 | let m_source = m_orig.source; 482 | let m_line = m_orig.original_line; 483 | let m_col = m_orig.original_column; 484 | 485 | let order = m_source.cmp(&source) 486 | .then(m_line.cmp(&line)) 487 | .then(m_col.cmp(&col)); 488 | 489 | match order { 490 | Ordering::Equal => panic!("found matching mapping when we returned none"), 491 | Ordering::Less => { 492 | assert_eq!(bias, Bias::LeastUpperBound); 493 | } 494 | Ordering::Greater => { 495 | assert_eq!(bias, Bias::GreatestLowerBound); 496 | } 497 | } 498 | } 499 | 500 | Ok(()) 501 | } 502 | 503 | fn all_generated_locations_for( 504 | mappings: Mappings, 505 | source: u32, 506 | line: u32, 507 | col: Option 508 | ) -> Result<(), Error> { 509 | let mappings_string = mappings.to_string(); 510 | let mut mappings = source_map_mappings::parse_mappings::<()>(mappings_string.as_bytes())?; 511 | if !mappings.by_generated_location().iter().any(|m| m.original.is_some()) { 512 | return Ok(()); 513 | } 514 | 515 | let max_source = mappings.by_original_location() 516 | .map(|m| m.original.as_ref().unwrap().source) 517 | .max() 518 | .unwrap(); 519 | let max_line = mappings.by_original_location() 520 | .map(|m| m.original.as_ref().unwrap().original_line) 521 | .max() 522 | .unwrap(); 523 | let max_col = mappings.by_original_location() 524 | .map(|m| m.original.as_ref().unwrap().original_column) 525 | .max() 526 | .unwrap(); 527 | let source = source % (max_source + 1); 528 | let mut line = line % (max_line + 1); 529 | let mut col = if let Some(col) = col { 530 | Some(col % (max_col + 1)) 531 | } else { 532 | None 533 | }; 534 | 535 | let mut count = 0; 536 | { 537 | let locations = mappings.all_generated_locations_for(source, line, col); 538 | 539 | for (idx, m) in locations.into_iter().enumerate() { 540 | count += 1; 541 | 542 | let m_orig = m.original.as_ref().unwrap(); 543 | 544 | // `all_generated_locations_for` does fuzzy searching: it will 545 | // slide down to the next original line if there are no mappings 546 | // on the queried line. Ditto for columns. This is to match 547 | // mozilla/source-map's behavior. 548 | if idx == 0 { 549 | if m_orig.original_line != line { 550 | assert!(m_orig.original_line > line); 551 | line = m_orig.original_line; 552 | } 553 | if let Some(c) = col { 554 | if c != m_orig.original_column { 555 | col = Some(m_orig.original_column); 556 | } 557 | } 558 | } 559 | 560 | assert_eq!( 561 | m_orig.original_line, 562 | line, 563 | "result location's line is our query's line", 564 | ); 565 | 566 | if let Some(col) = col { 567 | assert_eq!( 568 | m_orig.original_column, 569 | col, 570 | "result location's column is our query's column", 571 | ); 572 | } 573 | } 574 | } 575 | 576 | assert_eq!( 577 | count, 578 | mappings.by_original_location() 579 | .filter(|m| { 580 | let m_orig = m.original.as_ref().unwrap(); 581 | if m_orig.source != source || m_orig.original_line != line { 582 | return false; 583 | } 584 | if let Some(col) = col { 585 | if m_orig.original_column != col { 586 | return false; 587 | } 588 | } 589 | true 590 | }) 591 | .count(), 592 | "the iterator should find the right number of results" 593 | ); 594 | 595 | Ok(()) 596 | } 597 | } 598 | -------------------------------------------------------------------------------- /tests/tests.rs: -------------------------------------------------------------------------------- 1 | extern crate source_map_mappings; 2 | 3 | use source_map_mappings::{parse_mappings, Bias, Mapping, Mappings, OriginalLocation}; 4 | 5 | #[test] 6 | fn parse_empty_mappings() { 7 | let mut mappings = parse_mappings::<()>(&[]).expect("should parse OK"); 8 | assert!(mappings.by_generated_location().is_empty()); 9 | assert_eq!(mappings.by_original_location().count(), 0); 10 | } 11 | 12 | #[test] 13 | fn invalid_mappings() { 14 | assert!(parse_mappings::<()>(b"...").is_err()); 15 | } 16 | 17 | // From mozilla/source-map's test/util.js `exports.testMap`. 18 | const TEST_MAPPINGS: &'static [u8] = 19 | b"CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA"; 20 | 21 | #[test] 22 | fn can_parse_test_mappings_ok() { 23 | parse_mappings::<()>(TEST_MAPPINGS).unwrap(); 24 | } 25 | 26 | fn assert_generated_location_for( 27 | mappings: &mut Mappings, 28 | source: u32, 29 | original_line: u32, 30 | original_column: u32, 31 | bias: Bias, 32 | expected: Option, 33 | ) { 34 | let actual = mappings.generated_location_for(source, original_line, original_column, bias); 35 | assert_eq!(actual, expected.as_ref()); 36 | } 37 | 38 | fn assert_original_location_for( 39 | mappings: &mut Mappings, 40 | generated_line: u32, 41 | generated_column: u32, 42 | bias: Bias, 43 | expected: Option, 44 | ) { 45 | let actual = mappings.original_location_for(generated_line, generated_column, bias); 46 | assert_eq!(actual, expected.as_ref()); 47 | } 48 | 49 | fn assert_bidirectional(mappings: &mut Mappings, mapping: Mapping) { 50 | let orig = mapping.original.as_ref().unwrap(); 51 | for bias in &[Bias::GreatestLowerBound, Bias::LeastUpperBound] { 52 | assert_generated_location_for( 53 | mappings, 54 | orig.source, 55 | orig.original_line, 56 | orig.original_column, 57 | *bias, 58 | Some(mapping.clone()), 59 | ); 60 | 61 | assert_original_location_for( 62 | mappings, 63 | mapping.generated_line, 64 | mapping.generated_column, 65 | *bias, 66 | Some(mapping.clone()), 67 | ); 68 | } 69 | } 70 | 71 | #[test] 72 | fn test_mapping_back_exactly() { 73 | let mut mappings = parse_mappings::<()>(TEST_MAPPINGS).unwrap(); 74 | 75 | assert_bidirectional( 76 | &mut mappings, 77 | Mapping { 78 | generated_line: 0, 79 | generated_column: 1, 80 | last_generated_column: Some(5), 81 | original: Some(OriginalLocation { 82 | source: 0, 83 | original_line: 0, 84 | original_column: 1, 85 | name: None, 86 | }), 87 | }, 88 | ); 89 | assert_bidirectional( 90 | &mut mappings, 91 | Mapping { 92 | generated_line: 0, 93 | generated_column: 5, 94 | last_generated_column: Some(9), 95 | original: Some(OriginalLocation { 96 | source: 0, 97 | original_line: 0, 98 | original_column: 5, 99 | name: None, 100 | }), 101 | }, 102 | ); 103 | assert_bidirectional( 104 | &mut mappings, 105 | Mapping { 106 | generated_line: 0, 107 | generated_column: 9, 108 | last_generated_column: Some(18), 109 | original: Some(OriginalLocation { 110 | source: 0, 111 | original_line: 0, 112 | original_column: 11, 113 | name: None, 114 | }), 115 | }, 116 | ); 117 | assert_bidirectional( 118 | &mut mappings, 119 | Mapping { 120 | generated_line: 0, 121 | generated_column: 18, 122 | last_generated_column: Some(21), 123 | original: Some(OriginalLocation { 124 | source: 0, 125 | original_line: 0, 126 | original_column: 21, 127 | name: Some(0), 128 | }), 129 | }, 130 | ); 131 | assert_bidirectional( 132 | &mut mappings, 133 | Mapping { 134 | generated_line: 0, 135 | generated_column: 21, 136 | last_generated_column: Some(28), 137 | original: Some(OriginalLocation { 138 | source: 0, 139 | original_line: 1, 140 | original_column: 3, 141 | name: None, 142 | }), 143 | }, 144 | ); 145 | assert_bidirectional( 146 | &mut mappings, 147 | Mapping { 148 | generated_line: 0, 149 | generated_column: 28, 150 | last_generated_column: Some(32), 151 | original: Some(OriginalLocation { 152 | source: 0, 153 | original_line: 1, 154 | original_column: 10, 155 | name: Some(1), 156 | }), 157 | }, 158 | ); 159 | assert_bidirectional( 160 | &mut mappings, 161 | Mapping { 162 | generated_line: 0, 163 | generated_column: 32, 164 | last_generated_column: None, 165 | original: Some(OriginalLocation { 166 | source: 0, 167 | original_line: 1, 168 | original_column: 14, 169 | name: Some(0), 170 | }), 171 | }, 172 | ); 173 | 174 | assert_bidirectional( 175 | &mut mappings, 176 | Mapping { 177 | generated_line: 1, 178 | generated_column: 1, 179 | last_generated_column: Some(5), 180 | original: Some(OriginalLocation { 181 | source: 1, 182 | original_line: 0, 183 | original_column: 1, 184 | name: None, 185 | }), 186 | }, 187 | ); 188 | assert_bidirectional( 189 | &mut mappings, 190 | Mapping { 191 | generated_line: 1, 192 | generated_column: 5, 193 | last_generated_column: Some(9), 194 | original: Some(OriginalLocation { 195 | source: 1, 196 | original_line: 0, 197 | original_column: 5, 198 | name: None, 199 | }), 200 | }, 201 | ); 202 | assert_bidirectional( 203 | &mut mappings, 204 | Mapping { 205 | generated_line: 1, 206 | generated_column: 9, 207 | last_generated_column: Some(18), 208 | original: Some(OriginalLocation { 209 | source: 1, 210 | original_line: 0, 211 | original_column: 11, 212 | name: None, 213 | }), 214 | }, 215 | ); 216 | assert_bidirectional( 217 | &mut mappings, 218 | Mapping { 219 | generated_line: 1, 220 | generated_column: 18, 221 | last_generated_column: Some(21), 222 | original: Some(OriginalLocation { 223 | source: 1, 224 | original_line: 0, 225 | original_column: 21, 226 | name: Some(2), 227 | }), 228 | }, 229 | ); 230 | assert_bidirectional( 231 | &mut mappings, 232 | Mapping { 233 | generated_line: 1, 234 | generated_column: 21, 235 | last_generated_column: Some(28), 236 | original: Some(OriginalLocation { 237 | source: 1, 238 | original_line: 1, 239 | original_column: 3, 240 | name: None, 241 | }), 242 | }, 243 | ); 244 | assert_bidirectional( 245 | &mut mappings, 246 | Mapping { 247 | generated_line: 1, 248 | generated_column: 28, 249 | last_generated_column: None, 250 | original: Some(OriginalLocation { 251 | source: 1, 252 | original_line: 1, 253 | original_column: 10, 254 | name: Some(2), 255 | }), 256 | }, 257 | ); 258 | } 259 | 260 | // From mozilla/source-map's test/test-source-map-consumer.js's "test 261 | // allGeneratedPositionsFor for line" test case. 262 | const TEST_MAPPINGS_2: &'static [u8] = b";EAAC,ACAA;EACA,CAAC;EACD"; 263 | 264 | #[test] 265 | fn test_all_generated_locations_for_some_line() { 266 | let mut mappings = parse_mappings::<()>(TEST_MAPPINGS_2).unwrap(); 267 | 268 | let mappings_on_source_1_line_1: Vec<_> = mappings 269 | .all_generated_locations_for(1, 1, None) 270 | .cloned() 271 | .collect(); 272 | 273 | assert_eq!( 274 | mappings_on_source_1_line_1, 275 | vec![ 276 | Mapping { 277 | generated_line: 2, 278 | generated_column: 2, 279 | last_generated_column: Some(3), 280 | original: Some(OriginalLocation { 281 | source: 1, 282 | original_line: 1, 283 | original_column: 1, 284 | name: None, 285 | }), 286 | }, 287 | Mapping { 288 | generated_line: 2, 289 | generated_column: 3, 290 | last_generated_column: None, 291 | original: Some(OriginalLocation { 292 | source: 1, 293 | original_line: 1, 294 | original_column: 2, 295 | name: None, 296 | }), 297 | }, 298 | ] 299 | ); 300 | } 301 | 302 | // Taken from mozilla/source-map's test/test-source-map-consumer.js's "test 303 | // allGeneratedPositionsFor for line fuzzy" 304 | const TEST_MAPPINGS_3: &'static [u8] = b";EAAC,ACAA;;EAEA"; 305 | 306 | #[test] 307 | fn test_all_generated_locations_for_line_fuzzy() { 308 | let mut mappings = parse_mappings::<()>(TEST_MAPPINGS_3).unwrap(); 309 | 310 | let mappings_on_source_1_line_1: Vec<_> = mappings 311 | .all_generated_locations_for(1, 1, None) 312 | .cloned() 313 | .collect(); 314 | 315 | assert_eq!( 316 | mappings_on_source_1_line_1, 317 | vec![ 318 | Mapping { 319 | generated_line: 3, 320 | generated_column: 2, 321 | last_generated_column: None, 322 | original: Some(OriginalLocation { 323 | source: 1, 324 | original_line: 2, 325 | original_column: 1, 326 | name: None, 327 | }), 328 | }, 329 | ] 330 | ); 331 | } 332 | 333 | // Taken from mozilla/source-map's test/test-source-map-consumer.js's "test 334 | // allGeneratedPositionsFor for column". 335 | const TEST_MAPPINGS_4: &'static [u8] = b"EAAC,CAAA"; 336 | 337 | #[test] 338 | fn test_all_generated_locations_for_column() { 339 | let mut mappings = parse_mappings::<()>(TEST_MAPPINGS_4).unwrap(); 340 | 341 | let mappings_on_source_0_line_0_column_1: Vec<_> = mappings 342 | .all_generated_locations_for(0, 0, Some(1)) 343 | .cloned() 344 | .collect(); 345 | 346 | assert_eq!( 347 | mappings_on_source_0_line_0_column_1, 348 | vec![ 349 | Mapping { 350 | generated_line: 0, 351 | generated_column: 2, 352 | last_generated_column: Some(3), 353 | original: Some(OriginalLocation { 354 | source: 0, 355 | original_line: 0, 356 | original_column: 1, 357 | name: None, 358 | }), 359 | }, 360 | Mapping { 361 | generated_line: 0, 362 | generated_column: 3, 363 | last_generated_column: None, 364 | original: Some(OriginalLocation { 365 | source: 0, 366 | original_line: 0, 367 | original_column: 1, 368 | name: None, 369 | }), 370 | }, 371 | ] 372 | ); 373 | } 374 | 375 | #[test] 376 | fn test_all_generated_locations_for_column_fuzzy() { 377 | let mut mappings = parse_mappings::<()>(TEST_MAPPINGS_4).unwrap(); 378 | 379 | let mappings_on_source_0_line_0_column_0: Vec<_> = mappings 380 | .all_generated_locations_for(0, 0, Some(0)) 381 | .cloned() 382 | .collect(); 383 | 384 | assert_eq!( 385 | mappings_on_source_0_line_0_column_0, 386 | vec![ 387 | Mapping { 388 | generated_line: 0, 389 | generated_column: 2, 390 | last_generated_column: Some(3), 391 | original: Some(OriginalLocation { 392 | source: 0, 393 | original_line: 0, 394 | original_column: 1, 395 | name: None, 396 | }), 397 | }, 398 | Mapping { 399 | generated_line: 0, 400 | generated_column: 3, 401 | last_generated_column: None, 402 | original: Some(OriginalLocation { 403 | source: 0, 404 | original_line: 0, 405 | original_column: 1, 406 | name: None, 407 | }), 408 | }, 409 | ] 410 | ); 411 | } 412 | 413 | // From mozilla/source-map's test/test-source-map-consumer.js's "test 414 | // allGeneratedPositionsFor for column on different line fuzzy". 415 | const TEST_MAPPINGS_5: &'static [u8] = b";EACC,CAAA"; 416 | 417 | #[test] 418 | fn test_all_generated_locations_for_column_on_different_line_fuzzy() { 419 | let mut mappings = parse_mappings::<()>(TEST_MAPPINGS_5).unwrap(); 420 | 421 | let mappings_on_source_0_line_0_column_0: Vec<_> = mappings 422 | .all_generated_locations_for(0, 0, Some(0)) 423 | .cloned() 424 | .collect(); 425 | 426 | assert!(mappings_on_source_0_line_0_column_0.is_empty()); 427 | } 428 | --------------------------------------------------------------------------------