diff --git a/config/crd/bases/velero.io_backupstoragelocations.yaml b/config/crd/bases/velero.io_backupstoragelocations.yaml index 52c9d640d..b0c39196e 100644 --- a/config/crd/bases/velero.io_backupstoragelocations.yaml +++ b/config/crd/bases/velero.io_backupstoragelocations.yaml @@ -87,6 +87,24 @@ spec: type: string description: Config is for provider-specific configuration fields. type: object + credential: + description: Credential contain the credential information intended + to be used with this location + properties: + key: + description: The key of the secret to select from. Must be a valid + secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must be defined + type: boolean + required: + - key + type: object default: description: Default indicates this location is the default backup storage location. diff --git a/config/crd/crds/crds.go b/config/crd/crds/crds.go index c7ff324a2..77e858784 100644 --- a/config/crd/crds/crds.go +++ b/config/crd/crds/crds.go @@ -30,7 +30,7 @@ import ( var rawCRDs = [][]byte{ []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xec\\\xbcp\x99n\xe0\xb64V\xe5_ШR'\xf8\t3.\xb9\xe5J^\xe4hY\xca,\xdb\\\x000)\x95e\xee\xb3q\xff\x02$JZ\xad\x84@\xbdڣ\\\xbf\x94;ܕ\\\xa4\xa8i\x868\xff\xf1O\xeb?\xaf\xfft\x01\x90h\xa4\xe1O\xa2@\xad\xd6\\]\x98\x02\x13\x9a:M\t\x1f&\x1e4\x97\x16\xf5\xad\x12e\xee\xf1X\xc1\u007f>\xfez\xff\xc0\xeca\x03kc\x99-ͺ80\x83\x84c\x8a&Ѽ\xb0\x84\xc9O4\x01\xf8N`\xca\xe4\x00\xcc\xc0V>h\xb5\xd7h\xccͭ\xca\v\x81\x16S\x1a\xeb\xb1z\xa4\xde\xf4\xc1\x9e\n܀\xb1\x9a\xcb\xfd\xc8̨\xb5Ҧ?\xf5\xad*\xa5\x05\x95\x01\x13\x02\xa8\x13\xe4h\fۣ\x01{`\x16^Q#\xecQ\xa2f\x16SHK7\t\xe0\x1b&%q\x02\xa8\xa9\f쁛@\xaa\x06\x96w\xf5\xbc\x1eKG\xa6=\xea\x114_\x99\x96\\\xee\xe7\x10\r\xdd\xde\x17\xd5\xffnν\x04Yc\x99\xb6\x95\xd0\xf4Qv?\xc1\xeb\x01esBxe\x06hd\x8b\x9b\xb7N\x06\xc3\x17?w\xca,\xf6&.0Y\x1b\xab4\xdb\xe3g\x95\xb0jY\xady\xefY\x8e~\x99\x18E\xebя\x818ȡ\xa5\xb1\x85\x979\xa8R\xa4\xb0Cp\x13tD\xad=zV\xe8\xa2z\xae{\xaaՀ\xfaq\x8f\xfd\xe5\xee\xb5*\x8b\rԪ\xe6{\a\xcd\xf6V᧚s\x82\x1b\xfbK\xe3\xe3gn,\xfdP\x88R3Q\xe9.}3\\\xeeK\xc1\xf4\xa6\xe6}\xa1Ѡ>\xe2_\xe4\x8bT\xaf\xf2g\x8e\"5\x1bȘ =5\x89r\xb89\x82\x9a\x82%D\x14S\xeet0Hf\x03\u007f\xfb\xfb\x05\xc0\x91\t\x9e\xd2:=\x9a\xaa@\xf9\xf1a\xfb\xfc\xe7\xc7\xe4\x809\xdb\x04\xc9\x1b\xd2yn\x80\xc13\xad\x16\"X/\xcd\x1a\t9i\r12a\x85-5\xf1\xf5\x97r\x87Z\xa2E\x13\x00\x03$\xa24\x165\x99\x10\x04f\x81A\xa1\xb8\xb4\xc0%X'\x86\u007f\xf8\xf8\xb0\x05\xb5\xfb+&\xd6\x00\x93)0cT\xc2IQ\x8e\xceh\xa1\x1f\xfb\xc7u\x80YhU\xa0\xb6<\x92\u07b5\x86\xf5\xae\xbeu\x96u\xe5\xd6\xed\xfb@\xea\xec5z\xf4\x83\xd5\xc5\x14\fѤR\xc3j\x99\xac\xa1\xa3\x95\xa62\x19\x90^ã\xe3\x936QN\x13%\x8f\xa8\x1d\x99\x12\xb5\x97\xfc\xff+\xc8\x06\xac\xa2)\x05\xb3\x18\xa4!6\xb2ђ\tDZ\x12\xaf\x89\x109;\x81F7\a\x94\xb2\x01\x8d\xba\x985\xfc\x97\xd2\b\\fj\x03\ak\v\xb3\xb9\xb9\xd9s\x1b\xfdU\xa2\xf2\xbc\x94ܞn\xc8\xeb\xf0]i\x9567)\x1eQ\xdc\x18\xbe_1\x9d\x1c\xb8\xc5\xc41\xef\x86\x15|E\x88KrW\xeb<\xfd\xb7J\x96\xae\x1a\x98vt\xcb7\x12\xfeQ\xba;-\xf0\xd2\xe4\x87y\xfck\xf2\xbaO\x8e*_\xee\x1e\x9f\x9a\x92\xc6M\x9b\xe6D\xed\x86\xf0Մw\x84\xe22C\xed\x19\x97i\x95\x13D\x94\xa9\x975\x12S\xc1Q\xb6\x89n\xca]έ\xe3\xf4\xff\x95h\x9c8\xab5ܒ\xd7v֦,\x9c\xea\xa7k\xd8J\xb8e9\x8a[f\xf0\x9fNvGa\xb3r$\x9d'|3\xd8hw\xf4Ԫ>ǰ`\x90C^\xe1\x1f\vLZ\x8a\xe1\xc6\xf0\x8c\a\xb3\x9c)]\xdb\x03o\xa5\xd6\r\x80CJ\xe9'\xcaX)\xec3)\xb2yR_\xd0X\x9e\xb4\xfbt\xd0\xf948$\xa2\x83\xc6y\b{@\xedd\x85~ \xb5\xeb@\x04b\xa0\xc1\x94t\x8e\xbd \xb0\xe8N\x82\xa7.T\xb4/\x06v\xa7\x88\xe8\xba\x03\xc7Ss\xa7\x94@ֶ\x01\xf8\x96\x882Ŵ2\xc1frUw\xbd\xee\x14\r2.\x9df8o\xe1\x10\x93\xf5\xafdj\x99\xc6\xde\u009ctr顑\x15=\xe0\x00C\\\xe3\x16\xf3\x1eV#\xa2\x14`\x97B\xb0\x9d\xc0\rX]v\xa7\xf6\xe3\x98\xd6\xec4H\x89/\x95\xf3YB\x88\xaaw\xb0\r\x82'\xe4C*\v@\xb4\xf8\r\x91\xe1\xa0\xd4\xcb\xf4\xd2\xff\xc3\xf5\xa8-\x18$\xb4\x89\x80\x1d\x1eؑ+\x1d\x16[\x87;>@ľl3\v)\xcf2\xd4\x0e\n\x85\xee&\x86U\xc3$\x18SO\xd7\xf4\x18\xdbz\xf8\xd7,c\x1a\xfdz\xc7P\xf6ѥC\xa6O]\xdf\\\x88!S~\xe4i\xc9\x04pi,\x93\x89_\a\xabp\xea\xae\x03\xc6\xd9\xd9\xc3֛\xb5\x88\xb3\xa3}\xcb\xc4)\x89\xe0\xf6\x14Κ\xf7\xbb\x9aA\xf80\xba\xdc\x1ds\xb6Fy1ԥ@\x13&J\xc9r\xd6z}=\x02\xb8\xe2\x82\xf7\xfd\x82\xedP\x80A\x81\x89Uz\x88\f\xd3L\xf5m\xdeF\x8d\xd0n\xc0Z\xd5\xf6\xd7-\xb1i\xa8\xd4(L\x80\xd7\x03O\x0e\xde-;y!(\x90*4\xa4\xbf\xac(\xc4ixq0\xcdi\xdf&T\xb8n\x93\xca܅\xd5W\xeb\xba\xcdڹ\xba\xcdX\xbc6-+\xd6\xff~H\x19\r\xf7ق\xb9\xed\r|O\xc1tD\xe4.\xb4\xdef\x80yaO\xd7\xc0m\xfc\xea\"\tFɗQ\xf2Ts\xff\xe6\x18q\xaeLo\xbb\xe3\xdeQ\xa6\xbf\x91\v\xd5Կ\x19&\x90\xb1\u007f\f\xb6~!\x03>7\xc7\\\x03\xcf*\x06\xa4אqaQw81\xb5\\5͉o%\xc1\xbc\xa7r-g69ܽ\xb9\xe8\xc8\xd49\xd3E\xd4\xe8\x0e\xf51e\x8c\xaa\xdb\xcet\x12*\xd0f\x90k\xcc\xfd\x16\xf3\x89(X\u007f\xa1\xc8\xe7\xe3\xfd'Llj\x02K$\xac\xb7\x84\x8f\x1d4\x9bӆ\x10y\xd9\x02B\x90R\xed.|\xba\xe0\x1a\x18\xbc\xe0\xc9G\x17L\x82c\bsӸγ\x105R\u0382\x04\xea\x05O\x04$\xa4!f\xc6.c\xbdo/x\x9a\xef\xd4!\x9bÆ\x9b\x90Vq\xf4s\x1f\x88\x00\xb4\x87]J2\xa0$R\xb40s\x8b\x82\xa5&\"\xb6H\xed\xb3\x97W\xb1\xa9\x91t#F^\x19\xcf\x14'\xed\a^,Z\xa03\x9d`\x90t\"&\x91\x9e\x99\xe0i5\x8d\x97ﭼ\x86{e\xb7r,Xm\xb7\xbb7nB\xee\xee\x93Bs\xaf,}yw\"z\x94\xcf&\xa1\x1fF*$\xbd\x19v\xebo\xe6\xa2f\x85ط\xad\xdfaU,\xe1\x06\xb6\xd2\xed!<\xad|6\xd1O6e\xed\xdb-/\r%\x9b\xa4\x92+rv\xeb\xa1y\x02\x89\x17\nr\x93\v}\xb4\xaa)\xfdt\x8b >9\xbf\xe0G\xfb̨`I}\x90A\x99=fq\xcf\x13\xc8Q\xef\xc7\x1dA\xb3\x15\xcef/\x99~\x91-\xf5\xed,yZ\xe2\x9ac\v\xc68\x9dCc\xe5ts\xb6Od\xedL\xc7\xc1T\xdexǹu\x90\x93\xa4\xb8a\x86\x9a\xcd\xc3å\xd6{1\xe5\xfb~ۣ\xe4}\\\xce(A\xf77\xe7\xaaHh\xff\x0e\x05\xe3zVC?\xd2\x19\x8a\xc0\xd6Ȑ\x15jN\xe2\xe0s\x03\x8e\x9bG&\xba\t\xe1\x81e)g5Px7\xac\xb2^\xa4q\r\xaf\ae\xbcW\xcc8\x8a\x14\xf8T\xa4\xe5\xda\xe5\v\x9e.\xaf{:~\xb9\x95\x97\xde=\xf746\xfa\xf2\x19\xc0J\x8a\x13\\\xd2\xc8˯\x0f]\x16I݂Nt\x96\xb6,\x98\xa5sA^o\xe0\xaa3\x18\x17\x8a\x8ec\xbb@\xe6\ne\xecB$\x1e\x94\xb1>C\xd7\n\x1e\arC\xd3{\x9a\x90\x13\x02\x96\xf9s/\xa5\xe3\t\x873d\x9dT\xa5\xe3\x92\xc1\xc1\x04g\x0fb\x1a@2!\xe0\xb2\xd6Qo\x1f/\xfd\xb1\aM\xc1\x12\n\v& :Q(\xb4JИ)q\x98\xb5\xbc3\t\xb7*\xd9\xc6\xfc\xa6\xc2\x1f\"L%\xf7b[\x1a6:Ҝ\x15f߽5r\x80N\xb5\xdd\xff\xd3bv\x1eF@u\x1ey\xce䬳\xe8!w\xeb\xc7EU\b`|Ȯ\xf7%\xa9\xf1\xd2H/\b\xcd\xf7u\xb09\x97[\x02\x0e\x1f\xde\xd5\x1dC4\x89x~H}\x1bG\xd6d\xae>x\xdd,T?\xe5>\xd4b\xa9Bͩ~f\x98\xc29\xa9lc{\xbe\x8c\xd0\x1e\x8f+\x03\x19\xd7\xc66\x914t\xb0\xf5\xfe{\x14I%1g\xd3\xf3W?\xae\x91\x00:\xa8\xd7xR8r87\xd4\xe8\x18\x04\x81g\xc0-\xa0LT))\x89ᔔ&\b\xf52dLg\x9d\xacoK\x14\xdb5\x94e\xbed\xe1+\x92\x1e.'r\x1d\xcd\xce?3>\x95\xa9\x8a\xed,6Y\x9e\xa3*'\x9cZ\xddz5?\xaa\xb4\xad#ޜ\xbd\xf1\xbć\xe5\x8e؋(\xea<3ϱ\xcd_xeܒuwP\xc9\xd4[唂j\xc3\x16r?S\x9at\xd1\xf0\x14+\x97Y\xd5H\x01\x83\x8cqQ\xeaE\x16\xed\f\x8a.\x8f샒\xbfOоd\xda\x15-\u007f6M\xb9(T\x9b\xb2\xaa\x85^\x1a\xa8=h|\xcf\x10\xa9\xd0\xdcɌz\xdf()\x88\x12\x93\xa7\x1faR\x836?¤^\xfb\x11&\xb5ڏ0\xe9G\x984\xd9~\x84I?¤\xdfk\x984\x8dɊ\xf2V\x83?\xcd\xcc>{\x84:\x8e\xd8(\xe4p\xaa\u007f\xebk\xaf\x97\xd5\xe5m\x87\xc7\f\xd4]\x86\x92\xee\x15ՠ\xf7\xf9\\\x1f\xfd\xd7f\xbe*\xd4s\xc2\x1f\x85\xd7\x17\x96N\x96\xee-(\xc4\x1b\xaa͜//\x99+*i\xd7$V\x85\x1d\xb1(Q\xc5)z\xab\x8f\x95\xec.\xcclV00!\x9a\xb5)L\xd7D\xf9N\xf5\x8a\xb3\xa5\x1f3\x05\x1f\xd3e\x9b\xe3\x14\xea\x84\xf6m\x12\xe9V\x89\xe1w\xa6\xd0d]\xc6x5F8\xc9@ˎ\x1f\xd6\xed_\xac\n\xb5\x19\xf0\xca\xed\xa1\xb7\x00*\x9at[\x16\xb9o\x16GF\x99\n\xd7\a\xba\x94\x03\xa5Arq=X\x17Sݬh\x92\x13~-\xfc\xa6\xe8,}\x9b\n\xed\x97\xd4n|u\xc5F\xbb&c\xd0Ȟwر\xb4\x84tyMF\xbb\xe6b\xc4\xc9,\xa8\xc48\xbb\xd2b~\xbf5YU\xf1\x15\xb5\x14\xb1Nb\xca\xe1NTP,\x889\xe6\xab%\xbe\xaaF\x82\x0e\xf3&\xb0>\xab2\xa2Q\xf50\x01rY=\xc4\x02\x92\xcc\xd5>\x9c]\xf1Э2\x98X\xc4\\\x9d\xc3x\r\xc3\x04\xd0\xc1\xea\x86%\x95\v\x130\xab\x9a\x86w\xacW\x98\xa9Rx\x9fJ\xc2o\x8d=\xc7j\x0ef*\rf\"\xd3)\xacfj\t\x96W\x10\xcc\xd0\xe7+\xab\x05\xaaz\x80\xc19ϭ\x11hW\x01\f\x82\\X\x190r\xf6?\brA=\xc0̉\xff \xd8I\xc78!\x11\xa3?)\x9d\xa2\x9e\b#\x97\xc9\u0084\x1c\xb4\xd3(\x9d\xd9:u\xc7\xf1\x8e\x97\xeb\xd5\fK\xfb\xb4PU\xc5l\x02\xbfp\x99z\xf29\xde7\xdc \xdd]\xa4\x8a\x84\xca\x0fׁ\xca\x10\xc8N\x18l\xb0`\xfe\xce\xf7\xee\xe47\xc6f\rw,9\xb4;\u0081\x19\xb75\xca\aJ1/\xab]\xc3M\x1c\xe3\xbe\\\xae\x01~V\xd5f\xacy\u007f\xc4\xf0\xbc\x10'(\r\xc2e{\xc8\xf9A\xf1\x00\xbf\x8dd\x859\xa8xAo2.~l\xf7\x1d\xd8L\xc6\xeby\x89PeZ\xc1\x1ed\x17\x93'xx&\xa7NW\x9f\x92\xfa\xe2Wp\xdd1\xd8\xed\xde\v\xfb\xe9=7\x97\x9d[\xee\xd3\xebo\xf7m]\x83\rJ\x1cS8\xb1\xee\x85\xc5\xfb\x98\x03\x97雭Ϊ\x8e\\\x93\x1f\xbe\xca8\xa0a֊\xc9E<=}\xf6\x88[\x9e\xe3\xfaS\xe97\ueac2i\x83\x8e~qA~\xd0\xce\xfdyP\xaf=\x84\x85\n+\xfd\xa9\x8b\xafF\xca\xd9Rv`1\xd6\xfe\xeef\x14\xb0H\xa6iq|\x1e\x1e\xd3\xd8{4\x98\xe25Xec\xa3z\vl\\\\w\xbb\xbb\xe6\x1b\x06߾\x81\x1dv\xc6×}\xe9\x11\x88\xb9\xeb\xbe\xfeI\x8fpy?d\xf8KM7\n\xc3s\x1f$\x8cg\xdf\xf8\r\xe9\xcc֫%S<\xb9\xed\xf7\xa7\xab\xf3:\xf5HQ\x1a\x955ߨ\x88\t\xd3\x01\x0fV\x03\xf3\xe3(\xf8s\xb00\x05<\xa2\x04%)?J7\xf6\xfc\xdb)\xdd1\xfd|E\x03FH\xbf\x96\x85P,\x8d\x9a\x1b}Nx\x0e\xe0\x89\xec\x91>\xa2\xbe2\xa3\x10\xe9jr\xa6\xf4\xd0\xf2\xbb\x92\xe5\x1d\x83\u007f\x88b5\x00p\x81\x1d\x1b\x10)\xff\xee\xca\xf4U]\xea\xe2\xb5#9\xef9\x96ޚ\xbbo\x9et\xee\xab\xfa\x1dW\x8f\xa6\xf4:\xd4/\x1f\xf5~j\xbf\x84\xd4\xfc\xe5\x81i˙\x10'\x0f~d\xd6\xde\xe7O\xe8\xec\u0088#\x18\"`\xc0l\x9a\x86\xa1S\xbd\x85\xe0\xd2\xf3\x9a\x0e\x8fv\xaa\xb4-\x85\xeb=Rԟo\r\xf7\xcab\xcc\x13\xf16D\xe7\x01\xd1\xd8\x15f\x99\xd2\xd6\xefWV+\xe0Yp,=\xa8\xce:S\xa6ӿ\xbe\x01\xdcֻ\xf6Z6)\x16\xd4\xc8\fɦ\xa5\x17@蘁%\x89\x8bO\xf0\xc6X&z6\xe0\xabӛ䯝ta\xfa\x97\x9e;\xeb\x11y\xdb\xec]\xd55\x97\xf9\xce\xefI\b\x98\xa7\x17\x1d\xe5z\xab'\x86\xb7\xf0;D\t\xaf\x9a[\xeb\xecM3\x01\f\xd6Y\x18!\xc0(\xc8\xd8\xe0\x1d\xf1q\x9bG\xbf*\xcb\xc4v,\x81\xd1\x0e\x01\xab\xaeq94\xb8\xbf(\xe5ذ\xa3\xa5\x0f.\xc7\x17\xf3p\x13G:\xc6%\a&\xf7N\x80\xb4*\xf7\x87(\x81#\x9eb8i[:\x84\xa0\x10\xe5މtH\xa4\xdaR\xcb\xc6\xee3\xa4V\xd3\x06\xaa,y\x81\xb2\x18\xae4\xf0o\x03\x85Ǟn\xc2\xdd\xefU\xa6U\xbe\n\xf4\xa7\x1c\xe9u\xd8\x19j\xae\\\xc8D{\x9ap\xfdr\x04,\xb1\xbd(P\x023\x01\x97\xd9:\xa3)F\x8eo\xd4Z\xaf\x80\xcd\xecS\x9a]g\xe2\xaf\xf0F\xd8\x1a\x1e\xc3\uedaf\xc4Z\xe5\xfe\xe1\xb0f\\\xe3v\xa62>\"\xe5\xf7Ҟ\xf5ƅe\x1ai\xdb\xe2\xef\\\xf6 \xb6\x02\xaaV\x00\xd5F\xfd_\x13;\xd5\xcfj\xdd\xcdGQϝΝ\x833\xa7\xc15\xbc\x18\xfb\xfc\x81g\xfd\xfdEQ\b\x9e8l\xff\xf8\x9d\x0eĎ\v\xa2\x8a\xabɀ\x82\xa2\x87*6\x80OXhL\x9cV\xf6\x91\u007f\x10\xe8\xfc\xbdAlG*W\x8b\x03\xbb\xf6\x16\xd1|\xb4\x16\xf3b`\xae\x89=b=h\xcc\xf0\xb1ء\xb7\x80\xf8zY\x04\x15*?F7\x85\x8b\x17R\x85\x1a\xe7,\xa4\x1a4\xb6\x10S&\xce\x00e\xe5\x90+\xaa\xf6\\︪\xf8\xa4\xe2\xe4*\xe2ۇ\x03\xbb\x90%o-\x9e\xbd\x0filC\"~\xff\xa2\x8dȀ\x1d\xef|\xaa\x1f\b\xfdP\xff\x17\x9e\xf4\xf4/\x17\x1e}\xfd Y˴\xa1\xda\x01\x95\xf0\xa5N\x10\xb0$A'\xbb\xf7ݗ\f//\xe9\x9f\xf8X!\xfd\x9b(\xe9}\xa9\xd9\xc0\xff\xfc\xef\x05\x84<\xd3s\xc4\xc3}\xfcG\x00\x00\x00\xff\xff/\x18y\xfcLU\x00\x00"), - []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xbcYK\x93۸\x11\xbe\xebWt9\a_\"\xca\xce^R\xbc\xc9r\xb6\xcaɬ\xad\xb2f'\x87$U\v\x12M\t\x19\x10`\xf0Ь\x92\xca\u007fO5\x00\xbe9\x92v+k\x9cD\xa0\xd1\xf8\xfa݀V\xeb\xf5z\xc5\x1a\xf1\x84\xc6\n\xadr`\x8d\xc0\x9f\x1d*\xfa\xb2\xd9\xf3\x1fm&\xf4\xe6\xfc\xbe@\xc7ޯ\x9e\x85\xe29\xec\xbcu\xba\xfe\x8aV{S\xe2G\xac\x84\x12Nh\xb5\xaa\xd11\xce\x1c\xcbW\x00L)\xed\x18M[\xfa\x04(\xb5rFK\x89f}D\x95=\xfb\x02\v/$G\x13Nh\xcf?\xbf˾\xcbޭ\x00J\x83a\xfb\xa3\xa8\xd1:V79(/\xe5\n@\xb1\x1as(X\xf9\xec\x1b\xeb\xb4aG\x94\xba\x8cgeg\x94ht&\xf4\xca6X\x06$\x9c\axL\xee\x8dP\x0e\xcdNK_GXk\xf8\xf3\xe1\xcb\xe7=s\xa7\x1c2ڐ5F\x9f\x05G\x130s\xb4\xa5\x11\x8d\v\xc8\xf6i\x05t\x05\xee\x84\t\x00$\x04\x81>\"\xdb\x0fY\xb8K\x839Xg\x84:.\x1e\xa8\x8b\u007fb\xe9\x0e\x91KV\xf8\xf2\x19\xdd\xfc\xf0\x0fa\x1e\x9c\x06o\x11*m \xee[8\xfeC\xcf\xe2\xea\xe1\x8e9o\xb3\xe6\xc4,.\x9c\x17\x85K\xb0\xe0!\xe9\x17\xe2.\xb0\xbe<\x01\xb3\xb0=3!Y!q\xf3\xa3b\xed\xef\xa1*:\xeew@\x91̺'&\x05\xef\xec>\xc7\xf50\xa3\x01a\x839h78\x9a\x98\x18\a\xa1\xf5\x0exa6\xb0\x048G\x1e\xc8\a`\x897<\x8d\x16\"j\xfa^\xb4\x1d+K\xb4\xf6\a\xcd\x17\x90\xee\xd1\xd4\u00860\n\xf6\x9a\xbbL\x87k\x80a\x1b8B\xc7\xf2\x9a\xda\xdap\xcbf\xa12dx\xc4{$\xe1X1/\x17\x1c\xefc\\\xb8\x03\xfa\xc7\x01\x8bxZ\xa1\xb5DF4G\xa3}\x93C\x1f\x9cqSJ\r1\xadD\x97K\x1e\xf70\xe4/\x85u\u007fy\x9d\xe6A\xd8xj#\xbda\xf2\xb5\xd4\x10H\xecI\x1b\xf7\xb9?z\r\x85\x95qE\xa8\xa3\x97̼\xb2}\x05\xd0\x18\xb4h\xce\xf8\xa3zV\xfaE}/Pr\x9bC\xc5d\xf0q[j\x12:0oX\x19<\xc8\xfa¤<\x99\x0e\x8c\xbe\x9e\xc3\u007f\xfe\xbb꼐\x14\x1d\x16u\x83j\xbb\xff\xf4\xf4ݡ\x90\xb5\nn\x98;\x81PVp\x04\xb6\xa0\xee\x85JЎ.\xc9|ib\xb0\xffBcP\x96\xa3\xc23Oʃ\xfb\xe7\x94\xd3B\b\xb7\xfa\xbc\x1a\x19ݽ\xb9\x95\xfb\xea=z96\x17\xa4\xe8{\xe7\xefc\xd2./Wa<\xcd鯤\xfe\xf6~8\x0fPj{\xb41h\x1b\xad8\xf9\xdf}\x89\xbf\x87\xfb\xffH\xffK\x06\\\x8f\xb3\xd5he\xf4\xaaqŨ\xe9v\xf2˺\x9a\xf8$0\xec\x1dt\x11.J\x83\xc6\xe67\xeea\xde\f\x9a\x18j\x8b\x15x\xe5-\xf2X\x932\xf8\xbb\x82\x8f\xd4\xe4R\r\xe19a\xa4~\xd3ά\xab\xf4\vm\x1ep\v\f@\xab Wh\xe0\xe8\x1a\x11{\xe2\xb0\xf4\"\xa4\xa4\xce\xd6`\xad\xcf\xe9\xd9`8\xa8\r5(/\xc0,)\xe2\xfc\x87\xec]\xf6\xe6\x1b7H\x92YG\x1d\x0f\xf2\xafx\x16\xd3+\xdd\\\x9b\x0f3\xfa6x;צ\x8f\x9f\xda^yc\x12\xd9O3\xf1+!\xa9\xb3\xbf\xf6\xfc\xb1\xf0|\xf3\xe1\xf0\xf0ֆ'C\xba\x95̘\xbe\x90\xf9l\x00H\xb7<\x9d.#\xde:4\v\xc6\xeel%,(\rR\xab\xe3(\x14\xe2HW\x13\xd0\x06\xa2\xebh\x03\x1c\xe9VAQ^\x9e\x98:b\u007f\xddL\xd8\a(\xc91\xe6H\xc7\xde\xd1{\x83Pˮp\x87\r\x1fE}=\x1a\x1eF\xa4\xcb\x0fd\x1d\xeadK9\x8f\xc9;t=\xa1nk()r\xed\xda\a\xbc~\xfc\xbaNw\xfe.xS\xfa_\xfdD8\x17\x9f\xd9\xfe\xb1\xf0\xdb\xcb\x1e\x9eg\xaf\x97W\xa2h%,\xbd1\xa8\\\x9fwC0-\xe5\xde\xfb\xeeh\xdbћ\xeepe\xfa\xde{S\x96\x85z3\x99\xea\xff\x03x\xdf\u007f\xa5g\xfa\xf8\xc4\x18\x16\x00bq\x19(2e\x944\xd3\x171\xaa\x1e\x8dC\xfey\xfa\xd6\xf8\xe6\xcd\xe8\xc10|\x96T\xcf\xe3\x1f\x16\xf0\xb7\u007f\xac\"W\xe4O-\x0e\x9a\xfc_\x00\x00\x00\xff\xffahA\xb1/\x19\x00\x00"), + []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xbcYKo#\xb9\x11\xbe\xebW\x14f\x0f\xbe\x8cZ3\xd9K\xa0K\xa0\x91\xb3\xc0$\x9e\xb11\xf2:\x87$\xc0R\xcdj\x89\x11\x9b\xec\xf0!\xad\x12\xe4\xbf\aE\xb2\xdf-\xc9^\xecn_\xec&\xd9ŏU\xf5Ճ\x9a\xcd\xe7\xf3\x19\xab\xc4\v\x1a+\xb4Z\x02\xab\x04\xfe\xecPћ\xcd\x0e\u007f\xb4\x99Ћ\xe3\xc7-:\xf6qv\x10\x8a/a\xed\xad\xd3\xe57\xb4ڛ\x1c\xef\xb1\x10J8\xa1լD\xc78sl9\x03`Ji\xc7h\xd8\xd2+@\xae\x953ZJ4\xf3\x1d\xaa\xec\u0df8\xf5Br4a\x87z\xff\xe3\x87\xec\xfb\xec\xc3\f 7\x18>\u007f\x16%Z\xc7\xcaj\t\xcaK9\x03P\xac\xc4%lY~\xf0\x95uڰ\x1dJ\x9dǽ\xb2#J4:\x13zf+\xcc\x03\x12\xce\x03<&\x9f\x8cP\x0e\xcdZK_FXs\xf8\xcb\xe6\xf1\xeb\x13s\xfb%d\xf4AV\x19}\x14\x1cM\xc0\xcc\xd1\xe6FT. {J3\xa0\vp{L\x00 !\b\xeb#\xb2\xa7\xae\bw\xaep\t\xd6\x19\xa1v\x93\x1b\xea\xed\xbf0w\x9b(%\xdb\xfa\xfc\x80n\xbc\xf9\xa70\x0eN\x83\xb7\b\x856\x10\xbf\x9b\xd8\xfeS+\xe2\xea\xe6\x8e9o\xb3j\xcf,N\xec\x17\x0f\x97`\xc1C\xd2/į\xc0\xfa|\x0f\xcc\xc2\xeaȄd[\x89\x8b\x1f\x15\xab\xff甆\x91\xfe\n(\x92Y\xf7¤\xe0\x8d\xddǸ\x1eFk@\xd8`\x0e\xfa\x1a\x1c\r\f\x8c\x83P{\a\x9c\x98\r\"\x01\x8eQ\x06\xf2\x0eX\x92\r/\xbd\x89\x88\x9a\xde'm\xc7\xf2\x1c\xad\xfd\xa2\xf9\x04\xd2'4\xa5\xb0\x81F\xc1^c\x97ipu0\xac\x82DhD^S[M\xb7lD\x95\xae\xc0\x1d\xbe\xe6$\x1c\v\xe6\xe5\x84\xe3\xddljW@\xbf\uf208\xbbm\xb5\x96\xc8h\xcd\xceh_-\xa1%g\xfc(\x85\x86\x18V\xa2\xcb%\x8f{\xe8ʗº\xbf^^\xf3 lܵ\x92\xde0y)4\x84%v\xaf\x8d\xfb\xdan=\x87\xad\x95qF\xa8\x9d\x97\xcc\\\xf8|\x06P\x19\xb4h\x8e\xf8\xa3:(}R?\b\x94\xdc.\xa1`2\xf8\xb8\xcd5\x1d:\b\xafX\x1e<\xc8\xfa\xadIq2m\x18}}\t\xff\xfd߬\xf1BRt\x98\xd4\x15\xaa\xd5\xd3\xe7\x97\xef7\xf9\x1eK\xb6L\xce:\xc1́\n\x88\x04\xac\xe3\xe7{4\b/Aۑ\x036\x9d*I\x84\x14>j:TFWh\x9c\xa8Q\xd2\xd3\xc9\n\xcd\xd8\x00\xcb\x1d\x81\x8dk\x80S\x1e\xc0\xc8\xc5\x14͑\x83\r\a\x89!SX0\x18\x94\xa8\\k\xdc\x06P\x01L%X\x19lH\xd1ƒ\xbd\xbc\xe4\x94<\x8eh\x1c\x18\xcc\xf5N\x89\xff4\x92-\x85\xc4H\u007f\x87\xc9\r\xea'\x04{\xc5$\xa9\xd9\xe3{`\x8aC\xc9\xce`0DN\xaf:\xd2\xc2\x12\x9b\xc1\x17\x8a\x17B\x15z\t{\xe7*\xbb\\,v\xc2\xd5y0\xd7e\xe9\x95p\xe7E\xc8fb\xeb\x9d6v\xc1\xf1\x88ra\xc5n\xceL\xbe\x17\x0es\xe7\r.X%\xe6\x01\xb8\x8a\xa9\xa9\xe4\xdf5\xcep\xd7A:\xe0x|\x02'.\xea\x9d\xd8\x10m\x1e?\x8b\xf8[\xf5\xd2\x10i\xe5۟7\xcfPo\x1aL\xd0\xd7y\xcc!\xcdg\xb6U<)J\xa8\x02M4\\at\x19$\xa2\xe2\x95\x16ʅ\x97\\\nT}\xa5[\xbf-\x85#K\xffۣud\x9f\f֡\x1a\x80-\x82\xafBp\xcdೂ5+Q\xae\x99\xc5\xdf\\\xed\xa4a;'\x95\xdeV|\xb7\x88\xe9/\x8c\xdaj\x86\xeb\xfab\xd2B\x93,\xddT\x98\xf7x\xc2\xd1\nC\xbe\xec\x98\xc3\xc0\x80DڞJ/\a\xc6\xcb\xe4\r\x04n\xb2S\u007f|\x00u\xd5,\xeba\xabn毁Ph\xe2O6\x98A\xe5\xcb!\x849|C\xc6\x1f\x95A\x11\xdcV9y\xa6\xb8b\xcf*\x1f\xc6\xcd\xfaY=}\xaech$G\xbf\x1e\xcb`\x958\xa9\v\xf8\x00\\X\xaa\x8cl\x109T\x0f\x95\xb54\xbb\x04g\xfc\xab\x0f\x9dkU\x88\xdd\xf0\xa8\xddbw\xda+\xae\n\x1d\xe8j\x1d\xf6\xa0@C\x1eP\x97\xc6s\xf2|Q\x88vW\xb6\rg\x8c5))YtT\xdbXPHI\x8b\x99\xa1\xae\x02\xd1s\xad\x14\xf1\xcci`MԺ\xb3\xc3\x10\xfd\x06\xd6Ƕ\xfc\xa6\xe7\xa4.=\xe9t{\xa3g\u007f3\xa3s\xb6Fs\x1b\xc5zE˚\xbc\xc6`\xbd\x82\xadW\\b\x8d\xe5\xb4GEE\xba(\xceT)>?l&y\x99\xf4\x18J\x80Tf\xd7ڜ\xc2\x1e\xa3\xf0\x12\xb6\xe7Q\xea\xbey\xb4\xca`!~\xbey\xb4\xa7\xb0\xacVp\xc5\xdc\x1e\x84\xb2\x82S\x10\x1d\xab{\xa2\x96\xaa\x9f&M?\xa6\xa8\xf0Fc\\\xe6o\xe7\x06g(i\x82µ>\xaf2\xa3\xb9y\xaa\xcf}\xf5&j\x9a\x9b\x13\xa7h\xbb\xcf\x1fbٓ\x8fR[\x0f\xc6\xcbx\xfd\x95⩾a\x19\x13\x94\xb2\xb76\x06m\xa5\x15'\xff{]\xe9\xd4\xc2\xfd5\n\xa8)\x03\xce\xfbѪ7ӻ\x17\xbcb\xd4\xd4߿\xad/\x88\x97j\xdd\xea[o\xc3UC\xa75\xf8\x8d\xbb\x80w\x9d6\x80\x1aK\x05^\x85j)d\xe1\f\xfe\xa1\xe0\x9e\xdaD\xca!|I\x18\xa9B\x18\xe7s\xa5O\xf4qGZ\x10\x00:\x96m\xa1\x05\xa2F\x88\xc5r\xb9\\\xa8h\xef\x90\xd8\x06߂\x8a\x16\u007f\x17\xf4y\xc5\xcd\xfdW\xdcذ:\xbcߢ\xa8\xf7\x8b{\xebM\vW\x89%\xf4\xb7\xc8!\x91\xc6O\xb8\xb3ފ\r~ѣ(\xa3D\xb5\v\x00\xe5}\x10\x95Ŝ\x97\x00:x\xa1\xe0\x1c\xd2r\x8f\xbe\xb9O[\xdc&\xeb\fR\xb10\xda?\xbck>4\xef\x16\x00\x9a\xb0l\xffb{dQ}l\xc1'\xe7\x16\x00^\xf5\u0602A\x87\x82[\xa5\xefS$\xfc-!\v7\atH\xa1\xb1a\xc1\x11u\xf1Ø\xe2\x9crk\xb2^\x90\xae\x82K}uj\t\xdfn~\xbcY+\xe9ZhX\x94$nb\xa7\x18\x8b\xc3\x06Y\x93\x8dR\xdc\xfaT\xac\xc1\xd7\xc5\x1c\xdcV{P\xf7\x00'݁b\xb8\xf6k\n{B\xe6՚\x82Ff4\xe5\xa8\xea\xf1\xa6h\x17\x81\x81Ϡ\xac\xdf!\xd5\xc0\xed(\xf4\xe5D\xf4&\x06\xeb\xa5,\xb4\xb3\xe8\xa7\xd09m{+<\xa6_\x8eO\x03W\xa5U\xe7\x1e\x92b.j\xd3\xc0\xb5\x87+գ\xbbR\x8c\xff9\xf6L\x98\x97\x19\xe9\xeb\xe0\xcf_\x98\xa9b\xa5u\x14\x8f\xed\u007f6B3e\xb9\x89\xa8s\xcc2\xb8\xbc\xd7\xee\xac.e\x00\xbb@\xf0\xd0Yݍe9!z,\xe0\xe6L\xf5\x97V\x96p\x83\x0fOd\xa7\x11\xe5ɯ\xe9\xc8\xf2*\x93\x99\x84\xbb\x10\x9df\xba\xf7\xa7\xd50xՉ\xa2\xfc\x00(\xaf\xb39\x03\xcb\x12H\xedGԧ,VZc\x1447\x97\x13ƛ7\x93Q\xa1,u\xf0u\xf4\xe3\x16~\xfeeQOEs7\xfa\x91\x85\u007f\a\x00\x00\xff\xff\xb0\x1aq.\xff\n\x00\x00"), []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xb4WAs\xdc6\x0f\xbd\xef\xaf\xc0\xe4;\xe4\xebL\xa4M&\x97\x8en\xa9\x93ΤI]\x8f\xed\xf8\xd2\xe9\x01\xa2\xb0\x12k\x8ad\tr\x1d\xb7\xd3\xff\xde!)i\xb5Zy\x9d\x1e\xaa\x9bH\x10xzx\x00\xa1MQ\x14\x1b\xb4\xf2\x8e\x1cK\xa3+@+\xe9\xab'\x1d߸\xbc\xff\x9eKi\xb6\xfb75y|\xb3\xb9\x97\xba\xa9\xe0\"\xb07\xfd5\xb1\tN\xd0{\xdaI-\xbd4zӓ\xc7\x06=V\x1b\x00\xd4\xdax\x8c\xcb\x1c_\x01\x84\xd1\xde\x19\xa5\xc8\x15-\xe9\xf2>\xd4T\a\xa9\x1ar)\xc2\x18\u007f\xff\xba|[\xbe\xde\x00\bG\xe9\xf8\xad\xec\x89=\xf6\xb6\x02\x1d\x94\xda\x00h쩂\xc6\x10\x1f\x89\x92zG.'.\xa9,z$\xddX#\xb5O/BI\xd2Ǥs\xa8{\xe9y\x94m\xccO\t\x17\xe9\xf6\x80\x9a \xd8X\xf8M\t\x1f5\\`O\xea\x02\x99\xfes\xda#\xc3\\DJ\x9f'~~\xe9\x1d\x1bf\xb6\xa6\xe5\xf1VZ\xcdТ\x94o,\x89\x98\xafHZ<'wR\xa4\x12\x80\x9dq\x80\x87\xca\x1eh+g~\xd7j3\x81J\r\xfaxm\xd9\xe6s\x0f\x97\f\x0f\x1d\x1e\xb7\x90\xffSٖ\xb1\x0f\xf0\x00!w\x86\xefʅ\xbf\xa7\xa2\xafit\x15\xc3(\xd5\xf8\xe9\xfe\x89kg\x194>\xa4C\xbf漀\x1f\x12\xd2Ϧ=\xb3{a\xb4\x8f\x82>cr\x17\x87\a\xba\xd1h\xb93g-\xc7\xd1h\xba[\x96f\xd7\x14[-=\x05iؾ&\x0ej5Ъ\x10\xc7'ݞϱ\x9cf\x8a\x81e=\x9b/\xeeO\x87\nx\x90\xbe\x83\x87N\x8an\xc5+\xa4c)A\xb1\xbfL\xe3\xc9Z\x8a\xce\xc0\x8e:\x96\x8eN\xe4Q\xc04\x90\xcc\x17\xa7Ai\xe9|Qs뎋\xa1\x16\x9e\xad\xd84\xc1}s\xcd\xe6\xb1p U\x04\xe7HO\xc3b\xbc\xad\x96\a\xbe\xa5hG\xc5\u007f\xb9\xfe|\xb6r\xdf\x1f\xecҤ\x8dRg\x1c\xd6Q\xc1\xb2\x8dwk܋\xb5\x9b*kI@~\xe6w\xfc\xb3Y\xa3\xafV\xba\xd9\xc8\xf2\x04\xb4\x0f\x93Yn,\xa4\xf3\x15\xb1\x9c^\x92;\xe2t\xed\n\xd4'\xd8j\x82\x86\x14\xc5ѷ~̝\xf1\x91=\xf5K\xbc;\xe3z\xf4yb,\xbc<\x11J\xfc\x8b\xc0ZQ\x05ޅu\x15\xad|l\xfa78\xfb\x9dW\xd1b-\xfdSq\x9d\xc9?<\xd1\xc1\x8a\xf8{q\xb2v\xfc\xbb\xf1,\xfa\x15q/\x96\x0e\xbf_o\x0eo\xc3\u007fR\x9e\xc6\xd3\x06@\x9at\x9b\x19u\xc3\xcc8\xac\x1c*\x06\x85 멹\\N\xe7/^\x1c\x8d\xdb\xe9U\x18\x9d\xffԸ\x82_\u007f\xdbd\xaf\xd4܍8\xe2\xe2?\x01\x00\x00\xff\xff\x9cДê\x0e\x00\x00"), []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xc4YKs#\xb7\x11\xbe\xf3Wt\xad\x0f\x8a\xabġ\xbdN\xa5R\xbc\xedJٔ\x12[\xab\x12e]\xb6\xf6\x00\x0e\x9aC\x843\x00\x82Ɛ˸\xfc\xdfS\r`\xc8y\x91\xa2\xec\xac3\x17\x89x\xf4\v\xfd\xf8ИL\xa7Ӊ\xb0\xea\x19\x1d)\xa3\xe7 \xac\xc2/\x1e5\xff\xa2l\xf3Wʔ\x99m\xbf_\xa2\x17\xdfO6J\xcb9\xdc\xd4\xe4M\xf5\x88dj\x97\xe3-\xae\x94V^\x19=\xa9\xd0\v)\xbc\x98O\x00\x84\xd6\xc6\v\x1e&\xfe\t\x90\x1b\xed\x9d)Kt\xd3\x02u\xb6\xa9\x97\xb8\xacU)\xd1\x05\x0e\r\xff\xedw\xd9\x0f\xd9w\x13\x80\xdca\xd8\xfe\xa4*$/*;\a]\x97\xe5\x04@\x8b\n\xe7`\x8dܚ\xb2\xaep)\xf2Mm)\xdbb\x89\xced\xcaL\xc8b\x1ed\x902\b&\xca\a\xa7\xb4Gw\xc3\x1b\xa2@S\xf8\xc7\xe2\xe3\xfd\x83\xf0\xeb9d䅯)\xb3kA\x18\x84\x95H\xb9S\xd6\a\x91\x1e\x8c\x84\xe7\xc0\n\xde\a^\x10\xd7\x03\xd5\xf9\x1a\x04\xc1=\xeefw\xfa\xc1\x99\xc2!Q \x10e\\\x84ua\xc0\xef-\u0381\xbcS\xba8\xc1\x9e\xbcp\xfe\xa0\xeeP\x0e\x9e\x82\xdd\x1a5\xf8\xb5\"\x88z\xc3N\x10\x84\x9d([\x9co\xd8zi$\xb2\x96\xc2〱\xc5<\xb3Ff\xbc\x89\xac\xc8G\xb4\xbfo\xa6\xc0\xac\xc0\xaf\x91\r\x1f\x0eS(\xadt\x11\x86\xe2A\x807\xb0\xc4 \x17J\xa8mK\x9c\xfb\x0e\xfd\xb3\xb6h\x8b4.\xcd\xef\x11\xe4\xc1\xc8\xcbD\x88\x94\xce\v\xf0\"\xb7\xe7#\x91\x17\x19:\xb4\xe6N\xa2\xf6j\xa5\xd0\r\x19?\"y\x95\x03/#\xe5\x8dۃ:\xac\x86\x95qm\xa7h\x89\x90\xb6=\xa25\x97\xc9\x11),\xbcq\xa2\xc0\x1fM\x1e\x82\xf0\xbc\x1dRT\xa4=\xd0lb_u\xd8qVZ\x9b\xba\x94l.\xf2\xc6u<\xb6\xbf\xfbEi\x9bl\x93\r2E\x8b\xea\xbb\x02\x871P8S\xdb9\x1c\x13F\\\x9d\x12ULr\x0fF\xc6\xd3{\u007f\xb4h\xa9\xc8\xffsl\xf6GE>\xac\xb0e\xedD9LNa\x92\x94.\xeaR\xb8\xc1\xf4\x04\xc0:$t[\xfcYo\xb4\xd9\xe9\x0f\nKIsX\x892d$ʍm\x87\x11\x1b\x8e\xea\xa5K9\x98\xe6\xf0˯\x13\x80\xad(\x95\f\xb6\x88\xaa\x18\x8b\xfa\xdd\xc3\xdd\xf3\x0f\x8b|\x8d\x95\x88\x83\xcc\xccXt^5\x1a\xf3ת\x01\x87\xb1ޑ_1\xa9\xb8\x06$g}\xa4\x18\x06q\f%P`\x13\xddB\x11\xfb*\xab\xa5\xfd\xf1@\x9bϬ@h0\xcb\u007fa\xee3X\xb0\xea\x8e\x1a\xf7ȍޢ\xf3\xe007\x85V\xff9P&\x8e5fY\n\x8f\xc9\xe4\xcd\x17\x12\xbc\x16%\x1b\xa1\xc6k\x10ZB%\xf6\xe0\x90y@\xad[\xd4\xc2\x12\xca\xe0'\xe3\x10\x94^\x999\xac\xbd\xb74\x9f\xcd\n囪\x97\x9b\xaa\xaa\xb5\xf2\xfbY\xa8]jY{\xe3h&q\x8b\xe5\x8cT1\x15._+\x8f\xb9\xaf\x1d΄U\xd3 \xb8\x0eE/\xab\xe47\x87\xe3\xb9jI\xdas\xe9\xf8\x05\x9f;iw\xf69P\x04\"m\x8b\xf2\x1f\xcd\xdbd\xbfǿ-\x9e\xa0a\x1a\x8e\xa0k\xf3`\xed\xe36:\x1a\x9e\r\xa5\xf4\nS\x16Y9S\x05\x8a\xa8\xa55J\xfb\xf0#/\x15\xea\xaeѩ^V\xca\xf3I\xff\xbbF\xf2|>\x19܄\xda\xcfA^[\x8e8\x99\xc1\x9d\x86\x1bQay#\b\xbf\xba\xd9\xd9\xc24e\x93\xbel\xf86d\xe9.\x8c\xd6:\f7\x98b\xf4\x84z\xe9`a1\xe7\xf3b\xa3\xf1>\xb5R)#r\x9e\x16\xfd\xe5Y\x8b\xecXh\xf27\x9a\x95\xbbKz2\xbd\x1f\xdb\xd1H\xa5[ٻI\xcdqe\x8f$@\xd9\xcf\xe6\xecx\x83RD)\xa1g\xbd\xfd\xa3F\xe7O\x1b\x89g\xe5\xbf7\x12\xc7\xc4\xe5\x8d\xe0\xd7\"\xfa$c3\xce4\xb5\x0e\x18\xc0\xe8\x8b\x05\xb0F\x9e\xe5\x9f(\vp\xb8B\x87:\xc7&\xf9\x9c\xc3\x1d\x03\xf3\xb5\x91A_\xb6S\x87\r'\xf3\xf1\xa8\xa4\xef\x1e\xee\x9a\x1c\xdc\x18)\xc9\xec\xfb\x1c\xcfZ\x84\xbf\x15\x17\x9eP`_\xe2zu\xb7\x8alBF\xf2\x06\x04X\x85\x11&\x1eR;(M\x1e\x85\x8c\x83#$\x018p\x1d\xa6\xf5\xd71\xff\xa44w,\alk\x10\xb1\xbe\x05\f0\xfb\xbb\x89\xb2\x8e\xd2\x14y\x8e\x14`\xb1\xc7\n\xb5\xbf>@u\x89\xa4\x1cJ\x06\xe6\x98UB\xab\x15\x92\xcf\x12\at\xf4\xe9\xed\xe71\x9b\x01|0\x0e\xf0\x8b\xa8l\x89נ\xa2\x95\x0f\t\xb5q\x10E\xd1\x10\az\xb0S~\xad\xc6\x15\x17\xecHI\xe1]Pԋ\r\x82I\x8a\xd6\b\xa5\xda\xe0\x1c\xde\x04Xv\x14\xf1\x17\x8e\x86_ߌ\xd2\xfcS\f\xd27\xbc\xe4M\x14\xecP3\xdbAt\x140F\x92SE\x81\r\x1e\xeb\u007f\xa1\x10p\x82\xfd\x16\x8ccݵi\x11\bd\xf9\xccb\xa2C9\x10\xf8\xd3\xdb\xcf'\xa4\xed\xda\t\x94\x96\xf8\x05ނJ7\x1ck\xe4\xb7\x19<\x05\x8f\xd8k/\xbe0\x9f|m\b5\x18]\xeeǥ5\xb0\x16[\x042|[²\x9cF\xac\"a'\xf6\xac\u007fs\\\xeca\x02\xacp\xbe\x8bFF\xa9>}\xbc\xfd8\x8fR\xb1\v\x15!\x93r\x95[)\xc6\x1c\f6b\xe5d\x9f\f樣sx\x03\xf9Z\xe8\x91\xc4\n\x01\xb4\x04\xeb\xaej\xaee\xd9\xd5k\xa3\xb5\x0f\x1b\x9ao\x04>\xf4\x13\xc3\xff\xa9\b_\xa4V\x80\xee/\xaaվ\x81\x9cUkS/\xd1i\xf4\x184\x93&'V*G\xebif\xb6\xe8\xb6\nw\xb3\x9dq\x1b\xa5\x8b);\xe24z\x02\xcd\u00ad`\xf6M\xf8\xf3\x9b\xb4\b`\xfd2U:w쯩\x0f\xf3\xa1٫\xd5ip\xe5\xa5U\xe9j\x91\x90O\u007f'\x87\xc4n\xad\xf2usI8f\xcf\xd1\x18\xa9\x84\x8c)W\xe8\xfdWw[6d\xedX\x9e\xfd4u\xac\xa6BK\xfe\x9f\x14y\x1e\u007f\xb5\xe5juA\x90\xfe|w\xfb\xc78s\xad^\x1d\x91\xa3\x808\xfaD\xbbgq\x16N=v\x966\xc0n\x04I\x1e\xd6\\\x8c\xe4\xbc(\x06\x00\xaa\xdd\xfa;\r\xb2\xce\xe8\xdc\xed\xbc\x89\x82@8\x04\x01\x95\xb0|N\x1b\xdcOc\x91\xb6Bq\x8d\xe52z\xecn\bkK5RNS)Np1!o\xbe֊\x82\xc6\xf5\x1d\xb1z\xdc}\xd6ک]9\x02\x9f\x13\xeb\x88K\x0e\x10\xba\xdd\xc2\x1a\xfa\xef\x00\xb8\x9e\xb0\x1b\xdf\x02\x19]\xb5E\x9b\x8e_]:+\x18\xd2w\x06\xac\x91\x9d\xdf#\xbd\xb1f\xaaէ;c\xb6\xd8a\xbd\xf8\xfe\x16ۻ\xc9z1\x1f\xf8\xa6\xe9\xcbX\xe1\xb7\xdc\xe0r\xc3ر\xdb\xd1>w\x847\xc3\xf5\xa1!\xe2d\x14˫\x8a\xfd\xb1\xd5\x05N\x1c\x86\x970h\x11\x8b\xfbB\xdeeZ(\x03\xb4cԹ\x12\xaaD\tM;\xbd\xbfg@\xb3Mc\x89+NU\xb5-\x8d\x90ͥ(\x89\xd64y\x9e\xf86\x1c\xfa\rWt\x92bM(\xc3-yD\xfd~yX\x19W\t\x1f\xbbz\xd3\x11\x82\xba.K\xb1,q\x0e\xde\xd5\xfdɓ\xa1_!\x91(·\xd7OqM\xbc\x1f\xa6\r \x96\xa6\xf6\x87\vb'į(y\xcf\xe5\xb7ӑ+X\xd7e\x05\x03fJ\xf0\xb1,ÎvX\x1f\xdf[\x82O \xf5Z\x9f\x1b9x\xf0\xbf\x01\x00\x00\xff\xff-\xbc\x85&\xc9\x1f\x00\x00"), diff --git a/pkg/apis/velero/v1/backupstoragelocation_types.go b/pkg/apis/velero/v1/backupstoragelocation_types.go index a18e3a3e8..d00b02196 100644 --- a/pkg/apis/velero/v1/backupstoragelocation_types.go +++ b/pkg/apis/velero/v1/backupstoragelocation_types.go @@ -17,6 +17,7 @@ limitations under the License. package v1 import ( + corev1api "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" ) @@ -30,6 +31,10 @@ type BackupStorageLocationSpec struct { // +optional Config map[string]string `json:"config,omitempty"` + // Credential contain the credential information intended to be used with this location + // +optional + Credential *corev1api.SecretKeySelector `json:"credential"` + StorageType `json:",inline"` // Default indicates this location is the default backup storage location. diff --git a/pkg/apis/velero/v1/zz_generated.deepcopy.go b/pkg/apis/velero/v1/zz_generated.deepcopy.go index 949107f42..dfb973762 100644 --- a/pkg/apis/velero/v1/zz_generated.deepcopy.go +++ b/pkg/apis/velero/v1/zz_generated.deepcopy.go @@ -381,6 +381,11 @@ func (in *BackupStorageLocationSpec) DeepCopyInto(out *BackupStorageLocationSpec (*out)[key] = val } } + if in.Credential != nil { + in, out := &in.Credential, &out.Credential + *out = new(corev1.SecretKeySelector) + (*in).DeepCopyInto(*out) + } in.StorageType.DeepCopyInto(&out.StorageType) if in.BackupSyncPeriod != nil { in, out := &in.BackupSyncPeriod, &out.BackupSyncPeriod diff --git a/pkg/cmd/cli/backuplocation/create.go b/pkg/cmd/cli/backuplocation/create.go index 0871a28dd..5c0cabbea 100644 --- a/pkg/cmd/cli/backuplocation/create.go +++ b/pkg/cmd/cli/backuplocation/create.go @@ -27,6 +27,7 @@ import ( "github.com/pkg/errors" "github.com/spf13/cobra" "github.com/spf13/pflag" + corev1api "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" kbclient "sigs.k8s.io/controller-runtime/pkg/client" @@ -63,6 +64,7 @@ type CreateOptions struct { Name string Provider string Bucket string + Credential flag.Map DefaultBackupStorageLocation bool Prefix string BackupSyncPeriod, ValidationFrequency time.Duration @@ -74,7 +76,8 @@ type CreateOptions struct { func NewCreateOptions() *CreateOptions { return &CreateOptions{ - Config: flag.NewMap(), + Credential: flag.NewMap(), + Config: flag.NewMap(), AccessMode: flag.NewEnum( string(velerov1api.BackupStorageLocationAccessModeReadWrite), string(velerov1api.BackupStorageLocationAccessModeReadWrite), @@ -86,6 +89,7 @@ func NewCreateOptions() *CreateOptions { func (o *CreateOptions) BindFlags(flags *pflag.FlagSet) { flags.StringVar(&o.Provider, "provider", o.Provider, "Name of the backup storage provider (e.g. aws, azure, gcp).") flags.StringVar(&o.Bucket, "bucket", o.Bucket, "Name of the object storage bucket where backups should be stored.") + flags.Var(&o.Credential, "credential", "The one credential to be used by this location in key-value pair, where key is the secret name, and value is the secret key name. Optional.") flags.BoolVar(&o.DefaultBackupStorageLocation, "default", o.DefaultBackupStorageLocation, "Sets this new location to be the new default backup storage location. Optional.") flags.StringVar(&o.Prefix, "prefix", o.Prefix, "Prefix under which all Velero data should be stored within the bucket. Optional.") flags.DurationVar(&o.BackupSyncPeriod, "backup-sync-period", o.BackupSyncPeriod, "How often to ensure all Velero backups in object storage exist as Backup API objects in the cluster. Optional. Set this to `0s` to disable sync. Default: 1 minute.") @@ -148,6 +152,13 @@ func (o *CreateOptions) Run(c *cobra.Command, f client.Factory) error { validationFrequency = &metav1.Duration{Duration: o.ValidationFrequency} } + var secretName, secretKey string + for k, v := range o.Credential.Data() { + secretName = k + secretKey = v + break + } + backupStorageLocation := &velerov1api.BackupStorageLocation{ ObjectMeta: metav1.ObjectMeta{ Namespace: f.Namespace(), @@ -163,7 +174,13 @@ func (o *CreateOptions) Run(c *cobra.Command, f client.Factory) error { CACert: caCertData, }, }, - Config: o.Config.Data(), + Config: o.Config.Data(), + Credential: &corev1api.SecretKeySelector{ + LocalObjectReference: corev1api.LocalObjectReference{ + Name: secretName, + }, + Key: secretKey, + }, Default: o.DefaultBackupStorageLocation, AccessMode: velerov1api.BackupStorageLocationAccessMode(o.AccessMode.String()), BackupSyncPeriod: backupSyncPeriod, diff --git a/pkg/cmd/cli/backuplocation/set.go b/pkg/cmd/cli/backuplocation/set.go index d5701f6a9..b87199d31 100644 --- a/pkg/cmd/cli/backuplocation/set.go +++ b/pkg/cmd/cli/backuplocation/set.go @@ -25,12 +25,14 @@ import ( "github.com/pkg/errors" "github.com/spf13/cobra" "github.com/spf13/pflag" + corev1api "k8s.io/api/core/v1" kbclient "sigs.k8s.io/controller-runtime/pkg/client" velerov1api "github.com/vmware-tanzu/velero/pkg/apis/velero/v1" "github.com/vmware-tanzu/velero/pkg/client" "github.com/vmware-tanzu/velero/pkg/cmd" + "github.com/vmware-tanzu/velero/pkg/cmd/util/flag" ) func NewSetCommand(f client.Factory, use string) *cobra.Command { @@ -54,15 +56,19 @@ func NewSetCommand(f client.Factory, use string) *cobra.Command { type SetOptions struct { Name string CACertFile string + Credential flag.Map DefaultBackupStorageLocation bool } func NewSetOptions() *SetOptions { - return &SetOptions{} + return &SetOptions{ + Credential: flag.NewMap(), + } } func (o *SetOptions) BindFlags(flags *pflag.FlagSet) { flags.StringVar(&o.CACertFile, "cacert", o.CACertFile, "File containing a certificate bundle to use when verifying TLS connections to the object store. Optional.") + flags.Var(&o.Credential, "credential", "Sets the one credential to be used by this location in key-value pair, where key is the secret name, and value is the secret key name. Optional.") flags.BoolVar(&o.DefaultBackupStorageLocation, "default", o.DefaultBackupStorageLocation, "Sets this new location to be the new default backup storage location. Optional.") } @@ -77,15 +83,6 @@ func (o *SetOptions) Run(c *cobra.Command, f client.Factory) error { return err } - location := &velerov1api.BackupStorageLocation{} - err = kbClient.Get(context.Background(), kbclient.ObjectKey{ - Namespace: f.Namespace(), - Name: o.Name, - }, location) - if err != nil { - return errors.WithStack(err) - } - var caCertData []byte if o.CACertFile != "" { realPath, err := filepath.Abs(o.CACertFile) @@ -98,6 +95,15 @@ func (o *SetOptions) Run(c *cobra.Command, f client.Factory) error { } } + location := &velerov1api.BackupStorageLocation{} + err = kbClient.Get(context.Background(), kbclient.ObjectKey{ + Namespace: f.Namespace(), + Name: o.Name, + }, location) + if err != nil { + return errors.WithStack(err) + } + if o.DefaultBackupStorageLocation { // There is one and only one default backup storage location. // Disable the origin default backup storage location. @@ -123,6 +129,17 @@ func (o *SetOptions) Run(c *cobra.Command, f client.Factory) error { location.Spec.Default = o.DefaultBackupStorageLocation location.Spec.StorageType.ObjectStorage.CACert = caCertData + + for k, v := range o.Credential.Data() { + location.Spec.Credential = &corev1api.SecretKeySelector{ + LocalObjectReference: corev1api.LocalObjectReference{ + Name: k, + }, + Key: v, + } + break + } + if err := kbClient.Update(context.Background(), location, &kbclient.UpdateOptions{}); err != nil { return errors.WithStack(err) }