From kde-pim Thu Jun 19 09:32:15 2008 From: "Dmitry Ivanov" Date: Thu, 19 Jun 2008 09:32:15 +0000 To: kde-pim Subject: Re: [Kde-pim] Akonadi resources and collection IDs Message-Id: <6df8d8b90806190232n4e8e3ca0k28c8e25da853a977 () mail ! gmail ! com> X-MARC-Message: https://marc.info/?l=kde-pim&m=121387526703934 MIME-Version: 1 Content-Type: multipart/mixed; boundary="------=_Part_3427_26758788.1213867935939" ------=_Part_3427_26758788.1213867935939 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline On 6/17/08, Dmitry Ivanov wrote: > Hi there, > > While trying to add a D-Bus interface to the RSS resource I ran into a > problem I'd like to discuss. > > The D-Bus interface has a method to synchronize a feed: > > synchronizeFeed( XmlUrl ) // actually this might another id > > To trigger the collection synchronization the resource should call > > synchronizeCollection( quint64 id ) // id is Akonadi::Collection::Id > > The problem is, given how the resource is implemented now, it doesn't > store IDs for collections. Then the user launches resource configuration > dialog, he can import existing feeds from an OPML file. The resource loads > the feeds, converts them to collections, and then calls > ResourceBase::synchronize(). The current collection tree eventually > reaches Akonadi::CollectionSync which commits the collections to the > database. This way the resource ends up with collections without valid IDs. > > And I bet I'll have to have collection IDs while implementing other > operations in the future. > > The proposed solution is as follows: > > 1. The resource doesn't rely on Akonadi::CollectionSync anymore, it > creates and commits collections itself, receiving IDs from > Akonadi::CollectionCreateJob. > > 2. The clients shouldn't add new feeds via Akonadi::CollectionCreateJob, > instead they use the D-Bus interface. The resource receives XmlUrl, > creates a new collection, and commits it. > > Why add new feeds via the D-Bus interface? Why shouldn't clients create > collections themselves and commit them to Akonadi (via a standard > action)? Because of remoteId. I believe only the resource should assign > remoteId to a newly added feed/collection. remoteId may point to > something in a storage of feeds/items if the resource have such a storage > (like metakit in Akregator), or may point to a feed in online feed reader in > case of a dedicated RSS resource for this online feed reader. > > Although a client can create/commit a collection on its own, then the > resource gets a notification via collectionAdded() and assigns a proper > remoteId. Sounds a bit "kludgy". > > 3. Upon (re)start, the resource reloads the collection tree from Akonadi. > > Any better approaches? Do you foresee any problems with the proposed > solution? > The solution described above works fine (the code is in svn). Another approach would be to retrieve the collection ID on demand (i.e. when synchronizeCollection() is called ) via CollectionFetchJob and save it inside the resource to reuse later. To push changes in collections I can use collectionsRetrievedIncremental(). But it turned out that Akonadi::CollectionSync loses changes made to collections (I tested with collection's name). I've worked up a testcase to show the bug. Steps to reproduce: 1. Start akonadiconsole and add a new RSS resource, then import the attached OPML file (some values are hardcoded to make it easier to trigger the bug). The resource will import the feeds and sync them. Check the collection names in akonadiconsole's browser. The name of the test collection is "OLD NAME" (remoteId="bug"). 2. Fire up qdbusviewer, select org.kde.krss and call triggerBug(). This forces the resource to change the name of the test collection (remoteId="bug") to "NEW NAME" and pass the changed collection to collectionsRetrievedIncremental() ( via a call to synchronizeCollectionTree() ). 3. Check the test collection in akonadiconsole's browser: the name remains the same. The whole code for krss is in the attached tarball (svn repo contains totally different code). I've removed a lot of code not relevant to the testcase. I had a look at Akonadi::CollectionSync. Actually it doesn't commit the changed collections: void CollectionSync::slotLocalListDone(KJob * job) { ..... // added / updated foreach ( const Collection &c, d->remoteCollections ) { if ( c.remoteId().isEmpty() ) { kWarning( 5250 ) << "Collection '" << c.name() <<"' does not have a remote identifier - skipping"; continue; } ^^^ 'c' is the test collection got from collectionsRetrievedIncremental() Collection local = d->localCollections.value( c.remoteId() ); d->unprocessedLocalCollections.remove( local ); ^^^ 'local' is the collection fetched from the database by CollectionSync // missing locally if ( !local.isValid() ) { // determine local parent Collection localParent; if ( c.parent() >= 0 ) localParent = Collection( c.parent() ); if ( c.parentRemoteId().isEmpty() ) localParent = Collection::root(); else localParent = d->localCollections.value( c.parentRemoteId() ); // no local parent found, create later if ( !localParent.isValid() ) { d->orphanRemoteCollections << c; continue; } createLocalCollection( c, localParent ); continue; } // update local collection d->pendingJobs++; CollectionModifyJob *mod = new CollectionModifyJob( local, this ); connect( mod, SIGNAL(result(KJob*)), SLOT(slotLocalChangeDone(KJob*)) ); ^^^ CollectionSync commits the collection it just fetched from the database. Shouldn't it commit collection 'c'? The above logic does look like a bug to me. Dmitry -- A: Because it destroys the flow of the conversation Q: Why is top-posting bad? ------=_Part_3427_26758788.1213867935939 Content-Type: application/x-tar; name=krss.tar Content-Transfer-Encoding: base64 X-Attachment-Id: f_fhn5g7om0 Content-Disposition: attachment; filename=krss.tar a3Jzcy8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA3NTUAMDAwMTc1 MAAwMDAxNzUwADAwMDAwMDAwMDAwADExMDI2NDIzMDA1ADAxMTM3NQAgNQAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHZvbmFtaQAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAdm9uYW1pAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABr cnNzL2xpYmtyc3MvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDc1NQAwMDAxNzUw ADAwMDE3NTAAMDAwMDAwMDAwMDAAMTEwMjY0MjMwMjAAMDEzMDQzACA1AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAdm9uYW1pAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAB2b25hbWkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGty c3MvbGlia3Jzcy9mZWVkcHJvcGVydGllc2NvbGxlY3Rpb25hdHRyaWJ1dGUuY3BwAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwNjQ0ADAwMDE3NTAA MDAwMTc1MAAwMDAwMDAwNjI0MQAxMTAyNTcwMTc3NgAwMjI2MTIAIDAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIAB2b25hbWkAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAHZvbmFtaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyoK ICAgIENvcHlyaWdodCAoQykgMjAwOCAgICBEbWl0cnkgSXZhbm92IDx2b25hbWlAZ21haWwuY29t PgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0 ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUg Rm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5 b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3Ry aWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9V VCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAg TUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2Vl IHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAg ICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0 cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiovCgojaW5jbHVkZSAiZmVlZHByb3BlcnRpZXNj b2xsZWN0aW9uYXR0cmlidXRlLmgiCgpGZWVkUHJvcGVydGllc0NvbGxlY3Rpb25BdHRyaWJ1dGU6 OkZlZWRQcm9wZXJ0aWVzQ29sbGVjdGlvbkF0dHJpYnV0ZSggKQogICAgICAgIDogQWtvbmFkaTo6 QXR0cmlidXRlKCkKewp9CgpRQnl0ZUFycmF5IEZlZWRQcm9wZXJ0aWVzQ29sbGVjdGlvbkF0dHJp YnV0ZTo6dHlwZSgpIGNvbnN0CnsKICAgICAgICByZXR1cm4gIkZlZWRQcm9wZXJ0aWVzIjsKfQoK RmVlZFByb3BlcnRpZXNDb2xsZWN0aW9uQXR0cmlidXRlKiBGZWVkUHJvcGVydGllc0NvbGxlY3Rp b25BdHRyaWJ1dGU6OmNsb25lKCkgY29uc3QKewogICAgICAgIEZlZWRQcm9wZXJ0aWVzQ29sbGVj dGlvbkF0dHJpYnV0ZSAqYXR0ciA9IG5ldyBGZWVkUHJvcGVydGllc0NvbGxlY3Rpb25BdHRyaWJ1 dGUoKTsKICAgICAgICBhdHRyLT5zZXROYW1lKCBtX25hbWUgKTsKICAgICAgICBhdHRyLT5zZXRY bWxVcmwoIG1feG1sVXJsICk7CiAgICAgICAgYXR0ci0+c2V0SHRtbFVybCggbV9odG1sVXJsICk7 CiAgICAgICAgYXR0ci0+c2V0RmVlZFR5cGUoIG1fZmVlZFR5cGUgKTsKICAgICAgICBhdHRyLT5z ZXREZXNjcmlwdGlvbiggbV9kZXNjcmlwdGlvbiApOwogICAgICAgIHJldHVybiBhdHRyOwp9CgpR Qnl0ZUFycmF5IEZlZWRQcm9wZXJ0aWVzQ29sbGVjdGlvbkF0dHJpYnV0ZTo6c2VyaWFsaXplZCgp IGNvbnN0CnsKICAgICAgICBRU3RyaW5nTGlzdCBwcm9wczsKICAgICAgICBwcm9wcyA8PCAiTmFt ZT0iICsgbV9uYW1lOwogICAgICAgIHByb3BzIDw8ICJYbWxVcmw9IiArIG1feG1sVXJsOwogICAg ICAgIHByb3BzIDw8ICJIdG1sVXJsPSIgKyBtX2h0bWxVcmw7CiAgICAgICAgcHJvcHMgPDwgIkZl ZWRUeXBlPSIgKyBtX2ZlZWRUeXBlOwogICAgICAgIHByb3BzIDw8ICJEZXNjcmlwdGlvbj0iICsg bV9kZXNjcmlwdGlvbjsKICAgICAgICByZXR1cm4gcHJvcHMuam9pbiggIjsiICkudG9VdGY4KCk7 Cn0KCnZvaWQgRmVlZFByb3BlcnRpZXNDb2xsZWN0aW9uQXR0cmlidXRlOjpkZXNlcmlhbGl6ZSgg Y29uc3QgUUJ5dGVBcnJheSAmZGF0YSApCnsKICAgICAgICBpZiAoIGRhdGEuaXNFbXB0eSgpICkK ICAgICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgLy8gc28gdWdseSwgYW0gaSBtaXNzaW5n IHNvbWV0aGluZz8KICAgICAgICBRU3RyaW5nTGlzdCBwcm9wcyA9IFFTdHJpbmc6OmZyb21VdGY4 KCBkYXRhLmNvbnN0RGF0YSgpLCBkYXRhLnNpemUoKSApLnNwbGl0KCAnOycgKTsKICAgICAgICBt X25hbWUgPSBwcm9wc1swXS5zcGxpdCggJz0nIClbMV07CiAgICAgICAgbV94bWxVcmwgPSBwcm9w c1sxXS5zcGxpdCggJz0nIClbMV07CiAgICAgICAgbV9odG1sVXJsID0gcHJvcHNbMl0uc3BsaXQo ICc9JyApWzFdOwogICAgICAgIG1fZmVlZFR5cGUgPSBwcm9wc1szXS5zcGxpdCggJz0nIClbMV07 CiAgICAgICAgbV9kZXNjcmlwdGlvbiA9IHByb3BzWzRdLnNwbGl0KCAnPScgKVsxXTsKfQoKUVN0 cmluZyBGZWVkUHJvcGVydGllc0NvbGxlY3Rpb25BdHRyaWJ1dGU6Om5hbWUoKSBjb25zdAp7CiAg ICAgICAgcmV0dXJuIG1fbmFtZTsKfQoKdm9pZCBGZWVkUHJvcGVydGllc0NvbGxlY3Rpb25BdHRy aWJ1dGU6OnNldE5hbWUoIGNvbnN0IFFTdHJpbmcgJm5hbWUgKQp7CiAgICAgICAgbV9uYW1lID0g bmFtZTsKfQoKUVN0cmluZyBGZWVkUHJvcGVydGllc0NvbGxlY3Rpb25BdHRyaWJ1dGU6OnhtbFVy bCgpIGNvbnN0CnsKICAgICAgICByZXR1cm4gbV94bWxVcmw7Cn0KCnZvaWQgRmVlZFByb3BlcnRp ZXNDb2xsZWN0aW9uQXR0cmlidXRlOjpzZXRYbWxVcmwoIGNvbnN0IFFTdHJpbmcgJnhtbFVybCAp CnsKICAgICAgICBtX3htbFVybCA9IHhtbFVybDsKfQoKUVN0cmluZyBGZWVkUHJvcGVydGllc0Nv bGxlY3Rpb25BdHRyaWJ1dGU6Omh0bWxVcmwoKSBjb25zdAp7CiAgICAgICAgcmV0dXJuIG1faHRt bFVybDsKfQoKdm9pZCBGZWVkUHJvcGVydGllc0NvbGxlY3Rpb25BdHRyaWJ1dGU6OnNldEh0bWxV cmwoIGNvbnN0IFFTdHJpbmcgJmh0bWxVcmwgKQp7CiAgICAgICAgbV9odG1sVXJsID0gaHRtbFVy bDsKfQoKUVN0cmluZyBGZWVkUHJvcGVydGllc0NvbGxlY3Rpb25BdHRyaWJ1dGU6OmZlZWRUeXBl KCkgY29uc3QKewogICAgICAgIHJldHVybiBtX2ZlZWRUeXBlOwp9Cgp2b2lkIEZlZWRQcm9wZXJ0 aWVzQ29sbGVjdGlvbkF0dHJpYnV0ZTo6c2V0RmVlZFR5cGUoIGNvbnN0IFFTdHJpbmcgJmZlZWRU eXBlICkKewogICAgICAgIG1fZmVlZFR5cGUgPSBmZWVkVHlwZTsKfQoKUVN0cmluZyBGZWVkUHJv cGVydGllc0NvbGxlY3Rpb25BdHRyaWJ1dGU6OmRlc2NyaXB0aW9uKCkgY29uc3QKewogICAgICAg IHJldHVybiBtX2Rlc2NyaXB0aW9uOwp9Cgp2b2lkIEZlZWRQcm9wZXJ0aWVzQ29sbGVjdGlvbkF0 dHJpYnV0ZTo6c2V0RGVzY3JpcHRpb24oIGNvbnN0IFFTdHJpbmcgJmRlc2NyaXB0aW9uICkKewog ICAgICAgIG1fZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKfQoAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrcnNzL2xpYmty c3Mvc3Vic2NyaXB0aW9ubGFiZWxzY29sbGVjdGlvbmF0dHJpYnV0ZS5jcHAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDY0NAAwMDAxNzUwADAwMDE3NTAA MDAwMDAwMDQ2NTEAMTEwMjU3MDE3NzYAMDIzNTA0ACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAdm9uYW1pAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAB2b25hbWkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8qCiAgICBDb3B5 cmlnaHQgKEMpIDIwMDggICAgRG1pdHJ5IEl2YW5vdiA8dm9uYW1pQGdtYWlsLmNvbT4KCiAgICBU aGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k L29yIG1vZGlmeQogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp b247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgICAoYXQgeW91ciBvcHRp b24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBp biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdB UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5U QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAg IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICAgWW91IHNo b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UKICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cu Z251Lm9yZy9saWNlbnNlcy8+LgoqLwoKI2luY2x1ZGUgInN1YnNjcmlwdGlvbmxhYmVsc2NvbGxl Y3Rpb25hdHRyaWJ1dGUuaCIKClN1YnNjcmlwdGlvbkxhYmVsc0NvbGxlY3Rpb25BdHRyaWJ1dGU6 OlN1YnNjcmlwdGlvbkxhYmVsc0NvbGxlY3Rpb25BdHRyaWJ1dGUoIGNvbnN0IFFTdHJpbmdMaXN0 ICZzdWJzY3JpcHRpb25MYWJlbHMgKQogICAgICAgIDogQXR0cmlidXRlKCksIG1fc3Vic2NyaXB0 aW9uTGFiZWxzKCBzdWJzY3JpcHRpb25MYWJlbHMgKQp7Cn0KClFCeXRlQXJyYXkgU3Vic2NyaXB0 aW9uTGFiZWxzQ29sbGVjdGlvbkF0dHJpYnV0ZTo6dHlwZSgpIGNvbnN0CnsKICAgICAgICByZXR1 cm4gIlN1YnNjcmlwdGlvbkxhYmVscyI7Cn0KClN1YnNjcmlwdGlvbkxhYmVsc0NvbGxlY3Rpb25B dHRyaWJ1dGUqIFN1YnNjcmlwdGlvbkxhYmVsc0NvbGxlY3Rpb25BdHRyaWJ1dGU6OmNsb25lKCkg Y29uc3QKewogICAgICAgIFN1YnNjcmlwdGlvbkxhYmVsc0NvbGxlY3Rpb25BdHRyaWJ1dGUgKmF0 dHIgPSBuZXcgU3Vic2NyaXB0aW9uTGFiZWxzQ29sbGVjdGlvbkF0dHJpYnV0ZSggbV9zdWJzY3Jp cHRpb25MYWJlbHMgKTsKICAgICAgICByZXR1cm4gYXR0cjsKfQoKUUJ5dGVBcnJheSBTdWJzY3Jp cHRpb25MYWJlbHNDb2xsZWN0aW9uQXR0cmlidXRlOjpzZXJpYWxpemVkKCkgY29uc3QKewogICAg ICAgIHJldHVybiBtX3N1YnNjcmlwdGlvbkxhYmVscy5qb2luKCAiOyIgKS50b1V0ZjgoKTsKfQoK dm9pZCBTdWJzY3JpcHRpb25MYWJlbHNDb2xsZWN0aW9uQXR0cmlidXRlOjpkZXNlcmlhbGl6ZSgg Y29uc3QgUUJ5dGVBcnJheSAmZGF0YSApCnsKICAgICAgICBpZiAoIGRhdGEuaXNFbXB0eSgpICkK ICAgICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgLy8gc28gdWdseSwgYW0gaSBtaXNzaW5n IHNvbWV0aGluZz8KICAgICAgICBtX3N1YnNjcmlwdGlvbkxhYmVscyA9IFFTdHJpbmc6OmZyb21V dGY4KCBkYXRhLmNvbnN0RGF0YSgpLCBkYXRhLnNpemUoKSApLnNwbGl0KCAnOycgKTsKfQoKUVN0 cmluZ0xpc3QgU3Vic2NyaXB0aW9uTGFiZWxzQ29sbGVjdGlvbkF0dHJpYnV0ZTo6c3Vic2NyaXB0 aW9uTGFiZWxzKCkgY29uc3QKewogICAgICAgIHJldHVybiBtX3N1YnNjcmlwdGlvbkxhYmVsczsK fQoKdm9pZCBTdWJzY3JpcHRpb25MYWJlbHNDb2xsZWN0aW9uQXR0cmlidXRlOjpzZXRTdWJzY3Jp cHRpb25MYWJlbHMoIGNvbnN0IFFTdHJpbmdMaXN0ICZzdWJzY3JpcHRpb25MYWJlbHMgKQp7CiAg ICAgICAgbV9zdWJzY3JpcHRpb25MYWJlbHMgPSBzdWJzY3JpcHRpb25MYWJlbHM7Cn0KCnZvaWQg U3Vic2NyaXB0aW9uTGFiZWxzQ29sbGVjdGlvbkF0dHJpYnV0ZTo6YWRkU3Vic2NyaXB0aW9uTGFi ZWwoIGNvbnN0IFFTdHJpbmcgJnN1YnNjcmlwdGlvbkxhYmVsICkKewogICAgICAgIGlmICggIW1f c3Vic2NyaXB0aW9uTGFiZWxzLmNvbnRhaW5zKCBzdWJzY3JpcHRpb25MYWJlbCApICkKICAgICAg ICAgICAgICAgIG1fc3Vic2NyaXB0aW9uTGFiZWxzIDw8IHN1YnNjcmlwdGlvbkxhYmVsOwp9Cgp2 b2lkIFN1YnNjcmlwdGlvbkxhYmVsc0NvbGxlY3Rpb25BdHRyaWJ1dGU6OnJlbW92ZVN1YnNjcmlw dGlvbkxhYmVsKCBjb25zdCBRU3RyaW5nICZzdWJzY3JpcHRpb25MYWJlbCApCnsKICAgICAgICAv LyBhZGRTdWJzY3JpcHRpb25MYWJlbCBlbnN1cmUgdGhlIGxpc3QgY29udGFpbnMgbm8gZHVwbGlj YXRlcwogICAgICAgIG1fc3Vic2NyaXB0aW9uTGFiZWxzLnJlbW92ZU9uZSggc3Vic2NyaXB0aW9u TGFiZWwgKTsKfQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrcnNzL2xpYmtyc3MvYXR0 cmlidXRlZ2VuLnJiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDc1NQAwMDAxNzUwADAwMDE3NTAAMDAwMDAw MTAxNzEAMTEwMjU3MDE3NzYAMDE2MTEwACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAHVzdGFyICAAdm9uYW1pAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2b25h bWkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMhL3Vzci9iaW4vZW52IHJ1 YnkKCiMgbGlrZSBTb21lQXR0cmlidXRlcwpuYW1lID0gQVJHVlswXQpuYW1lID0gbmFtZVswLCAx XS51cGNhc2UgKyBuYW1lWzEsIG5hbWUuc2l6ZV0KIyBsaWtlIHNvbWVBdHRyaWJ1dGVzLCB1c2Vk IGZvciB0aGUgbV8qIHZhcmlhYmxlCmxuYW1lID0gbmFtZVswLCAxXS5kb3duY2FzZSArIG5hbWVb MSwgbmFtZS5zaXplXQojIGxpa2UgU29tZUF0dHJpYnV0ZSwgdXNlZCBpbiBhZGQqKCkgYW5kIHJl bW92ZSooKQpzbmFtZSA9IG5hbWVbMCwgbmFtZS5zaXplIC0gMV0KIyBsaWtlIHNvbWVBdHRyaWJ1 dGUsIHVzZWQgaW4gYWRkKigpIGFuZCByZW1vdmUqKCkgYXMgYW4gYXJndW1lbnQKc2xuYW1lID0g c25hbWVbMCwgMV0uZG93bmNhc2UgKyBzbmFtZVsxLCBzbmFtZS5zaXplXQoKaGVhZGVyID0gRmls ZS5uZXcoIiN7bmFtZS5kb3duY2FzZX1jb2xsZWN0aW9uYXR0cmlidXRlLmgiLCAidyIpCmhlYWRl ci5wdXRzIFwKIi8qCiAgICBDb3B5cmlnaHQgKEMpIDIwMDggICAgRG1pdHJ5IEl2YW5vdiA8dm9u YW1pQGdtYWlsLmNvbT4KCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9m IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAgIHRoZSBG cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2Us IG9yCiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgIFRoaXMgcHJv Z3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAog ICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy cmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg UFVSUE9TRS4gIFNlZSB0aGUKICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3Jl IGRldGFpbHMuCgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYg bm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgoqLwoKI2lmbmRlZiBBS09O QURJXyN7bmFtZS51cGNhc2V9Q09MTEVDVElPTl9BVFRSSUJVVEUKI2RlZmluZSBBS09OQURJXyN7 bmFtZS51cGNhc2V9Q09MTEVDVElPTl9BVFRSSUJVVEUKCiNpbmNsdWRlIDxha29uYWRpL2F0dHJp YnV0ZS5oPgoKI2luY2x1ZGUgPFFTdHJpbmdMaXN0PgoKY2xhc3MgI3tuYW1lfUNvbGxlY3Rpb25B dHRyaWJ1dGUgOiBwdWJsaWMgQWtvbmFkaTo6QXR0cmlidXRlCnsKcHVibGljOgoKICAgICAgICAj e25hbWV9Q29sbGVjdGlvbkF0dHJpYnV0ZSggY29uc3QgUVN0cmluZ0xpc3QgJiN7bG5hbWV9ID0g UVN0cmluZ0xpc3QoKSApOwogICAgICAgIFFCeXRlQXJyYXkgdHlwZSgpIGNvbnN0OwogICAgICAg ICN7bmFtZX1Db2xsZWN0aW9uQXR0cmlidXRlKiBjbG9uZSgpIGNvbnN0OwogICAgICAgIFFCeXRl QXJyYXkgc2VyaWFsaXplZCgpIGNvbnN0OwogICAgICAgIHZvaWQgZGVzZXJpYWxpemUoIGNvbnN0 IFFCeXRlQXJyYXkgJmRhdGEgKTsKCiAgICAgICAgUVN0cmluZ0xpc3QgI3tsbmFtZX0oKSBjb25z dDsKICAgICAgICB2b2lkIHNldCN7bmFtZX0oIGNvbnN0IFFTdHJpbmdMaXN0ICYje2xuYW1lfSAp OwogICAgICAgIHZvaWQgYWRkI3tzbmFtZX0oIGNvbnN0IFFTdHJpbmcgJiN7c2xuYW1lfSApOwog ICAgICAgIHZvaWQgcmVtb3ZlI3tzbmFtZX0oIGNvbnN0IFFTdHJpbmcgJiN7c2xuYW1lfSApOwoK cHJpdmF0ZToKCiAgICAgICAgUVN0cmluZ0xpc3QgbV8je2xuYW1lfTsKfTsKCiNlbmRpZiAvKiBB S09OQURJXyN7bmFtZS51cGNhc2V9Q09MTEVDVElPTl9BVFRSSUJVVEUgKi8KIgpoZWFkZXIuY2xv c2UKCnNvdXJjZSA9IEZpbGUubmV3KCIje25hbWUuZG93bmNhc2V9Y29sbGVjdGlvbmF0dHJpYnV0 ZS5jcHAiLCAidyIpCnNvdXJjZS5wdXRzIFwKIi8qCiAgICBDb3B5cmlnaHQgKEMpIDIwMDggICAg RG1pdHJ5IEl2YW5vdiA8dm9uYW1pQGdtYWlsLmNvbT4KCiAgICBUaGlzIHByb2dyYW0gaXMgZnJl ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgaXQg dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJs aXNoZWQgYnkKICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9u IDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJz aW9uLgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0 IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2 ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNT IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVk IGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFsb25nIHdpdGgg dGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+ LgoqLwoKI2luY2x1ZGUgXCIje25hbWUuZG93bmNhc2V9Y29sbGVjdGlvbmF0dHJpYnV0ZS5oXCIK CiN7bmFtZX1Db2xsZWN0aW9uQXR0cmlidXRlOjoje25hbWV9Q29sbGVjdGlvbkF0dHJpYnV0ZSgg Y29uc3QgUVN0cmluZ0xpc3QgJiN7bG5hbWV9ICkKICAgICAgICA6IEF0dHJpYnV0ZSgpLCBtXyN7 bG5hbWV9KCAje2xuYW1lfSApCnsKfQoKUUJ5dGVBcnJheSAje25hbWV9Q29sbGVjdGlvbkF0dHJp YnV0ZTo6dHlwZSgpIGNvbnN0CnsKICAgICAgICByZXR1cm4gXCIje25hbWV9XCI7Cn0KCiN7bmFt ZX1Db2xsZWN0aW9uQXR0cmlidXRlKiAje25hbWV9Q29sbGVjdGlvbkF0dHJpYnV0ZTo6Y2xvbmUo KSBjb25zdAp7CiAgICAgICAgI3tuYW1lfUNvbGxlY3Rpb25BdHRyaWJ1dGUgKmF0dHIgPSBuZXcg I3tuYW1lfUNvbGxlY3Rpb25BdHRyaWJ1dGUoIG1fI3tsbmFtZX0gKTsKICAgICAgICByZXR1cm4g YXR0cjsKfQoKUUJ5dGVBcnJheSAje25hbWV9Q29sbGVjdGlvbkF0dHJpYnV0ZTo6c2VyaWFsaXpl ZCgpIGNvbnN0CnsKICAgICAgICByZXR1cm4gbV8je2xuYW1lfS5qb2luKCBcIjtcIiApLnRvVXRm OCgpOwp9Cgp2b2lkICN7bmFtZX1Db2xsZWN0aW9uQXR0cmlidXRlOjpkZXNlcmlhbGl6ZSggY29u c3QgUUJ5dGVBcnJheSAmZGF0YSApCnsKICAgICAgICBpZiAoIGRhdGEuaXNFbXB0eSgpICkKICAg ICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgLy8gc28gdWdseSwgYW0gaSBtaXNzaW5nIHNv bWV0aGluZz8KICAgICAgICBtXyN7bG5hbWV9ID0gUVN0cmluZzo6ZnJvbVV0ZjgoIGRhdGEuY29u c3REYXRhKCksIGRhdGEuc2l6ZSgpICkuc3BsaXQoICc7JyApOwp9CgpRU3RyaW5nTGlzdCAje25h bWV9Q29sbGVjdGlvbkF0dHJpYnV0ZTo6I3tsbmFtZX0oKSBjb25zdAp7CiAgICAgICAgcmV0dXJu IG1fI3tsbmFtZX07Cn0KCnZvaWQgI3tuYW1lfUNvbGxlY3Rpb25BdHRyaWJ1dGU6OnNldCN7bmFt ZX0oIGNvbnN0IFFTdHJpbmdMaXN0ICYje2xuYW1lfSApCnsKICAgICAgICBtXyN7bG5hbWV9ID0g I3tsbmFtZX07Cn0KCnZvaWQgI3tuYW1lfUNvbGxlY3Rpb25BdHRyaWJ1dGU6OmFkZCN7c25hbWV9 KCBjb25zdCBRU3RyaW5nICYje3NsbmFtZX0gKQp7CiAgICAgICAgaWYgKCAhbV8je2xuYW1lfS5j b250YWlucyggI3tzbG5hbWV9ICkgKQogICAgICAgICAgICAgICAgbV8je2xuYW1lfSA8PCAje3Ns bmFtZX07Cn0KCnZvaWQgI3tuYW1lfUNvbGxlY3Rpb25BdHRyaWJ1dGU6OnJlbW92ZSN7c25hbWV9 KCBjb25zdCBRU3RyaW5nICYje3NsbmFtZX0gKQp7CiAgICAgICAgLy8gYWRkI3tzbmFtZX0gZW5z dXJlIHRoZSBsaXN0IGNvbnRhaW5zIG5vIGR1cGxpY2F0ZXMKICAgICAgICBtXyN7bG5hbWV9LnJl bW92ZU9uZSggI3tzbG5hbWV9ICk7Cn0KIgpzb3VyY2UuY2xvc2UKAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtyc3MvbGlia3Jzcy9zdWJzY3JpcHRpb25s YWJlbHNjb2xsZWN0aW9uYXR0cmlidXRlLmgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAwMDAwNjQ0ADAwMDE3NTAAMDAwMTc1MAAwMDAwMDAwMzE1NwAxMTAy NTcwMTc3NgAwMjMxNTEAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAdXN0YXIgIAB2b25hbWkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZvbmFtaQAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyoKICAgIENvcHlyaWdodCAoQykgMjAwOCAg ICBEbWl0cnkgSXZhbm92IDx2b25hbWlAZ21haWwuY29tPgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBm cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBp dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1 Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNp b24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl cnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQg aXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5F U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2 ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0 aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2Vz Lz4uCiovCgojaWZuZGVmIEFLT05BRElfU1VCU0NSSVBUSU9OTEFCRUxTQ09MTEVDVElPTl9BVFRS SUJVVEUKI2RlZmluZSBBS09OQURJX1NVQlNDUklQVElPTkxBQkVMU0NPTExFQ1RJT05fQVRUUklC VVRFCgojaW5jbHVkZSA8YWtvbmFkaS9hdHRyaWJ1dGUuaD4KCiNpbmNsdWRlIDxRU3RyaW5nTGlz dD4KCmNsYXNzIFN1YnNjcmlwdGlvbkxhYmVsc0NvbGxlY3Rpb25BdHRyaWJ1dGUgOiBwdWJsaWMg QWtvbmFkaTo6QXR0cmlidXRlCnsKcHVibGljOgoKICAgICAgICBTdWJzY3JpcHRpb25MYWJlbHND b2xsZWN0aW9uQXR0cmlidXRlKCBjb25zdCBRU3RyaW5nTGlzdCAmc3Vic2NyaXB0aW9uTGFiZWxz ID0gUVN0cmluZ0xpc3QoKSApOwogICAgICAgIFFCeXRlQXJyYXkgdHlwZSgpIGNvbnN0OwogICAg ICAgIFN1YnNjcmlwdGlvbkxhYmVsc0NvbGxlY3Rpb25BdHRyaWJ1dGUqIGNsb25lKCkgY29uc3Q7 CiAgICAgICAgUUJ5dGVBcnJheSBzZXJpYWxpemVkKCkgY29uc3Q7CiAgICAgICAgdm9pZCBkZXNl cmlhbGl6ZSggY29uc3QgUUJ5dGVBcnJheSAmZGF0YSApOwoKICAgICAgICBRU3RyaW5nTGlzdCBz dWJzY3JpcHRpb25MYWJlbHMoKSBjb25zdDsKICAgICAgICB2b2lkIHNldFN1YnNjcmlwdGlvbkxh YmVscyggY29uc3QgUVN0cmluZ0xpc3QgJnN1YnNjcmlwdGlvbkxhYmVscyApOwogICAgICAgIHZv aWQgYWRkU3Vic2NyaXB0aW9uTGFiZWwoIGNvbnN0IFFTdHJpbmcgJnN1YnNjcmlwdGlvbkxhYmVs ICk7CiAgICAgICAgdm9pZCByZW1vdmVTdWJzY3JpcHRpb25MYWJlbCggY29uc3QgUVN0cmluZyAm c3Vic2NyaXB0aW9uTGFiZWwgKTsKCnByaXZhdGU6CgogICAgICAgIFFTdHJpbmdMaXN0IG1fc3Vi c2NyaXB0aW9uTGFiZWxzOwp9OwoKI2VuZGlmIC8qIEFLT05BRElfU1VCU0NSSVBUSU9OTEFCRUxT Q09MTEVDVElPTl9BVFRSSUJVVEUgKi8KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrcnNzL2xpYmtyc3MvdGFnc2NvbGxlY3Rpb25hdHRy aWJ1dGUuY3BwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAMDAwMDY0NAAwMDAxNzUwADAwMDE3NTAAMDAwMDAwMDM2MjUAMTEwMjU3MDE3 NzYAMDIwNTMzACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVz dGFyICAAdm9uYW1pAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2b25hbWkAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8qCiAgICBDb3B5cmlnaHQgKEMpIDIwMDggICAgRG1p dHJ5IEl2YW5vdiA8dm9uYW1pQGdtYWlsLmNvbT4KCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBz b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgaXQgdW5k ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNo ZWQgYnkKICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIg b2YgdGhlIExpY2Vuc2UsIG9yCiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9u LgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdp bGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g dGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEg Y29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFsb25nIHdpdGggdGhp cyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+Lgoq LwoKI2luY2x1ZGUgInRhZ3Njb2xsZWN0aW9uYXR0cmlidXRlLmgiCgpUYWdzQ29sbGVjdGlvbkF0 dHJpYnV0ZTo6VGFnc0NvbGxlY3Rpb25BdHRyaWJ1dGUoIGNvbnN0IFFTdHJpbmdMaXN0ICZ0YWdz ICkKICAgICAgICA6IEF0dHJpYnV0ZSgpLCBtX3RhZ3MoIHRhZ3MgKQp7Cn0KClFCeXRlQXJyYXkg VGFnc0NvbGxlY3Rpb25BdHRyaWJ1dGU6OnR5cGUoKSBjb25zdAp7CiAgICAgICAgcmV0dXJuICJU YWdzIjsKfQoKVGFnc0NvbGxlY3Rpb25BdHRyaWJ1dGUqIFRhZ3NDb2xsZWN0aW9uQXR0cmlidXRl OjpjbG9uZSgpIGNvbnN0CnsKICAgICAgICBUYWdzQ29sbGVjdGlvbkF0dHJpYnV0ZSAqYXR0ciA9 IG5ldyBUYWdzQ29sbGVjdGlvbkF0dHJpYnV0ZSggbV90YWdzICk7CiAgICAgICAgcmV0dXJuIGF0 dHI7Cn0KClFCeXRlQXJyYXkgVGFnc0NvbGxlY3Rpb25BdHRyaWJ1dGU6OnNlcmlhbGl6ZWQoKSBj b25zdAp7CiAgICAgICAgcmV0dXJuIG1fdGFncy5qb2luKCAiOyIgKS50b1V0ZjgoKTsKfQoKdm9p ZCBUYWdzQ29sbGVjdGlvbkF0dHJpYnV0ZTo6ZGVzZXJpYWxpemUoIGNvbnN0IFFCeXRlQXJyYXkg JmRhdGEgKQp7CiAgICAgICAgaWYgKCBkYXRhLmlzRW1wdHkoKSApCiAgICAgICAgICAgICAgICBy ZXR1cm47CgogICAgICAgIC8vIHNvIHVnbHksIGFtIGkgbWlzc2luZyBzb21ldGhpbmc/CiAgICAg ICAgbV90YWdzID0gUVN0cmluZzo6ZnJvbVV0ZjgoIGRhdGEuY29uc3REYXRhKCksIGRhdGEuc2l6 ZSgpICkuc3BsaXQoICc7JyApOwp9CgpRU3RyaW5nTGlzdCBUYWdzQ29sbGVjdGlvbkF0dHJpYnV0 ZTo6dGFncygpIGNvbnN0CnsKICAgICAgICByZXR1cm4gbV90YWdzOwp9Cgp2b2lkIFRhZ3NDb2xs ZWN0aW9uQXR0cmlidXRlOjpzZXRUYWdzKCBjb25zdCBRU3RyaW5nTGlzdCAmdGFncyApCnsKICAg ICAgICBtX3RhZ3MgPSB0YWdzOwp9Cgp2b2lkIFRhZ3NDb2xsZWN0aW9uQXR0cmlidXRlOjphZGRU YWcoIGNvbnN0IFFTdHJpbmcgJnRhZyApCnsKICAgICAgICBpZiAoICFtX3RhZ3MuY29udGFpbnMo IHRhZyApICkKICAgICAgICAgICAgICAgIG1fdGFncyA8PCB0YWc7Cn0KCnZvaWQgVGFnc0NvbGxl Y3Rpb25BdHRyaWJ1dGU6OnJlbW92ZVRhZyggY29uc3QgUVN0cmluZyAmdGFnICkKewogICAgICAg IC8vIGFkZFRhZyBlbnN1cmUgdGhlIGxpc3QgY29udGFpbnMgbm8gZHVwbGljYXRlcwogICAgICAg IG1fdGFncy5yZW1vdmVPbmUoIHRhZyApOwp9CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAa3Jzcy9saWJrcnNzL3RhZ3Njb2xsZWN0aW9uYXR0cmlidXRl LmgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAADAwMDA2NDQAMDAwMTc1MAAwMDAxNzUwADAwMDAwMDAyNjM1ADExMDI1NzAxNzc2ADAy MDIwMAAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAg AHZvbmFtaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdm9uYW1pAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAvKgogICAgQ29weXJpZ2h0IChDKSAyMDA4ICAgIERtaXRyeSBJ dmFub3YgPHZvbmFtaUBnbWFpbC5jb20+CgogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdh cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgIGl0IHVuZGVyIHRo ZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5 CiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRo ZSBMaWNlbnNlLCBvcgogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAg ICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl IHVzZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp bXBsaWVkIHdhcnJhbnR5IG9mCiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgICBhbG9uZyB3aXRoIHRoaXMgcHJv Z3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKi8KCiNp Zm5kZWYgQUtPTkFESV9UQUdTQ09MTEVDVElPTl9BVFRSSUJVVEUKI2RlZmluZSBBS09OQURJX1RB R1NDT0xMRUNUSU9OX0FUVFJJQlVURQoKI2luY2x1ZGUgPGFrb25hZGkvYXR0cmlidXRlLmg+Cgoj aW5jbHVkZSA8UVN0cmluZ0xpc3Q+CgpjbGFzcyBUYWdzQ29sbGVjdGlvbkF0dHJpYnV0ZSA6IHB1 YmxpYyBBa29uYWRpOjpBdHRyaWJ1dGUKewpwdWJsaWM6CgogICAgICAgIFRhZ3NDb2xsZWN0aW9u QXR0cmlidXRlKCBjb25zdCBRU3RyaW5nTGlzdCAmdGFncyA9IFFTdHJpbmdMaXN0KCkgKTsKICAg ICAgICBRQnl0ZUFycmF5IHR5cGUoKSBjb25zdDsKICAgICAgICBUYWdzQ29sbGVjdGlvbkF0dHJp YnV0ZSogY2xvbmUoKSBjb25zdDsKICAgICAgICBRQnl0ZUFycmF5IHNlcmlhbGl6ZWQoKSBjb25z dDsKICAgICAgICB2b2lkIGRlc2VyaWFsaXplKCBjb25zdCBRQnl0ZUFycmF5ICZkYXRhICk7Cgog ICAgICAgIFFTdHJpbmdMaXN0IHRhZ3MoKSBjb25zdDsKICAgICAgICB2b2lkIHNldFRhZ3MoIGNv bnN0IFFTdHJpbmdMaXN0ICZ0YWdzICk7CiAgICAgICAgdm9pZCBhZGRUYWcoIGNvbnN0IFFTdHJp bmcgJnRhZyApOwogICAgICAgIHZvaWQgcmVtb3ZlVGFnKCBjb25zdCBRU3RyaW5nICZ0YWcgKTsK CnByaXZhdGU6CgogICAgICAgIFFTdHJpbmdMaXN0IG1fdGFnczsKfTsKCiNlbmRpZiAvKiBBS09O QURJX1RBR1NDT0xMRUNUSU9OX0FUVFJJQlVURSAqLwoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAABrcnNzL2xpYmtyc3MvZmVlZHByb3BlcnRpZXNjb2xsZWN0aW9uYXR0 cmlidXRlLmgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAMDAwMDY0NAAwMDAxNzUwADAwMDE3NTAAMDAwMDAwMDM0MjcAMTEwMjU3MDE3NzYAMDIyMjYy ACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAdm9u YW1pAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2b25hbWkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAC8qCiAgICBDb3B5cmlnaHQgKEMpIDIwMDggICAgRG1pdHJ5IEl2YW5v diA8dm9uYW1pQGdtYWlsLmNvbT4KCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsg eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgaXQgdW5kZXIgdGhlIHRl cm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAg IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExp Y2Vuc2UsIG9yCiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgIFRo aXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNl ZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxp ZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv ciBtb3JlIGRldGFpbHMuCgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0 aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFt LiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgoqLwoKI2lmbmRl ZiBBS09OQURJX0ZFRURQUk9QRVJUSUVTQ09MTEVDVElPTl9BVFRSSUJVVEUKI2RlZmluZSBBS09O QURJX0ZFRURQUk9QRVJUSUVTQ09MTEVDVElPTl9BVFRSSUJVVEUKCiNpbmNsdWRlIDxha29uYWRp L2F0dHJpYnV0ZS5oPgoKI2luY2x1ZGUgPFFTdHJpbmdMaXN0PgoKY2xhc3MgRmVlZFByb3BlcnRp ZXNDb2xsZWN0aW9uQXR0cmlidXRlIDogcHVibGljIEFrb25hZGk6OkF0dHJpYnV0ZQp7CnB1Ymxp YzoKCiAgICAgICAgRmVlZFByb3BlcnRpZXNDb2xsZWN0aW9uQXR0cmlidXRlKCk7CiAgICAgICAg UUJ5dGVBcnJheSB0eXBlKCkgY29uc3Q7CiAgICAgICAgRmVlZFByb3BlcnRpZXNDb2xsZWN0aW9u QXR0cmlidXRlKiBjbG9uZSgpIGNvbnN0OwogICAgICAgIFFCeXRlQXJyYXkgc2VyaWFsaXplZCgp IGNvbnN0OwogICAgICAgIHZvaWQgZGVzZXJpYWxpemUoIGNvbnN0IFFCeXRlQXJyYXkgJmRhdGEg KTsKCiAgICAgICAgUVN0cmluZyBuYW1lKCkgY29uc3Q7CiAgICAgICAgdm9pZCBzZXROYW1lKCBj b25zdCBRU3RyaW5nICZuYW1lICk7CiAgICAgICAgUVN0cmluZyB4bWxVcmwoKSBjb25zdDsKICAg ICAgICB2b2lkIHNldFhtbFVybCggY29uc3QgUVN0cmluZyAmeG1sVXJsICk7CiAgICAgICAgUVN0 cmluZyBodG1sVXJsKCkgY29uc3Q7CiAgICAgICAgdm9pZCBzZXRIdG1sVXJsKCBjb25zdCBRU3Ry aW5nICZodG1sVXJsICk7CiAgICAgICAgUVN0cmluZyBmZWVkVHlwZSgpIGNvbnN0OwogICAgICAg IHZvaWQgc2V0RmVlZFR5cGUoIGNvbnN0IFFTdHJpbmcgJmZlZWRUeXBlICk7CiAgICAgICAgUVN0 cmluZyBkZXNjcmlwdGlvbigpIGNvbnN0OwogICAgICAgIHZvaWQgc2V0RGVzY3JpcHRpb24oIGNv bnN0IFFTdHJpbmcgJmRlc2NyaXB0aW9uICk7Cgpwcml2YXRlOgoKICAgICAgICBRU3RyaW5nIG1f bmFtZTsKICAgICAgICBRU3RyaW5nIG1feG1sVXJsOwogICAgICAgIFFTdHJpbmcgbV9odG1sVXJs OwogICAgICAgIFFTdHJpbmcgbV9mZWVkVHlwZTsKICAgICAgICBRU3RyaW5nIG1fZGVzY3JpcHRp b247Cn07CgojZW5kaWYgLyogQUtPTkFESV9GRUVEUFJPUEVSVElFU0NPTExFQ1RJT05fQVRUUklC VVRFICovCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAa3Jzcy9saWJrcnNzL29yZy5rZGUua3Jzcy54bWwAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAw MDA2NDQAMDAwMTc1MAAwMDAxNzUwADAwMDAwMDAwNTEwADExMDI2NDA2NjYxADAxNjEwNwAgMAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHZvbmFtaQAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdm9uYW1pAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAA8IURPQ1RZUEUgbm9kZSBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1C VVMgT2JqZWN0IEludHJvc3BlY3Rpb24gMS4wLy9FTiIgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Au b3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9pbnRyb3NwZWN0LmR0ZCI+Cjxub2RlPgogIDxpbnRlcmZh Y2UgbmFtZT0ib3JnLmtkZS5rcnNzIj4KICAgIDxtZXRob2QgbmFtZT0idHJpZ2dlckJ1ZyI+CiAg ICAgIDxhbm5vdGF0aW9uIG5hbWU9Im9yZy5mcmVlZGVza3RvcC5EQnVzLk1ldGhvZC5Ob1JlcGx5 IiB2YWx1ZT0idHJ1ZSIvPgogICAgPC9tZXRob2Q+CiAgPC9pbnRlcmZhY2U+Cjwvbm9kZT4KAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAGtyc3MvcGx1Z2luLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAw NzU1ADAwMDE3NTAAMDAwMTc1MAAwMDAwMDAwMDAwMAAxMTAyNjQyMzAyNQAwMTI2NzUAIDUAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIAB2b25hbWkAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZvbmFtaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAa3Jzcy9wbHVnaW4vYWtvbmFkaV9zZXJpYWxpemVyX3Jzcy5kZXNrdG9wAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA2 NDQAMDAwMTc1MAAwMDAxNzUwADAwMDAwMDAwNzA3ADExMDI1NzAxNzc2ADAyMTAzNQAgMAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHZvbmFtaQAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAdm9uYW1pAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAABbTWlzY10KTmFtZT1SU1Mgc2VyaWFsaXplcgpOYW1lW2VzXT1FbnbDrW9zIGVuIHNl cmllIGRlIFJTUwpOYW1lW2V0XT1SU1MtaSBqYWRhc3RpCk5hbWVbc3ZdPVJTUy1zZXJpYWxpc2Vy aW5nCkNvbW1lbnQ9QW4gQWtvbmFkaSBzZXJpYWxpemVyIHBsdWdpbiBmb3IgUlNTIGFydGljbGVz CkNvbW1lbnRbZXNdPVVuIGNvbXBsZW1lbnRvIHBhcmEgbG9zIGVudsOtb3MgZW4gc2VyaWUgZGUg QWtvbmFkaSBwYXJhIGxvcyBhcnTDrWN1bG9zIFJTUwpDb21tZW50W2V0XT1Ba29uYWRpIFJTUy1h cnRpa2xpdGUgamFkYXN0YW1pc3BsdWdpbgpDb21tZW50W3N2XT1FdHQgaW5zdGlja3Nwcm9ncmFt IHRpbGwgQWtvbmFkaSBmw7ZyIHNlcmlhbGlzZXJpbmcgYXYgUlNTLWFydGlrbGFyCgpbUGx1Z2lu XQpUeXBlPWFwcGxpY2F0aW9uL3Jzcyt4bWwKWC1LREUtTGlicmFyeT1ha29uYWRpX3NlcmlhbGl6 ZXJfcnNzCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAGtyc3MvcGx1Z2luL2Frb25hZGlfc2VyaWFsaXplcl9yc3MuaAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwNjQ0 ADAwMDE3NTAAMDAwMTc1MAAwMDAwMDAwMjM0NQAxMTAyNTcwMTc3NgAwMTc2MTMAIDAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIAB2b25hbWkAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAHZvbmFtaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAALyoKICAgIENvcHlyaWdodCAoQykgMjAwOCAgICBEbWl0cnkgSXZhbm92IDx2b25hbWlA Z21haWwuY29tPgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJl ZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUg U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IK ICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFt IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBi dXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50 eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ T1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0 YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3Qs IHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiovCgojaWZuZGVmIEFLT05BRElf U0VSSUFMSVpFUl9SU1MKI2RlZmluZSBBS09OQURJX1NFUklBTElaRVJfUlNTCgojaW5jbHVkZSA8 YWtvbmFkaS9pdGVtc2VyaWFsaXplcnBsdWdpbi5oPgoKY2xhc3MgUUlPRGV2aWNlOwoKdXNpbmcg bmFtZXNwYWNlIEFrb25hZGk7CgpjbGFzcyBTZXJpYWxpemVyUGx1Z2luUnNzIDogcHVibGljIFFP YmplY3QsIHB1YmxpYyBJdGVtU2VyaWFsaXplclBsdWdpbgp7CiAgICAgICAgUV9PQkpFQ1QKICAg ICAgICBRX0lOVEVSRkFDRVMoQWtvbmFkaTo6SXRlbVNlcmlhbGl6ZXJQbHVnaW4pCgpwdWJsaWM6 CgogICAgICAgIGJvb2wgZGVzZXJpYWxpemUoSXRlbSYgaXRlbSwgY29uc3QgUUJ5dGVBcnJheSYg bGFiZWwsIFFJT0RldmljZSYgZGF0YSwgaW50IHZlcnNpb24pOwogICAgICAgIHZvaWQgc2VyaWFs aXplKGNvbnN0IEl0ZW0mIGl0ZW0sIGNvbnN0IFFCeXRlQXJyYXkmIGxhYmVsLCBRSU9EZXZpY2Um IGRhdGEsIGludCAmdmVyc2lvbik7Cn07CgojZW5kaWYgLyogQUtPTkFESV9TRVJJQUxJWkVSX1JT UyAqLwoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAa3Jzcy9wbHVnaW4vYWtvbmFkaV9zZXJpYWxpemVyX3Jzcy5jcHAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA2NDQAMDAw MTc1MAAwMDAxNzUwADAwMDAwMDAzNzUxADExMDI1NzAxNzc2ADAyMDE1MAAgMAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHZvbmFtaQAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAdm9uYW1pAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAvKgogICAgQ29weXJpZ2h0IChDKSAyMDA4ICAgIERtaXRyeSBJdmFub3YgPHZvbmFtaUBnbWFp bC5jb20+CgogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0 cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgICB0aGUgRnJlZSBTb2Z0 d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICAg KGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgICBUaGlzIHByb2dyYW0gaXMg ZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgIGJ1dCBX SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m CiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu ICBTZWUgdGhlCiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxz LgoKICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlCiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2Vl IDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKi8KCgojaW5jbHVkZSAiYWtvbmFkaV9z ZXJpYWxpemVyX3Jzcy5oIgoKI2luY2x1ZGUgPGtmZWVkL2l0ZW0uaD4KI2luY2x1ZGUgPGtmZWVk L2l0ZW1zZXJpYWxpemVyLmg+CiNpbmNsdWRlIDxha29uYWRpL2l0ZW0uaD4KCiNpbmNsdWRlIDxR dENvcmUvcXBsdWdpbi5oPgoKdXNpbmcgbmFtZXNwYWNlIEFrb25hZGk7Cgpib29sIFNlcmlhbGl6 ZXJQbHVnaW5Sc3M6OmRlc2VyaWFsaXplKEl0ZW0mIGl0ZW0sIGNvbnN0IFFCeXRlQXJyYXkmIGxh YmVsLCBRSU9EZXZpY2UmIGRhdGEsIGludCB2ZXJzaW9uKQp7CiAgICAgICAgUV9VTlVTRUQodmVy c2lvbikKCiAgICAgICAgaWYgKCBsYWJlbCAhPSBJdGVtOjpGdWxsUGF5bG9hZCApCiAgICAgICAg ICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgIEtGZWVkOjpJdGVtIGFydGljbGU7CiAgICAg ICAgS0ZlZWQ6Okl0ZW1TZXJpYWxpemVyICpzZXIgPSBuZXcgS0ZlZWQ6OlhtbEl0ZW1TZXJpYWxp emVySW1wbCgpOwogICAgICAgIHNlci0+ZGVzZXJpYWxpemUoYXJ0aWNsZSwgZGF0YS5yZWFkQWxs KCkpOwoKICAgICAgICBpdGVtLnNldFBheWxvYWQ8S0ZlZWQ6Okl0ZW0+KGFydGljbGUpOwogICAg ICAgIHJldHVybiB0cnVlOwp9Cgp2b2lkIFNlcmlhbGl6ZXJQbHVnaW5Sc3M6OnNlcmlhbGl6ZShj b25zdCBJdGVtJiBpdGVtLCBjb25zdCBRQnl0ZUFycmF5JiBsYWJlbCwgUUlPRGV2aWNlJiBkYXRh LCBpbnQgJnZlcnNpb24pCnsKICAgICAgICBRX1VOVVNFRCh2ZXJzaW9uKQoKICAgICAgICBpZiAo IGxhYmVsICE9IEl0ZW06OkZ1bGxQYXlsb2FkICkKICAgICAgICAgICAgICAgIHJldHVybjsKCiAg ICAgICAgaWYgKCBpdGVtLm1pbWVUeXBlKCkgIT0gUVN0cmluZzo6ZnJvbUxhdGluMSgiYXBwbGlj YXRpb24vcnNzK3htbCIpICkKICAgICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgS0ZlZWQ6 Okl0ZW0gYXJ0aWNsZTsKICAgICAgICBpZiAoIGl0ZW0uaGFzUGF5bG9hZCgpICkKICAgICAgICAg ICAgICAgIGFydGljbGUgPSBpdGVtLnBheWxvYWQ8S0ZlZWQ6Okl0ZW0+KCk7CgogICAgICAgIEtG ZWVkOjpJdGVtU2VyaWFsaXplciAqc2VyID0gbmV3IEtGZWVkOjpYbWxJdGVtU2VyaWFsaXplcklt cGwoKTsKICAgICAgICBRQnl0ZUFycmF5IGFycmF5OwogICAgICAgIHNlci0+c2VyaWFsaXplKGFy dGljbGUsIGFycmF5KTsKICAgICAgICBkYXRhLndyaXRlKGFycmF5KTsKfQoKUV9FWFBPUlRfUExV R0lOMihha29uYWRpX3NlcmlhbGl6ZXJfcnNzLCBTZXJpYWxpemVyUGx1Z2luUnNzKQoKI2luY2x1 ZGUgImFrb25hZGlfc2VyaWFsaXplcl9yc3MubW9jIgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGty c3MvcGx1Z2luL0NNYWtlTGlzdHMudHh0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwNjQ0ADAwMDE3NTAA MDAwMTc1MAAwMDAwMDAwMDYzMQAxMTAyNTcwMTc3NgAwMTU0NTAAIDAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIAB2b25hbWkAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAHZvbmFtaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc2V0 KGFrb25hZGlfc2VyaWFsaXplcl9yc3NfU1JDUwogICAgYWtvbmFkaV9zZXJpYWxpemVyX3Jzcy5j cHAKKQoKa2RlNF9hZGRfcGx1Z2luKGFrb25hZGlfc2VyaWFsaXplcl9yc3MgJHtha29uYWRpX3Nl cmlhbGl6ZXJfcnNzX1NSQ1N9KQp0YXJnZXRfbGlua19saWJyYXJpZXMoYWtvbmFkaV9zZXJpYWxp emVyX3JzcyAke0tERTRfS0lPX0xJQlN9ICR7S0RFNF9BS09OQURJX0xJQlN9IGtmZWVkKQoKaW5z dGFsbChUQVJHRVRTIGFrb25hZGlfc2VyaWFsaXplcl9yc3MgREVTVElOQVRJT04gJHtQTFVHSU5f SU5TVEFMTF9ESVJ9KQppbnN0YWxsKEZJTEVTIGFrb25hZGlfc2VyaWFsaXplcl9yc3MuZGVza3Rv cCBERVNUSU5BVElPTiAiJHtEQVRBX0lOU1RBTExfRElSfS9ha29uYWRpL3BsdWdpbnMvc2VyaWFs aXplciIpCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrcnNz L2tyc3NyZWFkZXIvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDc1NQAwMDAxNzUwADAw MDE3NTAAMDAwMDAwMDAwMDAAMTEwMjY0MjMwMTMAMDEzNTQxACA1AAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAdm9uYW1pAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAB2b25hbWkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtyc3Mv a3Jzc3JlYWRlci9tYWluLmNwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwNjQ0ADAwMDE3NTAAMDAw MTc1MAAwMDAwMDAwMzU3NwAxMTAyNTcwMTc3NQAwMTUyMjIAIDAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIAB2b25hbWkAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAHZvbmFtaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyoKICAg IENvcHlyaWdodCAoQykgMjAwOCAgICBEbWl0cnkgSXZhbm92IDx2b25hbWlAZ21haWwuY29tPgoK ICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp dCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91 bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3Vy IG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1 dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBB TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVS Q0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo ZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZ b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDov L3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiovCgojaW5jbHVkZSAibWFpbndpbmRvdy5oIgojaW5j bHVkZSAiLi4vbGlia3Jzcy90YWdzY29sbGVjdGlvbmF0dHJpYnV0ZS5oIgojaW5jbHVkZSAiLi4v bGlia3Jzcy9zdWJzY3JpcHRpb25sYWJlbHNjb2xsZWN0aW9uYXR0cmlidXRlLmgiCiNpbmNsdWRl ICIuLi9saWJrcnNzL2ZlZWRwcm9wZXJ0aWVzY29sbGVjdGlvbmF0dHJpYnV0ZS5oIgoKI2luY2x1 ZGUgPGFrb25hZGkvYXR0cmlidXRlZmFjdG9yeS5oPgojaW5jbHVkZSA8a2FwcGxpY2F0aW9uLmg+ CiNpbmNsdWRlIDxrYWJvdXRkYXRhLmg+CiNpbmNsdWRlIDxrY21kbGluZWFyZ3MuaD4KI2luY2x1 ZGUgPEtERS9LTG9jYWxlPgoKaW50IG1haW4oIGludCBhcmdjLCBjaGFyICoqYXJndiApCnsKICAg ICAgICBLQWJvdXREYXRhIGFib3V0KCAia3Jzc3JlYWRlciIsIDAsIGtpMThuKCAiS1Jzc1JlYWRl ciIgKSwgIjAuMCIsIGtpMThuKCAiS1Jzc1JlYWRlciAtIGRlbW8gZmVlZCByZWFkZXIgZm9yIEFr b25hZGkiICksCiAgICAgICAgICAgICAgICAgICAgICAgICBLQWJvdXREYXRhOjpMaWNlbnNlX0dQ TCwga2kxOG4oIihDKSAyMDA4IERtaXRyeSBJdmFub3YiKSwgS0xvY2FsaXplZFN0cmluZygpLCAw LCAidm9uYW1pQGdtYWlsLmNvbSIgKTsKICAgICAgICBLQ21kTGluZUFyZ3M6OmluaXQoIGFyZ2Ms IGFyZ3YsICZhYm91dCApOwoKICAgICAgICBLQXBwbGljYXRpb24gYXBwOwogICAgICAgIE1haW5X aW5kb3cgKm1haW5XaW5kb3cgPSBuZXcgTWFpbldpbmRvdygpOwoKICAgICAgICBpZiAoIGFwcC5p c1Nlc3Npb25SZXN0b3JlZCgpICkgewogICAgICAgICAgICAgICAgUkVTVE9SRSggTWFpbldpbmRv dyApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG1haW5XaW5kb3ct PnNob3coKTsKICAgICAgICB9CgogICAgICAgIEFrb25hZGk6OkF0dHJpYnV0ZUZhY3Rvcnk6OnJl Z2lzdGVyQXR0cmlidXRlPFN1YnNjcmlwdGlvbkxhYmVsc0NvbGxlY3Rpb25BdHRyaWJ1dGU+KCk7 CiAgICAgICAgQWtvbmFkaTo6QXR0cmlidXRlRmFjdG9yeTo6cmVnaXN0ZXJBdHRyaWJ1dGU8VGFn c0NvbGxlY3Rpb25BdHRyaWJ1dGU+KCk7CiAgICAgICAgQWtvbmFkaTo6QXR0cmlidXRlRmFjdG9y eTo6cmVnaXN0ZXJBdHRyaWJ1dGU8RmVlZFByb3BlcnRpZXNDb2xsZWN0aW9uQXR0cmlidXRlPigp OwoKICAgICAgICByZXR1cm4gYXBwLmV4ZWMoKTsKfQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrcnNzL2tyc3Ny ZWFkZXIvZmVlZGxpc3Rtb2RlbC5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDY0NAAwMDAxNzUwADAwMDE3NTAA MDAwMDAwMDc0NTUAMTEwMjU3MDE3NzUAMDE2NTYyACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAdm9uYW1pAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAB2b25hbWkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8qCiAgICBDb3B5 cmlnaHQgKEMpIDIwMDggICAgRG1pdHJ5IEl2YW5vdiA8dm9uYW1pQGdtYWlsLmNvbT4KCiAgICBU aGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k L29yIG1vZGlmeQogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp b247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgICAoYXQgeW91ciBvcHRp b24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBp biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdB UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5U QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAg IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICAgWW91IHNo b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UKICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cu Z251Lm9yZy9saWNlbnNlcy8+LgoqLwoKI2lmbmRlZiBLUlNTUkVBREVSX0ZFRURMSVNUTU9ERUxf SAojZGVmaW5lIEtSU1NSRUFERVJfRkVFRExJU1RNT0RFTF9ICgojaW5jbHVkZSAidHJlZW5vZGUu aCIKCiNpbmNsdWRlIDxha29uYWRpL2NvbGxlY3Rpb24uaD4KI2luY2x1ZGUgPGFrb25hZGkvY29s bGVjdGlvbm1vZGVsLmg+CiNpbmNsdWRlIDxha29uYWRpL2NvbGxlY3Rpb25maWx0ZXJwcm94eW1v ZGVsLmg+CgpjbGFzcyBGZWVkbGlzdE1vZGVsIDogcHVibGljIFFBYnN0cmFjdEl0ZW1Nb2RlbAp7 CiAgICAgICAgUV9PQkpFQ1QKCnB1YmxpYzoKCiAgICAgICAgZW51bSBSb2xlcyB7CiAgICAgICAg ICAgICAgICBUaWVyUm9sZSA9IEFrb25hZGk6OkNvbGxlY3Rpb25Nb2RlbDo6VXNlclJvbGUgKyAx LAogICAgICAgICAgICAgICAgWG1sVXJsUm9sZSwKICAgICAgICAgICAgICAgIEh0bWxVcmxSb2xl LAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Sb2xlLAogICAgICAgICAgICAgICAgVGFnc1Jv bGUsCiAgICAgICAgICAgICAgICBTdWJzY3JpcHRpb25MYWJlbHNSb2xlCiAgICAgICAgfTsKCiAg ICAgICAgZW51bSBUaWVyIHsKICAgICAgICAgICAgICAgIFRhZ1RpZXIsCiAgICAgICAgICAgICAg ICBGZWVkVGllcgogICAgICAgIH07CgpwdWJsaWM6CgogICAgICAgIGV4cGxpY2l0IEZlZWRsaXN0 TW9kZWwoIFFPYmplY3QgKnBhcmVudCA9IDAgKTsKICAgICAgICB+RmVlZGxpc3RNb2RlbCgpOwoK ICAgICAgICB2b2lkIHNldFNvdXJjZU1vZGVsKCBBa29uYWRpOjpDb2xsZWN0aW9uTW9kZWwgKm1v ZGVsICk7CiAgICAgICAgQWtvbmFkaTo6Q29sbGVjdGlvbk1vZGVsKiBzb3VyY2VNb2RlbCgpIGNv bnN0OwoKICAgICAgICBBa29uYWRpOjpDb2xsZWN0aW9uIHJvb3RDb2xsZWN0aW9uKCkgY29uc3Q7 CiAgICAgICAgQWtvbmFkaTo6Q29sbGVjdGlvbiBjb2xsZWN0aW9uRm9ySWQoIGNvbnN0IEFrb25h ZGk6OkNvbGxlY3Rpb246OklkICZjb2xpZCApIGNvbnN0OwogICAgICAgIFFTdHJpbmdMaXN0IGFs bFRhZ3MoKSBjb25zdDsKICAgICAgICBRTGlzdDxBa29uYWRpOjpDb2xsZWN0aW9uOjpJZD4gYWxs Q29sbGVjdGlvbnMoKSBjb25zdDsKCiAgICAgICAgUVN0cmluZyB4bWxVcmwoIGNvbnN0IFFNb2Rl bEluZGV4ICZpbmRleCApIGNvbnN0OwogICAgICAgIFFTdHJpbmcgaHRtbFVybCggY29uc3QgUU1v ZGVsSW5kZXggJmluZGV4ICkgY29uc3Q7CiAgICAgICAgUVN0cmluZyBkZXNjcmlwdGlvbiggY29u c3QgUU1vZGVsSW5kZXggJmluZGV4ICkgY29uc3Q7CiAgICAgICAgUVN0cmluZ0xpc3QgdGFncygg Y29uc3QgUU1vZGVsSW5kZXggJmluZGV4ICkgY29uc3Q7CiAgICAgICAgUVN0cmluZ0xpc3Qgc3Vi c2NyaXB0aW9uTGFiZWxzKCBjb25zdCBRTW9kZWxJbmRleCAmaW5kZXggKSBjb25zdDsKCiAgICAg ICAgUVZhcmlhbnQgaGVhZGVyRGF0YSggaW50IHNlY3Rpb24sIFF0OjpPcmllbnRhdGlvbiBvcmll bnRhdGlvbiwgaW50IHJvbGUgPSBRdDo6RGlzcGxheVJvbGUgKSBjb25zdDsKICAgICAgICBpbnQg Y29sdW1uQ291bnQoIGNvbnN0IFFNb2RlbEluZGV4ICZwYXJlbnQgPSBRTW9kZWxJbmRleCgpICkg Y29uc3Q7CiAgICAgICAgaW50IHJvd0NvdW50KCBjb25zdCBRTW9kZWxJbmRleCAmcGFyZW50ID0g UU1vZGVsSW5kZXgoKSApIGNvbnN0OwogICAgICAgIFFWYXJpYW50IGRhdGEoIGNvbnN0IFFNb2Rl bEluZGV4ICZpbmRleCwgaW50IHJvbGUgPSBRdDo6RGlzcGxheVJvbGUgKSBjb25zdDsKICAgICAg ICBRTW9kZWxJbmRleCBpbmRleCggaW50IHJvdywgaW50IGNvbHVtbiwgY29uc3QgUU1vZGVsSW5k ZXggJnBhcmVudCA9IFFNb2RlbEluZGV4KCkgKSBjb25zdDsKICAgICAgICBRTW9kZWxJbmRleCBw YXJlbnQoIGNvbnN0IFFNb2RlbEluZGV4ICZpbmRleCApIGNvbnN0OwoKCnByaXZhdGUgUV9TTE9U UzoKCiAgICAgICAgdm9pZCBzbG90RGF0YUNoYW5nZWQoIGNvbnN0IFFNb2RlbEluZGV4ICZzdGFy dCwgY29uc3QgUU1vZGVsSW5kZXggJmVuZCApOwogICAgICAgIHZvaWQgc2xvdFJvd3NJbnNlcnRl ZCggY29uc3QgUU1vZGVsSW5kZXggJnBhcmVudCwgaW50IHN0YXJ0LCBpbnQgZW5kICk7CiAgICAg ICAgdm9pZCBzbG90Um93c1JlbW92ZWQoIGNvbnN0IFFNb2RlbEluZGV4ICZwYXJlbnQsIGludCBz dGFydCwgaW50IGVuZCApOwoKcHJvdGVjdGVkOgoKICAgICAgICAvLyBoZWxwZXIgbWV0aG9kcwog ICAgICAgIFFMaXN0PFFNb2RlbEluZGV4PiBmZWVkSW5kZXhlcyggY29uc3QgQWtvbmFkaTo6Q29s bGVjdGlvbjo6SWQgJmNvbCApIGNvbnN0OwoKcHJpdmF0ZToKCiAgICAgICAgLy8gaGVscGVyIG1l dGhvZHMKICAgICAgICBRU3RyaW5nTGlzdCBsb29rdXBUYWdzKCBjb25zdCBBa29uYWRpOjpDb2xs ZWN0aW9uOjpJZCAmaWQgKSBjb25zdDsKICAgICAgICBUcmVlTm9kZSogbG9va3VwRmVlZE5vZGUo IGNvbnN0IEFrb25hZGk6OkNvbGxlY3Rpb246OklkICZpZCwgY29uc3QgUVN0cmluZyAmdGFnICkg Y29uc3Q7CiAgICAgICAgdm9pZCBhZGRGZWVkTm9kZSggY29uc3QgUU1vZGVsSW5kZXggJnNvdXJj ZUluZGV4ICk7CiAgICAgICAgdm9pZCBkdW1wKCkgY29uc3Q7Cgpwcml2YXRlOgoKICAgICAgICBB a29uYWRpOjpDb2xsZWN0aW9uRmlsdGVyUHJveHlNb2RlbCAqbV9zb3VyY2VNb2RlbDsKICAgICAg ICBRU3RyaW5nIG1fYWxsRmVlZHNUYWc7CgogICAgICAgIC8vIGl0IGlzIGhhcmQgdG8gZm9yZXNl ZSB0aGUgcmVxdWlyZW1lbnRzIHRvCiAgICAgICAgLy8gdGhlIGRhdGEgc3RydWN0dXJlcyB1bnRp bCB0aGUgbW9kZWwgaXMgZmluaXNoZWQKICAgICAgICAvLyBzbyBpIGZpcnN0IGZpbmlzaCB0aGUg bW9kZWwgYW5kIHRoZW4gdHJ5IHRvIGNvbWUgdXAgd2l0aAogICAgICAgIC8vIHRoZSBtb3N0IGNv bnZpbmllbnQgd2F5IHRvIHJlcHJlc2VudCB0aGVzZSBtYXBwaW5ncwogICAgICAgIFRyZWVOb2Rl ICptX3Jvb3ROb2RlOwogICAgICAgIFFMaXN0PEFrb25hZGk6OkNvbGxlY3Rpb246OklkPiBtX2Nv bGxlY3Rpb25zOwogICAgICAgIFFIYXNoPEFrb25hZGk6OkNvbGxlY3Rpb246OklkLCBRTGlzdDxU cmVlTm9kZSo+ID4gbV9mZWVkTm9kZXM7CiAgICAgICAgUUhhc2g8UVN0cmluZywgVHJlZU5vZGUq PiBtX3RhZ05vZGVzOwp9OwoKI2VuZGlmIC8vIEtSU1NSRUFERVJfRkVFRExJU1RNT0RFTF9ICgAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrcnNzL2tyc3NyZWFkZXIvbWFp bndpbmRvdy5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDY0NAAwMDAxNzUwADAwMDE3NTAAMDAwMDAwMDIz NDcAMTEwMjU3MDE3NzUAMDE2MTExACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAHVzdGFyICAAdm9uYW1pAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2b25hbWkA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8qCiAgICBDb3B5cmlnaHQgKEMp IDIwMDggICAgRG1pdHJ5IEl2YW5vdiA8dm9uYW1pQGdtYWlsLmNvbT4KCiAgICBUaGlzIHByb2dy YW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlm eQogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZSBhcyBwdWJsaXNoZWQgYnkKICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl ciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBs YXRlciB2ZXJzaW9uLgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3 aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBv ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICAgWW91IHNob3VsZCBoYXZl IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFs b25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9s aWNlbnNlcy8+LgoqLwoKI2lmbmRlZiBLUlNTUkVBREVSX01BSU5XSU5ET1dfSAojZGVmaW5lIEtS U1NSRUFERVJfTUFJTldJTkRPV19ICgojaW5jbHVkZSAibWFpbndpZGdldC5oIgoKI2luY2x1ZGUg PGt4bWxndWl3aW5kb3cuaD4KI2luY2x1ZGUgPGFrb25hZGkvY29sbGVjdGlvbnZpZXcuaD4KI2lu Y2x1ZGUgPGFrb25hZGkvaXRlbXZpZXcuaD4KI2luY2x1ZGUgPGFrb25hZGkvY29sbGVjdGlvbm1v ZGVsLmg+CiNpbmNsdWRlIDxha29uYWRpL2NvbGxlY3Rpb25maWx0ZXJwcm94eW1vZGVsLmg+Cgpj bGFzcyBNYWluV2luZG93IDogcHVibGljIEtYbWxHdWlXaW5kb3cKewogICAgICAgIFFfT0JKRUNU CgpwdWJsaWM6CgogICAgICAgIGV4cGxpY2l0IE1haW5XaW5kb3coIFFXaWRnZXQgKnBhcmVudCA9 IDAgKTsKICAgICAgICB+TWFpbldpbmRvdygpOwoKcHJpdmF0ZToKCiAgICAgICAgdm9pZCBzZXR1 cEFjdGlvbnMoKTsKCnByaXZhdGU6CgogICAgICAgIE1haW5XaWRnZXQgKm1fbWFpbldpZGdldDsK fTsKCiNlbmRpZiAvLyBLUlNTUkVBREVSX01BSU5XSU5ET1dfSAoAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtyc3Mva3Jzc3JlYWRlci9mZWVkcHJv cGVydGllc2RpYWxvZy5jcHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwNjQ0ADAwMDE3NTAAMDAwMTc1MAAwMDAwMDAwMzA1MwAx MTAyNTcwMTc3NQAwMjA0NjMAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAdXN0YXIgIAB2b25hbWkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZvbmFtaQAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyoKICAgIENvcHlyaWdodCAoQykgMjAw OCAgICBEbWl0cnkgSXZhbm92IDx2b25hbWlAZ21haWwuY29tPgoKICAgIFRoaXMgcHJvZ3JhbSBp cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAg ICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFz IHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZl cnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy IHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo YXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJ VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwg UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVj ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcg d2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vu c2VzLz4uCiovCgojaW5jbHVkZSAiZmVlZHByb3BlcnRpZXNkaWFsb2cuaCIKCiNpbmNsdWRlIDxL TG9jYWxlPgojaW5jbHVkZSA8S01lc3NhZ2VCb3g+CgpGZWVkUHJvcGVydGllc0RpYWxvZzo6RmVl ZFByb3BlcnRpZXNEaWFsb2coIFFXaWRnZXQgKnBhcmVudCApCiAgICAgICAgOiBLRGlhbG9nKCBw YXJlbnQgKQp7CiAgICAgICAgUVdpZGdldCAqd2lkZ2V0ID0gbmV3IFFXaWRnZXQoIHRoaXMgKTsK ICAgICAgICB1aS5zZXR1cFVpKCB3aWRnZXQgKTsKCiAgICAgICAgc2V0TWFpbldpZGdldCggd2lk Z2V0ICk7CiAgICAgICAgc2V0Q2FwdGlvbiggaTE4biggIkZlZWQgUHJvcGVydGllcyIgKSApOwog ICAgICAgIHNldEJ1dHRvbnMoIEtEaWFsb2c6Ok9rIHwgS0RpYWxvZzo6Q2xvc2UgKTsKfQoKRmVl ZFByb3BlcnRpZXNEaWFsb2c6On5GZWVkUHJvcGVydGllc0RpYWxvZygpCnsKfQoKUVN0cmluZyBG ZWVkUHJvcGVydGllc0RpYWxvZzo6ZmVlZE5hbWUoKSBjb25zdAp7CiAgICAgICAgcmV0dXJuIHVp LmZlZWROYW1lRWRpdC0+dGV4dCgpOwp9Cgp2b2lkIEZlZWRQcm9wZXJ0aWVzRGlhbG9nOjpzZXRG ZWVkTmFtZSggY29uc3QgUVN0cmluZyAmZmVlZE5hbWUgKQp7CiAgICAgICAgdWkuZmVlZE5hbWVF ZGl0LT5zZXRUZXh0KCBmZWVkTmFtZSApOwp9CgpRU3RyaW5nIEZlZWRQcm9wZXJ0aWVzRGlhbG9n Ojp1cmwoKSBjb25zdAp7CiAgICAgICAgcmV0dXJuIHVpLnVybEVkaXQtPnRleHQoKTsKfQoKdm9p ZCBGZWVkUHJvcGVydGllc0RpYWxvZzo6c2V0VXJsKCBjb25zdCBRU3RyaW5nICZ1cmwgKQp7CiAg ICAgICAgdWkudXJsRWRpdC0+c2V0VGV4dCggdXJsICk7Cn0KCiNpbmNsdWRlICJmZWVkcHJvcGVy dGllc2RpYWxvZy5tb2MiCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrcnNzL2tyc3NyZWFkZXIvbWFpbndpbmRvdy5j cHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAMDAwMDY0NAAwMDAxNzUwADAwMDE3NTAAMDAwMDAwMDI1MDYAMTEwMjU3 MDE3NzUAMDE2NDQxACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AHVzdGFyICAAdm9uYW1pAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2b25hbWkAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8qCiAgICBDb3B5cmlnaHQgKEMpIDIwMDggICAg RG1pdHJ5IEl2YW5vdiA8dm9uYW1pQGdtYWlsLmNvbT4KCiAgICBUaGlzIHByb2dyYW0gaXMgZnJl ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgaXQg dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJs aXNoZWQgYnkKICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9u IDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJz aW9uLgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0 IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2 ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNT IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVk IGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFsb25nIHdpdGgg dGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+ LgoqLwoKI2luY2x1ZGUgIm1haW53aW5kb3cuaCIKCiNpbmNsdWRlIDxrc3RhdHVzYmFyLmg+CiNp bmNsdWRlIDxLQXBwbGljYXRpb24+CiNpbmNsdWRlIDxLQWN0aW9uPgojaW5jbHVkZSA8S0xvY2Fs ZT4KI2luY2x1ZGUgPEtBY3Rpb25Db2xsZWN0aW9uPgojaW5jbHVkZSA8S1N0YW5kYXJkQWN0aW9u PgoKI2luY2x1ZGUgPFFTcGxpdHRlcj4KCk1haW5XaW5kb3c6Ok1haW5XaW5kb3coIFFXaWRnZXQg KnBhcmVudCApCiAgICAgICAgOiBLWG1sR3VpV2luZG93KCBwYXJlbnQgKSwgbV9tYWluV2lkZ2V0 KCBuZXcgTWFpbldpZGdldCggdGhpcyApICkKewovLyAgICAgICAgc2V0QWNjZXB0RHJvcHMoIHRy dWUgKTsKICAgICAgICBzdGF0dXNCYXIoKS0+c2hvdygpOwoKICAgICAgICBzZXRDZW50cmFsV2lk Z2V0KCBtX21haW5XaWRnZXQgKTsKICAgICAgICBzZXR1cEFjdGlvbnMoKTsKCiAgICAgICAgc2V0 dXBHVUkoKTsKfQoKTWFpbldpbmRvdzo6fk1haW5XaW5kb3coKQp7Cn0KCnZvaWQgTWFpbldpbmRv dzo6c2V0dXBBY3Rpb25zKCkKewogICAgICAgIEtTdGFuZGFyZEFjdGlvbjo6cXVpdCgga2FwcCwg U0xPVCggcXVpdCgpICksIGFjdGlvbkNvbGxlY3Rpb24oKSApOwp9CgojaW5jbHVkZSAibWFpbndp bmRvdy5tb2MiCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtyc3Mva3Jzc3JlYWRlci9tYWlud2lkZ2V0LmNwcAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAwMDAwNjQ0ADAwMDE3NTAAMDAwMTc1MAAwMDAwMDAwNTA2NwAxMTAyNjEyNzQ2 MAAwMTY0MTQAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0 YXIgIAB2b25hbWkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZvbmFtaQAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyoKICAgIENvcHlyaWdodCAoQykgMjAwOCAgICBEbWl0 cnkgSXZhbm92IDx2b25hbWlAZ21haWwuY29tPgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNv ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRl ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hl ZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBv ZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24u CgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls bCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0 aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9S IEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBj b3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlz IHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiov CgojaW5jbHVkZSAibWFpbndpZGdldC5oIgojaW5jbHVkZSAic3RhbmRhcmRhY3Rpb25tYW5hZ2Vy LmgiCgojaW5jbHVkZSA8S1htbEd1aVdpbmRvdz4KCiNpbmNsdWRlIDxRSEJveExheW91dD4KCk1h aW5XaWRnZXQ6Ok1haW5XaWRnZXQoIEtYbWxHdWlXaW5kb3cgKnBhcmVudCApCnsKICAgICAgICBR SEJveExheW91dCAqbWFpbkxheW91dCA9IG5ldyBRSEJveExheW91dCggdGhpcyApOwogICAgICAg IHNldExheW91dCggbWFpbkxheW91dCApOwoKICAgICAgICBtX21haW5TcGxpdHRlciA9IG5ldyBR U3BsaXR0ZXIoIFF0OjpIb3Jpem9udGFsLCB0aGlzICk7CiAgICAgICAgbWFpbkxheW91dC0+YWRk V2lkZ2V0KCBtX21haW5TcGxpdHRlciApOwoKICAgICAgICBtX2Z1bGxNb2RlbCA9IG5ldyBBa29u YWRpOjpDb2xsZWN0aW9uTW9kZWwoIHRoaXMgKTsKICAgICAgICBtX2ZlZWRsaXN0TW9kZWwgPSBu ZXcgRmVlZGxpc3RNb2RlbCggdGhpcyApOwogICAgICAgIG1fZmVlZGxpc3RNb2RlbC0+c2V0U291 cmNlTW9kZWwoIG1fZnVsbE1vZGVsICk7CiAgICAgICAgbV9maWx0ZXJlZEZlZWRsaXN0TW9kZWwg PSBuZXcgRmVlZGxpc3RGaWx0ZXJQcm94eU1vZGVsKCB0aGlzICk7CiAgICAgICAgbV9maWx0ZXJl ZEZlZWRsaXN0TW9kZWwtPnNldFNvdXJjZU1vZGVsKCBtX2ZlZWRsaXN0TW9kZWwgKTsKICAgICAg ICBtX2ZpbHRlcmVkRmVlZGxpc3RNb2RlbC0+c2V0U3Vic2NyaXB0aW9uTGFiZWwoICJrcnNzcmVh ZGVyIiApOwogICAgICAgIG1fZmVlZGxpc3RWaWV3ID0gbmV3IEFrb25hZGk6OkNvbGxlY3Rpb25W aWV3KCB0aGlzICk7CiAgICAgICAgbV9mZWVkbGlzdFZpZXctPnNldE1vZGVsKCBtX2ZlZWRsaXN0 TW9kZWwgKTsKCiAgICAgICAgbV9hcnRpY2xlU3BsaXR0ZXIgPSBuZXcgUVNwbGl0dGVyKCBRdDo6 VmVydGljYWwsIHRoaXMgKTsKCiAgICAgICAgbV9hcnRpY2xlc01vZGVsID0gbmV3IEFrb25hZGk6 Okl0ZW1Nb2RlbCggdGhpcyApOwogICAgICAgIG1fYXJ0aWNsZXNWaWV3ID0gbmV3IEFrb25hZGk6 Okl0ZW1WaWV3KCB0aGlzICk7CiAgICAgICAgbV9hcnRpY2xlc1ZpZXctPnNldE1vZGVsKCBtX2Fy dGljbGVzTW9kZWwgKTsKICAgICAgICBtX2FydGljbGVWaWV3ZXIgPSBuZXcgUVRleHRFZGl0KCB0 aGlzICk7CiAgICAgICAgbV9hcnRpY2xlU3BsaXR0ZXItPmFkZFdpZGdldCggbV9hcnRpY2xlc1Zp ZXcgKTsKICAgICAgICBtX2FydGljbGVTcGxpdHRlci0+YWRkV2lkZ2V0KCBtX2FydGljbGVWaWV3 ZXIgKTsKCiAgICAgICAgbV9tYWluU3BsaXR0ZXItPmFkZFdpZGdldCggbV9mZWVkbGlzdFZpZXcg KTsKICAgICAgICBtX21haW5TcGxpdHRlci0+YWRkV2lkZ2V0KCBtX2FydGljbGVTcGxpdHRlciAp OwoKICAgICAgICBTdGFuZGFyZEFjdGlvbk1hbmFnZXIgKmFjdGlvbk1hbmFnZXIgPSBuZXcgU3Rh bmRhcmRBY3Rpb25NYW5hZ2VyKCBwYXJlbnQtPmFjdGlvbkNvbGxlY3Rpb24oKSwgdGhpcyApOwog ICAgICAgIGFjdGlvbk1hbmFnZXItPnNldEZlZWRTZWxlY3Rpb25Nb2RlbCggbV9mZWVkbGlzdFZp ZXctPnNlbGVjdGlvbk1vZGVsKCkgKTsKICAgICAgICBhY3Rpb25NYW5hZ2VyLT5zZXRTdWJzY3Jp cHRpb25MYWJlbCggImtyc3NyZWFkZXIiICk7CiAgICAgICAgYWN0aW9uTWFuYWdlci0+Y3JlYXRl QWxsQWN0aW9ucygpOwoKICAgICAgICBjb25uZWN0KCBtX2ZlZWRsaXN0VmlldywgU0lHTkFMKCBj bGlja2VkKCBjb25zdCBBa29uYWRpOjpDb2xsZWN0aW9uJikgKSwKICAgICAgICAgICAgICAgICBt X2FydGljbGVzTW9kZWwsIFNMT1QoIHNldENvbGxlY3Rpb24oIGNvbnN0IEFrb25hZGk6OkNvbGxl Y3Rpb24mICkgKSApOwp9CgpNYWluV2lkZ2V0Ojp+TWFpbldpZGdldCgpCnsKfQoKI2luY2x1ZGUg Im1haW53aWRnZXQubW9jIgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAa3Jzcy9rcnNzcmVhZGVyL2ZlZWRsaXN0bW9kZWwuY3BwAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAADAwMDA2NDQAMDAwMTc1MAAwMDAxNzUwADAwMDAwMDUwMzM2ADExMDI1NzAxNzc1ADAxNzEx MQAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHZv bmFtaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdm9uYW1pAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAvKgogICAgQ29weXJpZ2h0IChDKSAyMDA4ICAgIERtaXRyeSBJdmFu b3YgPHZvbmFtaUBnbWFpbC5jb20+CgogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7 IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgIGl0IHVuZGVyIHRoZSB0 ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAg ICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBM aWNlbnNlLCBvcgogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgICBU aGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVz ZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBs aWVkIHdhcnJhbnR5IG9mCiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJU SUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm b3IgbW9yZSBkZXRhaWxzLgoKICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg dGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3Jh bS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKi8KCiNpbmNs dWRlICJmZWVkbGlzdG1vZGVsLmgiCiNpbmNsdWRlICIuLi9saWJrcnNzL3RhZ3Njb2xsZWN0aW9u YXR0cmlidXRlLmgiCiNpbmNsdWRlICIuLi9saWJrcnNzL2ZlZWRwcm9wZXJ0aWVzY29sbGVjdGlv bmF0dHJpYnV0ZS5oIgojaW5jbHVkZSAiLi4vbGlia3Jzcy9zdWJzY3JpcHRpb25sYWJlbHNjb2xs ZWN0aW9uYXR0cmlidXRlLmgiCgojaW5jbHVkZSA8S0RlYnVnPgojaW5jbHVkZSA8S0xvY2FsZT4K CiNpbmNsdWRlIDxRSGFzaEl0ZXJhdG9yPgoKRmVlZGxpc3RNb2RlbDo6RmVlZGxpc3RNb2RlbCgg UU9iamVjdCAqcGFyZW50ICkKICAgICAgICA6IFFBYnN0cmFjdEl0ZW1Nb2RlbCggcGFyZW50ICks IG1fc291cmNlTW9kZWwoMCksCiAgICAgICAgICBtX2FsbEZlZWRzVGFnKCBpMThuKCAiQWxsIGZl ZWRzIiApICkKewogICAgICAgIG1fcm9vdE5vZGUgPSBuZXcgVHJlZU5vZGUoIFRyZWVOb2RlOjpS b290Tm9kZSwgIlN1YnNjcmlwdGlvbnMiLCAwICk7CiAgICAgICAgVHJlZU5vZGUgKnRhZ05vZGUg PSBuZXcgVHJlZU5vZGUoIFRyZWVOb2RlOjpUYWdOb2RlLCBtX2FsbEZlZWRzVGFnLCBtX3Jvb3RO b2RlICk7CiAgICAgICAgbV9yb290Tm9kZS0+YXBwZW5kQ2hpbGQoIHRhZ05vZGUgKTsKICAgICAg ICBtX3RhZ05vZGVzWyBtX2FsbEZlZWRzVGFnIF0gPSB0YWdOb2RlOwp9CgpGZWVkbGlzdE1vZGVs Ojp+RmVlZGxpc3RNb2RlbCgpCnsKICAgICAgICBkZWxldGUgbV9yb290Tm9kZTsKfQoKdm9pZCBG ZWVkbGlzdE1vZGVsOjpzZXRTb3VyY2VNb2RlbCggQWtvbmFkaTo6Q29sbGVjdGlvbk1vZGVsICpt b2RlbCApCnsKICAgICAgICBtX3NvdXJjZU1vZGVsID0gbmV3IEFrb25hZGk6OkNvbGxlY3Rpb25G aWx0ZXJQcm94eU1vZGVsKCB0aGlzICk7CiAgICAgICAgbV9zb3VyY2VNb2RlbC0+YWRkTWltZVR5 cGVGaWx0ZXIoICJhcHBsaWNhdGlvbi9yc3MreG1sIiApOwogICAgICAgIG1fc291cmNlTW9kZWwt PnNldFNvdXJjZU1vZGVsKCBtb2RlbCApOwoKICAgICAgICBjb25uZWN0KCBtX3NvdXJjZU1vZGVs LCBTSUdOQUwoIHJvd3NJbnNlcnRlZCggY29uc3QgUU1vZGVsSW5kZXgmLCBpbnQsIGludCApICks CiAgICAgICAgICAgICAgICAgdGhpcywgU0xPVCggc2xvdFJvd3NJbnNlcnRlZCggY29uc3QgUU1v ZGVsSW5kZXgmLCBpbnQsIGludCkgKSApOwogICAgICAgIGNvbm5lY3QoIG1fc291cmNlTW9kZWws IFNJR05BTCggcm93c1JlbW92ZWQoIGNvbnN0IFFNb2RlbEluZGV4JiwgaW50LCBpbnQgKSApLAog ICAgICAgICAgICAgICAgIHRoaXMsIFNMT1QoIHNsb3RSb3dzUmVtb3ZlZCggY29uc3QgUU1vZGVs SW5kZXgmLCBpbnQsIGludCkgKSApOwogICAgICAgIGNvbm5lY3QoIG1fc291cmNlTW9kZWwsIFNJ R05BTCggZGF0YUNoYW5nZWQoIGNvbnN0IFFNb2RlbEluZGV4JiwgY29uc3QgUU1vZGVsSW5kZXgm ICkgKSwKICAgICAgICAgICAgICAgICB0aGlzLCBTTE9UKCBzbG90RGF0YUNoYW5nZWQoIGNvbnN0 IFFNb2RlbEluZGV4JiwgY29uc3QgUU1vZGVsSW5kZXgmICkgKSApOwp9CgpBa29uYWRpOjpDb2xs ZWN0aW9uIEZlZWRsaXN0TW9kZWw6OnJvb3RDb2xsZWN0aW9uKCkgY29uc3QKewogICAgICAgIFFN b2RlbEluZGV4IHN1YnMgPSBtX3NvdXJjZU1vZGVsLT5pbmRleCggMCwgMCwgUU1vZGVsSW5kZXgo KSApOwogICAgICAgIHJldHVybiBtX3NvdXJjZU1vZGVsLT5kYXRhKCBzdWJzLCBBa29uYWRpOjpD b2xsZWN0aW9uTW9kZWw6OkNvbGxlY3Rpb25Sb2xlICkudmFsdWU8QWtvbmFkaTo6Q29sbGVjdGlv bj4oKTsKfQoKQWtvbmFkaTo6Q29sbGVjdGlvbiBGZWVkbGlzdE1vZGVsOjpjb2xsZWN0aW9uRm9y SWQoIGNvbnN0IEFrb25hZGk6OkNvbGxlY3Rpb246OklkICZjb2xpZCApIGNvbnN0CnsKICAgICAg ICBRTW9kZWxJbmRleCBzdWJzID0gbV9zb3VyY2VNb2RlbC0+aW5kZXgoIDAsIDAsIFFNb2RlbElu ZGV4KCkgKTsKICAgICAgICBRTW9kZWxJbmRleCBzb3VyY2VJbmRleCA9IG1fc291cmNlTW9kZWwt PmluZGV4KCBtX2NvbGxlY3Rpb25zLmluZGV4T2YoIGNvbGlkICksIDAsIHN1YnMgKTsKICAgICAg ICByZXR1cm4gbV9zb3VyY2VNb2RlbC0+ZGF0YSggc291cmNlSW5kZXgsIEFrb25hZGk6OkNvbGxl Y3Rpb25Nb2RlbDo6Q29sbGVjdGlvblJvbGUgKS52YWx1ZTxBa29uYWRpOjpDb2xsZWN0aW9uPigp Owp9CgpRU3RyaW5nTGlzdCBGZWVkbGlzdE1vZGVsOjphbGxUYWdzKCkgY29uc3QKewogICAgICAg IHJldHVybiBtX3RhZ05vZGVzLmtleXMoKTsKfQoKUUxpc3Q8QWtvbmFkaTo6Q29sbGVjdGlvbjo6 SWQ+IEZlZWRsaXN0TW9kZWw6OmFsbENvbGxlY3Rpb25zKCkgY29uc3QKewogICAgICAgIHJldHVy biBtX2NvbGxlY3Rpb25zOwp9CgpRU3RyaW5nIEZlZWRsaXN0TW9kZWw6OnhtbFVybCggY29uc3Qg UU1vZGVsSW5kZXggJmluZGV4ICkgY29uc3QKewogICAgICAgIHJldHVybiBkYXRhKCBpbmRleCwg RmVlZGxpc3RNb2RlbDo6WG1sVXJsUm9sZSApLnRvU3RyaW5nKCk7Cn0KClFTdHJpbmcgRmVlZGxp c3RNb2RlbDo6aHRtbFVybCggY29uc3QgUU1vZGVsSW5kZXggJmluZGV4ICkgY29uc3QKewogICAg ICAgIHJldHVybiBkYXRhKCBpbmRleCwgRmVlZGxpc3RNb2RlbDo6SHRtbFVybFJvbGUgKS50b1N0 cmluZygpOwp9CgpRU3RyaW5nIEZlZWRsaXN0TW9kZWw6OmRlc2NyaXB0aW9uKCBjb25zdCBRTW9k ZWxJbmRleCAmaW5kZXggKSBjb25zdAp7CiAgICAgICAgcmV0dXJuIGRhdGEoIGluZGV4LCBGZWVk bGlzdE1vZGVsOjpEZXNjcmlwdGlvblJvbGUgKS50b1N0cmluZygpOwp9CgpRU3RyaW5nTGlzdCBG ZWVkbGlzdE1vZGVsOjp0YWdzKCBjb25zdCBRTW9kZWxJbmRleCAmaW5kZXggKSBjb25zdAp7CiAg ICAgICAgcmV0dXJuIGRhdGEoIGluZGV4LCBGZWVkbGlzdE1vZGVsOjpUYWdzUm9sZSApLnRvU3Ry aW5nTGlzdCgpOwp9CgpRU3RyaW5nTGlzdCBGZWVkbGlzdE1vZGVsOjpzdWJzY3JpcHRpb25MYWJl bHMoIGNvbnN0IFFNb2RlbEluZGV4ICZpbmRleCApIGNvbnN0CnsKICAgICAgICByZXR1cm4gZGF0 YSggaW5kZXgsIEZlZWRsaXN0TW9kZWw6OlN1YnNjcmlwdGlvbkxhYmVsc1JvbGUgKS50b1N0cmlu Z0xpc3QoKTsKfQoKUVZhcmlhbnQgRmVlZGxpc3RNb2RlbDo6aGVhZGVyRGF0YSggaW50IHNlY3Rp b24sIFF0OjpPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwgaW50IHJvbGUgKSBjb25zdAp7CiAgICAg ICAgaWYgKCBzZWN0aW9uID09IDAgJiYgb3JpZW50YXRpb24gPT0gUXQ6Okhvcml6b250YWwgJiYg cm9sZSA9PSBRdDo6RGlzcGxheVJvbGUgKQogICAgICAgICAgICAgICAgcmV0dXJuIGkxOG4oICJG ZWVkcyIgKTsKCiAgICAgICAgcmV0dXJuIFFWYXJpYW50KCk7Cn0KCmludCBGZWVkbGlzdE1vZGVs Ojpjb2x1bW5Db3VudCggY29uc3QgUU1vZGVsSW5kZXggJnBhcmVudCApIGNvbnN0CnsKICAgICAg ICBRX1VOVVNFRCggcGFyZW50ICk7CiAgICAgICAgcmV0dXJuIDE7Cn0KCmludCBGZWVkbGlzdE1v ZGVsOjpyb3dDb3VudCggY29uc3QgUU1vZGVsSW5kZXggJnBhcmVudCApIGNvbnN0CnsKICAgICAg ICBpZiAoICFwYXJlbnQuaXNWYWxpZCgpICkKICAgICAgICAgICAgICAgIHJldHVybiBtX3Jvb3RO b2RlLT5jb3VudCgpOwoKICAgICAgICBUcmVlTm9kZSAqbm9kZSA9IHN0YXRpY19jYXN0PFRyZWVO b2RlKj4oIHBhcmVudC5pbnRlcm5hbFBvaW50ZXIoKSApOwogICAgICAgIHJldHVybiBub2RlLT5j b3VudCgpOwp9CgpRVmFyaWFudCBGZWVkbGlzdE1vZGVsOjpkYXRhKGNvbnN0IFFNb2RlbEluZGV4 ICZpbmRleCwgaW50IHJvbGUgKSBjb25zdAp7CiAgICAgICAgaWYgKCAhaW5kZXguaXNWYWxpZCgp ICkKICAgICAgICAgICAgICAgIHJldHVybiBRVmFyaWFudCgpOwoKICAgICAgICAvLyB0YWcgbm9k ZQogICAgICAgIFRyZWVOb2RlICpub2RlID0gc3RhdGljX2Nhc3Q8VHJlZU5vZGUqPiggaW5kZXgu aW50ZXJuYWxQb2ludGVyKCkgKTsKICAgICAgICBpZiAoIG5vZGUtPnRpZXIoKSA9PSBUcmVlTm9k ZTo6VGFnTm9kZSApIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAoIHJvbGUgKSB7CiAgICAgICAg ICAgICAgICAgICAgICAgIGNhc2UgUXQ6OkRpc3BsYXlSb2xlOiAgICAgICAgICByZXR1cm4gbm9k ZS0+bmFtZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZlZWRsaXN0TW9kZWw6OlRp ZXJSb2xlOiAgcmV0dXJuIEZlZWRsaXN0TW9kZWw6OlRhZ1RpZXI7CiAgICAgICAgICAgICAgICAg ICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUVZhcmlhbnQoKTsK ICAgICAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIGZlZWQgbm9kZQogICAgICAg IGlmICggbm9kZS0+dGllcigpID09IFRyZWVOb2RlOjpGZWVkTm9kZSApIHsKCiAgICAgICAgICAg ICAgICBpZiAoIHJvbGUgPT0gRmVlZGxpc3RNb2RlbDo6VGllclJvbGUgKSB7CiAgICAgICAgICAg ICAgICAgICAgICAgIHJldHVybiBGZWVkbGlzdE1vZGVsOjpGZWVkVGllcjsKICAgICAgICAgICAg ICAgIH0KCiAgICAgICAgICAgICAgICBRTW9kZWxJbmRleCBzdWJzID0gbV9zb3VyY2VNb2RlbC0+ aW5kZXgoIDAsIDAsIFFNb2RlbEluZGV4KCkgKTsKICAgICAgICAgICAgICAgIGludCBzb3VyY2VS b3cgPSBtX2NvbGxlY3Rpb25zLmluZGV4T2YoIG5vZGUtPmNvbGxlY3Rpb24oKSApOwogICAgICAg ICAgICAgICAgUU1vZGVsSW5kZXggc291cmNlSW5kZXggPSBtX3NvdXJjZU1vZGVsLT5pbmRleCgg c291cmNlUm93LCAwLCBzdWJzICk7CgogICAgICAgICAgICAgICAgaWYgKCByb2xlID09IFF0OjpE aXNwbGF5Um9sZSB8fCByb2xlID09IEZlZWRsaXN0TW9kZWw6OlhtbFVybFJvbGUgfHwKICAgICAg ICAgICAgICAgICAgICAgcm9sZSA9PSBGZWVkbGlzdE1vZGVsOjpIdG1sVXJsUm9sZSB8fCByb2xl ID09IEZlZWRsaXN0TW9kZWw6OkRlc2NyaXB0aW9uUm9sZSApIHsKICAgICAgICAgICAgICAgICAg ICAgICAgY29uc3QgQWtvbmFkaTo6Q29sbGVjdGlvbiBjb2wgPSBtX3NvdXJjZU1vZGVsLT5kYXRh KCBzb3VyY2VJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBa29uYWRpOjpDb2xsZWN0aW9uTW9k ZWw6OkNvbGxlY3Rpb25Sb2xlICkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU8QWtvbmFkaTo6 Q29sbGVjdGlvbj4oKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIEZlZWRQcm9wZXJ0aWVzQ29s bGVjdGlvbkF0dHJpYnV0ZSAqcHJvcHM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggY29s Lmhhc0F0dHJpYnV0ZSggIkZlZWRQcm9wZXJ0aWVzIiApICkKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBwcm9wcyA9IGNvbC5hdHRyaWJ1dGU8RmVlZFByb3BlcnRpZXNDb2xsZWN0aW9u QXR0cmlidXRlPigpOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgcmV0dXJuIFFTdHJpbmcoKTsKCiAgICAgICAgICAgICAgICAgICAg ICAgIHN3aXRjaCAoIHJvbGUgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fz ZSBRdDo6RGlzcGxheVJvbGU6ICAgICAgICAgICAgICAgICByZXR1cm4gcHJvcHMtPm5hbWUoKTsK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZlZWRsaXN0TW9kZWw6OlhtbFVy bFJvbGU6ICAgICAgIHJldHVybiBwcm9wcy0+eG1sVXJsKCk7CiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgY2FzZSBGZWVkbGlzdE1vZGVsOjpIdG1sVXJsUm9sZTogICAgICByZXR1cm4g cHJvcHMtPmh0bWxVcmwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZl ZWRsaXN0TW9kZWw6OkRlc2NyaXB0aW9uUm9sZTogIHJldHVybiBwcm9wcy0+ZGVzY3JpcHRpb24o KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHJldHVybiBRU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAg IH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCByb2xlID09IEZl ZWRsaXN0TW9kZWw6OlRhZ3NSb2xlICkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBB a29uYWRpOjpDb2xsZWN0aW9uIGNvbCA9IG1fc291cmNlTW9kZWwtPmRhdGEoIHNvdXJjZUluZGV4 LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIEFrb25hZGk6OkNvbGxlY3Rpb25Nb2RlbDo6Q29sbGVjdGlv blJvbGUgKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTxBa29uYWRpOjpDb2xsZWN0aW9uPigp OwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBjb2wuaGFzQXR0cmlidXRlKCAiVGFncyIg KSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbC5hdHRyaWJ1dGU8 VGFnc0NvbGxlY3Rpb25BdHRyaWJ1dGU+KCktPnRhZ3MoKTsKICAgICAgICAgICAgICAgICAgICAg ICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBRU3RyaW5nTGlz dCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoIHJvbGUgPT0g RmVlZGxpc3RNb2RlbDo6U3Vic2NyaXB0aW9uTGFiZWxzUm9sZSApIHsKICAgICAgICAgICAgICAg ICAgICAgICAgY29uc3QgQWtvbmFkaTo6Q29sbGVjdGlvbiBjb2wgPSBtX3NvdXJjZU1vZGVsLT5k YXRhKCBzb3VyY2VJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBa29uYWRpOjpDb2xsZWN0aW9u TW9kZWw6OkNvbGxlY3Rpb25Sb2xlICkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU8QWtvbmFk aTo6Q29sbGVjdGlvbj4oKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggY29sLmhhc0F0 dHJpYnV0ZSggIlN1YnNjcmlwdGlvbkxhYmVscyIgKSApCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcmV0dXJuIGNvbC5hdHRyaWJ1dGU8U3Vic2NyaXB0aW9uTGFiZWxzQ29sbGVjdGlv bkF0dHJpYnV0ZT4oKS0+c3Vic2NyaXB0aW9uTGFiZWxzKCk7CiAgICAgICAgICAgICAgICAgICAg ICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUVN0cmluZ0xp c3QoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAg ICAgICAgICAgICAgcmV0dXJuIG1fc291cmNlTW9kZWwtPmRhdGEoIHNvdXJjZUluZGV4LCByb2xl ICk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gUVZhcmlhbnQoKTsKfQoKUU1vZGVsSW5kZXgg RmVlZGxpc3RNb2RlbDo6aW5kZXgoIGludCByb3csIGludCBjb2x1bW4sIGNvbnN0IFFNb2RlbElu ZGV4ICZwYXJlbnQgKSBjb25zdAp7CiAgICAgICAgaWYgKCByb3cgPCAwIHx8IGNvbHVtbiA8IDAg KQogICAgICAgICAgICAgICAgcmV0dXJuIFFNb2RlbEluZGV4KCk7CgogICAgICAgIC8vIGNyZWF0 ZSBpbmRleCBmb3IgYSB0YWcgbm9kZQogICAgICAgIGlmICggIXBhcmVudC5pc1ZhbGlkKCkgKSB7 CiAgICAgICAgICAgICAgICBpZiAoIHJvdyA8IG1fcm9vdE5vZGUtPmNvdW50KCkgJiYgY29sdW1u ID09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbmRleCggcm93 LCAwLCBtX3Jvb3ROb2RlLT5jaGlsZEF0KCByb3cgKSApOwogICAgICAgICAgICAgICAgfQogICAg ICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBRTW9kZWxJ bmRleCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgVHJlZU5vZGUgKm5v ZGUgPSBzdGF0aWNfY2FzdDxUcmVlTm9kZSo+KCBwYXJlbnQuaW50ZXJuYWxQb2ludGVyKCkgKTsK ICAgICAgICBpZiAoIHJvdyA8IG5vZGUtPmNvdW50KCkgJiYgY29sdW1uID09IDAgKSB7CiAgICAg ICAgICAgICAgICBUcmVlTm9kZSAqY2hpbGQgPSBub2RlLT5jaGlsZEF0KCByb3cgKTsKICAgICAg ICAgICAgICAgIHJldHVybiBjcmVhdGVJbmRleCggcm93LCAwLCBjaGlsZCApOwogICAgICAgIH0K ICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBRTW9kZWxJbmRleCgpOwogICAg ICAgIH0KfQoKUU1vZGVsSW5kZXggRmVlZGxpc3RNb2RlbDo6cGFyZW50KCBjb25zdCBRTW9kZWxJ bmRleCAmaW5kZXggKSBjb25zdAp7CiAgICAgICAgaWYgKCAhaW5kZXguaXNWYWxpZCgpICkKICAg ICAgICAgICAgICAgIHJldHVybiBRTW9kZWxJbmRleCgpOwoKICAgICAgICBUcmVlTm9kZSAqbm9k ZSA9IHN0YXRpY19jYXN0PFRyZWVOb2RlKj4oIGluZGV4LmludGVybmFsUG9pbnRlcigpICk7Cgog ICAgICAgIGlmICggbm9kZS0+dGllcigpID09IFRyZWVOb2RlOjpUYWdOb2RlICkgewogICAgICAg ICAgICAgICAgcmV0dXJuIFFNb2RlbEluZGV4KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYg KCBub2RlLT50aWVyKCkgPT0gVHJlZU5vZGU6OkZlZWROb2RlICkgewogICAgICAgICAgICAgICAg VHJlZU5vZGUgKnBhcmVudE5vZGUgPSBub2RlLT5wYXJlbnQoKTsKICAgICAgICAgICAgICAgIHJl dHVybiBjcmVhdGVJbmRleCggbV9yb290Tm9kZS0+Y2hpbGRSb3coIHBhcmVudE5vZGUgKSwgMCwg cGFyZW50Tm9kZSApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFFNb2RlbEluZGV4KCk7Cn0K CnZvaWQgRmVlZGxpc3RNb2RlbDo6c2xvdERhdGFDaGFuZ2VkKCBjb25zdCBRTW9kZWxJbmRleCAm c3RhcnQsIGNvbnN0IFFNb2RlbEluZGV4ICZlbmQgKQp7CiAgICAgICAgUU1vZGVsSW5kZXggc3Vi cyA9IG1fc291cmNlTW9kZWwtPmluZGV4KCAwLCAwLCBRTW9kZWxJbmRleCgpICk7CiAgICAgICAg aWYgKCBzdGFydC5wYXJlbnQoKSAhPSBlbmQucGFyZW50KCkgfHwgc3RhcnQucGFyZW50KCkgIT0g c3VicyApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIEZJ WE1FOiBpdGVyYXRlIG92ZXIgdGhlIGluZGV4ZXMKICAgICAgICBpZiAoIHN0YXJ0ICE9IGVuZCAp IHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIEFrb25hZGk6OkNv bGxlY3Rpb24gY29sID0gbV9zb3VyY2VNb2RlbC0+ZGF0YSggc3RhcnQsIEFrb25hZGk6OkNvbGxl Y3Rpb25Nb2RlbDo6Q29sbGVjdGlvblJvbGUgKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTxBa29uYWRpOjpDb2xsZWN0aW9uPigpOwog ICAgICAgIFFTdHJpbmdMaXN0IG5ld1RhZ3M7CiAgICAgICAgaWYgKCBjb2wuaGFzQXR0cmlidXRl KCAiVGFncyIgKSApIHsKICAgICAgICAgICAgICAgIG5ld1RhZ3MgPSBjb2wuYXR0cmlidXRlPFRh Z3NDb2xsZWN0aW9uQXR0cmlidXRlPigpLT50YWdzKCk7CiAgICAgICAgICAgICAgICBpZiAoIG5l d1RhZ3MuaXNFbXB0eSgpICkgewogICAgICAgICAgICAgICAgICAgICAgIG5ld1RhZ3MgPDwgbV9h bGxGZWVkc1RhZzsKICAgICAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAg ICAgICAgICAgICAgICBuZXdUYWdzIDw8IG1fYWxsRmVlZHNUYWc7CiAgICAgICAgfQogICAgICAg IFFTdHJpbmdMaXN0IG9sZFRhZ3MgPSBsb29rdXBUYWdzKCBjb2wuaWQoKSApOwogICAgICAgIGtE ZWJ1ZygpIDw8ICJOZXcgdGFnczoiIDw8IG5ld1RhZ3M7CiAgICAgICAga0RlYnVnKCkgPDwgIk9s ZCB0YWdzOiIgPDwgb2xkVGFnczsKICAgICAgICBRU2V0PFFTdHJpbmc+IGNvbW1vbiA9IG9sZFRh Z3MudG9TZXQoKS5pbnRlcnNlY3QoIG5ld1RhZ3MudG9TZXQoKSApOwogICAgICAgIFFTZXQ8UVN0 cmluZz4gdG9SZW1vdmUgPSBvbGRUYWdzLnRvU2V0KCkuc3VidHJhY3QoIG5ld1RhZ3MudG9TZXQo KSApOwogICAgICAgIFFTZXQ8UVN0cmluZz4gdG9BZGQgPSBuZXdUYWdzLnRvU2V0KCkuc3VidHJh Y3QoIG9sZFRhZ3MudG9TZXQoKSApOwogICAgICAgIGtEZWJ1ZygpIDw8ICJjb21tb246IiA8PCBj b21tb247CiAgICAgICAga0RlYnVnKCkgPDwgInRvIHJlbW92ZToiIDw8IHRvUmVtb3ZlOwogICAg ICAgIGtEZWJ1ZygpIDw8ICJ0byBhZGQ6IiA8PCB0b0FkZDsKCiAgICAgICAgLy8gY2hlY2sgd2hl dGhlciB0aGlzIGZlZWQgaGFzIG5vIHRhZ3Mgbm93CiAgICAgICAgaWYgKCBjb21tb24uY291bnQo KSA9PSAwICYmIHRvQWRkLmNvdW50KCkgPT0gMCApIHsKICAgICAgICAgICAgICAgIHRvQWRkIDw8 IG1fYWxsRmVlZHNUYWc7CiAgICAgICAgfQoKICAgICAgICAvLyB1cGRhdGVkIHRoZSBmZWVkIG5v ZGVzIHVuZGVyIHRoZSAnY29tbW9uJyB0YWdzCiAgICAgICAgUV9GT1JFQUNIKCBjb25zdCBRU3Ry aW5nICZ0YWcsIGNvbW1vbiApIHsKICAgICAgICAgICAgICAgIFRyZWVOb2RlICpmZWVkTm9kZSA9 IGxvb2t1cEZlZWROb2RlKCBjb2wuaWQoKSwgdGFnICk7CiAgICAgICAgICAgICAgICBRTW9kZWxJ bmRleCBmZWVkSW5kZXggPSBjcmVhdGVJbmRleCggZmVlZE5vZGUtPnJvdygpLCAwLCBmZWVkTm9k ZSApOwogICAgICAgICAgICAgICAgZW1pdCBkYXRhQ2hhbmdlZCggZmVlZEluZGV4LCBmZWVkSW5k ZXggKTsKCiAgICAgICAgICAgICAgICAvLyBIQUNLOiB1cGRhdGUgdGhlIHRhZyBub2RlIHRvIHRy aWdnZXIgdXBkYXRlcwogICAgICAgICAgICAgICAgLy8gaW4gRmVlZGxpc3RGaWx0ZXJQcm94eU1v ZGVsCiAgICAgICAgICAgICAgICBlbWl0IGRhdGFDaGFuZ2VkKCBmZWVkSW5kZXgucGFyZW50KCks IGZlZWRJbmRleC5wYXJlbnQoKSApOwogICAgICAgIH0KCiAgICAgICAgLy8gcmVtb3ZlIHRoZSBm ZWVkIG5vZGVzIGZyb20gdGhlICd0b1JlbW92ZScgdGFncwogICAgICAgIFFfRk9SRUFDSCggY29u c3QgUVN0cmluZyAmdGFnLCB0b1JlbW92ZSApIHsKICAgICAgICAgICAgICAgIFRyZWVOb2RlICpm ZWVkTm9kZSA9IGxvb2t1cEZlZWROb2RlKCBjb2wuaWQoKSwgdGFnICk7CiAgICAgICAgICAgICAg ICBUcmVlTm9kZSAqdGFnTm9kZSA9IGZlZWROb2RlLT5wYXJlbnQoKTsKICAgICAgICAgICAgICAg IGludCB0YWdyb3cgPSB0YWdOb2RlLT5yb3coKTsKICAgICAgICAgICAgICAgIFFNb2RlbEluZGV4 IHRhZ0luZGV4ID0gY3JlYXRlSW5kZXgoIHRhZ3JvdywgMCwgdGFnTm9kZSApOwogICAgICAgICAg ICAgICAgaW50IGZlZWRyb3cgPSBmZWVkTm9kZS0+cm93KCk7CiAgICAgICAgICAgICAgICBiZWdp blJlbW92ZVJvd3MoIHRhZ0luZGV4LCBmZWVkcm93LCBmZWVkcm93ICk7CiAgICAgICAgICAgICAg ICB0YWdOb2RlLT5yZW1vdmVDaGlsZEF0KCBmZWVkcm93ICk7CiAgICAgICAgICAgICAgICBtX2Zl ZWROb2Rlc1sgY29sLmlkKCkgXS5yZW1vdmVBbGwoIGZlZWROb2RlICk7CiAgICAgICAgICAgICAg ICBlbmRSZW1vdmVSb3dzKCk7CgogICAgICAgICAgICAgICAgLy8gSEFDSzogdXBkYXRlIHRoZSB0 YWcgbm9kZSB0byB0cmlnZ2VyIHVwZGF0ZXMKICAgICAgICAgICAgICAgIC8vIGluIEZlZWRsaXN0 RmlsdGVyUHJveHlNb2RlbAogICAgICAgICAgICAgICAgZW1pdCBkYXRhQ2hhbmdlZCggdGFnSW5k ZXgsIHRhZ0luZGV4ICk7CgogICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gZmVlZCBu b2RlcyB1bmRlciB0aGlzIHRhZyBhbnltb3JlIHJlbW92ZSBpdAogICAgICAgICAgICAgICAgaWYg KCB0YWdOb2RlLT5jb3VudCgpID09IDAgJiYgdGFnTm9kZS0+bmFtZSgpICE9IG1fYWxsRmVlZHNU YWcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luUmVtb3ZlUm93cyggUU1vZGVsSW5k ZXgoKSwgdGFncm93LCB0YWdyb3cgKTsKICAgICAgICAgICAgICAgICAgICAgICAgbV9yb290Tm9k ZS0+cmVtb3ZlQ2hpbGRBdCggdGFncm93ICk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1fdGFn Tm9kZXMucmVtb3ZlKCB0YWcgKTsKICAgICAgICAgICAgICAgICAgICAgICAgZW5kUmVtb3ZlUm93 cygpOwogICAgICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gYWRkIG5ldyBmZWVk IG5vZGVzIHVuZGVyIHRoZSAndG9BZGQnIHRhZ3MKICAgICAgICBRX0ZPUkVBQ0goIGNvbnN0IFFT dHJpbmcgJnRhZywgdG9BZGQgKSB7CiAgICAgICAgICAgICAgICBUcmVlTm9kZSAqdGFnTm9kZTsK ICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIHN1Y2ggYSB0YWcgeWV0IGFkZCBhIG5l dyB0YWcgbm9kZQogICAgICAgICAgICAgICAgaWYgKCAhbV90YWdOb2Rlcy5jb250YWlucyggdGFn ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YWdyb3cgPSBtX3Jvb3ROb2RlLT5j b3VudCgpOwogICAgICAgICAgICAgICAgICAgICAgICBiZWdpbkluc2VydFJvd3MoIFFNb2RlbElu ZGV4KCksIHRhZ3JvdywgdGFncm93ICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ05vZGUg PSBuZXcgVHJlZU5vZGUoIFRyZWVOb2RlOjpUYWdOb2RlLCB0YWcsIG1fcm9vdE5vZGUgKTsKICAg ICAgICAgICAgICAgICAgICAgICAgbV9yb290Tm9kZS0+YXBwZW5kQ2hpbGQoIHRhZ05vZGUgKTsK ICAgICAgICAgICAgICAgICAgICAgICAgbV90YWdOb2Rlc1sgdGFnIF0gPSB0YWdOb2RlOwogICAg ICAgICAgICAgICAgICAgICAgICBlbmRJbnNlcnRSb3dzKCk7CiAgICAgICAgICAgICAgICAgICAg ICAgIC8vZHVtcCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAg ICAgICAgICAgICAgICAgICAgICAgIHRhZ05vZGUgPSBtX3RhZ05vZGVzWyB0YWcgXTsKICAgICAg ICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBRTW9kZWxJbmRleCB0YWdJbmRleCA9IGNyZWF0 ZUluZGV4KCB0YWdOb2RlLT5yb3coKSwgMCwgdGFnTm9kZSApOwogICAgICAgICAgICAgICAgaW50 IGZlZWRyb3cgPSB0YWdOb2RlLT5jb3VudCgpOwogICAgICAgICAgICAgICAgYmVnaW5JbnNlcnRS b3dzKCB0YWdJbmRleCwgZmVlZHJvdywgZmVlZHJvdyApOwogICAgICAgICAgICAgICAgVHJlZU5v ZGUgKmZlZWROb2RlID0gbmV3IFRyZWVOb2RlKCBUcmVlTm9kZTo6RmVlZE5vZGUsIGNvbC5pZCgp LCB0YWdOb2RlICk7CiAgICAgICAgICAgICAgICB0YWdOb2RlLT5hcHBlbmRDaGlsZCggZmVlZE5v ZGUgKTsKICAgICAgICAgICAgICAgIG1fZmVlZE5vZGVzWyBjb2wuaWQoKSBdLmFwcGVuZCggZmVl ZE5vZGUgKTsKICAgICAgICAgICAgICAgIGVuZEluc2VydFJvd3MoKTsKCiAgICAgICAgICAgICAg ICAvLyBIQUNLOiB1cGRhdGUgdGhlIHRhZyBub2RlIHRvIHRyaWdnZXIgdXBkYXRlcwogICAgICAg ICAgICAgICAgLy8gaW4gRmVlZGxpc3RGaWx0ZXJQcm94eU1vZGVsCiAgICAgICAgICAgICAgICBl bWl0IGRhdGFDaGFuZ2VkKCB0YWdJbmRleCwgdGFnSW5kZXggKTsKICAgICAgICB9CgogICAgICAg IC8vZHVtcCgpOwp9Cgp2b2lkIEZlZWRsaXN0TW9kZWw6OnNsb3RSb3dzSW5zZXJ0ZWQoIGNvbnN0 IFFNb2RlbEluZGV4ICZwYXJlbnQsIGludCBzdGFydCwgaW50IGVuZCApCnsKICAgICAgICAvLyBh IHJvb3Qgbm9kZSBoYXMgYmVlbiBhZGRlZAogICAgICAgIGlmICggIXBhcmVudC5pc1ZhbGlkKCkg KSB7CiAgICAgICAgICAgICAgICBRTW9kZWxJbmRleCByb290SW5kZXggPSBtX3NvdXJjZU1vZGVs LT5pbmRleCggMCwgMCwgcGFyZW50ICk7CiAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBtX3Nv dXJjZU1vZGVsLT5yb3dDb3VudCggcm9vdEluZGV4ICk7CiAgICAgICAgICAgICAgICBmb3IgKCBp bnQgaSA9IDA7IGkgPCBjb3VudDsgKytpICkgewogICAgICAgICAgICAgICAgICAgICAgICBRTW9k ZWxJbmRleCBjaGlsZCA9IG1fc291cmNlTW9kZWwtPmluZGV4KCBpLCAwLCByb290SW5kZXggKTsK ICAgICAgICAgICAgICAgICAgICAgICAgYWRkRmVlZE5vZGUoIGNoaWxkICk7CiAgICAgICAgICAg ICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIGEgZmVlZCBub2RlIGhhcyBiZWVuIGFkZGVkCiAg ICAgICAgZWxzZSBpZiAoIHBhcmVudCA9PSBtX3NvdXJjZU1vZGVsLT5pbmRleCggMCwgMCwgUU1v ZGVsSW5kZXgoKSApICkgewogICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSBzdGFydDsgaSA8 PSBlbmQ7ICsraSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgUU1vZGVsSW5kZXggY2hpbGQg PSBtX3NvdXJjZU1vZGVsLT5pbmRleCggaSwgMCwgcGFyZW50ICk7CiAgICAgICAgICAgICAgICAg ICAgICAgIGFkZEZlZWROb2RlKCBjaGlsZCApOwogICAgICAgICAgICAgICAgfQogICAgICAgIH0K CiAgICAgICAgLy9kdW1wKCk7Cn0KCnZvaWQgRmVlZGxpc3RNb2RlbDo6c2xvdFJvd3NSZW1vdmVk KCBjb25zdCBRTW9kZWxJbmRleCAmcGFyZW50LCBpbnQgc3RhcnQsIGludCBlbmQgKQp7CiAgICAg ICAgLy8gRklYTUU6IHRoaXMgc2xvdCBhY3R1YWxseSBzaG91bGQgYmUgbW9yZSBnZW5lcmljCiAg ICAgICAgUV9VTlVTRUQoIGVuZCApCgogICAgICAgIFFNb2RlbEluZGV4IHN1YnMgPSBtX3NvdXJj ZU1vZGVsLT5pbmRleCggMCwgMCwgUU1vZGVsSW5kZXgoKSApOwogICAgICAgIGlmICggcGFyZW50 ICE9IHN1YnMgKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBB a29uYWRpOjpDb2xsZWN0aW9uOjpJZCBjb2wgPSBtX2NvbGxlY3Rpb25zWyBzdGFydCBdOwogICAg ICAgIFFMaXN0PFRyZWVOb2RlKj4gZmVlZE5vZGVzID0gbV9mZWVkTm9kZXNbIGNvbCBdOwoKICAg ICAgICAvLyByZW1vdmUgdGhlIGZlZWQgbm9kZXMKICAgICAgICBRX0ZPUkVBQ0goIFRyZWVOb2Rl ICpmZWVkTm9kZSwgZmVlZE5vZGVzICkgewogICAgICAgICAgICAgICAgVHJlZU5vZGUgKnRhZ05v ZGUgPSBmZWVkTm9kZS0+cGFyZW50KCk7CiAgICAgICAgICAgICAgICBpbnQgdGFncm93ID0gdGFn Tm9kZS0+cm93KCk7CiAgICAgICAgICAgICAgICBRTW9kZWxJbmRleCB0YWdJbmRleCA9IGNyZWF0 ZUluZGV4KCB0YWdyb3csIDAsIHRhZ05vZGUgKTsKICAgICAgICAgICAgICAgIGludCBmZWVkcm93 ID0gZmVlZE5vZGUtPnJvdygpOwogICAgICAgICAgICAgICAgYmVnaW5SZW1vdmVSb3dzKCB0YWdJ bmRleCwgZmVlZHJvdywgZmVlZHJvdyApOwogICAgICAgICAgICAgICAgdGFnTm9kZS0+cmVtb3Zl Q2hpbGRBdCggZmVlZHJvdyApOwogICAgICAgICAgICAgICAgbV9mZWVkTm9kZXNbIGNvbCBdLnJl bW92ZUFsbCggZmVlZE5vZGUgKTsKICAgICAgICAgICAgICAgIGVuZFJlbW92ZVJvd3MoKTsKCiAg ICAgICAgICAgICAgICAvLyBIQUNLOiB1cGRhdGUgdGhlIHRhZyBub2RlIHRvIHRyaWdnZXIgdXBk YXRlcwogICAgICAgICAgICAgICAgLy8gaW4gRmVlZGxpc3RGaWx0ZXJQcm94eU1vZGVsCiAgICAg ICAgICAgICAgICBlbWl0IGRhdGFDaGFuZ2VkKCB0YWdJbmRleCwgdGFnSW5kZXggKTsKCiAgICAg ICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyBmZWVkIG5vZGVzIHVuZGVyIHRoaXMgdGFnIGFu eW1vcmUgcmVtb3ZlIGl0CiAgICAgICAgICAgICAgICBpZiAoIHRhZ05vZGUtPmNvdW50KCkgPT0g MCAmJiB0YWdOb2RlLT5uYW1lKCkgIT0gbV9hbGxGZWVkc1RhZyApIHsKICAgICAgICAgICAgICAg ICAgICAgICAgYmVnaW5SZW1vdmVSb3dzKCBRTW9kZWxJbmRleCgpLCB0YWdyb3csIHRhZ3JvdyAp OwogICAgICAgICAgICAgICAgICAgICAgICBtX3RhZ05vZGVzLnJlbW92ZSggdGFnTm9kZS0+bmFt ZSgpICk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1fcm9vdE5vZGUtPnJlbW92ZUNoaWxkQXQo IHRhZ3JvdyApOwogICAgICAgICAgICAgICAgICAgICAgICBlbmRSZW1vdmVSb3dzKCk7CiAgICAg ICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBtX2NvbGxlY3Rpb25zLnJlbW92ZUFsbCgg Y29sICk7CiAgICAgICAgLy9kdW1wKCk7Cn0KCnZvaWQgRmVlZGxpc3RNb2RlbDo6ZHVtcCgpIGNv bnN0CnsKICAgICAgICBrRGVidWcoKSA8PCAiQWxsIGNvbGxlY3Rpb25zIiA8PCBtX2NvbGxlY3Rp b25zOwoKICAgICAgICBrRGVidWcoKSA8PCAiRmVlZCBub2RlcyBieSBjb2xsZWN0aW9uczoiOwog ICAgICAgIFFIYXNoSXRlcmF0b3I8QWtvbmFkaTo6Q29sbGVjdGlvbjo6SWQsIFFMaXN0PFRyZWVO b2RlKj4gPiBpdF9jb2woIG1fZmVlZE5vZGVzICk7CiAgICAgICAgd2hpbGUgKCBpdF9jb2wuaGFz TmV4dCgpICkgewogICAgICAgICAgICAgICAgaXRfY29sLm5leHQoKTsKICAgICAgICAgICAgICAg IGtEZWJ1ZygpIDw8ICJDb2w6IiA8PCBpdF9jb2wua2V5KCkgPDwgIiwgZmVlZCBub2RlczoiIDw8 IGl0X2NvbC52YWx1ZSgpOwogICAgICAgIH0KCiAgICAgICAga0RlYnVnKCkgPDwgIlRhZyBub2Rl cyBieSB0YWdzOiI7CiAgICAgICAgUUhhc2hJdGVyYXRvcjxRU3RyaW5nLCBUcmVlTm9kZSo+IGl0 X3RhZyggbV90YWdOb2RlcyApOwogICAgICAgIHdoaWxlICggaXRfdGFnLmhhc05leHQoKSApIHsK ICAgICAgICAgICAgICAgIGl0X3RhZy5uZXh0KCk7CiAgICAgICAgICAgICAgICBrRGVidWcoKSA8 PCAiVGFnOiIgPDwgaXRfdGFnLmtleSgpIDw8ICIsIHRhZyBub2RlczogIiA8PCBpdF90YWcudmFs dWUoKTsKICAgICAgICB9CgogICAgICAgIG1fcm9vdE5vZGUtPmR1bXAoKTsKfQoKUUxpc3Q8UU1v ZGVsSW5kZXg+IEZlZWRsaXN0TW9kZWw6OmZlZWRJbmRleGVzKCBjb25zdCBBa29uYWRpOjpDb2xs ZWN0aW9uOjpJZCAmY29sICkgY29uc3QKewogICAgICAgIFFMaXN0PFFNb2RlbEluZGV4PiBmZWVk SW5kZXhlc0xpc3Q7CgogICAgICAgIFFMaXN0PFRyZWVOb2RlKj4gZmVlZE5vZGVzID0gbV9mZWVk Tm9kZXNbIGNvbCBdOwogICAgICAgIFFfRk9SRUFDSCggVHJlZU5vZGUgKmZlZWROb2RlLCBmZWVk Tm9kZXMgKSB7CiAgICAgICAgICAgICAgICBmZWVkSW5kZXhlc0xpc3QgPDwgY3JlYXRlSW5kZXgg KCBmZWVkTm9kZS0+cm93KCksIDAsIGZlZWROb2RlICk7CiAgICAgICAgfQoKICAgICAgICByZXR1 cm4gZmVlZEluZGV4ZXNMaXN0Owp9CgoKUVN0cmluZ0xpc3QgRmVlZGxpc3RNb2RlbDo6bG9va3Vw VGFncyggY29uc3QgQWtvbmFkaTo6Q29sbGVjdGlvbjo6SWQgJmlkICkgY29uc3QKewogICAgICAg IFFMaXN0PFRyZWVOb2RlKj4gZmVlZE5vZGVzID0gbV9mZWVkTm9kZXNbIGlkIF07CiAgICAgICAg UVN0cmluZ0xpc3QgdGFnczsKICAgICAgICBRX0ZPUkVBQ0goIGNvbnN0IFRyZWVOb2RlICpmZWVk Tm9kZSwgZmVlZE5vZGVzICkgewogICAgICAgICAgICAgICAgdGFncyA8PCBmZWVkTm9kZS0+cGFy ZW50KCktPm5hbWUoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0YWdzOwp9CgpUcmVlTm9k ZSogRmVlZGxpc3RNb2RlbDo6bG9va3VwRmVlZE5vZGUoIGNvbnN0IEFrb25hZGk6OkNvbGxlY3Rp b246OklkICZpZCwgY29uc3QgUVN0cmluZyAmdGFnICkgY29uc3QKewogICAgICAgIFRyZWVOb2Rl ICp0YWdOb2RlID0gbV90YWdOb2Rlc1sgdGFnIF07CiAgICAgICAgUUxpc3Q8VHJlZU5vZGUqPiBm ZWVkTm9kZXMgPSBtX2ZlZWROb2Rlc1sgaWQgXTsKICAgICAgICBRX0ZPUkVBQ0goIFRyZWVOb2Rl ICpmZWVkTm9kZSwgZmVlZE5vZGVzICkgewogICAgICAgICAgICAgICAgaWYgKCBmZWVkTm9kZS0+ cGFyZW50KCkgPT0gdGFnTm9kZSApCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmZWVk Tm9kZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAwOwp9Cgp2b2lkIEZlZWRsaXN0TW9kZWw6 OmFkZEZlZWROb2RlKCBjb25zdCBRTW9kZWxJbmRleCAmc291cmNlSW5kZXggKQp7CiAgICAgICAg Ly8gRklYTUU6IGRvZXNuJ3Qgc3VwcG9ydCBpbnNlcnRpbmcgYSBuZXcgbm9kZSBiZXR3ZWVuIGV4 aXN0aW5nIG9uZXMKICAgICAgICAvLyBidXQgYWtvbmFkaSBzZWVtIHRvIF9hcHBlbmRfIGEgbmV3 IG5vZGUgc28gdGhhdCdzIG5vdCBnb2luZwogICAgICAgIC8vIHRvIGJlIGEgcHJvYmxlbSBmb3Ig bm93CiAgICAgICAgY29uc3QgQWtvbmFkaTo6Q29sbGVjdGlvbiBjb2wgPSBtX3NvdXJjZU1vZGVs LT5kYXRhKCBzb3VyY2VJbmRleCwgQWtvbmFkaTo6Q29sbGVjdGlvbk1vZGVsOjpDb2xsZWN0aW9u Um9sZSApLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB2YWx1ZTxBa29uYWRpOjpDb2xsZWN0aW9uPigpOwogICAgICAgIFFTdHJpbmdM aXN0IGZlZWRUYWdzOwogICAgICAgIGlmICggY29sLmhhc0F0dHJpYnV0ZSggIlRhZ3MiICkgKSB7 CiAgICAgICAgICAgICAgICBmZWVkVGFncyA9IGNvbC5hdHRyaWJ1dGU8VGFnc0NvbGxlY3Rpb25B dHRyaWJ1dGU+KCktPnRhZ3MoKTsKICAgICAgICAgICAgICAgIGlmICggZmVlZFRhZ3MuaXNFbXB0 eSgpICkgewogICAgICAgICAgICAgICAgICAgICAgICBmZWVkVGFncyA8PCBtX2FsbEZlZWRzVGFn OwogICAgICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAg ICAgIGZlZWRUYWdzIDw8IG1fYWxsRmVlZHNUYWc7CiAgICAgICAgfQoKICAgICAgICBtX2NvbGxl Y3Rpb25zIDw8IGNvbC5pZCgpOwogICAgICAgIFFfRk9SRUFDSCggY29uc3QgUVN0cmluZyAmdGFn LCBmZWVkVGFncyApIHsKICAgICAgICAgICAgICAgIFRyZWVOb2RlICp0YWdOb2RlOwogICAgICAg ICAgICAgICAgaWYgKCBtX3RhZ05vZGVzLmNvbnRhaW5zKCB0YWcgKSApIHsKICAgICAgICAgICAg ICAgICAgICAgICAgdGFnTm9kZSA9IG1fdGFnTm9kZXNbIHRhZyBdOwogICAgICAgICAgICAgICAg fQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YWdy b3cgPSBtX3Jvb3ROb2RlLT5jb3VudCgpOwogICAgICAgICAgICAgICAgICAgICAgICBiZWdpbklu c2VydFJvd3MoIFFNb2RlbEluZGV4KCksIHRhZ3JvdywgdGFncm93ICk7CiAgICAgICAgICAgICAg ICAgICAgICAgIHRhZ05vZGUgPSBuZXcgVHJlZU5vZGUoIFRyZWVOb2RlOjpUYWdOb2RlLCB0YWcs IG1fcm9vdE5vZGUgKTsKICAgICAgICAgICAgICAgICAgICAgICAgbV9yb290Tm9kZS0+YXBwZW5k Q2hpbGQoIHRhZ05vZGUgKTsKICAgICAgICAgICAgICAgICAgICAgICAgbV90YWdOb2Rlc1sgdGFn IF0gPSB0YWdOb2RlOwogICAgICAgICAgICAgICAgICAgICAgICBlbmRJbnNlcnRSb3dzKCk7CiAg ICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgUU1vZGVsSW5kZXggdGFnSW5kZXggPSBj cmVhdGVJbmRleCggdGFnTm9kZS0+cm93KCksIDAsIHRhZ05vZGUgKTsKICAgICAgICAgICAgICAg IGludCBmZWVkcm93ID0gdGFnTm9kZS0+Y291bnQoKTsKICAgICAgICAgICAgICAgIGJlZ2luSW5z ZXJ0Um93cyggdGFnSW5kZXgsIGZlZWRyb3csIGZlZWRyb3cgKTsKICAgICAgICAgICAgICAgIFRy ZWVOb2RlICpmZWVkTm9kZSA9IG5ldyBUcmVlTm9kZSggVHJlZU5vZGU6OkZlZWROb2RlLCBjb2wu aWQoKSwgdGFnTm9kZSApOwogICAgICAgICAgICAgICAgdGFnTm9kZS0+YXBwZW5kQ2hpbGQoIGZl ZWROb2RlICk7CiAgICAgICAgICAgICAgICBtX2ZlZWROb2Rlc1sgY29sLmlkKCkgXS5hcHBlbmQo IGZlZWROb2RlICk7CiAgICAgICAgICAgICAgICBlbmRJbnNlcnRSb3dzKCk7CgogICAgICAgICAg ICAgICAgLy8gSEFDSzogdXBkYXRlIHRoZSB0YWcgbm9kZSB0byB0cmlnZ2VyIHVwZGF0ZXMKICAg ICAgICAgICAgICAgIC8vIGluIEZlZWRsaXN0RmlsdGVyUHJveHlNb2RlbAogICAgICAgICAgICAg ICAgZW1pdCBkYXRhQ2hhbmdlZCggdGFnSW5kZXgsIHRhZ0luZGV4ICk7CiAgICAgICAgfQp9Cgoj aW5jbHVkZSAiZmVlZGxpc3Rtb2RlbC5tb2MiCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa3Jzcy9rcnNzcmVhZGVyL2tyc3NyZWFk ZXJ1aS5yYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAADAwMDA2NDQAMDAwMTc1MAAwMDAxNzUwADAwMDAwMDAxMTIxADEx MDI1NzAxNzc1ADAxNjYwMgAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAB1c3RhciAgAHZvbmFtaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdm9uYW1pAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IURPQ1RZUEUga3BhcnRndWkgU1lTVEVN ICJrcGFydGd1aS5kdGQiPgo8a3BhcnRndWkgbmFtZT0ia3Jzc3JlYWRlciIgdmVyc2lvbj0iMSI+ CiAgPE1lbnVCYXI+CiAgICA8TWVudSBuYW1lPSJmaWxlIiA+CiAgICAgIDxUZXh0PiBGaWxlIDwv VGV4dD4KICAgICAgPEFjdGlvbiBuYW1lPSJrcnNzcmVhZGVyX21hbmFnZV9zdWJzY3JpcHRpb25z IiAvPgogICAgPC9NZW51PgogICAgPE1lbnUgbmFtZT0iZmVlZCIgPgogICAgICA8VGV4dD4gRmVl ZCA8L1RleHQ+CiAgICAgIDxBY3Rpb24gbmFtZT0ia3Jzc3JlYWRlcl9mZWVkX2NyZWF0ZSIgLz4K ICAgICAgPEFjdGlvbiBuYW1lPSJrcnNzcmVhZGVyX2ZlZWRfc3luYyIgLz4KICAgICAgPEFjdGlv biBuYW1lPSJrcnNzcmVhZGVyX2ZlZWRfcHJvcGVydGllcyIgLz4KICAgICAgPEFjdGlvbiBuYW1l PSJrcnNzcmVhZGVyX2ZlZWRfZGVsZXRlIiAvPgogICAgICA8QWN0aW9uIG5hbWU9Imtyc3NyZWFk ZXJfZmVlZF9hdHRhY2huZXd0YWciIC8+CiAgICAgIDxBY3Rpb24gbmFtZT0ia3Jzc3JlYWRlcl9m ZWVkX2RldGFjaHRhZyIgLz4KICAgIDwvTWVudT4KICA8L01lbnVCYXI+Cjwva3BhcnRndWk+CgAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa3Jzcy9rcnNzcmVhZGVyL2ZlZWRsaXN0Zmls dGVycHJveHltb2RlbC5jcHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAADAwMDA2NDQAMDAwMTc1MAAwMDAxNzUwADAwMDAwMDA0NjM0ADExMDI1 NzAxNzc1ADAyMTQyMQAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAB1c3RhciAgAHZvbmFtaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdm9uYW1pAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvKgogICAgQ29weXJpZ2h0IChDKSAyMDA4ICAg IERtaXRyeSBJdmFub3YgPHZvbmFtaUBnbWFpbC5jb20+CgogICAgVGhpcyBwcm9ncmFtIGlzIGZy ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgIGl0 IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVi bGlzaGVkIGJ5CiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lv biAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVy c2lvbi4KCiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp dCB3aWxsIGJlIHVzZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgICBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZl ZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgICBhbG9uZyB3aXRo IHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMv Pi4KKi8KCiNpbmNsdWRlICJmZWVkbGlzdGZpbHRlcnByb3h5bW9kZWwuaCIKCiNpbmNsdWRlIDxL RGVidWc+CiNpbmNsdWRlIDxLTG9jYWxlPgoKRmVlZGxpc3RGaWx0ZXJQcm94eU1vZGVsOjpGZWVk bGlzdEZpbHRlclByb3h5TW9kZWwoIFFPYmplY3QgKnBhcmVudCApCiAgICAgICAgOiBRU29ydEZp bHRlclByb3h5TW9kZWwoIHBhcmVudCApCnsKICAgICAgICBzZXREeW5hbWljU29ydEZpbHRlcigg dHJ1ZSApOwp9CgpGZWVkbGlzdEZpbHRlclByb3h5TW9kZWw6On5GZWVkbGlzdEZpbHRlclByb3h5 TW9kZWwoKQp7Cn0KCnZvaWQgRmVlZGxpc3RGaWx0ZXJQcm94eU1vZGVsOjpzZXRTdWJzY3JpcHRp b25MYWJlbCggY29uc3QgUVN0cmluZyAmc3Vic2NyaXB0aW9uTGFiZWwgKQp7CiAgICAgICAgbV9z dWJzY3JpcHRpb25MYWJlbCA9IHN1YnNjcmlwdGlvbkxhYmVsOwogICAgICAgIGludmFsaWRhdGVG aWx0ZXIoKTsKfQoKUVN0cmluZyBGZWVkbGlzdEZpbHRlclByb3h5TW9kZWw6OnN1YnNjcmlwdGlv bkxhYmVsKCkgY29uc3QKewogICAgICAgIHJldHVybiBtX3N1YnNjcmlwdGlvbkxhYmVsOwp9Cgpi b29sIEZlZWRsaXN0RmlsdGVyUHJveHlNb2RlbDo6ZmlsdGVyQWNjZXB0c1JvdyggaW50IHNvdXJj ZVJvdywgY29uc3QgUU1vZGVsSW5kZXggJnNvdXJjZVBhcmVudCApIGNvbnN0CnsKICAgICAgICBp ZiAoIG1fc3Vic2NyaXB0aW9uTGFiZWwuaXNFbXB0eSgpICkKICAgICAgICAgICAgICAgIHJldHVy biB0cnVlOwoKICAgICAgICBRTW9kZWxJbmRleCBzb3VyY2VJbmRleCA9IHNvdXJjZU1vZGVsKCkt PmluZGV4KCBzb3VyY2VSb3csIDAsIHNvdXJjZVBhcmVudCApOwoKICAgICAgICBpZiAoIHNvdXJj ZU1vZGVsKCktPmRhdGEoIHNvdXJjZUluZGV4LCBGZWVkbGlzdE1vZGVsOjpUaWVyUm9sZSApID09 IEZlZWRsaXN0TW9kZWw6OlRhZ1RpZXIgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHNvdXJjZU1v ZGVsKCktPnJvd0NvdW50KCBzb3VyY2VJbmRleCApID4gMCApIHsKICAgICAgICAgICAgICAgICAg ICAgICAgaW50IHJvd3MgPSBzb3VyY2VNb2RlbCgpLT5yb3dDb3VudCggc291cmNlSW5kZXggKTsK ICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgcm93czsgKytpICkg ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFNb2RlbEluZGV4IGZlZWRTb3VyY2VJ bmRleCA9IHNvdXJjZU1vZGVsKCktPmluZGV4KCBpLCAwLCBzb3VyY2VJbmRleCApOwogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc291cmNlTW9kZWwoKS0+ZGF0YSggZmVlZFNv dXJjZUluZGV4LCBGZWVkbGlzdE1vZGVsOjpTdWJzY3JpcHRpb25MYWJlbHNSb2xlICkudG9TdHJp bmdMaXN0KCkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBjb250YWlucyggbV9zdWJzY3JpcHRpb25MYWJlbCApICkKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAg ICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHNvdXJjZU1vZGVsKCktPmRhdGEoIHNvdXJjZUlu ZGV4LCBGZWVkbGlzdE1vZGVsOjpTdWJzY3JpcHRpb25MYWJlbHNSb2xlICkudG9TdHJpbmdMaXN0 KCkuY29udGFpbnMoIG1fc3Vic2NyaXB0aW9uTGFiZWwgKTsKfQoAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa3Jzcy9rcnNzcmVhZGVyL3N0YW5kYXJkYWN0aW9ubWFu YWdlci5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAADAwMDA2NDQAMDAwMTc1MAAwMDAxNzUwADAwMDAwMDA0NzUwADExMDI1NzAxNzc1 ADAyMDI2NgAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3Rh ciAgAHZvbmFtaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdm9uYW1pAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvKgogICAgQ29weXJpZ2h0IChDKSAyMDA4ICAgIERtaXRy eSBJdmFub3YgPHZvbmFtaUBnbWFpbC5jb20+CiAgICBQYXJ0IG9mIHRoZSBjb2RlIGJvcnJvd2Vk IGZyb20ga2RlcGltbGlicy9ha29uYWRpL3N0YW5kYXJkYWN0aW9ubWFuYWdlci5oCgogICAgVGhp cyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v ciBtb2RpZnkKICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGlj IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u OyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICAgKGF0IHlvdXIgb3B0aW9u KSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4g dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJS QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgICBNRVJDSEFOVEFC SUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgICBH TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgIFlvdSBzaG91 bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl CiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3Lmdu dS5vcmcvbGljZW5zZXMvPi4KKi8KCiNpZm5kZWYgS1JTU1JFQURFUl9TVEFOREFSREFDVElPTk1B TkFHRVJfSAojZGVmaW5lIEtSU1NSRUFERVJfU1RBTkRBUkRBQ1RJT05NQU5BR0VSX0gKCiNpbmNs dWRlIDxRT2JqZWN0PgojaW5jbHVkZSA8UVZlY3Rvcj4KCmNsYXNzIEtBY3Rpb247CmNsYXNzIEtB Y3Rpb25Db2xsZWN0aW9uOwpjbGFzcyBRSXRlbVNlbGVjdGlvbk1vZGVsOwpjbGFzcyBRV2lkZ2V0 OwpjbGFzcyBLSm9iOwoKY2xhc3MgU3RhbmRhcmRBY3Rpb25NYW5hZ2VyIDogcHVibGljIFFPYmpl Y3QKewogICAgICAgIFFfT0JKRUNUCgpwdWJsaWM6CgogICAgICAgIGVudW0gVHlwZSB7CiAgICAg ICAgICAgICAgICBDcmVhdGVGZWVkLAogICAgICAgICAgICAgICAgU3luY2hyb25pemVGZWVkLAog ICAgICAgICAgICAgICAgRmVlZFByb3BlcnRpZXMsCiAgICAgICAgICAgICAgICBEZWxldGVGZWVk LAogICAgICAgICAgICAgICAgQXR0YWNoTmV3VGFnLAogICAgICAgICAgICAgICAgRGV0YWNoVGFn LAogICAgICAgICAgICAgICAgTWFuYWdlU3Vic2NyaXB0aW9ucywKICAgICAgICAgICAgICAgIExh c3RUeXBlCiAgICAgICAgfTsKCiAgICAgICAgZXhwbGljaXQgU3RhbmRhcmRBY3Rpb25NYW5hZ2Vy KCBLQWN0aW9uQ29sbGVjdGlvbiAqYWN0aW9uQ29sbGVjdGlvbiwgUVdpZGdldCAqcGFyZW50ID0g MCApOwogICAgICAgIH5TdGFuZGFyZEFjdGlvbk1hbmFnZXIoKTsKCiAgICAgICAgdm9pZCBzZXRG ZWVkU2VsZWN0aW9uTW9kZWwoIFFJdGVtU2VsZWN0aW9uTW9kZWwgKnNlbGVjdGlvbk1vZGVsICk7 CiAgICAgICAgdm9pZCBzZXRTdWJzY3JpcHRpb25MYWJlbCggY29uc3QgUVN0cmluZyAmc3Vic2Ny aXB0aW9uTGFiZWwgKTsKICAgICAgICBLQWN0aW9uKiBhY3Rpb24oIFR5cGUgdHlwZSApOwogICAg ICAgIHZvaWQgY3JlYXRlQWxsQWN0aW9ucygpOwoKcHJpdmF0ZToKCiAgICAgICAgLy9oZWxwZXIg bWV0aG9kcwogICAgICAgIHZvaWQgZW5hYmxlQWN0aW9uKCBTdGFuZGFyZEFjdGlvbk1hbmFnZXI6 OlR5cGUgdHlwZSwgYm9vbCBlbmFibGUgKTsKCnByaXZhdGUgUV9TTE9UUzoKCiAgICAgICAgdm9p ZCBzbG90Q3JlYXRlRmVlZCgpOwogICAgICAgIHZvaWQgc2xvdFN5bmNocm9uaXplRmVlZCgpOwog ICAgICAgIHZvaWQgc2xvdEZlZWRQcm9wZXJ0aWVzKCk7CiAgICAgICAgdm9pZCBzbG90RGVsZXRl RmVlZCgpOwogICAgICAgIHZvaWQgc2xvdEF0dGFjaE5ld1RhZygpOwogICAgICAgIHZvaWQgc2xv dERldGFjaFRhZygpOwogICAgICAgIHZvaWQgc2xvdE1hbmFnZVN1YnNjcmlwdGlvbnMoKTsKICAg ICAgICB2b2lkIHVwZGF0ZUFjdGlvbnMoKTsKCiAgICAgICAgdm9pZCBjb2xsZWN0aW9uQ3JlYXRp b25SZXN1bHQoIEtKb2IqIGpvYiApOwogICAgICAgIHZvaWQgY29sbGVjdGlvbkRlbGV0aW9uUmVz dWx0KCBLSm9iKiBqb2IgKTsKICAgICAgICB2b2lkIGNvbGxlY3Rpb25Nb2RpZnlSZXN1bHQoIEtK b2IqIGpvYiApOwoKcHJpdmF0ZToKCiAgICAgICAgS0FjdGlvbkNvbGxlY3Rpb24gKm1fYWN0aW9u Q29sbGVjdGlvbjsKICAgICAgICBRV2lkZ2V0ICptX3BhcmVudFdpZGdldDsKICAgICAgICBRSXRl bVNlbGVjdGlvbk1vZGVsICptX2ZlZWRTZWxlY3Rpb25Nb2RlbDsKICAgICAgICBRU3RyaW5nIG1f c3Vic2NyaXB0aW9uTGFiZWw7CiAgICAgICAgUVZlY3RvcjxLQWN0aW9uKj4gbV9hY3Rpb25zOwp9 OwoKI2VuZGlmIC8qIEtSU1NSRUFERVJfU1RBTkRBUkRBQ1RJT05NQU5BR0VSX0ggKi8KAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAa3Jzcy9rcnNzcmVhZGVyL3N1YnNjcmlwdGlvbnNtb2RlbC5jcHAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAADAwMDA2NDQAMDAwMTc1MAAwMDAxNzUwADAwMDAwMDExMDYwADExMDI1NzAxNzc1ADAyMDIx MAAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHZv bmFtaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdm9uYW1pAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAvKgogICAgQ29weXJpZ2h0IChDKSAyMDA4ICAgIERtaXRyeSBJdmFu b3YgPHZvbmFtaUBnbWFpbC5jb20+CgogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7 IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgIGl0IHVuZGVyIHRoZSB0 ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAg ICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBM aWNlbnNlLCBvcgogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgICBU aGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVz ZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBs aWVkIHdhcnJhbnR5IG9mCiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJU SUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm b3IgbW9yZSBkZXRhaWxzLgoKICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg dGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3Jh bS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKi8KCiNpbmNs dWRlICJzdWJzY3JpcHRpb25zbW9kZWwuaCIKCiNpbmNsdWRlIDxha29uYWRpL2NvbGxlY3Rpb25t b2RlbC5oPgojaW5jbHVkZSA8S0RlYnVnPgoKI2luY2x1ZGUgPFFTdHJpbmdMaXN0PgoKU3Vic2Ny aXB0aW9uc01vZGVsOjpTdWJzY3JpcHRpb25zTW9kZWwoIGNvbnN0IFFTdHJpbmcgJnN1YnNjcmlw dGlvbkxhYmVsLCBRT2JqZWN0ICpwYXJlbnQgKQogICAgICAgIDogRmVlZGxpc3RNb2RlbCggcGFy ZW50ICksIG1fc3Vic2NyaXB0aW9uTGFiZWwoIHN1YnNjcmlwdGlvbkxhYmVsICkKewogICAgICAg IGNvbm5lY3QoIHRoaXMsIFNJR05BTCggcm93c0luc2VydGVkKCBjb25zdCBRTW9kZWxJbmRleCYs IGludCwgaW50ICkgKSwKICAgICAgICAgICAgICAgICB0aGlzLCBTTE9UKCBmZWVkc0luc2VydGVk KCBjb25zdCBRTW9kZWxJbmRleCAmLCBpbnQsIGludCApICkgKTsKfQoKU3Vic2NyaXB0aW9uc01v ZGVsOjp+U3Vic2NyaXB0aW9uc01vZGVsKCkKewp9Cgp2b2lkIFN1YnNjcmlwdGlvbnNNb2RlbDo6 ZmVlZHNJbnNlcnRlZCggY29uc3QgUU1vZGVsSW5kZXggJnBhcmVudCwgaW50IHN0YXJ0LCBpbnQg ZW5kICkKewogICAgICAgIGZvciAoIGludCBpID0gc3RhcnQ7IGkgPD0gZW5kOyArK2kgKSB7CiAg ICAgICAgICAgICAgICBRTW9kZWxJbmRleCBzb3VyY2VJbmRleCA9IGluZGV4KCBpLCAwLCBwYXJl bnQgKTsKICAgICAgICAgICAgICAgIGlmICggRmVlZGxpc3RNb2RlbDo6ZGF0YSggc291cmNlSW5k ZXgsIEZlZWRsaXN0TW9kZWw6OlRpZXJSb2xlICkgPT0gRmVlZGxpc3RNb2RlbDo6RmVlZFRpZXIg JiYKICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uTGFiZWxzKCBzb3VyY2VJbmRleCAp LmNvbnRhaW5zKCBtX3N1YnNjcmlwdGlvbkxhYmVsICkgKSB7CiAgICAgICAgICAgICAgICAgICAg ICAgIEFrb25hZGk6OkNvbGxlY3Rpb246OklkIGlkID0gRmVlZGxpc3RNb2RlbDo6ZGF0YSggc291 cmNlSW5kZXgsIEFrb25hZGk6OkNvbGxlY3Rpb25Nb2RlbDo6Q29sbGVjdGlvbklkUm9sZSApLgog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHZhbHVlPEFrb25hZGk6OkNvbGxlY3Rpb246OklkPigpOwogICAgICAg ICAgICAgICAgICAgICAgICBtX25ld1N1YnNjcmlwdGlvbnMuaW5zZXJ0KCBpZCApOwogICAgICAg ICAgICAgICAgICAgICAgICBtX29sZFN1YnNjcmlwdGlvbnMuaW5zZXJ0KCBpZCApOwogICAgICAg ICAgICAgICAgfQogICAgICAgIH0KfQoKUVZhcmlhbnQgU3Vic2NyaXB0aW9uc01vZGVsOjpkYXRh KCBjb25zdCBRTW9kZWxJbmRleCAmaW5kZXgsIGludCByb2xlICkgY29uc3QKewogICAgICAgIGlm ICggIWluZGV4LmlzVmFsaWQoKSApCiAgICAgICAgICAgICAgICByZXR1cm4gUVZhcmlhbnQoKTsK CiAgICAgICAgaWYgKCByb2xlID09IFF0OjpDaGVja1N0YXRlUm9sZSAmJiBGZWVkbGlzdE1vZGVs OjpkYXRhKCBpbmRleCwgRmVlZGxpc3RNb2RlbDo6VGllclJvbGUgKSA9PSBGZWVkbGlzdE1vZGVs OjpGZWVkVGllciApIHsKICAgICAgICAgICAgICAgIGNvbnN0IEFrb25hZGk6OkNvbGxlY3Rpb246 OklkIGNvbCA9IGluZGV4LmRhdGEoIEFrb25hZGk6OkNvbGxlY3Rpb25Nb2RlbDo6Q29sbGVjdGlv bklkUm9sZSApLnRvTG9uZ0xvbmcoKTsKICAgICAgICAgICAgICAgIHJldHVybiAoIG1fbmV3U3Vi c2NyaXB0aW9ucy5jb250YWlucyggY29sICkgPyBRdDo6Q2hlY2tlZCA6IFF0OjpVbmNoZWNrZWQg KTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBGZWVkbGlzdE1vZGVsOjpkYXRhKCBpbmRleCwg cm9sZSApOwp9Cgpib29sIFN1YnNjcmlwdGlvbnNNb2RlbDo6c2V0RGF0YSggY29uc3QgUU1vZGVs SW5kZXggJmluZGV4LCBjb25zdCBRVmFyaWFudCAmdmFsdWUsIGludCByb2xlICkKewogICAgICAg IGlmICggIWluZGV4LmlzVmFsaWQoKSApCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cgog ICAgICAgIGlmICggcm9sZSA9PSBRdDo6Q2hlY2tTdGF0ZVJvbGUgJiYgZGF0YSggaW5kZXgsIEZl ZWRsaXN0TW9kZWw6OlRpZXJSb2xlICkgPT0gRmVlZGxpc3RNb2RlbDo6RmVlZFRpZXIgKSB7CiAg ICAgICAgICAgICAgICBjb25zdCBBa29uYWRpOjpDb2xsZWN0aW9uOjpJZCBjb2wgPSBpbmRleC5k YXRhKCBBa29uYWRpOjpDb2xsZWN0aW9uTW9kZWw6OkNvbGxlY3Rpb25JZFJvbGUgKS50b0xvbmdM b25nKCk7CgogICAgICAgICAgICAgICAgaWYgKCBtX25ld1N1YnNjcmlwdGlvbnMuY29udGFpbnMo IGNvbCApICYmIHZhbHVlID09IFF0OjpVbmNoZWNrZWQgKSB7CiAgICAgICAgICAgICAgICAgICAg ICAgIG1fbmV3U3Vic2NyaXB0aW9ucy5yZW1vdmUoIGNvbCApOwogICAgICAgICAgICAgICAgICAg ICAgICBRTGlzdDxRTW9kZWxJbmRleD4gaW5kZXhlcyA9IGZlZWRJbmRleGVzKCBjb2wgKTsKICAg ICAgICAgICAgICAgICAgICAgICAgUV9GT1JFQUNIICggY29uc3QgUU1vZGVsSW5kZXggJmZlZWQs IGluZGV4ZXMgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdCBkYXRhQ2hh bmdlZCggZmVlZCwgZmVlZCApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAg ICAgICAgICAgICAgIGtEZWJ1ZygpIDw8ICJTdWJzY3JpcHRpb25zOiIgPDwgbV9uZXdTdWJzY3Jp cHRpb25zOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAg ICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICFtX25ld1N1YnNjcmlwdGlvbnMuY29udGFpbnMo IGNvbCApICYmIHZhbHVlID09IFF0OjpDaGVja2VkICkgewogICAgICAgICAgICAgICAgICAgICAg ICBtX25ld1N1YnNjcmlwdGlvbnMgPDwgY29sOwogICAgICAgICAgICAgICAgICAgICAgICBRTGlz dDxRTW9kZWxJbmRleD4gaW5kZXhlcyA9IGZlZWRJbmRleGVzKCBjb2wgKTsKICAgICAgICAgICAg ICAgICAgICAgICAgUV9GT1JFQUNIICggY29uc3QgUU1vZGVsSW5kZXggJmZlZWQsIGluZGV4ZXMg KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdCBkYXRhQ2hhbmdlZCggZmVl ZCwgZmVlZCApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAg ICAgIGtEZWJ1ZygpIDw8ICJTdWJzY3JpcHRpb25zOiIgPDwgbV9uZXdTdWJzY3JpcHRpb25zOwog ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAg ICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gRmVl ZGxpc3RNb2RlbDo6c2V0RGF0YSggaW5kZXgsIHZhbHVlLCByb2xlICk7Cn0KClF0OjpJdGVtRmxh Z3MgU3Vic2NyaXB0aW9uc01vZGVsOjpmbGFncyggY29uc3QgUU1vZGVsSW5kZXggJmluZGV4ICkg Y29uc3QKewogICAgICAgIFF0OjpJdGVtRmxhZ3MgZmxhZ3MgPSBGZWVkbGlzdE1vZGVsOjpmbGFn cyggaW5kZXggKTsKICAgICAgICBpZiAoIEZlZWRsaXN0TW9kZWw6OmRhdGEoIGluZGV4LCBGZWVk bGlzdE1vZGVsOjpUaWVyUm9sZSApID09IEZlZWRsaXN0TW9kZWw6OkZlZWRUaWVyICkKICAgICAg ICAgICAgICAgIGZsYWdzID0gZmxhZ3MgfCBRdDo6SXRlbUlzVXNlckNoZWNrYWJsZTsKCiAgICAg ICAgcmV0dXJuIGZsYWdzOwp9CgpRU2V0PEFrb25hZGk6OkNvbGxlY3Rpb246OklkPiBTdWJzY3Jp cHRpb25zTW9kZWw6Om5ld1N1YnNjcmlwdGlvbnMoKSBjb25zdAp7CiAgICAgICAgcmV0dXJuIG1f bmV3U3Vic2NyaXB0aW9uczsKfQoKUVNldDxBa29uYWRpOjpDb2xsZWN0aW9uOjpJZD4gU3Vic2Ny aXB0aW9uc01vZGVsOjpvbGRTdWJzY3JpcHRpb25zKCkgY29uc3QKewogICAgICAgIHJldHVybiBt X29sZFN1YnNjcmlwdGlvbnM7Cn0KCiNpbmNsdWRlICJzdWJzY3JpcHRpb25zbW9kZWwubW9jIgoA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAGtyc3Mva3Jzc3JlYWRlci9tYWlud2lkZ2V0LmgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwNjQ0 ADAwMDE3NTAAMDAwMTc1MAAwMDAwMDAwMzI0NgAxMTAyNTcwMTc3NQAwMTYwNjQAIDAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIAB2b25hbWkAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAHZvbmFtaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAALyoKICAgIENvcHlyaWdodCAoQykgMjAwOCAgICBEbWl0cnkgSXZhbm92IDx2b25hbWlA Z21haWwuY29tPgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJl ZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUg U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IK ICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFt IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBi dXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50 eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ T1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0 YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3Qs IHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiovCgojaWZuZGVmIEtSU1NSRUFE RVJfTUFJTldJREdFVF9ICiNkZWZpbmUgS1JTU1JFQURFUl9NQUlOV0lER0VUX0gKCiNpbmNsdWRl ICJmZWVkbGlzdG1vZGVsLmgiCiNpbmNsdWRlICJmZWVkbGlzdGZpbHRlcnByb3h5bW9kZWwuaCIK CiNpbmNsdWRlIDxha29uYWRpL2NvbGxlY3Rpb25tb2RlbC5oPgojaW5jbHVkZSA8YWtvbmFkaS9j b2xsZWN0aW9udmlldy5oPgojaW5jbHVkZSA8YWtvbmFkaS9jb2xsZWN0aW9uZmlsdGVycHJveHlt b2RlbC5oPgojaW5jbHVkZSA8YWtvbmFkaS9pdGVtbW9kZWwuaD4KI2luY2x1ZGUgPGFrb25hZGkv aXRlbXZpZXcuaD4KCiNpbmNsdWRlIDxRV2lkZ2V0PgojaW5jbHVkZSA8UVNwbGl0dGVyPgojaW5j bHVkZSA8UVRleHRFZGl0PgoKY2xhc3MgS1htbEd1aVdpbmRvdzsKCmNsYXNzIE1haW5XaWRnZXQ6 IHB1YmxpYyBRV2lkZ2V0CnsKICAgICAgICBRX09CSkVDVAoKcHVibGljOgoKICAgICAgICBleHBs aWNpdCBNYWluV2lkZ2V0KCBLWG1sR3VpV2luZG93ICpwYXJlbnQgPSAwICk7CiAgICAgICAgfk1h aW5XaWRnZXQoKTsKCnByaXZhdGU6CgogICAgICAgIFFTcGxpdHRlciAqbV9tYWluU3BsaXR0ZXI7 CiAgICAgICAgUVNwbGl0dGVyICptX2FydGljbGVTcGxpdHRlcjsKICAgICAgICBBa29uYWRpOjpD b2xsZWN0aW9uVmlldyAqbV9mZWVkbGlzdFZpZXc7CiAgICAgICAgQWtvbmFkaTo6SXRlbVZpZXcg Km1fYXJ0aWNsZXNWaWV3OwogICAgICAgIFFUZXh0RWRpdCAqbV9hcnRpY2xlVmlld2VyOwoKICAg ICAgICBBa29uYWRpOjpDb2xsZWN0aW9uTW9kZWwgKm1fZnVsbE1vZGVsOwogICAgICAgIEZlZWRs aXN0TW9kZWwgKm1fZmVlZGxpc3RNb2RlbDsKICAgICAgICBGZWVkbGlzdEZpbHRlclByb3h5TW9k ZWwgKm1fZmlsdGVyZWRGZWVkbGlzdE1vZGVsOwogICAgICAgIEFrb25hZGk6Okl0ZW1Nb2RlbCAq bV9hcnRpY2xlc01vZGVsOwp9OwoKI2VuZGlmIC8vIEtSU1NSRUFERVJfTUFJTldJREdFVF9ICgAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AABrcnNzL2tyc3NyZWFkZXIvZmVlZGxpc3RmaWx0ZXJwcm94eW1vZGVsLmgAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDY0NAAwMDAx NzUwADAwMDE3NTAAMDAwMDAwMDI1MjYAMTEwMjU3MDE3NzUAMDIxMDY0ACAwAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAdm9uYW1pAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAB2b25hbWkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AC8qCiAgICBDb3B5cmlnaHQgKEMpIDIwMDggICAgRG1pdHJ5IEl2YW5vdiA8dm9uYW1pQGdtYWls LmNvbT4KCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry aWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAgIHRoZSBGcmVlIFNvZnR3 YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgICAo YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBk aXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJ VEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YK ICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g IFNlZSB0aGUKICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMu CgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwg UHVibGljIExpY2Vuc2UKICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUg PGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgoqLwoKI2lmbmRlZiBLUlNTUkVBREVSX0ZF RURMSVNURklMVEVSUFJPWFlNT0RFTF9ICiNkZWZpbmUgS1JTU1JFQURFUl9GRUVETElTVEZJTFRF UlBST1hZTU9ERUxfSAoKI2luY2x1ZGUgImZlZWRsaXN0bW9kZWwuaCIKCiNpbmNsdWRlIDxRU29y dEZpbHRlclByb3h5TW9kZWw+CgpjbGFzcyBGZWVkbGlzdEZpbHRlclByb3h5TW9kZWwgOiBwdWJs aWMgUVNvcnRGaWx0ZXJQcm94eU1vZGVsCnsKCnB1YmxpYzoKCiAgICAgICAgZXhwbGljaXQgRmVl ZGxpc3RGaWx0ZXJQcm94eU1vZGVsKCBRT2JqZWN0ICpwYXJlbnQgPSAwICk7CiAgICAgICAgfkZl ZWRsaXN0RmlsdGVyUHJveHlNb2RlbCgpOwoKICAgICAgICB2b2lkIHNldFN1YnNjcmlwdGlvbkxh YmVsKCBjb25zdCBRU3RyaW5nICZzdWJzY3JpcHRpb25MYWJlbCApOwogICAgICAgIFFTdHJpbmcg c3Vic2NyaXB0aW9uTGFiZWwoKSBjb25zdDsKCnByb3RlY3RlZDoKCiAgICAgICAgYm9vbCBmaWx0 ZXJBY2NlcHRzUm93KCBpbnQgc291cmNlUm93LCBjb25zdCBRTW9kZWxJbmRleCAmc291cmNlUGFy ZW50ICkgY29uc3Q7Cgpwcml2YXRlOgoKICAgICAgICBRU3RyaW5nIG1fc3Vic2NyaXB0aW9uTGFi ZWw7Cn07CgojZW5kaWYgLy8gS1JTU1JFQURFUl9GRUVETElTVEZJTFRFUlBST1hZTU9ERUxfSAoA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGty c3Mva3Jzc3JlYWRlci90cmVlbm9kZS5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwNjQ0ADAwMDE3NTAA MDAwMTc1MAAwMDAwMDAwMzQ3NgAxMTAyNTcwMTc3NQAwMTU1NDYAIDAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIAB2b25hbWkAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAHZvbmFtaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyoK ICAgIENvcHlyaWdodCAoQykgMjAwOCAgICBEbWl0cnkgSXZhbm92IDx2b25hbWlAZ21haWwuY29t PgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0 ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUg Rm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5 b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3Ry aWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9V VCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAg TUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2Vl IHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAg ICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0 cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiovCgojaWZuZGVmIEtSU1NSRUFERVJfVFJFRU5P REVfSAojZGVmaW5lIEtSU1NSRUFERVJfVFJFRU5PREVfSAoKI2luY2x1ZGUgPGFrb25hZGkvY29s bGVjdGlvbi5oPgoKI2luY2x1ZGUgPFFWYXJpYW50PgoKY2xhc3MgVHJlZU5vZGUKewoKcHVibGlj OgoKICAgICAgICBlbnVtIFRpZXIgewogICAgICAgICAgICAgICAgUm9vdE5vZGUsCiAgICAgICAg ICAgICAgICBUYWdOb2RlLAogICAgICAgICAgICAgICAgRmVlZE5vZGUKICAgICAgICB9OwoKcHVi bGljOgoKICAgICAgICBUcmVlTm9kZSggVHJlZU5vZGU6OlRpZXIgdGllciwgY29uc3QgQWtvbmFk aTo6Q29sbGVjdGlvbjo6SWQgJmlkLCBUcmVlTm9kZSAqcGFyZW50ICk7CiAgICAgICAgVHJlZU5v ZGUoIFRyZWVOb2RlOjpUaWVyIHRpZXIsIGNvbnN0IFFTdHJpbmcgJm5hbWUsIFRyZWVOb2RlICpw YXJlbnQgKTsKICAgICAgICB+VHJlZU5vZGUoKTsKCiAgICAgICAgdm9pZCBhcHBlbmRDaGlsZCgg VHJlZU5vZGUgKmNoaWxkICk7CiAgICAgICAgdm9pZCByZW1vdmVDaGlsZEF0KCBpbnQgcm93ICk7 CiAgICAgICAgdm9pZCByZW1vdmVDaGlsZHJlbigpOwogICAgICAgIGludCBjb3VudCgpIGNvbnN0 OwogICAgICAgIFRyZWVOb2RlKiBjaGlsZEF0KCBpbnQgcm93ICkgY29uc3Q7CiAgICAgICAgaW50 IGNoaWxkUm93KCBUcmVlTm9kZSAqY2hpbGQgKSBjb25zdDsKICAgICAgICBRTGlzdDxUcmVlTm9k ZSo+IGNoaWxkcmVuKCkgY29uc3Q7CiAgICAgICAgVHJlZU5vZGUqIHBhcmVudCgpIGNvbnN0Owog ICAgICAgIEFrb25hZGk6OkNvbGxlY3Rpb246OklkIGNvbGxlY3Rpb24oKSBjb25zdDsKICAgICAg ICBRU3RyaW5nIG5hbWUoKSBjb25zdDsKICAgICAgICBUcmVlTm9kZTo6VGllciB0aWVyKCkgY29u c3Q7CiAgICAgICAgaW50IHJvdygpIGNvbnN0OwogICAgICAgIHZvaWQgZHVtcCggUVN0cmluZyBp bmRlbnQgPSBRU3RyaW5nKCkgKSBjb25zdDsKCnByaXZhdGU6CgogICAgICAgIFRyZWVOb2RlOjpU aWVyIG1fdGllcjsKICAgICAgICBRVmFyaWFudCBtX2RhdGE7CiAgICAgICAgVHJlZU5vZGUgKm1f cGFyZW50OwogICAgICAgIFFMaXN0PFRyZWVOb2RlKj4gbV9jaGlsZHJlbjsKfTsKCiNlbmRpZiAv KiBLUlNTUkVBREVSX1RSRUVOT0RFX0ggKi8KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrcnNzL2ty c3NyZWFkZXIvdHJlZW5vZGUuY3BwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDY0NAAwMDAxNzUwADAwMDE3 NTAAMDAwMDAwMDYxNTUAMTEwMjU3MDE3NzUAMDE2MDc2ACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAdm9uYW1pAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAB2b25hbWkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8qCiAgICBD b3B5cmlnaHQgKEMpIDIwMDggICAgRG1pdHJ5IEl2YW5vdiA8dm9uYW1pQGdtYWlsLmNvbT4KCiAg ICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQg YW5kL29yIG1vZGlmeQogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k YXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgICAoYXQgeW91ciBv cHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRl ZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5Z IFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNI QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUK ICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICAgWW91 IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UKICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93 d3cuZ251Lm9yZy9saWNlbnNlcy8+LgoqLwoKI2luY2x1ZGUgInRyZWVub2RlLmgiCgojaW5jbHVk ZSA8S0RlYnVnPgoKVHJlZU5vZGU6OlRyZWVOb2RlKCBUcmVlTm9kZTo6VGllciB0aWVyLCBjb25z dCBBa29uYWRpOjpDb2xsZWN0aW9uOjpJZCAmaWQsIFRyZWVOb2RlICpwYXJlbnQgKQogICAgICAg IDogbV90aWVyKHRpZXIpLCBtX2RhdGEoaWQpLCBtX3BhcmVudChwYXJlbnQpCnsKfQoKVHJlZU5v ZGU6OlRyZWVOb2RlKCBUcmVlTm9kZTo6VGllciB0aWVyLCBjb25zdCBRU3RyaW5nICZuYW1lLCBU cmVlTm9kZSAqcGFyZW50ICkKICAgICAgICA6IG1fdGllcih0aWVyKSwgbV9kYXRhKG5hbWUpLCBt X3BhcmVudChwYXJlbnQpCnsKfQoKVHJlZU5vZGU6On5UcmVlTm9kZSgpCnsKICAgICAgICByZW1v dmVDaGlsZHJlbigpOwp9Cgp2b2lkIFRyZWVOb2RlOjphcHBlbmRDaGlsZCggVHJlZU5vZGUgKmNo aWxkICkKewogICAgICAgIG1fY2hpbGRyZW4gPDwgY2hpbGQ7Cn0KCnZvaWQgVHJlZU5vZGU6OnJl bW92ZUNoaWxkQXQoIGludCByb3cgKQp7CiAgICAgICAgVHJlZU5vZGUgKmNoaWxkID0gY2hpbGRB dCggcm93ICk7CiAgICAgICAgZGVsZXRlIGNoaWxkOwogICAgICAgIG1fY2hpbGRyZW4ucmVtb3Zl QXQoIHJvdyApOwp9Cgp2b2lkIFRyZWVOb2RlOjpyZW1vdmVDaGlsZHJlbigpCnsKICAgICAgICBx RGVsZXRlQWxsKCBtX2NoaWxkcmVuICk7CiAgICAgICAgbV9jaGlsZHJlbi5jbGVhcigpOwp9Cgpp bnQgVHJlZU5vZGU6OmNvdW50KCkgY29uc3QKewogICAgICAgIHJldHVybiBtX2NoaWxkcmVuLmNv dW50KCk7Cn0KClRyZWVOb2RlKiBUcmVlTm9kZTo6Y2hpbGRBdCggaW50IHJvdyApIGNvbnN0CnsK ICAgICAgICByZXR1cm4gbV9jaGlsZHJlbi52YWx1ZSggcm93ICk7Cn0KCmludCBUcmVlTm9kZTo6 Y2hpbGRSb3coIFRyZWVOb2RlICpjaGlsZCApIGNvbnN0CnsKICAgICAgICByZXR1cm4gbV9jaGls ZHJlbi5pbmRleE9mKCBjaGlsZCApOwp9CgpRTGlzdDxUcmVlTm9kZSo+IFRyZWVOb2RlOjpjaGls ZHJlbigpIGNvbnN0CnsKICAgICAgICByZXR1cm4gbV9jaGlsZHJlbjsKfQoKVHJlZU5vZGUqIFRy ZWVOb2RlOjpwYXJlbnQoKSBjb25zdAp7CiAgICAgICAgcmV0dXJuIG1fcGFyZW50Owp9CgpBa29u YWRpOjpDb2xsZWN0aW9uOjpJZCBUcmVlTm9kZTo6Y29sbGVjdGlvbigpIGNvbnN0CnsKICAgICAg ICByZXR1cm4gbV9kYXRhLnZhbHVlPEFrb25hZGk6OkNvbGxlY3Rpb246OklkPigpOwp9CgpRU3Ry aW5nIFRyZWVOb2RlOjpuYW1lKCkgY29uc3QKewogICAgICAgIHJldHVybiBtX2RhdGEudmFsdWU8 UVN0cmluZz4oKTsKfQoKVHJlZU5vZGU6OlRpZXIgVHJlZU5vZGU6OnRpZXIoKSBjb25zdAp7CiAg ICAgICAgcmV0dXJuIG1fdGllcjsKfQoKaW50IFRyZWVOb2RlOjpyb3coKSBjb25zdAp7CiAgICAg ICAgLy8gU2luY2UgJ3RoaXMnIGlzIG9mICdjb25zdCBUcmVlTm9kZSAqY29uc3QnIHR5cGUgSSBj YW4ndCBqdXN0IHBhc3MgaXQKICAgICAgICAvLyB0byBRTGlzdDo6aW5kZXhPZigpIHdoaWNoIGFj Y2VwdHMgJ1RyZWVOb2RlIConCiAgICAgICAgLy8gU2hhbWUgb24gbWUgYnV0IEkgY2FuJ3QgZmln dXJlIG91dCBhIGNvcnJlY3Qgd2F5IHRvIHBhc3MgdGhlIHBvaW50ZXIKICAgICAgICAvLyB0byB0 aGlzIG9iamVjdCBvdGhlciB0aGFuIGNhc3RpbmcgYXdheSBjb25zdG5lc3MuCiAgICAgICAgLy8g VGhvdWdoIHRoaXMgc2hvdWxkIGJlIHNhZmUuCiAgICAgICAgcmV0dXJuICggbV9wYXJlbnQgPyBt X3BhcmVudC0+Y2hpbGRSb3coIGNvbnN0X2Nhc3Q8VHJlZU5vZGUqPiggdGhpcyApICkgOiAwICk7 Cn0KCnZvaWQgVHJlZU5vZGU6OmR1bXAoIFFTdHJpbmcgaW5kZW50ICkgY29uc3QKewogICAgICAg IHN3aXRjaCggbV90aWVyICkgewogICAgICAgICAgICAgICAgY2FzZSBSb290Tm9kZToKICAgICAg ICAgICAgICAgICAgICAgICAga0RlYnVnKCkgPDwgUVN0cmluZyggIiUxJTIiICkuYXJnKCBpbmRl bnQgKS5hcmcoIHRoaXMtPm5hbWUoKSApOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsK CiAgICAgICAgICAgICAgICBjYXNlIFRhZ05vZGU6CiAgICAgICAgICAgICAgICAgICAgICAgIGtE ZWJ1ZygpIDw8IFFTdHJpbmcoICIlMSUyIiApLmFyZyggaW5kZW50ICkuYXJnKCB0aGlzLT5uYW1l KCkgKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2Fz ZSBGZWVkTm9kZToKICAgICAgICAgICAgICAgICAgICAgICAga0RlYnVnKCkgPDwgUVN0cmluZygg IiUxRmVlZCwgY29saWQgJTIiICkuYXJnKCBpbmRlbnQgKS5hcmcoIHRoaXMtPmNvbGxlY3Rpb24o KSApOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIFFf Rk9SRUFDSCggY29uc3QgVHJlZU5vZGUgKmNoaWxkLCBtX2NoaWxkcmVuICkKICAgICAgICAgICAg ICAgIGNoaWxkLT5kdW1wKCBpbmRlbnQgKyAiICAgICIgKTsKfQoAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa3Jzcy9rcnNzcmVhZGVy L2ZlZWRwcm9wZXJ0aWVzZGlhbG9nLmgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA2NDQAMDAwMTc1MAAwMDAxNzUwADAwMDAw MDAyNDAwADExMDI1NzAxNzc1ADAyMDEyMwAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAB1c3RhciAgAHZvbmFtaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdm9u YW1pAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvKgogICAgQ29weXJpZ2h0 IChDKSAyMDA4ICAgIERtaXRyeSBJdmFub3YgPHZvbmFtaUBnbWFpbC5jb20+CgogICAgVGhpcyBw cm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBt b2RpZnkKICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBl aXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICAgKGF0IHlvdXIgb3B0aW9uKSBh bnkgbGF0ZXIgdmVyc2lvbi4KCiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhl IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5U WTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgICBNRVJDSEFOVEFCSUxJ VFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgICBHTlUg R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgIFlvdSBzaG91bGQg aGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAg ICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5v cmcvbGljZW5zZXMvPi4KKi8KCiNpZm5kZWYgS1JTU1JFQURFUl9GRUVEUFJPUEVSVElFU0RJQUxP R19ICiNkZWZpbmUgS1JTU1JFQURFUl9GRUVEUFJPUEVSVElFU0RJQUxPR19ICgojaW5jbHVkZSA8 S0RpYWxvZz4KCiNpbmNsdWRlICJ1aV9mZWVkcHJvcGVydGllc2RpYWxvZy5oIgoKY2xhc3MgRmVl ZFByb3BlcnRpZXNEaWFsb2cgOiBwdWJsaWMgS0RpYWxvZwp7CiAgICAgICAgUV9PQkpFQ1QKCnB1 YmxpYzoKCiAgICAgICAgRmVlZFByb3BlcnRpZXNEaWFsb2coIFFXaWRnZXQgKnBhcmVudCA9IDAg KTsKICAgICAgICB+RmVlZFByb3BlcnRpZXNEaWFsb2coKTsKCiAgICAgICAgUVN0cmluZyBmZWVk TmFtZSgpIGNvbnN0OwogICAgICAgIHZvaWQgc2V0RmVlZE5hbWUoIGNvbnN0IFFTdHJpbmcgJmZl ZWROYW1lICk7CiAgICAgICAgUVN0cmluZyB1cmwoKSBjb25zdDsKICAgICAgICB2b2lkIHNldFVy bCggY29uc3QgUVN0cmluZyAmdXJsICk7Cgpwcml2YXRlOgoKICAgICAgICBVaTo6RmVlZFByb3Bl cnRpZXNEaWFsb2cgdWk7Cn07CgojZW5kaWYgLyogS1JTU1JFQURFUl9GRUVEUFJPUEVSVElFU0RJ QUxPR19IICovCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrcnNzL2tyc3NyZWFkZXIvQ01h a2VMaXN0cy50eHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDY0NAAwMDAxNzUwADAwMDE3NTAAMDAwMDAwMDE1 MjQAMTEwMjU3MDE3NzUAMDE2MzIwACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAHVzdGFyICAAdm9uYW1pAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2b25hbWkA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMgaW5jbHVkZXM/CgpzZXQoa3Jz c3JlYWRlcl9TUkNTCiAgICAgICAgbWFpbi5jcHAKICAgICAgICBtYWlud2luZG93LmNwcAogICAg ICAgIG1haW53aWRnZXQuY3BwCiAgICAgICAgZmVlZGxpc3Rtb2RlbC5jcHAKICAgICAgICBzdWJz Y3JpcHRpb25zbW9kZWwuY3BwCiAgICAgICAgZmVlZGxpc3RmaWx0ZXJwcm94eW1vZGVsLmNwcAog ICAgICAgIHRyZWVub2RlLmNwcAogICAgICAgIHN0YW5kYXJkYWN0aW9ubWFuYWdlci5jcHAKICAg ICAgICBmZWVkcHJvcGVydGllc2RpYWxvZy5jcHAKICAgICAgICAuLi9saWJrcnNzL2ZlZWRwcm9w ZXJ0aWVzY29sbGVjdGlvbmF0dHJpYnV0ZS5jcHAKICAgICAgICAuLi9saWJrcnNzL3RhZ3Njb2xs ZWN0aW9uYXR0cmlidXRlLmNwcAogICAgICAgIC4uL2xpYmtyc3Mvc3Vic2NyaXB0aW9ubGFiZWxz Y29sbGVjdGlvbmF0dHJpYnV0ZS5jcHAKKQoKcXQ0X2FkZF9kYnVzX2ludGVyZmFjZShrcnNzcmVh ZGVyX1NSQ1MgLi4vbGlia3Jzcy9vcmcua2RlLmtyc3MueG1sIGtyc3NpbnRlcmZhY2UgKQoKa2Rl NF9hZGRfdWlfZmlsZXMoa3Jzc3JlYWRlcl9TUkNTIGZlZWRwcm9wZXJ0aWVzZGlhbG9nLnVpKQpr ZGU0X2FkZF9leGVjdXRhYmxlKGtyc3NyZWFkZXIgJHtrcnNzcmVhZGVyX1NSQ1N9KQp0YXJnZXRf bGlua19saWJyYXJpZXMoa3Jzc3JlYWRlciAke0tERTRfS0RFVUlfTElCU30gJHtLREU0X0FLT05B RElfTElCU30pCgppbnN0YWxsKFRBUkdFVFMga3Jzc3JlYWRlciAgJHtJTlNUQUxMX1RBUkdFVFNf REVGQVVMVF9BUkdTfSApCmluc3RhbGwoRklMRVMga3Jzc3JlYWRlcnVpLnJjIERFU1RJTkFUSU9O ICAke0RBVEFfSU5TVEFMTF9ESVJ9L2tyc3NyZWFkZXIpCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrcnNzL2tyc3NyZWFkZXIvZmVlZHBy b3BlcnRpZXNkaWFsb2cudWkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDY0NAAwMDAxNzUwADAwMDE3NTAAMDAwMDAwMzAwNDQA MTEwMjU3MDE3NzUAMDIwMzE2ACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAHVzdGFyICAAdm9uYW1pAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2b25hbWkAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADx1aSB2ZXJzaW9uPSI0LjAiID4KIDxj bGFzcz5GZWVkUHJvcGVydGllc0RpYWxvZzwvY2xhc3M+CiA8d2lkZ2V0IGNsYXNzPSJRV2lkZ2V0 IiBuYW1lPSJGZWVkUHJvcGVydGllc0RpYWxvZyIgPgogIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRy eSIgPgogICA8cmVjdD4KICAgIDx4PjA8L3g+CiAgICA8eT4wPC95PgogICAgPHdpZHRoPjQ1MDwv d2lkdGg+CiAgICA8aGVpZ2h0PjI1MzwvaGVpZ2h0PgogICA8L3JlY3Q+CiAgPC9wcm9wZXJ0eT4K ICA8cHJvcGVydHkgbmFtZT0ic2l6ZVBvbGljeSIgPgogICA8c2l6ZXBvbGljeSB2c2l6ZXR5cGU9 IlByZWZlcnJlZCIgaHNpemV0eXBlPSJQcmVmZXJyZWQiID4KICAgIDxob3JzdHJldGNoPjA8L2hv cnN0cmV0Y2g+CiAgICA8dmVyc3RyZXRjaD4wPC92ZXJzdHJldGNoPgogICA8L3NpemVwb2xpY3k+ CiAgPC9wcm9wZXJ0eT4KICA8cHJvcGVydHkgbmFtZT0id2luZG93VGl0bGUiID4KICAgPHN0cmlu Zz5GZWVkIFByb3BlcnRpZXM8L3N0cmluZz4KICA8L3Byb3BlcnR5PgogIDxsYXlvdXQgY2xhc3M9 IlFHcmlkTGF5b3V0IiA+CiAgIDxwcm9wZXJ0eSBuYW1lPSJtYXJnaW4iID4KICAgIDxudW1iZXI+ ODwvbnVtYmVyPgogICA8L3Byb3BlcnR5PgogICA8cHJvcGVydHkgbmFtZT0ic3BhY2luZyIgPgog ICAgPG51bWJlcj42PC9udW1iZXI+CiAgIDwvcHJvcGVydHk+CiAgIDxpdGVtIHJvdz0iMCIgY29s dW1uPSIwIiA+CiAgICA8d2lkZ2V0IGNsYXNzPSJRVGFiV2lkZ2V0IiBuYW1lPSJ0YWJXaWRnZXQi ID4KICAgICA8cHJvcGVydHkgbmFtZT0ic2l6ZVBvbGljeSIgPgogICAgICA8c2l6ZXBvbGljeSB2 c2l6ZXR5cGU9IlByZWZlcnJlZCIgaHNpemV0eXBlPSJQcmVmZXJyZWQiID4KICAgICAgIDxob3Jz dHJldGNoPjA8L2hvcnN0cmV0Y2g+CiAgICAgICA8dmVyc3RyZXRjaD4wPC92ZXJzdHJldGNoPgog ICAgICA8L3NpemVwb2xpY3k+CiAgICAgPC9wcm9wZXJ0eT4KICAgICA8cHJvcGVydHkgbmFtZT0i Y3VycmVudEluZGV4IiA+CiAgICAgIDxudW1iZXI+MDwvbnVtYmVyPgogICAgIDwvcHJvcGVydHk+ CiAgICAgPHdpZGdldCBjbGFzcz0iUVdpZGdldCIgbmFtZT0iZ2VuZXJhbFRhYiIgPgogICAgICA8 cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiID4KICAgICAgIDxyZWN0PgogICAgICAgIDx4PjA8L3g+ CiAgICAgICAgPHk+MDwveT4KICAgICAgICA8d2lkdGg+NDIyPC93aWR0aD4KICAgICAgICA8aGVp Z2h0PjE5OTwvaGVpZ2h0PgogICAgICAgPC9yZWN0PgogICAgICA8L3Byb3BlcnR5PgogICAgICA8 YXR0cmlidXRlIG5hbWU9InRpdGxlIiA+CiAgICAgICA8c3RyaW5nPiZhbXA7R2VuZXJhbDwvc3Ry aW5nPgogICAgICA8L2F0dHJpYnV0ZT4KICAgICAgPGxheW91dCBjbGFzcz0iUUdyaWRMYXlvdXQi ID4KICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXJnaW4iID4KICAgICAgICA8bnVtYmVyPjg8L251 bWJlcj4KICAgICAgIDwvcHJvcGVydHk+CiAgICAgICA8cHJvcGVydHkgbmFtZT0ic3BhY2luZyIg PgogICAgICAgIDxudW1iZXI+NjwvbnVtYmVyPgogICAgICAgPC9wcm9wZXJ0eT4KICAgICAgIDxp dGVtIHJvdz0iMSIgY29sdW1uPSIwIiA+CiAgICAgICAgPHdpZGdldCBjbGFzcz0iUUNoZWNrQm94 IiBuYW1lPSJ1cGRhdGVDaGVjayIgPgogICAgICAgICA8cHJvcGVydHkgbmFtZT0idGV4dCIgPgog ICAgICAgICAgPHN0cmluZz5VJmFtcDtzZSBhIGN1c3RvbSB1cGRhdGUgaW50ZXJ2YWw8L3N0cmlu Zz4KICAgICAgICAgPC9wcm9wZXJ0eT4KICAgICAgICA8L3dpZGdldD4KICAgICAgIDwvaXRlbT4K ICAgICAgIDxpdGVtIHJvdz0iMiIgY29sdW1uPSIwIiA+CiAgICAgICAgPGxheW91dCBjbGFzcz0i UUhCb3hMYXlvdXQiID4KICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNwYWNpbmciID4KICAgICAg ICAgIDxudW1iZXI+NjwvbnVtYmVyPgogICAgICAgICA8L3Byb3BlcnR5PgogICAgICAgICA8cHJv cGVydHkgbmFtZT0ibWFyZ2luIiA+CiAgICAgICAgICA8bnVtYmVyPjA8L251bWJlcj4KICAgICAg ICAgPC9wcm9wZXJ0eT4KICAgICAgICAgPGl0ZW0+CiAgICAgICAgICA8c3BhY2VyPgogICAgICAg ICAgIDxwcm9wZXJ0eSBuYW1lPSJvcmllbnRhdGlvbiIgPgogICAgICAgICAgICA8ZW51bT5RdDo6 SG9yaXpvbnRhbDwvZW51bT4KICAgICAgICAgICA8L3Byb3BlcnR5PgogICAgICAgICAgIDxwcm9w ZXJ0eSBuYW1lPSJzaXplVHlwZSIgPgogICAgICAgICAgICA8ZW51bT5RU2l6ZVBvbGljeTo6Rml4 ZWQ8L2VudW0+CiAgICAgICAgICAgPC9wcm9wZXJ0eT4KICAgICAgICAgICA8cHJvcGVydHkgbmFt ZT0ic2l6ZUhpbnQiIHN0ZHNldD0iMCIgPgogICAgICAgICAgICA8c2l6ZT4KICAgICAgICAgICAg IDx3aWR0aD4zMTwvd2lkdGg+CiAgICAgICAgICAgICA8aGVpZ2h0PjIwPC9oZWlnaHQ+CiAgICAg ICAgICAgIDwvc2l6ZT4KICAgICAgICAgICA8L3Byb3BlcnR5PgogICAgICAgICAgPC9zcGFjZXI+ CiAgICAgICAgIDwvaXRlbT4KICAgICAgICAgPGl0ZW0+CiAgICAgICAgICA8d2lkZ2V0IGNsYXNz PSJRTGFiZWwiIG5hbWU9InVwZGF0ZUxhYmVsIiA+CiAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9 ImVuYWJsZWQiID4KICAgICAgICAgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CiAgICAgICAgICAgPC9w cm9wZXJ0eT4KICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idGV4dCIgPgogICAgICAgICAgICA8 c3RyaW5nPlVwZGF0ZSAmYW1wO2V2ZXJ5Ojwvc3RyaW5nPgogICAgICAgICAgIDwvcHJvcGVydHk+ CiAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJ1ZGR5IiA+CiAgICAgICAgICAgIDxjc3RyaW5n PnVwZGF0ZVNwaW48L2NzdHJpbmc+CiAgICAgICAgICAgPC9wcm9wZXJ0eT4KICAgICAgICAgIDwv d2lkZ2V0PgogICAgICAgICA8L2l0ZW0+CiAgICAgICAgIDxpdGVtPgogICAgICAgICAgPHdpZGdl dCBjbGFzcz0iS0ludFNwaW5Cb3giIG5hbWU9InVwZGF0ZVNwaW4iID4KICAgICAgICAgICA8cHJv cGVydHkgbmFtZT0iZW5hYmxlZCIgPgogICAgICAgICAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KICAg ICAgICAgICA8L3Byb3BlcnR5PgogICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzdWZmaXgiID4K ICAgICAgICAgICAgPHN0cmluZy8+CiAgICAgICAgICAgPC9wcm9wZXJ0eT4KICAgICAgICAgIDwv d2lkZ2V0PgogICAgICAgICA8L2l0ZW0+CiAgICAgICAgIDxpdGVtPgogICAgICAgICAgPHdpZGdl dCBjbGFzcz0iUUNvbWJvQm94IiBuYW1lPSJ1cGRhdGVDb21ibyIgPgogICAgICAgICAgIDxwcm9w ZXJ0eSBuYW1lPSJlbmFibGVkIiA+CiAgICAgICAgICAgIDxib29sPmZhbHNlPC9ib29sPgogICAg ICAgICAgIDwvcHJvcGVydHk+CiAgICAgICAgICAgPGl0ZW0+CiAgICAgICAgICAgIDxwcm9wZXJ0 eSBuYW1lPSJ0ZXh0IiA+CiAgICAgICAgICAgICA8c3RyaW5nPk1pbnV0ZXM8L3N0cmluZz4KICAg ICAgICAgICAgPC9wcm9wZXJ0eT4KICAgICAgICAgICA8L2l0ZW0+CiAgICAgICAgICAgPGl0ZW0+ CiAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0IiA+CiAgICAgICAgICAgICA8c3RyaW5n PkhvdXJzPC9zdHJpbmc+CiAgICAgICAgICAgIDwvcHJvcGVydHk+CiAgICAgICAgICAgPC9pdGVt PgogICAgICAgICAgIDxpdGVtPgogICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idGV4dCIgPgog ICAgICAgICAgICAgPHN0cmluZz5EYXlzPC9zdHJpbmc+CiAgICAgICAgICAgIDwvcHJvcGVydHk+ CiAgICAgICAgICAgPC9pdGVtPgogICAgICAgICAgIDxpdGVtPgogICAgICAgICAgICA8cHJvcGVy dHkgbmFtZT0idGV4dCIgPgogICAgICAgICAgICAgPHN0cmluZz5OZXZlcjwvc3RyaW5nPgogICAg ICAgICAgICA8L3Byb3BlcnR5PgogICAgICAgICAgIDwvaXRlbT4KICAgICAgICAgIDwvd2lkZ2V0 PgogICAgICAgICA8L2l0ZW0+CiAgICAgICAgPC9sYXlvdXQ+CiAgICAgICA8L2l0ZW0+CiAgICAg ICA8aXRlbSByb3c9IjAiIGNvbHVtbj0iMCIgPgogICAgICAgIDxsYXlvdXQgY2xhc3M9IlFHcmlk TGF5b3V0IiA+CiAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXJnaW4iID4KICAgICAgICAgIDxu dW1iZXI+MDwvbnVtYmVyPgogICAgICAgICA8L3Byb3BlcnR5PgogICAgICAgICA8cHJvcGVydHkg bmFtZT0ic3BhY2luZyIgPgogICAgICAgICAgPG51bWJlcj42PC9udW1iZXI+CiAgICAgICAgIDwv cHJvcGVydHk+CiAgICAgICAgIDxpdGVtIHJvdz0iMSIgY29sdW1uPSIwIiA+CiAgICAgICAgICA8 d2lkZ2V0IGNsYXNzPSJRTGFiZWwiIG5hbWU9InVybExhYmVsIiA+CiAgICAgICAgICAgPHByb3Bl cnR5IG5hbWU9InRleHQiID4KICAgICAgICAgICAgPHN0cmluZz4mYW1wO1VSTDo8L3N0cmluZz4K ICAgICAgICAgICA8L3Byb3BlcnR5PgogICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJidWRkeSIg PgogICAgICAgICAgICA8Y3N0cmluZz51cmxFZGl0PC9jc3RyaW5nPgogICAgICAgICAgIDwvcHJv cGVydHk+CiAgICAgICAgICA8L3dpZGdldD4KICAgICAgICAgPC9pdGVtPgogICAgICAgICA8aXRl bSByb3c9IjAiIGNvbHVtbj0iMCIgPgogICAgICAgICAgPHdpZGdldCBjbGFzcz0iUUxhYmVsIiBu YW1lPSJmZWVkTmFtZUxhYmVsIiA+CiAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRleHQiID4K ICAgICAgICAgICAgPHN0cmluZz4mYW1wO05hbWU6PC9zdHJpbmc+CiAgICAgICAgICAgPC9wcm9w ZXJ0eT4KICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYnVkZHkiID4KICAgICAgICAgICAgPGNz dHJpbmc+ZmVlZE5hbWVFZGl0PC9jc3RyaW5nPgogICAgICAgICAgIDwvcHJvcGVydHk+CiAgICAg ICAgICA8L3dpZGdldD4KICAgICAgICAgPC9pdGVtPgogICAgICAgICA8aXRlbSByb3c9IjAiIGNv bHVtbj0iMSIgPgogICAgICAgICAgPHdpZGdldCBjbGFzcz0iS0xpbmVFZGl0IiBuYW1lPSJmZWVk TmFtZUVkaXQiID4KICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2l6ZVBvbGljeSIgPgogICAg ICAgICAgICA8c2l6ZXBvbGljeSB2c2l6ZXR5cGU9IkZpeGVkIiBoc2l6ZXR5cGU9IkV4cGFuZGlu ZyIgPgogICAgICAgICAgICAgPGhvcnN0cmV0Y2g+MTwvaG9yc3RyZXRjaD4KICAgICAgICAgICAg IDx2ZXJzdHJldGNoPjA8L3ZlcnN0cmV0Y2g+CiAgICAgICAgICAgIDwvc2l6ZXBvbGljeT4KICAg ICAgICAgICA8L3Byb3BlcnR5PgogICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sVGlwIiA+ CiAgICAgICAgICAgIDxzdHJpbmc+RGlzcGxheSBuYW1lIG9mIFJTUyBjb2x1bW48L3N0cmluZz4K ICAgICAgICAgICA8L3Byb3BlcnR5PgogICAgICAgICAgPC93aWRnZXQ+CiAgICAgICAgIDwvaXRl bT4KICAgICAgICAgPGl0ZW0gcm93PSIxIiBjb2x1bW49IjEiID4KICAgICAgICAgIDx3aWRnZXQg Y2xhc3M9IktMaW5lRWRpdCIgbmFtZT0idXJsRWRpdCIgLz4KICAgICAgICAgPC9pdGVtPgogICAg ICAgIDwvbGF5b3V0PgogICAgICAgPC9pdGVtPgogICAgICAgPGl0ZW0gcm93PSIzIiBjb2x1bW49 IjAiID4KICAgICAgICA8c3BhY2VyPgogICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3JpZW50YXRp b24iID4KICAgICAgICAgIDxlbnVtPlF0OjpWZXJ0aWNhbDwvZW51bT4KICAgICAgICAgPC9wcm9w ZXJ0eT4KICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNpemVIaW50IiBzdGRzZXQ9IjAiID4KICAg ICAgICAgIDxzaXplPgogICAgICAgICAgIDx3aWR0aD4yMDwvd2lkdGg+CiAgICAgICAgICAgPGhl aWdodD40MDwvaGVpZ2h0PgogICAgICAgICAgPC9zaXplPgogICAgICAgICA8L3Byb3BlcnR5Pgog ICAgICAgIDwvc3BhY2VyPgogICAgICAgPC9pdGVtPgogICAgICA8L2xheW91dD4KICAgICA8L3dp ZGdldD4KICAgICA8d2lkZ2V0IGNsYXNzPSJRV2lkZ2V0IiBuYW1lPSJhcmNoaXZlVGFiIiA+CiAg ICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSIgPgogICAgICAgPHJlY3Q+CiAgICAgICAgPHg+ MDwveD4KICAgICAgICA8eT4wPC95PgogICAgICAgIDx3aWR0aD40MjI8L3dpZHRoPgogICAgICAg IDxoZWlnaHQ+MTk5PC9oZWlnaHQ+CiAgICAgICA8L3JlY3Q+CiAgICAgIDwvcHJvcGVydHk+CiAg ICAgIDxhdHRyaWJ1dGUgbmFtZT0idGl0bGUiID4KICAgICAgIDxzdHJpbmc+QXImYW1wO2NoaXZl PC9zdHJpbmc+CiAgICAgIDwvYXR0cmlidXRlPgogICAgICA8bGF5b3V0IGNsYXNzPSJRR3JpZExh eW91dCIgPgogICAgICAgPHByb3BlcnR5IG5hbWU9Im1hcmdpbiIgPgogICAgICAgIDxudW1iZXI+ ODwvbnVtYmVyPgogICAgICAgPC9wcm9wZXJ0eT4KICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzcGFj aW5nIiA+CiAgICAgICAgPG51bWJlcj42PC9udW1iZXI+CiAgICAgICA8L3Byb3BlcnR5PgogICAg ICAgPGl0ZW0gcm93PSIwIiBjb2x1bW49IjAiID4KICAgICAgICA8d2lkZ2V0IGNsYXNzPSJRUmFk aW9CdXR0b24iIG5hbWU9Imdsb2JhbERlZmF1bHRSYWRpbyIgPgogICAgICAgICA8cHJvcGVydHkg bmFtZT0idGV4dCIgPgogICAgICAgICAgPHN0cmluZz4mYW1wO1VzZSBkZWZhdWx0IHNldHRpbmdz PC9zdHJpbmc+CiAgICAgICAgIDwvcHJvcGVydHk+CiAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJj aGVja2VkIiA+CiAgICAgICAgICA8Ym9vbD50cnVlPC9ib29sPgogICAgICAgICA8L3Byb3BlcnR5 PgogICAgICAgIDwvd2lkZ2V0PgogICAgICAgPC9pdGVtPgogICAgICAgPGl0ZW0gcm93PSIzIiBj b2x1bW49IjAiID4KICAgICAgICA8d2lkZ2V0IGNsYXNzPSJRUmFkaW9CdXR0b24iIG5hbWU9ImRp c2FibGVBcmNoaXZpbmdSYWRpbyIgPgogICAgICAgICA8cHJvcGVydHkgbmFtZT0idGV4dCIgPgog ICAgICAgICAgPHN0cmluZz5EaSZhbXA7c2FibGUgYXJjaGl2aW5nPC9zdHJpbmc+CiAgICAgICAg IDwvcHJvcGVydHk+CiAgICAgICAgPC93aWRnZXQ+CiAgICAgICA8L2l0ZW0+CiAgICAgICA8aXRl bSByb3c9IjIiIGNvbHVtbj0iMCIgPgogICAgICAgIDxsYXlvdXQgY2xhc3M9IlFIQm94TGF5b3V0 IiA+CiAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzcGFjaW5nIiA+CiAgICAgICAgICA8bnVtYmVy PjY8L251bWJlcj4KICAgICAgICAgPC9wcm9wZXJ0eT4KICAgICAgICAgPHByb3BlcnR5IG5hbWU9 Im1hcmdpbiIgPgogICAgICAgICAgPG51bWJlcj4wPC9udW1iZXI+CiAgICAgICAgIDwvcHJvcGVy dHk+CiAgICAgICAgIDxpdGVtPgogICAgICAgICAgPGxheW91dCBjbGFzcz0iUVZCb3hMYXlvdXQi ID4KICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3BhY2luZyIgPgogICAgICAgICAgICA8bnVt YmVyPjY8L251bWJlcj4KICAgICAgICAgICA8L3Byb3BlcnR5PgogICAgICAgICAgIDxwcm9wZXJ0 eSBuYW1lPSJtYXJnaW4iID4KICAgICAgICAgICAgPG51bWJlcj4wPC9udW1iZXI+CiAgICAgICAg ICAgPC9wcm9wZXJ0eT4KICAgICAgICAgICA8aXRlbT4KICAgICAgICAgICAgPGxheW91dCBjbGFz cz0iUUhCb3hMYXlvdXQiID4KICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzcGFjaW5nIiA+ CiAgICAgICAgICAgICAgPG51bWJlcj42PC9udW1iZXI+CiAgICAgICAgICAgICA8L3Byb3BlcnR5 PgogICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1hcmdpbiIgPgogICAgICAgICAgICAgIDxu dW1iZXI+MDwvbnVtYmVyPgogICAgICAgICAgICAgPC9wcm9wZXJ0eT4KICAgICAgICAgICAgIDxp dGVtPgogICAgICAgICAgICAgIDx3aWRnZXQgY2xhc3M9IlFSYWRpb0J1dHRvbiIgbmFtZT0ibGlt aXRBcnRpY2xlTnVtYmVyUmFkaW8iID4KICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRl eHQiID4KICAgICAgICAgICAgICAgIDxzdHJpbmc+TGltaXQgYXJjaGkmYW1wO3ZlIHRvOjwvc3Ry aW5nPgogICAgICAgICAgICAgICA8L3Byb3BlcnR5PgogICAgICAgICAgICAgIDwvd2lkZ2V0Pgog ICAgICAgICAgICAgPC9pdGVtPgogICAgICAgICAgICAgPGl0ZW0+CiAgICAgICAgICAgICAgPHdp ZGdldCBjbGFzcz0iS0ludFNwaW5Cb3giIG5hbWU9Im1heEFydGljbGVOdW1iZXJTcGluIiA+CiAg ICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJlbmFibGVkIiA+CiAgICAgICAgICAgICAgICA8 Ym9vbD5mYWxzZTwvYm9vbD4KICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KICAgICAgICAgICAg ICAgPHByb3BlcnR5IG5hbWU9InNwZWNpYWxWYWx1ZVRleHQiID4KICAgICAgICAgICAgICAgIDxz dHJpbmc+MSBhcnRpY2xlPC9zdHJpbmc+CiAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CiAgICAg ICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzdWZmaXgiID4KICAgICAgICAgICAgICAgIDxzdHJp bmc+IGFydGljbGVzPC9zdHJpbmc+CiAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CiAgICAgICAg ICAgICAgPC93aWRnZXQ+CiAgICAgICAgICAgICA8L2l0ZW0+CiAgICAgICAgICAgIDwvbGF5b3V0 PgogICAgICAgICAgIDwvaXRlbT4KICAgICAgICAgICA8aXRlbT4KICAgICAgICAgICAgPGxheW91 dCBjbGFzcz0iUUhCb3hMYXlvdXQiID4KICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzcGFj aW5nIiA+CiAgICAgICAgICAgICAgPG51bWJlcj42PC9udW1iZXI+CiAgICAgICAgICAgICA8L3By b3BlcnR5PgogICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1hcmdpbiIgPgogICAgICAgICAg ICAgIDxudW1iZXI+MDwvbnVtYmVyPgogICAgICAgICAgICAgPC9wcm9wZXJ0eT4KICAgICAgICAg ICAgIDxpdGVtPgogICAgICAgICAgICAgIDx3aWRnZXQgY2xhc3M9IlFSYWRpb0J1dHRvbiIgbmFt ZT0ibGltaXRBcnRpY2xlQWdlUmFkaW8iID4KICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9 InRleHQiID4KICAgICAgICAgICAgICAgIDxzdHJpbmc+JmFtcDtEZWxldGUgYXJ0aWNsZXMgb2xk ZXIgdGhhbjo8L3N0cmluZz4KICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KICAgICAgICAgICAg ICA8L3dpZGdldD4KICAgICAgICAgICAgIDwvaXRlbT4KICAgICAgICAgICAgIDxpdGVtPgogICAg ICAgICAgICAgIDx3aWRnZXQgY2xhc3M9IktJbnRTcGluQm94IiBuYW1lPSJtYXhBcnRpY2xlQWdl U3BpbiIgPgogICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZW5hYmxlZCIgPgogICAgICAg ICAgICAgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CiAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CiAg ICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzcGVjaWFsVmFsdWVUZXh0IiA+CiAgICAgICAg ICAgICAgICA8c3RyaW5nPjEgZGF5PC9zdHJpbmc+CiAgICAgICAgICAgICAgIDwvcHJvcGVydHk+ CiAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzdWZmaXgiID4KICAgICAgICAgICAgICAg IDxzdHJpbmc+IGRheXM8L3N0cmluZz4KICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KICAgICAg ICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZhbHVlIiA+CiAgICAgICAgICAgICAgICA8bnVtYmVy PjE8L251bWJlcj4KICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KICAgICAgICAgICAgICA8L3dp ZGdldD4KICAgICAgICAgICAgIDwvaXRlbT4KICAgICAgICAgICAgPC9sYXlvdXQ+CiAgICAgICAg ICAgPC9pdGVtPgogICAgICAgICAgPC9sYXlvdXQ+CiAgICAgICAgIDwvaXRlbT4KICAgICAgICAg PGl0ZW0+CiAgICAgICAgICA8c3BhY2VyPgogICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvcmll bnRhdGlvbiIgPgogICAgICAgICAgICA8ZW51bT5RdDo6SG9yaXpvbnRhbDwvZW51bT4KICAgICAg ICAgICA8L3Byb3BlcnR5PgogICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaXplVHlwZSIgPgog ICAgICAgICAgICA8ZW51bT5RU2l6ZVBvbGljeTo6RXhwYW5kaW5nPC9lbnVtPgogICAgICAgICAg IDwvcHJvcGVydHk+CiAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNpemVIaW50IiBzdGRzZXQ9 IjAiID4KICAgICAgICAgICAgPHNpemU+CiAgICAgICAgICAgICA8d2lkdGg+OTk8L3dpZHRoPgog ICAgICAgICAgICAgPGhlaWdodD4yMDwvaGVpZ2h0PgogICAgICAgICAgICA8L3NpemU+CiAgICAg ICAgICAgPC9wcm9wZXJ0eT4KICAgICAgICAgIDwvc3BhY2VyPgogICAgICAgICA8L2l0ZW0+CiAg ICAgICAgPC9sYXlvdXQ+CiAgICAgICA8L2l0ZW0+CiAgICAgICA8aXRlbSByb3c9IjQiIGNvbHVt bj0iMCIgPgogICAgICAgIDxzcGFjZXI+CiAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvcmllbnRh dGlvbiIgPgogICAgICAgICAgPGVudW0+UXQ6OlZlcnRpY2FsPC9lbnVtPgogICAgICAgICA8L3By b3BlcnR5PgogICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2l6ZUhpbnQiIHN0ZHNldD0iMCIgPgog ICAgICAgICAgPHNpemU+CiAgICAgICAgICAgPHdpZHRoPjIwPC93aWR0aD4KICAgICAgICAgICA8 aGVpZ2h0PjQwPC9oZWlnaHQ+CiAgICAgICAgICA8L3NpemU+CiAgICAgICAgIDwvcHJvcGVydHk+ CiAgICAgICAgPC9zcGFjZXI+CiAgICAgICA8L2l0ZW0+CiAgICAgICA8aXRlbSByb3c9IjEiIGNv bHVtbj0iMCIgPgogICAgICAgIDx3aWRnZXQgY2xhc3M9IlFSYWRpb0J1dHRvbiIgbmFtZT0ia2Vl cEFsbEFydGljbGVzUmFkaW8iID4KICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRleHQiID4KICAg ICAgICAgIDxzdHJpbmc+JmFtcDtLZWVwIGFsbCBhcnRpY2xlczwvc3RyaW5nPgogICAgICAgICA8 L3Byb3BlcnR5PgogICAgICAgIDwvd2lkZ2V0PgogICAgICAgPC9pdGVtPgogICAgICA8L2xheW91 dD4KICAgICA8L3dpZGdldD4KICAgICA8d2lkZ2V0IGNsYXNzPSJRV2lkZ2V0IiBuYW1lPSJ0YWdz VGFiIiA+CiAgICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSIgPgogICAgICAgPHJlY3Q+CiAg ICAgICAgPHg+MDwveD4KICAgICAgICA8eT4wPC95PgogICAgICAgIDx3aWR0aD40MjI8L3dpZHRo PgogICAgICAgIDxoZWlnaHQ+MTk5PC9oZWlnaHQ+CiAgICAgICA8L3JlY3Q+CiAgICAgIDwvcHJv cGVydHk+CiAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGl0bGUiID4KICAgICAgIDxzdHJpbmc+JmFt cDtUYWdzPC9zdHJpbmc+CiAgICAgIDwvYXR0cmlidXRlPgogICAgICA8bGF5b3V0IGNsYXNzPSJR R3JpZExheW91dCIgPgogICAgICAgPHByb3BlcnR5IG5hbWU9Im1hcmdpbiIgPgogICAgICAgIDxu dW1iZXI+ODwvbnVtYmVyPgogICAgICAgPC9wcm9wZXJ0eT4KICAgICAgIDxwcm9wZXJ0eSBuYW1l PSJzcGFjaW5nIiA+CiAgICAgICAgPG51bWJlcj42PC9udW1iZXI+CiAgICAgICA8L3Byb3BlcnR5 PgogICAgICAgPGl0ZW0gcm93PSIxIiBjb2x1bW49IjAiID4KICAgICAgICA8c3BhY2VyPgogICAg ICAgICA8cHJvcGVydHkgbmFtZT0ib3JpZW50YXRpb24iID4KICAgICAgICAgIDxlbnVtPlF0OjpW ZXJ0aWNhbDwvZW51bT4KICAgICAgICAgPC9wcm9wZXJ0eT4KICAgICAgICAgPHByb3BlcnR5IG5h bWU9InNpemVIaW50IiBzdGRzZXQ9IjAiID4KICAgICAgICAgIDxzaXplPgogICAgICAgICAgIDx3 aWR0aD40MTQ8L3dpZHRoPgogICAgICAgICAgIDxoZWlnaHQ+MTQxPC9oZWlnaHQ+CiAgICAgICAg ICA8L3NpemU+CiAgICAgICAgIDwvcHJvcGVydHk+CiAgICAgICAgPC9zcGFjZXI+CiAgICAgICA8 L2l0ZW0+CiAgICAgICA8aXRlbSByb3c9IjAiIGNvbHVtbj0iMCIgPgogICAgICAgIDxsYXlvdXQg Y2xhc3M9IlFWQm94TGF5b3V0IiA+CiAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzcGFjaW5nIiA+ CiAgICAgICAgICA8bnVtYmVyPjY8L251bWJlcj4KICAgICAgICAgPC9wcm9wZXJ0eT4KICAgICAg ICAgPHByb3BlcnR5IG5hbWU9Im1hcmdpbiIgPgogICAgICAgICAgPG51bWJlcj4wPC9udW1iZXI+ CiAgICAgICAgIDwvcHJvcGVydHk+CiAgICAgICAgPC9sYXlvdXQ+CiAgICAgICA8L2l0ZW0+CiAg ICAgIDwvbGF5b3V0PgogICAgIDwvd2lkZ2V0PgogICAgPC93aWRnZXQ+CiAgIDwvaXRlbT4KICA8 L2xheW91dD4KIDwvd2lkZ2V0PgogPGxheW91dGRlZmF1bHQgc3BhY2luZz0iNiIgbWFyZ2luPSIx MSIgLz4KIDxwaXhtYXBmdW5jdGlvbj5xUGl4bWFwRnJvbU1pbWVTb3VyY2U8L3BpeG1hcGZ1bmN0 aW9uPgogPGN1c3RvbXdpZGdldHM+CiAgPGN1c3RvbXdpZGdldD4KICAgPGNsYXNzPktJbnRTcGlu Qm94PC9jbGFzcz4KICAgPGV4dGVuZHM+UVNwaW5Cb3g8L2V4dGVuZHM+CiAgIDxoZWFkZXI+a251 bWlucHV0Lmg8L2hlYWRlcj4KICA8L2N1c3RvbXdpZGdldD4KICA8Y3VzdG9td2lkZ2V0PgogICA8 Y2xhc3M+S0xpbmVFZGl0PC9jbGFzcz4KICAgPGV4dGVuZHM+UUxpbmVFZGl0PC9leHRlbmRzPgog ICA8aGVhZGVyPmtsaW5lZWRpdC5oPC9oZWFkZXI+CiAgPC9jdXN0b213aWRnZXQ+CiA8L2N1c3Rv bXdpZGdldHM+CiA8cmVzb3VyY2VzLz4KIDxjb25uZWN0aW9ucy8+CjwvdWk+CgAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAa3Jzcy9rcnNzcmVhZGVyL3N0YW5kYXJkYWN0aW9ubWFuYWdlci5jcHAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA2 NDQAMDAwMTc1MAAwMDAxNzUwADAwMDAwMDQwMTY3ADExMDI2NDA2NzQxADAyMDYxNwAgMAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHZvbmFtaQAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAdm9uYW1pAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAvKgogICAgQ29weXJpZ2h0IChDKSAyMDA4ICAgIERtaXRyeSBJdmFub3YgPHZvbmFt aUBnbWFpbC5jb20+CiAgICBQYXJ0IG9mIHRoZSBjb2RlIGJvcnJvd2VkIGZyb20ga2RlcGltbGli cy9ha29uYWRpL3N0YW5kYXJkYWN0aW9ubWFuYWdlci5jcHAKCiAgICBUaGlzIHByb2dyYW0gaXMg ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAg aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBw dWJsaXNoZWQgYnkKICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJz aW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2 ZXJzaW9uLgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0 IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0 IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICAgWW91IHNob3VsZCBoYXZlIHJlY2Vp dmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFsb25nIHdp dGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNl cy8+LgoqLwoKI2luY2x1ZGUgImtyc3NpbnRlcmZhY2UuaCIKI2luY2x1ZGUgInN0YW5kYXJkYWN0 aW9ubWFuYWdlci5oIgojaW5jbHVkZSAiZmVlZGxpc3Rtb2RlbC5oIgojaW5jbHVkZSAic3Vic2Ny aXB0aW9uc21vZGVsLmgiCiNpbmNsdWRlICJmZWVkcHJvcGVydGllc2RpYWxvZy5oIgojaW5jbHVk ZSAiLi4vbGlia3Jzcy9mZWVkcHJvcGVydGllc2NvbGxlY3Rpb25hdHRyaWJ1dGUuaCIKI2luY2x1 ZGUgIi4uL2xpYmtyc3MvdGFnc2NvbGxlY3Rpb25hdHRyaWJ1dGUuaCIKI2luY2x1ZGUgIi4uL2xp Ymtyc3Mvc3Vic2NyaXB0aW9ubGFiZWxzY29sbGVjdGlvbmF0dHJpYnV0ZS5oIgoKI2luY2x1ZGUg PGFrb25hZGkvY29sbGVjdGlvbm1vZGVsLmg+CiNpbmNsdWRlIDxha29uYWRpL2NvbGxlY3Rpb25j cmVhdGVqb2IuaD4KI2luY2x1ZGUgPGFrb25hZGkvY29sbGVjdGlvbm1vZGlmeWpvYi5oPgojaW5j bHVkZSA8YWtvbmFkaS9jb2xsZWN0aW9uZGVsZXRlam9iLmg+CiNpbmNsdWRlIDxha29uYWRpL2Fn ZW50bWFuYWdlci5oPgojaW5jbHVkZSA8S0FjdGlvbj4KI2luY2x1ZGUgPEtBY3Rpb25Db2xsZWN0 aW9uPgojaW5jbHVkZSA8S0RlYnVnPgojaW5jbHVkZSA8S0xvY2FsZT4KI2luY2x1ZGUgPEtJbnB1 dERpYWxvZz4KI2luY2x1ZGUgPEtNZXNzYWdlQm94PgoKI2luY2x1ZGUgPFFJdGVtU2VsZWN0aW9u TW9kZWw+CiNpbmNsdWRlIDxRVHJlZVZpZXc+CgojaW5jbHVkZSA8Ym9vc3Qvc3RhdGljX2Fzc2Vy dC5ocHA+CgpzdGF0aWMgY29uc3Qgc3RydWN0IHsKICAgICAgICBjb25zdCBjaGFyICpuYW1lOwog ICAgICAgIGNvbnN0IGNoYXIgKmxhYmVsOwogICAgICAgIGNvbnN0IGNoYXIgKmljb247CiAgICAg ICAgaW50IHNob3J0Y3V0OwogICAgICAgIGNvbnN0IGNoYXIqIHNsb3Q7Cn0gYWN0aW9uRGF0YVtd ID0gewogICAgICAgIHsgImtyc3NyZWFkZXJfZmVlZF9jcmVhdGUiLCBJMThOX05PT1AoICImTmV3 IEZlZWQuLi4iICksICJmb2xkZXItbmV3IiwgMCwgU0xPVCggc2xvdENyZWF0ZUZlZWQoKSApIH0s CiAgICAgICAgeyAia3Jzc3JlYWRlcl9mZWVkX3N5bmMiLCBJMThOX05PT1AoICImRmV0Y2ggRmVl ZCIgKSwgInZpZXctcmVmcmVzaCIsIFF0OjpLZXlfRjUsIFNMT1QoIHNsb3RTeW5jaHJvbml6ZUZl ZWQoKSApIH0sCiAgICAgICAgeyAia3Jzc3JlYWRlcl9mZWVkX3Byb3BlcnRpZXMiLCBJMThOX05P T1AoICJGZWVkICZQcm9wZXJ0aWVzLi4uIiApLCAiY29uZmlndXJlIiwgMCwgU0xPVCggc2xvdEZl ZWRQcm9wZXJ0aWVzKCkgKSB9LAogICAgICAgIHsgImtyc3NyZWFkZXJfZmVlZF9kZWxldGUiLCBJ MThOX05PT1AoICImRGVsZXRlIEZlZWQiICksICJlZGl0LWRlbGV0ZSIsIDAsIFNMT1QoIHNsb3RE ZWxldGVGZWVkKCkgKSB9LAogICAgICAgIHsgImtyc3NyZWFkZXJfZmVlZF9hdHRhY2huZXd0YWci LCBJMThOX05PT1AoICImQXR0YWNoIGEgbmV3IHRhZyIgKSwgIiIsIDAsIFNMT1QoIHNsb3RBdHRh Y2hOZXdUYWcoKSApIH0sCiAgICAgICAgeyAia3Jzc3JlYWRlcl9mZWVkX2RldGFjaHRhZyIsIEkx OE5fTk9PUCggIiZEZXRhY2ggdGhlIHRhZyIgKSwgIiIsIDAsIFNMT1QoIHNsb3REZXRhY2hUYWco KSApIH0sCiAgICAgICAgeyAia3Jzc3JlYWRlcl9tYW5hZ2Vfc3Vic2NyaXB0aW9ucyIsIEkxOE5f Tk9PUCggIiZNYW5hZ2Ugc3Vic2NyaXB0aW9ucyIgKSwgIiIsIDAsIFNMT1QoIHNsb3RNYW5hZ2VT dWJzY3JpcHRpb25zKCkgKSB9Cn07CnN0YXRpYyBjb25zdCBpbnQgbnVtQWN0aW9uRGF0YSA9IHNp emVvZiAoYWN0aW9uRGF0YSkgLyBzaXplb2YgKCphY3Rpb25EYXRhKTsKCkJPT1NUX1NUQVRJQ19B U1NFUlQoIG51bUFjdGlvbkRhdGEgPT0gU3RhbmRhcmRBY3Rpb25NYW5hZ2VyOjpMYXN0VHlwZSAp OwoKU3RhbmRhcmRBY3Rpb25NYW5hZ2VyOjpTdGFuZGFyZEFjdGlvbk1hbmFnZXIoIEtBY3Rpb25D b2xsZWN0aW9uICphY3Rpb25Db2xsZWN0aW9uLCBRV2lkZ2V0ICpwYXJlbnQgKQogICAgICAgIDog bV9hY3Rpb25Db2xsZWN0aW9uKCBhY3Rpb25Db2xsZWN0aW9uICksIG1fcGFyZW50V2lkZ2V0KCBw YXJlbnQgKQp7CiAgICAgICAgbV9hY3Rpb25zLmZpbGwoIDAsIFN0YW5kYXJkQWN0aW9uTWFuYWdl cjo6TGFzdFR5cGUgKTsKfQoKU3RhbmRhcmRBY3Rpb25NYW5hZ2VyOjp+U3RhbmRhcmRBY3Rpb25N YW5hZ2VyKCkKewp9Cgp2b2lkIFN0YW5kYXJkQWN0aW9uTWFuYWdlcjo6c2V0RmVlZFNlbGVjdGlv bk1vZGVsKCBRSXRlbVNlbGVjdGlvbk1vZGVsICpmZWVkU2VsZWN0aW9uTW9kZWwgKQp7CiAgICAg ICAgbV9mZWVkU2VsZWN0aW9uTW9kZWwgPSBmZWVkU2VsZWN0aW9uTW9kZWw7CiAgICAgICAgY29u bmVjdCggbV9mZWVkU2VsZWN0aW9uTW9kZWwsIFNJR05BTCggc2VsZWN0aW9uQ2hhbmdlZCggUUl0 ZW1TZWxlY3Rpb24sIFFJdGVtU2VsZWN0aW9uICkgKSwKICAgICAgICAgICAgICAgICB0aGlzLCBT TE9UKCB1cGRhdGVBY3Rpb25zKCkgKSApOwp9CgoKdm9pZCBTdGFuZGFyZEFjdGlvbk1hbmFnZXI6 OnNldFN1YnNjcmlwdGlvbkxhYmVsKCBjb25zdCBRU3RyaW5nICZzdWJzY3JpcHRpb25MYWJlbCAp CnsKICAgICAgICBtX3N1YnNjcmlwdGlvbkxhYmVsID0gc3Vic2NyaXB0aW9uTGFiZWw7Cn0KCktB Y3Rpb24qIFN0YW5kYXJkQWN0aW9uTWFuYWdlcjo6YWN0aW9uKCBTdGFuZGFyZEFjdGlvbk1hbmFn ZXI6OlR5cGUgdHlwZSApCnsKICAgICAgICBRX0FTU0VSVCggdHlwZSA+PSAwICYmIHR5cGUgPCBT dGFuZGFyZEFjdGlvbk1hbmFnZXI6Okxhc3RUeXBlICk7CiAgICAgICAgUV9BU1NFUlQoIGFjdGlv bkRhdGFbIHR5cGUgXS5uYW1lICk7CgogICAgICAgIGlmICggbV9hY3Rpb25zWyB0eXBlIF0gKQog ICAgICAgICAgICAgICAgcmV0dXJuIG1fYWN0aW9uc1sgdHlwZSBdOwoKICAgICAgICBLQWN0aW9u ICphY3Rpb24gPSBuZXcgS0FjdGlvbiggbV9wYXJlbnRXaWRnZXQgKTsKICAgICAgICBpZiAoIGFj dGlvbkRhdGFbIHR5cGUgXS5sYWJlbCApCiAgICAgICAgICAgICAgICBhY3Rpb24tPnNldFRleHQo IGkxOG4oIGFjdGlvbkRhdGFbIHR5cGUgXS5sYWJlbCApICk7CgogICAgICAgIGlmICggYWN0aW9u RGF0YVsgdHlwZSBdLmljb24gKQogICAgICAgICAgICAgICAgYWN0aW9uLT5zZXRJY29uKCBLSWNv biggUVN0cmluZzo6ZnJvbUxhdGluMSggYWN0aW9uRGF0YVsgdHlwZSBdLmljb24gKSApICk7Cgog ICAgICAgIGFjdGlvbi0+c2V0U2hvcnRjdXQoIGFjdGlvbkRhdGFbIHR5cGUgXS5zaG9ydGN1dCAp OwoKICAgICAgICBpZiAoIGFjdGlvbkRhdGFbIHR5cGUgXS5zbG90ICkKICAgICAgICAgICAgICAg IGNvbm5lY3QoIGFjdGlvbiwgU0lHTkFMKCB0cmlnZ2VyZWQoKSApLAogICAgICAgICAgICAgICAg ICAgICAgICAgdGhpcywgYWN0aW9uRGF0YVsgdHlwZSBdLnNsb3QgKTsKCiAgICAgICAgbV9hY3Rp b25Db2xsZWN0aW9uLT5hZGRBY3Rpb24oIFFTdHJpbmc6OmZyb21MYXRpbjEoIGFjdGlvbkRhdGFb IHR5cGUgXS5uYW1lICksIGFjdGlvbiApOwogICAgICAgIG1fYWN0aW9uc1sgdHlwZSBdID0gYWN0 aW9uOwogICAgICAgIHVwZGF0ZUFjdGlvbnMoKTsKICAgICAgICByZXR1cm4gYWN0aW9uOwp9Cgp2 b2lkIFN0YW5kYXJkQWN0aW9uTWFuYWdlcjo6Y3JlYXRlQWxsQWN0aW9ucygpCnsKICAgICAgICBm b3IgKCBpbnQgaSA9IDA7IGkgPCBMYXN0VHlwZTsgKytpICkKICAgICAgICAgICAgICAgIGFjdGlv biggKFR5cGUpaSApOwp9Cgp2b2lkIFN0YW5kYXJkQWN0aW9uTWFuYWdlcjo6ZW5hYmxlQWN0aW9u KCBTdGFuZGFyZEFjdGlvbk1hbmFnZXI6OlR5cGUgdHlwZSwgYm9vbCBlbmFibGUgKQp7CiAgICAg ICAgUV9BU1NFUlQoIHR5cGUgPj0gMCAmJiB0eXBlIDwgU3RhbmRhcmRBY3Rpb25NYW5hZ2VyOjpM YXN0VHlwZSApOwogICAgICAgIGlmICggbV9hY3Rpb25zWyB0eXBlIF0gKQogICAgICAgICAgICAg ICAgbV9hY3Rpb25zWyB0eXBlIF0tPnNldEVuYWJsZWQoIGVuYWJsZSApOwp9Cgp2b2lkIFN0YW5k YXJkQWN0aW9uTWFuYWdlcjo6dXBkYXRlQWN0aW9ucygpCnsKICAgICAgICAvLyBGSVhNRTogb25s eSBzaW5nbGUgc2VsZWN0aW9ucwogICAgICAgIFFNb2RlbEluZGV4IHNlbGVjdGVkSW5kZXg7CiAg ICAgICAgaWYgKCBtX2ZlZWRTZWxlY3Rpb25Nb2RlbCAmJiBtX2ZlZWRTZWxlY3Rpb25Nb2RlbC0+ aGFzU2VsZWN0aW9uKCkgKQogICAgICAgICAgICAgICAgc2VsZWN0ZWRJbmRleCA9IG1fZmVlZFNl bGVjdGlvbk1vZGVsLT5zZWxlY3RlZFJvd3MoKS5maXJzdCgpOwoKICAgICAgICBpZiAoICFzZWxl Y3RlZEluZGV4LmlzVmFsaWQoKSApCiAgICAgICAgICAgICAgICByZXR1cm47CgogICAgICAgIC8v IEZJWE1FOiBiZXR0ZXIgdG8gcXVlcnkgdGhlIHR5cGUgb2YgdGhlIG5vZGUKICAgICAgICBjb25z dCBBa29uYWRpOjpDb2xsZWN0aW9uIGNvbCA9IHNlbGVjdGVkSW5kZXguZGF0YSggQWtvbmFkaTo6 Q29sbGVjdGlvbk1vZGVsOjpDb2xsZWN0aW9uUm9sZSApLnZhbHVlPEFrb25hZGk6OkNvbGxlY3Rp b24+KCk7CiAgICAgICAgZW5hYmxlQWN0aW9uKCBTdGFuZGFyZEFjdGlvbk1hbmFnZXI6OkNyZWF0 ZUZlZWQsIHRydWUgKTsKICAgICAgICBlbmFibGVBY3Rpb24oIFN0YW5kYXJkQWN0aW9uTWFuYWdl cjo6U3luY2hyb25pemVGZWVkLCBjb2wuaXNWYWxpZCgpICk7CiAgICAgICAgZW5hYmxlQWN0aW9u KCBTdGFuZGFyZEFjdGlvbk1hbmFnZXI6OkZlZWRQcm9wZXJ0aWVzLCBjb2wuaXNWYWxpZCgpICk7 CiAgICAgICAgZW5hYmxlQWN0aW9uKCBTdGFuZGFyZEFjdGlvbk1hbmFnZXI6OkRlbGV0ZUZlZWQs IGNvbC5pc1ZhbGlkKCkgJiYKICAgICAgICAgICAgICAgICAgICAgICggY29sLnJpZ2h0cygpICYg QWtvbmFkaTo6Q29sbGVjdGlvbjo6Q2FuRGVsZXRlQ29sbGVjdGlvbiApICk7CiAgICAgICAgZW5h YmxlQWN0aW9uKCBTdGFuZGFyZEFjdGlvbk1hbmFnZXI6OkF0dGFjaE5ld1RhZywgY29sLmlzVmFs aWQoKSApOwogICAgICAgIGVuYWJsZUFjdGlvbiggU3RhbmRhcmRBY3Rpb25NYW5hZ2VyOjpEZXRh Y2hUYWcsIGNvbC5pc1ZhbGlkKCkgJiYgY29sLmhhc0F0dHJpYnV0ZSggIlRhZ3MiICkgJiYKICAg ICAgICAgICAgICAgICAgICAgICFjb2wuYXR0cmlidXRlPFRhZ3NDb2xsZWN0aW9uQXR0cmlidXRl PigpLT50YWdzKCkuaXNFbXB0eSgpICk7CiAgICAgICAgZW5hYmxlQWN0aW9uKCBTdGFuZGFyZEFj dGlvbk1hbmFnZXI6Ok1hbmFnZVN1YnNjcmlwdGlvbnMsIHRydWUgKTsKfQoKdm9pZCBTdGFuZGFy ZEFjdGlvbk1hbmFnZXI6OnNsb3RDcmVhdGVGZWVkKCkKewogICAgICAgIGNvbnN0IFFTdHJpbmcg dXJsID0gS0lucHV0RGlhbG9nOjpnZXRUZXh0KCBpMThuYyggIkB0aXRsZTp3aW5kb3ciLCAiTmV3 IFNvdXJjZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGkxOG5jKCAiQGxhYmVsOnRleHRib3gsIG5hbWUgb2YgYSB0aGluZyIsICJGZWVkIFVSTCIp LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFTdHJp bmcoKSwgMCwgbV9wYXJlbnRXaWRnZXQgKTsKCiAgICAgICAgaWYgKCB1cmwuaXNFbXB0eSgpICkK ICAgICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgLy9vcmc6OmtkZTo6a3JzcyAqa3Jzc0lu dGVyZmFjZSA9IG5ldyBvcmc6OmtkZTo6a3JzcyggIm9yZy5rZGUua3JzcyIsICIvIiwgUURCdXND b25uZWN0aW9uOjpzZXNzaW9uQnVzKCksIHRoaXMgKTsKICAgICAgICAvL2tyc3NJbnRlcmZhY2Ut PmFkZEZlZWQoIHVybCwgImtyc3NyZWFkZXIiICk7CgogICAgICAgIC8vIHRoaXMgc3R1ZmYgaXMg YnJva2VuCiAgICAgICAgLypjb25zdCBGZWVkbGlzdE1vZGVsICpzb3VyY2VNb2RlbCA9IHFvYmpl Y3RfY2FzdDxjb25zdCBGZWVkbGlzdE1vZGVsKj4oIG1fZmVlZFNlbGVjdGlvbk1vZGVsLT5tb2Rl bCgpICk7CiAgICAgICAgQWtvbmFkaTo6Q29sbGVjdGlvbjo6SWQgcGFyZW50SWQgPSBzb3VyY2VN b2RlbC0+cm9vdENvbGxlY3Rpb24oKS5pZCgpOwogICAgICAgIEFrb25hZGk6OkNvbGxlY3Rpb24g Y29sOwogICAgICAgIGNvbC5zZXROYW1lKCB1cmwgKTsKICAgICAgICBjb2wuc2V0UGFyZW50KCBw YXJlbnRJZCApOwogICAgICAgIGNvbC5zZXRDb250ZW50TWltZVR5cGVzKCBRU3RyaW5nTGlzdCgg ImFwcGxpY2F0aW9uL3Jzcyt4bWwiICkgKTsKICAgICAgICBGZWVkUHJvcGVydGllc0NvbGxlY3Rp b25BdHRyaWJ1dGUgKmZlZWRQcm9wZXJ0aWVzID0gbmV3IEZlZWRQcm9wZXJ0aWVzQ29sbGVjdGlv bkF0dHJpYnV0ZSgpOwogICAgICAgIGZlZWRQcm9wZXJ0aWVzLT5zZXRYbWxVcmwoIHVybCApOwog ICAgICAgIGNvbC5hZGRBdHRyaWJ1dGUoIGZlZWRQcm9wZXJ0aWVzICk7CiAgICAgICAgQWtvbmFk aTo6Q29sbGVjdGlvbkNyZWF0ZUpvYiAqam9iID0gbmV3IEFrb25hZGk6OkNvbGxlY3Rpb25DcmVh dGVKb2IoIGNvbCApOwogICAgICAgIGNvbm5lY3QoIGpvYiwgU0lHTkFMKCByZXN1bHQoIEtKb2Iq ICkgKSwKICAgICAgICAgICAgICAgICB0aGlzLCBTTE9UKCBjb2xsZWN0aW9uQ3JlYXRpb25SZXN1 bHQoIEtKb2IqICkgKSApOyovCn0KCnZvaWQgU3RhbmRhcmRBY3Rpb25NYW5hZ2VyOjpzbG90U3lu Y2hyb25pemVGZWVkKCkKewogICAgICAgIC8vIEZJWE1FOiBvbmx5IHNpbmdsZSBzZWxlY3Rpb25z CiAgICAgICAgUU1vZGVsSW5kZXggc2VsZWN0ZWRJbmRleDsKICAgICAgICBpZiAoIG1fZmVlZFNl bGVjdGlvbk1vZGVsICYmIG1fZmVlZFNlbGVjdGlvbk1vZGVsLT5oYXNTZWxlY3Rpb24oKSApCiAg ICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4ID0gbV9mZWVkU2VsZWN0aW9uTW9kZWwtPnNlbGVj dGVkUm93cygpLmZpcnN0KCk7CgogICAgICAgIGlmICggIXNlbGVjdGVkSW5kZXguaXNWYWxpZCgp ICkKICAgICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgY29uc3QgQWtvbmFkaTo6Q29sbGVj dGlvbiBjb2wgPSBzZWxlY3RlZEluZGV4LmRhdGEoIEFrb25hZGk6OkNvbGxlY3Rpb25Nb2RlbDo6 Q29sbGVjdGlvblJvbGUgKS52YWx1ZTxBa29uYWRpOjpDb2xsZWN0aW9uPigpOwogICAgICAgIEFr b25hZGk6OkFnZW50TWFuYWdlcjo6c2VsZigpLT5zeW5jaHJvbml6ZUNvbGxlY3Rpb24oIGNvbCAp Owp9Cgp2b2lkIFN0YW5kYXJkQWN0aW9uTWFuYWdlcjo6c2xvdEZlZWRQcm9wZXJ0aWVzKCkKewog ICAgICAgIFFNb2RlbEluZGV4IHNlbGVjdGVkSW5kZXg7CiAgICAgICAgaWYgKCBtX2ZlZWRTZWxl Y3Rpb25Nb2RlbCAmJiBtX2ZlZWRTZWxlY3Rpb25Nb2RlbC0+aGFzU2VsZWN0aW9uKCkgKQogICAg ICAgICAgICAgICAgc2VsZWN0ZWRJbmRleCA9IG1fZmVlZFNlbGVjdGlvbk1vZGVsLT5zZWxlY3Rl ZFJvd3MoKS5maXJzdCgpOwoKICAgICAgICBpZiAoICFzZWxlY3RlZEluZGV4LmlzVmFsaWQoKSAp CiAgICAgICAgICAgICAgICByZXR1cm47CgogICAgICAgIEFrb25hZGk6OkNvbGxlY3Rpb24gY29s ID0gc2VsZWN0ZWRJbmRleC5kYXRhKCBBa29uYWRpOjpDb2xsZWN0aW9uTW9kZWw6OkNvbGxlY3Rp b25Sb2xlICkudmFsdWU8QWtvbmFkaTo6Q29sbGVjdGlvbj4oKTsKCiAgICAgICAgRmVlZFByb3Bl cnRpZXNEaWFsb2cgKmRpYWxvZyA9IG5ldyBGZWVkUHJvcGVydGllc0RpYWxvZygpOwogICAgICAg IGRpYWxvZy0+c2V0RmVlZE5hbWUoIGNvbC5uYW1lKCkgKTsKICAgICAgICBpZiAoIGNvbC5oYXNB dHRyaWJ1dGUoICJGZWVkUHJvcGVydGllcyIgKSApIHsKICAgICAgICAgICAgICAgIEZlZWRQcm9w ZXJ0aWVzQ29sbGVjdGlvbkF0dHJpYnV0ZSAqcHJvcHMgPSBjb2wuYXR0cmlidXRlPEZlZWRQcm9w ZXJ0aWVzQ29sbGVjdGlvbkF0dHJpYnV0ZT4oKTsKICAgICAgICAgICAgICAgIGRpYWxvZy0+c2V0 VXJsKCBwcm9wcy0+eG1sVXJsKCkgKTsKICAgICAgICB9CgogICAgICAgIGlmICggZGlhbG9nLT5l eGVjKCkgPT0gUURpYWxvZzo6QWNjZXB0ZWQgKSB7CiAgICAgICAgICAgICAgICAvLyBzZXQgZmVl ZCdzIG5hbWUKICAgICAgICAgICAgICAgIGNvbC5zZXROYW1lKCBkaWFsb2ctPmZlZWROYW1lKCkg KTsKCiAgICAgICAgICAgICAgICAvLyBzZXQgZmVlZCdzIHByb3BlcnRpZXMKICAgICAgICAgICAg ICAgIEZlZWRQcm9wZXJ0aWVzQ29sbGVjdGlvbkF0dHJpYnV0ZSAqcHJvcHM7CiAgICAgICAgICAg ICAgICBpZiAoIGNvbC5oYXNBdHRyaWJ1dGUoICJGZWVkUHJvcGVydGllcyIgKSApIHsKICAgICAg ICAgICAgICAgICAgICAgICAgcHJvcHMgPSBjb2wuYXR0cmlidXRlPEZlZWRQcm9wZXJ0aWVzQ29s bGVjdGlvbkF0dHJpYnV0ZT4oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVs c2UgewogICAgICAgICAgICAgICAgICAgICAgICBwcm9wcyA9IG5ldyBGZWVkUHJvcGVydGllc0Nv bGxlY3Rpb25BdHRyaWJ1dGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29sLmFkZEF0dHJp YnV0ZSggcHJvcHMgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHByb3BzLT5z ZXRYbWxVcmwoIGRpYWxvZy0+dXJsKCkgKTsKCiAgICAgICAgICAgICAgICAvLyBzYXZlIHRoZSBj b2xsZWN0aW9uCiAgICAgICAgICAgICAgICBBa29uYWRpOjpDb2xsZWN0aW9uTW9kaWZ5Sm9iICpq b2IgPSBuZXcgQWtvbmFkaTo6Q29sbGVjdGlvbk1vZGlmeUpvYiggY29sLCB0aGlzICk7CiAgICAg ICAgICAgICAgICBjb25uZWN0KCBqb2IsIFNJR05BTCggcmVzdWx0KCBLSm9iKiApICksCiAgICAg ICAgICAgICAgICAgICAgICAgICB0aGlzLCBTTE9UKCBjb2xsZWN0aW9uTW9kaWZ5UmVzdWx0KCBL Sm9iKiApICkgKTsKICAgICAgICB9CgogICAgICAgIGRlbGV0ZSBkaWFsb2c7Cn0KCnZvaWQgU3Rh bmRhcmRBY3Rpb25NYW5hZ2VyOjpzbG90RGVsZXRlRmVlZCgpCnsKICAgICAgICAvLyBGSVhNRTog b25seSBzaW5nbGUgc2VsZWN0aW9ucwogICAgICAgIFFNb2RlbEluZGV4IHNlbGVjdGVkSW5kZXg7 CiAgICAgICAgaWYgKCBtX2ZlZWRTZWxlY3Rpb25Nb2RlbCAmJiBtX2ZlZWRTZWxlY3Rpb25Nb2Rl bC0+aGFzU2VsZWN0aW9uKCkgKQogICAgICAgICAgICAgICAgc2VsZWN0ZWRJbmRleCA9IG1fZmVl ZFNlbGVjdGlvbk1vZGVsLT5zZWxlY3RlZFJvd3MoKS5maXJzdCgpOwoKICAgICAgICBpZiAoICFz ZWxlY3RlZEluZGV4LmlzVmFsaWQoKSApCiAgICAgICAgICAgICAgICByZXR1cm47CgogICAgICAg IGNvbnN0IEFrb25hZGk6OkNvbGxlY3Rpb24gY29sID0gc2VsZWN0ZWRJbmRleC5kYXRhKCBBa29u YWRpOjpDb2xsZWN0aW9uTW9kZWw6OkNvbGxlY3Rpb25Sb2xlICkudmFsdWU8QWtvbmFkaTo6Q29s bGVjdGlvbj4oKTsKICAgICAgICBBa29uYWRpOjpDb2xsZWN0aW9uRGVsZXRlSm9iICpqb2IgPSBu ZXcgQWtvbmFkaTo6Q29sbGVjdGlvbkRlbGV0ZUpvYiggY29sLCB0aGlzICk7CiAgICAgICAgY29u bmVjdCggam9iLCBTSUdOQUwoIHJlc3VsdCggS0pvYiogKSApLAogICAgICAgICAgICAgICAgICB0 aGlzLCBTTE9UKCBjb2xsZWN0aW9uRGVsZXRpb25SZXN1bHQoIEtKb2IqICkgKSApOwp9Cgp2b2lk IFN0YW5kYXJkQWN0aW9uTWFuYWdlcjo6c2xvdEF0dGFjaE5ld1RhZygpCnsKICAgICAgICBRTW9k ZWxJbmRleCBzZWxlY3RlZEluZGV4OwogICAgICAgIGlmICggbV9mZWVkU2VsZWN0aW9uTW9kZWwg JiYgbV9mZWVkU2VsZWN0aW9uTW9kZWwtPmhhc1NlbGVjdGlvbigpICkKICAgICAgICAgICAgICAg IHNlbGVjdGVkSW5kZXggPSBtX2ZlZWRTZWxlY3Rpb25Nb2RlbC0+c2VsZWN0ZWRSb3dzKCkuZmly c3QoKTsKCiAgICAgICAgaWYgKCAhc2VsZWN0ZWRJbmRleC5pc1ZhbGlkKCkgKQogICAgICAgICAg ICAgICAgcmV0dXJuOwoKICAgICAgICBjb25zdCBRU3RyaW5nIHRhZyA9IEtJbnB1dERpYWxvZzo6 Z2V0VGV4dCggaTE4bmMoICJAdGl0bGU6d2luZG93IiwgIkFkZCBhIG5ldyB0YWcgdG8gdGhpcyBm ZWVkIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg aTE4bmMoICJAbGFiZWw6dGV4dGJveCwgbmFtZSBvZiBhIHRoaW5nIiwgIk5ldyB0YWciKSwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRU3RyaW5nKCks IDAsIG1fcGFyZW50V2lkZ2V0ICk7CgogICAgICAgIGlmICggdGFnLmlzRW1wdHkoKSApCiAgICAg ICAgICAgICAgICByZXR1cm47CgogICAgICAgIEFrb25hZGk6OkNvbGxlY3Rpb24gY29sID0gc2Vs ZWN0ZWRJbmRleC5kYXRhKCBBa29uYWRpOjpDb2xsZWN0aW9uTW9kZWw6OkNvbGxlY3Rpb25Sb2xl ICkudmFsdWU8QWtvbmFkaTo6Q29sbGVjdGlvbj4oKTsKICAgICAgICBpZiAoIGNvbC5oYXNBdHRy aWJ1dGUoICJUYWdzIiApICkgewogICAgICAgICAgICAgICAgY29sLmF0dHJpYnV0ZTxUYWdzQ29s bGVjdGlvbkF0dHJpYnV0ZT4oKS0+YWRkVGFnKCB0YWcgKTsKICAgICAgICB9CiAgICAgICAgZWxz ZSB7CiAgICAgICAgICAgICAgICBUYWdzQ29sbGVjdGlvbkF0dHJpYnV0ZSAqdGFncyA9IG5ldyBU YWdzQ29sbGVjdGlvbkF0dHJpYnV0ZSggUVN0cmluZ0xpc3QoIHRhZyApICk7CiAgICAgICAgICAg ICAgICBjb2wuYWRkQXR0cmlidXRlKCB0YWdzICk7CiAgICAgICAgfQoKICAgICAgICBBa29uYWRp OjpDb2xsZWN0aW9uTW9kaWZ5Sm9iICpqb2IgPSBuZXcgQWtvbmFkaTo6Q29sbGVjdGlvbk1vZGlm eUpvYiggY29sLCB0aGlzICk7CiAgICAgICAgY29ubmVjdCggam9iLCBTSUdOQUwoIHJlc3VsdCgg S0pvYiogKSApLAogICAgICAgICAgICAgICAgICB0aGlzLCBTTE9UKCBjb2xsZWN0aW9uTW9kaWZ5 UmVzdWx0KCBLSm9iKiApICkgKTsKfQoKdm9pZCBTdGFuZGFyZEFjdGlvbk1hbmFnZXI6OnNsb3RE ZXRhY2hUYWcoKQp7CiAgICAgICAgUU1vZGVsSW5kZXggc2VsZWN0ZWRJbmRleDsKICAgICAgICBp ZiAoIG1fZmVlZFNlbGVjdGlvbk1vZGVsICYmIG1fZmVlZFNlbGVjdGlvbk1vZGVsLT5oYXNTZWxl Y3Rpb24oKSApCiAgICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4ID0gbV9mZWVkU2VsZWN0aW9u TW9kZWwtPnNlbGVjdGVkUm93cygpLmZpcnN0KCk7CgogICAgICAgIGlmICggIXNlbGVjdGVkSW5k ZXguaXNWYWxpZCgpICkKICAgICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgQWtvbmFkaTo6 Q29sbGVjdGlvbiBjb2wgPSBzZWxlY3RlZEluZGV4LmRhdGEoIEFrb25hZGk6OkNvbGxlY3Rpb25N b2RlbDo6Q29sbGVjdGlvblJvbGUgKS52YWx1ZTxBa29uYWRpOjpDb2xsZWN0aW9uPigpOwogICAg ICAgIFFTdHJpbmcgdGFnID0gc2VsZWN0ZWRJbmRleC5wYXJlbnQoKS5kYXRhKCBRdDo6RGlzcGxh eVJvbGUgKS50b1N0cmluZygpOwoKICAgICAgICAvLyAndGFncycgYXR0cmlidXRlIGV4aXN0cywg Y2hlY2tlZCBpbiBlbmFibGVkQWN0aW9ucygpCiAgICAgICAgY29sLmF0dHJpYnV0ZTxUYWdzQ29s bGVjdGlvbkF0dHJpYnV0ZT4oKS0+cmVtb3ZlVGFnKCB0YWcgKTsKCiAgICAgICAgQWtvbmFkaTo6 Q29sbGVjdGlvbk1vZGlmeUpvYiAqam9iID0gbmV3IEFrb25hZGk6OkNvbGxlY3Rpb25Nb2RpZnlK b2IoIGNvbCwgdGhpcyApOwogICAgICAgIGNvbm5lY3QoIGpvYiwgU0lHTkFMKCByZXN1bHQoIEtK b2IqICkgKSwKICAgICAgICAgICAgICAgICAgdGhpcywgU0xPVCggY29sbGVjdGlvbk1vZGlmeVJl c3VsdCggS0pvYiogKSApICk7Cn0KCnZvaWQgU3RhbmRhcmRBY3Rpb25NYW5hZ2VyOjpzbG90TWFu YWdlU3Vic2NyaXB0aW9ucygpCnsKICAgICAgICBLRGlhbG9nICptYW5hZ2VyID0gbmV3IEtEaWFs b2coIG1fcGFyZW50V2lkZ2V0ICk7CiAgICAgICAgbWFuYWdlci0+c2V0Q2FwdGlvbiggaTE4bigg Ik1hbmFnZSBSU1Mgc3Vic2NyaXB0aW9ucyIgKSApOwogICAgICAgIG1hbmFnZXItPnNldEJ1dHRv bnMoIEtEaWFsb2c6Ok9rIHwgS0RpYWxvZzo6Q2FuY2VsICk7CgogICAgICAgIEFrb25hZGk6OkNv bGxlY3Rpb25Nb2RlbCAqZnVsbE1vZGVsID0gbmV3IEFrb25hZGk6OkNvbGxlY3Rpb25Nb2RlbCgg bWFuYWdlciApOwogICAgICAgIFN1YnNjcmlwdGlvbnNNb2RlbCAqc3Vic2NyaXB0aW9uc01vZGVs ID0gbmV3IFN1YnNjcmlwdGlvbnNNb2RlbCggbV9zdWJzY3JpcHRpb25MYWJlbCwgbWFuYWdlciAp OwogICAgICAgIHN1YnNjcmlwdGlvbnNNb2RlbC0+c2V0U291cmNlTW9kZWwoIGZ1bGxNb2RlbCAp OwogICAgICAgIFFUcmVlVmlldyAqc3Vic2NyaXB0aW9uc1ZpZXcgPSBuZXcgUVRyZWVWaWV3KCBt YW5hZ2VyICk7CiAgICAgICAgc3Vic2NyaXB0aW9uc1ZpZXctPnNldE1vZGVsKCBzdWJzY3JpcHRp b25zTW9kZWwgKTsKICAgICAgICBtYW5hZ2VyLT5zZXRNYWluV2lkZ2V0KCBzdWJzY3JpcHRpb25z VmlldyApOwoKICAgICAgICBpZiAoIG1hbmFnZXItPmV4ZWMoKSA9PSBRRGlhbG9nOjpBY2NlcHRl ZCApIHsKICAgICAgICAgICAgICAgIGtEZWJ1ZygpIDw8ICJPbGQgc3Vic2NyaXB0aW9uczoiIDw8 IHN1YnNjcmlwdGlvbnNNb2RlbC0+b2xkU3Vic2NyaXB0aW9ucygpOwogICAgICAgICAgICAgICAg a0RlYnVnKCkgPDwgIk5ldyBzdWJzY3JpcHRpb25zOiIgPDwgc3Vic2NyaXB0aW9uc01vZGVsLT5u ZXdTdWJzY3JpcHRpb25zKCk7CgogICAgICAgICAgICAgICAgUVNldDxBa29uYWRpOjpDb2xsZWN0 aW9uOjpJZD4gdG9SZW1vdmUgPSBzdWJzY3JpcHRpb25zTW9kZWwtPm9sZFN1YnNjcmlwdGlvbnMo KS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgc3VidHJhY3QoIHN1YnNjcmlwdGlvbnNNb2RlbC0+bmV3U3Vic2NyaXB0aW9ucygpICk7CiAg ICAgICAgICAgICAgICBRU2V0PEFrb25hZGk6OkNvbGxlY3Rpb246OklkPiB0b0FkZCA9IHN1YnNj cmlwdGlvbnNNb2RlbC0+bmV3U3Vic2NyaXB0aW9ucygpLgogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0cmFjdCggc3Vic2NyaXB0aW9u c01vZGVsLT5vbGRTdWJzY3JpcHRpb25zKCkgKTsKICAgICAgICAgICAgICAgIGtEZWJ1ZygpIDw8 ICJ0byByZW1vdmU6IiA8PCB0b1JlbW92ZTsKICAgICAgICAgICAgICAgIGtEZWJ1ZygpIDw8ICJ0 byBhZGQ6IiA8PCB0b0FkZDsKCiAgICAgICAgICAgICAgICBRX0ZPUkVBQ0goIGNvbnN0IEFrb25h ZGk6OkNvbGxlY3Rpb246OklkICZjb2xpZCwgdG9SZW1vdmUgKSB7CiAgICAgICAgICAgICAgICAg ICAgICAgIEFrb25hZGk6OkNvbGxlY3Rpb24gY29sID0gc3Vic2NyaXB0aW9uc01vZGVsLT5jb2xs ZWN0aW9uRm9ySWQoIGNvbGlkICk7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YnNjcmlwdGlv bkxhYmVsc0NvbGxlY3Rpb25BdHRyaWJ1dGUgKmF0dHIgPSBjb2wuYXR0cmlidXRlPFN1YnNjcmlw dGlvbkxhYmVsc0NvbGxlY3Rpb25BdHRyaWJ1dGU+KAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBB a29uYWRpOjpFbnRpdHk6OkFkZElmTWlzc2luZyApOwoKICAgICAgICAgICAgICAgICAgICAgICAg a0RlYnVnKCkgPDwgIlVuc3Vic2NyaWJpbmcgZnJvbSBjb2w6IiA8PCBjb2wubmFtZSgpOwogICAg ICAgICAgICAgICAgICAgICAgICBhdHRyLT5yZW1vdmVTdWJzY3JpcHRpb25MYWJlbCggbV9zdWJz Y3JpcHRpb25MYWJlbCApOwogICAgICAgICAgICAgICAgICAgICAgICBBa29uYWRpOjpDb2xsZWN0 aW9uTW9kaWZ5Sm9iICpqb2IgPSBuZXcgQWtvbmFkaTo6Q29sbGVjdGlvbk1vZGlmeUpvYiggY29s LCB0aGlzICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3QoIGpvYiwgU0lHTkFMKCBy ZXN1bHQoIEtKb2IqICkgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywg U0xPVCggY29sbGVjdGlvbk1vZGlmeVJlc3VsdCggS0pvYiogKSApICk7CiAgICAgICAgICAgICAg ICB9CgogICAgICAgICAgICAgICAgUV9GT1JFQUNIKCBjb25zdCBBa29uYWRpOjpDb2xsZWN0aW9u OjpJZCAmY29saWQsIHRvQWRkICkgewogICAgICAgICAgICAgICAgICAgICAgICBBa29uYWRpOjpD b2xsZWN0aW9uIGNvbCA9IHN1YnNjcmlwdGlvbnNNb2RlbC0+Y29sbGVjdGlvbkZvcklkKCBjb2xp ZCApOwogICAgICAgICAgICAgICAgICAgICAgICBTdWJzY3JpcHRpb25MYWJlbHNDb2xsZWN0aW9u QXR0cmlidXRlICphdHRyID0gY29sLmF0dHJpYnV0ZTxTdWJzY3JpcHRpb25MYWJlbHNDb2xsZWN0 aW9uQXR0cmlidXRlPigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWtvbmFkaTo6RW50aXR5OjpB ZGRJZk1pc3NpbmcgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGtEZWJ1ZygpIDw8ICJTdWJz Y3JpYmluZyB0byBjb2w6IiA8PCBjb2wubmFtZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBh dHRyLT5hZGRTdWJzY3JpcHRpb25MYWJlbCggbV9zdWJzY3JpcHRpb25MYWJlbCApOwogICAgICAg ICAgICAgICAgICAgICAgICBBa29uYWRpOjpDb2xsZWN0aW9uTW9kaWZ5Sm9iICpqb2IgPSBuZXcg QWtvbmFkaTo6Q29sbGVjdGlvbk1vZGlmeUpvYiggY29sLCB0aGlzICk7CiAgICAgICAgICAgICAg ICAgICAgICAgIGNvbm5lY3QoIGpvYiwgU0lHTkFMKCByZXN1bHQoIEtKb2IqICkgKSwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgU0xPVCggY29sbGVjdGlvbk1vZGlmeVJl c3VsdCggS0pvYiogKSApICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBk ZWxldGUgbWFuYWdlcjsKfQoKdm9pZCBTdGFuZGFyZEFjdGlvbk1hbmFnZXI6OmNvbGxlY3Rpb25D cmVhdGlvblJlc3VsdCggS0pvYiogam9iICkKewogICAgICAgIGlmICggam9iLT5lcnJvcigpICkg ewogICAgICAgICAgICAgICAgS01lc3NhZ2VCb3g6OmVycm9yKCBtX3BhcmVudFdpZGdldCwgaTE4 bigiQ291bGQgbm90IGFkZCBhIG5ldyBmZWVkOiAlMSIsIGpvYi0+ZXJyb3JTdHJpbmcoKSApLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMThuKCAiRmVlZCBjcmVhdGlvbiBm YWlsZWQiICkgKTsKICAgICAgICB9Cn0KCnZvaWQgU3RhbmRhcmRBY3Rpb25NYW5hZ2VyOjpjb2xs ZWN0aW9uRGVsZXRpb25SZXN1bHQoIEtKb2IqIGpvYiApCnsKICAgICAgICBpZiAoIGpvYi0+ZXJy b3IoKSApIHsKICAgICAgICAgICAgICAgIEtNZXNzYWdlQm94OjplcnJvciggbV9wYXJlbnRXaWRn ZXQsIGkxOG4oIkNvdWxkIG5vdCBkZWxldGUgdGhlIGZlZWQ6ICUxIiwgam9iLT5lcnJvclN0cmlu ZygpICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxOG4oICJGZWVkIGRl bGV0ZWlvbiBmYWlsZWQiICkgKTsKICAgICAgICB9Cn0KCnZvaWQgU3RhbmRhcmRBY3Rpb25NYW5h Z2VyOjpjb2xsZWN0aW9uTW9kaWZ5UmVzdWx0KCBLSm9iKiBqb2IgKQp7CiAgICAgICAgaWYgKCBq b2ItPmVycm9yKCkgKSB7CiAgICAgICAgICAgICAgICBLTWVzc2FnZUJveDo6ZXJyb3IoIG1fcGFy ZW50V2lkZ2V0LCBpMThuKCJDb3VsZCBub3QgY2hhbmdlIGZlZWQgcHJvcGVydGllczogJTEiLCBq b2ItPmVycm9yU3RyaW5nKCkgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg aTE4biggIkZlZWQgcHJvcGVydGllcyBjaGFuZ2luZyBmYWlsZWQiICkgKTsKICAgICAgICB9Cn0K CiNpbmNsdWRlICJzdGFuZGFyZGFjdGlvbm1hbmFnZXIubW9jIgoAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrcnNzL2tyc3NyZWFkZXIvc3Vic2NyaXB0 aW9uc21vZGVsLmgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAMDAwMDY0NAAwMDAxNzUwADAwMDE3NTAAMDAwMDAwMDMzNDIAMTEw MjU3MDE3NzUAMDE3NjYxACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAHVzdGFyICAAdm9uYW1pAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2b25hbWkAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8qCiAgICBDb3B5cmlnaHQgKEMpIDIwMDgg ICAgRG1pdHJ5IEl2YW5vdiA8dm9uYW1pQGdtYWlsLmNvbT4KCiAgICBUaGlzIHByb2dyYW0gaXMg ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAg aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBw dWJsaXNoZWQgYnkKICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJz aW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2 ZXJzaW9uLgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0 IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0 IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICAgWW91IHNob3VsZCBoYXZlIHJlY2Vp dmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFsb25nIHdp dGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNl cy8+LgoqLwoKI2lmbmRlZiBLUlNTUkVBREVSX1NVQlNDUklQVElPTlNNT0RFTF9ICiNkZWZpbmUg S1JTU1JFQURFUl9TVUJTQ1JJUFRJT05TTU9ERUxfSAoKI2luY2x1ZGUgImZlZWRsaXN0bW9kZWwu aCIKCiNpbmNsdWRlIDxha29uYWRpL2NvbGxlY3Rpb24uaD4KCiNpbmNsdWRlIDxRU2V0PgoKY2xh c3MgU3Vic2NyaXB0aW9uc01vZGVsIDogcHVibGljIEZlZWRsaXN0TW9kZWwKewogICAgICAgIFFf T0JKRUNUCgpwdWJsaWM6CgogICAgICAgIGV4cGxpY2l0IFN1YnNjcmlwdGlvbnNNb2RlbCggY29u c3QgUVN0cmluZyAmc3Vic2NyaXB0aW9uTGFiZWwsIFFPYmplY3QgKnBhcmVudCA9IDAgKTsKICAg ICAgICB+U3Vic2NyaXB0aW9uc01vZGVsKCk7CgogICAgICAgIFFWYXJpYW50IGRhdGEoIGNvbnN0 IFFNb2RlbEluZGV4ICZpbmRleCwgaW50IHJvbGUgPSBRdDo6RGlzcGxheVJvbGUgKSBjb25zdDsK ICAgICAgICBib29sIHNldERhdGEoIGNvbnN0IFFNb2RlbEluZGV4ICZpbmRleCwgY29uc3QgUVZh cmlhbnQgJnZhbHVlLCBpbnQgcm9sZSA9IFF0OjpFZGl0Um9sZSApOwogICAgICAgIFF0OjpJdGVt RmxhZ3MgZmxhZ3MoIGNvbnN0IFFNb2RlbEluZGV4ICZpbmRleCApIGNvbnN0OwoKICAgICAgICBR U2V0PEFrb25hZGk6OkNvbGxlY3Rpb246OklkPiBuZXdTdWJzY3JpcHRpb25zKCkgY29uc3Q7CiAg ICAgICAgUVNldDxBa29uYWRpOjpDb2xsZWN0aW9uOjpJZD4gb2xkU3Vic2NyaXB0aW9ucygpIGNv bnN0OwoKcHJpdmF0ZSBRX1NMT1RTOgoKICAgICAgICB2b2lkIGZlZWRzSW5zZXJ0ZWQoIGNvbnN0 IFFNb2RlbEluZGV4ICZwYXJlbnQsIGludCBzdGFydCwgaW50IGVuZCApOwoKcHJpdmF0ZToKCiAg ICAgICAgUVN0cmluZyBtX3N1YnNjcmlwdGlvbkxhYmVsOwogICAgICAgIFFTZXQ8QWtvbmFkaTo6 Q29sbGVjdGlvbjo6SWQ+IG1fb2xkU3Vic2NyaXB0aW9uczsKICAgICAgICBRU2V0PEFrb25hZGk6 OkNvbGxlY3Rpb246OklkPiBtX25ld1N1YnNjcmlwdGlvbnM7Cn07CgojZW5kaWYgLy8gS1JTU1JF QURFUl9TVUJTQ1JJUFRJT05TTU9ERUxfSAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa3Jzcy9yZXNvdXJjZS8AAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAADAwMDA3NTUAMDAwMTc1MAAwMDAxNzUwADAwMDAwMDAwMDAwADExMDI2NDIy Nzc2ADAxMzI0MgAgNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1 c3RhciAgAHZvbmFtaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdm9uYW1pAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrcnNzL3Jlc291cmNlL3Jzc3Jlc291cmNlLmgAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAMDAwMDY0NAAwMDAxNzUwADAwMDE3NTAAMDAwMDAwMDQ2NjQAMTEwMjY0MDYx NTcAMDE1Nzc3ACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVz dGFyICAAdm9uYW1pAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2b25hbWkAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8qCiAgICBDb3B5cmlnaHQgKEMpIDIwMDggICAgRG1p dHJ5IEl2YW5vdiA8dm9uYW1pQGdtYWlsLmNvbT4KCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBz b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgaXQgdW5k ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNo ZWQgYnkKICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIg b2YgdGhlIExpY2Vuc2UsIG9yCiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9u LgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdp bGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g dGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEg Y29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFsb25nIHdpdGggdGhp cyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+Lgoq LwoKI2lmbmRlZiBBS09OQURJX1JTU19SRVNPVVJDRQojZGVmaW5lIEFLT05BRElfUlNTX1JFU09V UkNFCgojaW5jbHVkZSA8a2ZlZWQvaXRlbS5oPgojaW5jbHVkZSA8c3luZGljYXRpb24vc3luZGlj YXRpb24uaD4KI2luY2x1ZGUgPGFrb25hZGkvcmVzb3VyY2ViYXNlLmg+CgojaW5jbHVkZSA8UUhh c2g+CiNpbmNsdWRlIDxRWG1sU3RyZWFtUmVhZGVyPgoKY2xhc3MgUnNzUmVzb3VyY2UgOiBwdWJs aWMgQWtvbmFkaTo6UmVzb3VyY2VCYXNlLCBwdWJsaWMgQWtvbmFkaTo6QWdlbnRCYXNlOjpPYnNl cnZlcgp7CiAgICAgICAgUV9PQkpFQ1QKICAgICAgICBRX0NMQVNTSU5GTygiRC1CdXMgSW50ZXJm YWNlIiwib3JnLmtkZS5rcnNzIikKCnB1YmxpYzoKCiAgICAgICAgUnNzUmVzb3VyY2UoY29uc3Qg UVN0cmluZyAmaWQpOwoKcHVibGljIFFfU0xPVFM6CgogICAgICAgIHZvaWQgY29uZmlndXJlKFdJ ZCB3aW5kb3dJZCk7CgogICAgICAgIC8vIEQtQnVzIGludGVyZmFjZQogICAgICAgIFFfTk9SRVBM WSB2b2lkIHRyaWdnZXJCdWcoKTsKCnByb3RlY3RlZCBRX1NMT1RTOgoKICAgICAgICB2b2lkIHJl dHJpZXZlQ29sbGVjdGlvbnMoKTsKICAgICAgICB2b2lkIHJldHJpZXZlSXRlbXMoY29uc3QgQWtv bmFkaTo6Q29sbGVjdGlvbiAmY29sKTsKICAgICAgICBib29sIHJldHJpZXZlSXRlbShjb25zdCBB a29uYWRpOjpJdGVtICZpdGVtLCBjb25zdCBRU2V0PFFCeXRlQXJyYXk+ICZwYXJ0cyk7Cgpwcml2 YXRlIFFfU0xPVFM6CgogICAgICAgIHZvaWQgZmVlZFByb3BlcnRpZXNGZXRjaGVkKCBTeW5kaWNh dGlvbjo6TG9hZGVyICpsb2FkZXIsIFN5bmRpY2F0aW9uOjpGZWVkUHRyIGZlZWQsIFN5bmRpY2F0 aW9uOjpFcnJvckNvZGUgc3RhdHVzICk7CiAgICAgICAgdm9pZCBmZWVkQ29udGVudEZldGNoZWQo IFN5bmRpY2F0aW9uOjpMb2FkZXIgKmxvYWRlciwgU3luZGljYXRpb246OkZlZWRQdHIgZmVlZCwg U3luZGljYXRpb246OkVycm9yQ29kZSBzdGF0dXMgKTsKCnByaXZhdGU6CgogICAgICAgIHZvaWQg ZmV0Y2hGZWVkQ29udGVudCggY29uc3QgUVN0cmluZyAmdXJsICk7CiAgICAgICAgdm9pZCBmZXRj aEZlZWRQcm9wZXJ0aWVzKCBjb25zdCBRU3RyaW5nICZ1cmwgKTsKICAgICAgICBLRmVlZDo6SXRl bSBjb252ZXJ0VG9LRmVlZEl0ZW0oY29uc3QgU3luZGljYXRpb246Okl0ZW1QdHIgJnN5bmRJdGVt KTsKICAgICAgICB2b2lkIGR1bXAoKTsKCiAgICAgICAgYm9vbCBsb2FkT3BtbCggY29uc3QgUVN0 cmluZyAmcGF0aCApOwogICAgICAgIHZvaWQgcmVhZFVua25vd25FbGVtZW50KCk7CiAgICAgICAg dm9pZCByZWFkT3BtbCgpOwogICAgICAgIHZvaWQgcmVhZEJvZHkoKTsKICAgICAgICB2b2lkIHJl YWRPdXRsaW5lKCBRU3RyaW5nTGlzdCAmdGFncyApOwoKcHJpdmF0ZToKCiAgICAgICAgaW50IG1f ZmV0Y2hUcmllczsKCiAgICAgICAgQWtvbmFkaTo6Q29sbGVjdGlvbiBtX3Jvb3RDb2xsZWN0aW9u OwogICAgICAgIFFIYXNoPFFTdHJpbmcsIEFrb25hZGk6OkNvbGxlY3Rpb24+IG1fY29sbGVjdGlv bnM7CiAgICAgICAgUUxpc3Q8QWtvbmFkaTo6Q29sbGVjdGlvbj4gbV9jaGFuZ2VkQ29sbGVjdGlv bnM7CiAgICAgICAgUUxpc3Q8QWtvbmFkaTo6Q29sbGVjdGlvbj4gbV9yZW1vdmVkQ29sbGVjdGlv bnM7CiAgICAgICAgUVhtbFN0cmVhbVJlYWRlciBtX3JlYWRlcjsKCiAgICAgICAgUURCdXNNZXNz YWdlIG1fcmVwbHlNZXNzYWdlOwp9OwoKI2VuZGlmIC8qIEFLT05BRElfUlNTX1JFU09VUkNFICov CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAABrcnNzL3Jlc291cmNlL3Jzc3Jlc291cmNlLmNwcAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAMDAwMDY0NAAwMDAxNzUwADAwMDE3NTAAMDAwMDAwNDYzNDEAMTEwMjY0MjI2MjEAMDE2 MzIyACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAA dm9uYW1pAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2b25hbWkAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAC8qCiAgICBDb3B5cmlnaHQgKEMpIDIwMDggICAgRG1pdHJ5IEl2 YW5vdiA8dm9uYW1pQGdtYWlsLmNvbT4KCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2Fy ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgaXQgdW5kZXIgdGhl IHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkK ICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhl IExpY2Vuc2UsIG9yCiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAg IFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg dXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt cGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl IGZvciBtb3JlIGRldGFpbHMuCgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv ZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFsb25nIHdpdGggdGhpcyBwcm9n cmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgoqLwoKI2lu Y2x1ZGUgImtyc3NhZGFwdG9yLmgiCiNpbmNsdWRlICJyc3NyZXNvdXJjZS5oIgojaW5jbHVkZSAi Li4vbGlia3Jzcy90YWdzY29sbGVjdGlvbmF0dHJpYnV0ZS5oIgojaW5jbHVkZSAiLi4vbGlia3Jz cy9zdWJzY3JpcHRpb25sYWJlbHNjb2xsZWN0aW9uYXR0cmlidXRlLmgiCiNpbmNsdWRlICIuLi9s aWJrcnNzL2ZlZWRwcm9wZXJ0aWVzY29sbGVjdGlvbmF0dHJpYnV0ZS5oIgoKI2luY2x1ZGUgPGtm ZWVkL3BlcnNvbi5oPgojaW5jbHVkZSA8a2ZlZWQvZW5jbG9zdXJlLmg+CiNpbmNsdWRlIDxrZmVl ZC9jYXRlZ29yeS5oPgojaW5jbHVkZSA8YWtvbmFkaS9jb2xsZWN0aW9uZmV0Y2hqb2IuaD4KI2lu Y2x1ZGUgPGFrb25hZGkvY29sbGVjdGlvbmNyZWF0ZWpvYi5oPgojaW5jbHVkZSA8YWtvbmFkaS9j b2xsZWN0aW9ubW9kaWZ5am9iLmg+CiNpbmNsdWRlIDxha29uYWRpL2NvbGxlY3Rpb25kZWxldGVq b2IuaD4KI2luY2x1ZGUgPGFrb25hZGkvYXR0cmlidXRlZmFjdG9yeS5oPgojaW5jbHVkZSA8YWtv bmFkaS9jaGFuZ2VyZWNvcmRlci5oPgoKI2luY2x1ZGUgPEtEZWJ1Zz4KI2luY2x1ZGUgPEtGaWxl RGlhbG9nPgojaW5jbHVkZSA8S0RhdGVUaW1lPgojaW5jbHVkZSA8S0xvY2FsZT4KI2luY2x1ZGUg PEtSYW5kb20+CgojaW5jbHVkZSA8UURCdXNDb25uZWN0aW9uPgoKdXNpbmcgbmFtZXNwYWNlIEFr b25hZGk7CgpSc3NSZXNvdXJjZTo6UnNzUmVzb3VyY2UoY29uc3QgUVN0cmluZyAmaWQpCiAgICAg ICAgOlJlc291cmNlQmFzZShpZCksIG1fZmV0Y2hUcmllcygwKQp7CiAgICAgICAgQXR0cmlidXRl RmFjdG9yeTo6cmVnaXN0ZXJBdHRyaWJ1dGU8VGFnc0NvbGxlY3Rpb25BdHRyaWJ1dGU+KCk7CiAg ICAgICAgQXR0cmlidXRlRmFjdG9yeTo6cmVnaXN0ZXJBdHRyaWJ1dGU8U3Vic2NyaXB0aW9uTGFi ZWxzQ29sbGVjdGlvbkF0dHJpYnV0ZT4oKTsKICAgICAgICBBdHRyaWJ1dGVGYWN0b3J5OjpyZWdp c3RlckF0dHJpYnV0ZTxGZWVkUHJvcGVydGllc0NvbGxlY3Rpb25BdHRyaWJ1dGU+KCk7CgogICAg ICAgIG5ldyBLcnNzQWRhcHRvciggdGhpcyApOwogICAgICAgIGlmICggIVFEQnVzQ29ubmVjdGlv bjo6c2Vzc2lvbkJ1cygpLnJlZ2lzdGVyU2VydmljZSggIm9yZy5rZGUua3JzcyIgKSApIHsKICAg ICAgICAgICAgICAgIGtXYXJuaW5nKCkgPDwgIkNvdWxkbid0IHJlZ2lzdGVyIGEgRC1CdXMgc2Vy dmljZSBvcmcua2RlLmtyc3MiOwogICAgICAgICAgICAgICAga1dhcm5pbmcoKSA8PCBRREJ1c0Nv bm5lY3Rpb246OnNlc3Npb25CdXMoKS5sYXN0RXJyb3IoKS5tZXNzYWdlKCk7CiAgICAgICAgfQoK ICAgICAgICBjaGFuZ2VSZWNvcmRlcigpLT5mZXRjaENvbGxlY3Rpb24oIHRydWUgKTsKfQoKdm9p ZCBSc3NSZXNvdXJjZTo6dHJpZ2dlckJ1ZygpCnsKICAgICAgICBBa29uYWRpOjpDb2xsZWN0aW9u IGNvbCA9IG1fY29sbGVjdGlvbnNbICJidWciIF07CiAgICAgICAgY29sLnNldE5hbWUoICJORVcg TkFNRSIgKTsKICAgICAgICBtX2NoYW5nZWRDb2xsZWN0aW9ucyA8PCBjb2w7CiAgICAgICAgc3lu Y2hyb25pemVDb2xsZWN0aW9uVHJlZSgpOwp9Cgpib29sIFJzc1Jlc291cmNlOjpyZXRyaWV2ZUl0 ZW0oY29uc3QgQWtvbmFkaTo6SXRlbSAmaXRlbSwgY29uc3QgUVNldDxRQnl0ZUFycmF5PiAmcGFy dHMpCnsKICAgICAgICBRX1VOVVNFRChpdGVtKQogICAgICAgIFFfVU5VU0VEKHBhcnRzKQoKICAg ICAgICAvLyB3aGF0IHNob3VsZCBpIGRvPwogICAgICAgIC8vIG5vIHdheSB0byByZXRyaWV2ZSBh IHNpbmdsZSBpdGVtIGZyb20gYW4gUlNTIGZlZWQgb3RoZXIgdGhhbgogICAgICAgIC8vIHJlZmV0 Y2hpbmcgdGhlIHdob2xlIGZlZWQgYW5kIGxvb2tpbmcgdXAgdGhlIGl0ZW0gaW4gdGhlIGZlZWQK ICAgICAgICAvLyAoYWN0dWFsbHksIHRoZSBmZWVkIG1pZ2h0IG5vdCBjb250YWluIHRoaXMgaXRl bSBhbnltb3JlKQogICAgICAgIHJldHVybiBmYWxzZTsKfQoKdm9pZCBSc3NSZXNvdXJjZTo6Y29u ZmlndXJlKFdJZCB3aW5kb3dJZCkKewogICAgICAgIC8vIG5vdGU6IHRoaXMgV0lkIHRyaWNrIGRv ZXNuJ3Qgd29yawogICAgICAgIFFTdHJpbmcgcGF0aCA9IEtGaWxlRGlhbG9nOjpnZXRPcGVuRmls ZU5hbWVXSWQoIEtVcmw6OmZyb21QYXRoKCBRRGlyOjpob21lUGF0aCgpICksCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKi5vcG1sfCIgKyBpMThuKCJP UE1MIERvY3VtZW50ICgqLm9wbWwpIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB3aW5kb3dJZCwgaTE4bigiU2VsZWN0IGFuIE9QTUwgRG9jdW1lbnQi KSk7CiAgICAgICAgaWYgKCAhcGF0aC5pc0VtcHR5KCkgKSB7CiAgICAgICAgICAgICAgICBDb2xs ZWN0aW9uIHJvb3Q7CiAgICAgICAgICAgICAgICByb290LnNldFBhcmVudCggQ29sbGVjdGlvbjo6 cm9vdCgpICk7CiAgICAgICAgICAgICAgICByb290LnNldFJlbW90ZUlkKCBwYXRoICk7CiAgICAg ICAgICAgICAgICByb290LnNldE5hbWUoICJSU1Mgc3Vic2NyaXB0aW9ucyIgKTsKICAgICAgICAg ICAgICAgIHJvb3Quc2V0Q29udGVudE1pbWVUeXBlcyggUVN0cmluZ0xpc3QoIENvbGxlY3Rpb246 Om1pbWVUeXBlKCkgKSApOwoKICAgICAgICAgICAgICAgIG1fcm9vdENvbGxlY3Rpb24gPSByb290 OwogICAgICAgICAgICAgICAgbV9jaGFuZ2VkQ29sbGVjdGlvbnMgPDwgcm9vdDsKCiAgICAgICAg ICAgICAgICBsb2FkT3BtbCggcGF0aCApOwogICAgICAgICAgICAgICAgc3luY2hyb25pemUoKTsK ICAgICAgICB9Cn0KCnZvaWQgUnNzUmVzb3VyY2U6OnJldHJpZXZlQ29sbGVjdGlvbnMoKQp7CiAg ICAgICAga0RlYnVnKCkgPDwgIkJlZm9yZSBjb2xsZWN0aW9uc1JldHJpZXZlZEluY3JlbWVudGFs KCkiOwogICAgICAgIGR1bXAoKTsKCiAgICAgICAgY29sbGVjdGlvbnNSZXRyaWV2ZWRJbmNyZW1l bnRhbCggbV9jaGFuZ2VkQ29sbGVjdGlvbnMsIG1fcmVtb3ZlZENvbGxlY3Rpb25zICk7CgogICAg ICAgIC8vIHByb2Nlc3MgY2hhbmdlZCBjb2xsZWN0aW9ucwogICAgICAgIFFfRk9SRUFDSCggY29u c3QgQWtvbmFkaTo6Q29sbGVjdGlvbiAmY29sLCBtX2NoYW5nZWRDb2xsZWN0aW9ucyApIHsKICAg ICAgICAgICAgICAgIG1fY29sbGVjdGlvbnNbIGNvbC5yZW1vdGVJZCgpIF0gPSBjb2w7CiAgICAg ICAgfQoKICAgICAgICAvLyBwcm9jZXNzIHJlbW92ZWQgY29sbGVjdGlvbnMKICAgICAgICBRX0ZP UkVBQ0goIGNvbnN0IEFrb25hZGk6OkNvbGxlY3Rpb24gJmNvbCwgbV9yZW1vdmVkQ29sbGVjdGlv bnMgKSB7CiAgICAgICAgICAgICAgICBtX2NvbGxlY3Rpb25zLnJlbW92ZSggY29sLnJlbW90ZUlk KCkgKTsKICAgICAgICB9CgogICAgICAgIC8vIGNsZWFudXAKICAgICAgICBtX2NoYW5nZWRDb2xs ZWN0aW9ucy5jbGVhcigpOwogICAgICAgIG1fcmVtb3ZlZENvbGxlY3Rpb25zLmNsZWFyKCk7Cn0K CnZvaWQgUnNzUmVzb3VyY2U6OnJldHJpZXZlSXRlbXMoY29uc3QgQWtvbmFkaTo6Q29sbGVjdGlv biAmY29sKQp7CiAgICAgICAga0RlYnVnKCkgPDwgIlJldHJpZXZpbmcgaXRlbXMgZm9yIiA8PCBj b2wubmFtZSgpOwoKICAgICAgICBpZiAoICFjb2wuaXNWYWxpZCgpICkgewogICAgICAgICAgICAg ICAga0RlYnVnKCkgPDwgIkNvbGxlY3Rpb24gaXMgbm90IHZhbGlkIjsKICAgICAgICAgICAgICAg IHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICggY29sLmNvbnRlbnRNaW1lVHlwZXMoKS5j b250YWlucyhDb2xsZWN0aW9uOjptaW1lVHlwZSgpKSApIHsKICAgICAgICAgICAgICAgIGtEZWJ1 ZygpIDw8ICJDb2xsZWN0aW9uIiA8PCBjb2wubmFtZSgpIDw8ICJpcyBhIGZvbGRlciI7CiAgICAg ICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoIGNvbC5oYXNBdHRyaWJ1 dGUoICJGZWVkUHJvcGVydGllcyIgKSApIHsKICAgICAgICAgICAgICAgIGZldGNoRmVlZENvbnRl bnQoIGNvbC5hdHRyaWJ1dGU8RmVlZFByb3BlcnRpZXNDb2xsZWN0aW9uQXR0cmlidXRlPigpLT54 bWxVcmwoKSApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGtEZWJ1 ZygpIDw8ICJDb2xsZWN0aW9uIGRvZXNuJ3QgaGF2ZSBcJ0ZlZWRQcm9wZXJ0aWVzXCcgYXR0cmli dXRlIHNldCI7CiAgICAgICAgICAgICAgICBJdGVtOjpMaXN0IGl0ZW1MaXN0OwogICAgICAgICAg ICAgICAgaXRlbXNSZXRyaWV2ZWQoaXRlbUxpc3QpOwogICAgICAgIH0KfQoKdm9pZCBSc3NSZXNv dXJjZTo6ZmV0Y2hGZWVkQ29udGVudCggY29uc3QgUVN0cmluZyAmdXJsICkKewogICAgICAgIFN5 bmRpY2F0aW9uOjpMb2FkZXIgKmxvYWRlciA9IFN5bmRpY2F0aW9uOjpMb2FkZXI6OmNyZWF0ZSgg dGhpcywgU0xPVCggZmVlZENvbnRlbnRGZXRjaGVkKCBTeW5kaWNhdGlvbjo6TG9hZGVyKiwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgU3luZGljYXRpb246OkZlZWRQdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bmRpY2F0aW9uOjpFcnJvckNv ZGUgKSApICk7CgogICAgICAgIGtEZWJ1ZygpIDw8ICJVcmw6IiA8PCB1cmw7CiAgICAgICAgbG9h ZGVyLT5sb2FkRnJvbSggdXJsICk7Cn0KCnZvaWQgUnNzUmVzb3VyY2U6OmZldGNoRmVlZFByb3Bl cnRpZXMoIGNvbnN0IFFTdHJpbmcgJnVybCApCnsKICAgICAgICBTeW5kaWNhdGlvbjo6TG9hZGVy ICpsb2FkZXIgPSBTeW5kaWNhdGlvbjo6TG9hZGVyOjpjcmVhdGUoIHRoaXMsIFNMT1QoIGZlZWRQ cm9wZXJ0aWVzRmV0Y2hlZCggU3luZGljYXRpb246OkxvYWRlciosCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bmRpY2F0 aW9uOjpGZWVkUHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBTeW5kaWNhdGlvbjo6RXJyb3JDb2RlICkgKSApOwoKICAg ICAgICBrRGVidWcoKSA8PCAiVXJsOiIgPDwgdXJsOwogICAgICAgIGxvYWRlci0+bG9hZEZyb20o IHVybCApOwp9Cgp2b2lkIFJzc1Jlc291cmNlOjpmZWVkUHJvcGVydGllc0ZldGNoZWQoIFN5bmRp Y2F0aW9uOjpMb2FkZXIgKmxvYWRlciwgU3luZGljYXRpb246OkZlZWRQdHIgZmVlZCwgU3luZGlj YXRpb246OkVycm9yQ29kZSBzdGF0dXMgKQp7CiAgICAgICAga0RlYnVnKCkgPDwgIlN0YXR1czoi IDw8IHN0YXR1czsKCiAgICAgICAgaWYgKCAoIHN0YXR1cyA9PSBTeW5kaWNhdGlvbjo6SW52YWxp ZFhtbCApICYmIChtX2ZldGNoVHJpZXMgPCAzICkgJiYgKCBsb2FkZXItPmRpc2NvdmVyZWRGZWVk VVJMKCkuaXNWYWxpZCgpICkgKSB7CiAgICAgICAgICAgICAgICBrRGVidWcoKSA8PCAiUmVmZXRj aGluZyBieSBkaXNjb3ZlcmVkIGZlZWQgdXJsIjsKICAgICAgICAgICAgICAgIFFTdHJpbmcgbmV3 VXJsID0gbG9hZGVyLT5kaXNjb3ZlcmVkRmVlZFVSTCgpLnVybCgpOwogICAgICAgICAgICAgICAg bV9jaGFuZ2VkQ29sbGVjdGlvbnNbIDAgXS5zZXROYW1lKCBuZXdVcmwgKTsKICAgICAgICAgICAg ICAgIG1fY2hhbmdlZENvbGxlY3Rpb25zWyAwIF0uYXR0cmlidXRlPEZlZWRQcm9wZXJ0aWVzQ29s bGVjdGlvbkF0dHJpYnV0ZT4oKS0+c2V0WG1sVXJsKCBuZXdVcmwgKTsKICAgICAgICAgICAgICAg IG1fZmV0Y2hUcmllcysrOwogICAgICAgICAgICAgICAgZmV0Y2hGZWVkUHJvcGVydGllcyggbmV3 VXJsICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoIHN0 YXR1cyA9PSBTeW5kaWNhdGlvbjo6U3VjY2VzcyApIHsKICAgICAgICAgICAgICAgIC8vIHNldCB0 aGUgY29ycmVzcG9uZGluZyBjb2xsZWN0aW9uIGF0dHJpYnV0ZXMKICAgICAgICAgICAgICAgIG1f Y2hhbmdlZENvbGxlY3Rpb25zWyAwIF0uYXR0cmlidXRlPEZlZWRQcm9wZXJ0aWVzQ29sbGVjdGlv bkF0dHJpYnV0ZT4oKS0+c2V0TmFtZSggZmVlZC0+dGl0bGUoKSApOwogICAgICAgICAgICAgICAg bV9jaGFuZ2VkQ29sbGVjdGlvbnNbIDAgXS5hdHRyaWJ1dGU8RmVlZFByb3BlcnRpZXNDb2xsZWN0 aW9uQXR0cmlidXRlPigpLT5zZXRIdG1sVXJsKCBmZWVkLT5saW5rKCkgKTsKICAgICAgICAgICAg ICAgIG1fY2hhbmdlZENvbGxlY3Rpb25zWyAwIF0uYXR0cmlidXRlPEZlZWRQcm9wZXJ0aWVzQ29s bGVjdGlvbkF0dHJpYnV0ZT4oKS0+c2V0RmVlZFR5cGUoICJyc3MiICk7CiAgICAgICAgICAgICAg ICBtX2NoYW5nZWRDb2xsZWN0aW9uc1sgMCBdLmF0dHJpYnV0ZTxGZWVkUHJvcGVydGllc0NvbGxl Y3Rpb25BdHRyaWJ1dGU+KCktPnNldERlc2NyaXB0aW9uKCBmZWVkLT5kZXNjcmlwdGlvbigpICk7 CiAgICAgICAgfQoKICAgICAgICBtX2ZldGNoVHJpZXMgPSAwOwoKICAgICAgICAvLyBjb21taXQg dGhlIG5ldyBjb2xsZWN0aW9uCiAgICAgICAgQWtvbmFkaTo6Q29sbGVjdGlvbkNyZWF0ZUpvYiAq am9iID0gbmV3IEFrb25hZGk6OkNvbGxlY3Rpb25DcmVhdGVKb2IoIG1fY2hhbmdlZENvbGxlY3Rp b25zWyAwIF0gKTsKICAgICAgICBjb25uZWN0KCBqb2IsIFNJR05BTCggcmVzdWx0KCBLSm9iKiAp ICksCiAgICAgICAgICAgICAgICAgdGhpcywgU0xPVCggc2xvdENvbGxlY3Rpb25DcmVhdGVkKCBL Sm9iKiApICkgKTsKfQoKdm9pZCBSc3NSZXNvdXJjZTo6ZmVlZENvbnRlbnRGZXRjaGVkKCBTeW5k aWNhdGlvbjo6TG9hZGVyICpsb2FkZXIsIFN5bmRpY2F0aW9uOjpGZWVkUHRyIGZlZWQsIFN5bmRp Y2F0aW9uOjpFcnJvckNvZGUgc3RhdHVzICkKewogICAgICAgIFFfVU5VU0VEKCBsb2FkZXIgKQoK ICAgICAgICBrRGVidWcoKSA8PCAiU3RhdHVzOiIgPDwgc3RhdHVzOwoKICAgICAgICBJdGVtOjpM aXN0IGl0ZW1MaXN0OwogICAgICAgIGlmICggc3RhdHVzICE9IFN5bmRpY2F0aW9uOjpTdWNjZXNz ICkgewogICAgICAgICAgICAgICAga0RlYnVnKCkgPDwgIkZhaWxlZCB0byBsb2FkIGZlZWQgZnJv bSIKICAgICAgICAgICAgICAgICAgICAgICAgPDwgY3VycmVudENvbGxlY3Rpb24oKS5hdHRyaWJ1 dGU8RmVlZFByb3BlcnRpZXNDb2xsZWN0aW9uQXR0cmlidXRlPigpLT54bWxVcmwoKTsKICAgICAg ICAgICAgICAgIGl0ZW1zUmV0cmlldmVkKCBpdGVtTGlzdCApOwogICAgICAgICAgICAgICAgcmV0 dXJuOwogICAgICAgIH0KCiAgICAgICAgUV9GT1JFQUNIKCBjb25zdCBTeW5kaWNhdGlvbjo6SXRl bVB0ciAmaXQsIGZlZWQtPml0ZW1zKCkgKSB7CiAgICAgICAgICAgICAgICBJdGVtIGl0ZW07CiAg ICAgICAgICAgICAgICBpdGVtLnNldFJlbW90ZUlkKCBpdC0+aWQoKSApOwogICAgICAgICAgICAg ICAgaXRlbS5zZXRNaW1lVHlwZSggImFwcGxpY2F0aW9uL3Jzcyt4bWwiICk7CiAgICAgICAgICAg ICAgICBpdGVtLnNldFBheWxvYWQ8S0ZlZWQ6Okl0ZW0+KCBjb252ZXJ0VG9LRmVlZEl0ZW0oIGl0 ICkgKTsKICAgICAgICAgICAgICAgIGl0ZW1MaXN0LmFwcGVuZCggaXRlbSApOwogICAgICAgIH0K CiAgICAgICAgaXRlbXNSZXRyaWV2ZWQoIGl0ZW1MaXN0ICk7Cn0KCktGZWVkOjpJdGVtIFJzc1Jl c291cmNlOjpjb252ZXJ0VG9LRmVlZEl0ZW0oY29uc3QgU3luZGljYXRpb246Okl0ZW1QdHIgJnN5 bmRJdGVtKQp7CiAgICAgICAgICAgICAgICBLRmVlZDo6SXRlbSBrZmVlZEl0ZW07CgogICAgICAg ICAgICAgICAga2ZlZWRJdGVtLnNldFN0YXR1cyhLRmVlZDo6TmV3KTsgICAgICAgICAgICAgLy8g c2hvdWxkbid0IGl0IGJlIEtGZWVkOjpOZXcgfCBLRmVlZDo6VW5yZWFkPwogICAgICAgICAgICAg ICAgLy9rZmVlZEl0ZW0uc2V0SGFzaCgpICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gaSBu ZWVkIHRvIGNhbGMgdGhlIGhhc2ggdmFsdWU/CiAgICAgICAgICAgICAgICBrZmVlZEl0ZW0uc2V0 SWRJc0hhc2goc3luZEl0ZW0tPmlkKCkuc3RhcnRzV2l0aCgiaGFzaDoiKSk7CiAgICAgICAgICAg ICAgICBrZmVlZEl0ZW0uc2V0U291cmNlRmVlZElkKGN1cnJlbnRDb2xsZWN0aW9uKCkucmVtb3Rl SWQoKS50b0ludCgpKTsKICAgICAgICAgICAgICAgIGtmZWVkSXRlbS5zZXRUaXRsZShzeW5kSXRl bS0+dGl0bGUoKSk7CiAgICAgICAgICAgICAgICBrZmVlZEl0ZW0uc2V0TGluayhzeW5kSXRlbS0+ bGluaygpKTsKICAgICAgICAgICAgICAgIGtmZWVkSXRlbS5zZXREZXNjcmlwdGlvbihzeW5kSXRl bS0+ZGVzY3JpcHRpb24oKSk7CiAgICAgICAgICAgICAgICBrZmVlZEl0ZW0uc2V0Q29udGVudChz eW5kSXRlbS0+Y29udGVudCgpKTsKICAgICAgICAgICAgICAgIEtEYXRlVGltZSBkdDsKICAgICAg ICAgICAgICAgIGlmICggc3luZEl0ZW0tPmRhdGVQdWJsaXNoZWQoKSA+IDAgKSB7CiAgICAgICAg ICAgICAgICAgICAgICAgIGR0LnNldFRpbWVfdChzeW5kSXRlbS0+ZGF0ZVB1Ymxpc2hlZCgpKTsK ICAgICAgICAgICAgICAgICAgICAgICAga2ZlZWRJdGVtLnNldERhdGVQdWJsaXNoZWQoZHQpOwog ICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAg ICAgICAgIGtmZWVkSXRlbS5zZXREYXRlUHVibGlzaGVkKEtEYXRlVGltZTo6Y3VycmVudExvY2Fs RGF0ZVRpbWUoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkdC5zZXRUaW1l X3Qoc3luZEl0ZW0tPmRhdGVVcGRhdGVkKCkpOwogICAgICAgICAgICAgICAga2ZlZWRJdGVtLnNl dERhdGVVcGRhdGVkKGR0KTsKICAgICAgICAgICAgICAgIGtmZWVkSXRlbS5zZXRJZChzeW5kSXRl bS0+aWQoKSk7CiAgICAgICAgICAgICAgICBrZmVlZEl0ZW0uc2V0TGFuZ3VhZ2Uoc3luZEl0ZW0t Pmxhbmd1YWdlKCkpOwogICAgICAgICAgICAgICAga2ZlZWRJdGVtLnNldENvbW1lbnRzQ291bnQo c3luZEl0ZW0tPmNvbW1lbnRzQ291bnQoKSk7CiAgICAgICAgICAgICAgICBrZmVlZEl0ZW0uc2V0 Q29tbWVudHNMaW5rKHN5bmRJdGVtLT5jb21tZW50c0xpbmsoKSk7CiAgICAgICAgICAgICAgICBr ZmVlZEl0ZW0uc2V0Q29tbWVudHNGZWVkKHN5bmRJdGVtLT5jb21tZW50c0ZlZWQoKSk7CiAgICAg ICAgICAgICAgICBrZmVlZEl0ZW0uc2V0Q29tbWVudFBvc3RVcmkoc3luZEl0ZW0tPmNvbW1lbnRQ b3N0VXJpKCkpOwoKICAgICAgICAgICAgICAgIC8vIEF1dGhvcnMKICAgICAgICAgICAgICAgIFFM aXN0PEtGZWVkOjpQZXJzb24+IGtmZWVkUGVyc29uczsKICAgICAgICAgICAgICAgIFFfRk9SRUFD SChjb25zdCBTeW5kaWNhdGlvbjo6UGVyc29uUHRyICZwZXJzLCBzeW5kSXRlbS0+YXV0aG9ycygp KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggIXBlcnMtPmlzTnVsbCgpICkgewogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtGZWVkOjpQZXJzb24ga2ZlZWRQZXJzb247CiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2ZlZWRQZXJzb24uc2V0TmFtZShwZXJzLT5u YW1lKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtmZWVkUGVyc29uLnNldFVy aShwZXJzLT51cmkoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2ZlZWRQZXJz b24uc2V0RW1haWwocGVycy0+ZW1haWwoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAga2ZlZWRQZXJzb25zIDw8IGtmZWVkUGVyc29uOwogICAgICAgICAgICAgICAgICAgICAgICB9 CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBrZmVlZEl0ZW0uc2V0QXV0aG9ycyhr ZmVlZFBlcnNvbnMpOwoKICAgICAgICAgICAgICAgIC8vIEVuY2xvc3VyZXMKICAgICAgICAgICAg ICAgIFFMaXN0PEtGZWVkOjpFbmNsb3N1cmU+IGtmZWVkRW5jbG9zdXJlczsKICAgICAgICAgICAg ICAgIFFfRk9SRUFDSChjb25zdCBTeW5kaWNhdGlvbjo6RW5jbG9zdXJlUHRyICZlbmNsLCBzeW5k SXRlbS0+ZW5jbG9zdXJlcygpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggIWVuY2wt PmlzTnVsbCgpICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtGZWVkOjpFbmNs b3N1cmUga2ZlZWRFbmNsb3N1cmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2Zl ZWRFbmNsb3N1cmUuc2V0VXJsKGVuY2wtPnVybCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBrZmVlZEVuY2xvc3VyZS5zZXRUaXRsZShlbmNsLT50aXRsZSgpKTsKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBrZmVlZEVuY2xvc3VyZS5zZXRUeXBlKGVuY2wtPnR5cGUo KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2ZlZWRFbmNsb3N1cmUuc2V0TGVu Z3RoKGVuY2wtPmxlbmd0aCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZmVl ZEVuY2xvc3VyZS5zZXREdXJhdGlvbihlbmNsLT5kdXJhdGlvbigpKTsKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBrZmVlZEVuY2xvc3VyZXMgPDwga2ZlZWRFbmNsb3N1cmU7CiAgICAg ICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGtm ZWVkSXRlbS5zZXRFbmNsb3N1cmVzKGtmZWVkRW5jbG9zdXJlcyk7CgogICAgICAgICAgICAgICAg Ly8gQ2F0ZWdvcmllcwogICAgICAgICAgICAgICAgUUxpc3Q8S0ZlZWQ6OkNhdGVnb3J5PiBrZmVl ZENhdGVnb3JpZXM7CiAgICAgICAgICAgICAgICBRX0ZPUkVBQ0goY29uc3QgU3luZGljYXRpb246 OkNhdGVnb3J5UHRyICZjYXQsIHN5bmRJdGVtLT5jYXRlZ29yaWVzKCkpIHsKICAgICAgICAgICAg ICAgICAgICAgICAgaWYgKCAhY2F0LT5pc051bGwoKSApIHsKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBLRmVlZDo6Q2F0ZWdvcnkga2ZlZWRDYXRlZ29yeTsKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBrZmVlZENhdGVnb3J5LnNldFRlcm0oY2F0LT50ZXJtKCkpOwogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtmZWVkQ2F0ZWdvcnkuc2V0U2NoZW1lKGNhdC0+ c2NoZW1lKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtmZWVkQ2F0ZWdvcnku c2V0TGFiZWwoY2F0LT5sYWJlbCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBr ZmVlZENhdGVnb3JpZXMgPDwga2ZlZWRDYXRlZ29yeTsKICAgICAgICAgICAgICAgICAgICAgICAg fQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAga2ZlZWRJdGVtLnNldENhdGVnb3Jp ZXMoa2ZlZWRDYXRlZ29yaWVzKTsKCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBjdXN0b20gcHJv cGVydGllcwoKICAgICAgICAgICAgICAgIHJldHVybiBrZmVlZEl0ZW07Cn0KCnZvaWQgUnNzUmVz b3VyY2U6OmR1bXAoKQp7CiAgICAgICAga0RlYnVnKCkgPDwgIioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIjsKICAgICAgICBrRGVidWcoKSA8PCAiQ3Vy cmVudCBjb2xsZWN0aW9uczoiOwogICAgICAgIFFIYXNoSXRlcmF0b3I8UVN0cmluZywgQWtvbmFk aTo6Q29sbGVjdGlvbj4gaXQobV9jb2xsZWN0aW9ucyk7CiAgICAgICAgd2hpbGUgKCBpdC5oYXNO ZXh0KCkgKSB7CiAgICAgICAgICAgICAgICBpdC5uZXh0KCk7CiAgICAgICAgICAgICAgICBrRGVi dWcoKSA8PCAiTmFtZToiIDw8IGl0LnZhbHVlKCkubmFtZSgpIDw8ICIsIHJlbW90ZSBpZDoiIDw8 IGl0LnZhbHVlKCkucmVtb3RlSWQoKQogICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgbG9j YWwgaWQ6IiA8PCBpdC52YWx1ZSgpLmlkKCk7CiAgICAgICAgfQoKICAgICAgICBrRGVidWcoKSA8 PCAiQ2hhbmdlZCBjb2xsZWN0aW9uczoiOwogICAgICAgIFFfRk9SRUFDSCggY29uc3QgQWtvbmFk aTo6Q29sbGVjdGlvbiAmY29sLCBtX2NoYW5nZWRDb2xsZWN0aW9ucyApIHsKICAgICAgICAgICAg ICAgIGtEZWJ1ZygpIDw8ICJOYW1lOiIgPDwgY29sLm5hbWUoKSA8PCAiLCByZW1vdGUgaWQ6IiA8 PCBjb2wucmVtb3RlSWQoKSA8PCAibG9jYWwgaWQ6IiA8PCBjb2wuaWQoKTsKICAgICAgICB9Cgog ICAgICAgIGtEZWJ1ZygpIDw8ICJSZW1vdmVkIGNvbGxlY3Rpb25zOiI7CiAgICAgICAgUV9GT1JF QUNIKCBjb25zdCBBa29uYWRpOjpDb2xsZWN0aW9uICZjb2wsIG1fcmVtb3ZlZENvbGxlY3Rpb25z ICkgewogICAgICAgICAgICAgICAga0RlYnVnKCkgPDwgIk5hbWU6IiA8PCBjb2wubmFtZSgpIDw8 ICIsIHJlbW90ZSBpZDoiIDw8IGNvbC5yZW1vdGVJZCgpIDw8ICJsb2NhbCBpZDoiIDw8IGNvbC5p ZCgpOwogICAgICAgIH0KICAgICAgICBrRGVidWcoKSA8PCAiKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioiOwp9Cgpib29sIFJzc1Jlc291cmNlOjpsb2Fk T3BtbCggY29uc3QgUVN0cmluZyAmcGF0aCApCnsKICAgICAgICBRRmlsZSBmaWxlKCBwYXRoICk7 CiAgICAgICAgaWYgKCAhZmlsZS5vcGVuKFFGaWxlOjpSZWFkT25seSB8IFFGaWxlOjpUZXh0KSAp IHsKICAgICAgICAgICAgICAgIGtXYXJuaW5nKCkgPDwgIkNvdWxkbid0IG9wZW4gdGhlIE9QTUwg ZG9jdW1lbnQiOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAg ICAgbV9yZWFkZXIuc2V0RGV2aWNlKCZmaWxlKTsKCiAgICAgICAgd2hpbGUgKCAhbV9yZWFkZXIu YXRFbmQoKSApIHsKICAgICAgICAgICAgICAgIG1fcmVhZGVyLnJlYWROZXh0KCk7CgogICAgICAg ICAgICAgICAgaWYgKCBtX3JlYWRlci5pc1N0YXJ0RWxlbWVudCgpICkgewogICAgICAgICAgICAg ICAgICAgICAgICBpZiAoIG1fcmVhZGVyLm5hbWUoKS50b1N0cmluZygpLnRvTG93ZXIoKSA9PSAi b3BtbCIgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RlYnVnKCkgPDwgIk9Q TUwgdmVyc2lvbiIgPDwgbV9yZWFkZXIuYXR0cmlidXRlcygpLnZhbHVlKCAidmVyc2lvbiIgKS50 b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRPcG1sKCk7CiAg ICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9yZWFkZXIucmFpc2VFcnJvciggIlRoZSBm aWxlIGlzIG5vdCBhbiBPUE1MIGRvY3VtZW50LiIgKTsKICAgICAgICAgICAgICAgICAgICAgICAg fQogICAgICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZmlsZS5jbG9zZSgpOwogICAg ICAgIHJldHVybiAhbV9yZWFkZXIuZXJyb3IoKTsKfQoKdm9pZCBSc3NSZXNvdXJjZTo6cmVhZFVu a25vd25FbGVtZW50KCkKewogICAgICAgIFFfQVNTRVJUKG1fcmVhZGVyLmlzU3RhcnRFbGVtZW50 KCkpOwoKICAgICAgICB3aGlsZSAoICFtX3JlYWRlci5hdEVuZCgpICkgewogICAgICAgICAgICAg ICAgbV9yZWFkZXIucmVhZE5leHQoKTsKCiAgICAgICAgICAgICAgICBpZiAoIG1fcmVhZGVyLmlz RW5kRWxlbWVudCgpICkKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAg ICAgICAgaWYgKCBtX3JlYWRlci5pc1N0YXJ0RWxlbWVudCgpICkKICAgICAgICAgICAgICAgICAg ICAgICAgcmVhZFVua25vd25FbGVtZW50KCk7CiAgICAgICAgfQp9Cgp2b2lkIFJzc1Jlc291cmNl OjpyZWFkT3BtbCgpCnsKICAgICAgICBRX0FTU0VSVCggbV9yZWFkZXIuaXNTdGFydEVsZW1lbnQo KSAmJiBtX3JlYWRlci5uYW1lKCkudG9TdHJpbmcoKS50b0xvd2VyKCkgPT0gIm9wbWwiICk7Cgog ICAgICAgIHdoaWxlICggIW1fcmVhZGVyLmF0RW5kKCkgKSB7CiAgICAgICAgICAgICAgICBtX3Jl YWRlci5yZWFkTmV4dCgpOwoKICAgICAgICAgICAgICAgIGlmICggbV9yZWFkZXIuaXNFbmRFbGVt ZW50KCkgKQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBp ZiAoIG1fcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAg IGlmICggbV9yZWFkZXIubmFtZSgpLnRvU3RyaW5nKCkudG9Mb3dlcigpID09ICJoZWFkIiApIHsK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkVW5rbm93bkVsZW1lbnQoKTsKICAg ICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgg bV9yZWFkZXIubmFtZSgpLnRvU3RyaW5nKCkudG9Mb3dlcigpID09ICJib2R5IiApIHsKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkQm9keSgpOwogICAgICAgICAgICAgICAgICAg ICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHJlYWRVbmtub3duRWxlbWVudCgpOwogICAgICAgICAgICAgICAgICAgICAg ICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfQp9Cgp2b2lkIFJzc1Jlc291cmNlOjpyZWFk Qm9keSgpCnsKICAgICAgICBRX0FTU0VSVCggbV9yZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiBt X3JlYWRlci5uYW1lKCkudG9TdHJpbmcoKS50b0xvd2VyKCkgPT0gImJvZHkiICk7CgogICAgICAg IHdoaWxlICggIW1fcmVhZGVyLmF0RW5kKCkgKSB7CiAgICAgICAgICAgICAgICBtX3JlYWRlci5y ZWFkTmV4dCgpOwoKICAgICAgICAgICAgICAgIGlmICggbV9yZWFkZXIuaXNFbmRFbGVtZW50KCkg KQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBpZiAoIG1f cmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgg bV9yZWFkZXIubmFtZSgpLnRvU3RyaW5nKCkudG9Mb3dlcigpID09ICJvdXRsaW5lIiApIHsKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRU3RyaW5nTGlzdCB0YWdzOwogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHJlYWRPdXRsaW5lKCB0YWdzICk7CiAgICAgICAgICAgICAg ICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgcmVhZFVua25vd25FbGVtZW50KCk7CiAgICAgICAgICAgICAgICAg ICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICB9Cn0KCnN0YXRpYyBRU3RyaW5nUmVm IGF0dHJpYnV0ZVZhbHVlKCBjb25zdCBRWG1sU3RyZWFtQXR0cmlidXRlcyAmYXR0cmlidXRlcywg Y29uc3QgUVN0cmluZyAmbmFtZSApCnsKICAgICAgICBRX0ZPUkVBQ0goIGNvbnN0IFFYbWxTdHJl YW1BdHRyaWJ1dGUgJmF0dHIsIGF0dHJpYnV0ZXMgKSB7CiAgICAgICAgICAgICAgICBpZiAoIGF0 dHIubmFtZSgpLnRvU3RyaW5nKCkudG9Mb3dlcigpID09IG5hbWUgKSB7CiAgICAgICAgICAgICAg ICAgICAgICAgIHJldHVybiBhdHRyLnZhbHVlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAg fQoKICAgICAgICByZXR1cm4gUVN0cmluZ1JlZigpOwp9Cgp2b2lkIFJzc1Jlc291cmNlOjpyZWFk T3V0bGluZSggUVN0cmluZ0xpc3QgJnRhZ3MgKQp7CiAgICAgICAgUV9BU1NFUlQoIG1fcmVhZGVy LmlzU3RhcnRFbGVtZW50KCkgJiYgbV9yZWFkZXIubmFtZSgpLnRvU3RyaW5nKCkudG9Mb3dlcigp ID09ICJvdXRsaW5lIiApOwoKICAgICAgICBib29sIGlzRm9sZGVyID0gZmFsc2U7CiAgICAgICAg UVN0cmluZyB4bWxVcmwgPSBhdHRyaWJ1dGVWYWx1ZSggbV9yZWFkZXIuYXR0cmlidXRlcygpLCAi eG1sdXJsIiApLnRvU3RyaW5nKCk7CgogICAgICAgIGlmICggeG1sVXJsLmlzRW1wdHkoKSApIHsK ICAgICAgICAgICAgICAgIGlmICggIWF0dHJpYnV0ZVZhbHVlKCBtX3JlYWRlci5hdHRyaWJ1dGVz KCksICJ0ZXh0IiApLmlzRW1wdHkoKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhp cyBpcyBhbiBBa3JlZ2F0b3IncyBmb2xkZXIKICAgICAgICAgICAgICAgICAgICAgICAgaXNGb2xk ZXIgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB0YWdzIDw8IGF0dHJpYnV0ZVZhbHVl KCBtX3JlYWRlci5hdHRyaWJ1dGVzKCksICJ0ZXh0IiApLnRvU3RyaW5nKCk7CiAgICAgICAgICAg ICAgICAgICAgICAgIGtEZWJ1ZygpIDw8ICJUYWdzOiIgPDwgdGFnczsKICAgICAgICAgICAgICAg IH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBrRGVidWco KSA8PCAiRW5jb3VudGVyZWQgYW4gZW1wdHkgb3V0bGluZSI7CiAgICAgICAgICAgICAgICAgICAg ICAgIC8vIFRPRE86IGR1bXAgdGhlIHJlc3Qgb2YgdGhlIGJsb2NrCiAgICAgICAgICAgICAgICB9 CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIGZl ZWQKICAgICAgICAgICAgICAgIGtEZWJ1ZygpIDw8ICJGZWVkOiIgPDwgeG1sVXJsOwogICAgICAg ICAgICAgICAgaXNGb2xkZXIgPSBmYWxzZTsKICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gY29s OwogICAgICAgICAgICAgICAgaWYgKCB4bWxVcmwgPT0gImh0dHA6Ly9wbGFuZXRrZGUub3JnL3Jz czIwLnhtbCIgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5zZXROYW1lKCAiT0xEIE5B TUUiICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5zZXRSZW1vdGVJZCggImJ1ZyIgKTsK ICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAg ICAgICAgICBjb2wuc2V0TmFtZSggeG1sVXJsICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNv bC5zZXRSZW1vdGVJZCggS1JhbmRvbTo6cmFuZG9tU3RyaW5nKCAxMCApICk7CiAgICAgICAgICAg ICAgICB9CiAgICAgICAgICAgICAgICBjb2wuc2V0UGFyZW50KCBtX3Jvb3RDb2xsZWN0aW9uICk7 CiAgICAgICAgICAgICAgICBjb2wuc2V0Q29udGVudE1pbWVUeXBlcyggUVN0cmluZ0xpc3QoICJh cHBsaWNhdGlvbi9yc3MreG1sIiApICk7CgogICAgICAgICAgICAgICAgLy8gc2V0IGZlZWQgcHJv cGVydGllcwogICAgICAgICAgICAgICAgRmVlZFByb3BlcnRpZXNDb2xsZWN0aW9uQXR0cmlidXRl ICpwcm9wcyA9IG5ldyBGZWVkUHJvcGVydGllc0NvbGxlY3Rpb25BdHRyaWJ1dGUoKTsKICAgICAg ICAgICAgICAgIHByb3BzLT5zZXROYW1lKCBhdHRyaWJ1dGVWYWx1ZSggbV9yZWFkZXIuYXR0cmli dXRlcygpLCAidGl0bGUiICkudG9TdHJpbmcoKSApOwogICAgICAgICAgICAgICAgaWYgKCBwcm9w cy0+bmFtZSgpLmlzRW1wdHkoKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMtPnNl dE5hbWUoIGF0dHJpYnV0ZVZhbHVlKCBtX3JlYWRlci5hdHRyaWJ1dGVzKCksICJ0ZXh0IiApLnRv U3RyaW5nKCkgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggcHJvcHMt Pm5hbWUoKS5pc0VtcHR5KCkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLT5zZXRO YW1lKCB4bWxVcmwgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHByb3BzLT5z ZXRYbWxVcmwoIHhtbFVybCApOwogICAgICAgICAgICAgICAgcHJvcHMtPnNldEh0bWxVcmwoIGF0 dHJpYnV0ZVZhbHVlKCBtX3JlYWRlci5hdHRyaWJ1dGVzKCksICJodG1sdXJsIiApLnRvU3RyaW5n KCkgKTsKICAgICAgICAgICAgICAgIHByb3BzLT5zZXREZXNjcmlwdGlvbiggYXR0cmlidXRlVmFs dWUoIG1fcmVhZGVyLmF0dHJpYnV0ZXMoKSwgImRlc2NyaXB0aW9uIiApLnRvU3RyaW5nKCkgKTsK ICAgICAgICAgICAgICAgIHByb3BzLT5zZXRGZWVkVHlwZSggYXR0cmlidXRlVmFsdWUoIG1fcmVh ZGVyLmF0dHJpYnV0ZXMoKSwgInR5cGUiICkudG9TdHJpbmcoKSApOwogICAgICAgICAgICAgICAg aWYgKCBwcm9wcy0+ZmVlZFR5cGUoKS5pc0VtcHR5KCkgKSB7CiAgICAgICAgICAgICAgICAgICAg ICAgIHByb3BzLT5zZXRGZWVkVHlwZSggInJzcyIgKTsKICAgICAgICAgICAgICAgIH0KICAgICAg ICAgICAgICAgIGNvbC5hZGRBdHRyaWJ1dGUoIHByb3BzICk7CgogICAgICAgICAgICAgICAgLy8g c2V0IGZlZWQgdGFncwogICAgICAgICAgICAgICAga0RlYnVnKCkgPDwgIlNldHRpbmcgdGFnczoi IDw8IHRhZ3M7CiAgICAgICAgICAgICAgICBUYWdzQ29sbGVjdGlvbkF0dHJpYnV0ZSAqZmVlZFRh Z3MgPSBuZXcgVGFnc0NvbGxlY3Rpb25BdHRyaWJ1dGUoIHRhZ3MgKTsKICAgICAgICAgICAgICAg IGNvbC5hZGRBdHRyaWJ1dGUoIGZlZWRUYWdzICk7CiAgICAgICAgICAgICAgICBtX2NoYW5nZWRD b2xsZWN0aW9ucyA8PCBjb2w7CiAgICAgICAgfQoKICAgICAgICB3aGlsZSAoICFtX3JlYWRlci5h dEVuZCgpICkgewogICAgICAgICAgICAgICAgbV9yZWFkZXIucmVhZE5leHQoKTsKCiAgICAgICAg ICAgICAgICBpZiAoIG1fcmVhZGVyLmlzRW5kRWxlbWVudCgpICkKICAgICAgICAgICAgICAgICAg ICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgaWYgKCBtX3JlYWRlci5pc1N0YXJ0RWxlbWVu dCgpICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIG1fcmVhZGVyLm5hbWUoKS50b1N0 cmluZygpLnRvTG93ZXIoKSA9PSAib3V0bGluZSIgJiYgaXNGb2xkZXIgKQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHJlYWRPdXRsaW5lKCB0YWdzICk7CiAgICAgICAgICAgICAgICAg ICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkVW5rbm93bkVs ZW1lbnQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIG9uY2Ugd2Ug YXJlIGJhY2sgZnJvbSByZWN1cnNpb24gcmVtb3ZlIHRoZSBhZGRlZCB0YWcKICAgICAgICAvLyBm cm9tIHRoZSB0b3Agb2YgdGhlIGxpc3QKICAgICAgICBpZiAoIGlzRm9sZGVyICkKICAgICAgICAg ICAgICAgIHRhZ3MucmVtb3ZlTGFzdCgpOwp9CgpBS09OQURJX1JFU09VUkNFX01BSU4oUnNzUmVz b3VyY2UpCgojaW5jbHVkZSAicnNzcmVzb3VyY2UubW9jIgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtyc3MvcmVzb3VyY2UvQ01ha2VM aXN0cy50eHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwNjQ0ADAwMDE3NTAAMDAwMTc1MAAwMDAwMDAwMTI3 NwAxMTAyNjQyMjYwNwAwMTYwMDIAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAdXN0YXIgIAB2b25hbWkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZvbmFtaQAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZmluZF9wYWNrYWdlKEtERTQgUkVR VUlSRUQpCgoKc2V0KHJzc3Jlc291cmNlX1NSQ1MKICAgIHJzc3Jlc291cmNlLmNwcAogICAgLi4v bGlia3Jzcy90YWdzY29sbGVjdGlvbmF0dHJpYnV0ZS5jcHAKICAgIC4uL2xpYmtyc3Mvc3Vic2Ny aXB0aW9ubGFiZWxzY29sbGVjdGlvbmF0dHJpYnV0ZS5jcHAKICAgIC4uL2xpYmtyc3MvZmVlZHBy b3BlcnRpZXNjb2xsZWN0aW9uYXR0cmlidXRlLmNwcAopCgpxdDRfYWRkX2RidXNfYWRhcHRvcihy c3NyZXNvdXJjZV9TUkNTIC4uL2xpYmtyc3Mvb3JnLmtkZS5rcnNzLnhtbCByc3NyZXNvdXJjZS5o IFJzc1Jlc291cmNlICkKCmtkZTRfYWRkX2V4ZWN1dGFibGUoYWtvbmFkaV9yc3NfcmVzb3VyY2Ug UlVOX1VOSU5TVEFMTEVEICR7cnNzcmVzb3VyY2VfU1JDU30pCgp0YXJnZXRfbGlua19saWJyYXJp ZXMoYWtvbmFkaV9yc3NfcmVzb3VyY2UgJHtLREU0X0FLT05BRElfTElCU30gJHtRVF9RVERCVVNf TElCUkFSWX0gJHtLREU0X0tJT19MSUJSQVJZfSAke0tERTRfU1lORElDQVRJT05fTElCU30ga2Zl ZWQpCgppbnN0YWxsKFRBUkdFVFMgYWtvbmFkaV9yc3NfcmVzb3VyY2UgJHtJTlNUQUxMX1RBUkdF VFNfREVGQVVMVF9BUkdTfSkKaW5zdGFsbChGSUxFUyByc3NyZXNvdXJjZS5kZXNrdG9wIERFU1RJ TkFUSU9OICIke0NNQUtFX0lOU1RBTExfUFJFRklYfS9zaGFyZS9ha29uYWRpL2FnZW50cyIpCgAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtyc3MvcmVzb3VyY2UvcnNzcmVzb3Vy Y2UuZGVza3RvcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwNjQ0ADAwMDE3NTAAMDAwMTc1MAAwMDAwMDAwMDc1NAAx MTAyNTcwMTc3NQAwMTcyMjAAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAdXN0YXIgIAB2b25hbWkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZvbmFtaQAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAW0Rlc2t0b3AgRW50cnldCk5hbWU9QWtv bmFkaSBSU1MgUmVzb3VyY2UKTmFtZVtlc109UmVjdXJzb3MgUlNTIGRlIEFrb25hZGkKTmFtZVtl dF09QWtvbmFkaSBSU1MtaSByZXNzdXJzcwpOYW1lW3N2XT1Ba29uYWRpIFJTUy1yZXN1cnMKQ29t bWVudD1BbiBhZ2VudCB0byBtYW5hZ2UgUlNTIGZlZWRzCkNvbW1lbnRbZXNdPVVuIGFnZW50ZSBw YXJhIGFkbWluaXN0cmFyIGZ1ZW50ZXMgUlNTCkNvbW1lbnRbZXRdPUFnZW50IFJTUy12b29ndWRl IGhhbGRhbWlzZWtzCkNvbW1lbnRbc3ZdPUVuIG1vZHVsIGbDtnIgYXR0IGhhbnRlcmEgUlNTLWth bmFsZXIKVHlwZT1Ba29uYWRpUmVzb3VyY2UKRXhlYz1ha29uYWRpX3Jzc19yZXNvdXJjZQpJY29u PWFrcmVnYXRvcgoKWC1Ba29uYWRpLU1pbWVUeXBlcz1hcHBsaWNhdGlvbi9yc3MreG1sClgtQWtv bmFkaS1DYXBhYmlsaXRpZXM9UmVzb3VyY2UKWC1Ba29uYWRpLUlkZW50aWZpZXI9YWtvbmFkaV9y c3NfcmVzb3VyY2UKAAAAAAAAAAAAAAAAAAAAAAAAAABrcnNzL0NNYWtlTGlzdHMudHh0AAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAMDAwMDY0NAAwMDAxNzUwADAwMDE3NTAAMDAwMDAwMDA1NTEAMTEw MjU3MDE3NzYAMDE0MTUzACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAHVzdGFyICAAdm9uYW1pAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2b25hbWkAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHByb2plY3Qoa3JzcykKCmZpbmRfcGFja2Fn ZShCb29zdCBSRVFVSVJFRCkKCmluY2x1ZGUoS0RFNERlZmF1bHRzKQppbmNsdWRlX2RpcmVjdG9y aWVzKCR7S0RFNF9JTkNMVURFU30gJHtRVF9JTkNMVURFU30gJHtCb29zdF9JTkNMVURFX0RJUn0p CgojIGNvcHktcGFzdGVkIGZyb20gc29tZXdoZXJlCiMgd2h5IHdvdWxkIGkgbmVlZCBleGNlcHRp b25zIGVuYWJsZWQ/CiNzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gJHtL REU0X0VOQUJMRV9FWENFUFRJT05TfSIpCgphZGRfc3ViZGlyZWN0b3J5KHJlc291cmNlKQphZGRf c3ViZGlyZWN0b3J5KHBsdWdpbikKYWRkX3N1YmRpcmVjdG9yeShrcnNzcmVhZGVyKQoAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== ------=_Part_3427_26758788.1213867935939 Content-Type: application/octet-stream; name=feeds.opml Content-Transfer-Encoding: base64 X-Attachment-Id: f_fhn5gtlm1 Content-Disposition: attachment; filename=feeds.opml PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG9wbWwgdmVyc2lvbj0iMS4w IiA+CiA8aGVhZD4KICA8dGV4dD48L3RleHQ+CiA8L2hlYWQ+CiA8Ym9keT4KICAgIDxvdXRsaW5l IHRpdGxlPSLQn9C70LDQvdC10YLQsCBVYnVudHUiIHVzZUN1c3RvbUZldGNoSW50ZXJ2YWw9ImZh bHNlIiB2ZXJzaW9uPSJSU1MiIG1heEFydGljbGVBZ2U9IjAiIGRlc2NyaXB0aW9uPSJQbGFuZXQg VWJ1bnR1IC0gaHR0cDovL3BsYW5ldC51YnVudHUuY29tLyIgaHRtbFVybD0iaHR0cDovL3BsYW5l dC51YnVudHUuY29tLyIgeG1sVXJsPSJodHRwOi8vcGxhbmV0LnVidW50dS5jb20vcnNzMjAueG1s IiBmZXRjaEludGVydmFsPSIwIiB0eXBlPSJyc3MiIGlkPSI1MDc2NzkxNzYiIGFyY2hpdmVNb2Rl PSJnbG9iYWxEZWZhdWx0IiBtYXhBcnRpY2xlTnVtYmVyPSIwIiB0ZXh0PSLQn9C70LDQvdC10YLQ sCBVYnVudHUiIC8+CiAgICA8b3V0bGluZSB0aXRsZT0i0J/Qu9Cw0L3QtdGC0LAgS0RFIiB1c2VD dXN0b21GZXRjaEludGVydmFsPSJmYWxzZSIgdmVyc2lvbj0iUlNTIiBtYXhBcnRpY2xlQWdlPSIw IiBkZXNjcmlwdGlvbj0iUGxhbmV0IEtERSAtIGh0dHA6Ly9wbGFuZXRLREUub3JnLyIgaHRtbFVy bD0iaHR0cDovL3BsYW5ldEtERS5vcmcvIiB4bWxVcmw9Imh0dHA6Ly9wbGFuZXRrZGUub3JnL3Jz czIwLnhtbCIgZmV0Y2hJbnRlcnZhbD0iMCIgdHlwZT0icnNzIiBpZD0iNjc2NDY5Nzg0IiBhcmNo aXZlTW9kZT0iZ2xvYmFsRGVmYXVsdCIgbWF4QXJ0aWNsZU51bWJlcj0iMCIgdGV4dD0i0J/Qu9Cw 0L3QtdGC0LAgS0RFIiAvPgogPC9ib2R5Pgo8L29wbWw+Cg== ------=_Part_3427_26758788.1213867935939 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ KDE PIM mailing list kde-pim@kde.org https://mail.kde.org/mailman/listinfo/kde-pim KDE PIM home page at http://pim.kde.org/ ------=_Part_3427_26758788.1213867935939--