1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "Dump.h"
18 
19 #include <cinttypes>
20 #include <vector>
21 
22 #include "android-base/stringprintf.h"
23 #include "androidfw/ConfigDescription.h"
24 #include "androidfw/StringPiece.h"
25 
26 #include "Debug.h"
27 #include "Diagnostics.h"
28 #include "LoadedApk.h"
29 #include "Util.h"
30 #include "format/Container.h"
31 #include "format/binary/BinaryResourceParser.h"
32 #include "format/binary/XmlFlattener.h"
33 #include "format/proto/ProtoDeserialize.h"
34 #include "io/FileStream.h"
35 #include "io/ZipArchive.h"
36 #include "process/IResourceTableConsumer.h"
37 #include "text/Printer.h"
38 #include "util/Files.h"
39 
40 using ::aapt::text::Printer;
41 using ::android::StringPiece;
42 using ::android::base::StringPrintf;
43 
44 namespace aapt {
45 
ResourceFileTypeToString(const ResourceFile::Type & type)46 static const char* ResourceFileTypeToString(const ResourceFile::Type& type) {
47   switch (type) {
48     case ResourceFile::Type::kPng:
49       return "PNG";
50     case ResourceFile::Type::kBinaryXml:
51       return "BINARY_XML";
52     case ResourceFile::Type::kProtoXml:
53       return "PROTO_XML";
54     default:
55       break;
56   }
57   return "UNKNOWN";
58 }
59 
DumpCompiledFile(const ResourceFile & file,const Source & source,off64_t offset,size_t len,Printer * printer)60 static void DumpCompiledFile(const ResourceFile& file, const Source& source, off64_t offset,
61                              size_t len, Printer* printer) {
62   printer->Print("Resource: ");
63   printer->Println(file.name.to_string());
64 
65   printer->Print("Config:   ");
66   printer->Println(file.config.to_string());
67 
68   printer->Print("Source:   ");
69   printer->Println(file.source.to_string());
70 
71   printer->Print("Type:     ");
72   printer->Println(ResourceFileTypeToString(file.type));
73 
74   printer->Println(StringPrintf("Data:     offset=%" PRIi64 " length=%zd", offset, len));
75 }
76 
77 namespace {
78 
79 class DumpContext : public IAaptContext {
80  public:
GetPackageType()81   PackageType GetPackageType() override {
82     // Doesn't matter.
83     return PackageType::kApp;
84   }
85 
GetDiagnostics()86   IDiagnostics* GetDiagnostics() override {
87     return &diagnostics_;
88   }
89 
GetNameMangler()90   NameMangler* GetNameMangler() override {
91     UNIMPLEMENTED(FATAL);
92     return nullptr;
93   }
94 
GetCompilationPackage()95   const std::string& GetCompilationPackage() override {
96     static std::string empty;
97     return empty;
98   }
99 
GetPackageId()100   uint8_t GetPackageId() override {
101     return 0;
102   }
103 
GetExternalSymbols()104   SymbolTable* GetExternalSymbols() override {
105     UNIMPLEMENTED(FATAL);
106     return nullptr;
107   }
108 
IsVerbose()109   bool IsVerbose() override {
110     return verbose_;
111   }
112 
SetVerbose(bool val)113   void SetVerbose(bool val) {
114     verbose_ = val;
115   }
116 
GetMinSdkVersion()117   int GetMinSdkVersion() override {
118     return 0;
119   }
120 
GetSplitNameDependencies()121   const std::set<std::string>& GetSplitNameDependencies() override {
122     UNIMPLEMENTED(FATAL) << "Split Name Dependencies should not be necessary";
123     static std::set<std::string> empty;
124     return empty;
125   }
126 
127  private:
128   StdErrDiagnostics diagnostics_;
129   bool verbose_ = false;
130 };
131 
132 }  // namespace
133 
Action(const std::vector<std::string> & args)134 int DumpAPCCommand::Action(const std::vector<std::string>& args) {
135   DumpContext context;
136   DebugPrintTableOptions print_options;
137   print_options.show_sources = true;
138   print_options.show_values = !no_values_;
139 
140   if (args.size() < 1) {
141     diag_->Error(DiagMessage() << "No dump container specified");
142     return 1;
143   }
144 
145   bool error = false;
146   for (auto container : args) {
147     io::FileInputStream input(container);
148     if (input.HadError()) {
149       context.GetDiagnostics()->Error(DiagMessage(container)
150                                       << "failed to open file: " << input.GetError());
151       error = true;
152       continue;
153     }
154 
155     // Try as a compiled file.
156     ContainerReader reader(&input);
157     if (reader.HadError()) {
158       context.GetDiagnostics()->Error(DiagMessage(container)
159                                       << "failed to read container: " << reader.GetError());
160       error = true;
161       continue;
162     }
163 
164     printer_->Println("AAPT2 Container (APC)");
165     ContainerReaderEntry* entry;
166     std::string error;
167     while ((entry = reader.Next()) != nullptr) {
168       if (entry->Type() == ContainerEntryType::kResTable) {
169         printer_->Println("kResTable");
170 
171         pb::ResourceTable pb_table;
172         if (!entry->GetResTable(&pb_table)) {
173           context.GetDiagnostics()->Error(DiagMessage(container)
174                                           << "failed to parse proto table: " << entry->GetError());
175           error = true;
176           continue;
177         }
178 
179         ResourceTable table;
180         error.clear();
181         if (!DeserializeTableFromPb(pb_table, nullptr /*files*/, &table, &error)) {
182           context.GetDiagnostics()->Error(DiagMessage(container)
183                                           << "failed to parse table: " << error);
184           error = true;
185           continue;
186         }
187 
188         printer_->Indent();
189         Debug::PrintTable(table, print_options, printer_);
190         printer_->Undent();
191       } else if (entry->Type() == ContainerEntryType::kResFile) {
192         printer_->Println("kResFile");
193         pb::internal::CompiledFile pb_compiled_file;
194         off64_t offset;
195         size_t length;
196         if (!entry->GetResFileOffsets(&pb_compiled_file, &offset, &length)) {
197           context.GetDiagnostics()->Error(DiagMessage(container)
198                                           << "failed to parse compiled proto file: "
199                                           << entry->GetError());
200           error = true;
201           continue;
202         }
203 
204         ResourceFile file;
205         if (!DeserializeCompiledFileFromPb(pb_compiled_file, &file, &error)) {
206           context.GetDiagnostics()->Warn(DiagMessage(container)
207                                          << "failed to parse compiled file: " << error);
208           error = true;
209           continue;
210         }
211 
212         printer_->Indent();
213         DumpCompiledFile(file, Source(container), offset, length, printer_);
214         printer_->Undent();
215       }
216     }
217   }
218 
219   return (error) ? 1 : 0;
220 }
221 
Action(const std::vector<std::string> & args)222 int DumpBadgerCommand::Action(const std::vector<std::string>& args) {
223   printer_->Print(StringPrintf("%s", kBadgerData));
224   printer_->Print("Did you mean \"aapt2 dump badging\"?\n");
225   return 1;
226 }
227 
Dump(LoadedApk * apk)228 int DumpConfigsCommand::Dump(LoadedApk* apk) {
229   ResourceTable* table = apk->GetResourceTable();
230   if (!table) {
231     GetDiagnostics()->Error(DiagMessage() << "Failed to retrieve resource table");
232     return 1;
233   }
234 
235   // Comparison function used to order configurations
236   auto compare = [](android::ConfigDescription c1, android::ConfigDescription c2) -> bool {
237     return c1.compare(c2) < 0;
238   };
239 
240   // Insert the configurations into a set in order to keep every configuarion seen
241   std::set<android::ConfigDescription, decltype(compare)> configs(compare);
242   for (auto& package : table->packages) {
243     for (auto& type : package->types) {
244       for (auto& entry : type->entries) {
245         for (auto& value : entry->values) {
246           configs.insert(value->config);
247         }
248       }
249     }
250   }
251 
252   // Print the configurations in order
253   for (auto& config : configs) {
254     GetPrinter()->Print(StringPrintf("%s\n", config.to_string().data()));
255   }
256   return 0;
257 }
258 
Dump(LoadedApk * apk)259 int DumpPackageNameCommand::Dump(LoadedApk* apk) {
260   Maybe<std::string> package_name = GetPackageName(apk);
261   if (!package_name) {
262     return 1;
263   }
264 
265   GetPrinter()->Println(package_name.value());
266   return 0;
267 }
268 
Dump(LoadedApk * apk)269 int DumpStringsCommand::Dump(LoadedApk* apk) {
270   ResourceTable* table = apk->GetResourceTable();
271   if (!table) {
272     GetDiagnostics()->Error(DiagMessage() << "Failed to retrieve resource table");
273     return 1;
274   }
275 
276   // Load the run-time xml string pool using the flattened data
277   BigBuffer buffer(4096);
278   StringPool::FlattenUtf8(&buffer, table->string_pool, GetDiagnostics());
279   auto data = buffer.to_string();
280   android::ResStringPool pool(data.data(), data.size(), false);
281   Debug::DumpResStringPool(&pool, GetPrinter());
282   return 0;
283 }
284 
Dump(LoadedApk * apk)285 int DumpStyleParentCommand::Dump(LoadedApk* apk) {
286   Maybe<std::string> package_name = GetPackageName(apk);
287   if (!package_name) {
288     return 1;
289   }
290 
291   const auto target_style = ResourceName(package_name.value(), ResourceType::kStyle, style_);
292   const auto table = apk->GetResourceTable();
293 
294   if (!table) {
295     GetDiagnostics()->Error(DiagMessage() << "Failed to retrieve resource table");
296     return 1;
297   }
298 
299   Maybe<ResourceTable::SearchResult> target = table->FindResource(target_style);
300   if (!target) {
301     GetDiagnostics()->Error(
302         DiagMessage() << "Target style \"" << target_style.entry << "\" does not exist");
303     return 1;
304   }
305 
306   Debug::PrintStyleGraph(table, target_style);
307   return 0;
308 }
309 
Dump(LoadedApk * apk)310 int DumpTableCommand::Dump(LoadedApk* apk) {
311   if (apk->GetApkFormat() == ApkFormat::kProto) {
312     GetPrinter()->Println("Proto APK");
313   } else {
314     GetPrinter()->Println("Binary APK");
315   }
316 
317   ResourceTable* table = apk->GetResourceTable();
318   if (!table) {
319     GetDiagnostics()->Error(DiagMessage() << "Failed to retrieve resource table");
320     return 1;
321   }
322 
323   DebugPrintTableOptions print_options;
324   print_options.show_sources = true;
325   print_options.show_values = !no_values_;
326   Debug::PrintTable(*table, print_options, GetPrinter());
327   return 0;
328 }
329 
Dump(LoadedApk * apk)330 int DumpXmlStringsCommand::Dump(LoadedApk* apk) {
331   DumpContext context;
332   bool error = false;
333   for (auto xml_file : files_) {
334     android::ResXMLTree tree;
335 
336     if (apk->GetApkFormat() == ApkFormat::kProto) {
337       auto xml = apk->LoadXml(xml_file, GetDiagnostics());
338       if (!xml) {
339         error = true;
340         continue;
341       }
342 
343       // Flatten the xml document to get a binary representation of the proto xml file
344       BigBuffer buffer(4096);
345       XmlFlattenerOptions options = {};
346       options.keep_raw_values = true;
347       XmlFlattener flattener(&buffer, options);
348       if (!flattener.Consume(&context, xml.get())) {
349         error = true;
350         continue;
351       }
352 
353       // Load the run-time xml tree using the flattened data
354       std::string data = buffer.to_string();
355       tree.setTo(data.data(), data.size(), /** copyData */ true);
356 
357     } else if (apk->GetApkFormat() == ApkFormat::kBinary) {
358       io::IFile* file = apk->GetFileCollection()->FindFile(xml_file);
359       if (!file) {
360         GetDiagnostics()->Error(DiagMessage(xml_file)
361                                 << "File '" << xml_file << "' not found in APK");
362         error = true;
363         continue;
364       }
365 
366       std::unique_ptr<io::IData> data = file->OpenAsData();
367       if (!data) {
368         GetDiagnostics()->Error(DiagMessage() << "Failed to open " << xml_file);
369         error = true;
370         continue;
371       }
372 
373       // Load the run-time xml tree from the file data
374       tree.setTo(data->data(), data->size(), /** copyData */ true);
375     } else {
376       GetDiagnostics()->Error(DiagMessage(apk->GetSource()) << "Unknown APK format");
377       error = true;
378       continue;
379     }
380 
381     Debug::DumpResStringPool(&tree.getStrings(), GetPrinter());
382   }
383   return (error) ? 1 : 0;
384 }
385 
Dump(LoadedApk * apk)386 int DumpXmlTreeCommand::Dump(LoadedApk* apk) {
387   for (auto file : files_) {
388     auto xml = apk->LoadXml(file, GetDiagnostics());
389     if (!xml) {
390       return 1;
391     }
392     Debug::DumpXml(*xml, GetPrinter());
393   }
394   return 0;
395 }
396 
Dump(LoadedApk * apk)397 int DumpOverlayableCommand::Dump(LoadedApk* apk) {
398   ResourceTable* table = apk->GetResourceTable();
399   if (!table) {
400     GetDiagnostics()->Error(DiagMessage() << "Failed to retrieve resource table");
401     return 1;
402   }
403 
404   Debug::DumpOverlayable(*table, GetPrinter());
405   return 0;
406 }
407 
408 const char DumpBadgerCommand::kBadgerData[2925] = {
409     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
410     32,  32,  32,  32,  32,  32,  95,  46,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
411     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
412     32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
413     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  61,  63,  86,  35,  40,  46,  46,
414     95,  95,  95,  95,  97,  97,  44,  32,  46,  124, 42,  33,  83,  62,  32,  32,  32,  32,  32,
415     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,
416     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
417     32,  32,  58,  46,  58,  59,  61,  59,  61,  81,  81,  81,  81,  66,  96,  61,  61,  58,  46,
418     46,  46,  58,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
419     32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
420     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  46,  61,  59,  59,  59,  58,  106, 81,  81,
421     81,  81,  102, 59,  61,  59,  59,  61,  61,  61,  58,  46,  32,  32,  32,  32,  32,  32,  32,
422     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,
423     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
424     61,  59,  59,  59,  58,  109, 81,  81,  81,  81,  61,  59,  59,  59,  59,  59,  58,  59,  59,
425     46,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
426     32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
427     32,  32,  32,  32,  32,  32,  32,  46,  61,  59,  59,  59,  60,  81,  81,  81,  81,  87,  58,
428     59,  59,  59,  59,  59,  59,  61,  119, 44,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
429     32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,
430     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  46,  47,  61,  59,  59,
431     58,  100, 81,  81,  81,  81,  35,  58,  59,  59,  59,  59,  59,  58,  121, 81,  91,  32,  32,
432     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,
433     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
434     32,  32,  32,  46,  109, 58,  59,  59,  61,  81,  81,  81,  81,  81,  109, 58,  59,  59,  59,
435     59,  61,  109, 81,  81,  76,  46,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
436     32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
437     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  41,  87,  59,  61,  59,  41,  81,  81,
438     81,  81,  81,  81,  59,  61,  59,  59,  58,  109, 81,  81,  87,  39,  46,  32,  32,  32,  32,
439     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,
440     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
441     60,  81,  91,  59,  59,  61,  81,  81,  81,  81,  81,  87,  43,  59,  58,  59,  60,  81,  81,
442     81,  76,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
443     32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
444     32,  32,  32,  32,  32,  32,  32,  32,  32,  52,  91,  58,  45,  59,  87,  81,  81,  81,  81,
445     70,  58,  58,  58,  59,  106, 81,  81,  81,  91,  32,  32,  32,  32,  32,  32,  32,  32,  32,
446     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,
447     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  93,  40,
448     32,  46,  59,  100, 81,  81,  81,  81,  40,  58,  46,  46,  58,  100, 81,  81,  68,  32,  32,
449     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
450     10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  46,  46,  46,  32,  46,
451     46,  46,  32,  46,  32,  46,  45,  91,  59,  61,  58,  109, 81,  81,  81,  87,  46,  58,  61,
452     59,  60,  81,  81,  80,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
453     32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  46,  46,
454     61,  59,  61,  61,  61,  59,  61,  61,  59,  59,  59,  58,  58,  46,  46,  41,  58,  59,  58,
455     81,  81,  81,  81,  69,  58,  59,  59,  60,  81,  81,  68,  32,  32,  32,  32,  32,  32,  32,
456     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,
457     32,  32,  32,  32,  58,  59,  61,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
458     59,  59,  61,  61,  46,  61,  59,  93,  81,  81,  81,  81,  107, 58,  59,  58,  109, 87,  68,
459     96,  32,  32,  32,  46,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
460     32,  32,  32,  32,  32,  10,  32,  32,  32,  46,  60,  61,  61,  59,  59,  59,  59,  59,  59,
461     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  58,  58,  58,  115, 109, 68,  41,  36,
462     81,  109, 46,  61,  61,  81,  69,  96,  46,  58,  58,  46,  58,  46,  46,  32,  32,  32,  32,
463     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  46,  32,  95,  81,  67,
464     61,  61,  58,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
465     59,  59,  58,  68,  39,  61,  105, 61,  63,  81,  119, 58,  106, 80,  32,  58,  61,  59,  59,
466     61,  59,  61,  59,  61,  46,  95,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
467     32,  32,  10,  32,  32,  36,  81,  109, 105, 59,  61,  59,  59,  59,  59,  59,  59,  59,  59,
468     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  46,  58,  37,  73,  108, 108, 62,  52,  81,
469     109, 34,  32,  61,  59,  59,  59,  59,  59,  59,  59,  59,  59,  61,  59,  61,  61,  46,  46,
470     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  46,  45,  57,  101, 43,  43,  61,
471     61,  59,  59,  59,  59,  59,  59,  61,  59,  59,  59,  59,  59,  59,  59,  59,  59,  58,  97,
472     46,  61,  108, 62,  126, 58,  106, 80,  96,  46,  61,  61,  59,  59,  59,  59,  59,  59,  59,
473     59,  59,  59,  59,  59,  59,  61,  61,  97,  103, 97,  32,  32,  32,  32,  32,  32,  32,  10,
474     32,  32,  32,  32,  45,  46,  32,  46,  32,  32,  32,  32,  32,  32,  32,  32,  45,  45,  45,
475     58,  59,  59,  59,  59,  61,  119, 81,  97,  124, 105, 124, 124, 39,  126, 95,  119, 58,  61,
476     58,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  61,  119, 81,  81,
477     99,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
478     32,  32,  32,  32,  32,  32,  32,  32,  32,  58,  59,  59,  58,  106, 81,  81,  81,  109, 119,
479     119, 119, 109, 109, 81,  81,  122, 58,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
480     59,  59,  59,  58,  115, 81,  87,  81,  102, 32,  32,  32,  32,  32,  32,  10,  32,  32,  32,
481     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  61,  58,
482     59,  61,  81,  81,  81,  81,  81,  81,  87,  87,  81,  81,  81,  81,  81,  58,  59,  59,  59,
483     59,  59,  59,  59,  59,  58,  45,  45,  45,  59,  59,  59,  41,  87,  66,  33,  32,  32,  32,
484     32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
485     32,  32,  32,  32,  32,  32,  58,  59,  59,  93,  81,  81,  81,  81,  81,  81,  81,  81,  81,
486     81,  81,  81,  81,  40,  58,  59,  59,  59,  58,  45,  32,  46,  32,  32,  32,  32,  32,  46,
487     32,  126, 96,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,
488     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  58,  61,  59,  58,  81,
489     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  40,  58,  59,  59,  59,  58,  32,
490     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
491     32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
492     32,  32,  32,  58,  59,  59,  58,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,
493     81,  40,  58,  59,  59,  59,  46,  46,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
494     32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,
495     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  58,  61,  59,  60,  81,  81,  81,  81,
496     81,  81,  81,  81,  81,  81,  81,  81,  81,  59,  61,  59,  59,  61,  32,  32,  32,  32,  32,
497     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,
498     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
499     58,  59,  59,  93,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  40,  59,
500     59,  59,  59,  32,  46,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
501     32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
502     32,  32,  32,  32,  32,  32,  32,  32,  58,  61,  58,  106, 81,  81,  81,  81,  81,  81,  81,
503     81,  81,  81,  81,  81,  81,  76,  58,  59,  59,  59,  32,  46,  32,  32,  32,  32,  32,  32,
504     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,
505     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  61,  58,  58,
506     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  87,  58,  59,  59,  59,  59,
507     32,  46,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
508     32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
509     32,  32,  32,  32,  32,  58,  59,  61,  41,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,
510     81,  81,  87,  59,  61,  58,  59,  59,  46,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
511     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,
512     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  58,  61,  58,  61,  81,  81,
513     81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  107, 58,  59,  59,  59,  59,  58,  32,  32,
514     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
515     10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
516     32,  32,  58,  59,  59,  58,  51,  81,  81,  81,  81,  81,  81,  81,  81,  81,  81,  102, 94,
517     59,  59,  59,  59,  59,  61,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
518     32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
519     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  58,  61,  59,  59,  59,  43,  63,  36,  81,
520     81,  81,  87,  64,  86,  102, 58,  59,  59,  59,  59,  59,  59,  59,  46,  32,  32,  32,  32,
521     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,
522     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  46,  61,
523     59,  59,  59,  59,  59,  59,  59,  43,  33,  58,  126, 126, 58,  59,  59,  59,  59,  59,  59,
524     59,  59,  59,  59,  32,  46,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
525     32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
526     32,  32,  32,  32,  32,  46,  61,  59,  59,  59,  58,  45,  58,  61,  59,  58,  58,  58,  61,
527     59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  58,  32,  46,  32,  32,  32,  32,
528     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,
529     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  46,  61,  59,  59,  59,  59,  59,
530     58,  95,  32,  45,  61,  59,  61,  59,  59,  59,  59,  59,  59,  59,  45,  58,  59,  59,  59,
531     59,  61,  58,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
532     32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
533     32,  58,  61,  59,  59,  59,  59,  59,  61,  59,  61,  46,  46,  32,  45,  45,  45,  59,  58,
534     45,  45,  46,  58,  59,  59,  59,  59,  59,  59,  61,  46,  32,  32,  32,  32,  32,  32,  32,
535     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,
536     32,  32,  32,  32,  32,  32,  32,  32,  46,  58,  59,  59,  59,  59,  59,  59,  59,  59,  59,
537     61,  59,  46,  32,  32,  46,  32,  46,  32,  58,  61,  59,  59,  59,  59,  59,  59,  59,  59,
538     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,
539     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  45,
540     59,  59,  59,  59,  59,  59,  59,  59,  58,  32,  32,  32,  32,  32,  32,  32,  32,  32,  61,
541     59,  59,  59,  59,  59,  59,  59,  58,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
542     32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
543     32,  32,  32,  32,  32,  32,  32,  46,  61,  59,  59,  59,  59,  59,  59,  59,  32,  46,  32,
544     32,  32,  32,  32,  32,  61,  46,  61,  59,  59,  59,  59,  59,  59,  58,  32,  32,  32,  32,
545     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,
546     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  61,  59,  59,  59,
547     59,  59,  59,  59,  59,  32,  46,  32,  32,  32,  32,  32,  32,  32,  46,  61,  58,  59,  59,
548     59,  59,  59,  58,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
549     32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
550     32,  32,  32,  32,  58,  59,  59,  59,  59,  59,  59,  59,  59,  46,  46,  32,  32,  32,  32,
551     32,  32,  32,  61,  59,  59,  59,  59,  59,  59,  59,  45,  32,  32,  32,  32,  32,  32,  32,
552     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,
553     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  46,  32,  45,  61,  59,  59,  59,  59,
554     59,  58,  32,  46,  32,  32,  32,  32,  32,  32,  32,  58,  59,  59,  59,  59,  59,  58,  45,
555     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
556     32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
557     32,  32,  32,  32,  45,  45,  45,  45,  32,  46,  32,  32,  32,  32,  32,  32,  32,  32,  32,
558     32,  45,  61,  59,  58,  45,  45,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
559     32,  32,  32,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,
560     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
561     32,  32,  32,  32,  32,  32,  32,  32,  32,  46,  32,  32,  46,  32,  32,  32,  32,  32,  32,
562     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  10};
563 
564 }  // namespace aapt
565