├── .github └── workflows │ ├── pylint.yml │ └── python-package.yml ├── .gitignore ├── .pre-commit-config.yaml ├── .pre-commit-hooks.yaml ├── LICENSE ├── README.md ├── awdd ├── __init__.py ├── definition.py ├── json_writer.py ├── manifest.py ├── metadata.py ├── object.py ├── parser.py ├── protos │ └── metadata_pb2.py ├── text_serializer.py └── text_writer.py ├── bin ├── awdd2json.py ├── awdd2text.py └── awdm2components.py ├── docs ├── FORMAT.md ├── awdd.bin └── awdd.txt ├── poetry.lock ├── protos └── metadata.proto ├── pyproject.toml ├── tests ├── __init__.py ├── collect_all_tags.py ├── fixtures │ └── .gitkeep ├── read_all_tags_from_logs.py ├── test_load_manifests.py └── test_parse_log.py └── tmp ├── .gitignore └── .gitkeep /.github/workflows/pylint.yml: -------------------------------------------------------------------------------- 1 | name: Pylint 2 | 3 | on: [push] 4 | 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | strategy: 9 | matrix: 10 | python-version: ["3.8", "3.9", "3.10"] 11 | steps: 12 | - uses: actions/checkout@v3 13 | - name: Set up Python ${{ matrix.python-version }} 14 | uses: actions/setup-python@v3 15 | with: 16 | python-version: ${{ matrix.python-version }} 17 | - name: Install dependencies 18 | run: | 19 | python -m pip install --upgrade pip 20 | pip install pylint 21 | - name: Analysing the code with pylint 22 | run: | 23 | pylint $(git ls-files '*.py') 24 | -------------------------------------------------------------------------------- /.github/workflows/python-package.yml: -------------------------------------------------------------------------------- 1 | # This workflow will install Python dependencies, run tests and lint with a variety of Python versions 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions 3 | 4 | name: Python package 5 | 6 | on: 7 | push: 8 | branches: [ "main" ] 9 | pull_request: 10 | branches: [ "main" ] 11 | 12 | jobs: 13 | build: 14 | 15 | runs-on: ubuntu-latest 16 | strategy: 17 | fail-fast: false 18 | matrix: 19 | python-version: ["3.8", "3.9", "3.10"] 20 | 21 | steps: 22 | - uses: actions/checkout@v3 23 | - name: Set up Python ${{ matrix.python-version }} 24 | uses: actions/setup-python@v3 25 | with: 26 | python-version: ${{ matrix.python-version }} 27 | - name: Install dependencies 28 | run: | 29 | python -m pip install --upgrade pip 30 | python -m pip install flake8 pytest 31 | if [ -f requirements.txt ]; then pip install -r requirements.txt; fi 32 | - name: Lint with flake8 33 | run: | 34 | # stop the build if there are Python syntax errors or undefined names 35 | flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics 36 | # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide 37 | flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics 38 | - name: Test with pytest 39 | run: | 40 | pytest 41 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | .pytest_cache/ 6 | 7 | # C extensions 8 | *.so 9 | 10 | # Distribution / packaging 11 | .Python 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | pip-wheel-metadata/ 25 | share/python-wheels/ 26 | *.egg-info/ 27 | .installed.cfg 28 | *.egg 29 | MANIFEST 30 | 31 | # PyInstaller 32 | # Usually these files are written by a python script from a template 33 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 34 | *.manifest 35 | *.spec 36 | 37 | # Installer logs 38 | pip-log.txt 39 | pip-delete-this-directory.txt 40 | 41 | # Unit test / coverage reports 42 | htmlcov/ 43 | .tox/ 44 | .nox/ 45 | .coverage 46 | .coverage.* 47 | .cache 48 | nosetests.xml 49 | coverage.xml 50 | *.cover 51 | *.py,cover 52 | .hypothesis/ 53 | .pytest_cache/ 54 | 55 | # Translations 56 | *.mo 57 | *.pot 58 | 59 | # Django stuff: 60 | *.log 61 | local_settings.py 62 | db.sqlite3 63 | db.sqlite3-journal 64 | 65 | # Flask stuff: 66 | instance/ 67 | .webassets-cache 68 | 69 | # Scrapy stuff: 70 | .scrapy 71 | 72 | # Sphinx documentation 73 | docs/_build/ 74 | 75 | # PyBuilder 76 | target/ 77 | 78 | # Jupyter Notebook 79 | .ipynb_checkpoints 80 | 81 | # IPython 82 | profile_default/ 83 | ipython_config.py 84 | 85 | # pyenv 86 | .python-version 87 | 88 | # pipenv 89 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 90 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 91 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 92 | # install all needed dependencies. 93 | #Pipfile.lock 94 | 95 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 96 | __pypackages__/ 97 | 98 | # Celery stuff 99 | celerybeat-schedule 100 | celerybeat.pid 101 | 102 | # SageMath parsed files 103 | *.sage.py 104 | 105 | # Environments 106 | .env 107 | .venv 108 | env/ 109 | venv/ 110 | ENV/ 111 | env.bak/ 112 | venv.bak/ 113 | 114 | # Spyder project settings 115 | .spyderproject 116 | .spyproject 117 | 118 | # Rope project settings 119 | .ropeproject 120 | 121 | # mkdocs documentation 122 | /site 123 | 124 | # mypy 125 | .mypy_cache/ 126 | .dmypy.json 127 | dmypy.json 128 | 129 | # Pyre type checker 130 | .pyre/ 131 | .idea/ 132 | metadata/ 133 | .DS_Store 134 | 135 | tests/fixtures/* 136 | 137 | dist/ 138 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | # See https://pre-commit.com for more information 2 | # See https://pre-commit.com/hooks.html for more hooks 3 | repos: 4 | - repo: https://github.com/pre-commit/pre-commit-hooks 5 | rev: v3.2.0 6 | hooks: 7 | - id: trailing-whitespace 8 | - id: end-of-file-fixer 9 | - id: check-merge-conflict 10 | - id: check-case-conflict 11 | - id: check-yaml 12 | - id: check-json 13 | - id: check-ast 14 | - id: pretty-format-json 15 | args: [--autofix, --no-ensure-ascii, --no-sort-keys] 16 | - id: check-toml 17 | - id: check-added-large-files 18 | 19 | - repo: https://github.com/myint/autoflake 20 | rev: v1.4 21 | hooks: 22 | - id: autoflake 23 | exclude: tests/functional/|tests/input|tests/regrtest_data/|tests/data/ 24 | args: 25 | - --in-place 26 | - --remove-all-unused-imports 27 | - --expand-star-imports 28 | - --remove-duplicate-keys 29 | - --remove-unused-variables 30 | 31 | - repo: https://github.com/pre-commit/pygrep-hooks 32 | rev: v1.9.0 33 | hooks: 34 | - id: python-check-mock-methods 35 | - id: python-use-type-annotations 36 | - id: python-check-blanket-type-ignore 37 | - id: python-check-blanket-noqa 38 | 39 | - repo: https://github.com/asottile/yesqa 40 | rev: v1.3.0 41 | hooks: 42 | - id: yesqa 43 | additional_dependencies: &flake8_deps 44 | - flake8-broken-line==0.4.0 45 | - flake8-bugbear==21.9.2 46 | - flake8-comprehensions==3.7.0 47 | - flake8-eradicate==1.2.0 48 | - flake8-no-pep420==1.2.0 49 | - flake8-quotes==3.3.1 50 | - flake8-simplify==0.14.2 51 | - flake8-tidy-imports==4.5.0 52 | - flake8-type-checking==1.1.0 53 | - flake8-typing-imports==1.11.0 54 | - flake8-use-fstring==1.3 55 | - pep8-naming==0.12.1 56 | 57 | - repo: https://github.com/pycqa/isort 58 | rev: 5.10.1 59 | hooks: 60 | - id: isort 61 | name: "isort (python)" 62 | types: [python] 63 | - id: isort 64 | name: "isort (pyi)" 65 | types: [pyi] 66 | args: [--lines-after-imports, "-1"] 67 | 68 | - repo: https://github.com/psf/black 69 | rev: 22.1.0 70 | hooks: 71 | - id: black 72 | 73 | - repo: https://github.com/DanielNoord/pydocstringformatter 74 | rev: a9f94bf13b08fe33f784ed7f0a0fc39e2a8549e2 75 | hooks: 76 | - id: pydocstringformatter 77 | 78 | - repo: https://github.com/pycqa/flake8 79 | rev: 4.0.1 80 | hooks: 81 | - id: flake8 82 | exclude: ^src/(usb|libusbfinder)/ 83 | additional_dependencies: *flake8_deps 84 | 85 | - repo: https://github.com/pre-commit/mirrors-mypy 86 | rev: v0.931 87 | hooks: 88 | - id: mypy 89 | pass_filenames: false 90 | args: ['src/'] 91 | additional_dependencies: 92 | - types-requests 93 | - types-cryptography 94 | 95 | - repo: https://github.com/pre-commit/pre-commit 96 | rev: v2.17.0 97 | hooks: 98 | - id: validate_manifest 99 | -------------------------------------------------------------------------------- /.pre-commit-hooks.yaml: -------------------------------------------------------------------------------- 1 | - id: poetry-check 2 | name: poetry-check 3 | description: run poetry check to validate config 4 | entry: poetry check 5 | language: python 6 | language_version: python3 7 | pass_filenames: false 8 | files: ^pyproject.toml$ 9 | 10 | - id: poetry-lock 11 | name: poetry-lock 12 | description: run poetry lock to update lock file 13 | entry: poetry lock 14 | language: python 15 | language_version: python3 16 | pass_filenames: false 17 | 18 | - id: poetry-export 19 | name: poetry-export 20 | description: run poetry export to sync lock file with requirements.txt 21 | entry: poetry export 22 | language: python 23 | language_version: python3 24 | pass_filenames: false 25 | files: ^poetry.lock$ 26 | args: ["-f", "requirements.txt", "-o", "requirements.txt"] 27 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Rick Mark 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # awdd_decode 2 | Ability to decode Apple Wireless Diagnostics Daemon files 3 | 4 | ## Hand decoded ASN1 data in `rosetta` 5 | 6 | ## The metadata for each tag is in the iDevice root FS 7 | 8 | `/System/Library/AWD/Metadata` 9 | 10 | 11 | # Credits 12 | 13 | * Rick Mark did a ton of hex editor decoding and created a naieve implementation that worked to decode the initial metadata 14 | * @nicolas17 discovered that the encoding was based on protobuf simplifying the implemntation greatly 15 | -------------------------------------------------------------------------------- /awdd/__init__.py: -------------------------------------------------------------------------------- 1 | import io 2 | import struct 3 | from typing import * 4 | from enum import IntFlag 5 | from datetime import datetime, time 6 | from enum import * 7 | from dataclasses import * 8 | 9 | 10 | BYTE_PARSE_STRUCT = b"B" 11 | 12 | 13 | class ManifestError(Exception): 14 | pass 15 | 16 | 17 | def apple_time_to_datetime(epoch_milliseconds: int) -> datetime: 18 | unix_epoch = epoch_milliseconds / 1000 19 | micros = (epoch_milliseconds % 1000) * 1000 20 | base_date_time = datetime.utcfromtimestamp(unix_epoch) 21 | return datetime( 22 | base_date_time.year, 23 | base_date_time.month, 24 | base_date_time.day, 25 | hour=base_date_time.hour, 26 | minute=base_date_time.minute, 27 | second=base_date_time.second, 28 | microsecond=micros, 29 | tzinfo=base_date_time.tzinfo, 30 | ) 31 | 32 | 33 | def to_complete_tag(category: int, index: int) -> int: 34 | return (category << 16) | index 35 | 36 | 37 | class TagType(IntFlag): 38 | NONE = 0b000 39 | # Guess: Size Fixed known from format, encapsulated C struct 40 | EXTENSION = 0b001 41 | LENGTH_PREFIX = 0b010 42 | REPEATED = 0b100 43 | 44 | 45 | TEnum = TypeVar("T", int, IntEnum) 46 | 47 | 48 | @dataclass(kw_only=True) 49 | class Tag(Generic[TEnum]): 50 | index: TEnum 51 | tag_type: TagType 52 | length: int 53 | value: any 54 | 55 | 56 | class VariableLengthInteger(NamedTuple): 57 | value: int 58 | size: int 59 | 60 | 61 | def decode_variable_length_int( 62 | reader: Union[BinaryIO, io.BytesIO] 63 | ) -> Optional[VariableLengthInteger]: 64 | def read_bytes() -> Generator[int, None, None]: 65 | data = reader.read(struct.calcsize(BYTE_PARSE_STRUCT)) 66 | if data is None or len(data) == 0: 67 | return 68 | 69 | byte, *_ = struct.unpack(BYTE_PARSE_STRUCT, data) 70 | 71 | while byte & 0b1000_0000 != 0: 72 | yield byte & 0b0111_1111 73 | byte, *_ = struct.unpack( 74 | BYTE_PARSE_STRUCT, reader.read(struct.calcsize(BYTE_PARSE_STRUCT)) 75 | ) 76 | 77 | yield byte 78 | 79 | result = 0 80 | 81 | result_bytes = list(read_bytes()) 82 | if len(result_bytes) == 0: 83 | return None 84 | 85 | for single_byte in reversed(result_bytes): 86 | result <<= 7 87 | result |= single_byte 88 | 89 | return VariableLengthInteger(value=result, size=len(result_bytes)) 90 | 91 | 92 | """ 93 | Reads in a single tag and it's associated data. If the low order bits indicate that there is a length 94 | prefix (as is in the case of strings and constructed object types). For scalar primitives, the high order 95 | bit of the value indicates if there are more bytes to be read. Finally the remaining 7 bits are 7 to 8 bit 96 | encoded as in email 7bit encoding (MIME) 97 | """ 98 | 99 | 100 | def decode_tag( 101 | data: Union[io.IOBase, bytes], enum: Optional[Type[IntEnum]] = int 102 | ) -> Optional[Tag]: 103 | reader = io.BytesIO(data) if isinstance(data, bytes) else data 104 | 105 | result = decode_variable_length_int(reader) 106 | if result is None: 107 | return None 108 | 109 | encoded_tag, length = result 110 | 111 | type_bits = TagType(encoded_tag & 0b111) 112 | index_bits = encoded_tag >> 3 113 | 114 | if enum == int: 115 | index = index_bits 116 | else: 117 | index = enum(index_bits) 118 | 119 | if type_bits & TagType.LENGTH_PREFIX: 120 | string_length, length_length = decode_variable_length_int(reader) 121 | value = reader.read(string_length) 122 | return Tag( 123 | index=index, 124 | tag_type=type_bits, 125 | length=length + length_length + string_length, 126 | value=value, 127 | ) 128 | 129 | else: 130 | value, value_length = decode_variable_length_int(reader) 131 | 132 | return Tag( 133 | index=index, tag_type=type_bits, length=length + value_length, value=value 134 | ) 135 | 136 | 137 | def decode_tags( 138 | data: Union[bytes, io.IOBase], enum: Optional[Type[IntEnum]] = int 139 | ) -> List[Tag]: 140 | reader = io.BytesIO(data) if isinstance(data, bytes) else data 141 | 142 | result = [] 143 | while tag := decode_tag(reader, enum): 144 | result.append(tag) 145 | 146 | return result 147 | -------------------------------------------------------------------------------- /awdd/definition.py: -------------------------------------------------------------------------------- 1 | from abc import ABC, abstractmethod 2 | from enum import * 3 | 4 | from . import * 5 | 6 | 7 | class PropertyFlags(IntFlag): 8 | NONE = 0x00 9 | REPEATED = 0x01 10 | 11 | 12 | class IntegerFormat(IntEnum): 13 | TIMESTAMP = 0x01 14 | METRIC_ID = 0x02 15 | TRIGGER_ID = 0x03 16 | PROFILE_ID = 0x04 17 | COMPONENT_ID = 0x05 18 | AVERAGE_TIME = 0x15 19 | TIME_DELTA = 0x16 20 | TIMEZONE_OFFSET = 0x17 21 | ASSOCIATED_TIME = 0x18 22 | PERIOD_IN_HOURS = 0x19 23 | TIME_OF_DAY = 0x1E 24 | SAMPLE_TIMESTAMP = 0x1F 25 | 26 | 27 | class StringFormat(IntEnum): 28 | UNKNOWN = 0x00 29 | UUID = 0x01 30 | 31 | 32 | class PropertyType(IntEnum): 33 | UNKNOWN = 0x00 34 | DOUBLE = 0x01 35 | FLOAT = 0x02 36 | INTEGER_64 = 0x03 37 | INTEGER = 0x04 38 | ERROR_CODE = 0x05 39 | INTEGER_32 = 0x06 40 | INTEGER_UNSIGNED = 0x07 41 | BYTE_COUNT = 0x08 42 | SEQUENCE_NUMBER = 0x09 43 | BEDF_OPERATOR = 0x0A 44 | BOOLEAN = 0x0C 45 | ENUM = 0x0B 46 | STRING = 0x0D 47 | BYTES = 0x0E 48 | PACKED_UINT_32 = 0x15 49 | PACKED_TIMES = 0x11 50 | PACKED_ERRORS = 0x14 51 | OBJECT = 0x1B 52 | 53 | 54 | class PropertyExtensionType(IntEnum): 55 | NONE = 0x00 56 | ADD_PROPERTY = 0x01 57 | REPLACE_PROPERTY = 0x02 58 | 59 | 60 | class ManifestExtensionScopeType(IntEnum): 61 | ROOT_SCOPE = 0x00 62 | LOCAL_SCOPE = 0x01 63 | GLOBAL_SCOPE = 0x02 64 | CONFIGURATION_SCOPE = 0x03 65 | 66 | 67 | class ManifestPropertyTag(IntEnum): 68 | INDEX = 0x01 69 | TYPE = 0x02 70 | FLAGS = 0x03 71 | DISPLAY_NAME = 0x04 72 | PII = 0x05 73 | STRING_FORMAT = 0x06 74 | OBJECT_TYPE = 0x07 75 | ENUM_TYPE = 0x08 76 | INTEGER_FORMAT = 0x09 77 | EXTENSION_OPERATION = 0x0A 78 | EXTENSION_TAG = 0x0B 79 | EXTENSION_SCOPE = 0x0C 80 | 81 | 82 | class ManifestDefinitionTag(IntEnum): 83 | DEFINE_OBJECT = 0x01 84 | DEFINE_TYPE = 0x02 85 | 86 | 87 | class ManifestTypeDefinitionTag(IntEnum): 88 | DISPLAY_NAME = 0x01 89 | ENUM_MEMBER = 0x02 90 | 91 | 92 | class ManifestObjectDefinitionTag(IntEnum): 93 | DISPLAY_NAME = 0x01 94 | PROPERTY_DEFINITION = 0x02 95 | 96 | 97 | class ManifestEnumMemberTag(IntEnum): 98 | DISPLAY_NAME = 0x01 99 | VALUE_INT = 0x02 100 | VALUE_SIGNED = 0x03 101 | 102 | 103 | def to_type_descriptor(target: Union[None, int, "ManifestDefinition"]) -> Optional[str]: 104 | if target: 105 | if isinstance(target, int): 106 | return hex(target) 107 | 108 | if target.name: 109 | return target.name 110 | 111 | return hex(target) 112 | 113 | return None 114 | 115 | 116 | class ManifestProperty: 117 | index: int 118 | name: Optional[str] 119 | type: PropertyType 120 | flags: PropertyFlags 121 | pii: bool 122 | 123 | integer_format: Optional[IntegerFormat] 124 | string_format: Optional[StringFormat] 125 | 126 | object_type: Union[None, int, "ManifestObjectDefinition"] 127 | enum_type: Union[None, int, "ManifestTypeDefinition"] 128 | 129 | target: Union[None, int, "ManifestDefinition"] 130 | 131 | extension_type: Optional[PropertyExtensionType] 132 | extension_scope: Optional[ManifestExtensionScopeType] 133 | extends: Union[None, int, "ManifestDefinition"] 134 | 135 | def __init__(self, parent): 136 | self.content = [] 137 | self.parent = parent 138 | 139 | self.type = PropertyType.UNKNOWN 140 | self.flags = PropertyFlags.NONE 141 | self.name = None 142 | self.pii = False 143 | 144 | self.integer_format = None 145 | self.string_format = None 146 | 147 | self.object_type = None 148 | self.enum_type = None 149 | 150 | self.extends = None 151 | self.extension_scope = None 152 | self.extension_flags = None 153 | 154 | def __str__(self): 155 | name = "anonymous" if self.name is None else self.name 156 | 157 | if self.type == PropertyType.OBJECT: 158 | object_target = f" class:{to_type_descriptor(self.object_type)}" 159 | else: 160 | object_target = "" 161 | 162 | if self.extends: 163 | object_extends = f" extends:{to_type_descriptor(self.extends)}" 164 | else: 165 | object_extends = "" 166 | 167 | if self.enum_type: 168 | enum_desc = f" enum:{to_type_descriptor(self.enum_type)}" 169 | else: 170 | enum_desc = "" 171 | 172 | return ( 173 | f"" 175 | ) 176 | 177 | def parse(self, content: bytes): 178 | self.content = decode_tags(content, ManifestPropertyTag) 179 | 180 | for tag in self.content: 181 | if tag.index == ManifestPropertyTag.TYPE: 182 | self.type = PropertyType(tag.value) 183 | 184 | elif tag.index == ManifestPropertyTag.FLAGS: 185 | self.flags = PropertyFlags(tag.value) 186 | 187 | elif tag.index == ManifestPropertyTag.INDEX: 188 | self.index = tag.value 189 | 190 | elif tag.index == ManifestPropertyTag.ENUM_TYPE: 191 | self.enum_type = tag.value 192 | 193 | elif tag.index == ManifestPropertyTag.PII: 194 | if tag.value == 0: 195 | self.pii = False 196 | elif tag.value == 1: 197 | self.pii = True 198 | else: 199 | raise ManifestError(f"Unknown value for PII {tag.value}") 200 | 201 | elif tag.index == ManifestPropertyTag.OBJECT_TYPE: 202 | self.object_type = to_complete_tag(self.parent.category, tag.value) 203 | 204 | elif tag.index == ManifestPropertyTag.INTEGER_FORMAT: 205 | self.integer_format = IntegerFormat(tag.value) 206 | 207 | elif tag.index == ManifestPropertyTag.STRING_FORMAT: 208 | self.string_format = StringFormat(tag.value) 209 | 210 | elif tag.index == ManifestPropertyTag.DISPLAY_NAME: 211 | self.name = tag.value.decode("utf-8") 212 | 213 | elif tag.index == ManifestPropertyTag.EXTENSION_TAG: 214 | self.extends = tag.value 215 | 216 | elif tag.index == ManifestPropertyTag.EXTENSION_SCOPE: 217 | self.extension_scope = ManifestExtensionScopeType(tag.value) 218 | if not self.extends: 219 | self.extends = 0x01 220 | 221 | elif tag.index == ManifestPropertyTag.EXTENSION_OPERATION: 222 | self.extension_type = PropertyExtensionType(tag.value) 223 | 224 | else: 225 | raise ManifestError(f"Unhandled tag {tag.index} with value {tag.value}") 226 | 227 | self.flags = PropertyFlags(self.flags) 228 | 229 | try: 230 | self.type = PropertyType(self.type) 231 | except ValueError: 232 | raise ManifestError( 233 | f"Unable to set type for property {self.name if self.name is not None else 'anonymous'} for class " 234 | "{self.parent.name} to type {hex(self.type)}" 235 | ) 236 | 237 | def bind( 238 | self, 239 | types: List["ManifestDefinition"], 240 | enums: Dict[int, "ManifestTypeDefinition"], 241 | objects: Dict[int, "ManifestObjectDefinition"], 242 | ): 243 | if self.extends: 244 | extend_id = self.extends 245 | if self.extension_scope == ManifestExtensionScopeType.LOCAL_SCOPE: 246 | extend_id = to_complete_tag(self.parent.category, self.extends) 247 | 248 | if self.extension_scope == ManifestExtensionScopeType.CONFIGURATION_SCOPE: 249 | self.extends = types[extend_id] 250 | return 251 | 252 | if self.extends not in objects: 253 | print(f"Invalid Tag?") 254 | else: 255 | self.extends = objects[extend_id] 256 | 257 | if self.type == PropertyType.OBJECT and isinstance(self.object_type, int): 258 | if self.object_type not in objects: 259 | print(f"Invalid Tag?") 260 | else: 261 | self.object_type = objects[self.object_type] 262 | 263 | elif self.type == PropertyType.ENUM: 264 | composite = to_complete_tag(self.parent.category, self.enum_type) 265 | if composite not in enums: 266 | print("Invalid enum") 267 | else: 268 | self.enum_type = enums[composite] 269 | 270 | def extend(self): 271 | if self.extends and isinstance(self.extends, ManifestObjectDefinition): 272 | if self.extension_type == PropertyExtensionType.REPLACE_PROPERTY: 273 | for existing_prop in list(self.extends.properties): 274 | if existing_prop.index == self.index: 275 | self.extends.properties.remove(existing_prop) 276 | 277 | self.extends.properties.append(self) 278 | 279 | 280 | T = TypeVar("T", bound="ManifestDefinition") 281 | 282 | 283 | class ManifestDefinition(ABC): 284 | TAG = 0 285 | 286 | content: List[Tag] 287 | category: int 288 | index: int 289 | tag: int 290 | name: Optional[str] 291 | 292 | def __init__(self, category: int, index: int): 293 | self.category = category 294 | self.index = index 295 | self.name = "__anonymous__" 296 | 297 | def composite_tag(self) -> int: 298 | return to_complete_tag(self.category, self.index) 299 | 300 | @abstractmethod 301 | def parse(self, data: bytes): 302 | pass 303 | 304 | @classmethod 305 | def from_tag(cls: Type[T], category: int, index: int, tag: Tag) -> T: 306 | if tag.index != cls.TAG: 307 | raise ManifestError( 308 | f"Attempted to parse the wrong definition, value {tag.index} is not of type {cls.TAG}" 309 | ) 310 | return cls.from_bytes(category, index, tag.value) 311 | 312 | @classmethod 313 | def from_bytes(cls: Type[T], category: int, index: int, data: bytes) -> T: 314 | result = cls(category, index) 315 | result.parse(data) 316 | return result 317 | 318 | def bind( 319 | self, 320 | roots: List["ManifestDefinition"], 321 | enums: Dict[int, "ManifestTypeDefinition"], 322 | objects: Dict[int, "ManifestObjectDefinition"], 323 | ): 324 | pass 325 | 326 | 327 | class ManifestEnumMember: 328 | name: str | int 329 | value: int 330 | display: str 331 | 332 | def __init__(self, index: int, data: bytes): 333 | self.index = index 334 | self.data = data 335 | reader = io.BytesIO(data) 336 | 337 | while tag := decode_tag(reader, ManifestEnumMemberTag): 338 | if tag.index == ManifestEnumMemberTag.DISPLAY_NAME: 339 | if tag.value is str: 340 | self.name = tag.value.decode("utf-8") 341 | else: 342 | self.name = tag.value 343 | 344 | elif tag.index == ManifestEnumMemberTag.VALUE_INT: 345 | self.value = tag.value 346 | 347 | elif tag.index == ManifestEnumMemberTag.VALUE_SIGNED: 348 | # TODO: this is a special INT case - seems to be twos complement of length 349 | # encoded integer, value seen was '\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01' 350 | # implying signed int64 351 | 352 | self.value = tag.value 353 | 354 | else: 355 | raise ManifestError( 356 | f"Unknown tag type in EnumMember definition {hex(tag.index)} = {tag.value}" 357 | ) 358 | 359 | def __str__(self): 360 | return f"" 361 | 362 | 363 | class ManifestTypeDefinition(ManifestDefinition): 364 | TAG = 2 365 | 366 | entries: List[ManifestEnumMember] 367 | extend: Union[None, int, "ManifestDefinition"] 368 | 369 | def __init__(self, category, index): 370 | super().__init__(category, index) 371 | self.content = [] 372 | self.entries = [] 373 | 374 | def __str__(self): 375 | return f"" 376 | 377 | def parse(self, data: bytes): 378 | self.content = decode_tags(data, ManifestTypeDefinitionTag) 379 | 380 | for index, tag in enumerate(self.content): 381 | if tag.index == ManifestTypeDefinitionTag.DISPLAY_NAME: 382 | self.name = tag.value.decode("utf-8") 383 | 384 | elif tag.index == ManifestTypeDefinitionTag.ENUM_MEMBER: 385 | self.entries.append(ManifestEnumMember(index, tag.value)) 386 | 387 | else: 388 | raise ManifestError( 389 | f"Unknown property in type {self.name} - {tag.index} ({tag.value})" 390 | ) 391 | 392 | 393 | class ManifestObjectDefinition(ManifestDefinition): 394 | TAG = 1 395 | 396 | properties: List[ManifestProperty] 397 | 398 | def __init__(self, category, index): 399 | super().__init__(category, index) 400 | 401 | self.properties = [] 402 | self.content = [] 403 | 404 | def __str__(self): 405 | if self.name is not None: 406 | return f"" 407 | else: 408 | return ( 409 | f"" 410 | ) 411 | 412 | def parse(self, content: bytes): 413 | self.content = decode_tags(content, ManifestObjectDefinitionTag) 414 | 415 | for tag in self.content: 416 | if tag.index == ManifestObjectDefinitionTag.PROPERTY_DEFINITION: 417 | prop = ManifestProperty(self) 418 | prop.parse(tag.value) 419 | self.properties.append(prop) 420 | 421 | elif tag.index == ManifestObjectDefinitionTag.DISPLAY_NAME: 422 | self.name = tag.value.decode("utf-8") 423 | 424 | else: 425 | raise ManifestError( 426 | f"Unknown tag {hex(tag.index)} in object {self.name}" 427 | ) 428 | 429 | def property_for_tag(self, tag: int) -> Optional[ManifestProperty]: 430 | for prop in self.properties: 431 | if prop.index == tag: 432 | return prop 433 | return None 434 | 435 | def bind( 436 | self, 437 | types: List["ManifestDefinition"], 438 | enums: Dict[int, "ManifestTypeDefinition"], 439 | objects: Dict[int, "ManifestObjectDefinition"], 440 | ): 441 | for prop in self.properties: 442 | prop.bind(types, enums, objects) 443 | 444 | def extend(self): 445 | for prop in list(self.properties): 446 | if prop.extends: 447 | prop.extend() 448 | -------------------------------------------------------------------------------- /awdd/json_writer.py: -------------------------------------------------------------------------------- 1 | from . import WriterBase 2 | from .object import * 3 | from io import IOBase 4 | 5 | 6 | class JsonWriter(WriterBase): 7 | def write_to(self, value: DiagnosticObject, stream: IOBase) -> None: 8 | pass 9 | -------------------------------------------------------------------------------- /awdd/manifest.py: -------------------------------------------------------------------------------- 1 | import os 2 | from abc import * 3 | from pathlib import Path 4 | 5 | from .definition import * 6 | 7 | from . import * 8 | from .definition import * 9 | 10 | ROOT_MANIFEST_PATH = "/System/Library/PrivateFrameworks/WirelessDiagnostics.framework/Support/AWDMetadata.bin" 11 | EXTENSION_MANIFEST_PATH = "/System/Library/AWD/Metadata/*.bin" 12 | 13 | 14 | ROOT_OBJECT_TAG = 0x00 15 | 16 | 17 | class ExtensionPointTag(IntEnum): 18 | DISPLAY_NAME = 0x01 19 | TAG = 0x02 20 | 21 | 22 | class CompositeDefinition(NamedTuple): 23 | type: ManifestDefinitionTag 24 | tag: int 25 | definition: ManifestDefinition 26 | 27 | 28 | class ManifestRegionType(IntEnum): 29 | structure = 0x02 # Compact representation of the metadata 30 | display = 0x03 # Metadata intended for display 31 | identity = 0x04 # The UUID and source file which the file was generated from 32 | types = 0x05 # Ambient global types 33 | extensions = 0x06 # Extended values for the root metrics object 34 | 35 | 36 | class ManifestRegion(ABC): 37 | def __init__( 38 | self, 39 | manifest: "Manifest", 40 | data: BinaryIO, 41 | kind: ManifestRegionType, 42 | offset: int, 43 | size: int, 44 | ): 45 | self.manifest = manifest 46 | self.kind = kind 47 | self.offset = offset 48 | self.size = size 49 | self.data = data 50 | 51 | def read_all(self) -> bytes: 52 | self.data.seek(self.offset, os.SEEK_SET) 53 | return self.data.read(self.size) 54 | 55 | 56 | class ManifestTable(ManifestRegion): 57 | DEFINE_OBJECT_TAG = 0x01 58 | DEFINE_ENUM_TAG = 0x02 59 | SINGLE_BYTE_TAG_STRUCT = b"B" 60 | 61 | objects: List[ManifestDefinition] 62 | enums: List[ManifestTypeDefinition] 63 | is_root: bool 64 | 65 | def __init__( 66 | self, 67 | manifest: "Manifest", 68 | data: BinaryIO, 69 | kind: ManifestRegionType, 70 | tag: int, 71 | offset: int, 72 | size: int, 73 | checksum: int, 74 | ): 75 | super().__init__(manifest, data, kind, offset, size) 76 | self.tag = tag 77 | self.checksum = checksum 78 | self.objects: List[ManifestObjectDefinition] = [] 79 | self.enums: List[ManifestTypeDefinition] = [] 80 | 81 | def __str__(self): 82 | return f"" 83 | 84 | def parse(self): 85 | tags = decode_tags(self.read_all()) 86 | object_index = 0 87 | enum_index = 0 88 | 89 | for tag in tags: 90 | if tag.index == ManifestTable.DEFINE_OBJECT_TAG: 91 | self.objects.append( 92 | ManifestObjectDefinition.from_tag(self.tag, object_index, tag) 93 | ) 94 | object_index += 1 95 | elif tag.index == ManifestTable.DEFINE_ENUM_TAG: 96 | self.enums.append( 97 | ManifestTypeDefinition.from_tag(self.tag, enum_index, tag) 98 | ) 99 | enum_index += 1 100 | else: 101 | raise ManifestError(f"Unknown tag type at root {tag}") 102 | 103 | 104 | class ManifestIdentity(ManifestRegion): 105 | TAG_HASH = 0x01 106 | TAG_NAME = 0x02 107 | TAG_TIMESTAMP = 0x03 108 | 109 | hash: bytes # SHA1 Hash 110 | name: str 111 | timestamp: datetime 112 | 113 | def __init__( 114 | self, 115 | manifest: "Manifest", 116 | data: BinaryIO, 117 | kind: ManifestRegionType, 118 | offset: int, 119 | size: int, 120 | ): 121 | super().__init__(manifest, data, kind, offset, size) 122 | 123 | def parse(self): 124 | tags = decode_tags(self.read_all()) 125 | for tag in tags: 126 | if tag.index == ManifestIdentity.TAG_HASH: 127 | self.hash = bytes.fromhex(tag.value.decode("ascii")) 128 | elif tag.index == ManifestIdentity.TAG_NAME: 129 | self.name = tag.value.decode("utf-8") 130 | elif tag.index == ManifestIdentity.TAG_TIMESTAMP: 131 | self.timestamp = apple_time_to_datetime(tag.value) 132 | else: 133 | raise ManifestError( 134 | f"Tag index {tag.index} not known in the context of a manifest identity" 135 | ) 136 | 137 | 138 | class Manifest: 139 | MANIFEST_MAGIC = b"AWDM" 140 | HEADER_STRUCT = b"4sHH" 141 | HEADER_SECTION_COUNT = b"I" 142 | HEADER_SECTION_AND_COUNT = b"HH" 143 | HEADER_TABLE_STRUCT = b"IIII" 144 | HEADER_FOOTER_STRUCT = b"II" 145 | 146 | TABLE_TAGS = [ManifestRegionType.structure, ManifestRegionType.display] 147 | 148 | structure_tables: Dict[int, ManifestTable] 149 | display_tables: Dict[int, ManifestTable] 150 | identity: ManifestIdentity 151 | types: List[ManifestDefinition] 152 | types_region: Optional[ManifestRegion] 153 | extensions: Optional[Dict[int, str]] 154 | extension_region: Optional[ManifestRegion] 155 | file: BinaryIO 156 | 157 | def __str__(self): 158 | return f"" 159 | 160 | def __init__(self, path: str): 161 | self.is_root = False 162 | self.structure_tables = {} 163 | self.display_tables = {} 164 | self.types_region = None 165 | self.extension_region = None 166 | self.path = Path(path) 167 | if self.path.exists() is False: 168 | raise ManifestError("Path does not exist") 169 | 170 | self.file = open(self.path.absolute(), "rb") 171 | magic, self.major, self.minor = struct.unpack( 172 | Manifest.HEADER_STRUCT, 173 | self.file.read(struct.calcsize(Manifest.HEADER_STRUCT)), 174 | ) 175 | 176 | if magic != Manifest.MANIFEST_MAGIC: 177 | raise ManifestError(f"Incorrect MAGIC (got {magic})") 178 | 179 | if self.major != 1 or self.minor != 1: 180 | raise ManifestError(f"Unsupported version (got {self.major}.{self.minor})") 181 | 182 | sections, *_ = struct.unpack( 183 | Manifest.HEADER_SECTION_COUNT, 184 | self.file.read(struct.calcsize(Manifest.HEADER_SECTION_COUNT)), 185 | ) 186 | 187 | if sections == 0: 188 | self.is_root = True 189 | 190 | while self._parse_manifest_header() is not False: 191 | pass 192 | 193 | def definitions(self) -> Generator[CompositeDefinition, None, None]: 194 | for tag in self.tags: 195 | tag_class = tag << 16 196 | for entry in self.display_tables[tag].objects: 197 | yield CompositeDefinition( 198 | ManifestDefinitionTag.DEFINE_OBJECT, entry.index | tag_class, entry 199 | ) 200 | for entry in self.display_tables[tag].enums: 201 | yield CompositeDefinition( 202 | ManifestDefinitionTag.DEFINE_TYPE, entry.index | tag_class, entry 203 | ) 204 | 205 | def parse(self): 206 | 207 | for index in self.display_tables: 208 | self.display_tables[index].parse() 209 | 210 | if self.identity: 211 | self.identity.parse() 212 | 213 | if self.types_region: 214 | tags = decode_tags(self.types_region.read_all()) 215 | self.types = [] 216 | for index, tag in enumerate(tags): 217 | if tag.index == 1: 218 | self.types.append(ManifestObjectDefinition.from_tag(0, index, tag)) 219 | elif tag.index == 2: 220 | self.types.append(ManifestTypeDefinition.from_tag(0, index, tag)) 221 | 222 | if self.extension_region: 223 | self._parse_extension_points() 224 | 225 | # Meh, we could have checked the number of sections but both root and non root end with 0x00000000 226 | 227 | # If we get a tag of 0 return false so that we know to stop a root manifest parse 228 | def _parse_manifest_header(self) -> bool: 229 | tag_bytes = self.file.read(struct.calcsize(Manifest.HEADER_SECTION_AND_COUNT)) 230 | if not tag_bytes or len(tag_bytes) != struct.calcsize( 231 | Manifest.HEADER_SECTION_AND_COUNT 232 | ): 233 | return False 234 | 235 | header_tag, field_count = struct.unpack( 236 | Manifest.HEADER_SECTION_AND_COUNT, tag_bytes 237 | ) 238 | 239 | if header_tag is 0 and field_count is 0: 240 | return False 241 | 242 | parsed_tag = ManifestRegionType(header_tag) 243 | 244 | if parsed_tag in Manifest.TABLE_TAGS: 245 | tag, offset, size, checksum = struct.unpack( 246 | Manifest.HEADER_TABLE_STRUCT, 247 | self.file.read(struct.calcsize(Manifest.HEADER_TABLE_STRUCT)), 248 | ) 249 | 250 | table = ManifestTable( 251 | self, self.file, parsed_tag, tag, offset, size, checksum 252 | ) 253 | 254 | if table.kind == ManifestRegionType.structure: 255 | self.structure_tables[tag] = table 256 | elif table.kind == ManifestRegionType.display: 257 | self.display_tables[tag] = table 258 | else: 259 | raise ManifestError("Table is not structure nor display??") 260 | 261 | return True 262 | 263 | else: 264 | offset, size = struct.unpack( 265 | Manifest.HEADER_FOOTER_STRUCT, 266 | self.file.read(struct.calcsize(Manifest.HEADER_FOOTER_STRUCT)), 267 | ) 268 | 269 | if parsed_tag == ManifestRegionType.identity: 270 | self.identity = ManifestIdentity( 271 | self, self.file, parsed_tag, offset, size 272 | ) 273 | elif parsed_tag == ManifestRegionType.types: 274 | self.types_region = ManifestRegion( 275 | self, self.file, parsed_tag, offset, size 276 | ) 277 | elif parsed_tag == ManifestRegionType.extensions: 278 | self.extension_region = ManifestRegion( 279 | self, self.file, parsed_tag, offset, size 280 | ) 281 | 282 | return True 283 | 284 | def _parse_extension_points(self): 285 | if not self.extension_region: 286 | return 287 | 288 | self.extensions = {} 289 | 290 | for tag in decode_tags(self.extension_region.read_all()): 291 | assert tag.index == 1 292 | name = None 293 | 294 | for element in decode_tags(tag.value, ExtensionPointTag): 295 | if element.index == ExtensionPointTag.DISPLAY_NAME: # Name value 296 | name = element.value.decode("utf-8") 297 | elif element.index == ExtensionPointTag.TAG: 298 | self.extensions[element.value] = name 299 | 300 | @property 301 | def tags(self): 302 | return set(self.structure_tables.keys()).union(self.display_tables.keys()) 303 | 304 | @property 305 | def tag(self) -> Optional[int]: 306 | if self.is_root: 307 | return None 308 | else: 309 | return set(self.structure_tables.keys()).union(self.display_tables).pop() 310 | -------------------------------------------------------------------------------- /awdd/metadata.py: -------------------------------------------------------------------------------- 1 | from .manifest import * 2 | from typing import * 3 | from glob import glob 4 | 5 | from awdd import * 6 | 7 | 8 | class Metadata: 9 | root_manifest: Manifest 10 | extension_manifests: List[Manifest] 11 | all_enums: Dict[int, ManifestTypeDefinition] 12 | all_objects: Dict[int, ManifestObjectDefinition] 13 | 14 | def __init__(self): 15 | self.root_manifest = Manifest(ROOT_MANIFEST_PATH) 16 | 17 | self.extension_manifests = [ 18 | Manifest(path) for path in glob(EXTENSION_MANIFEST_PATH) 19 | ] 20 | 21 | self.all_enums = {} 22 | self.all_objects = {} 23 | 24 | def resolve(self): 25 | self.root_manifest.parse() 26 | 27 | for manifest in self.extension_manifests: 28 | manifest.parse() 29 | 30 | for entry in self.root_manifest.definitions(): 31 | if entry.type == ManifestDefinitionTag.DEFINE_TYPE: 32 | self.all_enums[entry.tag] = entry.definition 33 | elif entry.type == ManifestDefinitionTag.DEFINE_OBJECT: 34 | self.all_objects[entry.tag] = entry.definition 35 | else: 36 | raise ManifestError(f"Unknown deinition type") 37 | 38 | for extension in self.extension_manifests: 39 | for entry in extension.definitions(): 40 | if entry.type == ManifestDefinitionTag.DEFINE_TYPE: 41 | self.all_enums[entry.tag] = entry.definition 42 | elif entry.type == ManifestDefinitionTag.DEFINE_OBJECT: 43 | self.all_objects[entry.tag] = entry.definition 44 | else: 45 | raise ManifestError(f"Unknown defintion type") 46 | 47 | for tag in self.all_enums: 48 | self.all_enums[tag].bind( 49 | self.root_manifest.types, self.all_enums, self.all_objects 50 | ) 51 | 52 | for tag in self.all_objects: 53 | self.all_objects[tag].bind( 54 | self.root_manifest.types, self.all_enums, self.all_objects 55 | ) 56 | 57 | for tag in list(self.all_objects): 58 | self.all_objects[tag].extend() 59 | 60 | def root(self) -> ManifestObjectDefinition: 61 | return self.root_manifest.display_tables[0].objects[0] 62 | -------------------------------------------------------------------------------- /awdd/object.py: -------------------------------------------------------------------------------- 1 | import io 2 | from dataclasses import dataclass 3 | 4 | from .manifest import * 5 | from abc import ABC, abstractmethod 6 | from enum import IntEnum, IntFlag 7 | from typing import * 8 | from io import * 9 | 10 | from .metadata import Metadata 11 | 12 | ROOT_OBJECT = None 13 | 14 | 15 | @dataclass 16 | class DiagnosticValue: 17 | property: "ManifestDefinition" 18 | value: Union[Any, "DiagnosticObject"] 19 | 20 | def __init__(self, metadata: Metadata, prop: ManifestProperty, tag: Tag): 21 | self.property = prop 22 | if prop.type == PropertyType.OBJECT: 23 | self.value = DiagnosticObject(metadata, prop.object_type, ta) 24 | else: 25 | self.value = value 26 | 27 | 28 | @dataclass 29 | class DiagnosticObject: 30 | metadata: Metadata 31 | object_class: "ManifestObjectDefinition" 32 | properties: List[DiagnosticValue] 33 | 34 | def __init__( 35 | self, metadata: Metadata, klass: "ManifestObjectDefinition", values: List[Tag] 36 | ): 37 | self.metadata = metadata 38 | self.object_class = klass 39 | self.properties = [] 40 | for tag in values: 41 | prop = self.object_class.property_for_tag(tag.index) 42 | self.properties.append(DiagnosticValue(metadata, prop, tag.value)) 43 | 44 | 45 | class WriterBase(ABC): 46 | def write(self, value: DiagnosticObject) -> bytes: 47 | output = io.BytesIO() 48 | self.write_to(value, output) 49 | return output.getvalue() 50 | 51 | @abstractmethod 52 | def write_to(self, value: DiagnosticObject, stream: io.IOBase) -> None: 53 | pass 54 | -------------------------------------------------------------------------------- /awdd/parser.py: -------------------------------------------------------------------------------- 1 | import io 2 | from typing import * 3 | from awdd.manifest import * 4 | from awdd.metadata import Metadata 5 | from awdd.object import * 6 | from awdd import decode_variable_length_int 7 | 8 | 9 | class LogParser: 10 | metadata: Metadata 11 | 12 | def __init__(self, metadata: Optional[Metadata] = None): 13 | self.metadata = metadata if metadata is not None else Metadata() 14 | self.metadata.resolve() 15 | 16 | def parse(self, data: io.RawIOBase) -> DiagnosticObject: 17 | root_object: ManifestObjectDefinition = self.metadata.root() 18 | tags = decode_tags(data) 19 | result_object: DiagnosticObject = DiagnosticObject( 20 | self.metadata, root_object, tags 21 | ) 22 | 23 | return result_object 24 | -------------------------------------------------------------------------------- /awdd/protos/metadata_pb2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by the protocol buffer compiler. DO NOT EDIT! 3 | # source: protos/metadata.proto 4 | """Generated protocol buffer code.""" 5 | from google.protobuf import descriptor as _descriptor 6 | from google.protobuf import message as _message 7 | from google.protobuf import reflection as _reflection 8 | from google.protobuf import symbol_database as _symbol_database 9 | 10 | # @@protoc_insertion_point(imports) 11 | 12 | _sym_db = _symbol_database.Default() 13 | 14 | 15 | from google.protobuf import type_pb2 as google_dot_protobuf_dot_type__pb2 16 | 17 | 18 | DESCRIPTOR = _descriptor.FileDescriptor( 19 | name="protos/metadata.proto", 20 | package="awdd.metadata", 21 | syntax="proto3", 22 | serialized_options=None, 23 | create_key=_descriptor._internal_create_key, 24 | serialized_pb=b'\n\x15protos/metadata.proto\x12\rawdd.metadata\x1a\x1agoogle/protobuf/type.proto"\xba\t\n\x0c\x44\x65\x66ineObject\x12\x11\n\x04name\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x31\n\x06\x66ields\x18\x02 \x03(\x0b\x32!.awdd.metadata.DefineObject.Field\x1a\xda\x08\n\x05\x46ield\x12\x0b\n\x03tag\x18\x01 \x01(\x04\x12\x34\n\x04type\x18\x02 \x01(\x0e\x32&.awdd.metadata.DefineObject.Field.Kind\x12\x13\n\x0bis_repeated\x18\x03 \x01(\x08\x12\x11\n\x04name\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x07has_pii\x18\x05 \x01(\x08H\x01\x88\x01\x01\x12\x14\n\x07has_loc\x18\x06 \x01(\x08H\x02\x88\x01\x01\x12\x1f\n\x12message_type_index\x18\x07 \x01(\x04H\x03\x88\x01\x01\x12\x1c\n\x0f\x65num_type_index\x18\x08 \x01(\x04H\x04\x88\x01\x01\x12P\n\x14number_pretty_format\x18\t \x01(\x0e\x32-.awdd.metadata.DefineObject.Field.IntegerKindH\x05\x88\x01\x01\x12\x46\n\x0bmetric_type\x18\x0c \x01(\x0e\x32,.awdd.metadata.DefineObject.Field.MetricTypeH\x06\x88\x01\x01"\x93\x02\n\x04Kind\x12\x0b\n\x07UNKNOWN\x10\x00\x12\n\n\x06\x44OUBLE\x10\x01\x12\t\n\x05\x46LOAT\x10\x02\x12\t\n\x05INT64\x10\x03\x12\n\n\x06UINT64\x10\x04\x12\x0e\n\nERROR_CODE\x10\x05\x12\t\n\x05INT32\x10\x06\x12\n\n\x06UINT32\x10\x07\x12\x0e\n\nBYTE_COUNT\x10\x08\x12\x13\n\x0fSEQUENCE_NUMBER\x10\t\x12\x11\n\rBEDF_OPERATOR\x10\n\x12\x08\n\x04\x45NUM\x10\x0b\x12\x0b\n\x07\x42OOLEAN\x10\x0c\x12\n\n\x06STRING\x10\r\x12\t\n\x05\x42YTES\x10\x0e\x12\x10\n\x0cPACKED_TIMES\x10\x11\x12\x11\n\rPACKED_ERRORS\x10\x14\x12\x12\n\x0ePACKED_UINT_32\x10\x15\x12\n\n\x06OBJECT\x10\x1b"\xfd\x01\n\x0bIntegerKind\x12\x13\n\x0fUNKNOWN_INTEGER\x10\x00\x12\r\n\tTIMESTAMP\x10\x01\x12\r\n\tMETRIC_ID\x10\x02\x12\x0e\n\nTRIGGER_ID\x10\x03\x12\x0e\n\nPROFILE_ID\x10\x04\x12\x10\n\x0c\x43OMPONENT_ID\x10\x05\x12\x10\n\x0c\x41VERAGE_TIME\x10\x15\x12\x11\n\rTIME_DELTA_MS\x10\x16\x12\x13\n\x0fTIMEZONE_OFFSET\x10\x17\x12\x13\n\x0f\x41SSOCIATED_TIME\x10\x18\x12\x13\n\x0fPERIOD_IN_HOURS\x10\x19\x12\x0f\n\x0bTIME_OF_DAY\x10\x1e\x12\x14\n\x10SAMPLE_TIMESTAMP\x10\x1f"V\n\nMetricType\x12\x12\n\x0eMETRIC_UNKNOWN\x10\x00\x12\x10\n\x0cMETRIC_EVENT\x10\x01\x12\x10\n\x0cMETRIC_STATS\x10\x02\x12\x10\n\x0cMETRIC_STATE\x10\x03\x42\x07\n\x05_nameB\n\n\x08_has_piiB\n\n\x08_has_locB\x15\n\x13_message_type_indexB\x12\n\x10_enum_type_indexB\x17\n\x15_number_pretty_formatB\x0e\n\x0c_metric_typeB\x07\n\x05_name"\xc7\x01\n\x04\x45num\x12\x11\n\x04name\x18\x01 \x01(\tH\x00\x88\x01\x01\x12.\n\x07members\x18\x02 \x03(\x0b\x32\x1d.awdd.metadata.Enum.EnumValue\x1as\n\tEnumValue\x12\x12\n\x05label\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x15\n\x08intValue\x18\x02 \x01(\rH\x01\x88\x01\x01\x12\x16\n\tlongValue\x18\x03 \x01(\x04H\x02\x88\x01\x01\x42\x08\n\x06_labelB\x0b\n\t_intValueB\x0c\n\n_longValueB\x07\n\x05_name"]\n\x08Metadata\x12-\n\x08messages\x18\x01 \x03(\x0b\x32\x1b.awdd.metadata.DefineObject\x12"\n\x05\x65nums\x18\x02 \x03(\x0b\x32\x13.awdd.metadata.Enum"m\n\nExtensions\x12\x37\n\nextensions\x18\x01 \x03(\x0b\x32#.awdd.metadata.Extensions.Extension\x1a&\n\tExtension\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03tag\x18\x02 \x01(\x03"Q\n\x10ManifestIdentity\x12\x10\n\x08git_hash\x18\x01 \x01(\t\x12\x17\n\x0fgit_description\x18\x02 \x01(\t\x12\x12\n\nbuild_time\x18\x03 \x01(\x04\x62\x06proto3', 25 | dependencies=[ 26 | google_dot_protobuf_dot_type__pb2.DESCRIPTOR, 27 | ], 28 | ) 29 | 30 | 31 | _DEFINEOBJECT_FIELD_KIND = _descriptor.EnumDescriptor( 32 | name="Kind", 33 | full_name="awdd.metadata.DefineObject.Field.Kind", 34 | filename=None, 35 | file=DESCRIPTOR, 36 | create_key=_descriptor._internal_create_key, 37 | values=[ 38 | _descriptor.EnumValueDescriptor( 39 | name="UNKNOWN", 40 | index=0, 41 | number=0, 42 | serialized_options=None, 43 | type=None, 44 | create_key=_descriptor._internal_create_key, 45 | ), 46 | _descriptor.EnumValueDescriptor( 47 | name="DOUBLE", 48 | index=1, 49 | number=1, 50 | serialized_options=None, 51 | type=None, 52 | create_key=_descriptor._internal_create_key, 53 | ), 54 | _descriptor.EnumValueDescriptor( 55 | name="FLOAT", 56 | index=2, 57 | number=2, 58 | serialized_options=None, 59 | type=None, 60 | create_key=_descriptor._internal_create_key, 61 | ), 62 | _descriptor.EnumValueDescriptor( 63 | name="INT64", 64 | index=3, 65 | number=3, 66 | serialized_options=None, 67 | type=None, 68 | create_key=_descriptor._internal_create_key, 69 | ), 70 | _descriptor.EnumValueDescriptor( 71 | name="UINT64", 72 | index=4, 73 | number=4, 74 | serialized_options=None, 75 | type=None, 76 | create_key=_descriptor._internal_create_key, 77 | ), 78 | _descriptor.EnumValueDescriptor( 79 | name="ERROR_CODE", 80 | index=5, 81 | number=5, 82 | serialized_options=None, 83 | type=None, 84 | create_key=_descriptor._internal_create_key, 85 | ), 86 | _descriptor.EnumValueDescriptor( 87 | name="INT32", 88 | index=6, 89 | number=6, 90 | serialized_options=None, 91 | type=None, 92 | create_key=_descriptor._internal_create_key, 93 | ), 94 | _descriptor.EnumValueDescriptor( 95 | name="UINT32", 96 | index=7, 97 | number=7, 98 | serialized_options=None, 99 | type=None, 100 | create_key=_descriptor._internal_create_key, 101 | ), 102 | _descriptor.EnumValueDescriptor( 103 | name="BYTE_COUNT", 104 | index=8, 105 | number=8, 106 | serialized_options=None, 107 | type=None, 108 | create_key=_descriptor._internal_create_key, 109 | ), 110 | _descriptor.EnumValueDescriptor( 111 | name="SEQUENCE_NUMBER", 112 | index=9, 113 | number=9, 114 | serialized_options=None, 115 | type=None, 116 | create_key=_descriptor._internal_create_key, 117 | ), 118 | _descriptor.EnumValueDescriptor( 119 | name="BEDF_OPERATOR", 120 | index=10, 121 | number=10, 122 | serialized_options=None, 123 | type=None, 124 | create_key=_descriptor._internal_create_key, 125 | ), 126 | _descriptor.EnumValueDescriptor( 127 | name="ENUM", 128 | index=11, 129 | number=11, 130 | serialized_options=None, 131 | type=None, 132 | create_key=_descriptor._internal_create_key, 133 | ), 134 | _descriptor.EnumValueDescriptor( 135 | name="BOOLEAN", 136 | index=12, 137 | number=12, 138 | serialized_options=None, 139 | type=None, 140 | create_key=_descriptor._internal_create_key, 141 | ), 142 | _descriptor.EnumValueDescriptor( 143 | name="STRING", 144 | index=13, 145 | number=13, 146 | serialized_options=None, 147 | type=None, 148 | create_key=_descriptor._internal_create_key, 149 | ), 150 | _descriptor.EnumValueDescriptor( 151 | name="BYTES", 152 | index=14, 153 | number=14, 154 | serialized_options=None, 155 | type=None, 156 | create_key=_descriptor._internal_create_key, 157 | ), 158 | _descriptor.EnumValueDescriptor( 159 | name="PACKED_TIMES", 160 | index=15, 161 | number=17, 162 | serialized_options=None, 163 | type=None, 164 | create_key=_descriptor._internal_create_key, 165 | ), 166 | _descriptor.EnumValueDescriptor( 167 | name="PACKED_ERRORS", 168 | index=16, 169 | number=20, 170 | serialized_options=None, 171 | type=None, 172 | create_key=_descriptor._internal_create_key, 173 | ), 174 | _descriptor.EnumValueDescriptor( 175 | name="PACKED_UINT_32", 176 | index=17, 177 | number=21, 178 | serialized_options=None, 179 | type=None, 180 | create_key=_descriptor._internal_create_key, 181 | ), 182 | _descriptor.EnumValueDescriptor( 183 | name="OBJECT", 184 | index=18, 185 | number=27, 186 | serialized_options=None, 187 | type=None, 188 | create_key=_descriptor._internal_create_key, 189 | ), 190 | ], 191 | containing_type=None, 192 | serialized_options=None, 193 | serialized_start=534, 194 | serialized_end=809, 195 | ) 196 | _sym_db.RegisterEnumDescriptor(_DEFINEOBJECT_FIELD_KIND) 197 | 198 | _DEFINEOBJECT_FIELD_INTEGERKIND = _descriptor.EnumDescriptor( 199 | name="IntegerKind", 200 | full_name="awdd.metadata.DefineObject.Field.IntegerKind", 201 | filename=None, 202 | file=DESCRIPTOR, 203 | create_key=_descriptor._internal_create_key, 204 | values=[ 205 | _descriptor.EnumValueDescriptor( 206 | name="UNKNOWN_INTEGER", 207 | index=0, 208 | number=0, 209 | serialized_options=None, 210 | type=None, 211 | create_key=_descriptor._internal_create_key, 212 | ), 213 | _descriptor.EnumValueDescriptor( 214 | name="TIMESTAMP", 215 | index=1, 216 | number=1, 217 | serialized_options=None, 218 | type=None, 219 | create_key=_descriptor._internal_create_key, 220 | ), 221 | _descriptor.EnumValueDescriptor( 222 | name="METRIC_ID", 223 | index=2, 224 | number=2, 225 | serialized_options=None, 226 | type=None, 227 | create_key=_descriptor._internal_create_key, 228 | ), 229 | _descriptor.EnumValueDescriptor( 230 | name="TRIGGER_ID", 231 | index=3, 232 | number=3, 233 | serialized_options=None, 234 | type=None, 235 | create_key=_descriptor._internal_create_key, 236 | ), 237 | _descriptor.EnumValueDescriptor( 238 | name="PROFILE_ID", 239 | index=4, 240 | number=4, 241 | serialized_options=None, 242 | type=None, 243 | create_key=_descriptor._internal_create_key, 244 | ), 245 | _descriptor.EnumValueDescriptor( 246 | name="COMPONENT_ID", 247 | index=5, 248 | number=5, 249 | serialized_options=None, 250 | type=None, 251 | create_key=_descriptor._internal_create_key, 252 | ), 253 | _descriptor.EnumValueDescriptor( 254 | name="AVERAGE_TIME", 255 | index=6, 256 | number=21, 257 | serialized_options=None, 258 | type=None, 259 | create_key=_descriptor._internal_create_key, 260 | ), 261 | _descriptor.EnumValueDescriptor( 262 | name="TIME_DELTA_MS", 263 | index=7, 264 | number=22, 265 | serialized_options=None, 266 | type=None, 267 | create_key=_descriptor._internal_create_key, 268 | ), 269 | _descriptor.EnumValueDescriptor( 270 | name="TIMEZONE_OFFSET", 271 | index=8, 272 | number=23, 273 | serialized_options=None, 274 | type=None, 275 | create_key=_descriptor._internal_create_key, 276 | ), 277 | _descriptor.EnumValueDescriptor( 278 | name="ASSOCIATED_TIME", 279 | index=9, 280 | number=24, 281 | serialized_options=None, 282 | type=None, 283 | create_key=_descriptor._internal_create_key, 284 | ), 285 | _descriptor.EnumValueDescriptor( 286 | name="PERIOD_IN_HOURS", 287 | index=10, 288 | number=25, 289 | serialized_options=None, 290 | type=None, 291 | create_key=_descriptor._internal_create_key, 292 | ), 293 | _descriptor.EnumValueDescriptor( 294 | name="TIME_OF_DAY", 295 | index=11, 296 | number=30, 297 | serialized_options=None, 298 | type=None, 299 | create_key=_descriptor._internal_create_key, 300 | ), 301 | _descriptor.EnumValueDescriptor( 302 | name="SAMPLE_TIMESTAMP", 303 | index=12, 304 | number=31, 305 | serialized_options=None, 306 | type=None, 307 | create_key=_descriptor._internal_create_key, 308 | ), 309 | ], 310 | containing_type=None, 311 | serialized_options=None, 312 | serialized_start=812, 313 | serialized_end=1065, 314 | ) 315 | _sym_db.RegisterEnumDescriptor(_DEFINEOBJECT_FIELD_INTEGERKIND) 316 | 317 | _DEFINEOBJECT_FIELD_METRICTYPE = _descriptor.EnumDescriptor( 318 | name="MetricType", 319 | full_name="awdd.metadata.DefineObject.Field.MetricType", 320 | filename=None, 321 | file=DESCRIPTOR, 322 | create_key=_descriptor._internal_create_key, 323 | values=[ 324 | _descriptor.EnumValueDescriptor( 325 | name="METRIC_UNKNOWN", 326 | index=0, 327 | number=0, 328 | serialized_options=None, 329 | type=None, 330 | create_key=_descriptor._internal_create_key, 331 | ), 332 | _descriptor.EnumValueDescriptor( 333 | name="METRIC_EVENT", 334 | index=1, 335 | number=1, 336 | serialized_options=None, 337 | type=None, 338 | create_key=_descriptor._internal_create_key, 339 | ), 340 | _descriptor.EnumValueDescriptor( 341 | name="METRIC_STATS", 342 | index=2, 343 | number=2, 344 | serialized_options=None, 345 | type=None, 346 | create_key=_descriptor._internal_create_key, 347 | ), 348 | _descriptor.EnumValueDescriptor( 349 | name="METRIC_STATE", 350 | index=3, 351 | number=3, 352 | serialized_options=None, 353 | type=None, 354 | create_key=_descriptor._internal_create_key, 355 | ), 356 | ], 357 | containing_type=None, 358 | serialized_options=None, 359 | serialized_start=1067, 360 | serialized_end=1153, 361 | ) 362 | _sym_db.RegisterEnumDescriptor(_DEFINEOBJECT_FIELD_METRICTYPE) 363 | 364 | 365 | _DEFINEOBJECT_FIELD = _descriptor.Descriptor( 366 | name="Field", 367 | full_name="awdd.metadata.DefineObject.Field", 368 | filename=None, 369 | file=DESCRIPTOR, 370 | containing_type=None, 371 | create_key=_descriptor._internal_create_key, 372 | fields=[ 373 | _descriptor.FieldDescriptor( 374 | name="tag", 375 | full_name="awdd.metadata.DefineObject.Field.tag", 376 | index=0, 377 | number=1, 378 | type=4, 379 | cpp_type=4, 380 | label=1, 381 | has_default_value=False, 382 | default_value=0, 383 | message_type=None, 384 | enum_type=None, 385 | containing_type=None, 386 | is_extension=False, 387 | extension_scope=None, 388 | serialized_options=None, 389 | file=DESCRIPTOR, 390 | create_key=_descriptor._internal_create_key, 391 | ), 392 | _descriptor.FieldDescriptor( 393 | name="type", 394 | full_name="awdd.metadata.DefineObject.Field.type", 395 | index=1, 396 | number=2, 397 | type=14, 398 | cpp_type=8, 399 | label=1, 400 | has_default_value=False, 401 | default_value=0, 402 | message_type=None, 403 | enum_type=None, 404 | containing_type=None, 405 | is_extension=False, 406 | extension_scope=None, 407 | serialized_options=None, 408 | file=DESCRIPTOR, 409 | create_key=_descriptor._internal_create_key, 410 | ), 411 | _descriptor.FieldDescriptor( 412 | name="is_repeated", 413 | full_name="awdd.metadata.DefineObject.Field.is_repeated", 414 | index=2, 415 | number=3, 416 | type=8, 417 | cpp_type=7, 418 | label=1, 419 | has_default_value=False, 420 | default_value=False, 421 | message_type=None, 422 | enum_type=None, 423 | containing_type=None, 424 | is_extension=False, 425 | extension_scope=None, 426 | serialized_options=None, 427 | file=DESCRIPTOR, 428 | create_key=_descriptor._internal_create_key, 429 | ), 430 | _descriptor.FieldDescriptor( 431 | name="name", 432 | full_name="awdd.metadata.DefineObject.Field.name", 433 | index=3, 434 | number=4, 435 | type=9, 436 | cpp_type=9, 437 | label=1, 438 | has_default_value=False, 439 | default_value=b"".decode("utf-8"), 440 | message_type=None, 441 | enum_type=None, 442 | containing_type=None, 443 | is_extension=False, 444 | extension_scope=None, 445 | serialized_options=None, 446 | file=DESCRIPTOR, 447 | create_key=_descriptor._internal_create_key, 448 | ), 449 | _descriptor.FieldDescriptor( 450 | name="has_pii", 451 | full_name="awdd.metadata.DefineObject.Field.has_pii", 452 | index=4, 453 | number=5, 454 | type=8, 455 | cpp_type=7, 456 | label=1, 457 | has_default_value=False, 458 | default_value=False, 459 | message_type=None, 460 | enum_type=None, 461 | containing_type=None, 462 | is_extension=False, 463 | extension_scope=None, 464 | serialized_options=None, 465 | file=DESCRIPTOR, 466 | create_key=_descriptor._internal_create_key, 467 | ), 468 | _descriptor.FieldDescriptor( 469 | name="has_loc", 470 | full_name="awdd.metadata.DefineObject.Field.has_loc", 471 | index=5, 472 | number=6, 473 | type=8, 474 | cpp_type=7, 475 | label=1, 476 | has_default_value=False, 477 | default_value=False, 478 | message_type=None, 479 | enum_type=None, 480 | containing_type=None, 481 | is_extension=False, 482 | extension_scope=None, 483 | serialized_options=None, 484 | file=DESCRIPTOR, 485 | create_key=_descriptor._internal_create_key, 486 | ), 487 | _descriptor.FieldDescriptor( 488 | name="message_type_index", 489 | full_name="awdd.metadata.DefineObject.Field.message_type_index", 490 | index=6, 491 | number=7, 492 | type=4, 493 | cpp_type=4, 494 | label=1, 495 | has_default_value=False, 496 | default_value=0, 497 | message_type=None, 498 | enum_type=None, 499 | containing_type=None, 500 | is_extension=False, 501 | extension_scope=None, 502 | serialized_options=None, 503 | file=DESCRIPTOR, 504 | create_key=_descriptor._internal_create_key, 505 | ), 506 | _descriptor.FieldDescriptor( 507 | name="enum_type_index", 508 | full_name="awdd.metadata.DefineObject.Field.enum_type_index", 509 | index=7, 510 | number=8, 511 | type=4, 512 | cpp_type=4, 513 | label=1, 514 | has_default_value=False, 515 | default_value=0, 516 | message_type=None, 517 | enum_type=None, 518 | containing_type=None, 519 | is_extension=False, 520 | extension_scope=None, 521 | serialized_options=None, 522 | file=DESCRIPTOR, 523 | create_key=_descriptor._internal_create_key, 524 | ), 525 | _descriptor.FieldDescriptor( 526 | name="number_pretty_format", 527 | full_name="awdd.metadata.DefineObject.Field.number_pretty_format", 528 | index=8, 529 | number=9, 530 | type=14, 531 | cpp_type=8, 532 | label=1, 533 | has_default_value=False, 534 | default_value=0, 535 | message_type=None, 536 | enum_type=None, 537 | containing_type=None, 538 | is_extension=False, 539 | extension_scope=None, 540 | serialized_options=None, 541 | file=DESCRIPTOR, 542 | create_key=_descriptor._internal_create_key, 543 | ), 544 | _descriptor.FieldDescriptor( 545 | name="metric_type", 546 | full_name="awdd.metadata.DefineObject.Field.metric_type", 547 | index=9, 548 | number=12, 549 | type=14, 550 | cpp_type=8, 551 | label=1, 552 | has_default_value=False, 553 | default_value=0, 554 | message_type=None, 555 | enum_type=None, 556 | containing_type=None, 557 | is_extension=False, 558 | extension_scope=None, 559 | serialized_options=None, 560 | file=DESCRIPTOR, 561 | create_key=_descriptor._internal_create_key, 562 | ), 563 | ], 564 | extensions=[], 565 | nested_types=[], 566 | enum_types=[ 567 | _DEFINEOBJECT_FIELD_KIND, 568 | _DEFINEOBJECT_FIELD_INTEGERKIND, 569 | _DEFINEOBJECT_FIELD_METRICTYPE, 570 | ], 571 | serialized_options=None, 572 | is_extendable=False, 573 | syntax="proto3", 574 | extension_ranges=[], 575 | oneofs=[ 576 | _descriptor.OneofDescriptor( 577 | name="_name", 578 | full_name="awdd.metadata.DefineObject.Field._name", 579 | index=0, 580 | containing_type=None, 581 | create_key=_descriptor._internal_create_key, 582 | fields=[], 583 | ), 584 | _descriptor.OneofDescriptor( 585 | name="_has_pii", 586 | full_name="awdd.metadata.DefineObject.Field._has_pii", 587 | index=1, 588 | containing_type=None, 589 | create_key=_descriptor._internal_create_key, 590 | fields=[], 591 | ), 592 | _descriptor.OneofDescriptor( 593 | name="_has_loc", 594 | full_name="awdd.metadata.DefineObject.Field._has_loc", 595 | index=2, 596 | containing_type=None, 597 | create_key=_descriptor._internal_create_key, 598 | fields=[], 599 | ), 600 | _descriptor.OneofDescriptor( 601 | name="_message_type_index", 602 | full_name="awdd.metadata.DefineObject.Field._message_type_index", 603 | index=3, 604 | containing_type=None, 605 | create_key=_descriptor._internal_create_key, 606 | fields=[], 607 | ), 608 | _descriptor.OneofDescriptor( 609 | name="_enum_type_index", 610 | full_name="awdd.metadata.DefineObject.Field._enum_type_index", 611 | index=4, 612 | containing_type=None, 613 | create_key=_descriptor._internal_create_key, 614 | fields=[], 615 | ), 616 | _descriptor.OneofDescriptor( 617 | name="_number_pretty_format", 618 | full_name="awdd.metadata.DefineObject.Field._number_pretty_format", 619 | index=5, 620 | containing_type=None, 621 | create_key=_descriptor._internal_create_key, 622 | fields=[], 623 | ), 624 | _descriptor.OneofDescriptor( 625 | name="_metric_type", 626 | full_name="awdd.metadata.DefineObject.Field._metric_type", 627 | index=6, 628 | containing_type=None, 629 | create_key=_descriptor._internal_create_key, 630 | fields=[], 631 | ), 632 | ], 633 | serialized_start=156, 634 | serialized_end=1270, 635 | ) 636 | 637 | _DEFINEOBJECT = _descriptor.Descriptor( 638 | name="DefineObject", 639 | full_name="awdd.metadata.DefineObject", 640 | filename=None, 641 | file=DESCRIPTOR, 642 | containing_type=None, 643 | create_key=_descriptor._internal_create_key, 644 | fields=[ 645 | _descriptor.FieldDescriptor( 646 | name="name", 647 | full_name="awdd.metadata.DefineObject.name", 648 | index=0, 649 | number=1, 650 | type=9, 651 | cpp_type=9, 652 | label=1, 653 | has_default_value=False, 654 | default_value=b"".decode("utf-8"), 655 | message_type=None, 656 | enum_type=None, 657 | containing_type=None, 658 | is_extension=False, 659 | extension_scope=None, 660 | serialized_options=None, 661 | file=DESCRIPTOR, 662 | create_key=_descriptor._internal_create_key, 663 | ), 664 | _descriptor.FieldDescriptor( 665 | name="fields", 666 | full_name="awdd.metadata.DefineObject.fields", 667 | index=1, 668 | number=2, 669 | type=11, 670 | cpp_type=10, 671 | label=3, 672 | has_default_value=False, 673 | default_value=[], 674 | message_type=None, 675 | enum_type=None, 676 | containing_type=None, 677 | is_extension=False, 678 | extension_scope=None, 679 | serialized_options=None, 680 | file=DESCRIPTOR, 681 | create_key=_descriptor._internal_create_key, 682 | ), 683 | ], 684 | extensions=[], 685 | nested_types=[ 686 | _DEFINEOBJECT_FIELD, 687 | ], 688 | enum_types=[], 689 | serialized_options=None, 690 | is_extendable=False, 691 | syntax="proto3", 692 | extension_ranges=[], 693 | oneofs=[ 694 | _descriptor.OneofDescriptor( 695 | name="_name", 696 | full_name="awdd.metadata.DefineObject._name", 697 | index=0, 698 | containing_type=None, 699 | create_key=_descriptor._internal_create_key, 700 | fields=[], 701 | ), 702 | ], 703 | serialized_start=69, 704 | serialized_end=1279, 705 | ) 706 | 707 | 708 | _ENUM_ENUMVALUE = _descriptor.Descriptor( 709 | name="EnumValue", 710 | full_name="awdd.metadata.Enum.EnumValue", 711 | filename=None, 712 | file=DESCRIPTOR, 713 | containing_type=None, 714 | create_key=_descriptor._internal_create_key, 715 | fields=[ 716 | _descriptor.FieldDescriptor( 717 | name="label", 718 | full_name="awdd.metadata.Enum.EnumValue.label", 719 | index=0, 720 | number=1, 721 | type=9, 722 | cpp_type=9, 723 | label=1, 724 | has_default_value=False, 725 | default_value=b"".decode("utf-8"), 726 | message_type=None, 727 | enum_type=None, 728 | containing_type=None, 729 | is_extension=False, 730 | extension_scope=None, 731 | serialized_options=None, 732 | file=DESCRIPTOR, 733 | create_key=_descriptor._internal_create_key, 734 | ), 735 | _descriptor.FieldDescriptor( 736 | name="intValue", 737 | full_name="awdd.metadata.Enum.EnumValue.intValue", 738 | index=1, 739 | number=2, 740 | type=13, 741 | cpp_type=3, 742 | label=1, 743 | has_default_value=False, 744 | default_value=0, 745 | message_type=None, 746 | enum_type=None, 747 | containing_type=None, 748 | is_extension=False, 749 | extension_scope=None, 750 | serialized_options=None, 751 | file=DESCRIPTOR, 752 | create_key=_descriptor._internal_create_key, 753 | ), 754 | _descriptor.FieldDescriptor( 755 | name="longValue", 756 | full_name="awdd.metadata.Enum.EnumValue.longValue", 757 | index=2, 758 | number=3, 759 | type=4, 760 | cpp_type=4, 761 | label=1, 762 | has_default_value=False, 763 | default_value=0, 764 | message_type=None, 765 | enum_type=None, 766 | containing_type=None, 767 | is_extension=False, 768 | extension_scope=None, 769 | serialized_options=None, 770 | file=DESCRIPTOR, 771 | create_key=_descriptor._internal_create_key, 772 | ), 773 | ], 774 | extensions=[], 775 | nested_types=[], 776 | enum_types=[], 777 | serialized_options=None, 778 | is_extendable=False, 779 | syntax="proto3", 780 | extension_ranges=[], 781 | oneofs=[ 782 | _descriptor.OneofDescriptor( 783 | name="_label", 784 | full_name="awdd.metadata.Enum.EnumValue._label", 785 | index=0, 786 | containing_type=None, 787 | create_key=_descriptor._internal_create_key, 788 | fields=[], 789 | ), 790 | _descriptor.OneofDescriptor( 791 | name="_intValue", 792 | full_name="awdd.metadata.Enum.EnumValue._intValue", 793 | index=1, 794 | containing_type=None, 795 | create_key=_descriptor._internal_create_key, 796 | fields=[], 797 | ), 798 | _descriptor.OneofDescriptor( 799 | name="_longValue", 800 | full_name="awdd.metadata.Enum.EnumValue._longValue", 801 | index=2, 802 | containing_type=None, 803 | create_key=_descriptor._internal_create_key, 804 | fields=[], 805 | ), 806 | ], 807 | serialized_start=1357, 808 | serialized_end=1472, 809 | ) 810 | 811 | _ENUM = _descriptor.Descriptor( 812 | name="Enum", 813 | full_name="awdd.metadata.Enum", 814 | filename=None, 815 | file=DESCRIPTOR, 816 | containing_type=None, 817 | create_key=_descriptor._internal_create_key, 818 | fields=[ 819 | _descriptor.FieldDescriptor( 820 | name="name", 821 | full_name="awdd.metadata.Enum.name", 822 | index=0, 823 | number=1, 824 | type=9, 825 | cpp_type=9, 826 | label=1, 827 | has_default_value=False, 828 | default_value=b"".decode("utf-8"), 829 | message_type=None, 830 | enum_type=None, 831 | containing_type=None, 832 | is_extension=False, 833 | extension_scope=None, 834 | serialized_options=None, 835 | file=DESCRIPTOR, 836 | create_key=_descriptor._internal_create_key, 837 | ), 838 | _descriptor.FieldDescriptor( 839 | name="members", 840 | full_name="awdd.metadata.Enum.members", 841 | index=1, 842 | number=2, 843 | type=11, 844 | cpp_type=10, 845 | label=3, 846 | has_default_value=False, 847 | default_value=[], 848 | message_type=None, 849 | enum_type=None, 850 | containing_type=None, 851 | is_extension=False, 852 | extension_scope=None, 853 | serialized_options=None, 854 | file=DESCRIPTOR, 855 | create_key=_descriptor._internal_create_key, 856 | ), 857 | ], 858 | extensions=[], 859 | nested_types=[ 860 | _ENUM_ENUMVALUE, 861 | ], 862 | enum_types=[], 863 | serialized_options=None, 864 | is_extendable=False, 865 | syntax="proto3", 866 | extension_ranges=[], 867 | oneofs=[ 868 | _descriptor.OneofDescriptor( 869 | name="_name", 870 | full_name="awdd.metadata.Enum._name", 871 | index=0, 872 | containing_type=None, 873 | create_key=_descriptor._internal_create_key, 874 | fields=[], 875 | ), 876 | ], 877 | serialized_start=1282, 878 | serialized_end=1481, 879 | ) 880 | 881 | 882 | _METADATA = _descriptor.Descriptor( 883 | name="Metadata", 884 | full_name="awdd.metadata.Metadata", 885 | filename=None, 886 | file=DESCRIPTOR, 887 | containing_type=None, 888 | create_key=_descriptor._internal_create_key, 889 | fields=[ 890 | _descriptor.FieldDescriptor( 891 | name="messages", 892 | full_name="awdd.metadata.Metadata.messages", 893 | index=0, 894 | number=1, 895 | type=11, 896 | cpp_type=10, 897 | label=3, 898 | has_default_value=False, 899 | default_value=[], 900 | message_type=None, 901 | enum_type=None, 902 | containing_type=None, 903 | is_extension=False, 904 | extension_scope=None, 905 | serialized_options=None, 906 | file=DESCRIPTOR, 907 | create_key=_descriptor._internal_create_key, 908 | ), 909 | _descriptor.FieldDescriptor( 910 | name="enums", 911 | full_name="awdd.metadata.Metadata.enums", 912 | index=1, 913 | number=2, 914 | type=11, 915 | cpp_type=10, 916 | label=3, 917 | has_default_value=False, 918 | default_value=[], 919 | message_type=None, 920 | enum_type=None, 921 | containing_type=None, 922 | is_extension=False, 923 | extension_scope=None, 924 | serialized_options=None, 925 | file=DESCRIPTOR, 926 | create_key=_descriptor._internal_create_key, 927 | ), 928 | ], 929 | extensions=[], 930 | nested_types=[], 931 | enum_types=[], 932 | serialized_options=None, 933 | is_extendable=False, 934 | syntax="proto3", 935 | extension_ranges=[], 936 | oneofs=[], 937 | serialized_start=1483, 938 | serialized_end=1576, 939 | ) 940 | 941 | 942 | _EXTENSIONS_EXTENSION = _descriptor.Descriptor( 943 | name="Extension", 944 | full_name="awdd.metadata.Extensions.Extension", 945 | filename=None, 946 | file=DESCRIPTOR, 947 | containing_type=None, 948 | create_key=_descriptor._internal_create_key, 949 | fields=[ 950 | _descriptor.FieldDescriptor( 951 | name="name", 952 | full_name="awdd.metadata.Extensions.Extension.name", 953 | index=0, 954 | number=1, 955 | type=9, 956 | cpp_type=9, 957 | label=1, 958 | has_default_value=False, 959 | default_value=b"".decode("utf-8"), 960 | message_type=None, 961 | enum_type=None, 962 | containing_type=None, 963 | is_extension=False, 964 | extension_scope=None, 965 | serialized_options=None, 966 | file=DESCRIPTOR, 967 | create_key=_descriptor._internal_create_key, 968 | ), 969 | _descriptor.FieldDescriptor( 970 | name="tag", 971 | full_name="awdd.metadata.Extensions.Extension.tag", 972 | index=1, 973 | number=2, 974 | type=3, 975 | cpp_type=2, 976 | label=1, 977 | has_default_value=False, 978 | default_value=0, 979 | message_type=None, 980 | enum_type=None, 981 | containing_type=None, 982 | is_extension=False, 983 | extension_scope=None, 984 | serialized_options=None, 985 | file=DESCRIPTOR, 986 | create_key=_descriptor._internal_create_key, 987 | ), 988 | ], 989 | extensions=[], 990 | nested_types=[], 991 | enum_types=[], 992 | serialized_options=None, 993 | is_extendable=False, 994 | syntax="proto3", 995 | extension_ranges=[], 996 | oneofs=[], 997 | serialized_start=1649, 998 | serialized_end=1687, 999 | ) 1000 | 1001 | _EXTENSIONS = _descriptor.Descriptor( 1002 | name="Extensions", 1003 | full_name="awdd.metadata.Extensions", 1004 | filename=None, 1005 | file=DESCRIPTOR, 1006 | containing_type=None, 1007 | create_key=_descriptor._internal_create_key, 1008 | fields=[ 1009 | _descriptor.FieldDescriptor( 1010 | name="extensions", 1011 | full_name="awdd.metadata.Extensions.extensions", 1012 | index=0, 1013 | number=1, 1014 | type=11, 1015 | cpp_type=10, 1016 | label=3, 1017 | has_default_value=False, 1018 | default_value=[], 1019 | message_type=None, 1020 | enum_type=None, 1021 | containing_type=None, 1022 | is_extension=False, 1023 | extension_scope=None, 1024 | serialized_options=None, 1025 | file=DESCRIPTOR, 1026 | create_key=_descriptor._internal_create_key, 1027 | ), 1028 | ], 1029 | extensions=[], 1030 | nested_types=[ 1031 | _EXTENSIONS_EXTENSION, 1032 | ], 1033 | enum_types=[], 1034 | serialized_options=None, 1035 | is_extendable=False, 1036 | syntax="proto3", 1037 | extension_ranges=[], 1038 | oneofs=[], 1039 | serialized_start=1578, 1040 | serialized_end=1687, 1041 | ) 1042 | 1043 | 1044 | _MANIFESTIDENTITY = _descriptor.Descriptor( 1045 | name="ManifestIdentity", 1046 | full_name="awdd.metadata.ManifestIdentity", 1047 | filename=None, 1048 | file=DESCRIPTOR, 1049 | containing_type=None, 1050 | create_key=_descriptor._internal_create_key, 1051 | fields=[ 1052 | _descriptor.FieldDescriptor( 1053 | name="git_hash", 1054 | full_name="awdd.metadata.ManifestIdentity.git_hash", 1055 | index=0, 1056 | number=1, 1057 | type=9, 1058 | cpp_type=9, 1059 | label=1, 1060 | has_default_value=False, 1061 | default_value=b"".decode("utf-8"), 1062 | message_type=None, 1063 | enum_type=None, 1064 | containing_type=None, 1065 | is_extension=False, 1066 | extension_scope=None, 1067 | serialized_options=None, 1068 | file=DESCRIPTOR, 1069 | create_key=_descriptor._internal_create_key, 1070 | ), 1071 | _descriptor.FieldDescriptor( 1072 | name="git_description", 1073 | full_name="awdd.metadata.ManifestIdentity.git_description", 1074 | index=1, 1075 | number=2, 1076 | type=9, 1077 | cpp_type=9, 1078 | label=1, 1079 | has_default_value=False, 1080 | default_value=b"".decode("utf-8"), 1081 | message_type=None, 1082 | enum_type=None, 1083 | containing_type=None, 1084 | is_extension=False, 1085 | extension_scope=None, 1086 | serialized_options=None, 1087 | file=DESCRIPTOR, 1088 | create_key=_descriptor._internal_create_key, 1089 | ), 1090 | _descriptor.FieldDescriptor( 1091 | name="build_time", 1092 | full_name="awdd.metadata.ManifestIdentity.build_time", 1093 | index=2, 1094 | number=3, 1095 | type=4, 1096 | cpp_type=4, 1097 | label=1, 1098 | has_default_value=False, 1099 | default_value=0, 1100 | message_type=None, 1101 | enum_type=None, 1102 | containing_type=None, 1103 | is_extension=False, 1104 | extension_scope=None, 1105 | serialized_options=None, 1106 | file=DESCRIPTOR, 1107 | create_key=_descriptor._internal_create_key, 1108 | ), 1109 | ], 1110 | extensions=[], 1111 | nested_types=[], 1112 | enum_types=[], 1113 | serialized_options=None, 1114 | is_extendable=False, 1115 | syntax="proto3", 1116 | extension_ranges=[], 1117 | oneofs=[], 1118 | serialized_start=1689, 1119 | serialized_end=1770, 1120 | ) 1121 | 1122 | _DEFINEOBJECT_FIELD.fields_by_name["type"].enum_type = _DEFINEOBJECT_FIELD_KIND 1123 | _DEFINEOBJECT_FIELD.fields_by_name[ 1124 | "number_pretty_format" 1125 | ].enum_type = _DEFINEOBJECT_FIELD_INTEGERKIND 1126 | _DEFINEOBJECT_FIELD.fields_by_name[ 1127 | "metric_type" 1128 | ].enum_type = _DEFINEOBJECT_FIELD_METRICTYPE 1129 | _DEFINEOBJECT_FIELD.containing_type = _DEFINEOBJECT 1130 | _DEFINEOBJECT_FIELD_KIND.containing_type = _DEFINEOBJECT_FIELD 1131 | _DEFINEOBJECT_FIELD_INTEGERKIND.containing_type = _DEFINEOBJECT_FIELD 1132 | _DEFINEOBJECT_FIELD_METRICTYPE.containing_type = _DEFINEOBJECT_FIELD 1133 | _DEFINEOBJECT_FIELD.oneofs_by_name["_name"].fields.append( 1134 | _DEFINEOBJECT_FIELD.fields_by_name["name"] 1135 | ) 1136 | _DEFINEOBJECT_FIELD.fields_by_name[ 1137 | "name" 1138 | ].containing_oneof = _DEFINEOBJECT_FIELD.oneofs_by_name["_name"] 1139 | _DEFINEOBJECT_FIELD.oneofs_by_name["_has_pii"].fields.append( 1140 | _DEFINEOBJECT_FIELD.fields_by_name["has_pii"] 1141 | ) 1142 | _DEFINEOBJECT_FIELD.fields_by_name[ 1143 | "has_pii" 1144 | ].containing_oneof = _DEFINEOBJECT_FIELD.oneofs_by_name["_has_pii"] 1145 | _DEFINEOBJECT_FIELD.oneofs_by_name["_has_loc"].fields.append( 1146 | _DEFINEOBJECT_FIELD.fields_by_name["has_loc"] 1147 | ) 1148 | _DEFINEOBJECT_FIELD.fields_by_name[ 1149 | "has_loc" 1150 | ].containing_oneof = _DEFINEOBJECT_FIELD.oneofs_by_name["_has_loc"] 1151 | _DEFINEOBJECT_FIELD.oneofs_by_name["_message_type_index"].fields.append( 1152 | _DEFINEOBJECT_FIELD.fields_by_name["message_type_index"] 1153 | ) 1154 | _DEFINEOBJECT_FIELD.fields_by_name[ 1155 | "message_type_index" 1156 | ].containing_oneof = _DEFINEOBJECT_FIELD.oneofs_by_name["_message_type_index"] 1157 | _DEFINEOBJECT_FIELD.oneofs_by_name["_enum_type_index"].fields.append( 1158 | _DEFINEOBJECT_FIELD.fields_by_name["enum_type_index"] 1159 | ) 1160 | _DEFINEOBJECT_FIELD.fields_by_name[ 1161 | "enum_type_index" 1162 | ].containing_oneof = _DEFINEOBJECT_FIELD.oneofs_by_name["_enum_type_index"] 1163 | _DEFINEOBJECT_FIELD.oneofs_by_name["_number_pretty_format"].fields.append( 1164 | _DEFINEOBJECT_FIELD.fields_by_name["number_pretty_format"] 1165 | ) 1166 | _DEFINEOBJECT_FIELD.fields_by_name[ 1167 | "number_pretty_format" 1168 | ].containing_oneof = _DEFINEOBJECT_FIELD.oneofs_by_name["_number_pretty_format"] 1169 | _DEFINEOBJECT_FIELD.oneofs_by_name["_metric_type"].fields.append( 1170 | _DEFINEOBJECT_FIELD.fields_by_name["metric_type"] 1171 | ) 1172 | _DEFINEOBJECT_FIELD.fields_by_name[ 1173 | "metric_type" 1174 | ].containing_oneof = _DEFINEOBJECT_FIELD.oneofs_by_name["_metric_type"] 1175 | _DEFINEOBJECT.fields_by_name["fields"].message_type = _DEFINEOBJECT_FIELD 1176 | _DEFINEOBJECT.oneofs_by_name["_name"].fields.append( 1177 | _DEFINEOBJECT.fields_by_name["name"] 1178 | ) 1179 | _DEFINEOBJECT.fields_by_name["name"].containing_oneof = _DEFINEOBJECT.oneofs_by_name[ 1180 | "_name" 1181 | ] 1182 | _ENUM_ENUMVALUE.containing_type = _ENUM 1183 | _ENUM_ENUMVALUE.oneofs_by_name["_label"].fields.append( 1184 | _ENUM_ENUMVALUE.fields_by_name["label"] 1185 | ) 1186 | _ENUM_ENUMVALUE.fields_by_name[ 1187 | "label" 1188 | ].containing_oneof = _ENUM_ENUMVALUE.oneofs_by_name["_label"] 1189 | _ENUM_ENUMVALUE.oneofs_by_name["_intValue"].fields.append( 1190 | _ENUM_ENUMVALUE.fields_by_name["intValue"] 1191 | ) 1192 | _ENUM_ENUMVALUE.fields_by_name[ 1193 | "intValue" 1194 | ].containing_oneof = _ENUM_ENUMVALUE.oneofs_by_name["_intValue"] 1195 | _ENUM_ENUMVALUE.oneofs_by_name["_longValue"].fields.append( 1196 | _ENUM_ENUMVALUE.fields_by_name["longValue"] 1197 | ) 1198 | _ENUM_ENUMVALUE.fields_by_name[ 1199 | "longValue" 1200 | ].containing_oneof = _ENUM_ENUMVALUE.oneofs_by_name["_longValue"] 1201 | _ENUM.fields_by_name["members"].message_type = _ENUM_ENUMVALUE 1202 | _ENUM.oneofs_by_name["_name"].fields.append(_ENUM.fields_by_name["name"]) 1203 | _ENUM.fields_by_name["name"].containing_oneof = _ENUM.oneofs_by_name["_name"] 1204 | _METADATA.fields_by_name["messages"].message_type = _DEFINEOBJECT 1205 | _METADATA.fields_by_name["enums"].message_type = _ENUM 1206 | _EXTENSIONS_EXTENSION.containing_type = _EXTENSIONS 1207 | _EXTENSIONS.fields_by_name["extensions"].message_type = _EXTENSIONS_EXTENSION 1208 | DESCRIPTOR.message_types_by_name["DefineObject"] = _DEFINEOBJECT 1209 | DESCRIPTOR.message_types_by_name["Enum"] = _ENUM 1210 | DESCRIPTOR.message_types_by_name["Metadata"] = _METADATA 1211 | DESCRIPTOR.message_types_by_name["Extensions"] = _EXTENSIONS 1212 | DESCRIPTOR.message_types_by_name["ManifestIdentity"] = _MANIFESTIDENTITY 1213 | _sym_db.RegisterFileDescriptor(DESCRIPTOR) 1214 | 1215 | DefineObject = _reflection.GeneratedProtocolMessageType( 1216 | "DefineObject", 1217 | (_message.Message,), 1218 | { 1219 | "Field": _reflection.GeneratedProtocolMessageType( 1220 | "Field", 1221 | (_message.Message,), 1222 | { 1223 | "DESCRIPTOR": _DEFINEOBJECT_FIELD, 1224 | "__module__": "protos.metadata_pb2" 1225 | # @@protoc_insertion_point(class_scope:awdd.metadata.DefineObject.Field) 1226 | }, 1227 | ), 1228 | "DESCRIPTOR": _DEFINEOBJECT, 1229 | "__module__": "protos.metadata_pb2" 1230 | # @@protoc_insertion_point(class_scope:awdd.metadata.DefineObject) 1231 | }, 1232 | ) 1233 | _sym_db.RegisterMessage(DefineObject) 1234 | _sym_db.RegisterMessage(DefineObject.Field) 1235 | 1236 | Enum = _reflection.GeneratedProtocolMessageType( 1237 | "Enum", 1238 | (_message.Message,), 1239 | { 1240 | "EnumValue": _reflection.GeneratedProtocolMessageType( 1241 | "EnumValue", 1242 | (_message.Message,), 1243 | { 1244 | "DESCRIPTOR": _ENUM_ENUMVALUE, 1245 | "__module__": "protos.metadata_pb2" 1246 | # @@protoc_insertion_point(class_scope:awdd.metadata.Enum.EnumValue) 1247 | }, 1248 | ), 1249 | "DESCRIPTOR": _ENUM, 1250 | "__module__": "protos.metadata_pb2" 1251 | # @@protoc_insertion_point(class_scope:awdd.metadata.Enum) 1252 | }, 1253 | ) 1254 | _sym_db.RegisterMessage(Enum) 1255 | _sym_db.RegisterMessage(Enum.EnumValue) 1256 | 1257 | Metadata = _reflection.GeneratedProtocolMessageType( 1258 | "Metadata", 1259 | (_message.Message,), 1260 | { 1261 | "DESCRIPTOR": _METADATA, 1262 | "__module__": "protos.metadata_pb2" 1263 | # @@protoc_insertion_point(class_scope:awdd.metadata.Metadata) 1264 | }, 1265 | ) 1266 | _sym_db.RegisterMessage(Metadata) 1267 | 1268 | Extensions = _reflection.GeneratedProtocolMessageType( 1269 | "Extensions", 1270 | (_message.Message,), 1271 | { 1272 | "Extension": _reflection.GeneratedProtocolMessageType( 1273 | "Extension", 1274 | (_message.Message,), 1275 | { 1276 | "DESCRIPTOR": _EXTENSIONS_EXTENSION, 1277 | "__module__": "protos.metadata_pb2" 1278 | # @@protoc_insertion_point(class_scope:awdd.metadata.Extensions.Extension) 1279 | }, 1280 | ), 1281 | "DESCRIPTOR": _EXTENSIONS, 1282 | "__module__": "protos.metadata_pb2" 1283 | # @@protoc_insertion_point(class_scope:awdd.metadata.Extensions) 1284 | }, 1285 | ) 1286 | _sym_db.RegisterMessage(Extensions) 1287 | _sym_db.RegisterMessage(Extensions.Extension) 1288 | 1289 | ManifestIdentity = _reflection.GeneratedProtocolMessageType( 1290 | "ManifestIdentity", 1291 | (_message.Message,), 1292 | { 1293 | "DESCRIPTOR": _MANIFESTIDENTITY, 1294 | "__module__": "protos.metadata_pb2" 1295 | # @@protoc_insertion_point(class_scope:awdd.metadata.ManifestIdentity) 1296 | }, 1297 | ) 1298 | _sym_db.RegisterMessage(ManifestIdentity) 1299 | 1300 | 1301 | # @@protoc_insertion_point(module_scope) 1302 | -------------------------------------------------------------------------------- /awdd/text_serializer.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hack-different/apple-diagnostics-format/afe80d2c08b950e201d6c2e1b8817157187bffd7/awdd/text_serializer.py -------------------------------------------------------------------------------- /awdd/text_writer.py: -------------------------------------------------------------------------------- 1 | from . import WriterBase 2 | from .object import * 3 | from io import IOBase 4 | 5 | 6 | class TextWriter: 7 | def write_to(self, value: DiagnosticObject, stream: IOBase) -> None: 8 | pass 9 | 10 | def _write_to_internal(self, value: DiagnosticObject): 11 | indent_space = indent * "\t" 12 | for prop in value.properties: 13 | if prop.property.type != PropertyType.OBJECT: 14 | stream.write(f"{indent_space}{prop.property.name}: {prop.value}\n") 15 | else: 16 | stream.write(indent_space + prop.property.name + " {\n") 17 | self.write_to(prop.value, stream, indent + 1) 18 | stream.write(indent_space + "}\n") 19 | -------------------------------------------------------------------------------- /bin/awdd2json.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hack-different/apple-diagnostics-format/afe80d2c08b950e201d6c2e1b8817157187bffd7/bin/awdd2json.py -------------------------------------------------------------------------------- /bin/awdd2text.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hack-different/apple-diagnostics-format/afe80d2c08b950e201d6c2e1b8817157187bffd7/bin/awdd2text.py -------------------------------------------------------------------------------- /bin/awdm2components.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import io 3 | import os.path 4 | import glob 5 | from enum import IntEnum 6 | from typing import * 7 | import struct 8 | import sys 9 | 10 | # Primal metadata parser that simply shreds into regions for analysis 11 | # this likely wont be useful beyond the reverse engineering of this format or 12 | # when new variations occur, you probably want the higher level APIs 13 | 14 | ROOT_MANIFEST_PATH = '/System/Library/PrivateFrameworks/WirelessDiagnostics.framework/Support/AWDMetadata.bin' 15 | EXTENSION_MANIFEST_PATH = '/System/Library/AWD/Metadata/*.bin' 16 | 17 | 18 | def copy_io(io_from: BinaryIO, io_to: BinaryIO, count: int, buf_size=16384): 19 | remaining = count 20 | while remaining > 0: 21 | chunk_size = min(remaining, buf_size) 22 | buf = io_from.read(chunk_size) 23 | if not buf: 24 | break 25 | io_to.write(buf) 26 | remaining -= chunk_size 27 | 28 | 29 | class ManifestRegionType(IntEnum): 30 | structure = 0x02 31 | display = 0x03 32 | identity = 0x04 33 | root = 0x05 34 | linkage = 0x06 35 | 36 | 37 | class ManifestRegion: 38 | parser: 'ManifestParser' 39 | type: ManifestRegionType 40 | offset: int 41 | size: int 42 | 43 | def __init__(self, parser: 'ManifestParser', region_type: ManifestRegionType, offset: int, size: int): 44 | self.parser = parser 45 | self.type = region_type 46 | self.offset = offset 47 | self.size = size 48 | 49 | def file_name(self): 50 | return f"{self.parser.file_name}_region_{self.type}.bin" 51 | 52 | def write_out_to(self, output_dir: str): 53 | with open(os.path.join(output_dir, os.path.basename(self.file_name())), "wb") as output: 54 | self.parser.data.seek(self.offset, io.SEEK_SET) 55 | copy_io(self.parser.data, output, self.size) 56 | 57 | 58 | class ManifestTable(ManifestRegion): 59 | tag: int 60 | checksum: int 61 | 62 | def __init__(self, parser: 'ManifestParser', region_type: ManifestRegionType, offset: int, size: int, tag: int, checksum: int): 63 | super().__init__(parser, region_type, offset, size) 64 | self.tag = tag 65 | self.checksum = checksum 66 | 67 | def file_name(self): 68 | return f"{self.parser.file_name}_region_{self.type}_tag_{self.tag}.bin" 69 | 70 | 71 | class ManifestParser: 72 | MANIFEST_MAGIC = b'AWDM' 73 | HEADER_STRUCT = b'4sHH' 74 | HEADER_SECTION_COUNT = b'I' 75 | HEADER_SECTION_AND_COUNT = b'HH' 76 | HEADER_TABLE_STRUCT = b'IIII' 77 | HEADER_FOOTER_STRUCT = b'II' 78 | 79 | file_name: str 80 | major: int 81 | minor: int 82 | data: BinaryIO 83 | regions: List[ManifestRegion] 84 | 85 | def __init__(self, path: str): 86 | if not os.path.isfile(path): 87 | raise Exception("Path does not exist") 88 | 89 | self.file_name = path 90 | self.data = open(self.file_name, "rb") 91 | self.regions = [] 92 | 93 | def parse(self): 94 | magic, self.major, self.minor = struct.unpack(ManifestParser.HEADER_STRUCT, 95 | self.data.read(struct.calcsize(ManifestParser.HEADER_STRUCT))) 96 | 97 | if magic != ManifestParser.MANIFEST_MAGIC: 98 | raise Exception(f"Incorrect MAGIC (got {magic})") 99 | 100 | if self.major != 1 or self.minor != 1: 101 | raise Exception(f"Unsupported version (got {self.major}.{self.minor})") 102 | 103 | sections, *_ = struct.unpack(ManifestParser.HEADER_SECTION_COUNT, 104 | self.data.read(struct.calcsize(ManifestParser.HEADER_SECTION_COUNT))) 105 | 106 | def parse_region() -> Optional[ManifestRegion]: 107 | header_tag, field_count = struct.unpack(ManifestParser.HEADER_SECTION_AND_COUNT, 108 | self.data.read( 109 | struct.calcsize(ManifestParser.HEADER_SECTION_AND_COUNT))) 110 | 111 | if header_tag == 0 and field_count == 0: 112 | return None 113 | 114 | parsed_tag = ManifestRegionType(header_tag) 115 | 116 | if field_count == 0x04: 117 | tag, offset, size, checksum = \ 118 | struct.unpack(ManifestParser.HEADER_TABLE_STRUCT, 119 | self.data.read(struct.calcsize(ManifestParser.HEADER_TABLE_STRUCT))) 120 | 121 | return ManifestTable(self, parsed_tag, offset, size, tag, checksum) 122 | 123 | elif field_count == 0x02: 124 | offset, size = struct.unpack(ManifestParser.HEADER_FOOTER_STRUCT, 125 | self.data.read(struct.calcsize(ManifestParser.HEADER_FOOTER_STRUCT))) 126 | 127 | return ManifestRegion(self, parsed_tag, offset, size) 128 | 129 | else: 130 | raise Exception(f"Unsupported header tag at {header_tag} count {field_count}") 131 | 132 | while single_region := parse_region(): 133 | if single_region is None: 134 | break 135 | 136 | self.regions.append(single_region) 137 | 138 | 139 | if len(sys.argv) != 2: 140 | print("Usage: awdm2components.py OUTPUT_DIRECTORY") 141 | exit(-1) 142 | 143 | 144 | # If we are called with no arguments, substitute root and all extension manifests 145 | files = [ROOT_MANIFEST_PATH] + glob.glob(EXTENSION_MANIFEST_PATH) 146 | for file in files: 147 | manifest = ManifestParser(file) 148 | manifest.parse() 149 | 150 | for region in manifest.regions: 151 | region.write_out_to(sys.argv[1]) 152 | -------------------------------------------------------------------------------- /docs/FORMAT.md: -------------------------------------------------------------------------------- 1 | # Custom TLV encoding 2 | 3 | 4 | ## Tags 5 | 6 | Tags are multi-byte integers with the lowest 3 bits being the primal type, while the remaining 7 | bits get shifted right (`>> 3`) to become the "index" from the definition. This makes the 8 | "timestamp" value in a log (tag `0x08`) actually type `0x00` and index `0x01` matching up with 9 | definition from the ambiant root file. Having a lowest order bit of 0x00 means that the value is 10 | to be interpreted as a multi-byte integer. 11 | 12 | Tags that are high in the lowest order bit are length prefixed (common of strings) 13 | 14 | * `0x08` index 1 with a type of `0x00` - e.g. "timestamp" 15 | * `0x10` index 2 with a type of `0x00` - PropertyDefinition.Index 16 | * `0x18` index 3 with a type of `0x00` - PropertyDefinition.Flags 17 | * `0x22` index 4 with a type of `0x02` - PropertyDefinition.Name 18 | * `0x0A` index 1 with a type of `0x02` - ObjectDefinition 19 | * `0x12` index 2 with a type of `0x02` - PropertyDefinition 20 | 21 | Clearly we demonstrate a primordial integer vs a length prefixed sequence 22 | 23 | ### Types 24 | 25 | Potential for enum or flags 26 | 27 | * `0x00` - Length encoded integer 28 | * `0x01` - FLAG? 29 | * `0x02` - Object with length prefixed multi-byte integer 30 | * `0x03` 31 | * `0x04` - FLAG? 32 | * `0x05` 33 | * `0x06` 34 | * `0x07` 35 | 36 | This implies that type `0x02` is some form of sequence 37 | 38 | ## Multi-byte integers 39 | 40 | The AWDD format can encode multi-byte integers in a format similar to ASN.1 41 | (I'm not yet totally convinced this _isn't_ ASN.1 but hey, when have I ever 42 | done protocols the easy way?). 43 | 44 | For a multi-byte integer the high order bit (`0x80`) is set on all bytes which are 45 | not the final byte of the integer. Once all the bytes of the integer are collected, 46 | the high order bit is masked off, (`& 0x7F`) and the remaining 7 bit bytes are bitstring 47 | concatenated to produce the final integer. This is complicated as the integer is still 48 | little endian though the encoding uses the most-significant-bit in big-endian format 49 | to determine the `int`'s run length. The completed algorith is in `decode_variable_length_int` 50 | which returns the int and how many bytes were used to encode it. 51 | 52 | This also means for integers <= 127 the integer is the same as a single byte uint8 53 | 54 | ## Tag, optional length, data 55 | 56 | Depending on the type of the value, you will encounter a `tag` (itself a multi-byte `int`) 57 | per the above specification with a direct value, or a length prefixed value. 58 | 59 | An example: 60 | If the value type is an int, then a variable length int tag, followed by a variable length int 61 | the value 62 | 63 | If the value is a string, then a variable length int tag, followed by a variable length `int` `length` 64 | then the bytes of the string. 65 | 66 | ## Definitions 67 | 68 | The definition table is a collection of `ObjectDefinition`s and `EnumDefinition`s 69 | 70 | ```python 71 | DEFINE_OBJECT_TAG = 0x0A 72 | DEFINE_ENUM_TAG = 0x12 73 | ``` 74 | 75 | An `ObjectDefinition` is either a Class or an Event - they are broadly equal. 76 | A class will be a collection of property definitions where each 77 | definition is a combination of property name, type (primal), flags, and 78 | extensions. 79 | 80 | An object definition is `TAG_CLASS_DEFINITION` followed by a length of the object definition. It is then parsed as a 81 | a TAG_CLASS_NAME and a series of `TAG_PROPERTY_DEFINITION`s which are a length followed by their fields. 82 | 83 | ```python 84 | TAG_CLASS_DEFINITION = 0x0A # Name of the class or event 85 | TAG_CLASS_NAME = 0x0A # The string defining the class name (optional) 86 | TAG_PROPERTY_DEFINITION = 0x12 # Repeated for each property 87 | ``` 88 | 89 | In the context of a property flags can be `0x00` in the case of a normal scalar property of `0x01` in the case of a 90 | "multi-property" or a property which can occur multiple times. 91 | 92 | ```python 93 | # Base Property Types - RE still in progress 94 | class PropertyType(IntEnum): 95 | UNKNOWN = 0x00 96 | DOUBLE = 0x01 97 | FLOAT = 0x02 98 | INTEGER_64 = 0x03 99 | INTEGER = 0x04 100 | UNKNOWN_5 = 0x05 101 | INTEGER_32 = 0x06 102 | INTEGER_UNSIGNED = 0x07 103 | UNKNOWN_8 = 0x08 104 | UNKNOWN_9 = 0x09 105 | BOOLEAN = 0x0C 106 | ENUM = 0x0B 107 | STRING = 0x0D 108 | BYTES = 0x0E 109 | PACKED_UINT_32 = 0x15 110 | UNKNOWN_17 = 0x11 111 | UNKNOWN_20 = 0x14 112 | OBJECT = 0x1B 113 | 114 | # Basic Property Values (must occur) 115 | TAG_INDEX = 0x08 # This defines the tag for reference 116 | TAG_TYPE = 0x10 # Primal object type (PropertyType) 117 | TAG_FLAGS = 0x18 # PropertyFalgs 118 | TAG_NAME = 0x22 # The name of the property 119 | ``` 120 | Various base types have extended type information. For instance a string 121 | property can have a format type of "UUID" and an integer type can have a value 122 | of "Timestamp". Each of these is specified by a particular tag on the property 123 | definition. 124 | 125 | ```python 126 | # Extended or optinal values on a property definition 127 | TAG_OBJECT_REFERENCE = 0x28 # The class of the property in the case of a non-primitive, scalar 128 | TAG_STRING_FORMAT = 0x30 # StringFormat 129 | TAG_LIST_ITEM_TYPE = 0x38 # Type of the element in the case of a collection 130 | TAG_ENUM_INDEX = 0x40 # The EnumDefinition this enum references 131 | TAG_INTEGER_FORMAT = 0x48 # Integer type sub-specifier 132 | TAG_EXTENSION = 0x50 # Set to 0x01 if this property is an extension on another class 133 | TAG_EXTENSION_TARGET = 0x60 # The class to extend 134 | ``` 135 | 136 | ### Sub-format Specifiers 137 | ```python 138 | class PropertyFlags(IntFlag): 139 | NONE = 0x00 140 | REPEATED = 0x01 141 | 142 | class IntegerFormat(IntEnum): 143 | TIMESTAMP = 0x01 144 | TRIGGER_ID = 0x03 145 | PROFILE_ID = 0x04 146 | AVERAGE_TIME = 0x15 147 | TIME_DELTA = 0x16 148 | TIMEZONE_OFFSET = 0x17 149 | ASSOCIATED_TIME = 0x18 150 | PERIOD_IN_HOURS = 0x19 151 | TIME_OF_DAY = 0x1E 152 | SAMPLE_TIMESTAMP = 0x1F 153 | 154 | class StringFormat(IntEnum): 155 | UNKNOWN = 0x00 156 | UUID = 0x01 157 | ``` 158 | 159 | 160 | An `EnumDefinition` is a class that defines a range of integer values, which can 161 | be either a selection enumeration or a flags style enumeration. The definition 162 | will include the textual representation of each value. 163 | 164 | # Metadata Files 165 | 166 | Metadata files are a MAGIC (`AWDM`), a version (`0xXXXXYYYY`) and N (`0xNNNNNNNN`) regions 167 | 168 | If N == 0 then you are reading a root manifest and should read until `tag == 0x00000000` 169 | 170 | In all cases there should be a `0x00000000` after the region definitions 171 | 172 | Regions fall into two broad categories - tag specific and non-tag specific 173 | 174 | Region tags are `0xTTTTFFFF` where `TTTT` is type and `FFFF` is number of `uint32` fields (little endian) 175 | 176 | ```c 177 | struct { 178 | uint32 magic, // "AWDM" 179 | uint16 major, // 0x0100 - little endian 1 180 | uint16 minor, // 0x0100 - little endian 1 181 | uint32 regions // either region count or 0 182 | } 183 | 184 | // N region entries, see below 185 | 186 | struct { 187 | uint32 zero // = 0x00000000 188 | } 189 | ``` 190 | 191 | ## Tag specific 192 | 193 | ```c 194 | struct { 195 | uint32 tag, 196 | uint32 offset, 197 | uint32 size, 198 | uint32 checksum // assumed 199 | } 200 | ``` 201 | 202 | ### Tag `0x02000400` - Structure Table 203 | 204 | This is an import or structure table. In the case of the root table of the root manifest 205 | the contents are identical to the display or definition table (`0x03000400`). 206 | 207 | For metadata manifests which extend the root, this file will broadly import from others 208 | and not define the display names of properties etc. 209 | 210 | ### Tag `0x03000400` - Definition Table 211 | 212 | This table of definitions create new objects with new properties that extend the existing 213 | schema. It will contain object definitions, with property definitions as well as enum 214 | definitions. 215 | 216 | This table contains class and object definitions designed to "enrich" the definitions from 217 | the `0x02000400` table with additional data for translation into text format. 218 | 219 | ## Non-tag specific 220 | 221 | ```c 222 | struct { 223 | uint32 offest 224 | uint32 size 225 | } 226 | ``` 227 | 228 | ### Tag `0x04000200` - File Identity 229 | 230 | This region defines two values, the UUID of the file as well as it's display name. 231 | 232 | This is analogous to a `LC_UUID` in Mach-O 233 | 234 | * `0x0A` - String - File UUID 235 | * `0x12` - String - Source File 236 | * `0x18` - Timestamp - Build Time 237 | 238 | ### Tag `0x05000200` - Root Object Class Definitions 239 | 240 | This defines the root ambient classes. It's only relevant on the root manifest as 241 | it is the only file to define the root object class. These classes are used by the 242 | properties on the root object defined by `0x02000400`/`0x03000400` where `tag == 0x00` 243 | 244 | ### Tag `0x06000200` - Extension Points 245 | 246 | This region lists all known extension properties. These must be loaded from their 247 | assocated constituant extension manifests 248 | 249 | 250 | # Log Files 251 | -------------------------------------------------------------------------------- /docs/awdd.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hack-different/apple-diagnostics-format/afe80d2c08b950e201d6c2e1b8817157187bffd7/docs/awdd.bin -------------------------------------------------------------------------------- /docs/awdd.txt: -------------------------------------------------------------------------------- 1 | timestamp: 1632669397913 - tag 0x08 - variable length int (6 bytes) 2 | isAnonymous: true - (tag 0x20 - boolean value 0x01) 3 | deviceConfigId: 6860 - tag 0x28 - variable length int - 2 bytes) 4 | investigationId: 0 (tag 0x030 variable length int - 0) 5 | model: "Watch6,4" (tag 0x3A - model, string of length 0x08) 6 | softwareBuild: "19R346" - (tag 0x42 - string of length 0x06) 7 | firmwareVersion: "iBoot-7429.10.23.0.2" (tag 0x4A - string of length 20dec bytes) 8 | buildtype: "User" - (tag 0x31 - string of length 0x04 bytes) 9 | tz_offset: -25200 - (tag 0x2D - variable length integer - signed - TODO) 10 | metric_file_type: 1 - (tag 0x68 - variable length integer - 01) 11 | metriclogs { (tag 0x7A sequence - offset 77dec bytes - subsequence length of 46 (48 total minus sequence + length)) 12 | triggerTime: 1632669136179 (tag 0x20 - data 6 bytes) 13 | triggerId: 520197 (tag 0x28 - variable length int - data 3 bytes) 14 | profileId: 427 (tag 0x30 - variable length int - data 2bytes) 15 | commCenterOperatorRoaming { (tag 0xFA878002 - subsequence length 0x0b - 11dec bytes) 16 | timestamp: 1632669136186 (tag 0x80 - data length 6 bytes) 17 | registration_status: 0 (tag 0x48 - data variable int of 0x00) 18 | subs_id: 0 (tag 0x50 - variable length int - value 0) 19 | } 20 | commCenterOperatorRoaming { (tag 0xFA878002) 21 | timestamp: 1632669136186 (tag 0x08 - data length of 6 bytes) 22 | registration_status: 0 (tag 0x48 - variable length int - value 0) 23 | subs_id: 0 (tag 0x50 - variable length int - value 0) 24 | } 25 | } 26 | metriclogs { (tag 0x7A - total 48dec - offset 125 bytes - subsequence length 46dec bytes) 27 | triggerTime: 1632672719189 (tag 0x20 - variable length int - data 6 bytes) 28 | triggerId: 520197 (tag 0x28 - variable length int - data 3 bytes) 29 | profileId: 427 (tag 0x30 - variable length int - data 2bytes) 30 | commCenterOperatorRoaming { (tag 0xFA878002 - subsequence length of 0x0B - 11dec bytes) 31 | timestamp: 1632672719203 (tag 0x80 - data length 6 bytes) 32 | registration_status: 0 (tag 0x48 - variable length int - value 0) 33 | subs_id: 0 (tag 0x50 - variable length int - value 0) 34 | } 35 | commCenterOperatorRoaming { (tag 0xFA878002 - subsequence length of 0x0B - 11dec bytes) 36 | timestamp: 1632672719203 (tag 0x80 - data length 6 bytes) 37 | registration_status: 0 (tag 0x48 - variable length int - value 0) 38 | subs_id: 0 (tag 0x50 - variable length int - value 0) 39 | } 40 | } 41 | metriclogs { (tag 0x7A - total 48dec - offset 173dec - subsequence Len 46dec bytes) 42 | triggerTime: 1632675969417 (tag 0x20 - length 6) 43 | triggerId: 520197 (tag 0x28 - variable length int - data 3 bytes) 44 | profileId: 427 (tag 0x30 - variable length int - data 2bytes) 45 | commCenterOperatorRoaming { (tag 0xFA878002 - subsequence length of 0x0B - 11dec bytes) 46 | timestamp: 1632675969428 (tag 0x08 - length 06) 47 | registration_status: 0 (tag 0x48 - variable length int - value 0) 48 | subs_id: 0 (tag 0x50 - variable length int - value 0) 49 | } 50 | commCenterOperatorRoaming { (tag 0xFA878002 - subsequence length of 0x0B - 11dec bytes) 51 | timestamp: 1632675969428 (tag 0x08 - length 06) 52 | registration_status: 0 (tag 0x48 - variable length int - value 0) 53 | subs_id: 0 (tag 0x50 - variable length int - value 0) 54 | } 55 | } 56 | metriclogs { (tag 0x7A - total 48dec - offset 221dec - subsequence length 46dec bytes) 57 | triggerTime: 1632679555785 (tag 0x20 - length 6) 58 | triggerId: 520197 (tag 0x28 - variable length int - data 3 bytes) 59 | profileId: 427 (tag 0x30 - variable length int - data 2bytes) 60 | commCenterOperatorRoaming { (tag 0xFA878002 - subsequence length of 0x0B - 11dec bytes) 61 | timestamp: 1632679555826 (tag 0x08 - length 06) 62 | registration_status: 0 (tag 0x48 - variable length int - value 0) 63 | subs_id: 0 (tag 0x50 - variable length int - value 0) 64 | } 65 | commCenterOperatorRoaming { (tag 0xFA878002 - subsequence length of 0x0B - 11dec bytes) 66 | timestamp: 1632679555827 (tag 0x80 - data length 6 bytes) 67 | registration_status: 0 (tag 0x48 - variable length int - value 0) 68 | subs_id: 0 (tag 0x50 - variable length int - value 0) 69 | } 70 | } 71 | metriclogs { (tag 0x7A - total 48dec - offset 269 bytes - subsequence length 46dec bytes) 72 | triggerTime: 1632683239867 (tag 0x20 - length 6) 73 | triggerId: 520197 (tag 0x28 - variable length int - data 3 bytes) 74 | profileId: 427 (tag 0x30 - variable length int - data 2bytes) 75 | commCenterOperatorRoaming { (tag 0xFA878002 - subsequence length of 0x0B - 11dec bytes) 76 | timestamp: 1632683239872 (tag 0x08 - length 06) 77 | registration_status: 0 (tag 0x48 - variable length int - value 0) 78 | subs_id: 0 (tag 0x50 - variable length int - value 0) 79 | } 80 | commCenterOperatorRoaming { (tag 0xFA878002 - subsequence length of 0x0B - 11dec bytes) 81 | timestamp: 1632683239874 (tag 0x08 - length 06) 82 | registration_status: 0 (tag 0x48 - variable length int - value 0) 83 | subs_id: 0 (tag 0x50 - variable length int - value 0) 84 | } 85 | } 86 | metriclogs { (tag 0x7A - total 604dec - offset 317dec - encoded length = 0xD904 - 600dec - ((0b1011000 < 7) || 0b00000100) as if (0b0010110000000100)) 87 | triggerTime: 1632614400000 (tag 0x20 - length 6) 88 | triggerId: 520196 (tag 0x28 - variable length int - data 3 bytes) 89 | profileId: 434 (tag 0x30 - data 0xB203) 90 | profileId: 435 (tag 0x30 - data 0xB303) 91 | profileId: 437 (tag 0x30 - data 0xB503) 92 | nfcGeneralStatistic { (tag 0xB280A009 - length 0x6F - 93 | timestamp: 1632614400000 (tag 0x08 - length 0x06 94 | startTimestamp: 1632590364612 (tag 0x10 - length 0x06)_ 95 | totalCEEnable: 0 (tag 0x018 96 | totalCardProvisioned: 2 97 | totalTransientDeactiveTimeout: 0 98 | totalAPNReceived: 0 99 | totalRestrictModeEntered: 0 100 | totalTransactionEndEvent: 0 101 | totalFailureWithTransactionEndEventErrors: 0 102 | totalAuthECommerce: 0 103 | totalVASActivation: 0 104 | totalSuccessfulVAS: 0 105 | totalVASSignup: 0 106 | totalVASTransactionException: 0 107 | totalExpressFelicaTransaction: 0 108 | totalFelicaEMoneyTransaction: 0 109 | totalFelicaTransitTransaction: 0 110 | totalSuccessfulCardIngestion: 0 111 | totalSuccessfulCardIngestionWithSessionToken: 0 112 | totalPlasticCardModeEnable: 0 113 | totalAccessTransaction: 0 114 | hasAttackLogs: false 115 | totalPeerPaymentRequest: 0 116 | totalPeerPaymentRequestFailure: 0 117 | totalGenericAExpressTransaction: 0 118 | totalDynamicRFParametersUpdate: 0 119 | totalPTKeys: 0 120 | totalPTDatabaseCorruption: 0 121 | totalPTKeyDeletionFailed: 0 122 | totalBurnoutTimerCounter: 0 123 | totalMWExceptions: 0 124 | radioIsEnabled: false 125 | radioChangeCount: 0 126 | } 127 | nfcVersions { (tag 0xBA80A009 - subsequence length 0x60 - 96bytes) 128 | timestamp: 1632614400000 (tag 0x08 - length 0x06 bytes) 129 | middlewareVersion: 67240206 (tag 0x10 - variable length int - 4 bytes) 130 | platformVersion: "N5B2M002C3A50000" (tag 0x1A - length 0x10 / 16dec) 131 | nfccHWVersion: 178 (tag 0x20 - variable length int - 2 bytes) 132 | nfccROMVersion: 2 (tag 0x28 - variable length int - 1 byte) 133 | nfccFWVersion: 353 (tag 0x30 - variable length int 2 bytes) 134 | nfccFWRevision: 110454 (tag 0x38 - variable length int - 3 bytes) 135 | seDeviceType: 210 (tag 0x040 - variable length int - 2 bytes) 136 | seHWVersion: 7 (tag 0x48 - variable length int 1 byte) 137 | seFWVersion: 1792 (tag 0x50 - variable length int - 2 bytes) 138 | seSignKeyType: 2 (tag 0x58 - variable length int - 1 byte) 139 | seSequenceCounter: 2584 (tag 0x60 - variable length int - 2 bytes) 140 | seReferenceCounter: 2584 (tag 0x68 - variable length int - 2 bytes) 141 | seOSMode: 2 (tag 0x70 - variable length int - 1 byte) 142 | seRestrictedMode: 0 (tag 0x78 - variable length int - 1 byte) 143 | seMigrationState: 1 (tag 0x8001 - variable length int - 1 byte) 144 | seMigrationPkgs: 0 (tag 0x8801 - variable length int - 1 byte) 145 | seMigrationInst: 0 (tag 0x8001 - variable length int - 1 byte) 146 | hardwareType: 8 (tag 0xC801 - variable length int - 1 byte) 147 | seTransientDeselect: 17648 ( (tag 0xD001 - variable length int - 3 bytes) 148 | seTransientReset: 12568 (tag 0xD801 - variable length int - 2 bytes) 149 | seTransientPersistent: 528440 (tag 0xE001 - variable length int - 3 bytes) 150 | seAvailableIndices: 1360 (tag 0xE801 - variable length int - 3 bytes) 151 | seTotalIndices: 4500 (tag 0xAF01 - variable length int - 2 bytes) 152 | } 153 | nfcExpressTransactionStatistic { ( (tag 0xC283A009 - subsequence length 0x09) 154 | timestamp: 1632614400000 (tag 0x08 - length 06 bytes) 155 | expressModeConfiguration: 0 (tag 0x18 - variable length int - 0x00) 156 | } 157 | nfc_DeviceExceptionStatistic { (tag 0xDA81A009 - subsequence length - 0x48 / 72dec) 158 | timestamp: 1632614400000 (tag 0x08 - data 6 bytes) 159 | timestamp: 1632614400000 (tag 0x08 - data 6 bytes) 160 | uuidReference: [16 bytes] 48 e9 c4 c3 d2 5d 46 07 a9 12 c3 ce a7 48 df (tag 0x10 - UUID 16 bytes) 161 | mwCount: 0 (tag 0x18 - variable length int - 0 - 1 byte) 162 | hwCount: 0 (tag 0x20 - variable length int - 0 - 1 byte) 163 | restrictedModeCount: 0 (tag 0x28 - variable length int - 0 - 1 byte) 164 | seRemovedEvt0Count: 0 (tag 0x30 - variable length int - 0 - 1 byte) 165 | seRemovedEvt1Count: 0 (tag 0x38 - variable length int - 0 - 1 byte) 166 | seRemovedEvt2Count: 0 (tag 0x40 - variable length int - 0 - 1 byte) 167 | seRemovedEvt3Count: 0 (tag 0x48 - variable length int - 0 - 1 byte) 168 | seRemovedEvt4Count: 0 (tag 0x50 - variable length int - 0 - 1 byte) 169 | seRemovedEvt5Count: 0 (tag 0x58 - variable length int - 0 - 1 byte) 170 | pllUnlock: 0 (tag 0x60 - variable length int - 0 - 1 byte) 171 | pllUnlockDuringPMICPowerCycle: 0 (tag 0x68 - variable length int - 0 - 1 byte) 172 | readerModeConnectErrorCount: 0 (tag 0x8001 - variable length int - 0 - 1 byte) 173 | readerModeDisconnectErrorCount: 0 tag 0x8801 - variable length int - 0 - 1 byte) 174 | readerModeTransceiveErrorCount: 0 (tag 0x9001 - variable length int - 0 - 1 byte) 175 | loadStackFirmwareRestoreRetryCount: 0 (tag 0x9801 - variable length int - 0 - 1 byte) 176 | failForwardRestoreAttemptFailureCount: 0 (tag 0xA0001 - variable length int - 0 - 1 byte) 177 | failForwardState: 0 (tag 0xA801 - variable length int - 0 - 1 byte) 178 | } 179 | homeKitConfigurationData { (tag 0xB2808009 - offset 632bytes - subsequence length - 243bytes) 180 | timestamp: 1632614400000 181 | databaseSize: 211612 182 | metadataVersion: 880 183 | isResidentCapable: true 184 | isResidentEnabled: false 185 | homeConfigurations { 186 | numAccessories: 2 187 | numServices: 0 188 | numUsers: 1 189 | numAdmins: 1 190 | numScenes: 4 191 | numTriggers: 0 192 | numEventTriggers: 0 193 | numTimerTriggers: 0 194 | numAccessoryServiceGroups: 0 195 | numRooms: 2 196 | numZones: 0 197 | isResidentAvailable: true 198 | isPrimaryResident: false 199 | numBridgedAccessories: 0 200 | numNotCertifiedAccessories: 0 201 | numCertifiedAccessories: 0 202 | numHAPAccessories: 0 203 | numAppleMediaAccessories: 2 204 | numWholeHouseAudioAccessories: 0 205 | numAppleAudioAccessories: 2 206 | numAppleTVAccessories: 0 207 | numCameraAccessories: 0 208 | numMediaSystems: 1 209 | numTargetControllers: 0 210 | numCertifiedTargetControllers: 0 211 | numBridgedTargetControllers: 0 212 | numCertifiedBridgedTargetControllers: 0 213 | numConfiguredScenes: 0 214 | isOwner: false 215 | numResidentsEnabled: 4 216 | primaryReportingDevice: false 217 | numTelevisionAccessories: 0 218 | networkProtectionStatus: AWDHomeKitNetworkProtectionStatus_NoManagedRouter 219 | numAccessoriesWiFiPPSKCredential: 0 220 | numAccessoriesNetworkProtectionAutoFullAccess: 0 221 | numAccessoriesNetworkProtectionAutoProtectedMainLAN: 0 222 | numAccessoriesNetworkProtectionAutoProtectedHomeKitLAN: 0 223 | numAccessoriesNetworkProtectionFullAccess: 0 224 | numAccessoriesNetworkProtectionHomeKitOnly: 0 225 | numAccessoriesNetworkProtectionUnprotected: 0 226 | numShortcuts: 0 227 | numHAPIPAccessories: 0 228 | numHAPBTAccessories: 0 229 | numHAPBatteryServiceAccessories: 0 230 | numCameraAccessoriesSupportRecording: 0 231 | numHAPSpeakerServiceAccessories: 0 232 | numPrimaryHAPSpeakerServiceAccessories: 0 233 | numTriggerOwnedConfiguredScenes: 0 234 | numCameraAccessoriesRecordingEnabled: 0 235 | numCameraAccessoriesReachabilityNotificationEnabled: 0 236 | numCameraAccessoriesWithActivityZonesEnabled: 0 237 | enabledResidentsDeviceCapabilities: 12516351 238 | numLightProfilesWithNaturalLightingSupported: 0 239 | numLightProfilesWithNaturalLightingEnabled: 0 240 | numLightProfilesWithNaturalLightingUsed: 0 241 | numNoeAccessories: 0 242 | numNoeFullCap: 0 243 | numNoeSleepCap: 0 244 | numNoeMinCap: 0 245 | numNoeRoutCap: 0 246 | numNoeBRCap: 0 247 | numHAPBLEAccessoriesSupportJet: 0 248 | numHAPIPAccessoriesSupportJet: 0 249 | numHAPNoeAccessoriesSupportJet: 0 250 | homeCreationCohortWeek: 5 251 | firstHAPAccessoryAddedCohortWeek: -1 252 | currentMediaAccessoryFallbackMediaUserType: 0 253 | numPoeCount: 0 254 | numPoe2Count: 0 255 | numMoe1Accessories: 0 256 | numMoe2Accessories: 0 257 | numHomePods: 2 258 | numWoLAccessories: 0 259 | numAppleTV4K2ndGenAccessories: 0 260 | } 261 | isDemoConfiguration: false 262 | } 263 | wifiRetStats { 264 | timestamp: 1632614400000 265 | ret_duration: 0 266 | rx_duration: 0 267 | } 268 | wiFiLprxStats { 269 | timestamp: 1632614400000 270 | phySearchDuration: 0 271 | phySearchCount: 0 272 | phyActiveDuration: 0 273 | phyActiveCount: 0 274 | lprx_enter_cnt: 0 275 | lprx_exit_cnt: 0 276 | } 277 | } 278 | metriclogs { (tag 0x7A - total 145dec bytes - offset 921dec 279 | triggerTime: 1632614400000 (tag 0x20 280 | triggerId: 2359308 (tag 0x28 - variable length int - 4 bytes) 281 | profileId: 246 (tag 0x30 282 | homeKitMessageTransported { (offset 943dec) 283 | timestamp: 1632692512042 (tag 0x08 - 6 bytes) 284 | identifier: "8EFD9E3E-6189-4387-8077-E7EBD00B3ADB" (tag 0x1A - string length 0x24 36dec) 285 | transactionID: "8BB3C986-8F89-4E7A-83BF-3B8C22036DC7" (tag 0x22 - string length 0x24 36dec) 286 | isSecure: true (tag 0x28 - bool true - 1 byte) 287 | messageType: HomeKitMessageType_Request (tag 0x30 - value 0x01) 288 | transport: HomeKitMessageTransportType_IDSProxy (tag 0x38 - value 0x04 289 | direction: HomeKitMessageDirection_Receive (tag 0x40 - value 0x01 290 | messageName: "kHomeConfigInternalRequestKey" (tag 0x4A - string length 0x1d 29dec) 291 | } 292 | } 293 | metriclogs { (tag 0x7A - offset 1066dec 294 | triggerTime: 1632614400000 295 | triggerId: 2359308 296 | profileId: 246 297 | homeKitMessageTransported { 298 | timestamp: 1632692523092 299 | identifier: "7EF496DB-F4CC-4928-A8E9-6667C9812A89" 300 | transactionID: "13F8ED75-11CF-42DA-8F31-45B30D2DB8AA" 301 | isSecure: true 302 | messageType: HomeKitMessageType_Request 303 | transport: HomeKitMessageTransportType_IDSProxy 304 | direction: HomeKitMessageDirection_Receive 305 | messageName: "HMDHomeManagerSyncWalletKeysPassSerialNumbersMessage" 306 | } 307 | } 308 | metriclogs { (tag 0x7A - total 169dec bytes - offset 1235dec) 309 | triggerTime: 1632614400000 310 | triggerId: 2555922 311 | profileId: 292 312 | idsSessionConnected { 313 | timestamp: 1632614400000 314 | guid: "92EEF725-BD9F-4F49-BFA7-FAEA619DB431" 315 | } 316 | } 317 | metriclogs { (tag 0x7A - total 67dec bytes - offset 1302dec) 318 | triggerTime: 1632614400000 319 | triggerId: 2555920 320 | profileId: 289 321 | idsSessionAcceptSent { 322 | timestamp: 1632614400000 323 | guid: "92EEF725-BD9F-4F49-BFA7-FAEA619DB431" 324 | } 325 | } 326 | metriclogs { (tag 0x7A - total 128dec bytes - offset 1369dec) 327 | triggerTime: 1632614400000 328 | triggerId: 2555926 329 | profileId: 291 330 | idsSessionCompleted { 331 | timestamp: 1632614400000 332 | guid: "92EEF725-BD9F-4F49-BFA7-FAEA619DB431" 333 | sessionProtocolVersionNumber: 5 334 | serviceName: "NetworkRelay" 335 | clientType: 0 336 | isQREnabled: 1 337 | isUsingQRDirectly: 1 338 | isInitiator: 0 339 | isLegacySessionType: 0 340 | isWithDefaultPairedDevice: 1 341 | transportType: 0 342 | linkProtocol: 2 343 | endedReason: 0 344 | durationOfSession: 20000 345 | durationToConnect: 2 346 | isNetworkEnabled: 1 347 | isNetworkActive: 1 348 | isNetworkReachable: 1 349 | isWifiInterfaceDisallowed: 0 350 | isCellularInterfaceDisallowed: 0 351 | linkType: 3 352 | destinationType: 0 353 | } 354 | } 355 | metriclogs { (tag 0x7A - total 128dec bytes - offset 1497dec) 356 | triggerTime: 1632614400000 (tag 0x20 357 | triggerId: 2555926 (tag 0x28 358 | profileId: 291 (tag 0x30 359 | idsSessionCompleted { 360 | timestamp: 1632614400000 361 | guid: "92EEF725-BD9F-4F49-BFA7-FAEA619DB431" 362 | sessionProtocolVersionNumber: 5 363 | serviceName: "NetworkRelay" 364 | clientType: 0 365 | isQREnabled: 1 366 | isUsingQRDirectly: 1 367 | isInitiator: 0 368 | isLegacySessionType: 0 369 | isWithDefaultPairedDevice: 1 370 | transportType: 0 371 | linkProtocol: 2 372 | endedReason: 11 373 | durationOfSession: 20000 374 | durationToConnect: 2 375 | isNetworkEnabled: 1 376 | isNetworkActive: 1 377 | isNetworkReachable: 1 378 | isWifiInterfaceDisallowed: 0 379 | isCellularInterfaceDisallowed: 0 380 | linkType: 3 381 | destinationType: 0 382 | } 383 | } 384 | metriclogs { (tag 0x7A - total 111dec bytes - offset 1625dec) 385 | triggerTime: 1632700800000 (tag 0x20 386 | triggerId: 2359308 (tag 0x28 387 | profileId: 246 (tag 0x30 388 | homeKitMessageTransported { 389 | timestamp: 1632706178195 390 | identifier: "52FED96B-FA9D-4FF1-B8D7-42256C159657" 391 | isSecure: true 392 | messageType: HomeKitMessageType_Oneway 393 | transport: HomeKitMessageTransportType_IDSProxy 394 | direction: HomeKitMessageDirection_Receive 395 | messageName: "kCurrentHomeChangedNotificationKey" 396 | } 397 | } 398 | metriclogs { (tag 0x7A - total 74dec bytes - offset 1736dec) 399 | triggerTime: 1632690000000 (tag 0x20 - variable length int - data 6 bytes) 400 | triggerId: 2588688 (tag 0x28 - 401 | profileId: 287 (tag 0x30 - variable length int - 0x9F02) 402 | idsServerStorageStateMachineCompleted { 403 | timestamp: 1632690000000 (tag 0x08 - length 0x06 bytes) 404 | wasPrimary: true (tag 0x10 - bool - true) 405 | serviceIdentifier: "com.apple.private.alloy.quickrelay" (tag 0x1A - string length 34dec bytes) 406 | timeTaken: 193 (tag 0x20 - variable length integer - data 0xC101 - value 0xC1) 407 | totalMessages: 0 (tag 0x28 - variable length int - value 0) 408 | linkType: 0 (tag 0x30 - variable length int - value 0) 409 | } 410 | } 411 | metriclogs { (tag 0x7A - offset 1810dec) 412 | triggerTime: 1632704400000 (tag 0x20 - data 6dec bytes 413 | triggerId: 2588688 (tag 0x28 - variable length int - 4dec bytes data) 414 | profileId: 287 (tag 0x30 - 2bytes data) 415 | idsServerStorageStateMachineCompleted { (tag 0x8281F009 - length 0x36 - 54dec bytes) 416 | timestamp: 1632704400000 (tag 0x08 - data length 06dec) 417 | wasPrimary: true (tag 0x10 - data 0x01 true) 418 | serviceIdentifier: "com.apple.private.alloy.bulletinboard" (tag 0x1A - string length 37dec) 419 | timeTaken: 0 (tag 0x20 - data 0x00) 420 | totalMessages: 0 (tag 0x28 - data 0x00) 421 | linkType: 0 (tag 0x30 - data 0x00) 422 | } 423 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | [[package]] 2 | name = "astroid" 3 | version = "2.11.7" 4 | description = "An abstract syntax tree for Python with inference support." 5 | category = "dev" 6 | optional = false 7 | python-versions = ">=3.6.2" 8 | 9 | [package.dependencies] 10 | lazy-object-proxy = ">=1.4.0" 11 | wrapt = ">=1.11,<2" 12 | 13 | [[package]] 14 | name = "atomicwrites" 15 | version = "1.4.1" 16 | description = "Atomic file writes." 17 | category = "dev" 18 | optional = false 19 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 20 | 21 | [[package]] 22 | name = "attrs" 23 | version = "22.1.0" 24 | description = "Classes Without Boilerplate" 25 | category = "dev" 26 | optional = false 27 | python-versions = ">=3.5" 28 | 29 | [package.extras] 30 | dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "mypy (>=0.900,!=0.940)", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] 31 | docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] 32 | tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "mypy (>=0.900,!=0.940)", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] 33 | tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "mypy (>=0.900,!=0.940)", "pytest-mypy-plugins", "cloudpickle"] 34 | 35 | [[package]] 36 | name = "black" 37 | version = "22.6.0" 38 | description = "The uncompromising code formatter." 39 | category = "dev" 40 | optional = false 41 | python-versions = ">=3.6.2" 42 | 43 | [package.dependencies] 44 | click = ">=8.0.0" 45 | mypy-extensions = ">=0.4.3" 46 | pathspec = ">=0.9.0" 47 | platformdirs = ">=2" 48 | tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} 49 | 50 | [package.extras] 51 | colorama = ["colorama (>=0.4.3)"] 52 | d = ["aiohttp (>=3.7.4)"] 53 | jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] 54 | uvloop = ["uvloop (>=0.15.2)"] 55 | 56 | [[package]] 57 | name = "cfgv" 58 | version = "3.3.1" 59 | description = "Validate configuration and produce human readable error messages." 60 | category = "dev" 61 | optional = false 62 | python-versions = ">=3.6.1" 63 | 64 | [[package]] 65 | name = "click" 66 | version = "8.1.3" 67 | description = "Composable command line interface toolkit" 68 | category = "dev" 69 | optional = false 70 | python-versions = ">=3.7" 71 | 72 | [package.dependencies] 73 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 74 | 75 | [[package]] 76 | name = "colorama" 77 | version = "0.4.5" 78 | description = "Cross-platform colored terminal text." 79 | category = "dev" 80 | optional = false 81 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 82 | 83 | [[package]] 84 | name = "dill" 85 | version = "0.3.5.1" 86 | description = "serialize all of python" 87 | category = "dev" 88 | optional = false 89 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" 90 | 91 | [package.extras] 92 | graph = ["objgraph (>=1.7.2)"] 93 | 94 | [[package]] 95 | name = "distlib" 96 | version = "0.3.5" 97 | description = "Distribution utilities" 98 | category = "dev" 99 | optional = false 100 | python-versions = "*" 101 | 102 | [[package]] 103 | name = "filelock" 104 | version = "3.7.1" 105 | description = "A platform independent file lock." 106 | category = "dev" 107 | optional = false 108 | python-versions = ">=3.7" 109 | 110 | [package.extras] 111 | docs = ["furo (>=2021.8.17b43)", "sphinx (>=4.1)", "sphinx-autodoc-typehints (>=1.12)"] 112 | testing = ["covdefaults (>=1.2.0)", "coverage (>=4)", "pytest (>=4)", "pytest-cov", "pytest-timeout (>=1.4.2)"] 113 | 114 | [[package]] 115 | name = "identify" 116 | version = "2.5.2" 117 | description = "File identification library for Python" 118 | category = "dev" 119 | optional = false 120 | python-versions = ">=3.7" 121 | 122 | [package.extras] 123 | license = ["ukkonen"] 124 | 125 | [[package]] 126 | name = "iniconfig" 127 | version = "1.1.1" 128 | description = "iniconfig: brain-dead simple config-ini parsing" 129 | category = "dev" 130 | optional = false 131 | python-versions = "*" 132 | 133 | [[package]] 134 | name = "isort" 135 | version = "5.10.1" 136 | description = "A Python utility / library to sort Python imports." 137 | category = "dev" 138 | optional = false 139 | python-versions = ">=3.6.1,<4.0" 140 | 141 | [package.extras] 142 | pipfile_deprecated_finder = ["pipreqs", "requirementslib"] 143 | requirements_deprecated_finder = ["pipreqs", "pip-api"] 144 | colors = ["colorama (>=0.4.3,<0.5.0)"] 145 | plugins = ["setuptools"] 146 | 147 | [[package]] 148 | name = "lazy-object-proxy" 149 | version = "1.7.1" 150 | description = "A fast and thorough lazy object proxy." 151 | category = "dev" 152 | optional = false 153 | python-versions = ">=3.6" 154 | 155 | [[package]] 156 | name = "mccabe" 157 | version = "0.7.0" 158 | description = "McCabe checker, plugin for flake8" 159 | category = "dev" 160 | optional = false 161 | python-versions = ">=3.6" 162 | 163 | [[package]] 164 | name = "mypy" 165 | version = "0.971" 166 | description = "Optional static typing for Python" 167 | category = "dev" 168 | optional = false 169 | python-versions = ">=3.6" 170 | 171 | [package.dependencies] 172 | mypy-extensions = ">=0.4.3" 173 | tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} 174 | typing-extensions = ">=3.10" 175 | 176 | [package.extras] 177 | dmypy = ["psutil (>=4.0)"] 178 | python2 = ["typed-ast (>=1.4.0,<2)"] 179 | reports = ["lxml"] 180 | 181 | [[package]] 182 | name = "mypy-extensions" 183 | version = "0.4.3" 184 | description = "Experimental type system extensions for programs checked with the mypy typechecker." 185 | category = "dev" 186 | optional = false 187 | python-versions = "*" 188 | 189 | [[package]] 190 | name = "nodeenv" 191 | version = "1.7.0" 192 | description = "Node.js virtual environment builder" 193 | category = "dev" 194 | optional = false 195 | python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" 196 | 197 | [[package]] 198 | name = "packaging" 199 | version = "21.3" 200 | description = "Core utilities for Python packages" 201 | category = "dev" 202 | optional = false 203 | python-versions = ">=3.6" 204 | 205 | [package.dependencies] 206 | pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" 207 | 208 | [[package]] 209 | name = "pathspec" 210 | version = "0.9.0" 211 | description = "Utility library for gitignore style pattern matching of file paths." 212 | category = "dev" 213 | optional = false 214 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" 215 | 216 | [[package]] 217 | name = "platformdirs" 218 | version = "2.5.2" 219 | description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." 220 | category = "dev" 221 | optional = false 222 | python-versions = ">=3.7" 223 | 224 | [package.extras] 225 | docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] 226 | test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] 227 | 228 | [[package]] 229 | name = "pluggy" 230 | version = "1.0.0" 231 | description = "plugin and hook calling mechanisms for python" 232 | category = "dev" 233 | optional = false 234 | python-versions = ">=3.6" 235 | 236 | [package.extras] 237 | testing = ["pytest-benchmark", "pytest"] 238 | dev = ["tox", "pre-commit"] 239 | 240 | [[package]] 241 | name = "pre-commit" 242 | version = "2.20.0" 243 | description = "A framework for managing and maintaining multi-language pre-commit hooks." 244 | category = "dev" 245 | optional = false 246 | python-versions = ">=3.7" 247 | 248 | [package.dependencies] 249 | cfgv = ">=2.0.0" 250 | identify = ">=1.0.0" 251 | nodeenv = ">=0.11.1" 252 | pyyaml = ">=5.1" 253 | toml = "*" 254 | virtualenv = ">=20.0.8" 255 | 256 | [[package]] 257 | name = "protobuf" 258 | version = "4.21.4" 259 | description = "" 260 | category = "main" 261 | optional = false 262 | python-versions = ">=3.7" 263 | 264 | [[package]] 265 | name = "py" 266 | version = "1.11.0" 267 | description = "library with cross-python path, ini-parsing, io, code, log facilities" 268 | category = "dev" 269 | optional = false 270 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 271 | 272 | [[package]] 273 | name = "pylint" 274 | version = "2.14.5" 275 | description = "python code static checker" 276 | category = "dev" 277 | optional = false 278 | python-versions = ">=3.7.2" 279 | 280 | [package.dependencies] 281 | astroid = ">=2.11.6,<=2.12.0-dev0" 282 | colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} 283 | dill = ">=0.2" 284 | isort = ">=4.2.5,<6" 285 | mccabe = ">=0.6,<0.8" 286 | platformdirs = ">=2.2.0" 287 | tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} 288 | tomlkit = ">=0.10.1" 289 | 290 | [package.extras] 291 | spelling = ["pyenchant (>=3.2,<4.0)"] 292 | testutils = ["gitpython (>3)"] 293 | 294 | [[package]] 295 | name = "pyparsing" 296 | version = "3.0.9" 297 | description = "pyparsing module - Classes and methods to define and execute parsing grammars" 298 | category = "dev" 299 | optional = false 300 | python-versions = ">=3.6.8" 301 | 302 | [package.extras] 303 | diagrams = ["railroad-diagrams", "jinja2"] 304 | 305 | [[package]] 306 | name = "pytest" 307 | version = "7.1.2" 308 | description = "pytest: simple powerful testing with Python" 309 | category = "dev" 310 | optional = false 311 | python-versions = ">=3.7" 312 | 313 | [package.dependencies] 314 | atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} 315 | attrs = ">=19.2.0" 316 | colorama = {version = "*", markers = "sys_platform == \"win32\""} 317 | iniconfig = "*" 318 | packaging = "*" 319 | pluggy = ">=0.12,<2.0" 320 | py = ">=1.8.2" 321 | tomli = ">=1.0.0" 322 | 323 | [package.extras] 324 | testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] 325 | 326 | [[package]] 327 | name = "pyyaml" 328 | version = "6.0" 329 | description = "YAML parser and emitter for Python" 330 | category = "dev" 331 | optional = false 332 | python-versions = ">=3.6" 333 | 334 | [[package]] 335 | name = "toml" 336 | version = "0.10.2" 337 | description = "Python Library for Tom's Obvious, Minimal Language" 338 | category = "dev" 339 | optional = false 340 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 341 | 342 | [[package]] 343 | name = "tomli" 344 | version = "2.0.1" 345 | description = "A lil' TOML parser" 346 | category = "dev" 347 | optional = false 348 | python-versions = ">=3.7" 349 | 350 | [[package]] 351 | name = "tomlkit" 352 | version = "0.11.1" 353 | description = "Style preserving TOML library" 354 | category = "dev" 355 | optional = false 356 | python-versions = ">=3.6,<4.0" 357 | 358 | [[package]] 359 | name = "typing-extensions" 360 | version = "4.3.0" 361 | description = "Backported and Experimental Type Hints for Python 3.7+" 362 | category = "dev" 363 | optional = false 364 | python-versions = ">=3.7" 365 | 366 | [[package]] 367 | name = "virtualenv" 368 | version = "20.16.2" 369 | description = "Virtual Python Environment builder" 370 | category = "dev" 371 | optional = false 372 | python-versions = ">=3.6" 373 | 374 | [package.dependencies] 375 | distlib = ">=0.3.1,<1" 376 | filelock = ">=3.2,<4" 377 | platformdirs = ">=2,<3" 378 | 379 | [package.extras] 380 | docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=21.3)"] 381 | testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "packaging (>=20.0)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)"] 382 | 383 | [[package]] 384 | name = "wrapt" 385 | version = "1.14.1" 386 | description = "Module for decorators, wrappers and monkey patching." 387 | category = "dev" 388 | optional = false 389 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" 390 | 391 | [metadata] 392 | lock-version = "1.1" 393 | python-versions = "^3.10" 394 | content-hash = "f54d35d91a8ba284e0a018e0233e938dec4fb6a02c1a82e9e2bed29b0b54ee7e" 395 | 396 | [metadata.files] 397 | astroid = [ 398 | {file = "astroid-2.11.7-py3-none-any.whl", hash = "sha256:86b0a340a512c65abf4368b80252754cda17c02cdbbd3f587dddf98112233e7b"}, 399 | {file = "astroid-2.11.7.tar.gz", hash = "sha256:bb24615c77f4837c707669d16907331374ae8a964650a66999da3f5ca68dc946"}, 400 | ] 401 | atomicwrites = [ 402 | {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, 403 | ] 404 | attrs = [ 405 | {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, 406 | {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, 407 | ] 408 | black = [ 409 | {file = "black-22.6.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f586c26118bc6e714ec58c09df0157fe2d9ee195c764f630eb0d8e7ccce72e69"}, 410 | {file = "black-22.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b270a168d69edb8b7ed32c193ef10fd27844e5c60852039599f9184460ce0807"}, 411 | {file = "black-22.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6797f58943fceb1c461fb572edbe828d811e719c24e03375fd25170ada53825e"}, 412 | {file = "black-22.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c85928b9d5f83b23cee7d0efcb310172412fbf7cb9d9ce963bd67fd141781def"}, 413 | {file = "black-22.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:f6fe02afde060bbeef044af7996f335fbe90b039ccf3f5eb8f16df8b20f77666"}, 414 | {file = "black-22.6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cfaf3895a9634e882bf9d2363fed5af8888802d670f58b279b0bece00e9a872d"}, 415 | {file = "black-22.6.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94783f636bca89f11eb5d50437e8e17fbc6a929a628d82304c80fa9cd945f256"}, 416 | {file = "black-22.6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:2ea29072e954a4d55a2ff58971b83365eba5d3d357352a07a7a4df0d95f51c78"}, 417 | {file = "black-22.6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e439798f819d49ba1c0bd9664427a05aab79bfba777a6db94fd4e56fae0cb849"}, 418 | {file = "black-22.6.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:187d96c5e713f441a5829e77120c269b6514418f4513a390b0499b0987f2ff1c"}, 419 | {file = "black-22.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:074458dc2f6e0d3dab7928d4417bb6957bb834434516f21514138437accdbe90"}, 420 | {file = "black-22.6.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a218d7e5856f91d20f04e931b6f16d15356db1c846ee55f01bac297a705ca24f"}, 421 | {file = "black-22.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:568ac3c465b1c8b34b61cd7a4e349e93f91abf0f9371eda1cf87194663ab684e"}, 422 | {file = "black-22.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6c1734ab264b8f7929cef8ae5f900b85d579e6cbfde09d7387da8f04771b51c6"}, 423 | {file = "black-22.6.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9a3ac16efe9ec7d7381ddebcc022119794872abce99475345c5a61aa18c45ad"}, 424 | {file = "black-22.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:b9fd45787ba8aa3f5e0a0a98920c1012c884622c6c920dbe98dbd05bc7c70fbf"}, 425 | {file = "black-22.6.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7ba9be198ecca5031cd78745780d65a3f75a34b2ff9be5837045dce55db83d1c"}, 426 | {file = "black-22.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a3db5b6409b96d9bd543323b23ef32a1a2b06416d525d27e0f67e74f1446c8f2"}, 427 | {file = "black-22.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:560558527e52ce8afba936fcce93a7411ab40c7d5fe8c2463e279e843c0328ee"}, 428 | {file = "black-22.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b154e6bbde1e79ea3260c4b40c0b7b3109ffcdf7bc4ebf8859169a6af72cd70b"}, 429 | {file = "black-22.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:4af5bc0e1f96be5ae9bd7aaec219c901a94d6caa2484c21983d043371c733fc4"}, 430 | {file = "black-22.6.0-py3-none-any.whl", hash = "sha256:ac609cf8ef5e7115ddd07d85d988d074ed00e10fbc3445aee393e70164a2219c"}, 431 | {file = "black-22.6.0.tar.gz", hash = "sha256:6c6d39e28aed379aec40da1c65434c77d75e65bb59a1e1c283de545fb4e7c6c9"}, 432 | ] 433 | cfgv = [ 434 | {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, 435 | {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, 436 | ] 437 | click = [ 438 | {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, 439 | {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, 440 | ] 441 | colorama = [ 442 | {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, 443 | {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, 444 | ] 445 | dill = [ 446 | {file = "dill-0.3.5.1-py2.py3-none-any.whl", hash = "sha256:33501d03270bbe410c72639b350e941882a8b0fd55357580fbc873fba0c59302"}, 447 | {file = "dill-0.3.5.1.tar.gz", hash = "sha256:d75e41f3eff1eee599d738e76ba8f4ad98ea229db8b085318aa2b3333a208c86"}, 448 | ] 449 | distlib = [ 450 | {file = "distlib-0.3.5-py2.py3-none-any.whl", hash = "sha256:b710088c59f06338ca514800ad795a132da19fda270e3ce4affc74abf955a26c"}, 451 | {file = "distlib-0.3.5.tar.gz", hash = "sha256:a7f75737c70be3b25e2bee06288cec4e4c221de18455b2dd037fe2a795cab2fe"}, 452 | ] 453 | filelock = [ 454 | {file = "filelock-3.7.1-py3-none-any.whl", hash = "sha256:37def7b658813cda163b56fc564cdc75e86d338246458c4c28ae84cabefa2404"}, 455 | {file = "filelock-3.7.1.tar.gz", hash = "sha256:3a0fd85166ad9dbab54c9aec96737b744106dc5f15c0b09a6744a445299fcf04"}, 456 | ] 457 | identify = [ 458 | {file = "identify-2.5.2-py2.py3-none-any.whl", hash = "sha256:feaa9db2dc0ce333b453ce171c0cf1247bbfde2c55fc6bb785022d411a1b78b5"}, 459 | {file = "identify-2.5.2.tar.gz", hash = "sha256:a3d4c096b384d50d5e6dc5bc8b9bc44f1f61cefebd750a7b3e9f939b53fb214d"}, 460 | ] 461 | iniconfig = [ 462 | {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, 463 | {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, 464 | ] 465 | isort = [ 466 | {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, 467 | {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, 468 | ] 469 | lazy-object-proxy = [ 470 | {file = "lazy-object-proxy-1.7.1.tar.gz", hash = "sha256:d609c75b986def706743cdebe5e47553f4a5a1da9c5ff66d76013ef396b5a8a4"}, 471 | {file = "lazy_object_proxy-1.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb8c5fd1684d60a9902c60ebe276da1f2281a318ca16c1d0a96db28f62e9166b"}, 472 | {file = "lazy_object_proxy-1.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a57d51ed2997e97f3b8e3500c984db50a554bb5db56c50b5dab1b41339b37e36"}, 473 | {file = "lazy_object_proxy-1.7.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd45683c3caddf83abbb1249b653a266e7069a09f486daa8863fb0e7496a9fdb"}, 474 | {file = "lazy_object_proxy-1.7.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8561da8b3dd22d696244d6d0d5330618c993a215070f473b699e00cf1f3f6443"}, 475 | {file = "lazy_object_proxy-1.7.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fccdf7c2c5821a8cbd0a9440a456f5050492f2270bd54e94360cac663398739b"}, 476 | {file = "lazy_object_proxy-1.7.1-cp310-cp310-win32.whl", hash = "sha256:898322f8d078f2654d275124a8dd19b079080ae977033b713f677afcfc88e2b9"}, 477 | {file = "lazy_object_proxy-1.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:85b232e791f2229a4f55840ed54706110c80c0a210d076eee093f2b2e33e1bfd"}, 478 | {file = "lazy_object_proxy-1.7.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:46ff647e76f106bb444b4533bb4153c7370cdf52efc62ccfc1a28bdb3cc95442"}, 479 | {file = "lazy_object_proxy-1.7.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12f3bb77efe1367b2515f8cb4790a11cffae889148ad33adad07b9b55e0ab22c"}, 480 | {file = "lazy_object_proxy-1.7.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c19814163728941bb871240d45c4c30d33b8a2e85972c44d4e63dd7107faba44"}, 481 | {file = "lazy_object_proxy-1.7.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:e40f2013d96d30217a51eeb1db28c9ac41e9d0ee915ef9d00da639c5b63f01a1"}, 482 | {file = "lazy_object_proxy-1.7.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:2052837718516a94940867e16b1bb10edb069ab475c3ad84fd1e1a6dd2c0fcfc"}, 483 | {file = "lazy_object_proxy-1.7.1-cp36-cp36m-win32.whl", hash = "sha256:6a24357267aa976abab660b1d47a34aaf07259a0c3859a34e536f1ee6e76b5bb"}, 484 | {file = "lazy_object_proxy-1.7.1-cp36-cp36m-win_amd64.whl", hash = "sha256:6aff3fe5de0831867092e017cf67e2750c6a1c7d88d84d2481bd84a2e019ec35"}, 485 | {file = "lazy_object_proxy-1.7.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6a6e94c7b02641d1311228a102607ecd576f70734dc3d5e22610111aeacba8a0"}, 486 | {file = "lazy_object_proxy-1.7.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4ce15276a1a14549d7e81c243b887293904ad2d94ad767f42df91e75fd7b5b6"}, 487 | {file = "lazy_object_proxy-1.7.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e368b7f7eac182a59ff1f81d5f3802161932a41dc1b1cc45c1f757dc876b5d2c"}, 488 | {file = "lazy_object_proxy-1.7.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6ecbb350991d6434e1388bee761ece3260e5228952b1f0c46ffc800eb313ff42"}, 489 | {file = "lazy_object_proxy-1.7.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:553b0f0d8dbf21890dd66edd771f9b1b5f51bd912fa5f26de4449bfc5af5e029"}, 490 | {file = "lazy_object_proxy-1.7.1-cp37-cp37m-win32.whl", hash = "sha256:c7a683c37a8a24f6428c28c561c80d5f4fd316ddcf0c7cab999b15ab3f5c5c69"}, 491 | {file = "lazy_object_proxy-1.7.1-cp37-cp37m-win_amd64.whl", hash = "sha256:df2631f9d67259dc9620d831384ed7732a198eb434eadf69aea95ad18c587a28"}, 492 | {file = "lazy_object_proxy-1.7.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:07fa44286cda977bd4803b656ffc1c9b7e3bc7dff7d34263446aec8f8c96f88a"}, 493 | {file = "lazy_object_proxy-1.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dca6244e4121c74cc20542c2ca39e5c4a5027c81d112bfb893cf0790f96f57e"}, 494 | {file = "lazy_object_proxy-1.7.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91ba172fc5b03978764d1df5144b4ba4ab13290d7bab7a50f12d8117f8630c38"}, 495 | {file = "lazy_object_proxy-1.7.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:043651b6cb706eee4f91854da4a089816a6606c1428fd391573ef8cb642ae4f7"}, 496 | {file = "lazy_object_proxy-1.7.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b9e89b87c707dd769c4ea91f7a31538888aad05c116a59820f28d59b3ebfe25a"}, 497 | {file = "lazy_object_proxy-1.7.1-cp38-cp38-win32.whl", hash = "sha256:9d166602b525bf54ac994cf833c385bfcc341b364e3ee71e3bf5a1336e677b55"}, 498 | {file = "lazy_object_proxy-1.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:8f3953eb575b45480db6568306893f0bd9d8dfeeebd46812aa09ca9579595148"}, 499 | {file = "lazy_object_proxy-1.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dd7ed7429dbb6c494aa9bc4e09d94b778a3579be699f9d67da7e6804c422d3de"}, 500 | {file = "lazy_object_proxy-1.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70ed0c2b380eb6248abdef3cd425fc52f0abd92d2b07ce26359fcbc399f636ad"}, 501 | {file = "lazy_object_proxy-1.7.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7096a5e0c1115ec82641afbdd70451a144558ea5cf564a896294e346eb611be1"}, 502 | {file = "lazy_object_proxy-1.7.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f769457a639403073968d118bc70110e7dce294688009f5c24ab78800ae56dc8"}, 503 | {file = "lazy_object_proxy-1.7.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:39b0e26725c5023757fc1ab2a89ef9d7ab23b84f9251e28f9cc114d5b59c1b09"}, 504 | {file = "lazy_object_proxy-1.7.1-cp39-cp39-win32.whl", hash = "sha256:2130db8ed69a48a3440103d4a520b89d8a9405f1b06e2cc81640509e8bf6548f"}, 505 | {file = "lazy_object_proxy-1.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:677ea950bef409b47e51e733283544ac3d660b709cfce7b187f5ace137960d61"}, 506 | {file = "lazy_object_proxy-1.7.1-pp37.pp38-none-any.whl", hash = "sha256:d66906d5785da8e0be7360912e99c9188b70f52c422f9fc18223347235691a84"}, 507 | ] 508 | mccabe = [ 509 | {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, 510 | {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, 511 | ] 512 | mypy = [ 513 | {file = "mypy-0.971-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f2899a3cbd394da157194f913a931edfd4be5f274a88041c9dc2d9cdcb1c315c"}, 514 | {file = "mypy-0.971-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:98e02d56ebe93981c41211c05adb630d1d26c14195d04d95e49cd97dbc046dc5"}, 515 | {file = "mypy-0.971-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:19830b7dba7d5356d3e26e2427a2ec91c994cd92d983142cbd025ebe81d69cf3"}, 516 | {file = "mypy-0.971-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:02ef476f6dcb86e6f502ae39a16b93285fef97e7f1ff22932b657d1ef1f28655"}, 517 | {file = "mypy-0.971-cp310-cp310-win_amd64.whl", hash = "sha256:25c5750ba5609a0c7550b73a33deb314ecfb559c350bb050b655505e8aed4103"}, 518 | {file = "mypy-0.971-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d3348e7eb2eea2472db611486846742d5d52d1290576de99d59edeb7cd4a42ca"}, 519 | {file = "mypy-0.971-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3fa7a477b9900be9b7dd4bab30a12759e5abe9586574ceb944bc29cddf8f0417"}, 520 | {file = "mypy-0.971-cp36-cp36m-win_amd64.whl", hash = "sha256:2ad53cf9c3adc43cf3bea0a7d01a2f2e86db9fe7596dfecb4496a5dda63cbb09"}, 521 | {file = "mypy-0.971-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:855048b6feb6dfe09d3353466004490b1872887150c5bb5caad7838b57328cc8"}, 522 | {file = "mypy-0.971-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:23488a14a83bca6e54402c2e6435467a4138785df93ec85aeff64c6170077fb0"}, 523 | {file = "mypy-0.971-cp37-cp37m-win_amd64.whl", hash = "sha256:4b21e5b1a70dfb972490035128f305c39bc4bc253f34e96a4adf9127cf943eb2"}, 524 | {file = "mypy-0.971-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9796a2ba7b4b538649caa5cecd398d873f4022ed2333ffde58eaf604c4d2cb27"}, 525 | {file = "mypy-0.971-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a361d92635ad4ada1b1b2d3630fc2f53f2127d51cf2def9db83cba32e47c856"}, 526 | {file = "mypy-0.971-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b793b899f7cf563b1e7044a5c97361196b938e92f0a4343a5d27966a53d2ec71"}, 527 | {file = "mypy-0.971-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d1ea5d12c8e2d266b5fb8c7a5d2e9c0219fedfeb493b7ed60cd350322384ac27"}, 528 | {file = "mypy-0.971-cp38-cp38-win_amd64.whl", hash = "sha256:23c7ff43fff4b0df93a186581885c8512bc50fc4d4910e0f838e35d6bb6b5e58"}, 529 | {file = "mypy-0.971-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1f7656b69974a6933e987ee8ffb951d836272d6c0f81d727f1d0e2696074d9e6"}, 530 | {file = "mypy-0.971-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d2022bfadb7a5c2ef410d6a7c9763188afdb7f3533f22a0a32be10d571ee4bbe"}, 531 | {file = "mypy-0.971-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef943c72a786b0f8d90fd76e9b39ce81fb7171172daf84bf43eaf937e9f220a9"}, 532 | {file = "mypy-0.971-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d744f72eb39f69312bc6c2abf8ff6656973120e2eb3f3ec4f758ed47e414a4bf"}, 533 | {file = "mypy-0.971-cp39-cp39-win_amd64.whl", hash = "sha256:77a514ea15d3007d33a9e2157b0ba9c267496acf12a7f2b9b9f8446337aac5b0"}, 534 | {file = "mypy-0.971-py3-none-any.whl", hash = "sha256:0d054ef16b071149917085f51f89555a576e2618d5d9dd70bd6eea6410af3ac9"}, 535 | {file = "mypy-0.971.tar.gz", hash = "sha256:40b0f21484238269ae6a57200c807d80debc6459d444c0489a102d7c6a75fa56"}, 536 | ] 537 | mypy-extensions = [ 538 | {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, 539 | {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, 540 | ] 541 | nodeenv = [ 542 | {file = "nodeenv-1.7.0-py2.py3-none-any.whl", hash = "sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e"}, 543 | {file = "nodeenv-1.7.0.tar.gz", hash = "sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b"}, 544 | ] 545 | packaging = [ 546 | {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, 547 | {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, 548 | ] 549 | pathspec = [ 550 | {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, 551 | {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, 552 | ] 553 | platformdirs = [ 554 | {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, 555 | {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, 556 | ] 557 | pluggy = [ 558 | {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, 559 | {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, 560 | ] 561 | pre-commit = [ 562 | {file = "pre_commit-2.20.0-py2.py3-none-any.whl", hash = "sha256:51a5ba7c480ae8072ecdb6933df22d2f812dc897d5fe848778116129a681aac7"}, 563 | {file = "pre_commit-2.20.0.tar.gz", hash = "sha256:a978dac7bc9ec0bcee55c18a277d553b0f419d259dadb4b9418ff2d00eb43959"}, 564 | ] 565 | protobuf = [ 566 | {file = "protobuf-4.21.4-cp310-abi3-win32.whl", hash = "sha256:e113f3d1629cebc911b107ce704f1a17d7e1589efef5c498e202bd47df223955"}, 567 | {file = "protobuf-4.21.4-cp310-abi3-win_amd64.whl", hash = "sha256:cb50d93ef748671b7e2537658869e00aaa8175d717d8e73a23fcd58842883229"}, 568 | {file = "protobuf-4.21.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:142ef5d73d6cd1bd8ab539d7d73c3722f31d33e64914e01bb91439cfcef11a9f"}, 569 | {file = "protobuf-4.21.4-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:47b7cf3e542fd50a3a7c24d0da13451bc362a32c0a9b905714942ea8cf35fa11"}, 570 | {file = "protobuf-4.21.4-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:adeccfbffbf4c9d1e77da86dc995d76c837d01387e412066cc803ad037000892"}, 571 | {file = "protobuf-4.21.4-cp37-cp37m-win32.whl", hash = "sha256:5e47947fbfefd5a1bdc7c28eea1d197ea6dba5812789c2429667831a55ef71b7"}, 572 | {file = "protobuf-4.21.4-cp37-cp37m-win_amd64.whl", hash = "sha256:d9b0398ff68017015ec2a37fb0ab390363a654362b15ca2e4543d3c82587768f"}, 573 | {file = "protobuf-4.21.4-cp38-cp38-win32.whl", hash = "sha256:2ea8c841cc6422aea07d0f4f71f0e5e6e130de9a4b6c31a53b9d2a41a75f2d54"}, 574 | {file = "protobuf-4.21.4-cp38-cp38-win_amd64.whl", hash = "sha256:a8119c029c60cf29b7eea5a9f56648482388e874611243f41cd10aff0a0e5461"}, 575 | {file = "protobuf-4.21.4-cp39-cp39-win32.whl", hash = "sha256:0275902f8292039d4a022319d3f86e8b231ac4c51d7be4cb797890fb78c16b85"}, 576 | {file = "protobuf-4.21.4-cp39-cp39-win_amd64.whl", hash = "sha256:5b95c5f515334dd3a811762e3c588b469bf39d4ee7b7f47ac1e0c41dc73809f7"}, 577 | {file = "protobuf-4.21.4-py2.py3-none-any.whl", hash = "sha256:fd62b6eda64e199b5da651d6be42af2aa8e30805961af1fc5f70292affca78e3"}, 578 | {file = "protobuf-4.21.4-py3-none-any.whl", hash = "sha256:7e51f6244e53e936abadf624ab3a0f06dc106b27473997374fbb34e6b2eb1e60"}, 579 | {file = "protobuf-4.21.4.tar.gz", hash = "sha256:5783dc0d6edae631145337fabb18503b4f77274f94cdd22a4b26b9fe5029e718"}, 580 | ] 581 | py = [ 582 | {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, 583 | {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, 584 | ] 585 | pylint = [ 586 | {file = "pylint-2.14.5-py3-none-any.whl", hash = "sha256:fabe30000de7d07636d2e82c9a518ad5ad7908590fe135ace169b44839c15f90"}, 587 | {file = "pylint-2.14.5.tar.gz", hash = "sha256:487ce2192eee48211269a0e976421f334cf94de1806ca9d0a99449adcdf0285e"}, 588 | ] 589 | pyparsing = [ 590 | {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, 591 | {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, 592 | ] 593 | pytest = [ 594 | {file = "pytest-7.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c"}, 595 | {file = "pytest-7.1.2.tar.gz", hash = "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45"}, 596 | ] 597 | pyyaml = [ 598 | {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, 599 | {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, 600 | {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, 601 | {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, 602 | {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, 603 | {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, 604 | {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, 605 | {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, 606 | {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, 607 | {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, 608 | {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, 609 | {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, 610 | {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, 611 | {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, 612 | {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, 613 | {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, 614 | {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, 615 | {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, 616 | {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, 617 | {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, 618 | {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, 619 | {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, 620 | {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, 621 | {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, 622 | {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, 623 | {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, 624 | {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, 625 | {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, 626 | {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, 627 | {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, 628 | {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, 629 | {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, 630 | {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, 631 | ] 632 | toml = [ 633 | {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, 634 | {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, 635 | ] 636 | tomli = [ 637 | {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, 638 | {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, 639 | ] 640 | tomlkit = [ 641 | {file = "tomlkit-0.11.1-py3-none-any.whl", hash = "sha256:1c5bebdf19d5051e2e1de6cf70adfc5948d47221f097fcff7a3ffc91e953eaf5"}, 642 | {file = "tomlkit-0.11.1.tar.gz", hash = "sha256:61901f81ff4017951119cd0d1ed9b7af31c821d6845c8c477587bbdcd5e5854e"}, 643 | ] 644 | typing-extensions = [ 645 | {file = "typing_extensions-4.3.0-py3-none-any.whl", hash = "sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02"}, 646 | {file = "typing_extensions-4.3.0.tar.gz", hash = "sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6"}, 647 | ] 648 | virtualenv = [ 649 | {file = "virtualenv-20.16.2-py2.py3-none-any.whl", hash = "sha256:635b272a8e2f77cb051946f46c60a54ace3cb5e25568228bd6b57fc70eca9ff3"}, 650 | {file = "virtualenv-20.16.2.tar.gz", hash = "sha256:0ef5be6d07181946891f5abc8047fda8bc2f0b4b9bf222c64e6e8963baee76db"}, 651 | ] 652 | wrapt = [ 653 | {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, 654 | {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, 655 | {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, 656 | {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59"}, 657 | {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87"}, 658 | {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1"}, 659 | {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b"}, 660 | {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462"}, 661 | {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1"}, 662 | {file = "wrapt-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320"}, 663 | {file = "wrapt-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2"}, 664 | {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4"}, 665 | {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069"}, 666 | {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310"}, 667 | {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f"}, 668 | {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656"}, 669 | {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, 670 | {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, 671 | {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, 672 | {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, 673 | {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, 674 | {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, 675 | {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d"}, 676 | {file = "wrapt-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7"}, 677 | {file = "wrapt-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00"}, 678 | {file = "wrapt-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4"}, 679 | {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1"}, 680 | {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1"}, 681 | {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff"}, 682 | {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d"}, 683 | {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1"}, 684 | {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569"}, 685 | {file = "wrapt-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed"}, 686 | {file = "wrapt-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471"}, 687 | {file = "wrapt-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248"}, 688 | {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68"}, 689 | {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d"}, 690 | {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77"}, 691 | {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7"}, 692 | {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015"}, 693 | {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a"}, 694 | {file = "wrapt-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853"}, 695 | {file = "wrapt-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c"}, 696 | {file = "wrapt-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456"}, 697 | {file = "wrapt-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f"}, 698 | {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc"}, 699 | {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1"}, 700 | {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"}, 701 | {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b"}, 702 | {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0"}, 703 | {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57"}, 704 | {file = "wrapt-1.14.1-cp38-cp38-win32.whl", hash = "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5"}, 705 | {file = "wrapt-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d"}, 706 | {file = "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383"}, 707 | {file = "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7"}, 708 | {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86"}, 709 | {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735"}, 710 | {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b"}, 711 | {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3"}, 712 | {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3"}, 713 | {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe"}, 714 | {file = "wrapt-1.14.1-cp39-cp39-win32.whl", hash = "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5"}, 715 | {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, 716 | {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, 717 | ] 718 | -------------------------------------------------------------------------------- /protos/metadata.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package awdd.metadata; 4 | 5 | message DefineObject { 6 | message Field { 7 | enum Kind { 8 | UNKNOWN = 0; 9 | DOUBLE = 1; 10 | FLOAT = 2; 11 | INT64 = 3; 12 | UINT64 = 4; 13 | ERROR_CODE = 5; 14 | INT32 = 6; 15 | UINT32 = 7; 16 | BYTE_COUNT = 8; 17 | SEQUENCE_NUMBER = 9; 18 | BEDF_OPERATOR = 10; 19 | ENUM = 11; 20 | BOOLEAN = 12; 21 | STRING = 13; 22 | BYTES = 14; 23 | PACKED_TIMES = 0x11; 24 | PACKED_ERRORS = 0x14; 25 | PACKED_UINT_32 = 0x15; 26 | OBJECT = 27; 27 | } 28 | 29 | enum IntegerKind { 30 | UNKNOWN_INTEGER = 0x00; 31 | TIMESTAMP = 0x01; 32 | METRIC_ID = 0x02; 33 | TRIGGER_ID = 0x03; 34 | PROFILE_ID = 0x04; 35 | COMPONENT_ID = 0x05; 36 | AVERAGE_TIME = 0x15; 37 | TIME_DELTA_MS = 0x16; 38 | TIMEZONE_OFFSET = 0x17; 39 | ASSOCIATED_TIME = 0x18; 40 | PERIOD_IN_HOURS = 0x19; 41 | TIME_OF_DAY = 0x1E; 42 | SAMPLE_TIMESTAMP = 0x1F; 43 | } 44 | 45 | enum MetricType { 46 | METRIC_UNKNOWN = 0; 47 | METRIC_EVENT = 1; 48 | METRIC_STATS = 2; 49 | METRIC_STATE = 3; 50 | } 51 | 52 | uint64 tag = 1; 53 | Kind type = 2; 54 | bool is_repeated = 3; 55 | optional string name = 4; 56 | optional bool has_pii = 5; 57 | optional bool has_loc = 6; 58 | optional uint64 message_type_index = 7; 59 | optional uint64 enum_type_index = 8; 60 | optional IntegerKind number_pretty_format = 9; 61 | 62 | optional MetricType metric_type = 12; 63 | } 64 | 65 | optional string name = 1; 66 | repeated Field fields = 2; 67 | } 68 | 69 | message Enum { 70 | message EnumValue { 71 | optional string label = 1; 72 | optional uint32 intValue = 2; 73 | optional uint64 longValue = 3; 74 | } 75 | 76 | optional string name = 1; 77 | repeated EnumValue members = 2; 78 | } 79 | 80 | message Metadata { 81 | repeated DefineObject messages = 1; 82 | repeated Enum enums = 2; 83 | } 84 | 85 | message Extensions { 86 | message Extension { 87 | string name = 1; 88 | int64 tag = 2; 89 | } 90 | 91 | repeated Extension extensions = 1; 92 | } 93 | 94 | message ManifestIdentity { 95 | string git_hash = 1; 96 | string git_description = 2; 97 | uint64 build_time = 3; 98 | } -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [build-system] 2 | requires=["setuptools", "wheel", "poetry"] 3 | 4 | [tool.poetry] 5 | name="awdd" 6 | authors=["Rick Mark "] 7 | version="0.9.1" 8 | description="Utility to parse Apple Wireless Diagnostics reports" 9 | license="MIT" 10 | readme="README.md" 11 | homepage="https://github.com/hack-different/apple-diagnostics-format" 12 | repository="https://github.com/hack-different/apple-diagnostics-format.git" 13 | 14 | [tool.poetry.dependencies] 15 | python = "^3.10" 16 | protobuf = "^4.21" 17 | 18 | [tool.poetry.dev-dependencies] 19 | pytest = "^7" 20 | pre-commit = "^2.20.0" 21 | pylint = "^2.14.5" 22 | black = "^22.6.0" 23 | mypy = "^0.971" 24 | 25 | [tool.pytest.ini_options] 26 | minversion = "6.0" 27 | addopts = "-ra -q" 28 | testpaths = [ 29 | "tests" 30 | ] 31 | 32 | [mypy] 33 | python_version = 3.7 34 | 35 | [pytest] 36 | cache_dir = ".pytest_cache" 37 | testpaths = "tests" 38 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- 1 | from typing import * 2 | from glob import glob 3 | from pathlib import * 4 | import os 5 | 6 | 7 | def for_each_log_file(function: Callable[[str, BinaryIO], None]) -> None: 8 | path_to_current_file = os.path.realpath(__file__) 9 | current_directory = os.path.dirname(path_to_current_file) 10 | log_fixtures = os.path.join(current_directory, "./fixtures/*.metriclog") 11 | 12 | for file in glob(log_fixtures): 13 | path = Path(file) 14 | print(f"\n\nReading File: {path.name}\n") 15 | 16 | with open(file, "rb") as stream: 17 | function(file, stream) 18 | -------------------------------------------------------------------------------- /tests/collect_all_tags.py: -------------------------------------------------------------------------------- 1 | from awdd.manifest import * 2 | 3 | -------------------------------------------------------------------------------- /tests/fixtures/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hack-different/apple-diagnostics-format/afe80d2c08b950e201d6c2e1b8817157187bffd7/tests/fixtures/.gitkeep -------------------------------------------------------------------------------- /tests/read_all_tags_from_logs.py: -------------------------------------------------------------------------------- 1 | import io 2 | from . import for_each_log_file 3 | from awdd import decode_tag 4 | 5 | 6 | def test_parse_tags_and_type(): 7 | def print_each_tag(filename, stream): 8 | while tag := decode_tag(stream): 9 | if tag.index == 15: # metricsLog entry 10 | print("\n\nmetricsLog entry:\n") 11 | reader = io.BytesIO(tag.value) 12 | while metrics_tag := decode_tag(reader): 13 | print(f"\t{metrics_tag}") 14 | else: 15 | print(tag) 16 | 17 | for_each_log_file(print_each_tag) 18 | -------------------------------------------------------------------------------- /tests/test_load_manifests.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | import os 3 | from glob import glob 4 | from awdd.metadata import * 5 | from awdd.manifest import * 6 | 7 | 8 | def test_load_manifests(): 9 | metadata_files = glob(os.path.join(EXTENSION_MANIFEST_PATH)) + [ROOT_MANIFEST_PATH] 10 | 11 | for manifest_file in metadata_files: 12 | print(f"Reading manifest file: {manifest_file}\n") 13 | manifest = Manifest(manifest_file) 14 | assert(manifest is not None) 15 | 16 | manifest.parse() 17 | 18 | print(f"Tag: {manifest.tag}") 19 | print(f"Structure Tables: {len(manifest.structure_tables)}") 20 | print(f"Display Tables: {len(manifest.display_tables)}") 21 | if manifest.identity: 22 | print(f"Identity: {manifest.identity.name}") 23 | 24 | if manifest.is_root: 25 | # Root manifests define multiple tags 26 | assert(manifest.tag is None) 27 | assert(len(manifest.structure_tables) > 1) 28 | assert(len(manifest.display_tables) > 1) 29 | else: 30 | # Extension manifests define single tags 31 | assert(manifest.tag is not None) 32 | assert(len(manifest.structure_tables) in [0, 1]) 33 | assert(len(manifest.display_tables) in [0, 1]) 34 | 35 | 36 | def test_parse_root_manifest(): 37 | manifest = Manifest(ROOT_MANIFEST_PATH) 38 | 39 | manifest.parse() 40 | 41 | assert(len(manifest.display_tables) > 1) 42 | assert(len(manifest.display_tables) > 1) 43 | assert(len(manifest.structure_tables) > 1) 44 | 45 | compact_tags = set(manifest.structure_tables.keys()) 46 | display_tags = set(manifest.display_tables.keys()) 47 | 48 | assert compact_tags == display_tags 49 | 50 | for tag in manifest.structure_tables: 51 | print(f"Tag {hex(tag)} has {len(manifest.structure_tables[tag].rows)} compact rows and {len(manifest.display_tables[tag].rows)} display rows") 52 | 53 | 54 | def test_extension_parse_manifests(): 55 | for manifest_file in glob(EXTENSION_MANIFEST_PATH): 56 | print(f"Reading in test data file {manifest_file}\n") 57 | 58 | manifest = Manifest(manifest_file) 59 | assert(manifest is not None) 60 | 61 | manifest.parse() 62 | 63 | assert(1 >= len(manifest.display_tables) >= 0) 64 | assert(len(manifest.structure_tables) == 1) 65 | 66 | 67 | def test_resolve_metadata(): 68 | metadata = Metadata() 69 | metadata.resolve() 70 | 71 | for item in metadata.all_objects: 72 | print(item) 73 | -------------------------------------------------------------------------------- /tests/test_parse_log.py: -------------------------------------------------------------------------------- 1 | import io 2 | 3 | import pytest 4 | import os 5 | from glob import glob 6 | from awdd.metadata import * 7 | from awdd.parser import LogParser 8 | from tests import for_each_log_file 9 | 10 | 11 | def test_resolve_manifests(): 12 | metadata = Metadata() 13 | metadata.resolve() 14 | 15 | 16 | def test_parse_logs(): 17 | parser = LogParser() 18 | 19 | def print_each_log(filename, stream): 20 | print(f"Parsing Log: {filename}") 21 | output = io.StringIO() 22 | 23 | result = parser.parse(stream) 24 | print(result) 25 | 26 | for_each_log_file(print_each_log) 27 | -------------------------------------------------------------------------------- /tmp/.gitignore: -------------------------------------------------------------------------------- 1 | *.bin -------------------------------------------------------------------------------- /tmp/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hack-different/apple-diagnostics-format/afe80d2c08b950e201d6c2e1b8817157187bffd7/tmp/.gitkeep --------------------------------------------------------------------------------