Giter Site home page Giter Site logo

regulaforensics / documentreader-ios Goto Github PK

View Code? Open in Web Editor NEW
55.0 55.0 15.0 27.6 MB

iOS Framework for reading and validation of identification documents

Swift 90.64% Ruby 0.55% Objective-C 8.82%
authentication document id objective-c reader sdk swift validation verification

documentreader-ios's People

Contributors

devglevsky avatar dmitrysmolyakov avatar ikliashchou avatar pkandrashkou avatar serge-rylko avatar syakimchik avatar vyakimchik avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

documentreader-ios's Issues

Main Thread Checker: UI API called on a background thread

Here is the log when I tried to run DocReader.
Main Thread Checker: UI API called on a background thread: -[UIView frame]
PID: 10542, TID: 2927437, Thread name: (none), Queue name: com.regula.recognizesample.scanphotoqueue, QoS: 9
Backtrace:
4 DocumentReader 0x0000000104f71688 _T014DocumentReader0aB20CameraViewControllerC8cropRectSC6CGRectVvg + 488
5 DocumentReader 0x0000000104f7c94c _T014DocumentReader0aB20CameraViewControllerCAA05ImagebC10DataSourceA2aDP9imageRectSC6CGRectVAA0fB0_p0iB0_tFTW + 28
6 DocumentReader 0x0000000104fcadac _T014DocumentReader05ImageB0PAAE6paramsSSSC6CGSizeV9imageSize_tFAA06CameracB0C_Tg5Tf4xn_n + 3572
7 DocumentReader 0x0000000104f703c0 _T014DocumentReader011CameraImageB0C5startySo7UIImageC5image_yAA0aB7ResultsCSg_AA0aB12ProcessStateOtc7handlertFTf4ggn_n + 92
8 DocumentReader 0x0000000104f6fbd4 _T014DocumentReader011CameraImageB0CAA0dB0A2aDP5startySo7UIImageC5image_yAA0aB7ResultsCSg_AA0aB12ProcessStateOtc7handlertFTW + 28
9 DocumentReader 0x0000000104f7ba2c T014DocumentReader0aB20CameraViewControllerC13captureOutputySo09AVCaptureG0C_So14CMSampleBufferC03didG0So0H10ConnectionC4fromtFyycfU0_yycfU_yycfU_yycfU + 184
10 DocumentReader 0x0000000104fda4b0 _T0Ig_IyB_TR + 36
11 libdispatch.dylib 0x000000010b32d28c _dispatch_client_callout + 16
12 libdispatch.dylib 0x000000010b33abc8 _dispatch_queue_barrier_sync_invoke_and_complete + 120
13 DocumentReader 0x0000000104f7b94c T014DocumentReader0aB20CameraViewControllerC13captureOutputySo09AVCaptureG0C_So14CMSampleBufferC03didG0So0H10ConnectionC4fromtFyycfU0_yycfU_yycfU + 260
14 DocumentReader 0x0000000104f74888 _T0Ieg_IeyB_TR + 36
15 libdispatch.dylib 0x000000010b32d2cc _dispatch_call_block_and_release + 24
16 libdispatch.dylib 0x000000010b32d28c _dispatch_client_callout + 16
17 libdispatch.dylib 0x000000010b3393dc _dispatch_queue_override_invoke + 984
18 libdispatch.dylib 0x000000010b33e9d0 _dispatch_root_queue_drain + 624
19 libdispatch.dylib 0x000000010b33e6f4 _dispatch_worker_thread3 + 136
20 libsystem_pthread.dylib 0x0000000183a8306c _pthread_wqthread + 1268
21 libsystem_pthread.dylib 0x0000000183a82b6c start_wqthread + 4

I'm using Xcode 9.4.1, Swift 4.2, pod 1.5.3, DocumentReader (3.4.83817)

My implementation is quite simple:

// Init
self.docReader = DocReader()
self.view.showLoadingIndicator(loadingText: "Initializing...")
self.docReader.initilizeReader(license: licenseData) { (isCompleted, string) in }

