[PATCH] Add SRFI 158: Generators and Accumulators
"Yitzchak Gale" <[email protected]> Mon, 27 Jul 2026 10:51:14 +0300
| Newsgroups | gmane.lisp.guile.devel |
|---|---|
| Message-ID | <[email protected]> |
--0746dbdd83758d84caee6824a7c08f303dce4071 Content-Type: multipart/alternative; boundary=87626a0c51f65426ec1b55ecd369c3070b30b0c8 --87626a0c51f65426ec1b55ecd369c3070b30b0c8 Content-Type: text/plain Content-Transfer-Encoding: 7bit Subject: [PATCH] Add SRFI 158: Generators and Accumulators This patch adds support for SRFI 158 (Generators and Accumulators), a widely-implemented and fundamental SRFI that has been final since 2017. WHAT IS SRFI 158? ----------------- SRFI 158 provides two complementary abstractions: 1. Generators: procedures that produce a sequence of values when called repeatedly. They are lightweight, stateful, and destructive (unlike SRFI 41 streams which are persistent). 2. Accumulators: the inverse of generators - procedures that consume a sequence of values. Generators are a fundamental building block used throughout the Scheme ecosystem, similar to Python's itertools or Clojure's lazy sequences. They are particularly useful for: - Processing large or infinite sequences efficiently - Composing data transformations - Building lazy pipelines - Working with external data sources (files, network, etc.) - Separation of concerns: abstracting boundaries and processing from data WHY ADD IT TO GUILE? -------------------- 1. Widespread adoption: Implemented in Gauche, Chicken, Chibi, Sagittarius, and other major Scheme implementations. 2. Referenced by newer SRFIs: SRFI 171 (Transducers), already in Guile, can work with generators. SRFI 158 makes that integration natural. 3. Fills a gap: While Guile has SRFI 41 (streams) for persistent lazy sequences, it lacks a lightweight mutable sequence abstraction. 4. Mature and stable: Finalized in 2017, with nearly a decade of real-world use. 5. Easy maintenance: Uses the well-tested reference implementation with minimal Guile-specific glue code. IMPLEMENTATION NOTES -------------------- - Based on the official reference implementation from https://srfi.schemers.org/srfi-158/ - Requires only SRFI 11 (let-values) and basic R6RS modules already in Guile - All exports follow the SRFI 158 specification exactly - Comprehensive test suite covering all major functionality - No conflicts with existing Guile procedures TESTING ------- The included test suite covers: - Generator constructors (make-range-generator, list->generator, etc.) - Generator operations (gfilter, gmap, gtake, gdrop, etc.) - Generator consumers (generator->list, generator-fold, etc.) - Accumulators (list-accumulator, sum-accumulator, etc.) The tests are based on the existing tests in the reference implementation, adapted for Guile's test framework. All tests pass with the current Guile 3.0.11. DOCUMENTATION ------------- The patch includes documentation for the Guile Reference Manual (doc/ref/srfi-modules.texi) following the style of existing SRFIs like SRFI-171. The documentation covers: - Introduction to generators and accumulators - Constructor procedures with examples - Generator operations (filtering, mapping, etc.) - Consumer procedures - Accumulator procedures The documentation references the full SRFI-158 specification for additional details and rationale. FUTURE WORK ----------- If accepted, this opens the door for: - Better SRFI 171 (transducers) integration - Potential future SRFIs that build on generators - Examples showing generator usage in Guile DISCLAIMER ---------- I was aided by Claude Sonnet 5 while developing this patch, under my close supervision and review. The work is mine. Please let me know if you have any questions or if any changes are needed. Thanks for considering this contribution! Yitz Gale [email protected] --87626a0c51f65426ec1b55ecd369c3070b30b0c8 Content-Type: text/html Content-Transfer-Encoding: quoted-printable <!DOCTYPE html><html><head><title></title></head><body><div>Subject: [PA= TCH] Add SRFI 158: Generators and Accumulators</div><div><br></div><div>= This patch adds support for SRFI 158 (Generators and Accumulators), a</d= iv><div>widely-implemented and fundamental SRFI that has been final sinc= e 2017.</div><div><br></div><div>WHAT IS SRFI 158?</div><div>-----------= ------</div><div>SRFI 158 provides two complementary abstractions:</div>= <div><br></div><div>1. Generators: procedures that produce a sequence of= values when called</div><div> repeatedly. They are lightwei= ght, stateful, and destructive (unlike</div><div> SRFI 41 st= reams which are persistent).</div><div><br></div><div>2. Accumulators: t= he inverse of generators - procedures that consume a</div><div> &nb= sp; sequence of values.</div><div><br></div><div>Generators are a fundam= ental building block used throughout the Scheme</div><div>ecosystem, sim= ilar to Python's itertools or Clojure's lazy sequences.</div><div>They a= re particularly useful for:</div><div>- Processing large or infinite seq= uences efficiently</div><div>- Composing data transformations</div><div>= - Building lazy pipelines</div><div>- Working with external data sources= (files, network, etc.)</div><div>- Separation of concerns: abstracting = boundaries and processing from data</div><div><br></div><div>WHY ADD IT = TO GUILE?</div><div>--------------------</div><div>1. Widespread adoptio= n: Implemented in Gauche, Chicken, Chibi, Sagittarius,</div><div> &= nbsp; and other major Scheme implementations.</div><div><br></div><div>2= . Referenced by newer SRFIs: SRFI 171 (Transducers), already in Guile,</= div><div> can work with generators. SRFI 158 makes that inte= gration natural.</div><div><br></div><div>3. Fills a gap: While Guile ha= s SRFI 41 (streams) for persistent lazy</div><div> sequences= , it lacks a lightweight mutable sequence abstraction.</div><div><br></d= iv><div>4. Mature and stable: Finalized in 2017, with nearly a decade of= </div><div> real-world use.</div><div><br></div><div>5. Easy= maintenance: Uses the well-tested reference implementation with</div><d= iv> minimal Guile-specific glue code.</div><div><br></div><d= iv>IMPLEMENTATION NOTES</div><div>--------------------</div><div>- Based= on the official reference implementation from</div><div> <a href=3D= "https://srfi.schemers.org/srfi-158/">https://srfi.schemers.org/srfi-158= /</a></div><div><br></div><div>- Requires only SRFI 11 (let-values) and = basic R6RS modules already</div><div> in Guile</div><div><br></div= ><div>- All exports follow the SRFI 158 specification exactly</div><div>= <br></div><div>- Comprehensive test suite covering all major functionali= ty</div><div><br></div><div>- No conflicts with existing Guile procedure= s</div><div><br></div><div>TESTING</div><div>-------</div><div>The inclu= ded test suite covers:</div><div>- Generator constructors (make-range-ge= nerator, list->generator, etc.)</div><div>- Generator operations (gfi= lter, gmap, gtake, gdrop, etc.)</div><div>- Generator consumers (generat= or->list, generator-fold, etc.)</div><div>- Accumulators (list-accumu= lator, sum-accumulator, etc.)</div><div><br></div><div>The tests are bas= ed on the existing tests in the reference implementation,</div><div>adap= ted for Guile's test framework.</div><div><br></div><div>All tests pass = with the current Guile 3.0.11.</div><div><br></div><div>DOCUMENTATION</d= iv><div>-------------</div><div>The patch includes documentation for the= Guile Reference Manual</div><div>(doc/ref/srfi-modules.texi) following = the style of existing SRFIs like</div><div>SRFI-171. The documentation c= overs:</div><div>- Introduction to generators and accumulators</div><div= >- Constructor procedures with examples</div><div>- Generator operations= (filtering, mapping, etc.)</div><div>- Consumer procedures</div><div>- = Accumulator procedures</div><div><br></div><div>The documentation refere= nces the full SRFI-158 specification for</div><div>additional details an= d rationale.</div><div><br></div><div>FUTURE WORK</div><div>-----------<= /div><div>If accepted, this opens the door for:</div><div>- Better SRFI = 171 (transducers) integration</div><div>- Potential future SRFIs that bu= ild on generators</div><div>- Examples showing generator usage in Guile<= /div><div><br></div><div>DISCLAIMER</div><div>----------</div><div>I was= aided by Claude Sonnet 5 while developing this patch,</div><div>under m= y close supervision and review. The work is mine.</div><div><br></div><d= iv>Please let me know if you have any questions or if any changes are ne= eded.</div><div><br></div><div>Thanks for considering this contribution!= </div><div><br></div><div>Yitz Gale</div><div><a href=3D"mailto:gale@sef= er.org">[email protected]</a></div><div><br></div></body></html> --87626a0c51f65426ec1b55ecd369c3070b30b0c8-- --0746dbdd83758d84caee6824a7c08f303dce4071 Content-Disposition: attachment; filename="srfi-158.patch" Content-Type: text/x-diff; name="srfi-158.patch" Content-Transfer-Encoding: base64 RnJvbSBkZjNhNzcwNWVkODhkNGI5NGY1M2UyOWRjZGVlYjVjZjg0MTFkNTA5IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBZaXR6IEdhbGUgPGdhbGVAc2VmZXIub3JnPgpEYXRl OiBNb24sIDI3IEp1bCAyMDI2IDAxOjA3OjI1ICswMzAwClN1YmplY3Q6IFtQQVRDSF0gQWRk IFNSRkkgMTU4OiBHZW5lcmF0b3JzIGFuZCBBY2N1bXVsYXRvcnMKClNSRkkgMTU4IHByb3Zp ZGVzIGdlbmVyYXRvcnMgKHByb2NlZHVyZXMgdGhhdCBwcm9kdWNlIHNlcXVlbmNlcyBvZgp2 YWx1ZXMpIGFuZCBhY2N1bXVsYXRvcnMgKHByb2NlZHVyZXMgdGhhdCBjb25zdW1lIHNlcXVl bmNlcykuIFRoaXMgaXMKYSBmdW5kYW1lbnRhbCBsYXp5IHNlcXVlbmNlIGFic3RyYWN0aW9u IHVzZWQgYnkgbWFueSBtb2Rlcm4gU2NoZW1lCnByb2dyYW1zLgoKVGhlIGltcGxlbWVudGF0 aW9uIHVzZXMgdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBmcm9tCmh0dHBzOi8vc3Jm aS5zY2hlbWVycy5vcmcvc3JmaS0xNTgvIHdpdGggbWluaW1hbCBHdWlsZS1zcGVjaWZpYwp3 cmFwcGVyIGNvZGUuCgoqIG1vZHVsZS9zcmZpL3NyZmktMTU4LnNjbTogTmV3IGZpbGUuIE1h aW4gbW9kdWxlIHdyYXBwZXIuCiogbW9kdWxlL3NyZmkvc3JmaS0xNTgvaW1wbC5zY206IE5l dyBmaWxlLiBSZWZlcmVuY2UgaW1wbGVtZW50YXRpb24uCiogdGVzdC1zdWl0ZS90ZXN0cy9z cmZpLTE1OC50ZXN0OiBOZXcgZmlsZS4gVGVzdCBzdWl0ZSBiYXNlZCBvbiB0aGUKICBTUkZJ IDE1OCByZWZlcmVuY2UgdGVzdHMsIGFkYXB0ZWQgdG8gR3VpbGUncyB0ZXN0IGZyYW1ld29y ay4KKiBkb2MvcmVmL3NyZmktbW9kdWxlcy50ZXhpOiBBZGQgU1JGSS0xNTggZG9jdW1lbnRh dGlvbi4KLS0tCiBkb2MvcmVmL3NyZmktbW9kdWxlcy50ZXhpICAgICAgfCAzMjAgKysrKysr KysrKysrKysrKysrCiBtb2R1bGUvc3JmaS9zcmZpLTE1OC5zY20gICAgICAgfCAxMjEgKysr KysrKwogbW9kdWxlL3NyZmkvc3JmaS0xNTgvaW1wbC5zY20gIHwgNTgwICsrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKwogdGVzdC1zdWl0ZS90ZXN0cy9zcmZpLTE1OC50ZXN0 IHwgMjQ1ICsrKysrKysrKysrKysrCiA0IGZpbGVzIGNoYW5nZWQsIDEyNjYgaW5zZXJ0aW9u cygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IG1vZHVsZS9zcmZpL3NyZmktMTU4LnNjbQogY3Jl YXRlIG1vZGUgMTAwNjQ0IG1vZHVsZS9zcmZpL3NyZmktMTU4L2ltcGwuc2NtCiBjcmVhdGUg bW9kZSAxMDA2NDQgdGVzdC1zdWl0ZS90ZXN0cy9zcmZpLTE1OC50ZXN0CgpkaWZmIC0tZ2l0 IGEvZG9jL3JlZi9zcmZpLW1vZHVsZXMudGV4aSBiL2RvYy9yZWYvc3JmaS1tb2R1bGVzLnRl eGkKaW5kZXggMWNiYjBjMDMwLi45MGMzZjkwOTIgMTAwNjQ0Ci0tLSBhL2RvYy9yZWYvc3Jm aS1tb2R1bGVzLnRleGkKKysrIGIvZG9jL3JlZi9zcmZpLW1vZHVsZXMudGV4aQpAQCAtNjgs NiArNjgsNyBAQCBnZXQgdGhlIHJlbGV2YW50IFNSRkkgZG9jdW1lbnRzIGZyb20gdGhlIFNS RkkgaG9tZSBwYWdlCiAqIFNSRkktMTA1OjogICAgICAgICAgICAgICAgICAgIEN1cmx5LWlu Zml4IGV4cHJlc3Npb25zLgogKiBTUkZJLTExMTo6ICAgICAgICAgICAgICAgICAgICBCb3hl cy4KICogU1JGSS0xMTk6OiAgICAgICAgICAgICAgICAgICAgV2lzcDogc2ltcGxlciBpbmRl bnRhdGlvbi1zZW5zaXRpdmUgU2NoZW1lLgorKiBTUkZJLTE1ODo6ICAgICAgICAgICAgICAg ICAgICBHZW5lcmF0b3JzIGFuZCBBY2N1bXVsYXRvcnMKICogU1JGSS0xNzE6OiAgICAgICAg ICAgICAgICAgICAgVHJhbnNkdWNlcnMKICogU1JGSS0xOTc6OiAgICAgICAgICAgICAgICAg ICAgUGlwZWxpbmUgb3BlcmF0b3JzCiAqIFNSRkktMjA3OjogICAgICAgICAgICAgICAgICAg IFN0cmluZy1ub3RhdGVkIGJ5dGV2ZWN0b3JzCkBAIC02NTk2LDYgKzY1OTcsMzI1IEBAIGV4 dGVuc2lvbiBAY29kZXsud30gdmllIEBjb2Rle2d1aWxlIC0tbGFuZ3VhZ2U9d2lzcCAteCAu d30uCiBJbiBmaWxlcyB1c2luZyBXaXNwLCBAeHJlZntTUkZJLTEwNX0gKEN1cmx5IEluZml4 KSBpcyBhbHdheXMgYWN0aXZhdGVkLgogCiAKK0Bub2RlIFNSRkktMTU4CitAc3Vic2VjdGlv biBHZW5lcmF0b3JzIGFuZCBBY2N1bXVsYXRvcnMKK0BjaW5kZXggU1JGSS0xNTgKK0BjaW5k ZXggZ2VuZXJhdG9ycworQGNpbmRleCBhY2N1bXVsYXRvcnMKKworVGhpcyBzdWJzZWN0aW9u IGlzIGJhc2VkIG9uIHRoZQorQHVyZWZ7aHR0cHM6Ly9zcmZpLnNjaGVtZXJzLm9yZy9zcmZp LTE1OC9zcmZpLTE1OC5odG1sLCBzcGVjaWZpY2F0aW9uIG9mCitTUkZJLTE1OH0gYnkgU2hp cm8gS2F3YWksIEpvaG4gQ293YW4sIGFuZCBUaG9tYXMgR2lscmF5LgorCitHZW5lcmF0b3Jz IGFyZSBwcm9jZWR1cmVzIHdpdGggbm8gYXJndW1lbnRzIHRoYXQgcHJvZHVjZSBhIHNlcXVl bmNlIG9mIHZhbHVlcy4KK0V2ZXJ5IHRpbWUgYSBnZW5lcmF0b3IgaXMgY2FsbGVkLCBpdCB5 aWVsZHMgdGhlIG5leHQgdmFsdWUgaW4gdGhlIHNlcXVlbmNlLgorV2hlbiBhIGZpbml0ZSBn ZW5lcmF0b3IgaXMgZXhoYXVzdGVkLCBpdCByZXR1cm5zIGFuIGVuZC1vZi1maWxlIG9iamVj dC4KK0dlbmVyYXRvcnMgcHJvdmlkZSBsaWdodHdlaWdodCBsYXppbmVzcyB3aXRob3V0IHRo ZSBvdmVyaGVhZCBvZiBjcmVhdGluZyB0aHVua3MKK2ZvciBlYWNoIGVsZW1lbnQsIG1ha2lu ZyB0aGVtIHdlbGwtc3VpdGVkIGZvciBwcm9jZXNzaW5nIGxhcmdlIG9yIGluZmluaXRlCitz ZXF1ZW5jZXMgZWZmaWNpZW50bHkuCisKK0FjY3VtdWxhdG9ycyBhcmUgdGhlIGludmVyc2Ug b2YgZ2VuZXJhdG9yczogdGhleSBhcmUgcHJvY2VkdXJlcyBvZiBvbmUgYXJndW1lbnQKK3Ro YXQgY29uc3VtZSBhIHNlcXVlbmNlIG9mIHZhbHVlcy4gIFdoZW4gY2FsbGVkIHdpdGggYW4g ZW5kLW9mLWZpbGUgb2JqZWN0LCBhbgorYWNjdW11bGF0b3IgcmV0dXJucyBpdHMgYWNjdW11 bGF0ZWQgcmVzdWx0LgorCitTUkZJLTE1OCBjYW4gYmUgbWFkZSBhdmFpbGFibGUgd2l0aDoK KworQGV4YW1wbGUKKyh1c2UtbW9kdWxlcyAoc3JmaSBzcmZpLTE1OCkpCitAZW5kIGV4YW1w bGUKKworQG1lbnUKKyogU1JGSS0xNTggQ29uc3RydWN0b3JzOjogICAgICAgQ3JlYXRpbmcg Z2VuZXJhdG9ycworKiBTUkZJLTE1OCBPcGVyYXRpb25zOjogICAgICAgICBUcmFuc2Zvcm1p bmcgZ2VuZXJhdG9ycworKiBTUkZJLTE1OCBDb25zdW1lcnM6OiAgICAgICAgICBDb25zdW1p bmcgZ2VuZXJhdG9ycworKiBTUkZJLTE1OCBBY2N1bXVsYXRvcnM6OiAgICAgICBBY2N1bXVs YXRpbmcgdmFsdWVzCitAZW5kIG1lbnUKKworQG5vZGUgU1JGSS0xNTggQ29uc3RydWN0b3Jz CitAc3Vic3Vic2VjdGlvbiBTUkZJLTE1OCBDb25zdHJ1Y3RvcnMKKworR2VuZXJhdG9ycyBj YW4gYmUgY29uc3RydWN0ZWQgZnJvbSB2YXJpb3VzIGRhdGEgc291cmNlcyBvciBjcmVhdGVk IHdpdGgKK3NwZWNpZmljIHBhdHRlcm5zLgorCitAZGVmZm4ge1NjaGVtZSBQcm9jZWR1cmV9 IGdlbmVyYXRvciBhcmcgQGRvdHN7fQorUmV0dXJucyBhIGdlbmVyYXRvciB0aGF0IHlpZWxk cyB0aGUgZ2l2ZW4gYXJndW1lbnRzIGluIHNlcXVlbmNlLCB0aGVuCityZXR1cm5zIGFuIGVu ZC1vZi1maWxlIG9iamVjdC4KKworQGV4YW1wbGUKKyhkZWZpbmUgZyAoZ2VuZXJhdG9yIDEg MiAzKSkKKyhnKSBAcmVzdWx0e30gMQorKGcpIEByZXN1bHR7fSAyCisoZykgQHJlc3VsdHt9 IDMKKyhnKSBAcmVzdWx0e30gIzxlb2Y+CitAZW5kIGV4YW1wbGUKK0BlbmQgZGVmZm4KKwor QGRlZmZuIHtTY2hlbWUgUHJvY2VkdXJlfSBjaXJjdWxhci1nZW5lcmF0b3IgYXJnIEBkb3Rz e30KK1JldHVybnMgYSBnZW5lcmF0b3IgdGhhdCB5aWVsZHMgdGhlIGdpdmVuIGFyZ3VtZW50 cyBpbiBzZXF1ZW5jZSwgdGhlbgorcmVwZWF0cyB0aGUgc2VxdWVuY2UgaW5maW5pdGVseS4K KworQGV4YW1wbGUKKyhkZWZpbmUgZyAoY2lyY3VsYXItZ2VuZXJhdG9yIDEgMiAzKSkKKyhn ZW5lcmF0b3ItPmxpc3QgZyA3KSBAcmVzdWx0e30gKDEgMiAzIDEgMiAzIDEpCitAZW5kIGV4 YW1wbGUKK0BlbmQgZGVmZm4KKworQGRlZmZuIHtTY2hlbWUgUHJvY2VkdXJlfSBtYWtlLWlv dGEtZ2VuZXJhdG9yIFtjb3VudCBbc3RhcnQgW3N0ZXBdXV0KK1JldHVybnMgYSBnZW5lcmF0 b3IgdGhhdCB5aWVsZHMgQHZhcntjb3VudH0gbnVtYmVycyBzdGFydGluZyBmcm9tIEB2YXJ7 c3RhcnR9CisoZGVmYXVsdCAwKSB3aXRoIGFuIGluY3JlbWVudCBvZiBAdmFye3N0ZXB9IChk ZWZhdWx0IDEpLiAgSWYgQHZhcntjb3VudH0gaXMKK29taXR0ZWQsIHRoZSBnZW5lcmF0b3Ig aXMgaW5maW5pdGUuCisKK0BleGFtcGxlCisoZ2VuZXJhdG9yLT5saXN0IChtYWtlLWlvdGEt Z2VuZXJhdG9yIDUgMTAgMikpCitAcmVzdWx0e30gKDEwIDEyIDE0IDE2IDE4KQorQGVuZCBl eGFtcGxlCitAZW5kIGRlZmZuCisKK0BkZWZmbiB7U2NoZW1lIFByb2NlZHVyZX0gbWFrZS1y YW5nZS1nZW5lcmF0b3Igc3RhcnQgW2VuZCBbc3RlcF1dCitSZXR1cm5zIGEgZ2VuZXJhdG9y IHRoYXQgeWllbGRzIG51bWJlcnMgZnJvbSBAdmFye3N0YXJ0fSAoaW5jbHVzaXZlKSB0bwor QHZhcntlbmR9IChleGNsdXNpdmUpIHdpdGggYW4gaW5jcmVtZW50IG9mIEB2YXJ7c3RlcH0g KGRlZmF1bHQgMSkuICBJZgorQHZhcntlbmR9IGlzIG9taXR0ZWQsIHRoZSBnZW5lcmF0b3Ig aXMgaW5maW5pdGUuCisKK0BleGFtcGxlCisoZ2VuZXJhdG9yLT5saXN0IChtYWtlLXJhbmdl LWdlbmVyYXRvciAzIDgpKQorQHJlc3VsdHt9ICgzIDQgNSA2IDcpCisoZ2VuZXJhdG9yLT5s aXN0IChtYWtlLXJhbmdlLWdlbmVyYXRvciAzIDggMikpCitAcmVzdWx0e30gKDMgNSA3KQor KGdlbmVyYXRvci0+bGlzdCAobWFrZS1yYW5nZS1nZW5lcmF0b3IgMTApIDUpCitAcmVzdWx0 e30gKDEwIDExIDEyIDEzIDE0KQorQGVuZCBleGFtcGxlCitAZW5kIGRlZmZuCisKK0BkZWZm biB7U2NoZW1lIFByb2NlZHVyZX0gbWFrZS1jb3JvdXRpbmUtZ2VuZXJhdG9yIHByb2MKK0Ny ZWF0ZXMgYSBnZW5lcmF0b3IgZnJvbSBhIGNvcm91dGluZS4gIEB2YXJ7cHJvY30gaXMgYSBw cm9jZWR1cmUgdGhhdCB0YWtlcworb25lIGFyZ3VtZW50LCBAY29kZXt5aWVsZH0uICBXaGVu IEBjb2Rle3lpZWxkfSBpcyBjYWxsZWQgd2l0aCBhIHZhbHVlLCB0aGF0Cit2YWx1ZSBiZWNv bWVzIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgZ2VuZXJhdG9yLgorCitAZXhhbXBsZQor KGRlZmluZSBnCisgIChtYWtlLWNvcm91dGluZS1nZW5lcmF0b3IKKyAgIChsYW1iZGEgKHlp ZWxkKQorICAgICAobGV0IGxvb3AgKChpIDApKQorICAgICAgICh3aGVuICg8IGkgMykKKyAg ICAgICAgICh5aWVsZCBpKQorICAgICAgICAgKGxvb3AgKCsgaSAxKSkpKSkpKQorKGdlbmVy YXRvci0+bGlzdCBnKSBAcmVzdWx0e30gKDAgMSAyKQorQGVuZCBleGFtcGxlCitAZW5kIGRl ZmZuCisKK0BkZWZmbiB7U2NoZW1lIFByb2NlZHVyZX0gbGlzdC0+Z2VuZXJhdG9yIGxzdAor QGRlZmZueCB7U2NoZW1lIFByb2NlZHVyZX0gdmVjdG9yLT5nZW5lcmF0b3IgdmVjCitAZGVm Zm54IHtTY2hlbWUgUHJvY2VkdXJlfSByZXZlcnNlLXZlY3Rvci0+Z2VuZXJhdG9yIHZlYwor QGRlZmZueCB7U2NoZW1lIFByb2NlZHVyZX0gc3RyaW5nLT5nZW5lcmF0b3Igc3RyCitAZGVm Zm54IHtTY2hlbWUgUHJvY2VkdXJlfSBieXRldmVjdG9yLT5nZW5lcmF0b3IgYnYKK1JldHVy bnMgYSBnZW5lcmF0b3IgdGhhdCB5aWVsZHMgdGhlIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBk YXRhIHN0cnVjdHVyZQoraW4gc2VxdWVuY2UuICBAY29kZXtyZXZlcnNlLXZlY3Rvci0+Z2Vu ZXJhdG9yfSB5aWVsZHMgdmVjdG9yIGVsZW1lbnRzIGluCityZXZlcnNlIG9yZGVyLgorQGVu ZCBkZWZmbgorCitAbm9kZSBTUkZJLTE1OCBPcGVyYXRpb25zCitAc3Vic3Vic2VjdGlvbiBT UkZJLTE1OCBPcGVyYXRpb25zCisKK1RoZXNlIHByb2NlZHVyZXMgdHJhbnNmb3JtIGdlbmVy YXRvcnMgaW50byBuZXcgZ2VuZXJhdG9ycy4KKworQGRlZmZuIHtTY2hlbWUgUHJvY2VkdXJl fSBnY29ucyogaXRlbSBAZG90c3t9IGdlbgorUmV0dXJucyBhIGdlbmVyYXRvciB0aGF0IHlp ZWxkcyB0aGUgZ2l2ZW4gQHZhcntpdGVtfXMsIHRoZW4geWllbGRzIHZhbHVlcworZnJvbSBA dmFye2dlbn0uCisKK0BleGFtcGxlCisoZ2VuZXJhdG9yLT5saXN0IChnY29ucyogJ2EgJ2Ig KGdlbmVyYXRvciAxIDIgMykpKQorQHJlc3VsdHt9IChhIGIgMSAyIDMpCitAZW5kIGV4YW1w bGUKK0BlbmQgZGVmZm4KKworQGRlZmZuIHtTY2hlbWUgUHJvY2VkdXJlfSBnYXBwZW5kIGdl biBAZG90c3t9CitSZXR1cm5zIGEgZ2VuZXJhdG9yIHRoYXQgeWllbGRzIHZhbHVlcyBmcm9t IHRoZSBmaXJzdCBAdmFye2dlbn0sIHRoZW4gdGhlCitzZWNvbmQsIGFuZCBzbyBvbi4KKwor QGV4YW1wbGUKKyhnZW5lcmF0b3ItPmxpc3QgKGdhcHBlbmQgKGdlbmVyYXRvciAxIDIpIChn ZW5lcmF0b3IgMyA0KSkpCitAcmVzdWx0e30gKDEgMiAzIDQpCitAZW5kIGV4YW1wbGUKK0Bl bmQgZGVmZm4KKworQGRlZmZuIHtTY2hlbWUgUHJvY2VkdXJlfSBnZmlsdGVyIHByZWQgZ2Vu CitSZXR1cm5zIGEgZ2VuZXJhdG9yIHRoYXQgeWllbGRzIG9ubHkgdGhlIHZhbHVlcyBmcm9t IEB2YXJ7Z2VufSBmb3Igd2hpY2gKK0B2YXJ7cHJlZH0gcmV0dXJucyB0cnVlLgorCitAZXhh bXBsZQorKGdlbmVyYXRvci0+bGlzdCAoZ2ZpbHRlciBvZGQ/IChtYWtlLXJhbmdlLWdlbmVy YXRvciAxIDEwKSkpCitAcmVzdWx0e30gKDEgMyA1IDcgOSkKK0BlbmQgZXhhbXBsZQorQGVu ZCBkZWZmbgorCitAZGVmZm4ge1NjaGVtZSBQcm9jZWR1cmV9IGdyZW1vdmUgcHJlZCBnZW4K K1JldHVybnMgYSBnZW5lcmF0b3IgdGhhdCB5aWVsZHMgb25seSB0aGUgdmFsdWVzIGZyb20g QHZhcntnZW59IGZvciB3aGljaAorQHZhcntwcmVkfSByZXR1cm5zIGZhbHNlLgorQGVuZCBk ZWZmbgorCitAZGVmZm4ge1NjaGVtZSBQcm9jZWR1cmV9IGdtYXAgcHJvYyBnZW4gQGRvdHN7 fQorUmV0dXJucyBhIGdlbmVyYXRvciB0aGF0IGFwcGxpZXMgQHZhcntwcm9jfSB0byB0aGUg dmFsdWVzIGZyb20gdGhlIGdpdmVuCitnZW5lcmF0b3JzIGFuZCB5aWVsZHMgdGhlIHJlc3Vs dHMuCisKK0BleGFtcGxlCisoZ2VuZXJhdG9yLT5saXN0IChnbWFwIChsYW1iZGEgKHgpICgq IHggMikpIChnZW5lcmF0b3IgMSAyIDMpKSkKK0ByZXN1bHR7fSAoMiA0IDYpCitAZW5kIGV4 YW1wbGUKK0BlbmQgZGVmZm4KKworQGRlZmZuIHtTY2hlbWUgUHJvY2VkdXJlfSBndGFrZSBn ZW4gayBbcGFkZGluZ10KK1JldHVybnMgYSBnZW5lcmF0b3IgdGhhdCB5aWVsZHMgdGhlIGZp cnN0IEB2YXJ7a30gdmFsdWVzIGZyb20gQHZhcntnZW59LgorSWYgQHZhcntnZW59IGlzIGV4 aGF1c3RlZCBiZWZvcmUgQHZhcntrfSB2YWx1ZXMgYXJlIHByb2R1Y2VkLCBhbmQKK0B2YXJ7 cGFkZGluZ30gaXMgcHJvdmlkZWQsIHRoZSByZW1haW5pbmcgdmFsdWVzIGFyZSBAdmFye3Bh ZGRpbmd9LgorCitAZXhhbXBsZQorKGdlbmVyYXRvci0+bGlzdCAoZ3Rha2UgKGdlbmVyYXRv ciAxIDIgMyA0IDUpIDMpKQorQHJlc3VsdHt9ICgxIDIgMykKKyhnZW5lcmF0b3ItPmxpc3Qg KGd0YWtlIChnZW5lcmF0b3IgMSAyKSA0IDApKQorQHJlc3VsdHt9ICgxIDIgMCAwKQorQGVu ZCBleGFtcGxlCitAZW5kIGRlZmZuCisKK0BkZWZmbiB7U2NoZW1lIFByb2NlZHVyZX0gZ2Ry b3AgZ2VuIGsKK1JldHVybnMgYSBnZW5lcmF0b3IgdGhhdCBza2lwcyB0aGUgZmlyc3QgQHZh cntrfSB2YWx1ZXMgZnJvbSBAdmFye2dlbn0sCit0aGVuIHlpZWxkcyB0aGUgcmVtYWluaW5n IHZhbHVlcy4KK0BlbmQgZGVmZm4KKworQGRlZmZuIHtTY2hlbWUgUHJvY2VkdXJlfSBndGFr ZS13aGlsZSBwcmVkIGdlbgorQGRlZmZueCB7U2NoZW1lIFByb2NlZHVyZX0gZ2Ryb3Atd2hp bGUgcHJlZCBnZW4KK0Bjb2Rle2d0YWtlLXdoaWxlfSByZXR1cm5zIGEgZ2VuZXJhdG9yIHRo YXQgeWllbGRzIHZhbHVlcyBmcm9tIEB2YXJ7Z2VufQorYXMgbG9uZyBhcyBAdmFye3ByZWR9 IHJldHVybnMgdHJ1ZS4gIEBjb2Rle2dkcm9wLXdoaWxlfSByZXR1cm5zIGEgZ2VuZXJhdG9y Cit0aGF0IHNraXBzIHZhbHVlcyBmcm9tIEB2YXJ7Z2VufSBhcyBsb25nIGFzIEB2YXJ7cHJl ZH0gcmV0dXJucyB0cnVlLCB0aGVuCit5aWVsZHMgdGhlIHJlbWFpbmluZyB2YWx1ZXMuCitA ZW5kIGRlZmZuCisKK0BkZWZmbiB7U2NoZW1lIFByb2NlZHVyZX0gZ2ZsYXR0ZW4gZ2VuCitS ZXR1cm5zIGEgZ2VuZXJhdG9yIHRoYXQgeWllbGRzIHRoZSBlbGVtZW50cyBvZiB0aGUgbGlz dHMgcHJvZHVjZWQgYnkKK0B2YXJ7Z2VufS4KKworQGV4YW1wbGUKKyhnZW5lcmF0b3ItPmxp c3QgKGdmbGF0dGVuIChnZW5lcmF0b3IgJygxIDIpICcoMyA0KSkpKQorQHJlc3VsdHt9ICgx IDIgMyA0KQorQGVuZCBleGFtcGxlCitAZW5kIGRlZmZuCisKK0BkZWZmbiB7U2NoZW1lIFBy b2NlZHVyZX0gZ21lcmdlIGxlc3MtdGhhbiBnZW4gQGRvdHN7fQorUmV0dXJucyBhIGdlbmVy YXRvciB0aGF0IG1lcmdlcyB2YWx1ZXMgZnJvbSB0aGUgZ2l2ZW4gZ2VuZXJhdG9ycywgd2hp Y2gKK211c3QgeWllbGQgdmFsdWVzIGluIG5vbi1kZWNyZWFzaW5nIG9yZGVyIGFjY29yZGlu ZyB0byBAdmFye2xlc3MtdGhhbn0uCitUaGUgb3V0cHV0IGlzIGFsc28gaW4gbm9uLWRlY3Jl YXNpbmcgb3JkZXIuCisKK0BleGFtcGxlCisoZ2VuZXJhdG9yLT5saXN0IChnbWVyZ2UgPCAo Z2VuZXJhdG9yIDEgMyA1KSAoZ2VuZXJhdG9yIDIgNCA2KSkpCitAcmVzdWx0e30gKDEgMiAz IDQgNSA2KQorQGVuZCBleGFtcGxlCitAZW5kIGRlZmZuCisKK0Bub2RlIFNSRkktMTU4IENv bnN1bWVycworQHN1YnN1YnNlY3Rpb24gU1JGSS0xNTggQ29uc3VtZXJzCisKK1RoZXNlIHBy b2NlZHVyZXMgY29uc3VtZSB2YWx1ZXMgZnJvbSBnZW5lcmF0b3JzLgorCitAZGVmZm4ge1Nj aGVtZSBQcm9jZWR1cmV9IGdlbmVyYXRvci0+bGlzdCBnZW5lcmF0b3IgW2tdCitSZWFkcyBp dGVtcyBmcm9tIEB2YXJ7Z2VuZXJhdG9yfSBhbmQgcmV0dXJucyBhIGxpc3Qgb2YgdGhlbS4g IElmIEB2YXJ7a30KK2lzIGdpdmVuLCByZWFkcyBhdCBtb3N0IEB2YXJ7a30gaXRlbXMuCisK K0BleGFtcGxlCisoZ2VuZXJhdG9yLT5saXN0IChnZW5lcmF0b3IgMSAyIDMpKQorQHJlc3Vs dHt9ICgxIDIgMykKKyhnZW5lcmF0b3ItPmxpc3QgKG1ha2UtcmFuZ2UtZ2VuZXJhdG9yIDEp IDUpCitAcmVzdWx0e30gKDEgMiAzIDQgNSkKK0BlbmQgZXhhbXBsZQorQGVuZCBkZWZmbgor CitAZGVmZm4ge1NjaGVtZSBQcm9jZWR1cmV9IGdlbmVyYXRvci0+cmV2ZXJzZS1saXN0IGdl bmVyYXRvciBba10KK0xpa2UgQGNvZGV7Z2VuZXJhdG9yLT5saXN0fSwgYnV0IHJldHVybnMg dGhlIGl0ZW1zIGluIHJldmVyc2Ugb3JkZXIuCitAZW5kIGRlZmZuCisKK0BkZWZmbiB7U2No ZW1lIFByb2NlZHVyZX0gZ2VuZXJhdG9yLT52ZWN0b3IgZ2VuZXJhdG9yIFtrXQorQGRlZmZu eCB7U2NoZW1lIFByb2NlZHVyZX0gZ2VuZXJhdG9yLT5zdHJpbmcgZ2VuZXJhdG9yIFtrXQor UmVhZHMgaXRlbXMgZnJvbSBAdmFye2dlbmVyYXRvcn0gYW5kIHJldHVybnMgYSB2ZWN0b3Ig b3Igc3RyaW5nIG9mIHRoZW0uCitAZW5kIGRlZmZuCisKK0BkZWZmbiB7U2NoZW1lIFByb2Nl ZHVyZX0gZ2VuZXJhdG9yLWZvbGQgcHJvYyBzZWVkIGdlbiBAZG90c3t9CitBcHBsaWVzIEB2 YXJ7cHJvY30gdG8gdGhlIHZhbHVlcyBmcm9tIHRoZSBnZW5lcmF0b3JzIGFuZCBhbiBhY2N1 bXVsYXRvciwKK3N0YXJ0aW5nIHdpdGggQHZhcntzZWVkfS4gIFJldHVybnMgdGhlIGZpbmFs IGFjY3VtdWxhdG9yIHZhbHVlLgorCitAZXhhbXBsZQorKGdlbmVyYXRvci1mb2xkICsgMCAo Z2VuZXJhdG9yIDEgMiAzIDQgNSkpCitAcmVzdWx0e30gMTUKK0BlbmQgZXhhbXBsZQorQGVu ZCBkZWZmbgorCitAZGVmZm4ge1NjaGVtZSBQcm9jZWR1cmV9IGdlbmVyYXRvci1mb3ItZWFj aCBwcm9jIGdlbiBAZG90c3t9CitBcHBsaWVzIEB2YXJ7cHJvY30gdG8gdGhlIHZhbHVlcyBm cm9tIHRoZSBnZW5lcmF0b3JzIGZvciBzaWRlIGVmZmVjdHMuCitSZXR1cm5zIGFuIHVuc3Bl Y2lmaWVkIHZhbHVlLgorQGVuZCBkZWZmbgorCitAZGVmZm4ge1NjaGVtZSBQcm9jZWR1cmV9 IGdlbmVyYXRvci1maW5kIHByZWQgZ2VuCitSZXR1cm5zIHRoZSBmaXJzdCB2YWx1ZSBmcm9t IEB2YXJ7Z2VufSBmb3Igd2hpY2ggQHZhcntwcmVkfSByZXR1cm5zIHRydWUsCitvciBAY29k ZXsjZn0gaWYgbm8gc3VjaCB2YWx1ZSBpcyBmb3VuZC4KK0BlbmQgZGVmZm4KKworQGRlZmZu IHtTY2hlbWUgUHJvY2VkdXJlfSBnZW5lcmF0b3ItY291bnQgcHJlZCBnZW4KK1JldHVybnMg dGhlIG51bWJlciBvZiB2YWx1ZXMgZnJvbSBAdmFye2dlbn0gZm9yIHdoaWNoIEB2YXJ7cHJl ZH0gcmV0dXJucwordHJ1ZS4KK0BlbmQgZGVmZm4KKworQGRlZmZuIHtTY2hlbWUgUHJvY2Vk dXJlfSBnZW5lcmF0b3ItYW55IHByZWQgZ2VuCitAZGVmZm54IHtTY2hlbWUgUHJvY2VkdXJl fSBnZW5lcmF0b3ItZXZlcnkgcHJlZCBnZW4KK0Bjb2Rle2dlbmVyYXRvci1hbnl9IHJldHVy bnMgdHJ1ZSBpZiBAdmFye3ByZWR9IHJldHVybnMgdHJ1ZSBmb3IgYW55IHZhbHVlCitmcm9t IEB2YXJ7Z2VufS4gIEBjb2Rle2dlbmVyYXRvci1ldmVyeX0gcmV0dXJucyB0cnVlIGlmIEB2 YXJ7cHJlZH0gcmV0dXJucwordHJ1ZSBmb3IgYWxsIHZhbHVlcyBmcm9tIEB2YXJ7Z2VufS4K K0BlbmQgZGVmZm4KKworQG5vZGUgU1JGSS0xNTggQWNjdW11bGF0b3JzCitAc3Vic3Vic2Vj dGlvbiBTUkZJLTE1OCBBY2N1bXVsYXRvcnMKKworQWNjdW11bGF0b3JzIGNvbnN1bWUgdmFs dWVzIGFuZCByZXR1cm4gYSByZXN1bHQgd2hlbiBwYXNzZWQgYW4gZW5kLW9mLWZpbGUKK29i amVjdC4KKworQGRlZmZuIHtTY2hlbWUgUHJvY2VkdXJlfSBsaXN0LWFjY3VtdWxhdG9yCitS ZXR1cm5zIGFuIGFjY3VtdWxhdG9yIHRoYXQgY29sbGVjdHMgdmFsdWVzIGludG8gYSBsaXN0 LgorCitAZXhhbXBsZQorKGRlZmluZSBhY2MgKGxpc3QtYWNjdW11bGF0b3IpKQorKGFjYyAx KQorKGFjYyAyKQorKGFjYyAzKQorKGFjYyAoZW9mLW9iamVjdCkpIEByZXN1bHR7fSAoMSAy IDMpCitAZW5kIGV4YW1wbGUKK0BlbmQgZGVmZm4KKworQGRlZmZuIHtTY2hlbWUgUHJvY2Vk dXJlfSByZXZlcnNlLWxpc3QtYWNjdW11bGF0b3IKK1JldHVybnMgYW4gYWNjdW11bGF0b3Ig dGhhdCBjb2xsZWN0cyB2YWx1ZXMgaW50byBhIGxpc3QgaW4gcmV2ZXJzZSBvcmRlci4KK0Bl bmQgZGVmZm4KKworQGRlZmZuIHtTY2hlbWUgUHJvY2VkdXJlfSB2ZWN0b3ItYWNjdW11bGF0 b3IKK0BkZWZmbngge1NjaGVtZSBQcm9jZWR1cmV9IHN0cmluZy1hY2N1bXVsYXRvcgorQGRl ZmZueCB7U2NoZW1lIFByb2NlZHVyZX0gYnl0ZXZlY3Rvci1hY2N1bXVsYXRvcgorUmV0dXJu cyBhbiBhY2N1bXVsYXRvciB0aGF0IGNvbGxlY3RzIHZhbHVlcyBpbnRvIGEgdmVjdG9yLCBz dHJpbmcsIG9yCitieXRldmVjdG9yLgorQGVuZCBkZWZmbgorCitAZGVmZm4ge1NjaGVtZSBQ cm9jZWR1cmV9IGNvdW50LWFjY3VtdWxhdG9yCitSZXR1cm5zIGFuIGFjY3VtdWxhdG9yIHRo YXQgY291bnRzIHRoZSBudW1iZXIgb2YgdmFsdWVzIGl0IHJlY2VpdmVzLgorQGVuZCBkZWZm bgorCitAZGVmZm4ge1NjaGVtZSBQcm9jZWR1cmV9IHN1bS1hY2N1bXVsYXRvcgorQGRlZmZu eCB7U2NoZW1lIFByb2NlZHVyZX0gcHJvZHVjdC1hY2N1bXVsYXRvcgorUmV0dXJucyBhbiBh Y2N1bXVsYXRvciB0aGF0IGNvbXB1dGVzIHRoZSBzdW0gb3IgcHJvZHVjdCBvZiB0aGUgdmFs dWVzIGl0CityZWNlaXZlcy4KKworQGV4YW1wbGUKKyhkZWZpbmUgYWNjIChzdW0tYWNjdW11 bGF0b3IpKQorKGFjYyAxKQorKGFjYyAyKQorKGFjYyAzKQorKGFjYyAoZW9mLW9iamVjdCkp IEByZXN1bHR7fSA2CitAZW5kIGV4YW1wbGUKK0BlbmQgZGVmZm4KKworCiBAbm9kZSBTUkZJ LTE3MQogQHN1YnNlY3Rpb24gVHJhbnNkdWNlcnMKIEBjaW5kZXggU1JGSS0xNzEKZGlmZiAt LWdpdCBhL21vZHVsZS9zcmZpL3NyZmktMTU4LnNjbSBiL21vZHVsZS9zcmZpL3NyZmktMTU4 LnNjbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAuLjZiZTE3YTA1Ywot LS0gL2Rldi9udWxsCisrKyBiL21vZHVsZS9zcmZpL3NyZmktMTU4LnNjbQpAQCAtMCwwICsx LDEyMSBAQAorOzsgc3JmaS0xNTguc2NtIC0tLSBHZW5lcmF0b3JzIGFuZCBBY2N1bXVsYXRv cnMKKworOzsgCUNvcHlyaWdodCAoQykgMjAyNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24s IEluYy4KKzs7Cis7OyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy ZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7OyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9m IHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7OyBMaWNlbnNlIGFzIHB1Ymxpc2hl ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzs7IHZlcnNpb24g MyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv bi4KKzs7Cis7OyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh dCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzs7IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0 aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7OyBNRVJDSEFOVEFCSUxJVFkg b3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOzsg TGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzs7Cis7 OyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdl bmVyYWwgUHVibGljCis7OyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBu b3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7OyBGb3VuZGF0aW9uLCBJbmMuLCA1 MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEg VVNBCisKKzs7OyBSZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZnJvbSBTUkZJIDE1OAorOzs7 IENvcHlyaWdodCAoYykgMjAxNSwgMjAxNyBTaGlybyBLYXdhaSwgSm9obiBDb3dhbiwgVGhv bWFzIEdpbHJheQorOzs7IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2Yg Y2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKzs7OyBvZiB0aGlzIHNv ZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdh cmUiKSwgdG8gZGVhbAorOzs7IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9u LCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKzs7OyB0byB1c2Us IGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2Us IGFuZC9vciBzZWxsCis7OzsgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1p dCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCis7OzsgZnVybmlzaGVkIHRvIGRv IHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKzs7OworOzs7IFRo ZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNo YWxsIGJlIGluY2x1ZGVkIGluCis7OzsgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0 aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKzs7OyBDb21tZW50YXJ5OgorCis7OyBUaGlzIGlz IGFuIGltcGxlbWVudGF0aW9uIG9mIFNSRkktMTU4IChHZW5lcmF0b3JzIGFuZCBBY2N1bXVs YXRvcnMpLgorOzsKKzs7IEdlbmVyYXRvcnMgYXJlIHByb2NlZHVyZXMgdGhhdCBjYW4gYmUg Y2FsbGVkIHJlcGVhdGVkbHkgdG8gcHJvZHVjZSBhCis7OyBzZXF1ZW5jZSBvZiB2YWx1ZXMu IEFjY3VtdWxhdG9ycyBhcmUgdGhlIGludmVyc2U6IHByb2NlZHVyZXMgdGhhdCBjYW4KKzs7 IGJlIGNhbGxlZCByZXBlYXRlZGx5IHRvIGNvbnN1bWUgYSBzZXF1ZW5jZSBvZiB2YWx1ZXMu Cis7OworOzsgU2VlIHRoZSBTUkZJIDE1OCBzcGVjaWZpY2F0aW9uIGF0IGh0dHBzOi8vc3Jm aS5zY2hlbWVycy5vcmcvc3JmaS0xNTgvCis7OyBmb3IgZGV0YWlsZWQgZG9jdW1lbnRhdGlv bi4KKworOzs7IENvZGU6CisKKyhkZWZpbmUtbW9kdWxlIChzcmZpIHNyZmktMTU4KQorICAj OnVzZS1tb2R1bGUgKHJucnMgaW8gcG9ydHMpCisgICM6dXNlLW1vZHVsZSAocm5ycyBieXRl dmVjdG9ycykKKyAgIzp1c2UtbW9kdWxlIChzcmZpIHNyZmktMTEpCisgICM6ZXhwb3J0ICgK Kzs7OyBHZW5lcmF0b3JzCisgZ2VuZXJhdG9yCisgY2lyY3VsYXItZ2VuZXJhdG9yCisgbWFr ZS1pb3RhLWdlbmVyYXRvcgorIG1ha2UtcmFuZ2UtZ2VuZXJhdG9yCisgbWFrZS1jb3JvdXRp bmUtZ2VuZXJhdG9yCisgbGlzdC0+Z2VuZXJhdG9yCisgdmVjdG9yLT5nZW5lcmF0b3IKKyBy ZXZlcnNlLXZlY3Rvci0+Z2VuZXJhdG9yCisgc3RyaW5nLT5nZW5lcmF0b3IKKyBieXRldmVj dG9yLT5nZW5lcmF0b3IKKyBtYWtlLWZvci1lYWNoLWdlbmVyYXRvcgorIG1ha2UtdW5mb2xk LWdlbmVyYXRvcgorCis7OzsgR2VuZXJhdG9yIG9wZXJhdGlvbnMKKyBnY29ucyoKKyBnYXBw ZW5kCisgZ2NvbWJpbmUKKyBnZmlsdGVyCisgZ3JlbW92ZQorIGd0YWtlCisgZ2Ryb3AKKyBn dGFrZS13aGlsZQorIGdkcm9wLXdoaWxlCisgZ2ZsYXR0ZW4KKyBnZ3JvdXAKKyBnbWVyZ2UK KyBnbWFwCisgZ3N0YXRlLWZpbHRlcgorIGdkZWxldGUKKyBnZGVsZXRlLW5laWdoYm9yLWR1 cHMKKyBnaW5kZXgKKyBnc2VsZWN0CisKKzs7OyBDb25zdW1pbmcgZ2VuZXJhdG9ycworIGdl bmVyYXRvci0+bGlzdAorIGdlbmVyYXRvci0+cmV2ZXJzZS1saXN0CisgZ2VuZXJhdG9yLT52 ZWN0b3IKKyBnZW5lcmF0b3ItPnZlY3RvciEKKyBnZW5lcmF0b3ItPnN0cmluZworIGdlbmVy YXRvci1mb2xkCisgZ2VuZXJhdG9yLW1hcC0+bGlzdAorIGdlbmVyYXRvci1mb3ItZWFjaAor IGdlbmVyYXRvci1maW5kCisgZ2VuZXJhdG9yLWNvdW50CisgZ2VuZXJhdG9yLWFueQorIGdl bmVyYXRvci1ldmVyeQorIGdlbmVyYXRvci11bmZvbGQKKworOzs7IEFjY3VtdWxhdG9ycwor IG1ha2UtYWNjdW11bGF0b3IKKyBjb3VudC1hY2N1bXVsYXRvcgorIGxpc3QtYWNjdW11bGF0 b3IKKyByZXZlcnNlLWxpc3QtYWNjdW11bGF0b3IKKyB2ZWN0b3ItYWNjdW11bGF0b3IKKyBy ZXZlcnNlLXZlY3Rvci1hY2N1bXVsYXRvcgorIHZlY3Rvci1hY2N1bXVsYXRvciEKKyBzdHJp bmctYWNjdW11bGF0b3IKKyBieXRldmVjdG9yLWFjY3VtdWxhdG9yCisgYnl0ZXZlY3Rvci1h Y2N1bXVsYXRvciEKKyBzdW0tYWNjdW11bGF0b3IKKyBwcm9kdWN0LWFjY3VtdWxhdG9yCisg KSkKKworKGNvbmQtZXhwYW5kLXByb3ZpZGUgKGN1cnJlbnQtbW9kdWxlKSAnKHNyZmktMTU4 KSkKKworOzsgR3VpbGUgY29tcGF0aWJpbGl0eSBzaGltcyBmb3IgUjdSUyBmdW5jdGlvbnMK KworKGRlZmluZSAodHJ1bmNhdGUvIG4xIG4yKQorICAodmFsdWVzIChxdW90aWVudCBuMSBu MikgKHJlbWFpbmRlciBuMSBuMikpKQorCis7OyBMb2FkIHRoZSByZWZlcmVuY2UgaW1wbGVt ZW50YXRpb24KKyhpbmNsdWRlLWZyb20tcGF0aCAic3JmaS9zcmZpLTE1OC9pbXBsLnNjbSIp CmRpZmYgLS1naXQgYS9tb2R1bGUvc3JmaS9zcmZpLTE1OC9pbXBsLnNjbSBiL21vZHVsZS9z cmZpL3NyZmktMTU4L2ltcGwuc2NtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw MDAwMC4uMjE4NTRlMzZkCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlL3NyZmkvc3JmaS0x NTgvaW1wbC5zY20KQEAgLTAsMCArMSw1ODAgQEAKKzs7IENoaWJpIFNjaGVtZSB2ZXJzaW9u IG9mIGFueQorCisoZGVmaW5lIChhbnkgcHJlZCBscykKKyAgKGlmIChudWxsPyAoY2RyIGxz KSkKKyAgICAocHJlZCAoY2FyIGxzKSkKKyAgICAoKGxhbWJkYSAoeCkgKGlmIHggeCAoYW55 IHByZWQgKGNkciBscykpKSkgKHByZWQgKGNhciBscykpKSkpCisKKzs7IGxpc3QtPmJ5dGV2 ZWN0b3IKKyhkZWZpbmUgKGxpc3QtPmJ5dGV2ZWN0b3IgbGlzdCkKKyAgKGxldCAoKHZlYyAo bWFrZS1ieXRldmVjdG9yIChsZW5ndGggbGlzdCkgMCkpKQorICAgIChsZXQgbG9vcCAoKGkg MCkgKGxpc3QgbGlzdCkpCisgICAgICAoaWYgKG51bGw/IGxpc3QpCisgICAgICAgIHZlYwor ICAgICAgICAoYmVnaW4KKyAgICAgICAgICAoYnl0ZXZlY3Rvci11OC1zZXQhIHZlYyBpIChj YXIgbGlzdCkpCisgICAgICAgICAgKGxvb3AgKCsgaSAxKSAoY2RyIGxpc3QpKSkpKSkpCisK KworOzsgZ2VuZXJhdG9yCisoZGVmaW5lIChnZW5lcmF0b3IgLiBhcmdzKQorICAobGFtYmRh ICgpIChpZiAobnVsbD8gYXJncykKKyAgICAgICAgICAgICAgIChlb2Ytb2JqZWN0KQorICAg ICAgICAgICAgICAgKGxldCAoKG5leHQgKGNhciBhcmdzKSkpCisgICAgICAgICAgICAgICAg KHNldCEgYXJncyAoY2RyIGFyZ3MpKQorICAgICAgICAgICAgICAgIG5leHQpKSkpCisKKzs7 IGNpcmN1bGFyLWdlbmVyYXRvcgorKGRlZmluZSAoY2lyY3VsYXItZ2VuZXJhdG9yIC4gYXJn cykKKyAgKGxldCAoKGJhc2UtYXJncyBhcmdzKSkKKyAgICAobGFtYmRhICgpCisgICAgICAo d2hlbiAobnVsbD8gYXJncykKKyAgICAgICAgKHNldCEgYXJncyBiYXNlLWFyZ3MpKQorICAg ICAgICAgIChsZXQgKChuZXh0IChjYXIgYXJncykpKQorICAgICAgICAgICAgICAgIChzZXQh IGFyZ3MgKGNkciBhcmdzKSkKKyAgICAgICAgICAgICAgICBuZXh0KSkpKQorCisKKzs7IG1h a2UtaW90YS1nZW5lcmF0b3IKKyhkZWZpbmUgbWFrZS1pb3RhLWdlbmVyYXRvcgorICAoY2Fz ZS1sYW1iZGEgKChjb3VudCkgKG1ha2UtaW90YS1nZW5lcmF0b3IgY291bnQgMCAxKSkKKyAg ICAgICAgICAgICAgICgoY291bnQgc3RhcnQpIChtYWtlLWlvdGEtZ2VuZXJhdG9yIGNvdW50 IHN0YXJ0IDEpKQorICAgICAgICAgICAgICAgKChjb3VudCBzdGFydCBzdGVwKSAobWFrZS1p b3RhIGNvdW50IHN0YXJ0IHN0ZXApKSkpCisKKzs7IG1ha2UtaW90YQorKGRlZmluZSAobWFr ZS1pb3RhIGNvdW50IHN0YXJ0IHN0ZXApCisgIChsYW1iZGEgKCkKKyAgICAoY29uZAorICAg ICAgKCg8PSBjb3VudCAwKQorICAgICAgIChlb2Ytb2JqZWN0KSkKKyAgICAgIChlbHNlCisg ICAgICAgIChsZXQgKChyZXN1bHQgc3RhcnQpKQorICAgICAgICAgKHNldCEgY291bnQgKC0g Y291bnQgMSkpCisgICAgICAgICAoc2V0ISBzdGFydCAoKyBzdGFydCBzdGVwKSkKKyAgICAg ICAgIHJlc3VsdCkpKSkpCisKKworOzsgbWFrZS1yYW5nZS1nZW5lcmF0b3IKKyhkZWZpbmUg bWFrZS1yYW5nZS1nZW5lcmF0b3IKKyAgKGNhc2UtbGFtYmRhICgoc3RhcnQgZW5kKSAobWFr ZS1yYW5nZS1nZW5lcmF0b3Igc3RhcnQgZW5kIDEpKQorICAgICAgICAgICAgICAgKChzdGFy dCkgKG1ha2UtaW5maW5pdGUtcmFuZ2UtZ2VuZXJhdG9yIHN0YXJ0KSkKKyAgICAgICAgICAg ICAgICgoc3RhcnQgZW5kIHN0ZXApCisgICAgICAgICAgICAgICAgKHNldCEgc3RhcnQgKC0g KCsgc3RhcnQgc3RlcCkgc3RlcCkpCisgICAgICAgICAgICAgICAgKGxhbWJkYSAoKSAoaWYg KDwgc3RhcnQgZW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGV0ICgodiBz dGFydCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V0ISBzdGFydCAoKyBz dGFydCBzdGVwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYpCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIChlb2Ytb2JqZWN0KSkpKSkpCisKKyhkZWZpbmUgKG1h a2UtaW5maW5pdGUtcmFuZ2UtZ2VuZXJhdG9yIHN0YXJ0KQorICAobGFtYmRhICgpCisgICAg KGxldCAoKHJlc3VsdCBzdGFydCkpCisgICAgIChzZXQhIHN0YXJ0ICgrIHN0YXJ0IDEpKQor ICAgICByZXN1bHQpKSkKKworCisKKzs7IG1ha2UtY29yb3V0aW5lLWdlbmVyYXRvcgorKGRl ZmluZSAobWFrZS1jb3JvdXRpbmUtZ2VuZXJhdG9yIHByb2MpCisgIChkZWZpbmUgcmV0dXJu ICNmKQorICAoZGVmaW5lIHJlc3VtZSAjZikKKyAgKGRlZmluZSB5aWVsZCAobGFtYmRhICh2 KSAoY2FsbC9jYyAobGFtYmRhIChyKSAoc2V0ISByZXN1bWUgcikgKHJldHVybiB2KSkpKSkK KyAgKGxhbWJkYSAoKSAoY2FsbC9jYyAobGFtYmRhIChjYykgKHNldCEgcmV0dXJuIGNjKQor ICAgICAgICAgICAgICAgICAgICAgICAgKGlmIHJlc3VtZQorICAgICAgICAgICAgICAgICAg ICAgICAgICAocmVzdW1lIChpZiAjZiAjZikpICA7IHZvaWQ/IG9yIHlpZWxkIGFnYWluPwor ICAgICAgICAgICAgICAgICAgICAgICAgICAoYmVnaW4gKHByb2MgeWllbGQpCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V0ISByZXN1bWUgKGxhbWJkYSAodikgKHJl dHVybiAoZW9mLW9iamVjdCkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IChyZXR1cm4gKGVvZi1vYmplY3QpKSkpKSkpKQorCisKKzs7IGxpc3QtPmdlbmVyYXRvcgor KGRlZmluZSAobGlzdC0+Z2VuZXJhdG9yIGxzdCkKKyAgKGxhbWJkYSAoKSAoaWYgKG51bGw/ IGxzdCkKKyAgICAgICAgICAgICAgIChlb2Ytb2JqZWN0KQorICAgICAgICAgICAgICAgKGxl dCAoKG5leHQgKGNhciBsc3QpKSkKKyAgICAgICAgICAgICAgICAoc2V0ISBsc3QgKGNkciBs c3QpKQorICAgICAgICAgICAgICAgIG5leHQpKSkpCisKKworOzsgdmVjdG9yLT5nZW5lcmF0 b3IKKyhkZWZpbmUgdmVjdG9yLT5nZW5lcmF0b3IKKyAgKGNhc2UtbGFtYmRhICgodmVjKSAo dmVjdG9yLT5nZW5lcmF0b3IgdmVjIDAgKHZlY3Rvci1sZW5ndGggdmVjKSkpCisgICAgICAg ICAgICAgICAoKHZlYyBzdGFydCkgKHZlY3Rvci0+Z2VuZXJhdG9yIHZlYyBzdGFydCAodmVj dG9yLWxlbmd0aCB2ZWMpKSkKKyAgICAgICAgICAgICAgICgodmVjIHN0YXJ0IGVuZCkKKyAg ICAgICAgICAgICAgICAobGFtYmRhICgpIChpZiAoPj0gc3RhcnQgZW5kKQorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAoZW9mLW9iamVjdCkKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKGxldCAoKG5leHQgKHZlY3Rvci1yZWYgdmVjIHN0YXJ0KSkpCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAoc2V0ISBzdGFydCAoKyBzdGFydCAxKSkKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQpKSkpKSkKKworCis7OyByZXZlcnNlLXZl Y3Rvci0+Z2VuZXJhdG9yCisoZGVmaW5lIHJldmVyc2UtdmVjdG9yLT5nZW5lcmF0b3IKKyAg KGNhc2UtbGFtYmRhICgodmVjKSAocmV2ZXJzZS12ZWN0b3ItPmdlbmVyYXRvciB2ZWMgMCAo dmVjdG9yLWxlbmd0aCB2ZWMpKSkKKyAgICAgICAgICAgICAgICgodmVjIHN0YXJ0KSAocmV2 ZXJzZS12ZWN0b3ItPmdlbmVyYXRvciB2ZWMgc3RhcnQgKHZlY3Rvci1sZW5ndGggdmVjKSkp CisgICAgICAgICAgICAgICAoKHZlYyBzdGFydCBlbmQpCisgICAgICAgICAgICAgICAgKGxh bWJkYSAoKSAoaWYgKD49IHN0YXJ0IGVuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgKGVvZi1vYmplY3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZXQgKChu ZXh0ICh2ZWN0b3ItcmVmIHZlYyAoLSBlbmQgMSkpKSkKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIChzZXQhIGVuZCAoLSBlbmQgMSkpCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBuZXh0KSkpKSkpCisKKworOzsgc3RyaW5nLT5nZW5lcmF0b3IKKyhkZWZpbmUg c3RyaW5nLT5nZW5lcmF0b3IKKyAgKGNhc2UtbGFtYmRhICgoc3RyKSAoc3RyaW5nLT5nZW5l cmF0b3Igc3RyIDAgKHN0cmluZy1sZW5ndGggc3RyKSkpCisgICAgICAgICAgICAgICAoKHN0 ciBzdGFydCkgKHN0cmluZy0+Z2VuZXJhdG9yIHN0ciBzdGFydCAoc3RyaW5nLWxlbmd0aCBz dHIpKSkKKyAgICAgICAgICAgICAgICgoc3RyIHN0YXJ0IGVuZCkKKyAgICAgICAgICAgICAg ICAobGFtYmRhICgpIChpZiAoPj0gc3RhcnQgZW5kKQorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAoZW9mLW9iamVjdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxl dCAoKG5leHQgKHN0cmluZy1yZWYgc3RyIHN0YXJ0KSkpCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAoc2V0ISBzdGFydCAoKyBzdGFydCAxKSkKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIG5leHQpKSkpKSkKKworCis7OyBieXRldmVjdG9yLT5nZW5lcmF0b3IK KyhkZWZpbmUgYnl0ZXZlY3Rvci0+Z2VuZXJhdG9yCisgIChjYXNlLWxhbWJkYSAoKHN0cikg KGJ5dGV2ZWN0b3ItPmdlbmVyYXRvciBzdHIgMCAoYnl0ZXZlY3Rvci1sZW5ndGggc3RyKSkp CisgICAgICAgICAgICAgICAoKHN0ciBzdGFydCkgKGJ5dGV2ZWN0b3ItPmdlbmVyYXRvciBz dHIgc3RhcnQgKGJ5dGV2ZWN0b3ItbGVuZ3RoIHN0cikpKQorICAgICAgICAgICAgICAgKChz dHIgc3RhcnQgZW5kKQorICAgICAgICAgICAgICAgIChsYW1iZGEgKCkgKGlmICg+PSBzdGFy dCBlbmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlb2Ytb2JqZWN0KQorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAobGV0ICgobmV4dCAoYnl0ZXZlY3Rvci11OC1y ZWYgc3RyIHN0YXJ0KSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V0ISBz dGFydCAoKyBzdGFydCAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQp KSkpKSkKKworCis7OyBtYWtlLWZvci1lYWNoLWdlbmVyYXRvcgorO0ZJWE1FOiBzZWVtcyB0 byBmYWlsIHRlc3QKKyhkZWZpbmUgKG1ha2UtZm9yLWVhY2gtZ2VuZXJhdG9yIGZvci1lYWNo IG9iaikKKyAgKG1ha2UtY29yb3V0aW5lLWdlbmVyYXRvciAobGFtYmRhICh5aWVsZCkgKGZv ci1lYWNoIHlpZWxkIG9iaikpKSkKKworCis7OyBtYWtlLXVuZm9sZC1nZW5lcmF0b3IKKyhk ZWZpbmUgKG1ha2UtdW5mb2xkLWdlbmVyYXRvciBzdG9wPyBtYXBwZXIgc3VjY2Vzc29yIHNl ZWQpCisgIChtYWtlLWNvcm91dGluZS1nZW5lcmF0b3IgKGxhbWJkYSAoeWllbGQpCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAobGV0IGxvb3AgKChzIHNlZWQpKQorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIChpZiAoc3RvcD8gcykKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIChpZiAjZiAjZikKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIChiZWdpbiAoeWllbGQgKG1hcHBlciBzKSkKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAobG9vcCAoc3VjY2Vzc29yIHMpKSkpKSkpKQorCisK Kzs7IGdjb25zKgorKGRlZmluZSAoZ2NvbnMqIC4gYXJncykKKyAgKGxhbWJkYSAoKSAoaWYg KG51bGw/IGFyZ3MpCisgICAgICAgICAgICAgICAoZW9mLW9iamVjdCkKKyAgICAgICAgICAg ICAgIChpZiAoPSAobGVuZ3RoIGFyZ3MpIDEpCisgICAgICAgICAgICAgICAgICgoY2FyIGFy Z3MpKQorICAgICAgICAgICAgICAgICAobGV0ICgodiAoY2FyIGFyZ3MpKSkKKyAgICAgICAg ICAgICAgICAgIChzZXQhIGFyZ3MgKGNkciBhcmdzKSkKKyAgICAgICAgICAgICAgICAgIHYp KSkpKQorCisKKzs7IGdhcHBlbmQKKyhkZWZpbmUgKGdhcHBlbmQgLiBhcmdzKQorICAobGFt YmRhICgpIChpZiAobnVsbD8gYXJncykKKyAgICAgICAgICAgICAgIChlb2Ytb2JqZWN0KQor ICAgICAgICAgICAgICAgKGxldCBsb29wICgodiAoKGNhciBhcmdzKSkpKQorICAgICAgICAg ICAgICAgIChpZiAoZW9mLW9iamVjdD8gdikKKyAgICAgICAgICAgICAgICAgIChiZWdpbiAo c2V0ISBhcmdzIChjZHIgYXJncykpCisgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChu dWxsPyBhcmdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVvZi1vYmplY3QpCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAobG9vcCAoKGNhciBhcmdzKSkpKSkKKyAgICAg ICAgICAgICAgICAgIHYpKSkpKQorCis7OyBnZmxhdHRlbgorKGRlZmluZSAoZ2ZsYXR0ZW4g Z2VuKQorICAobGV0ICgoc3RhdGUgJygpKSkKKyAgICAobGFtYmRhICgpCisgICAgICAoaWYg KG51bGw/IHN0YXRlKSAoc2V0ISBzdGF0ZSAoZ2VuKSkpCisgICAgICAoaWYgKGVvZi1vYmpl Y3Q/IHN0YXRlKQorICAgICAgICBzdGF0ZQorICAgICAgICAobGV0ICgob2JqIChjYXIgc3Rh dGUpKSkKKyAgICAgICAgICAoc2V0ISBzdGF0ZSAoY2RyIHN0YXRlKSkKKyAgICAgICAgICBv YmopKSkpKQorCis7OyBnZ3JvdXAKKyhkZWZpbmUgZ2dyb3VwCisgIChjYXNlLWxhbWJkYQor ICAgICgoZ2VuIGspCisgICAgIChzaW1wbGUtZ2dyb3VwIGdlbiBrKSkKKyAgICAoKGdlbiBr IHBhZGRpbmcpCisgICAgIChwYWRkZWQtZ2dyb3VwIChzaW1wbGUtZ2dyb3VwIGdlbiBrKSBr IHBhZGRpbmcpKSkpCisKKyhkZWZpbmUgKHNpbXBsZS1nZ3JvdXAgZ2VuIGspCisgIChsYW1i ZGEgKCkKKyAgICAobGV0IGxvb3AgKChpdGVtIChnZW4pKSAocmVzdWx0ICcoKSkgKGNvdW50 ICgtIGsgMSkpKQorICAgICAgKGlmIChlb2Ytb2JqZWN0PyBpdGVtKQorICAgICAgICAoaWYg KG51bGw/IHJlc3VsdCkgaXRlbSAocmV2ZXJzZSByZXN1bHQpKQorICAgICAgICAoaWYgKD0g Y291bnQgMCkKKyAgICAgICAgICAocmV2ZXJzZSAoY29ucyBpdGVtIHJlc3VsdCkpCisgICAg ICAgICAgKGxvb3AgKGdlbikgKGNvbnMgaXRlbSByZXN1bHQpICgtIGNvdW50IDEpKSkpKSkp CisKKyhkZWZpbmUgKHBhZGRlZC1nZ3JvdXAgZ2VuIGsgcGFkZGluZykKKyAgKGxhbWJkYSAo KQorICAgIChsZXQgKChpdGVtIChnZW4pKSkKKyAgICAgIChpZiAoZW9mLW9iamVjdD8gaXRl bSkKKyAgICAgICAgaXRlbQorICAgICAgICAobGV0ICgobGVuIChsZW5ndGggaXRlbSkpKQor ICAgICAgICAgIChpZiAoPSBsZW4gaykKKyAgICAgICAgICAgICAgaXRlbQorICAgICAgICAg ICAgICAoYXBwZW5kIGl0ZW0gKG1ha2UtbGlzdCAoLSBrIGxlbikgcGFkZGluZykpKSkpKSkp CisKKzs7IGdtZXJnZQorKGRlZmluZSBnbWVyZ2UKKyAgKGNhc2UtbGFtYmRhCisgICAgKCg8 KSAoZXJyb3IgIndyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGdtZXJnZSIpKQorICAg ICgoPCBnZW4pIGdlbikKKyAgICAoKDwgZ2VubGVmdCBnZW5yaWdodCkKKyAgICAgKGxldCAo KGxlZnQgKGdlbmxlZnQpKQorICAgICAgICAgICAocmlnaHQgKGdlbnJpZ2h0KSkpCisgICAg ICAgKGxhbWJkYSAoKQorICAgICAgICAgKGNvbmQKKyAgICAgICAgICAoKGFuZCAoZW9mLW9i amVjdD8gbGVmdCkgKGVvZi1vYmplY3Q/IHJpZ2h0KSkKKyAgICAgICAgICAgbGVmdCkKKyAg ICAgICAgICAoKGVvZi1vYmplY3Q/IGxlZnQpCisgICAgICAgICAgIChsZXQgKChvYmogcmln aHQpKSAoc2V0ISByaWdodCAoZ2VucmlnaHQpKSBvYmopKQorICAgICAgICAgICgoZW9mLW9i amVjdD8gcmlnaHQpCisgICAgICAgICAgIChsZXQgKChvYmogbGVmdCkpICAoc2V0ISBsZWZ0 IChnZW5sZWZ0KSkgb2JqKSkKKyAgICAgICAgICAoKDwgcmlnaHQgbGVmdCkKKyAgICAgICAg ICAgKGxldCAoKG9iaiByaWdodCkpIChzZXQhIHJpZ2h0IChnZW5yaWdodCkpIG9iaikpCisg ICAgICAgICAgKGVsc2UKKyAgICAgICAgICAgKGxldCAoKG9iaiBsZWZ0KSkgKHNldCEgbGVm dCAoZ2VubGVmdCkpIG9iaikpKSkpKQorICAgICgoPCAuIGdlbnMpCisgICAgIChhcHBseSBn bWVyZ2UgPAorICAgICAgICAgICAgKGxldCBsb29wICgoZ2VucyBnZW5zKSAoZ3MgJygpKSkK KyAgICAgICAgICAgICAgKGNvbmQgKChudWxsPyBnZW5zKSAocmV2ZXJzZSBncykpCisgICAg ICAgICAgICAgICAgICAgICgobnVsbD8gKGNkciBnZW5zKSkgKHJldmVyc2UgKGNvbnMgKGNh ciBnZW5zKSBncykpKQorICAgICAgICAgICAgICAgICAgICAoZWxzZSAobG9vcCAoY2RkciBn ZW5zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29ucyAoZ21lcmdlIDwg KGNhciBnZW5zKSAoY2FkciBnZW5zKSkgZ3MpKSkpKSkpKSkKKworOzsgZ21hcAorKGRlZmlu ZSBnbWFwCisgIChjYXNlLWxhbWJkYQorICAgICgocHJvYykgKGVycm9yICJ3cm9uZyBudW1i ZXIgb2YgYXJndW1lbnRzIGZvciBnbWFwIikpCisgICAgKChwcm9jIGdlbikKKyAgICAgKGxh bWJkYSAoKQorICAgICAgIChsZXQgKChpdGVtIChnZW4pKSkKKyAgICAgICAgIChpZiAoZW9m LW9iamVjdD8gaXRlbSkgaXRlbSAocHJvYyBpdGVtKSkpKSkKKyAgICAoKHByb2MgLiBnZW5z KQorICAgICAobGFtYmRhICgpCisgICAgICAgKGxldCAoKGl0ZW1zIChtYXAgKGxhbWJkYSAo eCkgKHgpKSBnZW5zKSkpCisgICAgICAgICAoaWYgKGFueSBlb2Ytb2JqZWN0PyBpdGVtcykg KGVvZi1vYmplY3QpIChhcHBseSBwcm9jIGl0ZW1zKSkpKSkpKQorCis7OyBnY29tYmluZQor KGRlZmluZSAoZ2NvbWJpbmUgcHJvYyBzZWVkIC4gZ2VucykKKyAgKGxhbWJkYSAoKQorICAg IChkZWZpbmUgaXRlbXMgKG1hcCAobGFtYmRhICh4KSAoeCkpIGdlbnMpKQorICAgIChpZiAo YW55IGVvZi1vYmplY3Q/IGl0ZW1zKQorICAgICAgKGVvZi1vYmplY3QpCisgICAgICAobGV0 ICgpCisgICAgICAgKGRlZmluZS12YWx1ZXMgKHZhbHVlIG5ld3NlZWQpIChhcHBseSBwcm9j IChhcHBlbmQgaXRlbXMgKGxpc3Qgc2VlZCkpKSkKKyAgICAgICAoc2V0ISBzZWVkIG5ld3Nl ZWQpCisgICAgICAgdmFsdWUpKSkpCisKKzs7IGdmaWx0ZXIKKyhkZWZpbmUgKGdmaWx0ZXIg cHJlZCBnZW4pCisgIChsYW1iZGEgKCkgKGxldCBsb29wICgpCisgICAgICAgICAgICAgIChs ZXQgKChuZXh0IChnZW4pKSkKKyAgICAgICAgICAgICAgIChpZiAob3IgKGVvZi1vYmplY3Q/ IG5leHQpCisgICAgICAgICAgICAgICAgICAgICAgIChwcmVkIG5leHQpKQorICAgICAgICAg ICAgICAgICBuZXh0CisgICAgICAgICAgICAgICAgIChsb29wKSkpKSkpCisKKzs7IGdzdGF0 ZS1maWx0ZXIKKyhkZWZpbmUgKGdzdGF0ZS1maWx0ZXIgcHJvYyBzZWVkIGdlbikKKyAgKGxl dCAoKHN0YXRlIHNlZWQpKQorICAgIChsYW1iZGEgKCkKKyAgICAgIChsZXQgbG9vcCAoKGl0 ZW0gKGdlbikpKQorICAgICAgICAoaWYgKGVvZi1vYmplY3Q/IGl0ZW0pCisgICAgICAgICAg aXRlbQorICAgICAgICAgIChsZXQtdmFsdWVzICgoKHllcyBuZXdzdGF0ZSkgKHByb2MgaXRl bSBzdGF0ZSkpKQorICAgICAgICAgICAgKHNldCEgc3RhdGUgbmV3c3RhdGUpCisgICAgICAg ICAgICAoaWYgeWVzCisgICAgICAgICAgICAgICBpdGVtCisgICAgICAgICAgICAgICAobG9v cCAoZ2VuKSkpKSkpKSkpCisKKworCis7OyBncmVtb3ZlCisoZGVmaW5lIChncmVtb3ZlIHBy ZWQgZ2VuKQorICAoZ2ZpbHRlciAobGFtYmRhICh2KSAobm90IChwcmVkIHYpKSkgZ2VuKSkK KworCisKKzs7IGd0YWtlCisoZGVmaW5lIGd0YWtlCisgIChjYXNlLWxhbWJkYSAoKGdlbiBr KSAoZ3Rha2UgZ2VuIGsgKGVvZi1vYmplY3QpKSkKKyAgICAgICAgICAgICAgICgoZ2VuIGsg cGFkZGluZykKKyAgICAgICAgICAgICAgICAobWFrZS1jb3JvdXRpbmUtZ2VuZXJhdG9yIChs YW1iZGEgKHlpZWxkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAoaWYgKD4gayAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIChsZXQgbG9vcCAoKGkgMCkgKHYgKGdlbikpKQorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmVnaW4gKGlmIChlb2Ytb2JqZWN0 PyB2KSAoeWllbGQgcGFkZGluZykgKHlpZWxkIHYpKQorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmICg8ICgrIDEgaSkgaykKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg KGxvb3AgKCsgMSBpKSAoZ2VuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKGVvZi1vYmplY3QpKSkpCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVvZi1vYmplY3QpKSkpKSkpCisK KworCis7OyBnZHJvcAorKGRlZmluZSAoZ2Ryb3AgZ2VuIGspCisgIChsYW1iZGEgKCkgKGRv ICgpICgoPD0gayAwKSkgKHNldCEgayAoLSBrIDEpKSAoZ2VuKSkKKyAgICAoZ2VuKSkpCisK KworCis7OyBnZHJvcC13aGlsZQorKGRlZmluZSAoZ2Ryb3Atd2hpbGUgcHJlZCBnZW4pCisg IChkZWZpbmUgZm91bmQgI2YpCisgIChsYW1iZGEgKCkKKyAgICAobGV0IGxvb3AgKCkKKyAg ICAgKGxldCAoKHZhbCAoZ2VuKSkpCisgICAgICAoY29uZCAoZm91bmQgdmFsKQorICAgICAg ICAgICAgKChhbmQgKG5vdCAoZW9mLW9iamVjdD8gdmFsKSkgKHByZWQgdmFsKSkgKGxvb3Ap KQorICAgICAgICAgICAgKGVsc2UgKHNldCEgZm91bmQgI3QpIHZhbCkpKSkpKQorCisKKzs7 IGd0YWtlLXdoaWxlCisoZGVmaW5lIChndGFrZS13aGlsZSBwcmVkIGdlbikKKyAgKGxhbWJk YSAoKSAobGV0ICgobmV4dCAoZ2VuKSkpCisgICAgICAgICAgICAgIChpZiAoZW9mLW9iamVj dD8gbmV4dCkKKyAgICAgICAgICAgICAgICBuZXh0CisgICAgICAgICAgICAgICAgKGlmIChw cmVkIG5leHQpCisgICAgICAgICAgICAgICAgICBuZXh0CisgICAgICAgICAgICAgICAgICAo YmVnaW4gKHNldCEgZ2VuIChnZW5lcmF0b3IpKQorICAgICAgICAgICAgICAgICAgICAgICAg IChnZW4pKSkpKSkpCisKKworCis7OyBnZGVsZXRlCisoZGVmaW5lIGdkZWxldGUKKyAgKGNh c2UtbGFtYmRhICgoaXRlbSBnZW4pIChnZGVsZXRlIGl0ZW0gZ2VuIGVxdWFsPykpCisgICAg ICAgICAgICAgICAoKGl0ZW0gZ2VuID09KQorICAgICAgICAgICAgICAgIChsYW1iZGEgKCkg KGxldCBsb29wICgodiAoZ2VuKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNv bmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZW9mLW9iamVjdD8gdikgKGVv Zi1vYmplY3QpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCg9PSBpdGVtIHYp IChsb29wIChnZW4pKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbHNlIHYp KSkpKSkpCisKKworCis7OyBnZGVsZXRlLW5laWdoYm9yLWR1cHMKKyhkZWZpbmUgZ2RlbGV0 ZS1uZWlnaGJvci1kdXBzCisgIChjYXNlLWxhbWJkYSAoKGdlbikKKyAgICAgICAgICAgICAg ICAoZ2RlbGV0ZS1uZWlnaGJvci1kdXBzIGdlbiBlcXVhbD8pKQorICAgICAgICAgICAgICAg KChnZW4gPT0pCisgICAgICAgICAgICAgICAgKGRlZmluZSBmaXJzdHRpbWUgI3QpCisgICAg ICAgICAgICAgICAgKGRlZmluZSBwcmV2ICNmKQorICAgICAgICAgICAgICAgIChsYW1iZGEg KCkgKGlmIGZpcnN0dGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmVnaW4g KHNldCEgZmlyc3R0aW1lICNmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgKHNldCEgcHJldiAoZ2VuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHByZXYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZXQgbG9vcCAoKHYg KGdlbikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmQKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKChlb2Ytb2JqZWN0PyB2KQorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgdikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgKCg9PSBwcmV2IHYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9v cCAoZ2VuKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbHNlCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNldCEgcHJldiB2KQorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHYpKSkpKSkpKQorCisKKzs7IGdpbmRleAorKGRl ZmluZSAoZ2luZGV4IHZhbHVlLWdlbiBpbmRleC1nZW4pCisgIChsZXQgKChkb25lPyAjZikg KGNvdW50IDApKQorICAgKGxhbWJkYSAoKQorICAgICAoaWYgZG9uZT8KKyAgICAgICAoZW9m LW9iamVjdCkKKyAgICAgICAobGV0IGxvb3AgKCh2YWx1ZSAodmFsdWUtZ2VuKSkgKGluZGV4 IChpbmRleC1nZW4pKSkKKyAgICAgICAgKGNvbmQKKyAgICAgICAgICAoKG9yIChlb2Ytb2Jq ZWN0PyB2YWx1ZSkgKGVvZi1vYmplY3Q/IGluZGV4KSkKKyAgICAgICAgICAgKHNldCEgZG9u ZT8gI3QpCisgICAgICAgICAgIChlb2Ytb2JqZWN0KSkKKyAgICAgICAgICAoKD0gaW5kZXgg Y291bnQpCisgICAgICAgICAgIChzZXQhIGNvdW50ICgrIGNvdW50IDEpKQorICAgICAgICAg ICB2YWx1ZSkKKyAgICAgICAgICAoZWxzZQorICAgICAgICAgICAgKHNldCEgY291bnQgKCsg Y291bnQgMSkpCisgICAgICAgICAgICAobG9vcCAodmFsdWUtZ2VuKSBpbmRleCkpKSkpKSkp CisKKworOzsgZ3NlbGVjdAorKGRlZmluZSAoZ3NlbGVjdCB2YWx1ZS1nZW4gdHJ1dGgtZ2Vu KQorICAobGV0ICgoZG9uZT8gI2YpKQorICAgKGxhbWJkYSAoKQorICAgICAoaWYgZG9uZT8K KyAgICAgICAoZW9mLW9iamVjdCkKKyAgICAgICAobGV0IGxvb3AgKCh2YWx1ZSAodmFsdWUt Z2VuKSkgKHRydXRoICh0cnV0aC1nZW4pKSkKKyAgICAgICAgKGNvbmQKKyAgICAgICAgICAo KG9yIChlb2Ytb2JqZWN0PyB2YWx1ZSkgKGVvZi1vYmplY3Q/IHRydXRoKSkKKyAgICAgICAg ICAgKHNldCEgZG9uZT8gI3QpCisgICAgICAgICAgIChlb2Ytb2JqZWN0KSkKKyAgICAgICAg ICAodHJ1dGggdmFsdWUpCisgICAgICAgICAgKGVsc2UgKGxvb3AgKHZhbHVlLWdlbikgKHRy dXRoLWdlbikpKSkpKSkpKQorCis7OyBnZW5lcmF0b3ItPmxpc3QKKyhkZWZpbmUgZ2VuZXJh dG9yLT5saXN0CisgIChjYXNlLWxhbWJkYSAoKGdlbiBuKQorCQkoZ2VuZXJhdG9yLT5saXN0 IChndGFrZSBnZW4gbikpKQorICAgICAgICAgICAgICAgKChnZW4pCisJCShyZXZlcnNlIChn ZW5lcmF0b3ItPnJldmVyc2UtbGlzdCBnZW4pKSkpKQorCis7OyBnZW5lcmF0b3ItPnJldmVy c2UtbGlzdAorKGRlZmluZSBnZW5lcmF0b3ItPnJldmVyc2UtbGlzdAorICAoY2FzZS1sYW1i ZGEgKChnZW4gbikKKwkJKGdlbmVyYXRvci0+cmV2ZXJzZS1saXN0IChndGFrZSBnZW4gbikp KQorICAgICAgICAgICAgICAgKChnZW4pCisJCShnZW5lcmF0b3ItZm9sZCBjb25zICcoKSBn ZW4pKSkpCisKKzs7IGdlbmVyYXRvci0+dmVjdG9yCisoZGVmaW5lIGdlbmVyYXRvci0+dmVj dG9yCisgIChjYXNlLWxhbWJkYSAoKGdlbikgKGxpc3QtPnZlY3RvciAoZ2VuZXJhdG9yLT5s aXN0IGdlbikpKQorICAgICAgICAgICAgICAgKChnZW4gbikgKGxpc3QtPnZlY3RvciAoZ2Vu ZXJhdG9yLT5saXN0IGdlbiBuKSkpKSkKKworCis7OyBnZW5lcmF0b3ItPnZlY3RvciEKKyhk ZWZpbmUgKGdlbmVyYXRvci0+dmVjdG9yISB2ZWN0b3IgYXQgZ2VuKQorICAobGV0IGxvb3Ag KCh2YWx1ZSAoZ2VuKSkgKGNvdW50IDApIChhdCBhdCkpCisgICAoY29uZAorICAgICAoKGVv Zi1vYmplY3Q/IHZhbHVlKSBjb3VudCkKKyAgICAgKCg+PSBhdCAodmVjdG9yLWxlbmd0aCB2 ZWN0b3IpKSBjb3VudCkKKyAgICAgKGVsc2UgKGJlZ2luCisgICAgICAgICAgICAgKHZlY3Rv ci1zZXQhIHZlY3RvciBhdCB2YWx1ZSkKKyAgICAgICAgICAgICAobG9vcCAoZ2VuKSAoKyBj b3VudCAxKSAoKyBhdCAxKSkpKSkpKQorCisKKzs7IGdlbmVyYXRvci0+c3RyaW5nCisoZGVm aW5lIGdlbmVyYXRvci0+c3RyaW5nCisgIChjYXNlLWxhbWJkYSAoKGdlbikgKGxpc3QtPnN0 cmluZyAoZ2VuZXJhdG9yLT5saXN0IGdlbikpKQorICAgICAgICAgICAgICAgKChnZW4gbikg KGxpc3QtPnN0cmluZyAoZ2VuZXJhdG9yLT5saXN0IGdlbiBuKSkpKSkKKworCisKKworOzsg Z2VuZXJhdG9yLWZvbGQKKyhkZWZpbmUgKGdlbmVyYXRvci1mb2xkIGYgc2VlZCAuIGdzKQor ICAoZGVmaW5lIChpbm5lci1mb2xkIHNlZWQpCisgICAgKGxldCAoKHZzIChtYXAgKGxhbWJk YSAoZykgKGcpKSBncykpKQorICAgICAoaWYgKGFueSBlb2Ytb2JqZWN0PyB2cykKKyAgICAg ICBzZWVkCisgICAgICAgKGlubmVyLWZvbGQgKGFwcGx5IGYgKGFwcGVuZCB2cyAobGlzdCBz ZWVkKSkpKSkpKQorICAoaW5uZXItZm9sZCBzZWVkKSkKKworCisKKzs7IGdlbmVyYXRvci1m b3ItZWFjaAorKGRlZmluZSAoZ2VuZXJhdG9yLWZvci1lYWNoIGYgLiBncykKKyAgKGxldCBs b29wICgpCisgICAobGV0ICgodnMgKG1hcCAobGFtYmRhIChnKSAoZykpIGdzKSkpCisgICAg KGlmIChhbnkgZW9mLW9iamVjdD8gdnMpCisgICAgICAoaWYgI2YgI2YpCisgICAgICAoYmVn aW4gKGFwcGx5IGYgdnMpCisgICAgICAgICAgICAgKGxvb3ApKSkpKSkKKworCisoZGVmaW5l IChnZW5lcmF0b3ItbWFwLT5saXN0IGYgLiBncykKKyAgKGxldCBsb29wICgocmVzdWx0ICco KSkpCisgICAobGV0ICgodnMgKG1hcCAobGFtYmRhIChnKSAoZykpIGdzKSkpCisgICAgKGlm IChhbnkgZW9mLW9iamVjdD8gdnMpCisgICAgICAocmV2ZXJzZSByZXN1bHQpCisgICAgICAo bG9vcCAoY29ucyAoYXBwbHkgZiB2cykgcmVzdWx0KSkpKSkpCisKKworOzsgZ2VuZXJhdG9y LWZpbmQKKyhkZWZpbmUgKGdlbmVyYXRvci1maW5kIHByZWQgZykKKyAgKGxldCBsb29wICgo diAoZykpKQorICAgIChjb25kICgoZW9mLW9iamVjdD8gdikgI2YpCisgICAgICAgICAgKChw cmVkIHYpIHYpCisgICAgICAgICAgKGVsc2UgKGxvb3AgKGcpKSkpKSkKKworOzsgZ2VuZXJh dG9yLWNvdW50CisoZGVmaW5lIChnZW5lcmF0b3ItY291bnQgcHJlZCBnKQorICAoZ2VuZXJh dG9yLWZvbGQgKGxhbWJkYSAodiBuKSAoaWYgKHByZWQgdikgKCsgMSBuKSBuKSkgMCBnKSkK KworCis7OyBnZW5lcmF0b3ItYW55CisoZGVmaW5lIChnZW5lcmF0b3ItYW55IHByZWQgZ2Vu KQorICAobGV0IGxvb3AgKChpdGVtIChnZW4pKSkKKyAgICAoY29uZCAoKGVvZi1vYmplY3Q/ IGl0ZW0pICNmKQorICAgICAgICAgICgocHJlZCBpdGVtKSkKKyAgICAgICAgICAoZWxzZSAo bG9vcCAoZ2VuKSkpKSkpCisKKworOzsgZ2VuZXJhdG9yLWV2ZXJ5CisoZGVmaW5lIChnZW5l cmF0b3ItZXZlcnkgcHJlZCBnZW4pCisgIChsZXQgbG9vcCAoKGl0ZW0gKGdlbikpIChsYXN0 ICN0KSkKKyAgICAoaWYgKGVvZi1vYmplY3Q/IGl0ZW0pCisgICAgICBsYXN0CisgICAgICAo bGV0ICgociAocHJlZCBpdGVtKSkpCisgICAgICAgIChpZiByCisgICAgICAgICAgKGxvb3Ag KGdlbikgcikKKyAgICAgICAgICAjZikpKSkpCisKKworOzsgZ2VuZXJhdG9yLXVuZm9sZAor KGRlZmluZSAoZ2VuZXJhdG9yLXVuZm9sZCBnIHVuZm9sZCAuIGFyZ3MpCisgIChhcHBseSB1 bmZvbGQgZW9mLW9iamVjdD8gKGxhbWJkYSAoeCkgeCkgKGxhbWJkYSAoeCkgKGcpKSAoZykg YXJncykpCisKKworOzsgbWFrZS1hY2N1bXVsYXRvcgorKGRlZmluZSAobWFrZS1hY2N1bXVs YXRvciBrb25zIGtuaWwgZmluYWxpemUpCisgIChsZXQgKChzdGF0ZSBrbmlsKSkKKyAgICAo bGFtYmRhIChvYmopCisgICAgICAoaWYgKGVvZi1vYmplY3Q/IG9iaikKKyAgICAgICAgKGZp bmFsaXplIHN0YXRlKQorICAgICAgICAoc2V0ISBzdGF0ZSAoa29ucyBvYmogc3RhdGUpKSkp KSkKKworCis7OyBjb3VudC1hY2N1bXVsYXRvcgorKGRlZmluZSAoY291bnQtYWNjdW11bGF0 b3IpIChtYWtlLWFjY3VtdWxhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxh bWJkYSAob2JqIHN0YXRlKSAoKyAxIHN0YXRlKSkgMCAobGFtYmRhICh4KSB4KSkpCisKKzs7 IGxpc3QtYWNjdW11bGF0b3IKKyhkZWZpbmUgKGxpc3QtYWNjdW11bGF0b3IpIChtYWtlLWFj Y3VtdWxhdG9yIGNvbnMgJygpIHJldmVyc2UpKQorCis7OyByZXZlcnNlLWxpc3QtYWNjdW11 bGF0b3IKKyhkZWZpbmUgKHJldmVyc2UtbGlzdC1hY2N1bXVsYXRvcikgKG1ha2UtYWNjdW11 bGF0b3IgY29ucyAnKCkgKGxhbWJkYSAoeCkgeCkpKQorCis7OyB2ZWN0b3ItYWNjdW11bGF0 b3IKKyhkZWZpbmUgKHZlY3Rvci1hY2N1bXVsYXRvcikKKyAgKG1ha2UtYWNjdW11bGF0b3Ig Y29ucyAnKCkgKGxhbWJkYSAoeCkgKGxpc3QtPnZlY3RvciAocmV2ZXJzZSB4KSkpKSkKKwor OzsgcmV2ZXJzZS12ZWN0b3ItYWNjdW11bGF0b3IKKyhkZWZpbmUgKHJldmVyc2UtdmVjdG9y LWFjY3VtdWxhdG9yKQorICAobWFrZS1hY2N1bXVsYXRvciBjb25zICcoKSBsaXN0LT52ZWN0 b3IpKQorCis7OyB2ZWN0b3ItYWNjdW11bGF0b3IhCisoZGVmaW5lICh2ZWN0b3ItYWNjdW11 bGF0b3IhIHZlYyBhdCkKKyAgKGxhbWJkYSAob2JqKQorICAgIChpZiAoZW9mLW9iamVjdD8g b2JqKQorICAgICAgdmVjCisgICAgICAoYmVnaW4KKyAgICAgICAgKHZlY3Rvci1zZXQhIHZl YyBhdCBvYmopCisgICAgICAgIChzZXQhIGF0ICgrIGF0IDEpKSkpKSkKKworOzsgYnl0ZXZl Y3Rvci1hY2N1bXVsYXRvcgorKGRlZmluZSAoYnl0ZXZlY3Rvci1hY2N1bXVsYXRvcikKKyAg KG1ha2UtYWNjdW11bGF0b3IgY29ucyAnKCkgKGxhbWJkYSAoeCkgKGxpc3QtPmJ5dGV2ZWN0 b3IgKHJldmVyc2UgeCkpKSkpCisKKyhkZWZpbmUgKGJ5dGV2ZWN0b3ItYWNjdW11bGF0b3Ih IGJ5dGV2ZWMgYXQpCisgIChsYW1iZGEgKG9iaikKKyAgICAoaWYgKGVvZi1vYmplY3Q/IG9i aikKKyAgICAgIGJ5dGV2ZWMKKyAgICAgIChiZWdpbgorICAgICAgICAoYnl0ZXZlY3Rvci11 OC1zZXQhIGJ5dGV2ZWMgYXQgb2JqKQorICAgICAgICAoc2V0ISBhdCAoKyBhdCAxKSkpKSkp CisKKzs7IHN0cmluZy1hY2N1bXVsYXRvcgorKGRlZmluZSAoc3RyaW5nLWFjY3VtdWxhdG9y KQorICAobWFrZS1hY2N1bXVsYXRvciBjb25zICcoKQorICAgICAgICAobGFtYmRhIChsc3Qp IChsaXN0LT5zdHJpbmcgKHJldmVyc2UgbHN0KSkpKSkKKworOzsgc3VtLWFjY3VtdWxhdG9y CisoZGVmaW5lIChzdW0tYWNjdW11bGF0b3IpIChtYWtlLWFjY3VtdWxhdG9yICsgMCAobGFt YmRhICh4KSB4KSkpCisKKzs7IHByb2R1Y3QtYWNjdW11bGF0b3IKKyhkZWZpbmUgKHByb2R1 Y3QtYWNjdW11bGF0b3IpIChtYWtlLWFjY3VtdWxhdG9yICogMSAobGFtYmRhICh4KSB4KSkp CisKZGlmZiAtLWdpdCBhL3Rlc3Qtc3VpdGUvdGVzdHMvc3JmaS0xNTgudGVzdCBiL3Rlc3Qt c3VpdGUvdGVzdHMvc3JmaS0xNTgudGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwMDAuLjYyODQ3MjcxNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qtc3VpdGUvdGVz dHMvc3JmaS0xNTgudGVzdApAQCAtMCwwICsxLDI0NSBAQAorOzsgCUNvcHlyaWdodCAoQykg MjAyNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKzs7Cis7OyBUaGlzIGxpYnJh cnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7 OyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwg UHVibGljCis7OyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBG b3VuZGF0aW9uOyBlaXRoZXIKKzs7IHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0 IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzs7Cis7OyBUaGlzIGxpYnJhcnkg aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzs7 IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdh cnJhbnR5IG9mCis7OyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNV TEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOzsgTGVzc2VyIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzs7Cis7OyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2 ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7OyBMaWNlbnNl IGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNv ZnR3YXJlCis7OyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRo IEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKzs7OyBUZXN0IGNhc2VzIGFy ZSBiYXNlZCBvbiB0aGUgcmVmZXJlbmNlIHRlc3Qgc3VpdGUgZnJvbSBTUkZJIDE1OCwKKzs7 OyBhdmFpbGFibGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL3NjaGVtZS1yZXF1ZXN0cy1mb3It aW1wbGVtZW50YXRpb24vc3JmaS0xNTgKKzs7OyBUaGUgdGVzdHMgaGF2ZSBiZWVuIGFkYXB0 ZWQgdG8gdXNlIEd1aWxlJ3MgdGVzdC1zdWl0ZSBmcmFtZXdvcmsuCisKKyhkZWZpbmUtbW9k dWxlICh0ZXN0LXNyZmktMTU4KQorICAjOnVzZS1tb2R1bGUgKHRlc3Qtc3VpdGUgbGliKQor ICAjOnVzZS1tb2R1bGUgKHNyZmkgc3JmaS0xNTgpCisgICM6dXNlLW1vZHVsZSAocm5ycyBi eXRldmVjdG9ycykpCisKKyh3aXRoLXRlc3QtcHJlZml4ICJnZW5lcmF0b3JzL2NvbnN0cnVj dG9ycyIKKworICAocGFzcy1pZiAiZ2VuZXJhdG9yIHdpdGggbm8gYXJndW1lbnRzIgorICAg IChlcXVhbD8gJygpIChnZW5lcmF0b3ItPmxpc3QgKGdlbmVyYXRvcikpKSkKKworICAocGFz cy1pZiAiZ2VuZXJhdG9yIHdpdGggYXJndW1lbnRzIgorICAgIChlcXVhbD8gJygxIDIgMykg KGdlbmVyYXRvci0+bGlzdCAoZ2VuZXJhdG9yIDEgMiAzKSkpKQorCisgIChwYXNzLWlmICJj aXJjdWxhci1nZW5lcmF0b3IiCisgICAgKGVxdWFsPyAnKDEgMiAzIDEgMikgKGdlbmVyYXRv ci0+bGlzdCAoY2lyY3VsYXItZ2VuZXJhdG9yIDEgMiAzKSA1KSkpCisKKyAgKHBhc3MtaWYg Im1ha2UtaW90YS1nZW5lcmF0b3IiCisgICAgKGVxdWFsPyAnKDggOSAxMCkgKGdlbmVyYXRv ci0+bGlzdCAobWFrZS1pb3RhLWdlbmVyYXRvciAzIDgpKSkpCisKKyAgKHBhc3MtaWYgIm1h a2UtaW90YS1nZW5lcmF0b3Igd2l0aCBzdGVwIgorICAgIChlcXVhbD8gJyg4IDEwIDEyKSAo Z2VuZXJhdG9yLT5saXN0IChtYWtlLWlvdGEtZ2VuZXJhdG9yIDMgOCAyKSkpKQorCisgIChw YXNzLWlmICJtYWtlLXJhbmdlLWdlbmVyYXRvciB1bmJvdW5kZWQiCisgICAgKGVxdWFsPyAn KDMgNCA1IDYpIChnZW5lcmF0b3ItPmxpc3QgKG1ha2UtcmFuZ2UtZ2VuZXJhdG9yIDMpIDQp KSkKKworICAocGFzcy1pZiAibWFrZS1yYW5nZS1nZW5lcmF0b3IgYm91bmRlZCIKKyAgICAo ZXF1YWw/ICcoMyA0IDUgNiA3KSAoZ2VuZXJhdG9yLT5saXN0IChtYWtlLXJhbmdlLWdlbmVy YXRvciAzIDgpKSkpCisKKyAgKHBhc3MtaWYgIm1ha2UtcmFuZ2UtZ2VuZXJhdG9yIHdpdGgg c3RlcCIKKyAgICAoZXF1YWw/ICcoMyA1IDcpIChnZW5lcmF0b3ItPmxpc3QgKG1ha2UtcmFu Z2UtZ2VuZXJhdG9yIDMgOCAyKSkpKQorCisgIChwYXNzLWlmICJtYWtlLWNvcm91dGluZS1n ZW5lcmF0b3IiCisgICAgKGxldCAoKGcgKG1ha2UtY29yb3V0aW5lLWdlbmVyYXRvcgorICAg ICAgICAgICAgICAobGFtYmRhICh5aWVsZCkKKyAgICAgICAgICAgICAgICAobGV0IGxvb3Ag KChpIDApKQorICAgICAgICAgICAgICAgICAgKHdoZW4gKDwgaSAzKQorICAgICAgICAgICAg ICAgICAgICAoeWllbGQgaSkKKyAgICAgICAgICAgICAgICAgICAgKGxvb3AgKCsgaSAxKSkp KSkpKSkKKyAgICAgIChlcXVhbD8gJygwIDEgMikgKGdlbmVyYXRvci0+bGlzdCBnKSkpKQor CisgIChwYXNzLWlmICJsaXN0LT5nZW5lcmF0b3IiCisgICAgKGVxdWFsPyAnKDEgMiAzIDQg NSkgKGdlbmVyYXRvci0+bGlzdCAobGlzdC0+Z2VuZXJhdG9yICcoMSAyIDMgNCA1KSkpKSkK KworICAocGFzcy1pZiAidmVjdG9yLT5nZW5lcmF0b3IiCisgICAgKGVxdWFsPyAnKDEgMiAz IDQgNSkgKGdlbmVyYXRvci0+bGlzdCAodmVjdG9yLT5nZW5lcmF0b3IgJyMoMSAyIDMgNCA1 KSkpKSkKKworICAocGFzcy1pZiAicmV2ZXJzZS12ZWN0b3ItPmdlbmVyYXRvciIKKyAgICAo ZXF1YWw/ICcoNSA0IDMgMiAxKSAoZ2VuZXJhdG9yLT5saXN0IChyZXZlcnNlLXZlY3Rvci0+ Z2VuZXJhdG9yICcjKDEgMiAzIDQgNSkpKSkpCisKKyAgKHBhc3MtaWYgInN0cmluZy0+Z2Vu ZXJhdG9yIgorICAgIChlcXVhbD8gJygjXGEgI1xiICNcYyAjXGQgI1xlKSAoZ2VuZXJhdG9y LT5saXN0IChzdHJpbmctPmdlbmVyYXRvciAiYWJjZGUiKSkpKQorCisgIChwYXNzLWlmICJi eXRldmVjdG9yLT5nZW5lcmF0b3IiCisgICAgKGVxdWFsPyAnKDEwIDIwIDMwKSAoZ2VuZXJh dG9yLT5saXN0IChieXRldmVjdG9yLT5nZW5lcmF0b3IgKGJ5dGV2ZWN0b3ItdTggMTAgMjAg MzApKSkpKQorCisgIChwYXNzLWlmICJtYWtlLWZvci1lYWNoLWdlbmVyYXRvciIKKyAgICAo bGV0ICgoZm9yLWVhY2gtZGlnaXQgKGxhbWJkYSAocHJvYyBuKQorICAgICAgICAgICAgICAg ICAgICAgICAgICAgKHdoZW4gKD4gbiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAobGV0LXZhbHVlcyAoKChkaXYgcmVtKSAodHJ1bmNhdGUvIG4gMTApKSkKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAocHJvYyByZW0pCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKGZvci1lYWNoLWRpZ2l0IHByb2MgZGl2KSkpKSkpCisgICAgICAoZXF1 YWw/ICcoNSA0IDMgMiAxKSAoZ2VuZXJhdG9yLT5saXN0CisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKG1ha2UtZm9yLWVhY2gtZ2VuZXJhdG9yIGZvci1lYWNoLWRpZ2l0IDEyMzQ1 KSkpKSkKKworICAocGFzcy1pZiAibWFrZS11bmZvbGQtZ2VuZXJhdG9yIgorICAgIChlcXVh bD8gJygwIDIgNCA2IDggMTApIChnZW5lcmF0b3ItPmxpc3QKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKG1ha2UtdW5mb2xkLWdlbmVyYXRvcgorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKGxhbWJkYSAocykgKD4gcyA1KSkKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIChsYW1iZGEgKHMpICgqIHMgMikpCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAobGFtYmRhIChzKSAoKyBzIDEpKQorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgMCkpKSkpCisKKyh3aXRoLXRlc3QtcHJlZml4ICJnZW5lcmF0b3JzL29wZXJhdG9y cyIKKworICAocGFzcy1pZiAiZ2NvbnMqIgorICAgIChlcXVhbD8gJyhhIGIgMCAxKSAoZ2Vu ZXJhdG9yLT5saXN0IChnY29ucyogJ2EgJ2IgKG1ha2UtcmFuZ2UtZ2VuZXJhdG9yIDAgMikp KSkpCisKKyAgKHBhc3MtaWYgImdhcHBlbmQiCisgICAgKGVxdWFsPyAnKDAgMSAyIDAgMSkg KGdlbmVyYXRvci0+bGlzdCAoZ2FwcGVuZCAobWFrZS1yYW5nZS1nZW5lcmF0b3IgMCAzKQor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICht YWtlLXJhbmdlLWdlbmVyYXRvciAwIDIpKSkpKQorCisgIChwYXNzLWlmICJnYXBwZW5kIHdp dGggbm8gYXJndW1lbnRzIgorICAgIChlcXVhbD8gJygpIChnZW5lcmF0b3ItPmxpc3QgKGdh cHBlbmQpKSkpCisKKyAgKHBhc3MtaWYgImdjb21iaW5lIgorICAgIChsZXQqICgoZzEgKGdl bmVyYXRvciAxIDIgMykpCisgICAgICAgICAgIChnMiAoZ2VuZXJhdG9yIDQgNSA2IDcpKQor ICAgICAgICAgICAocHJvYyAobGFtYmRhIGFyZ3MgKHZhbHVlcyAoYXBwbHkgKyBhcmdzKSAo YXBwbHkgKyBhcmdzKSkpKSkKKyAgICAgIChlcXVhbD8gJygxNSAyMiAzMSkgKGdlbmVyYXRv ci0+bGlzdCAoZ2NvbWJpbmUgcHJvYyAxMCBnMSBnMikpKSkpCisKKyAgKHBhc3MtaWYgImdm aWx0ZXIiCisgICAgKGVxdWFsPyAnKDEgMyA1IDcgOSkgKGdlbmVyYXRvci0+bGlzdCAoZ2Zp bHRlciBvZGQ/IChtYWtlLXJhbmdlLWdlbmVyYXRvciAxIDExKSkpKSkKKworICAocGFzcy1p ZiAiZ3JlbW92ZSIKKyAgICAoZXF1YWw/ICcoMiA0IDYgOCAxMCkgKGdlbmVyYXRvci0+bGlz dCAoZ3JlbW92ZSBvZGQ/IChtYWtlLXJhbmdlLWdlbmVyYXRvciAxIDExKSkpKSkKKworICAo cGFzcy1pZiAiZ3Rha2UiCisgICAgKGxldCAoKGcgKG1ha2UtcmFuZ2UtZ2VuZXJhdG9yIDEg NSkpKQorICAgICAgKGFuZCAoZXF1YWw/ICcoMSAyIDMpIChnZW5lcmF0b3ItPmxpc3QgKGd0 YWtlIGcgMykpKQorICAgICAgICAgICAoZXF1YWw/ICcoNCkgKGdlbmVyYXRvci0+bGlzdCBn KSkpKSkKKworICAocGFzcy1pZiAiZ3Rha2UgbW9yZSB0aGFuIGF2YWlsYWJsZSIKKyAgICAo ZXF1YWw/ICcoMSAyKSAoZ2VuZXJhdG9yLT5saXN0IChndGFrZSAobWFrZS1yYW5nZS1nZW5l cmF0b3IgMSAzKSAzKSkpKQorCisgIChwYXNzLWlmICJndGFrZSB3aXRoIHBhZGRpbmciCisg ICAgKGVxdWFsPyAnKDEgMiAwKSAoZ2VuZXJhdG9yLT5saXN0IChndGFrZSAobWFrZS1yYW5n ZS1nZW5lcmF0b3IgMSAzKSAzIDApKSkpCisKKyAgKHBhc3MtaWYgImdkcm9wIgorICAgIChl cXVhbD8gJygzIDQpIChnZW5lcmF0b3ItPmxpc3QgKGdkcm9wIChtYWtlLXJhbmdlLWdlbmVy YXRvciAxIDUpIDIpKSkpCisKKyAgKHBhc3MtaWYgImd0YWtlLXdoaWxlIgorICAgIChsZXQg KChnIChtYWtlLXJhbmdlLWdlbmVyYXRvciAxIDUpKSkKKyAgICAgIChlcXVhbD8gJygxIDIp IChnZW5lcmF0b3ItPmxpc3QgKGd0YWtlLXdoaWxlIChsYW1iZGEgKHgpICg8IHggMykpIGcp KSkpKQorCisgIChwYXNzLWlmICJnZHJvcC13aGlsZSIKKyAgICAobGV0ICgoZyAobWFrZS1y YW5nZS1nZW5lcmF0b3IgMSA1KSkpCisgICAgICAoZXF1YWw/ICcoMyA0KSAoZ2VuZXJhdG9y LT5saXN0IChnZHJvcC13aGlsZSAobGFtYmRhICh4KSAoPCB4IDMpKSBnKSkpKSkKKworICAo cGFzcy1pZiAiZ2RlbGV0ZSIKKyAgICAoZXF1YWw/ICcoMC4wIDEuMCAwIDIpIChnZW5lcmF0 b3ItPmxpc3QgKGdkZWxldGUgMSAoZ2VuZXJhdG9yIDAuMCAxLjAgMCAxIDIpKSkpKQorCisg IChwYXNzLWlmICJnZGVsZXRlIHdpdGggZXF1YWxpdHkgcHJlZGljYXRlIgorICAgIChlcXVh bD8gJygwLjAgMCAyKSAoZ2VuZXJhdG9yLT5saXN0IChnZGVsZXRlIDEgKGdlbmVyYXRvciAw LjAgMS4wIDAgMSAyKSA9KSkpKQorCisgIChwYXNzLWlmICJnZGVsZXRlLW5laWdoYm9yLWR1 cHMiCisgICAgKGVxdWFsPyAnKDEgMiAzKSAoZ2VuZXJhdG9yLT5saXN0IChnZGVsZXRlLW5l aWdoYm9yLWR1cHMgKGdlbmVyYXRvciAxIDEgMiAzIDMgMykgPSkpKSkKKworICAocGFzcy1p ZiAiZ2luZGV4IgorICAgIChlcXVhbD8gJyhhIGMgZSkgKGdlbmVyYXRvci0+bGlzdCAoZ2lu ZGV4IChsaXN0LT5nZW5lcmF0b3IgJyhhIGIgYyBkIGUgZikpCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpc3QtPmdlbmVyYXRvciAnKDAgMiA0 KSkpKSkpCisKKyAgKHBhc3MtaWYgImdzZWxlY3QiCisgICAgKGVxdWFsPyAnKGEgZCBlKSAo Z2VuZXJhdG9yLT5saXN0IChnc2VsZWN0IChsaXN0LT5nZW5lcmF0b3IgJyhhIGIgYyBkIGUg ZikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChs aXN0LT5nZW5lcmF0b3IgJygjdCAjZiAjZiAjdCAjdCAjZikpKSkpKQorCisgIChwYXNzLWlm ICJnZmxhdHRlbiIKKyAgICAoZXF1YWw/ICcoMSAyIDMgYSBiIGMpIChnZW5lcmF0b3ItPmxp c3QgKGdmbGF0dGVuIChnZW5lcmF0b3IgJygxIDIgMykgJyhhIGIgYykpKSkpKQorCisgIChw YXNzLWlmICJnZ3JvdXAiCisgICAgKGVxdWFsPyAnKCgxIDIgMykgKDQgNSA2KSAoNyA4KSkg KGdlbmVyYXRvci0+bGlzdCAoZ2dyb3VwIChnZW5lcmF0b3IgMSAyIDMgNCA1IDYgNyA4KSAz KSkpKQorCisgIChwYXNzLWlmICJnZ3JvdXAgd2l0aCBwYWRkaW5nIgorICAgIChlcXVhbD8g JygoMSAyIDMpICg0IDUgNikgKDcgOCAwKSkgKGdlbmVyYXRvci0+bGlzdCAoZ2dyb3VwIChn ZW5lcmF0b3IgMSAyIDMgNCA1IDYgNyA4KSAzIDApKSkpCisKKyAgKHBhc3MtaWYgImdtZXJn ZSIKKyAgICAoZXF1YWw/ICcoMSAyIDMgNCA1IDYpIChnZW5lcmF0b3ItPmxpc3QgKGdtZXJn ZSA8IChnZW5lcmF0b3IgMSAzIDUpIChnZW5lcmF0b3IgMiA0IDYpKSkpKQorCisgIChwYXNz LWlmICJnbWFwIgorICAgIChlcXVhbD8gJygyIDQgNiA4KSAoZ2VuZXJhdG9yLT5saXN0IChn bWFwIChsYW1iZGEgKHgpICgqIHggMikpIChnZW5lcmF0b3IgMSAyIDMgNCkpKSkpKQorCiso d2l0aC10ZXN0LXByZWZpeCAiZ2VuZXJhdG9ycy9jb25zdW1lcnMiCisKKyAgKHBhc3MtaWYg ImdlbmVyYXRvci0+bGlzdCB3aXRoIGxlbmd0aCIKKyAgICAoZXF1YWw/ICcoMSAyIDMpIChn ZW5lcmF0b3ItPmxpc3QgKG1ha2UtcmFuZ2UtZ2VuZXJhdG9yIDEpIDMpKSkKKworICAocGFz cy1pZiAiZ2VuZXJhdG9yLT5yZXZlcnNlLWxpc3QiCisgICAgKGVxdWFsPyAnKDUgNCAzIDIg MSkgKGdlbmVyYXRvci0+cmV2ZXJzZS1saXN0IChnZW5lcmF0b3IgMSAyIDMgNCA1KSkpKQor CisgIChwYXNzLWlmICJnZW5lcmF0b3ItPnZlY3RvciIKKyAgICAoZXF1YWw/ICcjKDEgMiAz IDQgNSkgKGdlbmVyYXRvci0+dmVjdG9yIChnZW5lcmF0b3IgMSAyIDMgNCA1KSkpKQorCisg IChwYXNzLWlmICJnZW5lcmF0b3ItPnZlY3RvciEiCisgICAgKGxldCAoKHYgKG1ha2UtdmVj dG9yIDUgMCkpKQorICAgICAgKGdlbmVyYXRvci0+dmVjdG9yISB2IDIgKGdlbmVyYXRvciAx IDIgNCkpCisgICAgICAoZXF1YWw/ICcjKDAgMCAxIDIgNCkgdikpKQorCisgIChwYXNzLWlm ICJnZW5lcmF0b3ItPnN0cmluZyIKKyAgICAoZXF1YWw/ICJhYmNkZSIgKGdlbmVyYXRvci0+ c3RyaW5nIChnZW5lcmF0b3IgI1xhICNcYiAjXGMgI1xkICNcZSkpKSkKKworICAocGFzcy1p ZiAiZ2VuZXJhdG9yLWZvbGQiCisgICAgKGVxdWFsPyAxNSAoZ2VuZXJhdG9yLWZvbGQgKyAw IChnZW5lcmF0b3IgMSAyIDMgNCA1KSkpKQorCisgIChwYXNzLWlmICJnZW5lcmF0b3ItZm9y LWVhY2giCisgICAgKGxldCAoKHN1bSAwKSkKKyAgICAgIChnZW5lcmF0b3ItZm9yLWVhY2gg KGxhbWJkYSAoeCkgKHNldCEgc3VtICgrIHN1bSB4KSkpIChnZW5lcmF0b3IgMSAyIDMgNCA1 KSkKKyAgICAgIChlcXVhbD8gMTUgc3VtKSkpCisKKyAgKHBhc3MtaWYgImdlbmVyYXRvci1m aW5kIgorICAgIChlcXVhbD8gNCAoZ2VuZXJhdG9yLWZpbmQgZXZlbj8gKGdlbmVyYXRvciAx IDMgNCA1IDYpKSkpCisKKyAgKHBhc3MtaWYgImdlbmVyYXRvci1jb3VudCIKKyAgICAoZXF1 YWw/IDMgKGdlbmVyYXRvci1jb3VudCBvZGQ/IChnZW5lcmF0b3IgMSAyIDMgNCA1KSkpKQor CisgIChwYXNzLWlmICJnZW5lcmF0b3ItYW55IgorICAgIChnZW5lcmF0b3ItYW55IGV2ZW4/ IChnZW5lcmF0b3IgMSAzIDQgNSkpKQorCisgIChwYXNzLWlmICJnZW5lcmF0b3ItZXZlcnki CisgICAgKG5vdCAoZ2VuZXJhdG9yLWV2ZXJ5IG9kZD8gKGdlbmVyYXRvciAxIDMgNCA1KSkp KSkKKworKHdpdGgtdGVzdC1wcmVmaXggImFjY3VtdWxhdG9ycyIKKworICAocGFzcy1pZiAi Y291bnQtYWNjdW11bGF0b3IiCisgICAgKGxldCAoKGFjYyAoY291bnQtYWNjdW11bGF0b3Ip KSkKKyAgICAgIChhY2MgMSkgKGFjYyAyKSAoYWNjIDMpCisgICAgICAoZXF1YWw/IDMgKGFj YyAoZW9mLW9iamVjdCkpKSkpCisKKyAgKHBhc3MtaWYgImxpc3QtYWNjdW11bGF0b3IiCisg ICAgKGxldCAoKGFjYyAobGlzdC1hY2N1bXVsYXRvcikpKQorICAgICAgKGFjYyAxKSAoYWNj IDIpIChhY2MgMykKKyAgICAgIChlcXVhbD8gJygxIDIgMykgKGFjYyAoZW9mLW9iamVjdCkp KSkpCisKKyAgKHBhc3MtaWYgInJldmVyc2UtbGlzdC1hY2N1bXVsYXRvciIKKyAgICAobGV0 ICgoYWNjIChyZXZlcnNlLWxpc3QtYWNjdW11bGF0b3IpKSkKKyAgICAgIChhY2MgMSkgKGFj YyAyKSAoYWNjIDMpCisgICAgICAoZXF1YWw/ICcoMyAyIDEpIChhY2MgKGVvZi1vYmplY3Qp KSkpKQorCisgIChwYXNzLWlmICJ2ZWN0b3ItYWNjdW11bGF0b3IiCisgICAgKGxldCAoKGFj YyAodmVjdG9yLWFjY3VtdWxhdG9yKSkpCisgICAgICAoYWNjIDEpIChhY2MgMikgKGFjYyAz KQorICAgICAgKGVxdWFsPyAnIygxIDIgMykgKGFjYyAoZW9mLW9iamVjdCkpKSkpCisKKyAg KHBhc3MtaWYgInN0cmluZy1hY2N1bXVsYXRvciIKKyAgICAobGV0ICgoYWNjIChzdHJpbmct YWNjdW11bGF0b3IpKSkKKyAgICAgIChhY2MgI1xhKSAoYWNjICNcYikgKGFjYyAjXGMpCisg ICAgICAoZXF1YWw/ICJhYmMiIChhY2MgKGVvZi1vYmplY3QpKSkpKQorCisgIChwYXNzLWlm ICJzdW0tYWNjdW11bGF0b3IiCisgICAgKGxldCAoKGFjYyAoc3VtLWFjY3VtdWxhdG9yKSkp CisgICAgICAoYWNjIDEpIChhY2MgMikgKGFjYyAzKQorICAgICAgKGVxdWFsPyA2IChhY2Mg KGVvZi1vYmplY3QpKSkpKQorCisgIChwYXNzLWlmICJwcm9kdWN0LWFjY3VtdWxhdG9yIgor ICAgIChsZXQgKChhY2MgKHByb2R1Y3QtYWNjdW11bGF0b3IpKSkKKyAgICAgIChhY2MgMikg KGFjYyAzKSAoYWNjIDQpCisgICAgICAoZXF1YWw/IDI0IChhY2MgKGVvZi1vYmplY3QpKSkp KSkKLS0gCjIuNTUuMAoK --0746dbdd83758d84caee6824a7c08f303dce4071--