Skip to main content

File parser and writer for optical time-domain reflectometry interchange files (Bellcore SOR)

Project description

otdrs

otdrs is a Rust implementation of a SOR file parser and generator. SOR files are used as a storage format for optical time-domain reflectometry (OTDR) tests, which are commonly used to characterise and validate the proper construction of fibre optic networks. SOR is formally known as the Bellcore OTDR interchange format, specified in Telcordia SR-4731, a proprietary standard. OTDR testing involves firing short pulses of light down fibres under test, and measuring the intensity of returned light over time.

otdrs is intended as a minimal but valid and robust parser implementation to enable a translation from the closed binary format to open, self-documenting formats, to permit easy development of analysis tools without having to deal with the complexities of managing a binary format that is broadly undocumented and difficult to parse. It also provides Rust primitives for OTDR files and a writer to allow files to be loaded, modified, and written back.

Wherever possible, translation preserves the input format; otdrs does not try to fix peculiarities of particular test equipment or post-processing software or work around quirks in their input, except where they would break parsing of the format. No normalisation is attempted.

Where the parser cannot reliably extract information it is omitted; in this sense, otdrs is a best-effort parser.

Writing of files is performed with as much care as possible and the optional checksum block is computed. Generated files open without issue in several professional applications, and proprietary data is preserved losslessly.

Rust was chosen for its robustness, type-safety, and the excellent nom parser library. serde is used for serialisation for output.

Rust Cargo Downloads Python

Usage

otdrs takes one positional argument, the path to a SOR file. Its output is a single JSON or CBOR blob which contains the information within the SOR file; flags are used to set the output path (default is stdout) or the format to output. otdrs --help shows the available options.

A post-processing example is shown in the demo.py script in this repository, which will plot the data from an OTDR file.

Installing

If you have Rust/Cargo installed you can install otdrs with cargo install otdrs. otdrs is not otherwise packaged currently.

Library Usage

You can use otdrs as a Rust library to read, modify, and write SOR files. For instance, the following minimal program will modify the fiber ID and cable ID of the file, and print the nominal wavelength of the file to the terminal.

use otdrs::parser::parse_file;
use std::fs::File;
use std::io::prelude::*;
fn main() -> std::io::Result<()>  {
    // Read the file into memory
    let mut in_file = File::open("input.sor")?;
    let mut in_data = Vec::new();
    in_file.read_to_end(&mut in_data)?;
    // Parse the file
    let mut sor = parse_file(&in_data).unwrap().1;
    // Most blocks are Options because the parser can't guarantee them
    // This is true even of "required" blocks in the spec, because otdrs is permissive.
    match sor.general_parameters.as_mut() {
        Some(mut gp) => {
            // If we've got a block we can read and modify it!
            println!("Nominal wavelength of this SOR record: {:?}", gp.nominal_wavelength);
            gp.fiber_id = "Hello world";
            gp.cable_id = "Foo bar";
            // Note that we don't check the values you write a valid, outside of type enforcement
            // Even then you need to be careful to adhere to the spec. e.g. no UTF-8 glyphs
            // No emojis in your comments field 😭😭😭
        }
        None => {
            println!("Your SOR file has no General Parameters block!")
        }
    }
    // Encode the SORFile structure to a binary SOR file again...
    // Note you'd normally want to handle errors properly here, but we're an example, so...
    let bytes_to_write = sor.to_bytes().unwrap();
    // Write the file out to disk!
    let mut out_file = File::create("output.sor").unwrap();
    out_file.write_all(&bytes_to_write)?;
    return Ok(());
}

Python module

otdrs is also available as a Python module, with limited functionality. Currently, reading SOR files is supported.

import otdrs
sor_from_file = otdrs.parse_file("input.sor")
sor_from_file.fixed_parameters.acquisition_offset #=> returns the acquisition offset, and so on
file = open("input.sor", "rb")
sor_from_bytes = otdrs.parse_bytes(file.read())
sor_from_bytes == sor_from_file #=> True

The resulting objects and methods are fully type hinted.

Code Quality, Conformance/Compliance

This is the author's first major Rust project, so use with caution.

This is absolutely not guaranteed to work in all cases with all files or produce correct output in all cases (or indeed any). Check the output with the files you're using and a known-good viewer if you care about what you're doing.

