[Zope-dev] DTML Syntax contd. + rant + summary

Stuart 'Zen' Bishop zen@cs.rmit.edu.au
Fri, 12 Nov 1999 16:36:37 +1100 (EST)


  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

---559023410-1053718679-942384997=:10674
Content-Type: TEXT/PLAIN; charset=US-ASCII

On Fri, 12 Nov 1999, Stuart 'Zen' Bishop wrote:

> Is this any good as a temporary fix?

Grr... just found an obvious flaw. Lets try take 2 at embarassing myself.

*** DT_InSV.py.org	Fri Nov 12 15:26:50 1999
--- DT_InSV.py	Fri Nov 12 16:29:56 1999
***************
*** 88,94 ****
  $Id: DT_InSV.py,v 1.16 1999/11/02 16:51:32 brian Exp $'''
  __version__='$Revision: 1.16 $'[11:-2]
  
! from string import lower, rfind, split, join
  from math import sqrt
  TupleType=type(())
  try:
--- 88,95 ----
  $Id: DT_InSV.py,v 1.16 1999/11/02 16:51:32 brian Exp $'''
  __version__='$Revision: 1.16 $'[11:-2]
  
! from UserDict import UserDict
! from string import lower, rfind, split, join, replace
  from math import sqrt
  TupleType=type(())
  try:
***************
*** 96,101 ****
--- 97,127 ----
      mv=Missing.Value
  except: mv=None
  
+ def _transkey(key):
+     if key[:13] == 'sequence-var-':
+ 	# Only translate the first 2 '-' characters in a sequence-var-
+ 	return replace(key,'-','_',2) 
+     else:
+ 	return replace(key,'-','_')
+ 
+ class sequence_kwdict(UserDict):
+     '''This class is used to implement the dictionary in sequence_variables
+        It duplicates keys containing '-' characters to a corresponding entry
+        with a key mapping all the first two '-' characters to '_' characters. 
+        This will greatly improve DTML readability.'''
+ 
+     def __init__(self,data):
+ 	self.data = data
+ 	for i in data.items():
+ 	    data[_transkey(i[0])] = i[1]
+ 
+     def __setitem__(self,key,value):
+ 	self.data[key] = value
+ 	self.data[_transkey(key)] = value
+ 
+     def __delitem__(self,key,value):
+ 	del self.data[key]
+ 	del self.data[_transkey(key)]
  
  class sequence_variables:
  
***************
*** 105,116 ****
          self.query_string=query_string
          self.start_name_re=start_name_re
  
!         self.data=data={
              'previous-sequence': 0,
              'next-sequence': 0,
              'sequence-start': 1,
              'sequence-end': 0,
!             }
  
  
      def number(self,index): return index+1
--- 131,142 ----
          self.query_string=query_string
          self.start_name_re=start_name_re
  
!         self.data=data=sequence_kwdict({
              'previous-sequence': 0,
              'next-sequence': 0,
              'sequence-start': 1,
              'sequence-end': 0,
!             })
  
  
      def number(self,index): return index+1

 ___
   //     Zen (alias Stuart Bishop)     Work: zen@cs.rmit.edu.au
  // E N  Senior Systems Alchemist      Play: zen@shangri-la.dropbear.id.au
 //__     Computer Science, RMIT 	 WWW: http://www.cs.rmit.edu.au/~zen

---559023410-1053718679-942384997=:10674
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="DT_InSV.py"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.SOL.4.10.9911121636370.10674@goanna.cs.rmit.edu.au>
Content-Description: 
Content-Disposition: attachment; filename="DT_InSV.py"

IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIA0KIyBab3Bl
IFB1YmxpYyBMaWNlbnNlIChaUEwpIFZlcnNpb24gMS4wDQojIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgDQojIENvcHlyaWdo
dCAoYykgRGlnaXRhbCBDcmVhdGlvbnMuICBBbGwgcmlnaHRzIHJlc2VydmVk
Lg0KIyANCiMgVGhpcyBsaWNlbnNlIGhhcyBiZWVuIGNlcnRpZmllZCBhcyBP
cGVuIFNvdXJjZSh0bSkuDQojIA0KIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQN
CiMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KIyBtZXQ6DQojIA0KIyAx
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodA0KIyAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0K
IyANCiMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQNCiMgICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbg0KIyAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQojICAgIGRpc3RyaWJ1
dGlvbi4NCiMgDQojIDMuIERpZ2l0YWwgQ3JlYXRpb25zIHJlcXVlc3RzIHRo
YXQgYXR0cmlidXRpb24gYmUgZ2l2ZW4gdG8gWm9wZQ0KIyAgICBpbiBhbnkg
bWFubmVyIHBvc3NpYmxlLiBab3BlIGluY2x1ZGVzIGEgIlBvd2VyZWQgYnkg
Wm9wZSINCiMgICAgYnV0dG9uIHRoYXQgaXMgaW5zdGFsbGVkIGJ5IGRlZmF1
bHQuIFdoaWxlIGl0IGlzIG5vdCBhIGxpY2Vuc2UNCiMgICAgdmlvbGF0aW9u
IHRvIHJlbW92ZSB0aGlzIGJ1dHRvbiwgaXQgaXMgcmVxdWVzdGVkIHRoYXQg
dGhlDQojICAgIGF0dHJpYnV0aW9uIHJlbWFpbi4gQSBzaWduaWZpY2FudCBp
bnZlc3RtZW50IGhhcyBiZWVuIHB1dA0KIyAgICBpbnRvIFpvcGUsIGFuZCB0
aGlzIGVmZm9ydCB3aWxsIGNvbnRpbnVlIGlmIHRoZSBab3BlIGNvbW11bml0
eQ0KIyAgICBjb250aW51ZXMgdG8gZ3Jvdy4gVGhpcyBpcyBvbmUgd2F5IHRv
IGFzc3VyZSB0aGF0IGdyb3d0aC4NCiMgDQojIDQuIEFsbCBhZHZlcnRpc2lu
ZyBtYXRlcmlhbHMgYW5kIGRvY3VtZW50YXRpb24gbWVudGlvbmluZw0KIyAg
ICBmZWF0dXJlcyBkZXJpdmVkIGZyb20gb3IgdXNlIG9mIHRoaXMgc29mdHdh
cmUgbXVzdCBkaXNwbGF5DQojICAgIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVk
Z2VtZW50Og0KIyANCiMgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNv
ZnR3YXJlIGRldmVsb3BlZCBieSBEaWdpdGFsIENyZWF0aW9ucw0KIyAgICAg
IGZvciB1c2UgaW4gdGhlIFogT2JqZWN0IFB1Ymxpc2hpbmcgRW52aXJvbm1l
bnQNCiMgICAgICAoaHR0cDovL3d3dy56b3BlLm9yZy8pLiINCiMgDQojICAg
IEluIHRoZSBldmVudCB0aGF0IHRoZSBwcm9kdWN0IGJlaW5nIGFkdmVydGlz
ZWQgaW5jbHVkZXMgYW4NCiMgICAgaW50YWN0IFpvcGUgZGlzdHJpYnV0aW9u
ICh3aXRoIGNvcHlyaWdodCBhbmQgbGljZW5zZSBpbmNsdWRlZCkNCiMgICAg
dGhlbiB0aGlzIGNsYXVzZSBpcyB3YWl2ZWQuDQojIA0KIyA1LiBOYW1lcyBh
c3NvY2lhdGVkIHdpdGggWm9wZSBvciBEaWdpdGFsIENyZWF0aW9ucyBtdXN0
IG5vdCBiZSB1c2VkIHRvDQojICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k
dWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0DQojICAg
IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBmcm9tIERpZ2l0YWwgQ3JlYXRp
b25zLg0KIyANCiMgNi4gTW9kaWZpZWQgcmVkaXN0cmlidXRpb25zIG9mIGFu
eSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4NCiMgICAgdGhlIGZvbGxv
d2luZyBhY2tub3dsZWRnbWVudDoNCiMgDQojICAgICAgIlRoaXMgcHJvZHVj
dCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgRGlnaXRhbCBDcmVh
dGlvbnMNCiMgICAgICBmb3IgdXNlIGluIHRoZSBaIE9iamVjdCBQdWJsaXNo
aW5nIEVudmlyb25tZW50DQojICAgICAgKGh0dHA6Ly93d3cuem9wZS5vcmcv
KS4iDQojIA0KIyAgICBJbnRhY3QgKHJlLSlkaXN0cmlidXRpb25zIG9mIGFu
eSBvZmZpY2lhbCBab3BlIHJlbGVhc2UgZG8gbm90DQojICAgIHJlcXVpcmUg
YW4gZXh0ZXJuYWwgYWNrbm93bGVkZ2VtZW50Lg0KIyANCiMgNy4gTW9kaWZp
Y2F0aW9ucyBhcmUgZW5jb3VyYWdlZCBidXQgbXVzdCBiZSBwYWNrYWdlZCBz
ZXBhcmF0ZWx5IGFzDQojICAgIHBhdGNoZXMgdG8gb2ZmaWNpYWwgWm9wZSBy
ZWxlYXNlcy4gIERpc3RyaWJ1dGlvbnMgdGhhdCBkbyBub3QNCiMgICAgY2xl
YXJseSBzZXBhcmF0ZSB0aGUgcGF0Y2hlcyBmcm9tIHRoZSBvcmlnaW5hbCB3
b3JrIG11c3QgYmUgY2xlYXJseQ0KIyAgICBsYWJlbGVkIGFzIHVub2ZmaWNp
YWwgZGlzdHJpYnV0aW9ucy4gIE1vZGlmaWNhdGlvbnMgd2hpY2ggZG8gbm90
DQojICAgIGNhcnJ5IHRoZSBuYW1lIFpvcGUgbWF5IGJlIHBhY2thZ2VkIGlu
IGFueSBmb3JtLCBhcyBsb25nIGFzIHRoZXkNCiMgICAgY29uZm9ybSB0byBh
bGwgb2YgdGhlIGNsYXVzZXMgYWJvdmUuDQojIA0KIyANCiMgRGlzY2xhaW1l
cg0KIyANCiMgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIERJR0lU
QUwgQ1JFQVRJT05TIGBgQVMgSVMnJyBBTkQgQU5ZDQojICAgRVhQUkVTU0VE
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQ0KIyAgIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUg0KIyAg
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBE
SUdJVEFMIENSRUFUSU9OUyBPUiBJVFMNCiMgICBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwN
CiMgICBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQojICAgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRg0KIyAgIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQNCiMgICBPTiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwNCiMgICBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQNCiMg
ICBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YNCiMgICBTVUNIIERBTUFHRS4NCiMg
DQojIA0KIyBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIGNvbnRyaWJ1dGlv
bnMgbWFkZSBieSBEaWdpdGFsIENyZWF0aW9ucyBhbmQNCiMgbWFueSBpbmRp
dmlkdWFscyBvbiBiZWhhbGYgb2YgRGlnaXRhbCBDcmVhdGlvbnMuICBTcGVj
aWZpYw0KIyBhdHRyaWJ1dGlvbnMgYXJlIGxpc3RlZCBpbiB0aGUgYWNjb21w
YW55aW5nIGNyZWRpdHMgZmlsZS4NCiMgDQojIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMNCl9fZG9jX189JycnU2VxdWVuY2UgdmFyaWFibGVz
IHN1cHBvcnQNCg0KDQokSWQ6IERUX0luU1YucHksdiAxLjE2IDE5OTkvMTEv
MDIgMTY6NTE6MzIgYnJpYW4gRXhwICQnJycNCl9fdmVyc2lvbl9fPSckUmV2
aXNpb246IDEuMTYgJCdbMTE6LTJdDQoNCmZyb20gVXNlckRpY3QgaW1wb3J0
IFVzZXJEaWN0DQpmcm9tIHN0cmluZyBpbXBvcnQgbG93ZXIsIHJmaW5kLCBz
cGxpdCwgam9pbiwgcmVwbGFjZQ0KZnJvbSBtYXRoIGltcG9ydCBzcXJ0DQpU
dXBsZVR5cGU9dHlwZSgoKSkNCnRyeToNCiAgICBpbXBvcnQgTWlzc2luZw0K
ICAgIG12PU1pc3NpbmcuVmFsdWUNCmV4Y2VwdDogbXY9Tm9uZQ0KDQpkZWYg
X3RyYW5za2V5KGtleSk6DQogICAgaWYga2V5WzoxM10gPT0gJ3NlcXVlbmNl
LXZhci0nOg0KCSMgT25seSB0cmFuc2xhdGUgdGhlIGZpcnN0IDIgJy0nIGNo
YXJhY3RlcnMgaW4gYSBzZXF1ZW5jZS12YXItDQoJcmV0dXJuIHJlcGxhY2Uo
a2V5LCctJywnXycsMikgDQogICAgZWxzZToNCglyZXR1cm4gcmVwbGFjZShr
ZXksJy0nLCdfJykNCg0KY2xhc3Mgc2VxdWVuY2Vfa3dkaWN0KFVzZXJEaWN0
KToNCiAgICAnJydUaGlzIGNsYXNzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRo
ZSBkaWN0aW9uYXJ5IGluIHNlcXVlbmNlX3ZhcmlhYmxlcw0KICAgICAgIEl0
IGR1cGxpY2F0ZXMga2V5cyBjb250YWluaW5nICctJyBjaGFyYWN0ZXJzIHRv
IGEgY29ycmVzcG9uZGluZyBlbnRyeQ0KICAgICAgIHdpdGggYSBrZXkgbWFw
cGluZyBhbGwgdGhlIGZpcnN0IHR3byAnLScgY2hhcmFjdGVycyB0byAnXycg
Y2hhcmFjdGVycy4gDQogICAgICAgVGhpcyB3aWxsIGdyZWF0bHkgaW1wcm92
ZSBEVE1MIHJlYWRhYmlsaXR5LicnJw0KDQogICAgZGVmIF9faW5pdF9fKHNl
bGYsZGF0YSk6DQoJc2VsZi5kYXRhID0gZGF0YQ0KCWZvciBpIGluIGRhdGEu
aXRlbXMoKToNCgkgICAgZGF0YVtfdHJhbnNrZXkoaVswXSldID0gaVsxXQ0K
DQogICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsa2V5LHZhbHVlKToNCglzZWxm
LmRhdGFba2V5XSA9IHZhbHVlDQoJc2VsZi5kYXRhW190cmFuc2tleShrZXkp
XSA9IHZhbHVlDQoNCiAgICBkZWYgX19kZWxpdGVtX18oc2VsZixrZXksdmFs
dWUpOg0KCWRlbCBzZWxmLmRhdGFba2V5XQ0KCWRlbCBzZWxmLmRhdGFbX3Ry
YW5za2V5KGtleSldDQoNCmNsYXNzIHNlcXVlbmNlX3ZhcmlhYmxlczoNCg0K
ICAgIGRlZiBfX2luaXRfXyhzZWxmLGl0ZW1zPU5vbmUscXVlcnlfc3RyaW5n
PScnLHN0YXJ0X25hbWVfcmU9Tm9uZSk6DQogICAgICAgIA0KICAgICAgICBz
ZWxmLml0ZW1zPWl0ZW1zDQogICAgICAgIHNlbGYucXVlcnlfc3RyaW5nPXF1
ZXJ5X3N0cmluZw0KICAgICAgICBzZWxmLnN0YXJ0X25hbWVfcmU9c3RhcnRf
bmFtZV9yZQ0KDQogICAgICAgIHNlbGYuZGF0YT1kYXRhPXNlcXVlbmNlX2t3
ZGljdCh7DQogICAgICAgICAgICAncHJldmlvdXMtc2VxdWVuY2UnOiAwLA0K
ICAgICAgICAgICAgJ25leHQtc2VxdWVuY2UnOiAwLA0KICAgICAgICAgICAg
J3NlcXVlbmNlLXN0YXJ0JzogMSwNCiAgICAgICAgICAgICdzZXF1ZW5jZS1l
bmQnOiAwLA0KICAgICAgICAgICAgfSkNCg0KDQogICAgZGVmIG51bWJlcihz
ZWxmLGluZGV4KTogcmV0dXJuIGluZGV4KzENCiAgICBkZWYgZXZlbihzZWxm
LGluZGV4KTogcmV0dXJuIGluZGV4JTIgPT0gMA0KICAgIGRlZiBvZGQoc2Vs
ZixpbmRleCk6IHJldHVybiBpbmRleCUyDQogICAgZGVmIGxldHRlcihzZWxm
LGluZGV4KTogcmV0dXJuIGNocihvcmQoJ2EnKStpbmRleCkNCiAgICBkZWYg
TGV0dGVyKHNlbGYsaW5kZXgpOiByZXR1cm4gY2hyKG9yZCgnQScpK2luZGV4
KQ0KICAgIGRlZiBrZXkoc2VsZixpbmRleCk6ICAgIHJldHVybiBzZWxmLml0
ZW1zW2luZGV4XVswXQ0KICAgIGRlZiBpdGVtKHNlbGYsaW5kZXgsIHR0PXR5
cGUoKCkpKToNCiAgICAgICAgaT1zZWxmLml0ZW1zW2luZGV4XQ0KICAgICAg
ICBpZiB0eXBlKGkpIGlzIHR0IGFuZCBsZW4oaSk9PTI6IHJldHVybiBpWzFd
DQogICAgICAgIHJldHVybiBpDQoNCiAgICBkZWYgcm9tYW4oc2VsZixpbmRl
eCk6IHJldHVybiBsb3dlcihzZWxmLlJvbWFuKGluZGV4KSkNCg0KICAgIGRl
ZiBSb21hbihzZWxmLG51bSk6DQogICAgICAgICMgRm9yY2UgbnVtYmVyIHRv
IGJlIGFuIGludGVnZXIgdmFsdWUNCiAgICAgICAgbnVtID0gaW50KG51bSkr
MQ0KDQogICAgICAgICMgSW5pdGlhbGl6ZSByb21hbiBhcyBhbiBlbXB0eSBz
dHJpbmcNCiAgICAgICAgcm9tYW4gPSAnJw0KDQogICAgICAgIHdoaWxlIG51
bSA+PSAxMDAwOg0KICAgICAgICAgICAgICAgIG51bSA9IG51bSAtIDEwMDAN
CiAgICAgICAgICAgICAgICByb21hbiA9ICclc00nICUgcm9tYW4NCg0KICAg
ICAgICB3aGlsZSBudW0gPj0gNTAwOg0KICAgICAgICAgICAgICAgIG51bSA9
IG51bSAtIDUwMA0KICAgICAgICAgICAgICAgIHJvbWFuID0gJyVzRCcgJSBy
b21hbg0KDQogICAgICAgIHdoaWxlIG51bSA+PSAxMDA6DQogICAgICAgICAg
ICAgICAgbnVtID0gbnVtIC0gMTAwDQogICAgICAgICAgICAgICAgcm9tYW4g
PSAnJXNDJyAlIHJvbWFuDQoNCiAgICAgICAgd2hpbGUgbnVtID49IDUwOg0K
ICAgICAgICAgICAgICAgIG51bSA9IG51bSAtIDUwDQogICAgICAgICAgICAg
ICAgcm9tYW4gPSAnJXNMJyAlIHJvbWFuDQoNCiAgICAgICAgd2hpbGUgbnVt
ID49IDEwOg0KICAgICAgICAgICAgICAgIG51bSA9IG51bSAtIDEwDQogICAg
ICAgICAgICAgICAgcm9tYW4gPSAnJXNYJyAlIHJvbWFuICAgICAgICAgICAg
ICAgICANCg0KICAgICAgICB3aGlsZSBudW0gPj0gNToNCiAgICAgICAgICAg
ICAgICBudW0gPSBudW0gLSA1DQogICAgICAgICAgICAgICAgcm9tYW4gPSAn
JXNWJyAlIHJvbWFuDQoNCiAgICAgICAgd2hpbGUgbnVtIDwgNSBhbmQgbnVt
ID49IDE6DQogICAgICAgICAgICAgICAgbnVtID0gbnVtIC0gMQ0KICAgICAg
ICAgICAgICAgIHJvbWFuID0gJyVzSScgJSByb21hbg0KDQogICAgICAgICMg
UmVwbGFjZXMgc3BlY2lhbCBjYXNlcyBpbiBSb21hbiBOdW1lcmFscw0KICAg
ICAgICANCiAgICAgICAgcm9tYW4gPSBzdWIoJ0RDQ0NDJywgJ0NNJywgcm9t
YW4pDQogICAgICAgIHJvbWFuID0gc3ViKCdDQ0NDJywgJ0NEJywgcm9tYW4p
DQogICAgICAgIHJvbWFuID0gc3ViKCdMWFhYWCcsICdYQycsIHJvbWFuKQ0K
ICAgICAgICByb21hbiA9IHN1YignWFhYWCcsICdYTCcsIHJvbWFuKQ0KICAg
ICAgICByb21hbiA9IHN1YignVklJSUknLCAnSVgnLCByb21hbikNCiAgICAg
ICAgcm9tYW4gPSBzdWIoJ0lJSUknLCAnSVYnLCByb21hbikNCg0KICAgICAg
ICByZXR1cm4gcm9tYW4NCg0KDQogICAgZGVmIHZhbHVlKHNlbGYsaW5kZXgs
bmFtZSk6DQogICAgICAgIGRhdGE9c2VsZi5kYXRhDQogICAgICAgIGl0ZW09
c2VsZi5pdGVtc1tpbmRleF0NCiAgICAgICAgaWYgdHlwZShpdGVtKT09VHVw
bGVUeXBlIGFuZCBsZW4oaXRlbSk9PTI6DQogICAgICAgICAgICBpdGVtPWl0
ZW1bMV0NCiAgICAgICAgaWYgZGF0YVsnbWFwcGluZyddOiByZXR1cm4gaXRl
bVtuYW1lXQ0KICAgICAgICByZXR1cm4gZ2V0YXR0cihpdGVtLG5hbWUpDQoN
CiAgICBkZWYgZmlyc3Qoc2VsZixuYW1lLGtleT0nJyk6DQogICAgICAgIGRh
dGE9c2VsZi5kYXRhDQogICAgICAgIGlmIGRhdGFbJ3NlcXVlbmNlLXN0YXJ0
J106IHJldHVybiAxDQogICAgICAgIGluZGV4PWRhdGFbJ3NlcXVlbmNlLWlu
ZGV4J10NCiAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUoaW5kZXgsbmFtZSkg
IT0gc2VsZi52YWx1ZShpbmRleC0xLG5hbWUpDQoNCiAgICBkZWYgbGFzdChz
ZWxmLG5hbWUsa2V5PScnKToNCiAgICAgICAgZGF0YT1zZWxmLmRhdGENCiAg
ICAgICAgaWYgZGF0YVsnc2VxdWVuY2UtZW5kJ106IHJldHVybiAxDQogICAg
ICAgIGluZGV4PWRhdGFbJ3NlcXVlbmNlLWluZGV4J10NCiAgICAgICAgcmV0
dXJuIHNlbGYudmFsdWUoaW5kZXgsbmFtZSkgIT0gc2VsZi52YWx1ZShpbmRl
eCsxLG5hbWUpDQoNCiAgICBkZWYgbGVuZ3RoKHNlbGYsIGlnbm9yZWQpOg0K
ICAgICAgICBsPXNlbGYuZGF0YVsnc2VxdWVuY2UtbGVuZ3RoJ109bGVuKHNl
bGYuaXRlbXMpDQogICAgICAgIHJldHVybiBsDQoNCiAgICBkZWYgcXVlcnko
c2VsZiwgKmlnbm9yZWQpOg0KICAgICAgICBpZiBzZWxmLnN0YXJ0X25hbWVf
cmUgaXMgTm9uZTogcmFpc2UgS2V5RXJyb3IsICdzZXF1ZW5jZS1xdWVyeScN
CiAgICAgICAgcXVlcnlfc3RyaW5nPXNlbGYucXVlcnlfc3RyaW5nDQogICAg
ICAgIHdoaWxlIHF1ZXJ5X3N0cmluZyBhbmQgcXVlcnlfc3RyaW5nWzoxXSBp
biAnPyYnOg0KICAgICAgICAgICAgcXVlcnlfc3RyaW5nPXF1ZXJ5X3N0cmlu
Z1sxOl0NCiAgICAgICAgd2hpbGUgcXVlcnlfc3RyaW5nWy0xOl0gPT0gJyYn
Og0KICAgICAgICAgICAgcXVlcnlfc3RyaW5nPXF1ZXJ5X3N0cmluZ1s6LTFd
DQogICAgICAgIGlmIHF1ZXJ5X3N0cmluZzoNCiAgICAgICAgICAgIHF1ZXJ5
X3N0cmluZz0nJiVzJicgJSBxdWVyeV9zdHJpbmcgICAgICAgICAgICAgICAg
ICANCiAgICAgICAgICAgIHJlPXNlbGYuc3RhcnRfbmFtZV9yZQ0KICAgICAg
ICAgICAgbD1yZS5zZWFyY2hfZ3JvdXAocXVlcnlfc3RyaW5nLCAoMCwpKQ0K
ICAgICAgICAgICAgaWYgbDoNCiAgICAgICAgICAgICAgICB2PWxbMV0NCiAg
ICAgICAgICAgICAgICBsPWxbMF0NCiAgICAgICAgICAgICAgICBxdWVyeV9z
dHJpbmc9KHF1ZXJ5X3N0cmluZ1s6bF0rDQogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBxdWVyeV9zdHJpbmdbbCtsZW4odiktMTpdKQ0KICAgICAg
ICAgICAgcXVlcnlfc3RyaW5nPSc/JytxdWVyeV9zdHJpbmdbMTpdDQogICAg
ICAgIGVsc2U6IHF1ZXJ5X3N0cmluZz0nPycNCiAgICAgICAgc2VsZi5kYXRh
WydzZXF1ZW5jZS1xdWVyeSddPXF1ZXJ5X3N0cmluZw0KICAgICAgICByZXR1
cm4gcXVlcnlfc3RyaW5nDQogICAgICAgIA0KDQogICAgc3RhdGlzdGljX25h
bWVzPSgNCiAgICAgICAgJ3RvdGFsJywgJ2NvdW50JywgJ21pbicsICdtYXgn
LCAnbWVkaWFuJywgJ21lYW4nLA0KICAgICAgICAndmFyaWFuY2UnLCAndmFy
aWFuY2UtbicsJ3N0YW5kYXJkLWRldmlhdGlvbicsICdzdGFuZGFyZC1kZXZp
YXRpb24tbicsDQogICAgICAgICkNCg0KICAgIGRlZiBzdGF0aXN0aWNzKHNl
bGYsbmFtZSxrZXkpOg0KICAgICAgICBpdGVtcz1zZWxmLml0ZW1zDQogICAg
ICAgIGRhdGE9c2VsZi5kYXRhDQogICAgICAgIG1hcHBpbmc9ZGF0YVsnbWFw
cGluZyddDQogICAgICAgIGNvdW50PXN1bT1zdW1zcT0wDQogICAgICAgIG1p
bj1tYXg9Tm9uZQ0KICAgICAgICBzY291bnQ9c21pbj1zbWF4PU5vbmUNCiAg
ICAgICAgdmFsdWVzPVtdDQogICAgICAgIHN2YWx1ZXM9W10NCiAgICAgICAg
Zm9yIGl0ZW0gaW4gaXRlbXM6DQogICAgICAgICAgICB0cnk6DQogICAgICAg
ICAgICAgICAgaWYgbWFwcGluZzogaXRlbT1pdGVtW25hbWVdDQogICAgICAg
ICAgICAgICAgZWxzZTogaXRlbT1nZXRhdHRyKGl0ZW0sbmFtZSkNCiAgICAg
ICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIGlmIGl0ZW0g
aXMgbXY6DQogICAgICAgICAgICAgICAgICAgICAgICBpdGVtID0gTm9uZQ0K
ICAgICAgICAgICAgICAgICAgICBzPWl0ZW0qaXRlbQ0KICAgICAgICAgICAg
ICAgICAgICBzdW09c3VtK2l0ZW0NCiAgICAgICAgICAgICAgICAgICAgc3Vt
c3E9c3Vtc3Ercw0KICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuYXBwZW5k
KGl0ZW0pDQogICAgICAgICAgICAgICAgICAgIGlmIG1pbiBpcyBOb25lOg0K
ICAgICAgICAgICAgICAgICAgICAgICAgbWluPW1heD1pdGVtDQogICAgICAg
ICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICBp
ZiBpdGVtIDwgbWluOiBtaW49aXRlbQ0KICAgICAgICAgICAgICAgICAgICAg
ICAgaWYgaXRlbSA+IG1heDogbWF4PWl0ZW0NCiAgICAgICAgICAgICAgICBl
eGNlcHQ6DQogICAgICAgICAgICAgICAgICAgIGlmIGl0ZW0gaXMgbm90IE5v
bmUgYW5kIGl0ZW0gaXMgbm90IG12Og0KICAgICAgICAgICAgICAgICAgICAg
ICAgaWYgc21pbiBpcyBOb25lOiBzbWluPXNtYXg9aXRlbQ0KICAgICAgICAg
ICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBpZiBpdGVtIDwgc21pbjogc21pbj1pdGVtDQogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgaXRlbSA+IHNtYXg6IHNtYXg9aXRlbQ0KICAg
ICAgICAgICAgICAgICAgICAgICAgc3ZhbHVlcy5hcHBlbmQoaXRlbSkNCiAg
ICAgICAgICAgIGV4Y2VwdDogcGFzcw0KDQogICAgICAgICMgSW5pdGlhbGl6
ZSBhbGwgc3RhdHMgdG8gZW1wdHkgc3RyaW5nczoNCiAgICAgICAgZm9yIHN0
YXQgaW4gc2VsZi5zdGF0aXN0aWNfbmFtZXM6IGRhdGFbJyVzLSVzJyAlIChz
dGF0LG5hbWUpXT0nJw0KDQogICAgICAgIGNvdW50PWxlbih2YWx1ZXMpDQog
ICAgICAgIHRyeTogIyBOdW1lcmljIHN0YXRpc3RpY3MNCiAgICAgICAgICAg
IG49ZmxvYXQoY291bnQpDQogICAgICAgICAgICBtZWFuPXN1bS9uDQogICAg
ICAgICAgICBzdW1zcT1zdW1zcS9uIC0gbWVhbiptZWFuDQogICAgICAgICAg
ICBkYXRhWydtZWFuLSVzJyAlIG5hbWVdPW1lYW4NCiAgICAgICAgICAgIGRh
dGFbJ3RvdGFsLSVzJyAlIG5hbWVdPXN1bQ0KICAgICAgICAgICAgZGF0YVsn
dmFyaWFuY2Utbi0lcycgJSBuYW1lXT1zdW1zcQ0KICAgICAgICAgICAgZGF0
YVsnc3RhbmRhcmQtZGV2aWF0aW9uLW4tJXMnICUgbmFtZV09c3FydChzdW1z
cSkNCiAgICAgICAgICAgIGlmIGNvdW50ID4gMToNCiAgICAgICAgICAgICAg
ICBzdW1zcT1zdW1zcSpuLyhuLTEpDQogICAgICAgICAgICAgICAgZGF0YVsn
dmFyaWFuY2UtJXMnICUgbmFtZV09c3Vtc3ENCiAgICAgICAgICAgICAgICBk
YXRhWydzdGFuZGFyZC1kZXZpYXRpb24tJXMnICUgbmFtZV09c3FydChzdW1z
cSkgICAgICAgICAgICANCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAg
ICAgICAgZGF0YVsndmFyaWFuY2UtJXMnICUgbmFtZV09JycNCiAgICAgICAg
ICAgICAgICBkYXRhWydzdGFuZGFyZC1kZXZpYXRpb24tJXMnICUgbmFtZV09
JycNCiAgICAgICAgZXhjZXB0Og0KICAgICAgICAgICAgaWYgbWluIGlzIE5v
bmU6IG1pbixtYXgsdmFsdWVzPXNtaW4sc21heCxzdmFsdWVzDQogICAgICAg
ICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIGlmIHNtaW4gPCBtaW46IG1p
bj1zbWluDQogICAgICAgICAgICAgICAgaWYgc21heCA+IG1heDogbWF4PXNt
YXgNCiAgICAgICAgICAgICAgICB2YWx1ZXM9dmFsdWVzK3N2YWx1ZXMNCiAg
ICAgICAgICAgIGNvdW50PWxlbih2YWx1ZXMpDQoNCiAgICAgICAgZGF0YVsn
Y291bnQtJXMnICUgbmFtZV09Y291bnQNCiAgICAgICAgIyBkYXRhWydfdmFs
dWVzJ109dmFsdWVzDQogICAgICAgIGlmIG1pbiBpcyBub3QgTm9uZToNCiAg
ICAgICAgICAgIGRhdGFbJ21pbi0lcycgJSBuYW1lXT1taW4NCiAgICAgICAg
ICAgIGRhdGFbJ21heC0lcycgJSBuYW1lXT1tYXgNCiAgICAgICAgICAgIHZh
bHVlcy5zb3J0KCkNCiAgICAgICAgICAgIGlmIGNvdW50PT0xOg0KICAgICAg
ICAgICAgICAgIGRhdGFbJ21lZGlhbi0lcycgJSBuYW1lXT1taW4NCiAgICAg
ICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgbj1jb3VudCsxDQogICAg
ICAgICAgICAgICAgaWYgbi8yKjI9PW46IGRhdGFbJ21lZGlhbi0lcycgJSBu
YW1lXT12YWx1ZXNbbi8yLTFdDQogICAgICAgICAgICAgICAgZWxzZToNCiAg
ICAgICAgICAgICAgICAgICAgbj1uLzINCiAgICAgICAgICAgICAgICAgICAg
dHJ5OiBkYXRhWydtZWRpYW4tJXMnICUgbmFtZV09KHZhbHVlc1tuXSt2YWx1
ZXNbbi0xXSkvMg0KICAgICAgICAgICAgICAgICAgICBleGNlcHQ6DQogICAg
ICAgICAgICAgICAgICAgICAgICB0cnk6IGRhdGFbJ21lZGlhbi0lcycgJSBu
YW1lXT0oDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgImJldHdlZW4g
JXMgYW5kICVzIiAlICh2YWx1ZXNbbl0sdmFsdWVzW24tMV0pKQ0KICAgICAg
ICAgICAgICAgICAgICAgICAgZXhjZXB0OiBwYXNzDQoNCiAgICAgICAgcmV0
dXJuIGRhdGFba2V5XQ0KDQogICAgZGVmIG5leHRfYmF0Y2hlcyhzZWxmLCBz
dWZmaXg9J2JhdGNoZXMnLGtleT0nJyk6DQogICAgICAgIGlmIHN1ZmZpeCAh
PSAnYmF0Y2hlcyc6IHJhaXNlIEtleUVycm9yLCBrZXkNCiAgICAgICAgZGF0
YT1zZWxmLmRhdGENCiAgICAgICAgc2VxdWVuY2U9c2VsZi5pdGVtcw0KICAg
ICAgICB0cnk6DQogICAgICAgICAgICBpZiBub3QgZGF0YVsnbmV4dC1zZXF1
ZW5jZSddOiByZXR1cm4gKCkNCiAgICAgICAgICAgIHN6PWRhdGFbJ3NlcXVl
bmNlLXN0ZXAtc2l6ZSddDQogICAgICAgICAgICBzdGFydD1kYXRhWydzZXF1
ZW5jZS1zdGVwLXN0YXJ0J10NCiAgICAgICAgICAgIGVuZD1kYXRhWydzZXF1
ZW5jZS1zdGVwLWVuZCddDQogICAgICAgICAgICBsPWxlbihzZXF1ZW5jZSkN
CiAgICAgICAgICAgIG9ycGhhbj1kYXRhWydzZXF1ZW5jZS1zdGVwLW9ycGhh
biddDQogICAgICAgICAgICBvdmVybGFwPWRhdGFbJ3NlcXVlbmNlLXN0ZXAt
b3ZlcmxhcCddDQogICAgICAgIGV4Y2VwdDogQXR0cmlidXRlRXJyb3IsICdu
ZXh0LWJhdGNoZXMnDQogICAgICAgIHI9W10NCiAgICAgICAgd2hpbGUgZW5k
IDwgbDoNCiAgICAgICAgICAgIHN0YXJ0LGVuZCxzcGFtPW9wdChlbmQrMS1v
dmVybGFwLDAsc3osb3JwaGFuLHNlcXVlbmNlKQ0KICAgICAgICAgICAgdj1z
ZXF1ZW5jZV92YXJpYWJsZXMoc2VsZi5pdGVtcywNCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHNlbGYucXVlcnlfc3RyaW5nLHNlbGYuc3Rh
cnRfbmFtZV9yZSkNCiAgICAgICAgICAgIGQ9di5kYXRhDQogICAgICAgICAg
ICBkWydiYXRjaC1zdGFydC1pbmRleCddPXN0YXJ0LTENCiAgICAgICAgICAg
IGRbJ2JhdGNoLWVuZC1pbmRleCddPWVuZC0xDQogICAgICAgICAgICBkWydi
YXRjaC1zaXplJ109ZW5kKzEtc3RhcnQNCiAgICAgICAgICAgIGRbJ21hcHBp
bmcnXT1kYXRhWydtYXBwaW5nJ10NCiAgICAgICAgICAgIHIuYXBwZW5kKHYp
DQogICAgICAgIGRhdGFbJ25leHQtYmF0Y2hlcyddPXINCiAgICAgICAgcmV0
dXJuIHINCg0KICAgIGRlZiBwcmV2aW91c19iYXRjaGVzKHNlbGYsIHN1ZmZp
eD0nYmF0Y2hlcycsa2V5PScnKToNCiAgICAgICAgaWYgc3VmZml4ICE9ICdi
YXRjaGVzJzogcmFpc2UgS2V5RXJyb3IsIGtleQ0KICAgICAgICBkYXRhPXNl
bGYuZGF0YQ0KICAgICAgICBzZXF1ZW5jZT1zZWxmLml0ZW1zDQogICAgICAg
IHRyeToNCiAgICAgICAgICAgIGlmIG5vdCBkYXRhWydwcmV2aW91cy1zZXF1
ZW5jZSddOiByZXR1cm4gKCkNCiAgICAgICAgICAgIHN6PWRhdGFbJ3NlcXVl
bmNlLXN0ZXAtc2l6ZSddDQogICAgICAgICAgICBzdGFydD1kYXRhWydzZXF1
ZW5jZS1zdGVwLXN0YXJ0J10NCiAgICAgICAgICAgIGVuZD1kYXRhWydzZXF1
ZW5jZS1zdGVwLWVuZCddDQogICAgICAgICAgICBsPWxlbihzZXF1ZW5jZSkN
CiAgICAgICAgICAgIG9ycGhhbj1kYXRhWydzZXF1ZW5jZS1zdGVwLW9ycGhh
biddDQogICAgICAgICAgICBvdmVybGFwPWRhdGFbJ3NlcXVlbmNlLXN0ZXAt
b3ZlcmxhcCddDQogICAgICAgIGV4Y2VwdDogQXR0cmlidXRlRXJyb3IsICdw
cmV2aW91cy1iYXRjaGVzJw0KICAgICAgICByPVtdDQogICAgICAgIHdoaWxl
IHN0YXJ0ID4gMToNCiAgICAgICAgICAgIHN0YXJ0LGVuZCxzcGFtPW9wdCgw
LHN0YXJ0LTErb3ZlcmxhcCxzeixvcnBoYW4sc2VxdWVuY2UpDQogICAgICAg
ICAgICB2PXNlcXVlbmNlX3ZhcmlhYmxlcyhzZWxmLml0ZW1zLA0KICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWVyeV9zdHJpbmcs
c2VsZi5zdGFydF9uYW1lX3JlKQ0KICAgICAgICAgICAgZD12LmRhdGENCiAg
ICAgICAgICAgIGRbJ2JhdGNoLXN0YXJ0LWluZGV4J109c3RhcnQtMQ0KICAg
ICAgICAgICAgZFsnYmF0Y2gtZW5kLWluZGV4J109ZW5kLTENCiAgICAgICAg
ICAgIGRbJ2JhdGNoLXNpemUnXT1lbmQrMS1zdGFydA0KICAgICAgICAgICAg
ZFsnbWFwcGluZyddPWRhdGFbJ21hcHBpbmcnXQ0KICAgICAgICAgICAgci5h
cHBlbmQodikNCiAgICAgICAgci5yZXZlcnNlKCkNCiAgICAgICAgZGF0YVsn
cHJldmlvdXMtYmF0Y2hlcyddPXINCiAgICAgICAgcmV0dXJuIHINCg0KDQog
ICAgc3BlY2lhbF9wcmVmaXhlcz17DQogICAgICAgICdmaXJzdCc6IGZpcnN0
LA0KICAgICAgICAnbGFzdCc6IGxhc3QsDQogICAgICAgICdwcmV2aW91cyc6
IHByZXZpb3VzX2JhdGNoZXMsDQogICAgICAgICduZXh0JzogbmV4dF9iYXRj
aGVzLA0KICAgICAgICAjIFRoZXNlIHR3byBhcmUgZm9yIGJhY2t3YXJkIGNv
bXBhdGFiaWxpdHkgd2l0aCBhIG1pc3NmZWF0dXJlOg0KICAgICAgICAnc2Vx
dWVuY2UtaW5kZXgnOiBsYW1iZGEgc2VsZiwgc3VmZml4LCBrZXk6IHNlbGZb
J3NlcXVlbmNlLScrc3VmZml4XSwNCiAgICAgICAgJ3NlcXVlbmNlLWluZGV4
LWlzJzogbGFtYmRhIHNlbGYsIHN1ZmZpeCwga2V5OiBzZWxmWydzZXF1ZW5j
ZS0nK3N1ZmZpeF0sDQogICAgICAgIH0NCiAgICBmb3IgbiBpbiBzdGF0aXN0
aWNfbmFtZXM6IHNwZWNpYWxfcHJlZml4ZXNbbl09c3RhdGlzdGljcw0KDQog
ICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsa2V5LA0KICAgICAgICAgICAgICAg
ICAgICBzcGVjaWFsX3ByZWZpeGVzPXNwZWNpYWxfcHJlZml4ZXMsDQogICAg
ICAgICAgICAgICAgICAgIHNwZWNpYWxfcHJlZml4PXNwZWNpYWxfcHJlZml4
ZXMuaGFzX2tleQ0KICAgICAgICAgICAgICAgICAgICApOg0KICAgICAgICBk
YXRhPXNlbGYuZGF0YQ0KICAgICAgICBpZiBkYXRhLmhhc19rZXkoa2V5KTog
cmV0dXJuIGRhdGFba2V5XQ0KDQogICAgICAgIGw9cmZpbmQoa2V5LCctJykN
CiAgICAgICAgaWYgbCA8IDA6IHJhaXNlIEtleUVycm9yLCBrZXkNCg0KICAg
ICAgICBzdWZmaXg9a2V5W2wrMTpdDQogICAgICAgIHByZWZpeD1rZXlbOmxd
DQoNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCBzdWZmaXgpOg0KICAgICAg
ICAgICAgdHJ5OiB2PWRhdGFbcHJlZml4KyctaW5kZXgnXQ0KICAgICAgICAg
ICAgZXhjZXB0OiBwYXNzDQogICAgICAgICAgICBlbHNlOiByZXR1cm4gZ2V0
YXR0cihzZWxmLHN1ZmZpeCkodikNCg0KICAgICAgICBpZiBzcGVjaWFsX3By
ZWZpeChwcmVmaXgpOg0KICAgICAgICAgICAgcmV0dXJuIHNwZWNpYWxfcHJl
Zml4ZXNbcHJlZml4XShzZWxmLCBzdWZmaXgsIGtleSkNCg0KICAgICAgICBp
ZiBwcmVmaXhbLTQ6XT09Jy12YXInOg0KICAgICAgICAgICAgcHJlZml4PXBy
ZWZpeFs6LTRdDQogICAgICAgICAgICB0cnk6IHJldHVybiBzZWxmLnZhbHVl
KGRhdGFbcHJlZml4KyctaW5kZXgnXSxzdWZmaXgpDQogICAgICAgICAgICBl
eGNlcHQ6IHBhc3MNCg0KICAgICAgICBpZiBrZXk9PSdzZXF1ZW5jZS1xdWVy
eSc6IHJldHVybiBzZWxmLnF1ZXJ5KCkNCiAgICAgICAgICAgIA0KICAgICAg
ICByYWlzZSBLZXlFcnJvciwga2V5DQoNCg0KZGVmIHN1YihzMSwgczIsIHNy
Yyk6DQogICAgcmV0dXJuIGpvaW4oc3BsaXQoc3JjLCBzMSksIHMyKQ0KDQpk
ZWYgb3B0KHN0YXJ0LGVuZCxzaXplLG9ycGhhbixzZXF1ZW5jZSk6DQogICAg
aWYgc2l6ZSA8IDE6DQogICAgICAgIGlmIHN0YXJ0ID4gMCBhbmQgZW5kID4g
MCBhbmQgZW5kID49IHN0YXJ0Og0KICAgICAgICAgICAgc2l6ZT1lbmQrMS1z
dGFydA0KICAgICAgICBlbHNlOiBzaXplPTcNCg0KICAgIGlmIHN0YXJ0ID4g
MDoNCg0KICAgICAgICB0cnk6IHNlcXVlbmNlW3N0YXJ0LTFdDQogICAgICAg
IGV4Y2VwdDogc3RhcnQ9bGVuKHNlcXVlbmNlKQ0KICAgICAgICAjIGlmIHN0
YXJ0ID4gbDogc3RhcnQ9bA0KDQogICAgICAgIGlmIGVuZCA+IDA6DQogICAg
ICAgICAgICBpZiBlbmQgPCBzdGFydDogZW5kPXN0YXJ0DQogICAgICAgIGVs
c2U6DQogICAgICAgICAgICBlbmQ9c3RhcnQrc2l6ZS0xDQogICAgICAgICAg
ICB0cnk6IHNlcXVlbmNlW2VuZCtvcnBoYW4tMV0NCiAgICAgICAgICAgIGV4
Y2VwdDogZW5kPWxlbihzZXF1ZW5jZSkNCiAgICAgICAgICAgICMgaWYgbCAt
IGVuZCA8IG9ycGhhbjogZW5kPWwNCiAgICBlbGlmIGVuZCA+IDA6DQogICAg
ICAgIHRyeTogc2VxdWVuY2VbZW5kLTFdDQogICAgICAgIGV4Y2VwdDogZW5k
PWxlbihzZXF1ZW5jZSkNCiAgICAgICAgIyBpZiBlbmQgPiBsOiBlbmQ9bA0K
ICAgICAgICBzdGFydD1lbmQrMS1zaXplDQogICAgICAgIGlmIHN0YXJ0IC0g
MSA8IG9ycGhhbjogc3RhcnQ9MQ0KICAgIGVsc2U6DQogICAgICAgIHN0YXJ0
PTENCiAgICAgICAgZW5kPXN0YXJ0K3NpemUtMQ0KICAgICAgICB0cnk6IHNl
cXVlbmNlW2VuZCtvcnBoYW4tMV0NCiAgICAgICAgZXhjZXB0OiBlbmQ9bGVu
KHNlcXVlbmNlKQ0KICAgICAgICAjIGlmIGwgLSBlbmQgPCBvcnBoYW46IGVu
ZD1sDQogICAgcmV0dXJuIHN0YXJ0LGVuZCxzaXplDQo=
---559023410-1053718679-942384997=:10674--