// Show scanner
DispatchQueue.main.async {
self.docReader.showScanner(self) { (action, result, error) in
//...
}
}

Please assist a good way to fix this issue.
Thanks

Symbol not found

I am trying to use DocumentReaderBeta with Xcode 10 beta 6 and getting following error when I run my application:

dyld: Symbol not found: _$S8Dispatch0A3QoSV0B6SClassO7defaultyA2EmFWC
  Referenced from: /Users/olcayertas/Library/Developer/CoreSimulator/Devices/1D17ED31-93E8-4D85-8B21-54532526A5A3/data/Containers/Bundle/Application/6A5A34AB-59C2-4B25-B367-8D250A38C8C8/GozenPassNew.app/Frameworks/DocumentReader.framework/DocumentReader
  Expected in: /Users/olcayertas/Library/Developer/CoreSimulator/Devices/1D17ED31-93E8-4D85-8B21-54532526A5A3/data/Containers/Bundle/Application/6A5A34AB-59C2-4B25-B367-8D250A38C8C8/GozenPassNew.app/Frameworks/libswiftDispatch.dylib
 in /Users/olcayertas/Library/Developer/CoreSimulator/Devices/1D17ED31-93E8-4D85-8B21-54532526A5A3/data/Containers/Bundle/Application/6A5A34AB-59C2-4B25-B367-8D250A38C8C8/GozenPassNew.app/Frameworks/DocumentReader.framework/DocumentReader

recognizeImage problem

Добрый день. Пытаюсь использовать вот этот метод. Захватываю изображение с камеры и передаю в ваш ридер

- (void)recognizeImage:(UIImage * _Nonnull)image
            cameraMode:(BOOL)cameraMode
            completion:(RGLDocumentReaderCompletion _Nonnull)completion;

Если поставить cameraMode - true. То результат очень долго не приходит и в итоге приходит всегда пустой

[GroupedAttributes(type: ".rawImage", items: [Cleverbase.Attribute(name: "Documentbeeld [0]", value: Optional(""), lcid: nil, valid: nil, source: Optional(__C.RGLResultType), image: Optional(<UIImage:0x283850000 anonymous {1080, 1920}>), equality: true, rfidStatus: nil, checkResult: nil)], comparisonLHS: nil, comparisonRHS: nil)]

Если использовать вот этот метод

- (void)recognizeImage:(UIImage * _Nonnull)image
            completion:(RGLDocumentReaderCompletion _Nonnull)completion;

результат возвращается без проблем на каждый фрейм с камеры. Но не понятно на сколько он лучше или хуже может быть чем с cameraMode: true.

App crashing on initializeReader(config: Config(license: license), completion: completion)

Hi,
App is crashing on "initializeReader(config: Config(license: license), completion: completion)" after I updated the db.dat file in iOS

giving this log:
malloc: can't allocate region
:*** mach_vm_map(size=8223735808, flags: 100) failed (error code=3)
malloc: *** set a breakpoint in malloc_error_break to debug
libc++abi.dylib: terminating with uncaught exception of type std::bad_alloc: std::bad_alloc
terminating with uncaught exception of type std::bad_alloc: std::bad_alloc

What can be the possible cause?

DocumentReader was compiled on Swift3.1

I 'm using documentreader sdk on my project
My project was developed swift3.0
Today i updated xcode to 9.0
Then i got compile error
"import DocumentReader" DocumentReader was compiled on swift3.1, so not compatible on swift3.2
Can you update sdk on xcode9.0?
Thanks

Capture button doesn't apper

Although I set it to show capture button it doesn't shown immediately:
DocReader.shared.functionality.showCaptureButton = true
It apperaers after 10 seconds.

Field ".ft_Nationality" is not recognized for the second and subsequent scans

In the latest Document Reader version

pod 'DocumentReader', '3.4.83817'
pod 'DocumentReaderMRZ', '3.4.83817'