Security Considerations

As otdrs handles arbitrary binary input and performs some arithmetic on it which can potentially lead to underruns and overruns as well as exciting undefined behaviour.

While Rust is a very good language to write such tools in, since runtime errors such as this are handled, otdrs makes an effort to avoid obvious situations where slice pointers violate bounds or where arithmetic on SOR contents may lead to unexpected situations. cargo-fuzz is used to fuzz with libFuzzer (on Linux only at present) to discover scenarios in which this can occur, including through writing and round-tripping OTDR files.

Checking of result validity is not performed on all fields, and users of the tool should take care to avoid trusting input parsed from SOR files. Sanitise your inputs.

Known Issues

  • The "link parameters" block is not currently decoded, as the author does not have files which contain it for testing. This is not used in common OTDR sets.
  • Testing is not as comprehensive and extensive as it should be, particularly for writing files.

There is no application of fixed scaling factors described in SR-4731. This is generally intentional, to permit correct post-processing as required in other applications.

Proprietary Blocks

While SOR files are standardised, not all of the content is; there are a set of standard and required blocks for the basic information, and otdrs only attempts to parse the standard blocks in a SOR file.

The content of proprietary blocks is dumped for analysis by upstream tools that may either have knowledge of proprietary formats or wish to simply know of the existence of such blocks. The map block will in all cases list all blocks within the file.

Writing SORs

otdrs has experimental support for generating SORs from Rust data structures. Strictly, the map block is heavily recomputed when writing; a BlockInfo block with a revision number and header will be expected for all blocks, but sizes and counters are dynamically generated. This is because it is practically impossible (or very difficult, at least) to compute sizes before serialising data, so this is best done at the point of writing.

Editors are responsible for ensuring that any modification of data elsewhere in the file makes sense, e.g. if the number of points within a DataPointsAtScaleFactor struct is changed, then the n_points field must be amended by the editor; otdrs will not do this for you.

Currently, landmarks and LinkParameters are not written out, as these are very rarely used in practice and no example data is currently available to support testing.

Testing

The parser has been tested on SOR files generated from:

  • Noyes OFL280 OTDRs, including those re-exported from EXFO FastReporter3
  • Anritsu Access Master OTDRs
  • EXFO MaxTester 730C and FTB-4/FTBx730 OTDRs
  • EXFO iOLM files exported to SOR from EXFO FastReporter3
  • EXFO 735C-SM7R modules in centralised PON test deployments (shooting through splitters to high-reflectance devices)

Round-trip testing has also confirmed that all of the above files can be read and written out by otdrs with no loss or alteration of data.

Further test files are desired and should be submitted to the author or as a pull request with tests against known values.

Interpretation

To actually interpet any of this data correctly you are probably going to need to read SR-4731, which can be found here for around $750.

This parser makes no attempt to correctly interpret the resulting data from the SOR file format, merely to make it accessible for applications to perform correct interpretation. Actually locating events and measuring cable data based on OTDR data requires careful consideration of data offsets (e.g. front panel to user offset, scaling factors, etc).

Vendor Quirks

As with pretty much every standard out there, every vendor has interpreted it differently. For one example, some Noyes OTDRs store a 30 second averaging period as 3000 whereas EXFO and Anritsu record it as 30. The specification, of course, says this should be stored as 300. Professional software struggles with this - for instance, EXFO's FastReporter3 software misinterprets the Noyes result.

Documentation of storage quirks compared to "standard" behaviour such as the above, against known behaviour would be helpful for those developing post-processing software; if you have access to test equipment, you can helpfully run a controlled test, write down the actual values displayed by the tester etc and store the SOR file directly.

While "fixing" vendor quirks to generate a standards-compliant output is not currently in the scope of otdrs, this is something that could be added as an optional post-processing step.

Versions

  • 1.0.5 - License change from GPLv3 to LGPLv3
  • 1.0.4 - Python module type hints, dependency fix
  • 1.0.3 - Python module fixes
  • 1.0.2 - Python module added as an optional feature
  • 1.0.1 - upgraded nom to 8.0.0, clap to 4.x
  • 1.0.0 - refactored to avoid some beginner Rust errors; SORFile now owns its data. Updated dependencies.
  • 0.4.2 - upgraded nom to 7.1.0, clap to 3.0.0-rc7
  • 0.4.1 - upgraded nom to 6.1.2, improved README and demo scripts
  • 0.4.0 - added SORFile#to_bytes and a whole bunch of related functions and macros which altogether mean that otdrs can now write OTDR files
  • 0.3.0 - switched to using clap for command-line argument handling for better error handling, added option to write to file instead of stdout and added CBOR export support
  • 0.2.0 - restructured to allow use as a library, added fuzzing and fixed a number of bounds-check/error propogation problems
  • 0.1.0 - initial release

