#! /usr/bin/python3 -s

# The MIT License (MIT)
#
# Copyright (c) 2019 Caian Benedicto <caian@ggaunicamp.com>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to
# deal in the Software without restriction, including without limitation the
# rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
# IN THE SOFTWARE.

import sys, os, base64

_examples = {
    'getting-started': {
        'main.cpp': 'LyoKICogVGhlIE1JVCBMaWNlbnNlIChNSVQpCiAqCiAqIENvcHlyaWdodCAoYykgMjAxNiBDYWlhbiBCZW5lZGljdG8gPGNhaWFuQGdnYXVuaWNhbXAuY29tPgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IAogKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gCiAqIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIAogKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCAKICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIAogKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogKiAKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gCiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgogKiAKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgCiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCAKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgCiAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIAogKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyAKICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyAKICogSU4gVEhFIFNPRlRXQVJFLgogKi8KCgovLyBUaGlzIGRlZmluZSBlbmFibGVzIHRoZSBDKysgd3JhcHBpbmcgY29kZSBhcm91bmQgdGhlIEMgQVBJLCBpdCBtdXN0IGJlIHVzZWQKLy8gb25seSBvbmNlIHBlciBDKysgbW9kdWxlLgojZGVmaW5lIFNQSVRaX0VOVFJZX1BPSU5UCgovLyBTcGl0eiBzZXJpYWwgZGVidWcgZW5hYmxlcyBhIFNwaXR6LWNvbXBsaWFudCBtYWluIGZ1bmN0aW9uIHRvIGFsbG93IAovLyB0aGUgbW9kdWxlIHRvIHJ1biBhcyBhbiBleGVjdXRhYmxlIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgovLyAjZGVmaW5lIFNQSVRaX1NFUklBTF9ERUJVRwoKI2luY2x1ZGUgPHNwaXR6L3NwaXR6LmhwcD4KCiNpbmNsdWRlIDxpb3N0cmVhbT4KCi8vIFRoaXMgY2xhc3MgY3JlYXRlcyB0YXNrcy4KY2xhc3Mgam9iX21hbmFnZXIgOiBwdWJsaWMgc3BpdHo6OmpvYl9tYW5hZ2VyCnsKcHVibGljOgogICAgam9iX21hbmFnZXIoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSwgc3BpdHo6OmlzdHJlYW0mIGpvYmluZm8pCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJbSk1dIEpvYiBtYW5hZ2VyIGNyZWF0ZWQuIiA8PCBzdGQ6OmVuZGw7CiAgICB9CiAgICAKICAgIGJvb2wgbmV4dF90YXNrKGNvbnN0IHNwaXR6OjpwdXNoZXImIHRhc2spCiAgICB7CiAgICAgICAgc3BpdHo6Om9zdHJlYW0gbzsKICAgICAgICAgICAgICAgIAogICAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgdGFzayBpbnRvIGEgYmluYXJ5IHN0cmVhbQogICAgICAgIC8vIC4uLgoKICAgICAgICBzdGQ6OmNvdXQgPDwgIltKTV0gVGFzayBnZW5lcmF0ZWQuIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgCiAgICAgICAgLy8gU2VuZCB0aGUgdGFzayB0byB0aGUgU3BpdHogcnVudGltZQogICAgICAgIHRhc2sucHVzaChvKTsKICAgICAgICAKICAgICAgICAvLyBSZXR1cm4gdHJ1ZSB1bnRpbCBmaW5pc2hlZCBjcmVhdGluZyB0YXNrcwoKICAgICAgICBzdGQ6OmNvdXQgPDwgIltKTV0gVGhlIG1vZHVsZSB3aWxsIHJ1biBmb3JldmVyIHVudGlsICIKICAgICAgICAgICAgInlvdSBhZGQgYSByZXR1cm4gZmFsc2UhIiA8PCBzdGQ6OmVuZGw7CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgCiAgICB+am9iX21hbmFnZXIoKQogICAgewogICAgfQp9OwoKLy8gVGhpcyBjbGFzcyBleGVjdXRlcyB0YXNrcywgcHJlZmVyYWJseSB3aXRob3V0IG1vZGlmeWluZyBpdHMgaW50ZXJuYWwgc3RhdGUKLy8gYmVjYXVzZSB0aGlzIGNhbiBsZWFkIHRvIGEgYnJlYWsgb2YgaWRlbXBvdGVuY2UgYmV0d2VlbiB0YXNrcy4gVGhlICdydW4nCi8vIG1ldGhvZCB3aWxsIG5vdCBpbXBvc2UgYSAnY29uc3QnIGJlaGF2aW9yIHRvIGFsbG93IGxpYnJhcmllcyB0aGF0IHJlbHkgCi8vIG9uIGNoYW5naW5nIGl0cyBpbnRlcm5hbCBzdGF0ZSwgZm9yIGluc3RhbmNlLCBPcGVuQ0wgKHNlZSBjbHBpIGV4YW1wbGUpLgpjbGFzcyB3b3JrZXIgOiBwdWJsaWMgc3BpdHo6Ondvcmtlcgp7ICAgIApwdWJsaWM6CiAgICB3b3JrZXIoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIltXS10gV29ya2VyIGNyZWF0ZWQuIiA8PCBzdGQ6OmVuZGw7CiAgICB9CiAgICAKICAgIGludCBydW4oc3BpdHo6OmlzdHJlYW0mIHRhc2ssIGNvbnN0IHNwaXR6OjpwdXNoZXImIHJlc3VsdCkKICAgIHsKICAgICAgICAvLyBCaW5hcnkgc3RyZWFtIHVzZWQgdG8gc3RvcmUgdGhlIG91dHB1dAogICAgICAgIHNwaXR6Ojpvc3RyZWFtIG87CiAgICAgICAgCiAgICAgICAgLy8gRGVzZXJpYWxpemUgdGhlIHRhc2ssIHByb2Nlc3MgaXQgYW5kIHNlcmlhbGl6ZSB0aGUgcmVzdWx0CiAgICAgICAgLy8gLi4uCiAgICAgICAgCiAgICAgICAgLy8gU2VuZCB0aGUgcmVzdWx0IHRvIHRoZSBTcGl0eiBydW50aW1lCiAgICAgICAgcmVzdWx0LnB1c2gobyk7CiAgICAgICAgCiAgICAgICAgc3RkOjpjb3V0IDw8ICJbV0tdIFRhc2sgcHJvY2Vzc2VkLiIgPDwgc3RkOjplbmRsOwoKICAgICAgICByZXR1cm4gMDsKICAgIH0KfTsKCi8vIFRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIG1lcmdpbmcgdGhlIHJlc3VsdCBvZiBlYWNoIGluZGl2aWR1YWwgdGFzayAKLy8gYW5kLCBpZiBuZWNlc3NhcnksIHRvIHByb2R1Y2UgdGhlIGZpbmFsIHJlc3VsdCBhZnRlciBhbGwgb2YgdGhlIHRhc2sgCi8vIHJlc3VsdHMgaGF2ZSBiZWVuIHJlY2VpdmVkLgpjbGFzcyBjb21taXR0ZXIgOiBwdWJsaWMgc3BpdHo6OmNvbW1pdHRlcgp7CnB1YmxpYzoKICAgIGNvbW1pdHRlcihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdLCBzcGl0ejo6aXN0cmVhbSYgam9iaW5mbykKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIltDT10gQ29tbWl0dGVyIGNyZWF0ZWQuIiA8PCBzdGQ6OmVuZGw7CiAgICB9CiAgICAKICAgIGludCBjb21taXRfdGFzayhzcGl0ejo6aXN0cmVhbSYgcmVzdWx0KQogICAgewogICAgICAgIC8vIERlc2VyaWFsaXplIHRoZSByZXN1bHQgZnJvbSB0aGUgdGFzayBhbmQgdXNlIGl0IAogICAgICAgIC8vIHRvIGNvbXBvc2UgdGhlIGZpbmFsIHJlc3VsdAogICAgICAgIC8vIC4uLgoKICAgICAgICBzdGQ6OmNvdXQgPDwgIltDT10gUmVzdWx0IGNvbW1pdHRlZC4iIDw8IHN0ZDo6ZW5kbDsKCiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICAKICAgIC8vIE9wdGlvbmFsLiBJZiB0aGUgcmVzdWx0IGRlcGVuZHMgb24gcmVjZWl2aW5nIGFsbCBvZiB0aGUgdGFzayAKICAgIC8vIHJlc3VsdHMsIG9yIGlmIHRoZSBmaW5hbCByZXN1bHQgbXVzdCBiZSBzZXJpYWxpemVkIHRvIHRoZSAKICAgIC8vIFNwaXR6IE1haW4sIHRoZW4gYW4gYWRkaXRpb25hbCBDb21taXQgSm9iIGlzIGNhbGxlZC4KCiAgICAvLyBpbnQgY29tbWl0X2pvYihjb25zdCBzcGl0ejo6cHVzaGVyJiBmaW5hbF9yZXN1bHQpIAogICAgLy8gewogICAgLy8gICAgIC8vIFByb2Nlc3MgdGhlIGZpbmFsIHJlc3VsdAogICAgLy8KICAgIC8vICAgICAvLyBBIHJlc3VsdCBtdXN0IGJlIHB1c2hlZCBldmVuIGlmIHRoZSBmaW5hbCAKICAgIC8vICAgICAvLyByZXN1bHQgaXMgbm90IHBhc3NlZCBvbgogICAgLy8gICAgIGZpbmFsX3Jlc3VsdC5wdXNoKE5VTEwsIDApOwogICAgLy8gICAgIHJldHVybiAwOwogICAgLy8gfQoKICAgIH5jb21taXR0ZXIoKQogICAgewogICAgICAgIAogICAgfQp9OwoKLy8gVGhlIGZhY3RvcnkgYmluZHMgdGhlIHVzZXIgY29kZSB3aXRoIHRoZSBTcGl0eiBDKysgd3JhcHBlciBjb2RlLgpjbGFzcyBmYWN0b3J5IDogcHVibGljIHNwaXR6OjpmYWN0b3J5CnsKcHVibGljOgogICAgc3BpdHo6OmpvYl9tYW5hZ2VyICpjcmVhdGVfam9iX21hbmFnZXIoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSwKICAgICAgICBzcGl0ejo6aXN0cmVhbSYgam9iaW5mbykKICAgIHsKICAgICAgICByZXR1cm4gbmV3IGpvYl9tYW5hZ2VyKGFyZ2MsIGFyZ3YsIGpvYmluZm8pOwogICAgfQogICAgCiAgICBzcGl0ejo6d29ya2VyICpjcmVhdGVfd29ya2VyKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyB3b3JrZXIoYXJnYywgYXJndik7CiAgICB9CiAgICAKICAgIHNwaXR6Ojpjb21taXR0ZXIgKmNyZWF0ZV9jb21taXR0ZXIoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSwgCiAgICAgICAgc3BpdHo6OmlzdHJlYW0mIGpvYmluZm8pCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBjb21taXR0ZXIoYXJnYywgYXJndiwgam9iaW5mbyk7CiAgICB9Cn07CgovLyBDcmVhdGVzIGEgZmFjdG9yeSBjbGFzcy4Kc3BpdHo6OmZhY3RvcnkgKnNwaXR6X2ZhY3RvcnkgPSBuZXcgZmFjdG9yeSgpOwo=',
        'README' : 'VGhpcyBleGFtcGxlIHNob3dzIHRoZSBtaW5pbXVtIGFtb3VudCBvZiBjb2RlIHJlcXVpcmVkIHRvIGNyZWF0ZSBhIFNwaXR6LWNvbXBsaWFudCBtb2R1bGUgaW4gQysrLiAKCkEgbW9kdWxlIGNvbnRhaW5zIGEgSm9iIE1hbmFnZXIsIHJlc3BvbnNpYmxlIGZvciBwcm9kdWNpbmcgaWRlbXBvdGVudCB0YXNrcywgdGhhdCB3aWxsIGJlIHNlbnQgdG8gV29ya2VycyB3aXRob3V0IGFueSBjb21wcm9taXNlIHdpdGggb3JkZXIgYW5kIHdoaWNoIHJlc3VsdHMgd2lsbCwgdGhlbiwgYmUgc2VudCB0byBhIENvbW1pdHRlciwgcmVzcG9uc2libGUgZm9yIGNvbXBvc2luZyB0aGUgZmluYWwgcmVzdWx0IGZyb20gdGhlIHJlY2VpdmVkIHRhc2tzLgoKQWRkaXRpb25hbGx5LCBpZiBhIG1vZHVsZSBkZXBlbmRzIG9uIHRoZSBleGVjdXRpb24gb2YgbXVsdGlwbGUgam9icywgaXQgY2FuIGRlZmluZSBhIFNwaXR6IE1haW4gcmVwb25zaWJsZSBmb3IgY29vcmRpbmF0aW5nIHRoZSBleGVjdXRpb24gb2YgdGhlIGpvYnMuCgpJZiB5b3UgcnVuIHRoaXMgZXhhbXBsZSwgaXQgd2lsbCBub3QgZmluaXNoIHVudGlsIHByb3Blcmx5IG1vZGlmeSB0aGUgYm9pbGVycGxhdGUgdG8gc3RvcCBnZW5lcmF0aW5nIHRhc2tzLgo=',
        'LICENSE' : 'VGhlIE1JVCBMaWNlbnNlIChNSVQpCgpDb3B5cmlnaHQgKGMpIDIwMTYgQ2FpYW4gQmVuZWRpY3RvIDxjYWlhbkBnZ2F1bmljYW1wLmNvbT4KQ29weXJpZ2h0IChjKSAyMDE0IElhbiBMaXUgUm9kcmlndWVzIDxpYW4ubGl1QGdnYXVuaWNhbXAuY29tPgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCg=='
    },
    'spitz-pi': {
        'main.cpp': 'LyoKICogVGhlIE1JVCBMaWNlbnNlIChNSVQpCiAqCiAqIENvcHlyaWdodCAoYykgMjAxNiBDYWlhbiBCZW5lZGljdG8gPGNhaWFuQGdnYXVuaWNhbXAuY29tPgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0bwogKiBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZQogKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAogKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCiAqCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAogKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgogKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORwogKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCiAqIElOIFRIRSBTT0ZUV0FSRS4KICovCgoKLy8gVGhpcyBkZWZpbmUgZW5hYmxlcyB0aGUgQysrIHdyYXBwaW5nIGNvZGUgYXJvdW5kIHRoZSBDIEFQSSwgaXQgbXVzdCBiZSB1c2VkCi8vIG9ubHkgb25jZSBwZXIgQysrIG1vZHVsZS4KI2RlZmluZSBTUElUWl9FTlRSWV9QT0lOVAoKLy8gU3BpdHogc2VyaWFsIGRlYnVnIGVuYWJsZXMgYSBTcGl0ei1jb21wbGlhbnQgbWFpbiBmdW5jdGlvbiB0byBhbGxvdwovLyB0aGUgbW9kdWxlIHRvIHJ1biBhcyBhbiBleGVjdXRhYmxlIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgovLyAjZGVmaW5lIFNQSVRaX1NFUklBTF9ERUJVRwoKI2luY2x1ZGUgPHNwaXR6L3NwaXR6LmhwcD4KCiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGxpbWl0cz4KCi8vIFBhcmFtZXRlcnMgc2hvdWxkIG5vdCBiZSBzdG9yZWQgaW5zaWRlIGdsb2JhbCB2YXJpYWJsZXMgYmVjYXVzZSB0aGUKLy8gU3BpdHogaW50ZXJmYWNlIGRvZXMgbm90IGd1YXJhbnRlZSBtZW1vcnkgaXNvbGF0aW9uIGJldHdlZW4gam9iCi8vIG1hbmFnZXIsIGNvbW1pdHRlciBhbmQgd29ya2Vycy4gVGhpcyBjYW4gbGVhZCB0byBhIHJhY2UgY29uZGl0aW9uIHdoZW4KLy8gZWFjaCB0aHJlYWQgdHJpZXMgdG8gaW5pdGlhbGl6ZSB0aGUgcGFyYW1ldGVycyBmcm9tIGFyZ2MgYW5kIGFyZ3YuCnN0cnVjdCBwYXJhbWV0ZXJzCnsKICAgIHN0ZDo6c3RyaW5nIHdobzsKCiAgICBpbnQgbjsKICAgIGRvdWJsZSBzdGVwOwoKICAgIGludCBzcGxpdDsKCiAgICBwYXJhbWV0ZXJzKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10sIGNvbnN0IHN0ZDo6c3RyaW5nJiB3aG8gPSAiIikgOgogICAgICAgIHNwbGl0KDEwMDApLCB3aG8od2hvKQogICAgewogICAgICAgIGlmIChhcmdjIDwgMiB8fCBhcmdjID4gMykgewogICAgICAgICAgICBzdGQ6OmNlcnIgPDwgIlVTQUdFOiAiIDw8IGFyZ3ZbMF0gPDwgIiBOIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgfQoKICAgICAgICBuID0gYXRvaShhcmd2WzFdKTsKICAgICAgICBzdGVwID0gMS4wIC8gKGRvdWJsZSluOwogICAgfQoKICAgIHZvaWQgcHJpbnQoKQogICAgewogICAgICAgIHN0ZDo6Y291dAogICAgICAgICAgICA8PCB3aG8gPDwgIk46ICIgPDwgbiA8PCBzdGQ6OmVuZGwKICAgICAgICAgICAgPDwgd2hvIDw8ICJzdGVwOiAiIDw8IHN0ZXAgPDwgc3RkOjplbmRsOwogICAgfQp9OwoKLy8gVGhpcyBjbGFzcyBjcmVhdGVzIHRhc2tzLgpjbGFzcyBqb2JfbWFuYWdlciA6IHB1YmxpYyBzcGl0ejo6am9iX21hbmFnZXIKewpwcml2YXRlOgogICAgcGFyYW1ldGVycyBwOwogICAgaW50IGk7CgpwdWJsaWM6CiAgICBqb2JfbWFuYWdlcihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdLCBzcGl0ejo6aXN0cmVhbSYgam9iaW5mbykgOgogICAgICAgIHAoYXJnYywgYXJndiwgIltKTV0gIiksIGkoMCkKICAgIHsKICAgICAgICBwLnByaW50KCk7CgogICAgICAgIHN0ZDo6Y291dCA8PCAiW0pNXSBKb2IgbWFuYWdlciBjcmVhdGVkLiIgPDwgc3RkOjplbmRsOwogICAgfQoKICAgIGJvb2wgbmV4dF90YXNrKGNvbnN0IHNwaXR6OjpwdXNoZXImIHRhc2spCiAgICB7CiAgICAgICAgc3BpdHo6Om9zdHJlYW0gbzsKCiAgICAgICAgaWYgKGkgPj0gcC5uKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgIC8vIFB1c2ggdGhlIGN1cnJlbnQgc3RlcAogICAgICAgIG8gPDwgaTsKCiAgICAgICAgLy8gSW5jcmVtZW50IHRoZSBzdGVwIGJ5IHRoZSBhbW91bnQgdG8gYmUgcGFja2VkIGZvciBlYWNoIHdvcmtlcgogICAgICAgIGkgKz0gcC5zcGxpdDsKCiAgICAgICAgc3RkOjpjb3V0IDw8ICJbSk1dIEdlbmVyYXRlZCB0YXNrIGZvciBpID0gIiA8PCBpIDw8ICIuIiA8PCBzdGQ6OmVuZGw7CgogICAgICAgIC8vIFNlcmlhbGl6ZSBhbmQgcHVzaCB0aGUgdGFzawogICAgICAgIHRhc2sucHVzaChvKTsKCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgfmpvYl9tYW5hZ2VyKCkKICAgIHsKICAgIH0KfTsKCi8vIFRoaXMgY2xhc3MgZXhlY3V0ZXMgdGFza3MsIHByZWZlcmFibHkgd2l0aG91dCBtb2RpZnlpbmcgaXRzIGludGVybmFsIHN0YXRlCi8vIGJlY2F1c2UgdGhpcyBjYW4gbGVhZCB0byBhIGJyZWFrIG9mIGlkZW1wb3RlbmNlIGJldHdlZW4gdGFza3MuIFRoZSAncnVuJwovLyBtZXRob2Qgd2lsbCBub3QgaW1wb3NlIGEgJ2NvbnN0JyBiZWhhdmlvciB0byBhbGxvdyBsaWJyYXJpZXMgdGhhdCByZWx5Ci8vIG9uIGNoYW5naW5nIGl0cyBpbnRlcm5hbCBzdGF0ZSwgZm9yIGluc3RhbmNlLCBPcGVuQ0wgKHNlZSBjbHBpIGV4YW1wbGUpLgpjbGFzcyB3b3JrZXIgOiBwdWJsaWMgc3BpdHo6Ondvcmtlcgp7CnByaXZhdGU6CiAgICBwYXJhbWV0ZXJzIHA7CgpwdWJsaWM6CiAgICB3b3JrZXIoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkgOiBwKGFyZ2MsIGFyZ3YsICJbV0tdICIpCiAgICB7CiAgICAgICAgcC5wcmludCgpOwogICAgICAgIHN0ZDo6Y291dCA8PCAiW1dLXSBXb3JrZXIgY3JlYXRlZC4iIDw8IHN0ZDo6ZW5kbDsKICAgIH0KCiAgICBpbnQgcnVuKHNwaXR6Ojppc3RyZWFtJiB0YXNrLCBjb25zdCBzcGl0ejo6cHVzaGVyJiByZXN1bHQpCiAgICB7CiAgICAgICAgLy8gRGF0YSBzdHJlYW0gdXNlZCB0byBzdG9yZSB0aGUgb3V0cHV0CiAgICAgICAgc3BpdHo6Om9zdHJlYW0gbzsKCiAgICAgICAgLy8gUmVhZCB0aGUgY3VycmVudCBzdGVwIGZyb20gdGhlIHRhc2sKICAgICAgICBpbnQgaSwgYmF0Y2g7CiAgICAgICAgdGFzayA+PiBpOwogICAgICAgIGJhdGNoID0gaTsKCiAgICAgICAgLy8gR2V0IHRoZSBudW1iZXIgb2Ygc3RlcHMgdG8gY29tcHV0ZQogICAgICAgIGludCBuID0gc3RkOjptaW48aW50PihwLm4sIGkgKyBwLnNwbGl0KTsKCiAgICAgICAgLy8gQ29tcHV0ZSBlYWNoIHRlcm0gb2YgdGhlIHBpIGV4cGFuc2lvbgogICAgICAgIGZvciAoIDsgaSA8IG47IGkrKykgewogICAgICAgICAgICBkb3VibGUgeCA9IChzdGF0aWNfY2FzdDxkb3VibGU+KGkpICsgMC41KSAqIHAuc3RlcDsKICAgICAgICAgICAgeCA9IDQuMCAvICgxLjAgKyB4ICogeCk7CiAgICAgICAgICAgIC8vIEFkZCB0aGUgdGVybSB0byB0aGUgZGF0YSBzdHJlYW0KICAgICAgICAgICAgbyA8PCB4OwogICAgICAgIH0KCiAgICAgICAgLy8gU2VuZCB0aGUgcmVzdWx0IHRvIHRoZSBTcGl0eiBydW50aW1lCiAgICAgICAgcmVzdWx0LnB1c2gobyk7CgogICAgICAgIHN0ZDo6Y291dCA8PCAiW1dLXSBQcm9jZXNzZWQgYmF0Y2ggIiA8PCBiYXRjaCA8PCAiLiIgPDwgc3RkOjplbmRsOwogICAgICAgIHJldHVybiAwOwogICAgfQp9OwoKLy8gVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgbWVyZ2luZyB0aGUgcmVzdWx0IG9mIGVhY2ggaW5kaXZpZHVhbCB0YXNrCi8vIGFuZCwgaWYgbmVjZXNzYXJ5LCB0byBwcm9kdWNlIHRoZSBmaW5hbCByZXN1bHQgYWZ0ZXIgYWxsIG9mIHRoZSB0YXNrCi8vIHJlc3VsdHMgaGF2ZSBiZWVuIHJlY2VpdmVkLgpjbGFzcyBjb21taXR0ZXIgOiBwdWJsaWMgc3BpdHo6OmNvbW1pdHRlcgp7CnByaXZhdGU6CiAgICBwYXJhbWV0ZXJzIHA7CiAgICBkb3VibGUgcGl2YWw7CgpwdWJsaWM6CiAgICBjb21taXR0ZXIoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSwgc3BpdHo6OmlzdHJlYW0mIGpvYmluZm8pIDoKICAgICAgICBwKGFyZ2MsIGFyZ3YsICJbQ09dICIpLCBwaXZhbCgwLjApCiAgICB7CiAgICAgICAgcC5wcmludCgpOwogICAgICAgIHN0ZDo6Y291dCA8PCAiW0NPXSBDb21taXR0ZXIgY3JlYXRlZC4iIDw8IHN0ZDo6ZW5kbDsKICAgIH0KCiAgICBpbnQgY29tbWl0X3Rhc2soc3BpdHo6OmlzdHJlYW0mIHJlc3VsdCkKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIltDT10gQ29tbWl0dGluZyByZXN1bHQuLi4iIDw8IHN0ZDo6ZW5kbDsKCiAgICAgICAgLy8gQWNjdW11bGF0ZSBlYWNoIHRlcm0gb2YgdGhlIGV4cGFuc2lvbgogICAgICAgIHdoaWxlKHJlc3VsdC5oYXNfZGF0YSgpKSB7CiAgICAgICAgICAgIGRvdWJsZSBkOwogICAgICAgICAgICByZXN1bHQgPj4gZDsKICAgICAgICAgICAgcGl2YWwgKz0gZDsKICAgICAgICB9CgogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGludCBjb21taXRfam9iKGNvbnN0IHNwaXR6OjpwdXNoZXImIGZpbmFsX3Jlc3VsdCkKICAgIHsKICAgICAgICAvLyBNdWx0aXBseSB0aGUgc3VtIG9mIHRlcm1zIGJ5IHRoZSBzdGVwIHRvIGdldCB0aGUKICAgICAgICAvLyBmaW5hbCByZXN1bHQgb2YgcGkgYW5kIHByaW50IGl0IHdpdGggdGhlIG1heGltdW0KICAgICAgICAvLyBwcmVjaXNpb24gcG9zc2libGUKICAgICAgICBwaXZhbCA9IHBpdmFsICogcC5zdGVwOwogICAgICAgIHN0ZDo6Y291dC5wcmVjaXNpb24oMTcpOwogICAgICAgIHN0ZDo6Y291dCA8PCAiW0NPXSBUaGUgdmFsdWUgb2YgcGkgaXM6ICIgPDwgc3RkOjpmaXhlZAogICAgICAgICAgICA8PCBwaXZhbCA8PCBzdGQ6OmVuZGw7CgogICAgICAgIC8vIEEgcmVzdWx0IG11c3QgYmUgcHVzaGVkIGV2ZW4gaWYgaXQgaXMgYW4gZW1wdHkgb25lCiAgICAgICAgZmluYWxfcmVzdWx0LnB1c2goTlVMTCwgMCk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgfmNvbW1pdHRlcigpCiAgICB7CgogICAgfQp9OwoKLy8gVGhlIGZhY3RvcnkgYmluZHMgdGhlIHVzZXIgY29kZSB3aXRoIHRoZSBTcGl0eiBDKysgd3JhcHBlciBjb2RlLgpjbGFzcyBmYWN0b3J5IDogcHVibGljIHNwaXR6OjpmYWN0b3J5CnsKcHVibGljOgogICAgc3BpdHo6OmpvYl9tYW5hZ2VyICpjcmVhdGVfam9iX21hbmFnZXIoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSwKICAgICAgICBzcGl0ejo6aXN0cmVhbSYgam9iaW5mbykKICAgIHsKICAgICAgICByZXR1cm4gbmV3IGpvYl9tYW5hZ2VyKGFyZ2MsIGFyZ3YsIGpvYmluZm8pOwogICAgfQoKICAgIHNwaXR6Ojp3b3JrZXIgKmNyZWF0ZV93b3JrZXIoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkKICAgIHsKICAgICAgICByZXR1cm4gbmV3IHdvcmtlcihhcmdjLCBhcmd2KTsKICAgIH0KCiAgICBzcGl0ejo6Y29tbWl0dGVyICpjcmVhdGVfY29tbWl0dGVyKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10sCiAgICAgICAgc3BpdHo6OmlzdHJlYW0mIGpvYmluZm8pCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBjb21taXR0ZXIoYXJnYywgYXJndiwgam9iaW5mbyk7CiAgICB9Cn07CgovLyBDcmVhdGVzIGEgZmFjdG9yeSBjbGFzcy4Kc3BpdHo6OmZhY3RvcnkgKnNwaXR6X2ZhY3RvcnkgPSBuZXcgZmFjdG9yeSgpOwo=',
        'README' : 'VGhpcyBpcyBhIHF1aWNrIGV4YW1wbGUgdG8gc2hvdyBob3cgdG8gY29tcHV0ZSB0aGUgdmFsdWUgb2YgcGkgaW4gcGFyYWxsZWwgdXNpbmcgdGhlIFNwaXR6IEFQSSBhbmQgcHJvZ3JhbW1pbmcgbW9kZWwuCgo=',
        'LICENSE' : 'VGhlIE1JVCBMaWNlbnNlIChNSVQpCgpDb3B5cmlnaHQgKGMpIDIwMTYgQ2FpYW4gQmVuZWRpY3RvIDxjYWlhbkBnZ2F1bmljYW1wLmNvbT4KQ29weXJpZ2h0IChjKSAyMDE0IElhbiBMaXUgUm9kcmlndWVzIDxpYW4ubGl1QGdnYXVuaWNhbXAuY29tPgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCg=='
    },
    'spitz-pi-2': {
        'main.cpp': 'LyoKICogVGhlIE1JVCBMaWNlbnNlIChNSVQpCiAqCiAqIENvcHlyaWdodCAoYykgMjAxNiBDYWlhbiBCZW5lZGljdG8gPGNhaWFuQGdnYXVuaWNhbXAuY29tPgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0bwogKiBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZQogKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAogKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCiAqCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAogKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgogKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORwogKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCiAqIElOIFRIRSBTT0ZUV0FSRS4KICovCgoKLy8gVGhpcyBkZWZpbmUgZW5hYmxlcyB0aGUgQysrIHdyYXBwaW5nIGNvZGUgYXJvdW5kIHRoZSBDIEFQSSwgaXQgbXVzdCBiZSB1c2VkCi8vIG9ubHkgb25jZSBwZXIgQysrIG1vZHVsZS4KI2RlZmluZSBTUElUWl9FTlRSWV9QT0lOVAoKLy8gU3BpdHogc2VyaWFsIGRlYnVnIGVuYWJsZXMgYSBTcGl0ei1jb21wbGlhbnQgbWFpbiBmdW5jdGlvbiB0byBhbGxvdwovLyB0aGUgbW9kdWxlIHRvIHJ1biBhcyBhbiBleGVjdXRhYmxlIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgovLyAjZGVmaW5lIFNQSVRaX1NFUklBTF9ERUJVRwoKI2luY2x1ZGUgPHNwaXR6L3NwaXR6LmhwcD4KCiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHNzdHJlYW0+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxsaW1pdHM+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxjbWF0aD4KCi8vIFBhcmFtZXRlcnMgc2hvdWxkIG5vdCBiZSBzdG9yZWQgaW5zaWRlIGdsb2JhbCB2YXJpYWJsZXMgYmVjYXVzZSB0aGUKLy8gU3BpdHogaW50ZXJmYWNlIGRvZXMgbm90IGd1YXJhbnRlZSBtZW1vcnkgaXNvbGF0aW9uIGJldHdlZW4gam9iCi8vIG1hbmFnZXIsIGNvbW1pdHRlciBhbmQgd29ya2Vycy4gVGhpcyBjYW4gbGVhZCB0byBhIHJhY2UgY29uZGl0aW9uIHdoZW4KLy8gZWFjaCB0aHJlYWQgdHJpZXMgdG8gaW5pdGlhbGl6ZSB0aGUgcGFyYW1ldGVycyBmcm9tIGFyZ2MgYW5kIGFyZ3YuCnN0cnVjdCBwYXJhbWV0ZXJzCnsKICAgIHN0ZDo6c3RyaW5nIHdobzsKCiAgICBpbnQgbjsKICAgIGRvdWJsZSBzdGVwOwoKICAgIGludCBzcGxpdDsKCiAgICBwYXJhbWV0ZXJzKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10sIGNvbnN0IHN0ZDo6c3RyaW5nJiB3aG8gPSAiIikgOgogICAgICAgIHNwbGl0KDEwMDApLCB3aG8od2hvKQogICAgewogICAgICAgIGlmIChhcmdjIDwgMiB8fCBhcmdjID4gMykgewogICAgICAgICAgICBzdGQ6OmNlcnIgPDwgIlVTQUdFOiAiIDw8IGFyZ3ZbMF0gPDwgIiBOIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgfQoKICAgICAgICBuID0gYXRvaShhcmd2WzFdKTsKICAgICAgICBzdGVwID0gMS4wIC8gKGRvdWJsZSluOwogICAgfQoKICAgIHZvaWQgcHJpbnQoKQogICAgewogICAgICAgIHN0ZDo6Y291dAogICAgICAgICAgICA8PCB3aG8gPDwgIk46ICIgPDwgbiA8PCBzdGQ6OmVuZGwKICAgICAgICAgICAgPDwgd2hvIDw8ICJzdGVwOiAiIDw8IHN0ZXAgPDwgc3RkOjplbmRsOwogICAgfQp9OwoKLy8gVGhpcyBjbGFzcyBjb29yZGluYXRlcyB0aGUgZXhlY3V0aW9uIG9mIGpvYnMKY2xhc3Mgc3BpdHpfbWFpbiA6IHB1YmxpYyBzcGl0ejo6c3BpdHpfbWFpbgp7CnB1YmxpYzoKICAgIGludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyKiBhcmd2W10sIGNvbnN0IHNwaXR6OjpydW5uZXImIHJ1bm5lcikKICAgIHsKICAgICAgICBwYXJhbWV0ZXJzIHAoYXJnYywgYXJndiwgIltTTV0gIik7CgogICAgICAgIHNwaXR6Ojppc3RyZWFtIGZpbmFsX3Jlc3VsdDsKICAgICAgICBkb3VibGUgcGlfMSwgcGlfMiwgcGlfZXJyOwogICAgICAgIGludCByOwoKICAgICAgICAvLyBMZXQncyBkbyB0d28gc3RlcHM6IENvbXB1dGUgcGkgd2l0aCB0aGUgcHJvdmlkZWQgbnVtYmVyIG9mCiAgICAgICAgLy8gaXRlcmFjdGlvbnMgYW5kIHRoZW4gaGFsdmluZyB0aGUgbnVtYmVyIG9mIGl0ZXJhY3Rpb25zCgogICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwogICAgICAgIHN0ZDo6c3RyaW5nIG4xOwogICAgICAgIHN0ZDo6c3RyaW5nIG4yOwoKICAgICAgICBzcyA8PCBwLm47CiAgICAgICAgbjEgPSBzcy5zdHIoKTsKCiAgICAgICAgc3Muc3RyKCIiKTsKICAgICAgICBzcyA8PCBwLm4gLyAyOwogICAgICAgIG4yID0gc3Muc3RyKCk7CgogICAgICAgIGNvbnN0IGNoYXIqIGFyZ3YxW10gPSB7IGFyZ3ZbMF0sIG4xLmNfc3RyKCkgfTsKICAgICAgICBjb25zdCBjaGFyKiBhcmd2MltdID0geyBhcmd2WzBdLCBuMi5jX3N0cigpIH07CgogICAgICAgIC8vIFJ1biB0aGUgZmlyc3Qgam9iIGFuZCBjaGVjayB0aGUgcmV0dXJuCiAgICAgICAgc3RkOjpjb3V0IDw8ICJbU01dIEV4ZWN1dGluZyBmaXJzdCBqb2IuLi4iIDw8IHN0ZDo6ZW5kbDsKCiAgICAgICAgciA9IHJ1bm5lci5ydW4oMiwgYXJndjEsIGZpbmFsX3Jlc3VsdCk7CiAgICAgICAgaWYgKHIgIT0gMCkgewogICAgICAgICAgICBzdGQ6OmNlcnIgPDwgIltTTV0gVGhlIGV4ZWN1dGlvbiBvZiB0aGUgZmlyc3Qgam9iICIKICAgICAgICAgICAgICAgICJmYWlsZWQgd2l0aCBjb2RlICIgPDwgciA8PCAiISIgPDwgc3RkOjplbmRsOwogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KCiAgICAgICAgLy8gV2Uga25vdyB0aGUgcGFzc2VkIGRhdGEgaXMgYSBkb3VibGUsCiAgICAgICAgLy8gY29sbGVjdCB0aGUgZmlyc3QgdmFsdWUgb2YgcGkKICAgICAgICBmaW5hbF9yZXN1bHQgPj4gcGlfMTsKCiAgICAgICAgLy8gUnVuIHRoZSBzZWNvbmQgam9iIGFuZCBjaGVjayB0aGUgcmV0dXJuCiAgICAgICAgc3RkOjpjb3V0IDw8ICJbU01dIEV4ZWN1dGluZyBzZWNvbmQgam9iLi4uIiA8PCBzdGQ6OmVuZGw7CgogICAgICAgIHIgPSBydW5uZXIucnVuKDIsIGFyZ3YyLCBmaW5hbF9yZXN1bHQpOwogICAgICAgIGlmIChyICE9IDApIHsKICAgICAgICAgICAgc3RkOjpjZXJyIDw8ICJbU01dIFRoZSBleGVjdXRpb24gb2YgdGhlIHNlY29uZCBqb2IgIgogICAgICAgICAgICAgICAgImZhaWxlZCB3aXRoIGNvZGUgIiA8PCByIDw8ICIhIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgfQoKICAgICAgICAvLyBXZSBrbm93IHRoZSBwYXNzZWQgZGF0YSBpcyBhIGRvdWJsZSwKICAgICAgICAvLyBjb2xsZWN0IHRoZSBzZWNvbmQgdmFsdWUgb2YgcGkKICAgICAgICBmaW5hbF9yZXN1bHQgPj4gcGlfMjsKCiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBlcnJvciBhbmQgcHJpbnQgdGhlIG91dHB1dAogICAgICAgIHBpX2VyciA9IHN0ZDo6YWJzKHBpXzIgLSBwaV8xKTsKCiAgICAgICAgc3RkOjpjb3V0LnByZWNpc2lvbigxNyk7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJbU01dIEZpcnN0IHBpIHZhbHVlIGlzOiAiIDw8IHN0ZDo6Zml4ZWQKICAgICAgICAgICAgPDwgcGlfMSA8PCBzdGQ6OmVuZGwKICAgICAgICAgICAgPDwgIltTTV0gU2Vjb25kIHBpIHZhbHVlIGlzOiAiIDw8IHN0ZDo6Zml4ZWQKICAgICAgICAgICAgPDwgcGlfMiA8PCBzdGQ6OmVuZGwKICAgICAgICAgICAgPDwgIltTTV0gVGhlIGVycm9yIGlzOiAiIDw8IHN0ZDo6Zml4ZWQKICAgICAgICAgICAgPDwgcGlfZXJyIDw8IHN0ZDo6ZW5kbDsKCiAgICAgICAgcmV0dXJuIDA7CiAgICB9Cn07CgovLyBUaGlzIGNsYXNzIGNyZWF0ZXMgdGFza3MuCmNsYXNzIGpvYl9tYW5hZ2VyIDogcHVibGljIHNwaXR6Ojpqb2JfbWFuYWdlcgp7CnByaXZhdGU6CiAgICBwYXJhbWV0ZXJzIHA7CiAgICBpbnQgaTsKCnB1YmxpYzoKICAgIGpvYl9tYW5hZ2VyKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10sIHNwaXR6Ojppc3RyZWFtJiBqb2JpbmZvKSA6CiAgICAgICAgcChhcmdjLCBhcmd2LCAiW0pNXSAiKSwgaSgwKQogICAgewogICAgICAgIHAucHJpbnQoKTsKCiAgICAgICAgc3RkOjpjb3V0IDw8ICJbSk1dIEpvYiBtYW5hZ2VyIGNyZWF0ZWQuIiA8PCBzdGQ6OmVuZGw7CiAgICB9CgogICAgYm9vbCBuZXh0X3Rhc2soY29uc3Qgc3BpdHo6OnB1c2hlciYgdGFzaykKICAgIHsKICAgICAgICBzcGl0ejo6b3N0cmVhbSBvOwoKICAgICAgICBpZiAoaSA+PSBwLm4pCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgICAgLy8gUHVzaCB0aGUgY3VycmVudCBzdGVwCiAgICAgICAgbyA8PCBpOwoKICAgICAgICBzdGQ6OmNvdXQgPDwgIltKTV0gR2VuZXJhdGVkIHRhc2sgZm9yIGkgPSAiIDw8IGkgPDwgIi4iIDw8IHN0ZDo6ZW5kbDsKCiAgICAgICAgLy8gSW5jcmVtZW50IHRoZSBzdGVwIGJ5IHRoZSBhbW91bnQgdG8gYmUgcGFja2VkIGZvciBlYWNoIHdvcmtlcgogICAgICAgIGkgKz0gcC5zcGxpdDsKCiAgICAgICAgLy8gU2VyaWFsaXplIGFuZCBwdXNoIHRoZSB0YXNrCiAgICAgICAgdGFzay5wdXNoKG8pOwoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICB+am9iX21hbmFnZXIoKQogICAgewogICAgfQp9OwoKLy8gVGhpcyBjbGFzcyBleGVjdXRlcyB0YXNrcywgcHJlZmVyYWJseSB3aXRob3V0IG1vZGlmeWluZyBpdHMgaW50ZXJuYWwgc3RhdGUKLy8gYmVjYXVzZSB0aGlzIGNhbiBsZWFkIHRvIGEgYnJlYWsgb2YgaWRlbXBvdGVuY2UgYmV0d2VlbiB0YXNrcy4gVGhlICdydW4nCi8vIG1ldGhvZCB3aWxsIG5vdCBpbXBvc2UgYSAnY29uc3QnIGJlaGF2aW9yIHRvIGFsbG93IGxpYnJhcmllcyB0aGF0IHJlbHkKLy8gb24gY2hhbmdpbmcgaXRzIGludGVybmFsIHN0YXRlLCBmb3IgaW5zdGFuY2UsIE9wZW5DTCAoc2VlIGNscGkgZXhhbXBsZSkuCmNsYXNzIHdvcmtlciA6IHB1YmxpYyBzcGl0ejo6d29ya2VyCnsKcHJpdmF0ZToKICAgIHBhcmFtZXRlcnMgcDsKCnB1YmxpYzoKICAgIHdvcmtlcihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKSA6IHAoYXJnYywgYXJndiwgIltXS10gIikKICAgIHsKICAgICAgICBwLnByaW50KCk7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJbV0tdIFdvcmtlciBjcmVhdGVkLiIgPDwgc3RkOjplbmRsOwogICAgfQoKICAgIGludCBydW4oc3BpdHo6OmlzdHJlYW0mIHRhc2ssIGNvbnN0IHNwaXR6OjpwdXNoZXImIHJlc3VsdCkKICAgIHsKICAgICAgICAvLyBEYXRhIHN0cmVhbSB1c2VkIHRvIHN0b3JlIHRoZSBvdXRwdXQKICAgICAgICBzcGl0ejo6b3N0cmVhbSBvOwoKICAgICAgICAvLyBSZWFkIHRoZSBjdXJyZW50IHN0ZXAgZnJvbSB0aGUgdGFzawogICAgICAgIGludCBpLCBiYXRjaDsKICAgICAgICB0YXNrID4+IGk7CiAgICAgICAgYmF0Y2ggPSBpOwoKICAgICAgICAvLyBHZXQgdGhlIG51bWJlciBvZiBzdGVwcyB0byBjb21wdXRlCiAgICAgICAgaW50IG4gPSBzdGQ6Om1pbjxpbnQ+KHAubiwgaSArIHAuc3BsaXQpOwoKICAgICAgICAvLyBDb21wdXRlIGVhY2ggdGVybSBvZiB0aGUgcGkgZXhwYW5zaW9uCiAgICAgICAgZm9yICggOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICAgIGRvdWJsZSB4ID0gKHN0YXRpY19jYXN0PGRvdWJsZT4oaSkgKyAwLjUpICogcC5zdGVwOwogICAgICAgICAgICB4ID0gNC4wIC8gKDEuMCArIHggKiB4KTsKICAgICAgICAgICAgLy8gQWRkIHRoZSB0ZXJtIHRvIHRoZSBkYXRhIHN0cmVhbQogICAgICAgICAgICBvIDw8IHg7CiAgICAgICAgfQoKICAgICAgICAvLyBTZW5kIHRoZSByZXN1bHQgdG8gdGhlIFNwaXR6IHJ1bnRpbWUKICAgICAgICByZXN1bHQucHVzaChvKTsKCiAgICAgICAgc3RkOjpjb3V0IDw8ICJbV0tdIFByb2Nlc3NlZCBiYXRjaCAiIDw8IGJhdGNoIDw8ICIuIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9Cn07CgovLyBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBtZXJnaW5nIHRoZSByZXN1bHQgb2YgZWFjaCBpbmRpdmlkdWFsIHRhc2sKLy8gYW5kLCBpZiBuZWNlc3NhcnksIHRvIHByb2R1Y2UgdGhlIGZpbmFsIHJlc3VsdCBhZnRlciBhbGwgb2YgdGhlIHRhc2sKLy8gcmVzdWx0cyBoYXZlIGJlZW4gcmVjZWl2ZWQuCmNsYXNzIGNvbW1pdHRlciA6IHB1YmxpYyBzcGl0ejo6Y29tbWl0dGVyCnsKcHJpdmF0ZToKICAgIHBhcmFtZXRlcnMgcDsKICAgIGRvdWJsZSBwaXZhbDsKCnB1YmxpYzoKICAgIGNvbW1pdHRlcihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdLCBzcGl0ejo6aXN0cmVhbSYgam9iaW5mbykgOgogICAgICAgIHAoYXJnYywgYXJndiwgIltDT10gIiksIHBpdmFsKDAuMCkKICAgIHsKICAgICAgICBwLnByaW50KCk7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJbQ09dIENvbW1pdHRlciBjcmVhdGVkLiIgPDwgc3RkOjplbmRsOwogICAgfQoKICAgIGludCBjb21taXRfdGFzayhzcGl0ejo6aXN0cmVhbSYgcmVzdWx0KQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiW0NPXSBDb21taXR0aW5nIHJlc3VsdC4uLiIgPDwgc3RkOjplbmRsOwoKICAgICAgICAvLyBBY2N1bXVsYXRlIGVhY2ggdGVybSBvZiB0aGUgZXhwYW5zaW9uCiAgICAgICAgd2hpbGUocmVzdWx0Lmhhc19kYXRhKCkpIHsKICAgICAgICAgICAgZG91YmxlIGQ7CiAgICAgICAgICAgIHJlc3VsdCA+PiBkOwogICAgICAgICAgICBwaXZhbCArPSBkOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgaW50IGNvbW1pdF9qb2IoY29uc3Qgc3BpdHo6OnB1c2hlciYgZmluYWxfcmVzdWx0KQogICAgewogICAgICAgIC8vIE91ciByZXN1bHQgc3RyZWFtCiAgICAgICAgc3BpdHo6Om9zdHJlYW0gbzsKCiAgICAgICAgLy8gTXVsdGlwbHkgdGhlIHN1bSBvZiB0ZXJtcyBieSB0aGUgc3RlcCB0byBnZXQgdGhlCiAgICAgICAgLy8gZmluYWwgcmVzdWx0IG9mIHBpIGFuZCBwcmludCBpdCB3aXRoIHRoZSBtYXhpbXVtCiAgICAgICAgLy8gcHJlY2lzaW9uIHBvc3NpYmxlCiAgICAgICAgcGl2YWwgPSBwaXZhbCAqIHAuc3RlcDsKCiAgICAgICAgLy8gUHVzaCB0aGUgcmVzdWx0CiAgICAgICAgbyA8PCBwaXZhbDsKICAgICAgICBmaW5hbF9yZXN1bHQucHVzaChvKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICB+Y29tbWl0dGVyKCkKICAgIHsKCiAgICB9Cn07CgovLyBUaGUgZmFjdG9yeSBiaW5kcyB0aGUgdXNlciBjb2RlIHdpdGggdGhlIFNwaXR6IEMrKyB3cmFwcGVyIGNvZGUuCmNsYXNzIGZhY3RvcnkgOiBwdWJsaWMgc3BpdHo6OmZhY3RvcnkKewpwdWJsaWM6CiAgICBzcGl0ejo6c3BpdHpfbWFpbiAqY3JlYXRlX3NwaXR6X21haW4oKQogICAgewogICAgICAgIHJldHVybiBuZXcgc3BpdHpfbWFpbigpOwogICAgfQoKICAgIHNwaXR6Ojpqb2JfbWFuYWdlciAqY3JlYXRlX2pvYl9tYW5hZ2VyKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10sCiAgICAgICAgc3BpdHo6OmlzdHJlYW0mIGpvYmluZm8pCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBqb2JfbWFuYWdlcihhcmdjLCBhcmd2LCBqb2JpbmZvKTsKICAgIH0KCiAgICBzcGl0ejo6d29ya2VyICpjcmVhdGVfd29ya2VyKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyB3b3JrZXIoYXJnYywgYXJndik7CiAgICB9CgogICAgc3BpdHo6OmNvbW1pdHRlciAqY3JlYXRlX2NvbW1pdHRlcihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdLAogICAgICAgIHNwaXR6Ojppc3RyZWFtJiBqb2JpbmZvKQogICAgewogICAgICAgIHJldHVybiBuZXcgY29tbWl0dGVyKGFyZ2MsIGFyZ3YsIGpvYmluZm8pOwogICAgfQp9OwoKLy8gQ3JlYXRlcyBhIGZhY3RvcnkgY2xhc3MuCnNwaXR6OjpmYWN0b3J5ICpzcGl0el9mYWN0b3J5ID0gbmV3IGZhY3RvcnkoKTsK',
        'README' : 'VGhpcyBleGFtcGxlIHNob3dzIGhvdyB0aGUgU3BpdHogcHJvZ3JhbW1pbmcgbW9kZWwgY2FuIGJlIHVzZWQgdG8gY29tcHV0ZSBhIG11bHRpLXN0YWdlZCBqb2IuIFRoZSB2YWx1ZSBvZiBwaSBpcyBjb21wdXRlZCB0d2ljZSB1c2luZyBkaWZmZXJlbnQgbnVtYmVyIGlmIGl0ZXJhY3Rpb25zIGFuZCB0aGUgZXJyb3IgaXMgY29tcGFyZWQuCgo=',
        'LICENSE' : 'VGhlIE1JVCBMaWNlbnNlIChNSVQpCgpDb3B5cmlnaHQgKGMpIDIwMTYgQ2FpYW4gQmVuZWRpY3RvIDxjYWlhbkBnZ2F1bmljYW1wLmNvbT4KQ29weXJpZ2h0IChjKSAyMDE0IElhbiBMaXUgUm9kcmlndWVzIDxpYW4ubGl1QGdnYXVuaWNhbXAuY29tPgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCg=='
    }
}


def render_example(name):
    """"""
    if name not in _examples:
        sys.stderr.write("Error: Unknown example '%s'!\n" % name)
        exit(1)
    destdir = name
    if os.path.exists(destdir):
        sys.stderr.write("Error: The directory '%s' already exists!\n" % destdir)
        exit(1)
    print("Creating '%s'..." % destdir)
    os.makedirs(destdir)
    for filename, blob in sorted(_examples[name].items()):
        filepath = os.path.join(destdir, filename)
        if os.path.exists(filepath):
            sys.stderr.write("Error: The file '%s' already exists!\n" % filepath)
            exit(1)
        print("Creating '%s'..." % filepath)
        fblob = open(filepath, 'wb')
        fblob.write(base64.b64decode(blob))
    print("Done.")


if __name__ == '__main__':
    if len(sys.argv) != 2:
        print('USAGE: spitz-examples example_name')
        print('Available examples:')
        for name in sorted(_examples.keys()):
            print('  %s' % name)
        exit(1)
    render_example(sys.argv[1])