the second and subsequent recognitions of the ".ft_Nationality" field returns an error (after recreation of DocReader) when scanning the Russian foreign passport.

Sample code below. The second run of "runDocReader()" gives an "error" for status and "notVerified" for validity property

fileprivate func runDocReader() {
        guard let licenseData = readLicense() else {
            return
        }
        let docReader = DocReader()
        docReader.processParams.scenario = "Mrz"
        docReader.initilizeReader(license: licenseData) { [weak self] (successfull, error) in
            if successfull {
                NSLog("initialized")
                self?.processSampleImage(docReader: docReader)
            } else {
                NSLog("initialization failed with error: \(String(describing: error))")
            }
        }
    }
    
    fileprivate func processSampleImage(docReader: DocReader) {
        let image = UIImage(named: "any_passport.jpg")!
        docReader.recognizeImage(image) { (action, result, error) in
            switch action {
            case .complete:
                if let result = result {
                    if let nationality = result.getTextFieldByType(fieldType: .ft_Nationality) {
                        if let value = nationality.value?.value {
                            NSLog("1. nationality scan value: \(value)")
                        } else if let singleValue = nationality.values.first {
                            NSLog("""
                                2. nationality scan text field:
                                status: \(nationality.status.rawValue)
                                value: \(singleValue.value)
                                validity: \(singleValue.validity.rawValue)
                                """)
                        }
                    }
                }
            default:
                break
            }
        }
    }

Rollback to the previous version
pod 'DocumentReader', '3.3.1'
solves the problem

[BR] DocumentReaderFullRFID pod conflict with onnxruntime-objc pod

Bug Description

I have downloaded a sample application and added another pod onnxruntime-objc from ONNXRuntime in podfile and run the application. After that, I added object detection functionality using onnxruntime pod methods but got EXC_BAD_ACCESS error. For testing purposes I removed the DocumentReaderFullRFID pod then It was working fine. So I believe DocumentReaderFullRFID and onnxruntime-objc pods are conflicting with each other.