License

Versions of otdrs up to 1.0.4 were licensed under the GPL version 3. GPLv3 was selected specifically to drive improved open source engagement with equipment manufacturers and developers of OTDR processing software in an industry that has struggled with open data exchange, proprietary (and vendor-locked) software, and poor maintenance of existing software.

Version 1.0.5 onwards is licensed under the LGPL version 3, which unambiguously allows use of otdrs as a library in proprietary tools and services, to encourage use of open-source tooling in proprietary services.

otdrs - a SOR file parsing tool Copyright (C) 2021, 2022, 2023, 2025 James Harrison

This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along with this program. If not, see http://www.gnu.org/licenses/.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

otdrs-1.0.5.tar.gz (660.3 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

otdrs-1.0.5-cp313-cp313t-win_amd64.whl (204.4 kB view details)

Uploaded CPython 3.13tWindows x86-64

otdrs-1.0.5-cp313-cp313t-win32.whl (190.6 kB view details)

Uploaded CPython 3.13tWindows x86

otdrs-1.0.5-cp313-cp313t-musllinux_1_2_x86_64.whl (522.5 kB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ x86-64

otdrs-1.0.5-cp313-cp313t-musllinux_1_2_i686.whl (549.0 kB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ i686

otdrs-1.0.5-cp313-cp313t-musllinux_1_2_armv7l.whl (616.7 kB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ ARMv7l

otdrs-1.0.5-cp313-cp313t-musllinux_1_2_aarch64.whl (527.4 kB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ ARM64

otdrs-1.0.5-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (309.8 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.17+ x86-64

otdrs-1.0.5-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl (335.2 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.17+ i686

otdrs-1.0.5-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (288.1 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.17+ ARMv7l

otdrs-1.0.5-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (294.2 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.17+ ARM64

otdrs-1.0.5-cp313-cp313t-macosx_11_0_arm64.whl (313.5 kB view details)

Uploaded CPython 3.13tmacOS 11.0+ ARM64

otdrs-1.0.5-cp313-cp313t-macosx_10_12_x86_64.whl (322.9 kB view details)

Uploaded CPython 3.13tmacOS 10.12+ x86-64

otdrs-1.0.5-cp37-abi3-win_amd64.whl (207.8 kB view details)

Uploaded CPython 3.7+Windows x86-64

otdrs-1.0.5-cp37-abi3-win32.whl (195.2 kB view details)

Uploaded CPython 3.7+Windows x86

otdrs-1.0.5-cp37-abi3-musllinux_1_2_x86_64.whl (527.4 kB view details)

Uploaded CPython 3.7+musllinux: musl 1.2+ x86-64

otdrs-1.0.5-cp37-abi3-musllinux_1_2_i686.whl (553.8 kB view details)

Uploaded CPython 3.7+musllinux: musl 1.2+ i686

otdrs-1.0.5-cp37-abi3-musllinux_1_2_armv7l.whl (620.5 kB view details)

Uploaded CPython 3.7+musllinux: musl 1.2+ ARMv7l

otdrs-1.0.5-cp37-abi3-musllinux_1_2_aarch64.whl (531.8 kB view details)

Uploaded CPython 3.7+musllinux: musl 1.2+ ARM64

otdrs-1.0.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (314.9 kB view details)

Uploaded CPython 3.7+manylinux: glibc 2.17+ x86-64

otdrs-1.0.5-cp37-abi3-manylinux_2_17_i686.manylinux2014_i686.whl (339.8 kB view details)

Uploaded CPython 3.7+manylinux: glibc 2.17+ i686

otdrs-1.0.5-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (291.6 kB view details)

Uploaded CPython 3.7+manylinux: glibc 2.17+ ARMv7l

otdrs-1.0.5-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (298.4 kB view details)

Uploaded CPython 3.7+manylinux: glibc 2.17+ ARM64

otdrs-1.0.5-cp37-abi3-macosx_11_0_arm64.whl (325.0 kB view details)

Uploaded CPython 3.7+macOS 11.0+ ARM64

otdrs-1.0.5-cp37-abi3-macosx_10_12_x86_64.whl (336.1 kB view details)

Uploaded CPython 3.7+macOS 10.12+ x86-64

File details

Details for the file otdrs-1.0.5.tar.gz.

File metadata

  • Download URL: otdrs-1.0.5.tar.gz
  • Upload date:
  • Size: 660.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.9.3

File hashes

Hashes for otdrs-1.0.5.tar.gz
Algorithm Hash digest
SHA256 c5f1d2b4241a5a681387e20bd4accd034c76eea72d939fb1a4d578c82aee54f5
MD5 2252104c313094edad85550b627118bf
BLAKE2b-256 88a61c740260fbe7ae1e9c43a101bd4958dd95dfdd242cb24eb3c96842a2d633

See more details on using hashes here.

File details

Details for the file otdrs-1.0.5-cp313-cp313t-win_amd64.whl.

File metadata

  • Download URL: otdrs-1.0.5-cp313-cp313t-win_amd64.whl
  • Upload date:
  • Size: 204.4 kB
  • Tags: CPython 3.13t, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.9.3

File hashes

Hashes for otdrs-1.0.5-cp313-cp313t-win_amd64.whl
Algorithm Hash digest
SHA256 6e19d12fb910f794c9c85e91deae43aaae87eb55b7569259a7f531737784e7db
MD5 22834a0ca53b55ec2197167196cfbef4
BLAKE2b-256 04e10c16de8a8e1aee8a84eafc87c87929c63072209bcf7da76aaeed681b14f0

See more details on using hashes here.

File details

Details for the file otdrs-1.0.5-cp313-cp313t-win32.whl.

File metadata

  • Download URL: otdrs-1.0.5-cp313-cp313t-win32.whl
  • Upload date:
  • Size: 190.6 kB
  • Tags: CPython 3.13t, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.9.3

File hashes

Hashes for otdrs-1.0.5-cp313-cp313t-win32.whl
Algorithm Hash digest
SHA256 87e43f00875e43445580010287ae13535dd630dedaa643f1ffc2ed793fad68e1
MD5 a224b2f56c07e847883ebb7542b3d5fe
BLAKE2b-256 d2d971d4f32a4eb973fcb7e3880954f285c3dfb930e7411ed90603a416fbb08d

See more details on using hashes here.

File details

Details for the file otdrs-1.0.5-cp313-cp313t-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for otdrs-1.0.5-cp313-cp313t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 19c77673ec01c1b024f1e2ddcc2df8bb4e2e8a9fc65c96e5685b93f2012dbe61
MD5 7c4c8b4bb899c4690c5ffd5ab28aba27
BLAKE2b-256 085bb02d5d2a5710ed169570d7cef34d56269394821cdb8d51ce09ef4fa19872

See more details on using hashes here.

File details

Details for the file otdrs-1.0.5-cp313-cp313t-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for otdrs-1.0.5-cp313-cp313t-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 ac5de2e6f80515128dbfda2b242f9c9682592c56b7bb100f9212fb81823edaae
MD5 65f534926ea6d9360f58c5c90fa66efb
BLAKE2b-256 079d6d873cbcad700edc73906ef853d97a25c4b1e2ea75db4ca6492706d976b9

See more details on using hashes here.

File details

Details for the file otdrs-1.0.5-cp313-cp313t-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for otdrs-1.0.5-cp313-cp313t-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 9fbe11ad60fb8be4548b960b1f83c1c8f4278659185cdb66065be7227202afc1
MD5 1228152e82d6d5d01ac95b76fbe5617b
BLAKE2b-256 4286d7491119150a7b8d3b32974cf2ca78658ee11f697c7db31317384311dbce

See more details on using hashes here.

File details

Details for the file otdrs-1.0.5-cp313-cp313t-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for otdrs-1.0.5-cp313-cp313t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 f882d855f4798d5d98ec752e1ed3baff6c3d280d4450c039315ffcd519209f23
MD5 52ead18be570648c4ce99d8ffe86b54e
BLAKE2b-256 c1511ef3fe5f6b5a25eb42beb034aa39c5d4e8c405c6a7d1a23bef949ae6ba02

See more details on using hashes here.

File details

Details for the file otdrs-1.0.5-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for otdrs-1.0.5-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3fa204b4511a4870d1b465bf94e6dbfd42b8a7193b38c5c2f0460ed2cb574956
MD5 be45ae0380a03f8cdaac39c26d766c1e
BLAKE2b-256 10719bc02bcc0eea89bbfba4d98bcd0843acad1fd3fac5a5f4c156b5f57c5858

See more details on using hashes here.

File details

Details for the file otdrs-1.0.5-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for otdrs-1.0.5-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 16c036ed4d6de04bd8fdb3e6e80760195c52248676a3c21667ac0c09a1d208c1
MD5 cbe2946a3f7d3ebaa4352954fa803ca0
BLAKE2b-256 cd61661065742a491d8d3f02bc5d8804e4bc8fa40ad26b04b804665cbf3576be

See more details on using hashes here.

File details

Details for the file otdrs-1.0.5-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for otdrs-1.0.5-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 ecc71c53d79312e3004e469a8bc2efe1da0b5714da41c796eb3c2f70c87e3492
MD5 946afab25f259d86ff56f4c678c5f551
BLAKE2b-256 fc56f58142c6565bc44f9f028dc906e91cc039ef0995f20871545af9cf027d39

See more details on using hashes here.

File details

Details for the file otdrs-1.0.5-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for otdrs-1.0.5-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e547015296b30cca2959748798e1d21df36e63368bd882ad3bc29011e2ee370d
MD5 b88d18ab1e97f8cf80963e92b8c866d2
BLAKE2b-256 24da8ef5f10d7e614030bcd3a2b59d7940d54c5925bbced37db3db8cb46b73b7

See more details on using hashes here.

File details

Details for the file otdrs-1.0.5-cp313-cp313t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for otdrs-1.0.5-cp313-cp313t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 04ea773da21465f482c8364ab85cbfc952b423a65468469d0636a66dfc09a0fb
MD5 8ab684d00158b76a878e770bbfe6cda0
BLAKE2b-256 6e690b41229bb86d6ac2098ddfc2d8f9a422c67e075e6e8669a448dec41e5858

See more details on using hashes here.

File details

Details for the file otdrs-1.0.5-cp313-cp313t-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for otdrs-1.0.5-cp313-cp313t-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 679cde6f7084848bffe9d38ce9d0ecb51246c8c6c6e23866e146b34b1ac0c0b9
MD5 78e346fbd14a2dd0bb53cf209ea85eca
BLAKE2b-256 2fcd3d2fbaddd16a49dc90d444ac706a0cfd66842ae05cea1ed615793051100c

See more details on using hashes here.

File details

Details for the file otdrs-1.0.5-cp37-abi3-win_amd64.whl.

File metadata

  • Download URL: otdrs-1.0.5-cp37-abi3-win_amd64.whl
  • Upload date:
  • Size: 207.8 kB
  • Tags: CPython 3.7+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.9.3

File hashes

Hashes for otdrs-1.0.5-cp37-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 be2ac7c81a4d2262692aadc33fd1a12697ee31ea50272259a3b4850e58f2cad2
MD5 f83c1df0fb7500a99bd0a5ee4ad3a269
BLAKE2b-256 1596152d08194e37412f1b0029320ab4f33a2f586fefcbe2476b0a4f0b7284f5

See more details on using hashes here.

File details

Details for the file otdrs-1.0.5-cp37-abi3-win32.whl.

File metadata

  • Download URL: otdrs-1.0.5-cp37-abi3-win32.whl
  • Upload date:
  • Size: 195.2 kB
  • Tags: CPython 3.7+, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.9.3

File hashes

Hashes for otdrs-1.0.5-cp37-abi3-win32.whl
Algorithm Hash digest
SHA256 7d779c4ea50c26f6fa60c48927a1d13525e0d6080b50352f500502484e3850ab
MD5 5e699927df48de2a3beff974d0277a29
BLAKE2b-256 661bce91666b9c02b88dcb9160212bc6ee3b40b2156b968a7ac7a590800bfc8c

See more details on using hashes here.

File details

Details for the file otdrs-1.0.5-cp37-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for otdrs-1.0.5-cp37-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 b00546429228caea644d67435fbf74455d02a0ac79e306682565d0efabbb08b4
MD5 7333ca05916a5d1957990dd919b87be0
BLAKE2b-256 7a4658cc9a11a006c971022aa405839ac7a16a4fdf0b47f191fe549bc67c7379

See more details on using hashes here.

File details

Details for the file otdrs-1.0.5-cp37-abi3-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for otdrs-1.0.5-cp37-abi3-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 724b7402f14488bbd712c51e958b7d689fe9fed80bfba314f31a67b3876c0ee1
MD5 3de9787417f2b90a9322f945ec1b10d9
BLAKE2b-256 4acd335efe44378195e15b52f9c5fe19423f3d58c2e9e780fe533cb6c06c2cff

See more details on using hashes here.

File details

Details for the file otdrs-1.0.5-cp37-abi3-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for otdrs-1.0.5-cp37-abi3-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 7570acb8396c38510e9deb2b719534ec0ec4e27333bc30f8214b5ff5f95b4b0b
MD5 701a1a886bc66df15479d1e9892d2e33
BLAKE2b-256 2f942eab80b58cfcfc721bd12d901a3f064b6b19b622fc631d5b0cc5b051a800

See more details on using hashes here.

File details

Details for the file otdrs-1.0.5-cp37-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for otdrs-1.0.5-cp37-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 0ffad7083d7cd391d842a881f9cdccb7c581c0952c0f2ff75fc0300e67c09dfc
MD5 b8ab8980f7e4c81ae6c03ab42a840970
BLAKE2b-256 50ea38728f900ce71c6fbdb4ee8638f91e64ee3f8e07a8ae5f9feb16e1310f1e

See more details on using hashes here.

File details

Details for the file otdrs-1.0.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for otdrs-1.0.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 dd11fd7f1b34124aef099ac39c40f24764674a3e28ce3f7d526beefb8558d5f7
MD5 e1432f486f2924af01dda00315446a57
BLAKE2b-256 c311daa849575907f76b96623f9089af4c409abe71cf42b1c6206864bae0d147

See more details on using hashes here.

File details

Details for the file otdrs-1.0.5-cp37-abi3-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for otdrs-1.0.5-cp37-abi3-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 9a6471bd85ef74760554a289649a24d05c2ea9d010f4d5c56f8c23387f556f65
MD5 124a0b89f9206404a2f8e4e5d378928d
BLAKE2b-256 a45e73225f95c3b0b0e83d74cfff921adaa83d26653cf7dfbf7be311797029f2

See more details on using hashes here.

File details

Details for the file otdrs-1.0.5-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for otdrs-1.0.5-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 3ae92877d58d97c43bc10d3ebf9ea85d6dc7aacce12d38d7ccd8ff7fae35c736
MD5 83e6488b769b8f880b3fab4fd6c05ca0
BLAKE2b-256 c88232b75a42688071594aabf57fe667b647e1c5a68f06e1f27577c5ef34a56b

See more details on using hashes here.

File details

Details for the file otdrs-1.0.5-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for otdrs-1.0.5-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 90fee72072f2c62619a82df1cc5de4d91bc9eff8efabc1f278d38c6bd03b6914
MD5 875b68f9640c05506312647e74200ade
BLAKE2b-256 a4808123848d078916df766f1c16c94d52f70fdc650bf0a76c1418c036c7685e

See more details on using hashes here.

File details

Details for the file otdrs-1.0.5-cp37-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for otdrs-1.0.5-cp37-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 98c32b287cdeccb9648a359867b588a6d62de801581844aade56bd0e108c5c2a
MD5 55da107888e99ce91e86cb3456aa4549
BLAKE2b-256 4589c34034a56f726c07c807f42b5ecf776df4717be47c8b342908822faeda00

See more details on using hashes here.

File details

Details for the file otdrs-1.0.5-cp37-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for otdrs-1.0.5-cp37-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 522d7173c199ebe7b793ca4767bbf9db960560bbb8e2ed9b2deb970be1a1f394
MD5 c9644520829c81d189eae859b481b7a9
BLAKE2b-256 87af304bab771cc3c314eb57b8fe0b7d650835c383edf3e0e4285844f3d011f9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page