Steps To Reproduce

  1. Download the project from this link(https://drive.google.com/file/d/1kBLsTZrBdUw9NyYHMHKM4-COM7RrjBwp/view?usp=share_link)
  2. Install pod
  3. Add regula license
  4. After running the application, Click on the ORT button it will show EXC_BAD_ACCESS error

Expected behavior

Let me know which version of onnxruntime you are using in DocumentReaderFullRFID, So I can use the same version and maybe an issue will be resolved.
I want to use the ONNXRuntime library anyhow because I want to process images as well as Document scans.

Screenshots

Screenshot 2023-04-05 at 11 32 01 AM

Environment:

  • Device: iPhone 8
  • OS version: 16.3.1
  • Xcode 14.2

Let me know if any queries

Thanks!

[BR] TMS-90809: Deprecated API Usage - New apps that use UIWebView are no longer accepted.

Before Submitting, be sure to

  • Update to the latest stable version.
  • Read and follow the guides described in the documentation.
  • Try to reproduce in our demo project.
  • Search for your issue in the existing GitHub issues.

Bug Description
TMS-90809: Deprecated API Usage - New apps that use UIWebView are no longer accepted. Instead, use WKWebView for improved security and reliability. Learn more (https://developer.apple.com/documentation/uikit/uiwebview).

when we execute grep -r "UIWebView" . we get the match from the pod
image

Steps To Reproduce

Expected behavior

Screenshots

Environment:

  • Device:
  • OS version:

Additional context

Есть ли либа упакованная в xcframework?

Добрый день!
Есть ли DocumentReader упакованный в xcframework?
Нужна поддержка реальных девайсов, симулятора и чтобы все это работало на Apple M1

На текущий момент сборка на девайсе собирается и работает, на симуляторе ошибка (ноут на m1, на ноуте на Интере проблем нет):
building for iOS Simulator, but linking in dylib built for iOS, file '/Carthage/Build/iOS/DocumentReader.framework/DocumentReader' for architecture arm64

App metadata rejected from app store because of NFC usage while we use just MRZ scanner...

I wrote stack overflow question too https://stackoverflow.com/questions/65983205/app-metadata-rejected-because-of-core-nfc-but-it-is-not-used-anywhere-in-app-cod
I believe there is issue with your library because NFC support eve thou we don't use it in our application. Apple detect it somehow and wants explanation from us to make video, it's even not possible to respond them by text. We don't have clue what to do an wrote to your support person because we already paid for this library and we need to release our app ASAP !!!

Build error on case sensitive apfs volume

There's a typo in the RGLCustomization.h header file which breaks the build on macOS systems where the root volume is case sensitive.

#import <UIKit/UIkit.h>

The UIkit.h should be UIKit.h

Please fix this typo if possible.

New beta version for Swift 5.1

Is there a beta version for Swift 5.1? I am testing SwiftUI in my current project and DocumentReader must be compiled with Swift 5.1.

dyld: Library not loaded: App Crash

I just downloaded demo project and pod installed.

This is pod file content.

platform :ios, '9.0'

target 'DocumentReaderFullSwift-sample' do
use_frameworks!
pod 'DocumentReader', '4.2.1514'
end

When app launch, app crashing with this error log.

dyld: Library not loaded: @rpath/DocumentReaderCore.framework/DocumentReaderCore
Referenced from: /private/var/containers/Bundle/Application/E7F47BA9-4084-4673-A637-7E14C8BD63C8/DocumentReaderFullSwift-sample.app/Frameworks/DocumentReader.framework/DocumentReader
Reason: image not found

[FR] Add SPM support

Since SPM has now been around for quite a while, adding SPM support is clearly the way Apple is going with dependencies. Are there plans allow to use Regula with the native package manager for iOS?

Crash after scan document: EXC_BAD_ACCESS

Application crashing after scanning a document with following stact trace:

objc_release 0x00000001af12c140
__50-[RGLDocumentReaderCameraViewController scanImage]_block_invoke_11 0x0000000100d61a94
_dispatch_call_block_and_release 0x00000001af0b6610
_dispatch_client_callout 0x00000001af0b7184
_dispatch_main_queue_callback_4CF$VARIANT$armv81 0x00000001af09a34c
__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ 0x00000001af3685e4
__CFRunLoopRun 0x00000001af3635d8
CFRunLoopRunSpecific 0x00000001af362adc
GSEventRunModal 0x00000001b92e8328
UIApplicationMain 0x00000001b345dae0
main main.swift:8
start 0x00000001af1ec360

Error:
Exception: EXC_BAD_ACCESS (code=1, address=0x4a7aa6c20)

get SOD data from NFC

Hello. I need to get SOD data to validate Country Signing Certificate. But I can't get SODs data from your library.
This is value of SOD filed after reading NFC

▿ Attribute
  - name : "EF.SOD"
  - value : nil
  - lcid : nil
  - valid : nil
  - source : nil
  - image : nil
  - equality : true
  ▿ rfidStatus : Optional<RGLRFIDErrorCodes>
    ▿ some : RGLRFIDErrorCodes
      - rawValue : 1
  - checkResult : nil

DocumentReaderGraphicResult doesn't return an image for a .gf_Portrait path.

Test your demo project and my own with ur SDK and didn't get a portrait image, at the same time it works well in ur app from App Store. Every time I get a nil value.
Try to get the portrait image in that way:
if let portraitImage = result.getGraphicFieldImageByType(fieldType: .gf_Portrait) { self.portraitImage = portraitImage }

the same try with a document image and everything is fine:
if let documentImage = result.getGraphicFieldImageByType(fieldType: .gf_DocumentImage) { self.portraitImage = documentImage }

How can I handle this issue?
best regards

App crash with OCR mode selected

Hi, our application is crashing when OCR scenario selected with the latest SDK:

  • DocumentReader (5.1.1194)
  • DocumentReaderFull (5.1.2749)

Here is the call stack:

Thread 9 Queue : com.regula.recognizesample.scanphotoqueue (serial)
#0	0x0000000198052d88 in __pthread_kill ()
#1	0x0000000197f6f74c in pthread_kill$VARIANT$armv81 ()
#2	0x0000000197ebe934 in abort ()
#3	0x0000000198026cc0 in abort_message ()
#4	0x0000000198018df8 in demangling_terminate_handler() ()
#5	0x0000000197f7fe90 in _objc_terminate() ()
#6	0x000000019802614c in std::__terminate(void (*)()) ()
#7	0x00000001980260e4 in std::terminate() ()
#8	0x0000000197f7fe04 in objc_terminate ()
#9	0x0000000109c1b744 in _dispatch_client_callout ()
#10	0x0000000109c2a944 in _dispatch_sync_invoke_and_complete_recurse ()
#11	0x0000000109c2a25c in _dispatch_sync_f_slow ()
#12	0x00000001039f73d4 in -[RGLDocumentReaderCameraViewController scanImage] at /Users/administratorregula/regula/DocumentReaderAPI_Git/DocumentReader/Controllers/RGLDocumentReaderCameraViewController.m:2521
#13	0x00000001039f8d04 in __50-[RGLDocumentReaderCameraViewController scanImage]_block_invoke_12 at /Users/administratorregula/regula/DocumentReaderAPI_Git/DocumentReader/Controllers/RGLDocumentReaderCameraViewController.m:2616
#14	0x0000000109c1a338 in _dispatch_call_block_and_release ()
#15	0x0000000109c1b730 in _dispatch_client_callout ()
#16	0x0000000109c1de88 in _dispatch_queue_override_invoke ()
#17	0x0000000109c2cd74 in _dispatch_root_queue_drain ()
#18	0x0000000109c2d698 in _dispatch_worker_thread2 ()
#19	0x0000000197f74b38 in _pthread_wqthread ()

This is the error message:

libc++abi.dylib: terminating with uncaught exception of type std::__1::regex_error: One of *?+{ was not preceded by a valid regular expression.

MRZ and MRZ or OCR scenarios are working fine.

TourchButton not hiding

after update pods. Installing DocumentReader 5.7.2075 (was 5.5.1910)
DocReader.shared.functionality.showTorchButton = false - stop working. button always visible

SDK crashing in ios 12.0, iPhone Xs Max

Error: runtime: UI API called from background thread: -[UIApplication applicationState] must be used from main thread only

It happened immediately when the scanner detects the document. in iOS 11 and all, its working fine

How can I create an Instance of RGLDocumentReaderResults with dictionary.

Hi @syakimchik @DmitrySmolyakov @ikliashchou
I am using this wonderful library for document scanning purpose. I am stuck at a place actually I want to stub the RGLDocumentReaderResults class with a predefined set of hard code information. This all I want to do is to write the Unit Test cases :)

I tried to explore that class and found two methods (instance and class) which accept a dictionary. But I am not sure how to build that dictionary so that I could stub it.

Can you please guide me in creating the stub?

Thanks

Trial license

Hi.
Web portal for trial license doesn't work.
Buttons don't work there.
Can you please check it?
Thanks.

objective-c version

Hi @DmitrySmolyakov

Do you have a pure objective-c version of the SDK and if not, could you release one? I note you have objective-c samples but these are in effect using swift framework. We're looking for pure objective-c. Any chance this could be offered?

Thanks

prepareDatabase crash in 5.0.531

Hello,

The code that has been working before started crashing after update to 5.0.531.

Pods and their current versions:

DocumentReader - 5.0.531
DocumentReaderOCR - 5.0.1109

Crashing code:

documentReader.prepareDatabase(databaseID: "Full") { _, error in
            completion(error)
}

Error:

PassportScan_xcworkspace

Console output:

DocumentReader was compiled with optimization - stepping may behave oddly; variables may not be available.

Optimization is turned off for debug configuration. App is launched on simulator.

License step 2 fails: invalid date

When I call initilizeReader method, I can get this error log.

Initialization...
License step 2 fails: invalid date
ERROR

And when I call prepareCameraViewController methods, returned vc value is nil.

this problem is for license?
If I get new extended license file, this problem will be fixed?

Looking forward to see your reply.
Regards.

version 4.2 not working with XCode 11

I just downloaded XCode 11 and tried to compile my project which has DocumentReader Version 4.2 and got a compiled error: Module compiled with Swift 5.0 cannot be imported by the Swift 5.1 compiler: /Pods/DocumentReader/DocumentReader.framework/Modules/DocumentReader.swiftmodule/arm64.swiftmodule

Will you provide a version which compiled with XCode 11 soon?

Auto update and initialization problems

We are using auto update with the latest pod version of the SDK:

docReader.runAutoUpdate(databaseID: "Full", progressHandler: { progress in
    let percent = progress.completedUnitCount * 100 / progress.totalUnitCount
    HUD.show(.label("Updating database: % \(percent)"))
}, completion: { [weak self] (success, error) in
    HUD.hide()
    if success {
        self?.initDocumentReader()
    } else {
        print(error ?? "")
    }
})

Update finishes with succes but we are not able get database. Here our init code:

extension DocReader {

    func initializeReader(_ completion: @escaping DocumentReaderInitializationCompletion) {
        guard let licensePath = Bundle.main.path(forResource: "regula", ofType: "license") else {
            print("Failed to get license path")
            completion(false, "Failed to get license path")
            return
        }
        guard let databasePath = Bundle.main.path(forResource: "db", ofType: "dat") else {
            print("PassengerView : failed to get database path")
            completion(false, "Failed to get database path")
            return
        }
        do {
            let licenseData = try Data(contentsOf: URL(fileURLWithPath: licensePath))
            initializeReader(license: licenseData, databasePath: databasePath) { [completion] (successful, error) in
                completion(true, nil)
            }
        } catch let error {
            completion(false, error.localizedDescription)
            print("Failed to get license data!")
        }
    }
}

I we use Bundle.main.path(forResource: "regula.license", ofType: nil) as decribed in documents instead of Bundle.main.path(forResource: "regula", ofType: "license") it failes while getting the licence path. We both have tried Bundle.main.path(forResource: "db", ofType: "dat") and Bundle.main.path(forResource: "db.dat", ofType: nil) but both failes. We are only able to initialize reader without using databasePath:

extension DocReader {

    func initializeReader(_ completion: @escaping DocumentReaderInitializationCompletion) {
        guard let licensePath = Bundle.main.path(forResource: "regula", ofType: "license") else {
            print("Failed to get license path")
            completion(false, "Failed to get license path")
            return
        }
        do {
            let licenseData = try Data(contentsOf: URL(fileURLWithPath: licensePath))
            initializeReader(license: licenseData) { [completion] (successful, error) in
                completion(true, nil)
            }
        } catch let error {
            completion(false, error.localizedDescription)
            print("Failed to get license data!")
        }
    }
}

but after succesful auto update and document reader initialization when we restart application auto update gives this error:
Error during fetching database url from Core
But if we ignore this error and try to initialize document reader it works.

We have two targets for our application and only difference is their bundle identifiers. The target for test environment has test suffix:

  • Prod environment bundle identifier: com.company.app
  • Test environment bundle identifier: com.company.app.test

The last working combination of auto update and initialize working for Prod but in test we only get one scenario available: Capture

Can you help us?

Customization scan view

Hi,

I need to customization the scan view texts like "searching for a document..." to translate to another languages.

is it posible?

Initialization error: db.dat is absent

Hi @DmitrySmolyakov ,
I downloaded and added the db.dat to the Xcode project by "Add Files To project" option.

On successfully running the application, when i click the option, "DefaultModeViewController", Initialization process starts by downloading the database. But at last it is showing db.dat is absent.

Kindly help me on running the sample successfully.

Thanks.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.