diff --git a/changelogs/unreleased/6354-kaovilai b/changelogs/unreleased/6354-kaovilai new file mode 100644 index 0000000000..2ef21a4684 --- /dev/null +++ b/changelogs/unreleased/6354-kaovilai @@ -0,0 +1 @@ +Implement recreate ExistingResourcePolicy to restore API to enable restore for immutable resources such as Pods. \ No newline at end of file diff --git a/config/crd/v1/bases/velero.io_restores.yaml b/config/crd/v1/bases/velero.io_restores.yaml index 8e53be6426..d57cd92345 100644 --- a/config/crd/v1/bases/velero.io_restores.yaml +++ b/config/crd/v1/bases/velero.io_restores.yaml @@ -55,9 +55,30 @@ spec: type: array existingResourcePolicy: description: ExistingResourcePolicy specifies the restore behavior - for the Kubernetes resource to be restored + for the kubernetes resource to be restored + enum: + - none + - update + - recreate nullable: true type: string + existingResourcePolicyRecreateResources: + description: ExistingResourcePolicyRecreateResources is a slice of + resource names where recreate ExistingResourcePolicy will apply. + Resoruce names can be in the format of "group/version/resource" + or "resource" If empty, a default list of resources (Pod, PV, Secret, + ConfigMap) will be used. Resources with finalizers without velero.io/recreate-remove-finalizer=true + annotation will not be recreated. Recreate will not recreate resources + with ownershipReferences. + example: + - pods + - persistentvolumes + - secrets + - configmaps + items: + type: string + nullable: true + type: array hooks: description: Hooks represent custom behaviors that should be executed during or post restore. diff --git a/config/crd/v1/crds/crds.go b/config/crd/v1/crds/crds.go index 212837b734..e9d1a67813 100644 --- a/config/crd/v1/crds/crds.go +++ b/config/crd/v1/crds/crds.go @@ -36,7 +36,7 @@ var rawCRDs = [][]byte{ []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xb4VM\x93\xdb6\f\xbd\xfbW`\xa6\x87\xb43\x91\x9c\xb4\x97\x8eo\xad\x93\xc3N\xd24\xb3N\xf7NS\xb0\xc4.E\xb2\x04\xe8\xcd\xf6\xd7w@J\xfe\x94\xbd\xdeCu\x13\t\x82\x8f\x0f\x0f\x8f\xac\xaaj\xa6\x82y\xc0Hƻ\x05\xa8`\xf0;\xa3\x93?\xaa\x1f\x7f\xa5\xda\xf8\xf9\xf6\xfd\xecѸf\x01\xcbD\xec\xfb{$\x9f\xa2\xc6\x0f\xb81ΰ\xf1n\xd6#\xabF\xb1Z\xcc\x00\x94s\x9e\x95\f\x93\xfc\x02h\xef8zk1V-\xba\xfa1\xadq\x9d\x8cm0\xe6\xe4\xe3\xd6\xdbw\xf5\xfb\x9f\xebw3\x00\xa7z\\@㟜\xf5\xaa\x89\xf8OBb\xaa\xb7h1\xfa\xda\xf8\x19\x05Ԓ\xbb\x8d>\x85\x05\xec'\xca\xdaa߂\xf9Ð澤\xc93\xd6\x10\x7f\x9a\x9a\xfdl\x86\x88`ST\xf6\x1cD\x9e$\xe3\xdadU<\x9b\x9e\x01\x90\xf6\x01\x17\xf0E`\x04\xa5\xb1\x99\x01\fG̰\xaa\xe1t\xdb\xf7%\x95\xee\xb0W\x05/\x80\x0f\xe8~\xfbz\xf7\xf0\xcb\xeah\x18\xa0A\xd2\xd1\x04\xceD\x9d`\x06C\xa0`@\x00\xecw\xa0@9P\x91\xcdFi\x86M\xf4=\xac\x95~La\x97\x15\xc0\xaf\xffF\xcd@\xec\xa3j\xf1-P\xd2\x1d(\xc9WB\xc1\xfa\x166\xc6b\xbd[\x14\xa2\x0f\x18ٌ,\x97\xef@C\a\xa3'\xc0\xdf\xc8\xd9J\x144\"\x1e$\xe0\x0eG~\xb0\x19\xe8\x00\xbf\x01\xee\fA\xc4\x10\x91\xd0\x159\x1d%\x06\tRn8A\r+\x8c\x92\x06\xa8\xf3\xc96\xa2\xb9-F\x86\x88ڷ\xce\xfc\xbb\xcbM\u0090lj\x15\x8fr\xd8\x7f\xc61F\xa7,l\x95M\xf8\x16\x94k\xa0W\xcf\x101\xf3\x94\xdcA\xbe\x1cB5\xfc\xe1#\x82q\x1b\xbf\x80\x8e9\xd0b>o\r\x8f\xbd\xa3}\xdf'g\xf8y\x9e\xdb\xc0\xac\x13\xfbH\xf3\x06\xb7h\xe7d\xdaJE\xdd\x19F\xcd)\xe2\\\x05Se\xe8.\xf7O\xdd7?ġ\xdb\xe8\xcd\x11V~\x16\x99\x11G\xe3ڃ\x89\xac\xf9+\x15\x10\xd5\x17\xc1\x94\xa5\xe5\x14{\xa2eHع\xff\xb8\xfa\x06\xe3ֹ\x18\xa7\xec\x17\xe5\xec\x16Ҿ\x04B\x98q\x1b\x8c\xa5\x88Yy\x92\x13]\x13\xbcq\x9c\x7f\xb45\xe8N駴\xee\r\xd3(f\xa9U\r\xcbl(\xb0FH\xa1Q\x8cM\rw\x0e\x96\xaaG\xbbT\x84\xff{\x01\x84i\xaa\x84\xd8\xdbJp腧\xc1\x85\xb5\x83\x89\xd1\xc9.\xd4\xeb\xa4\xd5W\x01\xb5TO\b\x94\x95fctn\r\xd8\xf8\bj\xdf\xf9\x03\x81\xf5Q\xe6\xe9\xce\xcd\xe0Tl\x91OGO\xb0|\xcbA\xb2\xfdS\xa7\x8e\x8d\xe6G\xac\xdbZ\xbc\x82\x06 \xc5=~\xaa\xcf2^\xc6\x00\x93\xea\x9dD2\x8aXh\x10^\xc5\nĤ\x0e1\x9do-\x1f\xba\xd4OoP\xc1\xef\x19\xf3g\xdf^\x9d_z\xc7\"\xf7\xabA\x0fަ\x1eWN\x05\xea\xfc\v\xb1w\x8c\xfd\x9f\x01c\xb91\xaf\x86\x8e\x17\xef\ue5ba\x12\x98\xec\xc5}\xefQ\xfc\x1e/\x9ft\b\xb8)\xcb\r\x98\x86ț\x0e\xba\\ݽ\x86\xc2\v\xe1\xaf(ҝ\xdb\xf8\xe9\xb8\v\xed=~\xf9\x1a\x7fY\xab\xf2\x10\x18\xb5*K\xca݆\xf0)\xad1:d\xa4\xbd\xcd>\x19\xee&3\x02}S\xe6\x84H\xf9\x01\xa4\xd5\xe9\xd3K\xbe5B\x83\x16\x19\x1bX?\x97\x1b\xe9\x99\x18\xfbs\xdc\x1b\x1f{\xc5\v\x90˻b3!#\x97\xacUk\x8b\v\xe0\x98.\xa9l\xf2\xe0\xa1S4цGg\xfe*1S\xc2\xd85\xe3Ue\xc0\xc5{\xa3\x82/\xf841\xfa5z\x8dDx\xdeF\x17O2\xd9\x04g\x83$/\xac急\xe1\xe1>\x8c\xfc\x17\x00\x00\xff\xff\t\x15i;\xcd\r\x00\x00"), []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xc4YKs\x1b7\xf2\xbf\xebSt9\a\xfdSe\x0ec\xff\xb7\xb6\xb6x\xb3\xe5͖v\x13Yeʾ\xa4r\x00\a=3\x88f\x00\x04\xc0P\xe2\xa6\xf2ݷ\x1a\x0fr\x1e )\xa9\xd6\u07b9H\x04\x1a\x8d\x1f\x1a\xfd\xc6b\xb1\xb8`Z|Ac\x85\x92+`Z\xe0\xa3CI\xbflq\xff7[\b\xb5ܾ\xb9\xb8\x17\x92\xafષNu\x9fЪޔ\xf8\x01+!\x85\x13J^t\xe8\x18g\x8e\xad.\x00\x98\x94\xca1\x1a\xb6\xf4\x13\xa0T\xd2\x19նh\x165\xca\xe2\xbe\xdf\xe0\xa6\x17-G㙧\xad\xb7?\x14o\xde\x16?\\\x00H\xd6\xe1\n\xb4\xe2[\xd5\xf6\x1dnXy\xdfk[l\xb1E\xa3\n\xa1.\xacƒx\xd7F\xf5z\x05\x87\x89\xb06\xee\x1b0\xdf*\xfeųy\xef\xd9\xf8\x99VX\xf7\xaf\xdc\xecO\xc2:O\xa1\xdbްv\x0e\xc2OZ!\xeb\xbeef6}\x01`K\xa5q\x057\x04C\xb3\x12\xf9\x05@<\xa2\x87\xb5\x00ƹ\x17\x1ako\x8d\x90\x0e\xcd\x15qH\xc2Z\x00G[\x1a\xa1\x9d\x17ʭ\xe2\x10\x00B@\b\xd61\xd7[\xb0}\xd9\x00\xb3p\x83\x0f\xcbkykTm\xd0\x06x\x00\xbfY%o\x99kVP\x04\xf2B7\xccb\x9c\r\xe2]\xfb\x898\xe4v\x04\xda:#d\x9d\x83q':\x84\x87\x06%\xb8FX\b\xa7\x85\af\t\x8eq\xfe\x94\xf9\x8d\xfd<-\xb7\x8euz\x84\xe0\xca ;,\r\x108s\x98\x03\xb0\x97'\xa8\n\\\x83$y\xafXLH!k?\x14n\x02\x9c\x82\rz\x88ȡ\xd7\x19d\x1a\xcbB+^\xc8\xc4t\x04\xebf2zN6D\xff\xdfF5\x02t\xab\xf8\v\xa0\x98\x9d\xb8\x01\ng ,\xb0\xb84\x9c\xe2 \xe8\xe4\x8e>\xfd}}\aik\x7f\x19S\xe9{\xb9\x1f\x16\xda\xc3\x15\x90\xc0\x84\xacȬ\xe9\x12+\xa3:\xcf\x13%\xd7JH\xe7\x7f\x94\xad@9\x15\xbf\xed7\x9dpt\xef\xbf\xf7h\x1d\xddU\x01W>S \xf7\xd4k\xd2\\^\xc0\xb5\x84+\xd6a{\xc5,~\xf5\v I\xdb\x05\t\xf6iW0Lr\xa6\xc4Aj\x83\x89\x94\xa2\x1c\xb9\xafIޱ\xd6X\xd2\xed\x91\x00i\xa5\xa8D\xf4P\x952\xc0\xa6\xe4ňq\xdep\xe9\xcbz\xa7)\xd1\x04\xd9\xfbܚ\x84M\x0e|jr\x98\x81r\xc6\x14\xa0\x9dz\xd9\xfd\x1a\x83ZY\xe1\x94\xd9\x11\xe3\xe0`\x8b\x19\x87#\xd7@\x9fT\x1cϜ\xe3Fq\xcc\xc1\xa6\xa5\xe0\x1a\x16\xb4\x95\xf2+\xf2G\xbd\x94\xf3]\xe8S\xf2Y\xc0\xb4\xe2gp\xc5\x1d\x19\x18\xacР,19\xaeS\xc9C\x06\xd90\xac\xcf1\x1eW\n8\xe1ճ\x88\xdf\xdd^'O\x9e\x84\x18\xb1\xbb\xf9\xbeg\xe4C_%\xb0\xe5>Н\xdf\xfb\xf2\xba\n\x9by\x9f\xe6\x140\xd0\x02C\x1a\xb8\x0f\x12 \xa4u\xc88\xa8*ˑj\x12 \xc37\x18W\xbc\x0e\x1e,\xba\xcaCh!\xd9\x03#\xdf)8\xfcs\xfd\xf1f\xf9\x8f\x9c\xe8\xf7\xa7\x00V\x96h}\x16\xec\xb0C\xe9^\xef\x13s\x8eV\x18\xe4\x94fc\xd11)*\xb4\xae\x88{\xa0\xb1\xbf\xbc\xfd5/=\x80\x1f\x95\x01|d\x9dn\xf15\x88 \xf1\xbd[NJ#l\x10Ǟ#<\b\u05c8i0\xddK\x80\xd4+\x1e\xfb\xc1\x1fױ{\x04\x15\x8f\xdb#\xb4\xe2\x1eW\xf0ʧ5\a\x98\x7f\x90\xed\xfc\xf9\xea\b\xd7\xff\v\xa6\xfd\x8a\x88^\x05p\xfb8<4\xba\x03\xc8`yF\xd45\x1e\xb2\xaa\xe9\xe7\x83\n\xb9\xea\xefA\x19\x92\x80T\x03\x16\x9e1\xdd^p\x94\xc8g\xa0\x7fy\xfb\xebQ\xc4cy\x81\x90\x1c\x1f\xe1-\x88X\xdahſ/\xe0\xcek\xc7N:\xf6H;\x95\x8d\xb2xL\xb2J\xb6\xbb\x90\xe7n\x11\xac\xa2B\t\xdbv\x11\xf2 \x0e\x0flGRH\x17G\xfa\xc6@3\xe3Njk\xca~\xee>~\xf8\xb8\n\xc8H\xa1j\xef\x89)jV\x82\xb2\x19JcB,\xf6\xda8\v\xe6\xe9\xb3}P\x1f\xa7\xa0l\x98\xac1\x9c\x17\xa1\xea):\x16\x97/\xb1\xe3yJ\x92\xbeLj2u\x1c\xff\xb3\xe0\xfe\xc4\xc3\xf9\f\xfa\t\x87\x1bV\x19'\x0fw\xdfo\xd0Ht\xe8\xcf\xc7Ui\xe9h%jg\x97j\x8bf+\xf0a\xf9\xa0̽\x90\xf5\x82Ts\x11t\xc0.}\x99\xba\xfc\xce\xffy\xf1Y|E\xfb\xd4\x03\x8d*\xed\xafy*\xda\xc7._t\xa8\x94\xc3>=\x8e]\xaecf5]Kf\xf1Ј\xb2I\xc5I\xf4\xb1G\x8cIP&̃kfr\xf7\xd5U\x99\x04\xda\x1bB\xb4[\xc4^ڂIN\xff[a\x1d\x8d\xbfH\x82\xbdx\x92\xf9~\xbe\xfe\xf0m\x14\xbc\x17/\xb2\xd5#\tx\xf8\x1e\x17\aX\x8b\x8e\xe9E\xa0fNu\xa2\x9cPSVz\xcdI\xf0\x95@s&\x8d\xfb4\"N\x89f&\xbf\xdd\xd3<+\x8ft\xac\xce$n\xc3\xd6\xe1\xa9\xf4\ue93cƍ\x1bV[`\x06\x81A\xc74\xdd\xf3=\xee\x16!!\xd0LP4\xa7\x80\xbd\xef\x8a\x00Ӻ\x15\xd9\xc0\x1d\xc3~LY\xa3$\xa8,g\xb5=v\xf6쭥.\xd0\x1a\x1d\x95\xad\xdfD\x0e\x9f'{>Y&\xf9\xc4z$\x8a\xaa\x90\xbb\xaa\xbdoy\x96\xa9\x8e\x9f\xb4\xcfA\x1d\x11\x9f\x89B\xf11=\x17\x83֨\x99!K\xf7\xaf.W\xd3g\xc1\xd7`\x85o%Sf\x1aR\xd5\xd0\xe8\xb1\x14\x9c(\xb5R\x063.\x13\xe6ae\x14D\xc6\xf0\xbfe\xfc\xc8\xea\xc9l\xd0#\xe7\x03\xde\xf19b8\xd2o\xf6Om+\xf8\xe3ϋ\xff\x04\x00\x00\xff\xff{ŋW\xf4\"\x00\x00"), []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xc4YKs#\xb7\x11\xbe\xf3Wt\xad\x0f\x8a\xabv\x86\xdeM*\x95\xe2mW\x8aSJl\xadj\xa9\u074b\xcb\apМ\x819\x03\xc0x\x90b\\\xfe\xef\xa9\x06\x06\xe4\xbcHJ\xaaȞˮ\x80F\xe3Ç~\xa1\x99eٌi\xf1\x15\x8d\x15J.\x80i\x81\x8f\x0e%\xfde\xf3\xcd?l.\xd4|\xfbn\xb6\x11\x92/\xe0\xda[\xa7\x9a\xcfh\x957\x05\xde\xe0ZHᄒ\xb3\x06\x1d\xe3̱\xc5\f\x80I\xa9\x1c\xa3aK\x7f\x02\x14J:\xa3\xea\x1aMV\xa2\xcc7~\x85+/j\x8e&(O[o\xbf\xcb߽Ͽ\x9b\x01H\xd6\xe0\x02\xb4\xe2[U\xfb\x06\rZ\xa7\f\xda|\x8b5\x1a\x95\v5\xb3\x1a\vR^\x1a\xe5\xf5\x02\x8e\x13qq\xbbq\x04}\xaf\xf8נ\xe7s\xd4\x13\xa6ja\xdd\x7f&\xa7\x7f\x10\xd6\x05\x11]{\xc3\xea\t\x1ca\xd6\nY\xfa\x9a\x99\xf1\xfc\f\xc0\x16J\xe3\x02\xee\b\x8af\x05\xf2\x19@{\xce\x00-\x03\xc6y`\x8e\xd5\xf7FH\x87\xe6\x9aT$\xc62\xe0h\v#\xb4\v\xcc\x1c\xf4\x80Z\x83\xab\x90\xb6\f\xac2!\x85,\xc3P\x84\x00N\xc1\n\xa1E\u00832\x80_\xac\x92\xf7\xccU\vȉ\xb8\\+\x9eˤ\xb3\x95\x89\x9c\xdf\rFݞ\xcea\x9d\x11\xb2<\x85\xec\xff\f\xaa\x87\xe7^\xf1'\"y\xa80\xc8$4^\u05caq4\xb4y\xc5$\xaf\x11\xc8@\xc1\x19&\xed\x1a\xcd\t\x14i\xd9\xc3^\xf7\x91|I\xfa:3\xcfa\xe79TD\xd9\xde\xf6_\xbbC\x97\xf6\xbdW\xbc]\x00\xadQ\x83u\xccy\v\xd6\x17\x150\vw\xb8\x9b\xdf\xca{\xa3J\x83\xd6N\xc0\b\u2e6e\x98\xed\xe3X\x86\x89\xd7űV\xa6an\x01B\xba\xbf\xff\xed4\xb6vQ\xee\x94c\xf5ǽC\xdbC\xfa0\x1c\x8eh\xc9\xd9\xca\xf6\xfa\xff\x14\xb8+\x82t\xa3d\x9f\u05cf\x83\xd1)\xb0\x1d\xa5)\xde\xe6\x85\xc1\x10j\x1fD\x83ֱF\xf7\xb4~(\xfb\xfa8sq No\xdf\xc5PVTذE+\xa94\xca\x0f\xf7\xb7_\xff\xba\xec\r\x03h\xa34\x1a'Rt\x8d_'ytF\xa1\xcf\xec\x15)\x8cR\xc0)k\xa0\x8dN\x11ǐ\xb7\x18\xa2\xb3\b\v\x06\xb5A\x8b2摞b !&A\xad~\xc1\xc2\xe5\xb0DCj\xc0V\xca\xd7!\x02m\xd180X\xa8R\x8a\xff\x1et[\xf2=ڴf\x0e\xdb\x10\x7f\xfcB\f\x96\xac\x86-\xab=\xbe\x05&94l\x0f\x06i\x17\xf0\xb2\xa3/\x88\xd8\x1c~$\v\x11r\xad\x16P9\xa7\xedb>/\x85KI\xb3PM\xe3\xa5p\xfby\xc8\x7fb\xe5\x9d2v\xceq\x8b\xf5܊2c\xa6\xa8\x84\xc3\xc2y\x83s\xa6E\x16\xa0ː8\xf3\x86\x7fc\xda4k\xafzXGN\x17\xbf\x90\xeb\xce\xdc\x00%;\x10\x16X\xbb4\x9e\xe2Ht\nٟ\xff\xb9|\x80\xb4u\xb8\x8c!\xfb\x81\xf7\xe3B{\xbc\x02\"L\xc85\x05]\xbaĵQMЉ\x92k%\xa4\v\x7f\x14\xb5@9\xa4\xdf\xfaU#\x1c\xdd\xfb\xaf\x1e\xad\xa3\xbb\xca\xe1:T\x12\x14/\xbd&\xcb\xe59\xdcJ\xb8f\r\xd6\xd7\xcc\xe2\xab_\x001m3\"\xf6iW\xd0-\x82\x86\u0091\xb5\xceD\xaa`N\xdcװ*Yj,\xe8\xfa\x88AZ*֢\b\xbeA\xe1\a\xd8H>艹v]\xfaV\xac\xd8x\xbdtʰ\x12\x7fPQ\xe7Ph\x80\xed\xe3Ԛ\x04Nvr^T\x0e6J\x8e\x94\x02\xd4i\xf1\xaeB\x83\xdd5\x06\xb5\xb2\xc2)\xb3'\xc51[\xe6#\r'.\"\x1cY\xf1\vǠp\x1f\x1c\xc2\xe0\x1a\r\xca\x02S\x848W\xc9L\x9c\xa2\x93\xd0\xc7\x10OS\x0fg\xa2\xe7$\xe0\x0f\xf7\xb7)b&\x86[\xe8n\xbc\xef\x05z\xe8[\v\xacyH(\x97\xf7\xbe\xba]\xc7\xcdB\xecp\n\x18h\x81\xb1\"=\x04c\x10\xd2:d\x1c\xd4zR#\xbd\r\x80\x1c\xcc`\xbb\xe2m\x8c\x14mH:\x86p\xa2\x1e\x18\xc5(\xc1\xe1\xdf\xcbOw\xf3\x7fM1\x7f8\x05\xb0\xa2@kC\xbe\xc6\x06\xa5{{\xc8\xd9\x1c\xad0ȩp\xc1\xbcaR\xacѺ\xbc\xdd\x03\x8d\xfd\xe9\xfd\xcf\xd3\xec\x01|\xaf\f\xe0#kt\x8doAD\xc6\x0f\xe1/ٌ\xb0\x91\x8e\x83F\xd8\tW\x89a\xd2:0@\xd6\xd5\x1e{\x17\x8e\xeb\xd8\x06A\xb5\xc7\xf5\b\xb5\xd8\xe0\x02ބJ\xf0\b\xf37r\xac\xdfߜ\xd0\xfa\x97\xe8@oH\xe8M\x04w\xc8w]\x8f<\x82t\x15s\xe0\x8c(K<\x16\xa2\xc3/\x04o\n\x89߂2ĀT\x1d\x15A1\xdd^\x8cG\xc8G\xa0\x7fz\xff\xf3I\xc4}\xbe@H\x8e\x8f\xf0\x1e\x84\x8c\xdchſ\xcd\xe1!X\xc7^:\xf6H;\x15\x95\xb2x\x8aY%\xeb}\xac\xf6\xb7\bV5\b;\xac\xeb,\xd6\x1b\x1cvlO,\xa4\x8b#{c\xa0\x99qg\xad5U\x19\x0f\x9fn>-\"22\xa82\xc4;\xcaNkAU\x03\x95\v1\xe7\x05k\x1c%\xcd\xf4Y\x1f\xcd\xc7)(*&K\x8c\xe7EX{\xcaB\xf9\xd5K\xfcx\x9c\xfa\xd37Q\x02\f\x03ǟ\x96D\x9fx\xb8P\xa9>\xe1pݷ\xd6\xd9\xc3m\xfc\n\x8dD\x87\xe1|\\\x15\x96\x8eV\xa0vv\xae\xb6h\xb6\x02w\xf3\x9d2\x1b!ˌL3\x8b6`\xe7\xe1\xc9<\xff&\xfc\xf3Ⳅ\xd7\xf5S\x0f\xd4{\xf4\xbf\xe6\xa9h\x1f;\x7fѡR\xad\xf8\xf4\x8bE\x96f\x82*$*\x82b\xd59]\xd73\xadk*l\xdaR\xea\xd0T,\x94\\\x8bқ\xf0z\x19\x93\"}]\xb3U\x8d\vpƏ\xe9<\xe3)\xdd\xfe\xe3\x85\xcb\xfd\xd2\x11M7{\xa1\x03ꪩ\xbb\xed\xf5ELJA\xe9\x9b1\x94\f6J\v61Nv=\xf2i\x9ax3\xae\x05\xcf\\lt\x9a\v\x1c\xb4\xed\xba\x89\xb7g\xebs\xb1\x16\x0f#\xf4\xde\v\x9e7\x9dĞ\xeb\x8b\x06\x7f\xf5\xf4\xb0\xe8#̦_\xd4\x03\x19\xad\xf8lHZ7\x8c\r&\x8fAh8\xd1\xf7\xef\xc1l\xaf\x8d\xdc=\u0378\x19\x11z\x94\xcfiGľh\xcb{̊.uK\xe9I\xf8\xe2\x86D\xa1\xe8\xb9\xd5ki^\xb0\x81\xeb\xf1\x8a\xd0\xfd3\xbc\xf5\t\xd1`x\xe5ǖ\xee\x8eٴ\xc9\xd4}CG_\\\x1a*\x11R\x87<<\x86譶f\xa2F\x0e\x87_\xa6\xc2\xcf\x0f6\xb4\xc1\xae\xa6j\xff\xa4\xc8[\xe4!\xd6N\x80\x1e\xafK\x9de\xce\x1cf\xa4\xe2e\x81fҽ\x1a\xb4\x96\x95\x97\xfc\xeb\xc7(\x15\xfb$\xed\x12`+\xe5ݡQ\xd2:ZKŕm\xad\xe0y͚\x8a\xd9KP\xeeIf\xca\xe2\x0e.\x7f\xde\xe4\xe0L(\xbb\xc3\xdd\xc4\xe8\xa8\xd3ߝ\xbcN&41\xf7}\xb0\x8eg\x11\xd0nt\x89\x83V\f*U'\xebV\x8e\x12\xb9oVh\x88\x88\xf0\xf3Bb$\x05\x8e\xa9\xceSx\xb1\x1e\x99|\xed\xf2\x19\xd3C\xec#\xde;\xccג\xc0\"\x8c\x89\x1d(GD\xe46\v\x13DYK&\f\xfeQp\x06b\x88~\xddl+f,\xdd\x7fk@[\x86\x96k\xf2\x01e\a\xd9\x02i\xea\x92\x1a(\xd7d#\xc8\aZ\x01\xff@5\xbc:\x01,\xa6\xf5\xca\"6\x8f\x04]\xb17\xec\xec\xb0\xd6\xf9!\b\xaf\x11z\xf9\xd3\xffPC\xd1;1v\x18\xdb\xf9cNvR\xf5\x84\x83\x1d\xb2\xee\x01M\x1fZ\xdb\xdc\xe9\xb7\x12l\xf8\xcb`)\xff\x19;Z\xfe\xb1\x8bh\x04\xfb\xad\x01\x14q\xee\xc4\u0099H9\x03I\xc2\xfa\x90-\xd6g\xbf\x8f\xe0\xd46\xf8^\xf0\xa6\x842J۳\xbd\fV\xfc\xf1l\x00j\x1dʄ\xe5\x7f+\xfe\xed\xb2E\xfb\xab\x15\xa7\x89\x15S\x05\xc4r \x13\x0e\x1ea\x027\x9bĴm\xcc@\x95X\xdc\xe4\xee\b\x11\r\xe7t\xcb\xe1\x86\x18\xd5\xc0\bf\xa8R\xf44\x82\x98\xa0\x82s\xf1\x12\xfb{\x81\xc0Y\x01]E\xe1P\xe3\x94\fU\xe7+\"?8V\x98\xb6\xe2,\xec\xf2NrV\x9cfQ\x93\x1a\x14\x8e\x9b?|\x81\x83\xb7p\xa0G&UbK\xf6Dڮ\x1dE\xda\nSie\x99\aR^\xb6\xe1$\xb2\x0eR>\xce\xd1\xfegۧ\x95ڤ@\xe3-n\xc5S\xdb+\xd1-\x10\xf8\x0eEc\x12\xcb$\xa4lP\x81HEj\xa9\xcd8\xdd\xc7e\x0fq\xe2`\x8ci\xc9\x14Ӝ\xed̋\xca@9\xbbўؔ\x02\xecZ+K\xb9\xb6\xaf\x92\x8d\xeb;\xd4o\x1d\x8c\xa71B\xb6TCI\xa4\xe7\xfa\x86\x83\xf6s\x95H\xfeV\xae\\\x8f\x82\x8e\x9bw\x96\x06\xa7[\xe0D\x03\x87\xc2Hu\x8e\xc9\x1c|\xba\x96#+G𘐚}\xf6o76\x01\x92X6\x7f:\xb0\xe2\xe0\x8c\x00˛\b\x87\x94\x124\n\x0ek\xa8\x9e\xc66I\xe6h\xef'\x99\x12\x1dm\x9b9SCx)qҶ\fq۶\x19\xc1{&X\xfc\xf7\xa4\xe6l\xdb?&b\x83&\xb9\x80i7gC_\x96iѩ\xb2\xc6\xfefG\xa0\xaa\xcd\xe9\x9a0\x13\xbe\xceA\xa4\x9cw\xe6\xff\x03\x13f9\xc7o\x86#_\x94\xe3'\xa92\a\xd1R%N\xff\a$\n*\x8b\a\xaf+\xb2\t\xf2\x97\xee\xa8k\xc2v\x91 \xe55\xd91n@\r(\xf3\xac\xf3\xf2\x12\xc8\xc8\xd1w\xb6U\xd4\x14\x87\x8f߭e\xa3\xdb8S&^\x86\x83\x9dI\x1c|\x84\xbeb\x9e\x81K\xd0}e\n*\xe7\x16\x7fEl\xb6_П\xb8\xfd\xfc\x13\x94S\xe8!y\x9cw\xb6\x91\xdb\xc1b\xbbS{;?w\x1b\xde\xf4\x89>\x93\vx\\\x13J\x1e\xe1\xe4,\x16*\x88%\x0e5h\xef&\xbd\xa7s\xe4`\xe4\x05\x99\xec\x11N\bƇRfG粂k\x8f\x900\xf7S\xad\x87@\xbb&\xef\xe0:L\xda\x0f\x88\bt\xbc\xf3\x91G0,\x16d\xd1\xfc\xe6H\xbe \t-\xe0\xfe\x82mF\xb2u\u0087HطڑȞ\x82\x03\xab37\x8a\xd1C\rxZB`\xec\x1b嬌\x139\xbe߈qk\xb8\xdf>K\xb3\x11\xd7\xce#\xd3\xc8%?IП\xa5\xc1/\xaf\x82N\xb7\xf0\v\x90\xe9\x06\xe2\xf1\x12Nl[\xf6\x15\x85\xb1\xb5\x00w\x06\x94\x0f\xfe9\x01\x1d<\x87g\xfaTs\xc1\xbd\x18أ1 k\x11<\xc3M.U\x92\xb3\xc4%֦\xc5\xcbB;\xfd\xe3\xf7NlҞl\xfbww#/m\r\x17\xb2\xaa\xe809\x98\xb5\xd4\x0fnd\xe0i\x0f\xc8Q_\xed\x1b<\xcf\xf9fb\xe0!L\v>1s`\x82\xd0 6@y\x86\xa2\xa4\x96\xf3\x12̵\x03\xd5d\v bL\xfdG\xd0\xf3\x15\x13\x1b\x9c\x80\xbc\x7fq\xbb\x80\xb4躈\x9c\x01Ց\xa0\xf1\x03j\xaa\\\x93J\x96\xe4\xe9\x00\nz\\q\x1e(\xb7\x96f&H!M7\x1ea\xe1ֲ|\xabɎ)m\xba\v\xcde\xb8F\xe7\xb2\xc3B\n\xdb\xdd}e\x15\xc8\xc6\\@\x83\x8f\xed\xe8^^\xb7\xa2\xdfY\xd5T\x84V\xb2\xc90\n\\\xb3\xfa\x85U1\xf9\xea)\xf0D\x99\x89y(\x8c\xcc\x18i\xa9Ts0\xb9$\xde\xc2Ί\xa3B\n\xcdJP\xa18\xc0Q\x96I{pw\x94\xf1&\x95\xf6I\xb5\xa5\xee\xad\xf8\xa8\xd4E\xde\xed\x177\xb2\x13m<ȧ>\x82\xb2Qp\xa0G lG\x98! \nK\x17PNd\xe3\x14\x1e\x19\x88\x9al\xb6\xcc\x13\xf0\xb6\x81h\xaa<\x04\xac\xf0d31\x19L\xebv\xffD\x19\x7f\r\xb2Y\xce\xfb$\xd5=\xd0\xf2\x92\x00̯\x9d\xe1\x04\x84n\x14&\xee\x9dxyb\x8fv\xd9!ζ9To\xa5\xe4@\x87\x05O\xa9fq}\xb9\x18\xfa\xb5\x1d\xfd\xbb\x88\xa1H\x81|sa\v\x9eT^\x16Qc\xa0\xaa\xddy\x93D5\xa2\xab}^A\n-\xf1\xc1\xfd*^ҹf\x82e\x10v\x90sa\xa6kYZ\x10\xafjY\xda\t\xa2QqI\xf8l\xd3\x03`OgpRp\xed\x91k\x16X\x99[ \xb4,\xa1t\x81Ik\xaax\x9fŕ\x97\x8d\x94*$w\xb7\xdcL̢lh=\x8f\x14C\xb1\xea\b\xabF<\n\xf9$V\xe8\xc9\xeb\xc5\x02$?4\xf8\xa2ӛ\x8b%\xd1\xef)\x85\xfa\xfc\x9a\xcfS\xc1xz\x05)\x93\xcd7\x8b\xa2!S\\0'\xd7\\\xe9\xf2ȏ\xb3\xab\x98\x9a\x7fb\xb0O4\x7fp5ǹ\xf5l\x9b\xf4\xa8\x8e\xf1\xf7t\x00s\x00\x15\x8a\x99WX\xb7\x9d\x92\xd3m>\xba\xf5cb\x81\x9b\xe5\x9f`\n\xbb\xc2\xcbA\xc9[\xdaѱV\xc0\xb5el\xdap\xe3ʏU\x93`\xa2\xac¯\xb4e\x90S91W/ѯ\x01\x8c\xf5\n\xa1\bP\x86I\x12;t\xb4t\x95\xbe\xddd|\xbf\xf0\x01C~a\xa5\x7f\xf7\xf2\xc0\x8c\x9a\x86\x99J\x86\xe9\xa2\xc9)|\x9d\xb3M\x17c-\x0f\xfa~\xbe\x9a\xf6\xc7B\x9f\x81\xeaK\xed\xcf\xc1\xa8\x01\xda\xc7`bȠ\x1c\x04%\xb7uٱ\xb0\x80\xb2\x94p\xb1\xa7Ї\x03-\xc4\xdb\x02O\xa2\f\x805\x86\x9a\xfdi\xf3\xd5\xedL\x93\x7f'\a\xd9$J\xea&\xb03S`1^V\xe1\x93\b`\xe8\xf1\xfd\xba\xff\x8b\x91\xbe\xc8\x02#_\x89ݡ\xa3\xd2FS\x99(ّ\x95\r\xe5\xbdC\xd6a\x8b\x96{\x88TD0\x9eʯZ\xb6\n\xe3{lD\xbe\xd4.ϲX\x1cM\x9b\x88y\xb5\x18\x17W`\xf4+,F\x94\xd4ҔC~\xa9i~\x8d\xc5tQĒʊa\xdd\xc4(\xd0\xf9z\x8a\x1c\xeb~\xa6v₊\x89\xccj\xb9g'Hrj\".\xaa\x84\x98-(ˬ\x7f\xe8W6L\x83\\P\xf5\x90\x85\x9c\xf9\n\x87\xc5u\r\xbe\x8e`r\x1f\xd9\xd5\f\x89:\x85I\xc0\xa35\fS\xd5\t\xd3(OT.\xe4\xd7$L\x82\xc6z\x85\xf9J\x84\x97\xab7|\t/`\\\xd4\xccV\x13<\xcbKȨ\x17XR%0\x8b\xb1\v+\x02b\xc6\x7fdޥu\x00\xfd<\xff\bМ\xec\xffHv\x7f\x04\xe2d\xce?7\xa7?\x02{F\xedNr\xc9\xe4\x8fKr\xf9\xd1\r\xf9\x85\xd65\x13\xfbs>\xc9\xe5\xa6IN:+\x04\xe8\xce\xd9c\xa5\xae\xb7\xd0\xf3\xb3RS\xba[\xb9\t\x9f,\x84\xf5\x980rMn\xc5\xe9\f.^\tH\xfa \xfdk[vYO\x8c\xf3\xee\xdd$\x04\xdb\x05\xe5o\xf9\xe9td\xc0v\x1c\xb3\xb0\x93$\x94\xaag\x1dϹ`_\x06ݻ\x81\xc2ik;eh3s\xb8\xd0ڮ\x1anX\x9d<\xf2\xb5\x92G\x86a\xc7\x03\x9c\">\xff*\xf1V\xd0\xf6\x84\x90\xbe\xdc\xc7Ӹ\x1e8\x0e4u\x86\x9e\x80sB\xf5\xf9\xf6\vw1\xb6\x90+\xbc\xebf)\x19\xf8\xc1_\xa0\xbd\xc6\x13\x9b\xf2\xd8E\xb8\xb2YY0x\xb9V'\"\"\xa3\xbah\xda\x1ev\xa6;~\xfb\xad\x01u\"\xf2\x889}o ͔\xdd;\xb9\xa2\xad\xff\x16$\x9d\x17\x97\xee:\xf6\xc0Oh\xe5\v\xb9\x15Nc'\xc1\x0eֈp\xac\x88k}#+ͭ\xdb3\xd25\tU\xc88:\xcd\x0f\x93\x8a)\xb7f\xfdu=\xa5\xe5\xbeҬ\x95\xf2*\xfe\xd2\xe5\x1e\xd3\x04\xc8\xdc\x1a\xf4\xbc\x9c\xc8l\xcd\xf9kyNs\xbeS\xb6јWS\xfe\x1a\xb5\xe4\vj\xc8\x17\xf8P˼\xa8l4\xe5Ԋ\xbf\x8a/\xf5\x8a\xde\xd4k\xf8S\x97yT3 \a5\xe09\xd5\xddYi\xbc\xec\x9cMN\x96m>s<]\xb5\x9dQ\xad\x9d\x91\r\x9a[iFU\xf6\xb2j\xec\f\x1c\xbe\x92\xaf\xf5J\xde\xd6k\xf8[\xaf\xebq\xcd\xfa\\\xb3\x9c3\xf3\xf3\xb2*ꋓ\f!\x1d\xfdY\x96p'\x95\x99s\x10\xee\x86\xfd\x13)\xc0\x8e\xd3$yID\xe8\x9a\xca4X\xdb\xdf\xdb\xfd\x97m*\x9d\xad\v\xe6\xef/\xb2\xb4k\x9b\xcb-\xdc\x0f\xba\x9f]\xa1݁\x02\xe1\x1e\x96\xf8\xef\x87/\x9f#\xfc\x94=\xea\x8d\xde\xc1\x9b\x06\xce\xc0(=r|\xf6\xc9\x17\xdc8l\xa1\x0e\x7f\xe1$\x01\xad\xd9\x7f\xe1\x9b]\xf3\x01\x99ۻ\rv\r\xd6\x12\xbe\xf5\x15\x13\xfa1\xf7\xb6\x05\xab=\"FF\xb9\x7f\xb3\xebAL\x94\x9d\xc6?\t\xbe\x98\x14\xb4\x17\x1b\xab\xc9rEH\xf6\xd4\xddm\xdc\xea\xd6\xe4\x935\xddĉH\xc7x\a\xa6\xcaUM\x959!w\xe8븆\xf1\xa0L\xd0!S\xa1\x93QQ{\xfe\x16T\x12\xb7\xe1I(L\xc0\x9d\xea~6s\x88\xd1K\xd61~{b\xf6\xde\xc4\v\xaec\\\x1d\xaf\x10S\x89\xcf\xc9\n\x88\x17\vIy1t\xf7mN\xac\xddǎ\xd3\xf2\xccz\xb2!\xac\x93\xc0\x8f\x1d\x8f\"M\vZ\xebC\"*\xf4<\x99\x86\x0fU\x19j\x9a\xcc\xfd\xb8\xbe\xbd-\xb1\xe2\xd0\x11@O\x10D\x94\xea<\xdb7X\x93=\xab\x0e\x10\xaaa4\xa1\x05\xe3\xd7\x1d\xc7\xfc\xf7Iyf>\vr\xf1\x83 \x0e=#\xa2\x02#MV\x8c\x05^h\xf1rA\xb2sք\xcb(l\x9d\xb6;3_\x94\xb8\xf8-\x89yd%\x105\xf6\x8cD\xceS\x11\x7fW|N\x88$]\x1c\xa0l8d<\xf0\xf6\xd0\xe9:\xff\xc4[\x00\x9c:\x93\xb2\xffț\xc5kG\xbdZ\x83\xb7\xff\x98\x9cG\xba\x87\xf0{\x86\x88Oݾ>\xdc\xe9p\xe0^\x93\xa1\xae\xbe\x0f߃5,:\x98#\x8a\xc4μH<\x1f\xa4|̲B\x7f\x8e\x1d\xdbh\v\x13\x8e\x8f\xf0j\xdbV6\xa6k_ʱ\xd8,\xbe\xbb\xf8\xc2\xf2\x1aa\u07ba\xbb.c!\xc4\xf3\x87\x1d\xe3\x80\xe8\xcfIC9\x11M\xb5\x05\x85\f\x19;\x1c&\xee{?\x84\xd7e9?]\x0f!\x0f\x9e\x9bnaOAD\xd2{\x19й\x03\x1cb_\x03 \xae\xfb\xc4ӓ\x04\xdf\n\x0e*\x7f챻)\x8e\x8e8\xfe\x84\x8b\xcaE\xb0\xeb=\x86]\xb7x\xe7ƀH{a$\xe4\x9eñ\xb8`\xe9\x13\xf6^}\xa0z\xceл\xb3}\xe2\xe5ߎN\x8a6\xde\xfdȑL_F\\\x91\xcf\xf0\x94\xf8ꐅ\x19\x9c\xb4&Y\x91\x8d\xb8Sr\xaf@\x9f3\xce\no\xa71\xb1\xff$\xd5\x1do\xf6L\xc4\xe2\xe1e\x9d\xef\xa82̲\xb2[Ob쇠\xcb\x12\xbf͏\x1e\xff\x81\t\xca\xd9\xdfRF\x7f\xf7ǹ\x19&\x84]\xed\x917\x1b\x17u\xdd\xe6\x04\x9d\x97\xc4ou\xabxR1D\x0fmM>K\x03!]\xc9\xfa@\x99&[\xd0f\x05\xbb\x9dTƅ\xb1W+\xc2v\xde\xe0I\x85[)\xe3\xe8n\xb9g\xbe\xad\x0f\x16\v\xec\xa2\xf1\xefCj\n\xb5\v\xfai\x15=\xb9\xc8\x1c-\nkK\xc3;mhʦ\x7f\x96\xf8\x05\x92\x90l;\rn\x16\x81\x06\xd0\xdd\xe8o\xc0\xab\xd5\xea\x8a\xd6\xec+H\xc5\x04\xbf#\xb4f\xf0]\x037\x7f\xa9\xf5\xf3\xbf\xa95\x13\xb7\x87\x9f\xae\x9e\x19\xcf\xef\xc8\xfbFiQ=\x82\x12\x8d\xcc\xe0g\xd81\xce4\x13\xfc\xaa\x02Ms\xaa\xe9\xdd\x15!\x94s\xa1\xa9\xf9Y\x99?\t\xc9\x04\xd7R\x94%\xc8\xd5\x1e\xf8\xfa\xb9\xd9¶ae\x0e\x12\x81\xfb\xa9\x0f\x7fZ\xff\xf4\xcf\xeb?]\x11\xc2i\x05wD\x82\xd2B\x82Z\x1f\xa0\x04)\xd6L\\\xa9\x1a2\x03s/ESߑ\xf6\x83\x1d\xe3\xe6\xb3k}\xb4\xc3\xf1\x97\x92)\xfd\xe7\xee\xaf\x7faJ㗺l$-\xdb\xc9\xf0G\xc5\xf8\xbe)\xa9\f?_\x11\xa22Q\xc3\x1d\xf9d\xa6\xa9i\x06\xf9\x15!n\xe98\xedʭ\xfa\xf0\x93\x05\x91\x15PQ\xbb\x1eBD\r\xfc\xfea\xf3\xf5_\x9ez?\x13\x92\x83\xca$\xab5\"\xc0\xad\x8d0E(\xf9\x8a{3\v@\\\x13]PM$\xd4\x12\x14p\xad\x88.\x80к.Y\x86\xa8\x0e\x10\t\x11\xbb0J\x91\x9d\x14U\vmK\xb3\xe7\xa6&Z\x10J4\x95{\xd0\xe4\xcf\xcd\x16$\a\r\x8ade\xa34\xc8u\x80UKQ\x83\xd4\xcc#ֶ\x0e\xbbt~\x1d\xec\xe5\x9dٮ\xedEr\xc3'`\x97\xecP\x06\xb9ÐY\xad.\x98j\xb76\u070e\xdb\x12\xe5Dl\xff\n\x99^\x93'\x90\x06\fQ\x85h\xcaܰ\xd7\x01\xa4AN&\xf6\x9c\xfd-\xc0Vf\xa3fҒjp\xf4n\x1b\xe3\x1a$\xa7%9в\x81\x1bByN*z$\x12\xcc,\xa4\xe1\x1dx\xd8E\xadɯH\x1e\xbe\x13w\xa4кVw\xb7\xb7{\xa6\xfd1\xc9DU5\x9c\xe9\xe3-r<\xdb6ZHu\x9b\xc3\x01\xca[\xc5\xf6+*\xb3\x82i\xc8t#\xe1\x96\xd6l\x85K\xe7xT\xd6U\xfeO\x81l\xefzk\xd5G\xc3yJK\xc6\xf7\x9d\x0f\xc8\xe63\x140\foy\xc9\x0e\xb5\xbbh\x11m~2\xd8y\xfc\xf0\xf4\xa5\xcbgL\r\xb1\x8fx\xef0_K\x02\x830\xc6w -\x11\x91\xdb\fL\xe0y-\x18\xd7\xf8GV2\xe0C\xf4\xabf[1m\xe8\xfe[\x03\xca0\xb4X\x93\xf7(;\xc8\x16HS\xe7TC\xbe&\x1bN\xde\xd3\n\xca\xf7T\xc1\xc5\t`0\xadV\x06\xb1i$芽ag\x8b\xb5\xce\a/\xbc&\xe8\xe5N\xffS\rY\xefĘal\xe7\x8e9\xd9\t\xd9\x13\x0efȺ\a4~hM\xb3\xa7\xdfH\xb0\xe1\x97\xc1R\xfe#t4\xfcc\x16\xd1p\xf6[\x03(\xe2쉅\x91H\x19\x81$~}\xc8\x16\xeb\xd1\xf7\t\x9c\x9a\x06߳\xb2\xc9!\x0f\xd2v\xb4\x97\xc1\x8a?\x8c\x06\xa0֡\x8c\x1b\xfe7\xe2\xdf,\x9b\xb7_\x8d8\x8d\xac\x98J \x86\x03\x19\xb7\xf0\b\xe3\xb8\xd9(\xa6Mc\x1a\xaa\xc8\xe2fwG\boʒnK\xb8#Z60\x81\x19*%=N ƫ\xe0T\xbc\x84\xfeN \x94,\x83\xae\xa2\xb0\xa8\xb1J\x86\xca\xf1\x8a\xc8\xef\x1c+L\x19q\xe6w\xf9 J\x96\x1d\x17Q\x13\x1b䏛;|\x9e\x83\xb7P\xd0\x03\x132\xb2%s\"M\xd7\xe7V\x91\xb6\xc2T\x18Y\xe6\x80\xe4\xa3\xc1\xc0\x9bj\xbc\xca\x15ႏ\xb7\xbfr21\xf2AB&!\xf6)\t\xa3\x13'0\x86\x9dG7Q:\xfb%A\xe93e\\\x90t\xd9\xf4\xa5\x00\ta\xd7S\x94|ae\x89&\xd2q̠Ĉ[!\x9b\x002\xa3ܐ\xca1\xf6NȊ\xa2ȸFS\xd3\x1b\xa9\xb7~!\xd7\x11\x88B\x92\xeb\xf0\x9dlv\x04\xaaZ\x1fo\b5\xe2\x9c6\xa5\x0er\xa85\xcf\xfe\xf0 \xf2\x1b\xf2\xf0\xf5\x86<\x99\xdd\xe8\x9b\b\xdc\xf7\x82\xef\xd8\xfeWZ\xff\xd1n\xc9hGeTc\x8b\xbf\x17\xa6\v\xb2c\x9c\x96\xecoF-\x9b\xbfE\xa3[\x03\xf9\xd6#k%\xa1\x12\aX\x85\xce\xff\x1e匮\x15oguz\xd9\xc3\xc1\xe9\x1d\xfe\xc3\xf7@\x91\xb0\xc1\b`\\\xabx\xe1 U\xc1\xeaG\u0601\x04\x9e\x81\x1a\x13\t\xbeӪ.#\xcajEj\x91\x8fa\xafHmȤ4p}\x10eSE\xe6_\x11\x85\x88\x8e}\xc9\x10\xd1\x15\xad\xc7\x1f\x7f\xb0@+\x84x^:[\xbf\x98>\xadQF2\xf4͂\xa4r\xc2\xdc\xd9\xc8[ \xf0\x1d\xb2FG\xa4\x10!y\x83\xf6\xa1\x90\xa4\x16JO\x8b\xf5iӂt\x0ei\xf4\xe3\f\nG;s\x96\x90go\xb3ўU$8\x98\xb5VF0\xb7}\xa5hl\xdf\x18\xd39\x84\xc71B\xb6TAN\x84SjM\t\xca͕\xa3to͆\xd8\xf1\x1cl\xde:\x12%\xddBI\x14\x94\x90i!c\xf2g\x19\x9f\xb6\xa5\x98B\x13x\x8c\x18E}\xed\xd6nl\x06$1Z\xec\xa5`Yam|Û\b\x87\xe4\x02\x14\x9e\xfbI!\xeb\xdb,\xed\xdd$s\a\xa9m\vGj\b/v\xb8ږ`M\xb5m\xc1\xae\x1a\xd9\r\xee\xf7\xa8aܶ\xff\x9f\x88\xf5\x86\xe2\x19L\xbb\x19\r}[\xa6Ř\x89\xf1\xe5[\x05ʹ\xffu\t\"5\x8a.\xcc\xff\x0fL\x98\xd39~3\x1c\xf9\xa6\x1c?K\x95%\x88\x86*a\xfa\x7f@\xa2\xa0\xb2xr\xba\"\x99 \x7f鎺!l\x17\b\x92ߐ\x1d+5\xc8\x01e^u^\xde\x02\x19)\xfaδ\x8a\xea\xac\xf8\xf0\xddX6\xaa\r#'\xe2e8\xd8:\x17\xde\xf4\xee+\xe6\x05\xb8\x04\xa3SLBe\xa3^_\x10\x9b\xed/\x18.\xb8\xff\xf43\xe4s\xe8!i\x9c7\xda\xc8\xfd`\xb1ݩ\x9dǔ\xba\rg\xfa\x84\x90\x88\x8dg\x1a\xd7\xe4\x19\x8e\xd6b\xa1\x9c\x18\xe2P\x8d\xeel482F\x0e\x06V\xad\xf7\vG\x04\xe3\"\xa5\x8b\xa3SY\xc1\xb6g\x88x\xf3\xb1\xd6C\xa0Y\x93\x8b_YL\x9a\x1f\x10\x11\x18WKG\x1e\xc1\xa8\xb7\x97E˛#\xe9\x82\xc47\x8f\xfb3\xb6\x19\xc8\xd6\xc9\x0e a\xdf)K\"s\n\nV'n\x14\x93\x03\n\xf0\xb4\xf8\xb8\xf7WZ\xb20\x1db\xa7\x9b\xd7\x0f\xfdV5\n=q.\xf8\nU\xe5:6\x93Ev\"H!{\x14\x19/-Lj'L\x04\xfb\xc5h\x12;\xde&xJ\x9aA\xee\xbdMLKP\r{\x96\x91\n\xe4~Nqt[m\xe4{\xda\x12\x12\xa5\xaem'rX\x9aj\xf7͉\xee|y1+sr\x13zyb/v\x9d\xc8FLw]\xde\x11\xaaX\xb4?\x16\xb1K\xf3\x1c3Ĵ|8A\xe2\x9f@\x8b\xb1\xee\xb7\v\xb3\x1a\xb2\xa2\xb59\xbf\xffc\xd4\x1c2\xf4\xff\x92\x9a2\x99p\x86\xef1\v\\Bo\xac\v\x0fv\xa7130E\f}\x0f\xb4\x1c\xe7\xb9\"\x9b\x13F\xb6@i\x15\xb9؍,\x96\x1b\xf2R\beu\xea\x8eA\x19\v\xd9\xf4\x1bS\xe4\xfa\x19\x8e\xd77#9p\xbd\xe1\xd7V\xc1\x9f,n\x82\xb5 xy$\xd78\xf6\xfa5FP\"'&v\xfb\xbej#\ueaca\xd6+ǽZT,\x9b\x1cǣٯ\xb6\xf5ة\x9b\x01kS_\xce<\x9e\xdbm\x12\xff\xd6B\xe9_⁾\x89\xf5<\xf8\x11}\x9b6\x12/[\xb4\xf5]\xec+\bcc\x01\xee4H\x17\xfc\xb3\x02\xda{\x0e\xaf\xf4\xa9\x96\x82{!\xb0GC\xbe\xc5 x\x81\x9bl&4e\x89\xa7X\x9b\x06/'\xda\xe9\x1f\xbewb\x93\xe6d\x9b\xbf\xbb\x1bykk8\x13UE\x87\xb9\xff\xa4\xa5\xbe\xb7#=O;@\x96\xfar\xdf\xe0yN7\x13=\x0fa\xd6\xff\x85\xe9\x82qB\xbd\xd8\x00\xe9\x18\x8a\x92Z,K0\xdb\n\xaa\xc8\x16\x80\x87\x94\xd9\xefA\xcfW\x8cop\x02\xf2ӛ\xdb\x05\xa4E\xd7Y\xe4\xf4\xa8\x0e\x04\r?\xa0\xa6J5\xa9D\xeerj]\xae\x18\aʍ\xa5\x99\b\x92\vݍG\x18\xb8\xb5\xc8\xdf)\xb2cR\xe9\xeeBS\x19\x0es^\x97\xf0\x15\xcc\uefb0\nD\xa3Ϡ\xc1\x87vt\xafl\xa3\xa2\xdfY\xd5T\x84V\xa2I0\nl3\xfa\x85U\xa1\xb6\xc2Q\xe0\x852\x1d\xd2\xcc\x18\x99\xd1\xc2P\xa9.!\x92\xf3\x8d\xb7-\xec\x8c8\xca\x04W,\a\xe9k\x7f,e\x990\awGY\xd9\xc4\xd2>\xb1v\xaa{\xcb?Hy\x96w\xfbَ\xecD\x1b\v\xf1\xd2GP2\n\nz\x00\xc2v\x84i\x02<3t\x01iE6Nᐁ\xa8If\xcb4\x01O&\xb3\xfd\xb1\xb6\u0093\xcd\xf8l0\xad\xdb\xfd#e\xe5%\xc8f8\uf8d0\x8f@\xf3s\x020\xdf:\xc3\tp\xd5H\xac˱\xe2兕ik6\x94#%mxV\x00\xca)\xde\x13\x1fĂg\\i\xa0\xa9\xbc`\xac\xa6\x86s\xc6\xf7i\xb4K\x0eq\xb6͢z+D\ttX\xcf\x18k\x06\xd7狡o\xed\xe8\x1f\"\x86\x02\x05\xd2ͅ-8R9YD\xb5\x86\xaa\xb6\xe7M\x10\xd9\xf0\xae\xf6\xb9\x80\x14:\xc5\aw\xabxK\xe7\x9aq\x96@\xd8A΅\xe9\xaeei@\\Բ4\x13\x04\xa3\xe2\x9c\xf0٦\a\xc0\x9cN\xef\xa4\xe0\xda\x03ל`en\x81\xd0<\x87\xdc\x06&\x8d\xa9\xe2|\x16[=:Q\xaa\x10\xdd\xdd\xe9fb\x12e}\xeby\xa4\x18\x8a\x95\aX5\xfc\x99\x8b\x17\xbeBO^\x9d,@\xd2C\x83o:\xbd>[\x12\xfdH)\xd4\xe7\xd7t\x9e\xf2\xc6\xd3\x05\xa4L2ߜ\x14\r\x99\xe3\x82%\xb9fo&L|\\\\\xc5\xdc\xfc3\x83]\xa2\xf9\xbd\xbdR\x90Z/\xb8\x89\x8f\xea\x18\x7f/\x05\xe8\x02\xa4\xbf\xab\xb0\xc2k\x1919\xdd\xe6\xa3[?&ԯ\x1a\xfe\U00066c2dq\x1bT\xb4\xc6\x1d\x1dc\x05\xdc\xf8j>{\xbb@6\x11&J\xaa\xfb\x8a[\x06)\x95\x13K\xf5\x12\xfd\x12\xdfP\xaf\xe0k|\x85\x9f$\xb2CKK[\xc8\xdfM\xc6\xf7\v\x1f0\xe4\xe7W\xfaw\xaf\xfeM\xa8iX\xa8d\x98\xaf\x89\x9e\xc3טm\xba\x18ky\xd0\xf5s\xc5\xf2\xbf/\xf4i\xa8>\xd7\xee\x1cL\x1a\xa0}\fF\x86\f\xcaAPr\x1b\x97\x1d\v\v(\x8b\t\x17s\n]8\xd0@\xbc\xcf\xf0$\n\x0fXa\xa8\xd9\xd7\xce\xda\xcb+L\x91\x7f%\x85h\"%u3\xd8Y(\xb0\x98.\xabpI\x04\xd0\xf4\xf0Ӻ\xffE\vWd\x81\x91\xaf\xc8\xee\xd0Qi\xa3\xa9\x8c\xe7\xec\xc0\U000865bdC\xd6a\x8b\x96{\x88\x90\x84\xb32\x96_5l\xe5\xc7\xf7؈|\xaem\x9e\xe5dq4o\"\xa6\xd5b\x9c]\x81ѯ\xb0\x98PR\xa7\xa6\x1c\xd2KM\xd3k,\xe6\x8b\"N\xa9\xac\x18\xd6ML\x02]\xae\xa7H\xb1\xee\x17j'Ψ\x98H\xac\x96{u\x82$\xa5&\xe2\xacJ\x88ł\xb2\xc4\xfa\x87~e\xc3<\xc8\x13\xaa\x1e\x92\x90\xb3\\\xe1pr]\x83\xab#\x98\xddGr5C\xa4Na\x16\xf0d\r\xc3\\u\xc2<\xca#\x95\v\xe95\t\xb3\xa0\xb1^a\xb9\x12\xe1\xed\xea\r\xdf\xc2\v\x98\x165\x8b\xd5\x04\xaf\xf2\x12\x12\xea\x05N\xa9\x12X\xc4ؙ\x15\x01!\xe3?1\xef\xa9u\x00\xfd<\xff\x04Д\xec\xffDv\x7f\x02\xe2l\xce?5\xa7?\x01{A\xed\xcer\xc9\xec\xc7Sr\xf9\xc1\r\xf9\x95\xd65\xe3\xfb1\x9f\xa4r\xd3,'\x8d\n\x01\xbas\xf6X\xa9\xeb-\xf4\xfc\xacؔ\xf6\xd2}\xc4'\xf3a=ƵX\x93{~\x1c\xc1\xc5+\x01Q\x1f\xa4\x7f+\xd3,\xcb_\x14\xf3yT\x04\xdb\x05\xe5.\xf1\xaaxd\xc0t\x9c\xb2\xb0\xa3$\x14\xb2g\x1d/\xb9`\x9f\aݻ\x81\xc2yk;fh3]\x9cimWM\xa9Y\x1d=\xf2\xb5\x14\a\x86a\xc7\x02\x8e\x01\x9f\x7f\x15x+h{DH\x9f\x1f\xc3i\\\x0f\x1c\a\x1a\xbd\xfa\x06eI\xa8\x1ao?\xb3\xf7\xde3\xb1\xc2{\x97\x86\x92\x9e\x1f\xdc\xfd\xf8\x1b<\xb11\x8f\x9d\xfb\x1bٕ\xbf\xc4hܮt\xafr\xde\x1e\xb6\xa6;\xfe\xf6[\x03\xf2H\xc4\x01s\xfa\xce@Z(\xbb\xb7rE\x19\xff\xcdK:'.\xedk\v\x03?\xa1\x95/\xe4\x9e[\x8d\x1d\x05;X#\xc21\"\xae\xf5\x8d\x8c47n\xcfD\xd7(T.\xc2\xe88?\xcc*\xa6Ԛ\xf5\xcbzJ\xa7\xfbJ\x8bV\xcaE\xfc\xa5\xf3=\xa6\x19\x90\xa95\xe8i9\x91Ś\xf3KyNK\xbeS\xb2јVS~\x89Z\xf2\x13j\xc8O\xf0\xa1N\xf3\xa2\x92єR+~\x11_\xea\x82\xde\xd4%\xfc\xa9\xf3<\xaa\x05\x90\x83\x1a\xf0\x94\xea\xee\xa44^r\xce&%˶\x9c9\x9e\xaf\xdaN\xa8\xd6N\xc8\x06-\xad4\xa1*\xfb\xb4j\xec\x04\x1c^\xc8\u05fa\x90\xb7u\t\x7f\xeb\xb2\x1eעϵ\xc89\v\x9fO\xab\xa2>;\xc9\xe0\xd3џD\x0e\x0fB\xea%\a\xe1a\xd8?\x92\x02\xec8M\xa2\xcc\t\xf7]c\x99\x06c\xfb;\xbb\xff\xbcMųu\xde\xfc\xfdU\xe4fmK\xb9\x85\xc7A\xf7\xd1\x15Z\xf7\x16\x86\xd9\xda\x7f=}\xfe\x14\xe0\xc7\xecQg\xf4\x0e\xde4\xb0\x06F\xee\x90\xe3\xb2O\xae\xe0\xc6b\vu\xf8\x1b'\th\xcd\xfe\x13\x9f\xe4[\x0e\xc8\xdc?l\xb0\xab\xb7\x96\xf0}\x95\x90\xd0\x0f\xb9\xb7-\x18\xed\x1102\xc9\xfd\x9b]\x0fb\xa4\xec4\xfcI\xf0A4\xaf\xbd\xd8TM\x96-B2\xa7\xeeacW\xb7&\x1f\x8d\xe9ƏDX\xc6+\x98\xccW5\x95\xfa\x88ܡn\xc2\x1a\xa6\x832^\x87̅N&E\xed\xf8\xa9\xb7(n\xfd\x8bo\x98\x80;\xd6\xfdl\xe6\x10\xa3\xe7\xacc\xfa\xf6\xc4⽉7\\Ǵ:^!\xa6\"?G+ \xde,$\xe5\xc4\xd0\xc3\xd7%\xb1\xf6\x18:\xce\xcb3\xe3\xc9\xfa\xb0N\x04?f<\x8a4\xc5i\xad\x8aHT\xe8u2\rߡ\xd3T7\x89\xfb\xb1}{[bY\xd1\x11@/\xe0E\x94\xec\xbc\xca9X\x939\xab\x16\x10\xaaa4\xa19+o:\x8e\xf9\x8fIy&>\vr\xf6\x83 \x16=\x13\xa2\xa2\xf3\x98\x92\xe5\x85\x16/g$;\x17M\xb8\x84\xc2\xd6y\xbb3\xf1E\x89\xb3ߒXFV\x04QS\xcfH\xa4<\x15\xf1w\xc5\xe7\x8cHRY\x01ySB\xc2\xfb\x8dO\x9d\xae\xcb/8z\xc0\xb13)\xfao8\x1a\xbcvԫ1x\xfboE:\xa4;\xc8\x13%\xde]\x90ֲ\xb7\xafNeƎWM\x96\x81R\xbb\xa6\xf4\xd52\xee\xc11\xdf=Z\x99\xef\xf7pRYHS\x97\x82\xe6 \xed\x03k\v8\xfd\xef^\xe7\x01\xc3ڗ\xc3\x1aپ\xd19\xfb<⫤Ӌd\x1a\x9ej*\x15|de\xd2y\xfb6\x18b\xbd\xb3]I\xf7\xb6\xba)g\x19\xbe\xe3\xe6\x14\x11\xce0q\x00v8^!\xac\xd2\x16\xaa\x88\x890L\xf2Q\x98\xaa\x91\x9f<\fq\x03`\xd5y\xe0\xf4*\x01\x8e\x8ah\xb8\x19\xed\x96\xd1Z\xe3\x05\x06$x#%r\xab\xfd&v\xa3GY{`\xa7)\xea*Q]\x1d\x95Ҵ\x8a\x18\xd1\xc3;|\xc3\x11\xf8\xf4\xb1\xcc;\x95Wݷ+CAU\x8c\x99\xa8\nŰ\xf9\xba\x03ۂA\xbbՀ\x86\x9c\xc0\x0181\xdcMY\t\xf9\\\xe5\xf5\x17\x8cx\xca\x03\xc8w*\xc0\xc1Z0s2\x9e4\x95:,}|\x98\xedۋw$\xa7\x1aVf\xf4y\xc6M\xfcUK)\x97\x93Sx\xdfȝ\x11\xbc$\x84\xe4-KwK\xa8\x02\xa5\xe8\xde{^/ \x81\xec\x81\x1b\x14Ͻ\xad\xd7^\xb4r\xc27\x94\f\x1al\xd1L7\xd4M`\x8d\x9c\x90\xb6\x8b\x80t\xef1\xa33\xb7\x9f\x14y\x8ck؏\x12f\xee\x92\xd7#P5|\xbf{\x84\x88\x8fݾ.\xdciq`_\x93\xa1\xb6\xbe\x0f\x9f{\xd6,8\x98\x13\x8a\xc4\xcc|\x92x.\x84xN\xb2B\x7f\t\x1d\xdbh\v㖏\xf0j\xdbV4\xbak_\x8a\xa9\xd8,\xbe\xbb\xf8\xc6\xf2\x1aa\xdeۻ.S!\xc4\xf1Îa@\xf0焦%\xe1M\xb5\x05\x89\f\x19:\x143\xf7\xbd\x9f\xfc\xe3\xd1ey\xbc\x19B\x1e\xbc&\xdf\u009e\x83\x88\xa4w2\xa0s\a\xd8Ǿ\x06@l\xf7\x99\xa7'\t>\x05\xeeU\xfe\xd4cws\x1c\x1dp\xfc\x11\x17\x95\x8a`\xdb{\n\xbbv\xf1֍\x01\x1e\xf7\u0088\xcf=\xfbcq\xc6\xd2g콺\xa0j\xc9\xd0{0}\xc2\xe5ߎN\n6\xde\xe3đ\x9czz\xf8\x13\xbcD~\xb5\xc8\xc2\fN\\\x93\xacȆ?H\xb1\x97\xa0b/\xab~\xa3L3\xbe\xff(\xe4C\xd9\xec\x19\x0f\xc5çu~\xa0R3\xc3\xcav=\x91\xb1\xef\xbd.\x8b|[\x1e=\xfd\xc1\xbe\x96\x1b3\xfa\xbb\x1f\x97f\x98\x11v\xb5C\xdeb\\\xd4v[\x12tN\x12\xbfS\xad\xe2\x89\xc5\x10\x1d\xb45\xf9$4\xf8t%\xeb\x03e\x8alA\xe9\x15\xecvBj\x1b\xc6^\xad\b\xdb9\x83'\x16n\xa5\xacDw˾Xm|\xb0P`\x17\x8c\x7f\x17R\x93\xa8]\xd0O\xab\xe8\xd1F\xe6h\x96\x19[\x1an\x95\xa61\x9b\xfeU\xf2\x18\xfd;w,R\xa4Ŧ\xdb?D\xb5\x82\xa4@p\x16ux\xbdت\xf2h\xa9\x06\xc1\xab\xac\x9d\xd7\r\x882j\xf1\x1c\xb9A\xac\xc4\xdaL\xfb\xaa\xfd;Y\xa1\xf3\x94\xc0s\xdb\xe8\xbdW>]\x8e͔\x1fjh\x96\x15\x94\xef\r\xfbH\xd1\xec\vςS\x16\xcf\x04м\xc1\xb0w\x8dG^\xf9\xb4\xbfn$\xefd\xad\\!@\xde.w\x0e\xe8٢W\xb6\x97\x12Z\xe13\xa3\xc2c^\xc3\xc4\xe0\t\xfc\xc7b\xeaa\bUG\x9e\xcdߔ\xb0.'\x9b\xb9\x109\x87\x8c\xe8~\x83(=g\xbfap\xfa~\xbbV@드\xb2\xf9\xe9P\xc3\x1b\xa0cʺX\xc6ż\xa5\x81\xfb\x8b\xac\xfc$rw-\x15o\x93\xc4\x02\x9b\xc6J9\r\x17\xaa\xe7\xad-ŝz\x9d_\xe7\x95\xe2\xc4\xc6'\xfd\xfdz\x93\x87`\x0f}H\xf1+\xbf\x0e\xba\x0f\xae\x9d\x19\x0f\xb3\x85\xe8|\xc1\br\xfe\xc0v\xfe\x1f?mK\xf8\xe3\xa8\xc7\x0f\xbe>\xf6B%g|\xbf\xb4\xf9o\xae[ĭv\x10\"\x8eud\x13\xc1\xd5>ɱ\xf6\x8b\x9c\xf8\xdf&\xc1\xd9~\x85k\x1dU'\xa3\x1f\x91\x91\xf3\x0e\x92\xddL\xee\x97\xff\v\x00\x00\xff\xff\xc6\xfd\x13\xe8\x8em\x00\x00"), []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xec=Mw\xdc8rw\xfd\n<\xe5\xe0\xddaW\x15\xcf \xbf`\xcc\xe3O]\xaf\x18\xcfs\xa2\b/n\xb5\x90\x16\xf4\x8d*\xea2Pb\xc5r0\x99\x16\x95\xa5\x11\xdfYnk\xc3Ԏ\xd9=t\xfb\xc1\xf2\x8bQ\xf2\x96\xdb\xfd5[\x1b\xaa\xb7\xae\xf6܄_\x1d\x89\x1c\x00\xff\xc9\x1e\x117c\xb5\x90\x0fc\xbd\xbdg7ZI\x06\xdf*\r\x06Qf91P>\xb0\xa7=Hf\x15ӵ$T\xfe\x83g\x8fu5\x82H\x05\xd9z\x80\xa7Ǥ\xffq\x0e\x97\xfb=\xb0\x82\x1bˬ(\x81q\xdf!{\xe2\x86p\xd8)\xcd\xec^\x98y\x9a \x90\x1e\xb6\x0e\x9d\x9f\x86\x9f\x1dB9\xb7\xe0\xd1\xe9\x80\n»\xce4\x90\xdcދ\x12\x8c\xe5e\x1f\xe6\xfb\aH\x00F$\xaaxmH8\xdaַ\xddO\x0e\xc0V\xa9\x02\xb8\xbch+\x1d\xde9\xd9\xcb\xf6P\xf2k_YU \xdf\xdfn\xbe\xfe\xeb]\xef3\x1bȒ\xa7\x14\x13\x86q\xf6\x95&\x06\xd3~\xa62\xbb\xe7\x96i@\u0383\xb4X\xa3Ұ\n\xd4\xcd\x1b\x90\x8c)\xcd*\xd0B\xe5\"\v\\\xa1\xc6f\xaf\xea\"g[@\x06\xad\x9b\x06\x95V\x15h+\xc2\xd4s\xa5\xa3Q:_\a\x18\xbf\xc1A\xb9ZN\x12\xc1\x90\xf0\xf9\t\x05\xb9\xa7\x83\x9b\x1f´\xf8\x13\x93z\x80\x19V⒩\xed/\x90\xd95\xbb\x03\x8d`\x02֙\x92\a\xd0H\x81L=H\xf1?\rl\x83RoI\x18-x}\xd0\x16\x9a\xc0\x92\x17\xec\xc0\x8b\x1a\xae\x18\x979+\xf9\x91i\xc0^X-;\xf0\xa8\x8aY\xb3\x9f\x95\x06&\xe4N]\xb3\xbd\xb5\x95\xb9~\xfb\xf6AؠI3U\x96\xb5\x14\xf6\xf8\x96\x94\xa2\xd8\xd6Vi\xf36\x87\x03\x14o\x8dxXq\x9d텅\xcc\xd6\x1a\xde\xf2J\xac\buI\xdat]\xe6\xff\x148j\xde\xf4p=\x99o\xae\x90\"\x9c\xe0\x00jD'0\xae\xa9\x1bEKh\xfc\x84\xd4\xf9\xf2\xf1\xee\xbe+L\xc2\f\xa9Ot\xefHX\xcb\x02$\x98\x90;\xf03z\xa7UI0A\xe6\x95\x12\xd2\xd2\x1fY!@\x0e\xc9o\xeam),\xf2\xfd\xaf5\x18\x8b\xbcZ\xb3\x1b2/(\x87u\x8530_\xb3\x8dd7\xbc\x84\xe2\x86\x1bxq\x06 \xa5\xcd\n\t\x9bƂ\xaee\x1cVvT\xeb\xfc\x10\xcc[\x84_a\x8e\xdfU\x90\xf5\xa6\f\xb6\x13;\x91\xd1\xc4 \xed٨\x80\x81\x06ue|\xd6\xd2/\xa4\xa6\x86_\ax8]\x16z\x05\x83\xf6\xc3\xee\x89í\x19C\xb9r\xd0P\xa7H5\xe4\xee\x98\x16\xecP\xc2C\x99\xc1\xa4\xaf\xf5R\xed\xdb\tL\xe6U\xdd:\x82\xe3\tW\t\xc5GQm\xca\x12r\xc1-\x14\xc7\x19L\xdf\xdc\xf5\xab\x8fQO\x11L\xb6ujW\xecF\xf0\xecR7\xaf\x81\x89\x0eD\x9aZ\x7f\t5N-\xe4_\xc8\xdav\r[\xb7\x10\x8d\xba\xe0kٲO\xecz?IxZ\xb3͎Y\x8djq\xdb5\xb4=\x90\xa2(p\xa6\xe2\xa8*\xc8{\xc8ƻ\x13;&\xac\x1f\xdf\b\xd0-'\x9c$[;\xefg\xdd\xda\xfa\xc6n#\xca\x03|\x9d\xf6F\x8cF`\xa2\\p\xcb$|\xb3m;$\x16\x8dr\xc7\v\xd3\f\xd3\rʫ ?\xb0\x11\x88IC\xbdb\xdb\xda:\x80c\x18\x8c\x80mp\x82\xb2\xb2\xc7+\xd7v\xa7\x8aB=1C\n\x17m\xddN<\xd4\xda\xe9\x82?\xe4\xb0\xe3ua\xaf\xdd(\xfe\xb8~\xb3h\x1aZ(+4\x8d3\xc2}\xef\xab\xe1\xe0P\a\xe4Md\x10\x9c\xdb\xe0J(\xefA\xb0\x13\x03N\xdd\xed\x01u\xd3A\xe4\xdeB\x8f\x92!\xae\xbd\xb0dF\xdcI^\x99\xbd\xb2(\x0f\xaa\xb6c\xb5\x06\x03\xb8\xb9\xdb\f\x1au\xe6'bE~*\x89\xa7U쉋Sm\xe6\n\xeaޛ\xbb\r\xfb\x8an?\x04\x98\xcc\xcdEfk-\xc9\xe5\xf8\x02\xbe\xec\xd2\x16]\x17`<*\u0381m\xf5\xceU\xcb)\x17\xc6\x17|\v\x053P@f\x95\x8e\x93'E\b\\I՟\x11ʎh\xd2~\x104\xabDۂ\x01\xe6^d{\xe7n\xa2\x94\x11,\x96+0\xa41xU\x15\x11+ԖY\xc9\xf0\x9d\xcd)\x8d\xb6$\xa8\x8f!ܘ\"iK\xa2\x0enˌ6\xeeS\xbd\x11\x9bW\xa2\xf7Д\xdf%웓\xe6\xcf/\xecHn\x01\xa6\xbb\xd6%l\xf8\x9a\x02\xb5\xe7\a\x9a\x7f0Ɲ7[6\xc3\xd6\xcf>[\x9e\x85k\r\x1a\xff L#cu\xe7m\xd5\"\x86\xfd\xd4myE\x8b\xf0\x9ea\xf9\x15ۉ\xc2\x02\xf9Rs\x88v\x1c\x9dY\xce='\x81Rm/\x96\x92\xdbl\xff\xb1ٺIh1\xa0\xd5\x10\x80\xf3\xcbC\fC)\x8b\xff|\xfc&\f\xa2(s\xf6A\x81\xf9\xa4,}yQ\x12\xbbA\x9cI`ט\xa6\xa5tf\x01鲨\xff\x16\a\xb7\xbd\xba\x87\x96m°\x8d\xc4\xf8\xcc\xd1g\t\x9b\xf6\x10\x90sh\x95\xb5\xa1\xedK\xa9\xe4\xca-i\xf9\xde\x16\x00\xed\xe2\xe5Y\xa5t\x8fSW\v!\x8e\xa2\xe8ѻGk\xe5~9\xc9=\x99*\x1a\xaa\x82g\x90\x87]6Jt\xe1\x16\x1eD\xc6J\xd0\x0f\xc0*\xb4\x1b\xe9B\xb5@\x93\xbbr\x86\x14\xa6\xbb\x16\xa1x\xb30\x92\xb71VV8\xeb\x13k\x066'U\x8fd\xb5LWO\x1b%\x99w\U000874a8\xdfM\xc3\\fY\x16\xf2\xeb\xd4\aqH:\xf7\xa3\xe4\xb4\xf1\xf474\xaf$\xde\x7fO\xb3\x86\\h\xb3f\xef)\t\xb5\x80n\xfb\xb0J\xd8\xe9*\t$b\"\fC99\xf0\x02\xdd\aTޒA\xe1\x9c\t\xb5;\xf1\xa0\xd2T\xcc\xd3^\x19g\U000db371\xcbG8\xfa\xcdٮ\x96\xb8\xdc\xc8\xe8\xaa}\xbf\xa0\xce?QZ\x8dעdqd\x97\xf4\xdb%9fK\xa6\xc8\x19\xce\xdb\x02\xa9^P\xf5\xdb\xea\xb1ނ\x96`\xc1\xacJ^\xad\xfcl\xb0\xaa\x8c\xeeq\xbaB\xa9\xa2K\xc2\b\x8cӃǃ\x8d\x9b\x84Jt\xff\xe7(\x90<\x1f*e\"\x99\x16\x11\xb4n\x95\xb1n\xf1\xb0窏\xac.\xa6D\x8e~ő\xf1\x9d\x05͌U:$/\xa2\xca\x1e,\xae\xa3Ԙy\xb9q\xfbD~%\xd3\x01\xc6\x00\xf5\xb2\xd5.\xce\x1e\\\xba\xbd*\xfc\xff<̌\x1c-\x82]i\x95\x81\x89f#\xb4%\xd1\xea\xcc,\xf66\v\xbd\xdc\x05~\xbb$\xb5\x9e\xb2\f\x1d\xca27\x1eI{FP\xf4\xf1[g\xcd\x1aU\x18\xfe\x9d\"\xca\xe7\xe0\xc8\xe8\xfcBY\xf2a\"m2\xba7\xaeu\x98\x80\x1e\x98\v\xb6\xf4CM\ni\x99\xcf\xedE\xf2\xb7洔Bn\xa8#\xf6\xee\xc5\x1c\x1d\x16\xcc@,#i\xac\f\xd8\xe1۷\fi>\xa4ƾ,\xa4\xaa)\xda\xe7\xd1\xd0\xe3\xec\xe9.H:\xa7\x18:\xe2R\xd9\xeeB\x8f\xef\xe9\x8da;\xa1\x8dm\x11^\x00U\x98\x89\xac\xa7\xd1\xe1\x9d\x11\x9fʏZ\x9f\x1d\x9e~v\xad;K\x92{\xf5䓘\x97\x04\xe5\x81\xf8{~\x00\x9fJ\n2S\xb5\xa4\xc52T\x17\xd8\xcd\x02\x88\x8e\x89Θ$\xda\xccNcY\x97\xe9\x04Y\x91t\n9\xbb\xb2\xd6m\xf2#\x17i+[\xec<\xb6ک$ʱ\xd2\xcf\f\xf5ٔ\xddl\xf5\x92\x7f\x13e]2^\"[\x96Ĝ;\x97\x87\x19R\xdb\x1d\xaf\x9f\xb8\xb0\xfeĐ۔]\xa6M3UV\x05X\b\x19\x96\x99\x92F\xe4и\x0f\x9e\xff\xa3\xf9\xaa\xb1\xc2َ\x8b\xa2\xd6\vt\xf4b\xce,\x8d\xf9\xbczz\xfe@.\x1d\x91\x15\x113q\xc1~\x81\xc3=o?*\xbd\xcce\xbe\xd5\xf0\xfc\xaei\xa5\x85rY\xfe\xd3\xde\xe9,L\xf2^\xfbީ\x17^.\x8f1\xf7t\x16*a\xf2\xea\x9e6\xe5\xd5=}uO_\xdd\xd3AyuO_\xdd\xd3W\xf7t\xbc\xbc\xba\xa7\x9d\xf2\xea\x9e&ۏ\x14\fW\xb4r;Q!\t\xab\xc4\xf4\x8d9\xb4g\xfa\xf2YJ\xfe,Ȓ\xec\xea\xcdxˑ\xb3@\x8bΐ\x98\x8e\xd1kҭqJ\x86\xc9\xe4\xceJ&x\xe1\xcfp\xd6& p\xf6Y\x9b\xcd$\x80g\xf0\x9d\xdf\x19\xf9\xae\xec\xd4\xe7?\a\xf3\x9c\xeb\x16ӹ\xa6I\x19\xa6Ik\x1b\xf38'\xe5\x90.\xcd\x1cM\xa2\xea\xd2,\xd1&\x03t\xa2\xe3\xa4\xdc\xd0Ӽϩ\xa1\xccf\x84Ƴ=\xa7\xc0\x8e\xe5\x81&\xe4xN\x80\xecf\x7f.v\x03f\xa5i\xb6\xc2\xd2\xdc\xcd\xf1;\x00C\x99\xb7\xceů!\xb3\xdfK&\xa5{NsJp\xf7y\xd0\x04\xa5%\xf8\x89c\x8ex\xc5\xfb^r\xfc\xf1%\x82\xab\xe7\b\xaf\x92\x1c\x91\x97\b\xb1^*\xc8Z\x1af-I\xdeH:\xbe\xf8\x12\xc1֒pk\x91Ϙ~<\xf1\xa5\x8e%\xbe@\xd8uvൈt\xa9\xc7\x0e\x17\x87_\t\xe3\x9b9fx\xe2\xa3%\x80\x8c\x1e/\x1c\x0f\xc1\x12 \x9e\x1c+\x9c\r\xc2R\xe6\xc10L\xfb\xeeC\x82ɉL\x8bv\xd3S\x93\x90\xd26\xba\xe7\x0f\xff%\x1e\xfaK\xdc\x06O\xc1>\xf1p\xdf\xf2C}\x89t>3<\x9b\xec:\xf1\xf0ޢ\x00\xed\xcc\x10m\x12\xe2\xd4a\xbd\xe9 mz\x01nxH\xef\fw\"A\xc2\x12\xaa,?h\xf7ݛ1J\xe7\xa0g\xf7\xb5\x96\x88\xf3\xac \x0f\xe2\xa8~\xff\x83\x1d\x9dp#*\xd6\xea\xee\x99\xc58\xaa\x9a{G2\xf6'!\xfdn=\nn\xc7'\xe9m\xbc\xb5\x0eS|_\xa7\xf5R\xfd\xe3\x01n\xc7\xce@\xc55\xed\xe3o\x8f.)Ȭ\xd9G\x9e\xed\x9b\x1e\" \xa9\xdf=7l\xa7t\xc9-\xbbl\xb6Bߺ\x0e\xf0\xef\xcb5c?\xaa&}\xa4s\xafX\x04\xaa\x11eU\x1c1bb\x97]0\xdf'8Q\x81\r\xf8ܪBd\x11\x0fq\xf4J:\xd7\xe0\xe4B\x1f\xba4/\xebdA\xc4b\x14l.\xfc\x85\x85\x83K\x85\xdd\xf5\xe2g.]\xf0J\xfc'\xbdՓ\xb66\xf6\xfevCՃT\xd1;?M\xf6\\#c[\x98V\xe8\xed\xc0\xc9\xf5\xe8B\x1d\xc9^m\xfe\x9c\x80H/e\x04?ë\xf1L\xa1\x16\xbb\xdd8,\xd7$X\\\x1e\x99\xf2o!\b\x9d\xaf*\xae\xa3\x9bz\xcc˃\xb9\xeaa\x18\xec\xf8\xdc\n֤Y;}\xf9\xa3[z4\x0f\x8f\x80\xd0f\xef\xb1\xeao\xa3\x13\xa5;\xf4\xfc\x1e\x9c\xa6\x0f.\xcf\x1eY~\x01\x9c\xa6]\xa6\x15Q1\xf2S4\x1d\xef\xd9W\x0f\x8d\xbfD\xfegu\x80\x0f\xd1U\xc4\xfe\xb3\x18\x83&#\tt\x01\xeaԵ\xe9m\xd6\\\xfc:\xebgȈ\v\xa8\xf8\x8b\xaf\x17\x8cϷ\x18\x7fK\x83\xee\xff\x0e\xb0'l\x1bN\xd9ۯ\x14n6\xea\xd2\xcfp\x1fL\x86\xa5\xc2\xc1U\xad\x11\x90\xb1\xa7D\x9e\x8bZVi\xfe\x00?)\xf7\xdaK\n\xb5\xfa-z\x0f\xfexg.d\x13\xfb\xb9\x16S\xe6~lC\x80\xed!\x83\x93\xeb\xe8\x11\xdb3o۷\xb6H\x18\xdc\xfd\xfdOn@\xf44\xc6\a\xff\xee\x05\xea]\x03H\xe90P\xd7h\x1b\xd7N{\xf5D\xf7\xb9w\x9f\xab\xe83\x1a\xfe\xd0{\xfa#L\x92\x14\xb5\xf6u\xbce\xc7[\xeeLשdA\xb5\x8b\xc2\xe2ƨL\x90\x83M\xbb#tj\xe4\xe5\ue71e\n\x94&\xe8X\x1b\xf8\xfc$A\x7f\t*\xd9ld쭍\xfe\xac9i\x18}g\xc3*r\xeb\a\xd5\xc7\xc29\xe9\td\xdc+-a\x9bG\x98\xe6\xfd\xa9S\xd2\xcd̫\xb8\x96\x1f\xf7IV\xe3\xcfᬚ\x17z.\x12(\xeb^\xa1\xe9\x03\x1e\x7f`\xcc=W\x93\xf1\xca\xd6:\xa8\x9cZ\xd3\x05\xdc\b\x04\xdc\xfd\xd4\xe7=1\xd6>H5\xc3\xcb\xf6a\xa7v\xe1{\xf6\xc9\xc8\x11\xfe5\x8f\x84E_\x14r!\xa3{\xd2q\x85\xf0\xcfc\xe7\xe8<@\x9c\xef\xdc;Q\t\xe3\xbd\vOe\x9d\x0e\xb8\x19\x06\x0e9\xf6\xf2\xd4K\x8e\x84\xae^\x9f\x19\xc3-\xd6i\xce.z\x91\xa1\x86\xe1\xca\xf6\xbb\x18\x13\xc6\x0f\xa3\xad\xd8'8\r>W\xec\xa3\xc4A\x9c\x12\xc0\x9d8\x83\x9c\x16\xfe\xc7\x1e\x8a\x9c\x1c\xe2\xa1iE\xc7\xfdF\xf4^_a\x0f\xaa\x0f\x92\x91\xe9\t\x9e\xa6\x8a;\xda7&\xa0\x7f\x10;\xb7+\x93\xe1\x98\xfexR#\xaa\x82'\xd5oL\xf5\x8e*\x87\x93\x8f\xf4\x9aX\xde\x11\x12\xefwv\xbf\xd4\xdb\xf6\x06}\xf6\xb7\xbf_\xfco\x00\x00\x00\xff\xff}\xef\x8a\xf1Mx\x00\x00"), []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xb4V\xcfo\xeb6\f\xbe\xe7\xaf \xb0û\xcc\xce\xebv\x19r\x1b\xba\x1d\x8am\x0fE\xf3л\"\xd3\tWY\xf2H*]\xf6\xd7\x0f\x92\xec&\xb1\x9d\xb5\x1b0\xdd\"\xf1\xc7Ǐ\xe4\xe7TU\xb52==#\v\x05\xbf\x01\xd3\x13\xfe\xa9\xe8\xd3/\xa9_~\x90\x9a\xc2\xfax\xb7z!\xdfl\xe0>\x8a\x86\xee\t%D\xb6\xf8\x13\xb6\xe4I)\xf8U\x87j\x1a\xa3f\xb3\x020\xde\a5\xe9Z\xd2O\x00\x1b\xbcrp\x0e\xb9ڣ\xaf_\xe2\x0ew\x91\\\x83\x9c\x83\x8f\xa9\x8f\x9f\xeb\xbb\xef\xea\xcf+\x00o:܀ \xa775\x1a\x85\U0004f222R\x1f\xd1!\x87\x9a\xc2Jz\xb4)\xfe\x9eC\xec7p~(\xfeC\xee\x82{\x9bCms\xa8\xa7\x12*\xbf:\x12\xfd\xe5\x96ů4X\xf5.\xb2qˀ\xb2\x81\x1c\x02\xeb\x97s\xd2\nD\xb8\xbc\x90\xdfGgx\xd1y\x05 6\xf4\xb8\x81\xec\xdb\x1b\x8b\xcd\n` $Ǫ\x06.\x8ew%\x9c=`gJ\x12\x80У\xff\xf1\xf1\xe1\xf9\xfb\xed\xd55@\x83b\x99zʹ.T\x06$``@\x01\x1a\xc0X\x8b\"`#3z\x85\x82\x12ȷ\x81\xbb\xdcɷ\xd0\x00f\x17\xa2\x82\x1e\x10\x9e3\xe5Ce\xf5\x9bIϡGV\x1a\xd9\x18\xdc\xceCvq;\xc1\xfa)\x95S\xac\xa0IӅ\x923\r\x94`30\x00\xa1\x05=\x90\x00c\xcf(\xe8u\x8a2\xf3ӂ\xf1\x10v\xbf\xa3\xd5z\xe0AR\xb3\xa2k\xd2P\x1e\x91\x15\x18m\xd8{\xfa\xeb-\xb6$BRRgt\x9c\x93\xf3!\xaf\xc8\xde88\x1a\x17\xf1[0\xbe\x81Μ\x801e\x81\xe8/\xe2e\x13\xa9\xe1\xb7\xc0\x98\xc9\xdc\xc0A\xb5\x97\xcdz\xbd'\x1d\x97ˆ\xae\x8b\x9e\xf4\xb4\xce{B\xbb\xa8\x81e\xdd\xe0\x11\xddZh_\x19\xb6\aR\xb4\x1a\x19צ\xa7*C\xf7y\xc1\xea\xae\xf9\x86\x87u\x94OWX\xf5\x94&K\x94\xc9\xef/\x1e\xf2B\xfcC\a\xd2:\x94\xf9(\xae\xa5\x8a3\xd1\xe9*\xb1\xf3\xf4\xf3\xf6+\x8c\xa9s3\xa6\xecg\xdeώrnA\"\x8c|\x8b\\\x9a\xd8r\xe8rL\xf4M\x1fȗ鲎\xd0O闸\xebHe\x9c\xddԫ\x1a\xee\xb3\xe2\xc0\x0e!\xf6\x8dQljx\xf0po:t\xf7F\xf0\x7fo@bZ\xaaD\xec\xc7Zp)\x96S\xe3\xc2\xda\xc5\xc3(s7\xfa\xb5\xb0\xdd\xdb\x1em\xea`\"1ySK6\xaf\a\xb4\x81\xc1,\xb9\xd4\x1fB\x92=\xfe%\x96AI\n\x9a\x89\xbe\xa4\xfd|\x1fͲ\x9c䗃\x11\x9c^N0=&\x9bi~G-ړuXB\x145\xc1\xf7\xa1\xa4\x83>v\xf3\x9c\x15|\xc1ׅ\xdbG\x0eIY\xb3\xae_\x9f\x1b\xb3\x01\xe5{\xb3'?+wZY\xb1\xca߰K\xa9\xbe\x10\xe8!\x10p\xf4>\xed\xedL!3\x90\xa9\x92\xcflH\xb1[@\xb3\x88\xe7\xc1\xb7!\x7f\xf0MJl\xb4\xec\x13\x0e\xcd\x1e\xf2\x14\\\v\x01o\xf7\xba\x9c\xb9x}\x88\xd0r\xf2\x97\xf4\xbf9'\xb9!\xc6\xc5\xdcUF\xb5\xf8\x902.1\xbe\xbc_\x03\xca\xe8\x9c\xd99܀r\x9c{\x17_\xc3lNө\x19G\xed+u(j\xba\xfe\xbd\x01\x9a9\xa4=y=\xa0\xbf\xb5\r\xf0j\xa6*\x7f\x95\x19v\xa7[\xae\xf7o\xff\x01\xe7+UFw\x03I\xbb+\xa5\x05\xce>D\xcab\xf7\xcaH/\xfe\xf3\x98\x11\xb2\xbd\xb4\x1d5\xe3j5\xc6?\"\xf3\x1anBXl\xf6\xec2\x87o.\xca\x13\rl\xf6c\xc1\x7f\a\x00\x00\xff\xff\xb1J-\xe7\xa6\v\x00\x00"), []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xb4VA\x93\xdb6\x0f\xbd\xfbW`&\x87\xbdDr\xf2}\x97\x8e/\x9d̦\x87L\x93f'N\xf7N\x8b\x90\x8d\x9a\"U\x10\xd4\xc6\xfd\xf5\x1d\x90\xd2\xdak\xcb\xc9n\xa7\xd5\xc5c\n\x04\x1f\xde\xc3\x03UU\xd5\xc2\xf4t\x8f\x1c)\xf8\x15\x98\x9e\xf0\x9b\xa0\xd7\x7f\xb1\xde\xff\x14k\n\xcb\xe1\xedbOޮ\xe06E\t\xdd\x17\x8c!q\x83\xef\xb1%OB\xc1/:\x14c\x8d\x98\xd5\x02\xc0x\x1f\xc4\xe8rԿ\x00M\xf0\xc2\xc19\xe4j\x8b\xbeާ\rn\x129\x8b\x9c\x93OG\x0fo\xea\xb7\xff\xab\xdf,\x00\xbc\xe9p\x05Cp\xa9\xc3\xe8M\x1fwA\\hJ\xcez@\x87\x1cj\n\x8b\xd8c\xa3Gl9\xa4~\x05\xc7\x17%\xc5x|\x81~\x9f\xb3\xad\xc7l\x1f\xc7l9\xc0Q\x94_\xbf\x13\xf4\x91\xa2\xe4\xc0\xde%6\xee*\xb2\x1c\x13w\x81\xe5\xb7\xe3\xe9\x15\fѕ7\xe4\xb7\xc9\x19\xbe\xb6\x7f\x01\x10\x9b\xd0\xe3\n\xf2\xf6\xde4h\x17\x00#?9]5Q\xf3\xb6dlvؙr\x0e@\xe8ѿ\xbb\xfbp\xff\xff\xf5\x93e\x00\x8b\xb1a\xea%\xb3<_\"P\x04\x03\x13\x12x\xd8!#\xdcg>!J`\x8c#\xe8Ǥ\x00\x13\xfeX?.\xf6\x1czd\xa1\xa9\xf8\xf2\x9c\xf4\xd7\xc9\xea\x19\xae\x1b\x85^\xa2\xc0jca\x04\xd9\xe1T>ڱZ\b-Ȏ\"0\xf6\x8c\x11\xbd\x1c\x85<>\xa1\x05\xe3!l\xfe\xc0FjX#k\x1a\xd5&9\xab\xfd8 \v06a\xeb\xe9\xaf\xc7\xdc\x11$\xe4C\x9d\x11\x1c5?>\xe4\x05\xd9\x1b\a\x83q\t_\x83\xf1\x16:s\x00F=\x05\x92?ɗCb\r\x9f\x02#\x90o\xc3\nv\"}\\-\x97[\x92\xc9WM\xe8\xba\xe4I\x0e\xcbl\x11\xda$\t\x1c\x97\x16\at\xcbH\xdb\xcap\xb3#\xc1F\x12\xe3\xd2\xf4Te\xe8\xbe\xf8\xa0\xb3\xafxtb\xbcy\x82U\x0e\xdaEQ\x98\xfc\xf6\xe4E6\xc2w\x14P\x0f\x94F([K\x15G\xa2uI\xd9\xf9\xf2\xcb\xfa+LGg1\xce\xd9ϼ\x1f7ƣ\x04J\x18\xf9\x16\xb9\x88\xd8r\xe8rN\xf4\xb6\x0f\xe4%\xffi\x1c\xa1?\xa7?\xa6MG\xa2\xba\xff\x990\x8ajU\xc3m\x1e6\xb0AH\xbd5\x82\xb6\x86\x0f\x1enM\x87\xee\xd6D\xfc\xcf\x05P\xa6c\xa5\xc4>O\x82\xd39y\x1e\\X;5\xd88ޮ\xe85\xef\xe4u\x8f\xcd\x13\x03i\x16jitv\x1b\xf8\x8cW3\xf9|>_\xfd$|\xde\xe0P\x86|K\xdb\xf3U\x00cm\xbe\"\x8c\xbb\xbb\xba\xf7;\x84\xcd\xd4}\x9bO\xd2Fm\x03+\xa2\x81,r5\xd59\"I<\x16L\xe8l\xac/R^\xe1<\x97\xc2hUc\xe3.\x81>E\xf2\x18\x98\xef8C\xbeP~L\x90[\x8f\xbbq\xc6zAo\xf3P\xbf@\x13r\x0fG\xb4\xf0@\xb2+\xe6p\xa7\x97\xd4\xf3T\xd0g\x8f\x87\xb9\xe53\xec_w\xa8\x91e\x9c\"Dl\x18EqDtj^uf\r\xf0)\xc5l/3\x9b\x11tD\x90\x9dv\xef\xf1pI4\xfcH\xdc\xf1\xbe\xff1\xe4\x1b\xbd\x17'\xc0\x8c-2z\x99\xb5\xb8~b\xb0G\xc1\xecr\x1b\x9a\xa8\x06o\xb0\x97\xb8\f\x03\xf2@\xf8\xb0|\b\xbc'\xbf\xad\x94\xf0\xaa4B\\\xe6\xef\x86\xe5\xab\xfcs\xa5䯟\xdf\x7f^\xc1;k!\xc8\x0eYUk\x93\x9b\x1a\xed\xe4\xb6{\x9d'\xeekHd\x7f\xbe\xf9'\xbc\x84\xbe8\xe7\x19ܬs\xf7\x1f\xf4\xe6Π\x94\xa2uQ%0\xe8\xdcT\xb1\xbbQ\xcd2\x1f\xe6\x1aq´\t\xc1\xa1\xb9l=\x9d\xbe\xc4h/!Uz\xc2Kl\x06\xf0\xad:\nUu\xa6\xafJ\xb4\x91\xd0Qs\x16=\xf9\xfc\a\x96\xbc\x1b\xc3t<(\aӶ\xa9m\xcaWL\xfe\xa61[\xbc6\x16f\x14\x99/\xbcz<\xe0Y\x03]\x8c\xa4\xf8\U000917b7\x8d\x91\x9bq\xac7\x89\xb5\xfdǜ3\x9f?\xff\xceX\xefw&\xcex\xf3\x19\xa8\xeft\xe7$\x83\xa3\x16\x9bC\xe3\xb0$\x84\xd0\xce\xf4ދ \xeb\x83>us\x8d\xf8n0\xe4\xcc\xc6\xe1̻߽\xb9\xfa\xf6\xaa\xf8\xb3z^,F\xfdƱ+\x10N%\xf7\xd8e\xe3\xca\xdf\x01\x00\x00\xff\xff\xec\xa0\xe0\xa1k\r\x00\x00"), diff --git a/design/Implemented/existing-resource-policy_design.md b/design/Implemented/existing-resource-policy_design.md index 7d119b8e73..602ff346fd 100644 --- a/design/Implemented/existing-resource-policy_design.md +++ b/design/Implemented/existing-resource-policy_design.md @@ -20,7 +20,6 @@ Related issue: https://github.com/vmware-tanzu/velero/issues/4066 ## Non Goals - Change existing restore workflow for `ServiceAccount` objects -- Add support for `ExistingResourcePolicy` as `recreate` for Kubernetes resources. (Future scope feature) ## Unrelated Proposals (Completely different functionalities than the one proposed in the design) - Add support for `ExistingResourcePolicy` to restore API for Non-Kubernetes resources. @@ -55,10 +54,9 @@ skip restoration. - Changed resources: Velero will first try to patch the changed resource, Now if the patch: - succeeds: Then the in-cluster resource gets updated with the labels as well as the resource diff - fails: Velero adds a restore warning and tries to just update the backup/restore labels on the resource, if the labels patch also fails then we add restore error. -3. `recreate`: If resource already exists, then Velero will delete it and recreate the resource. +3. `recreate`: Similar to `update` but if resource already exists and is immutable (such as Pods), then Velero attempt to recreate the resource by deleting it first. More details below. -*Note:* The `recreate` option is a non-goal for this enhancement proposal, but it is considered as a future scope. -Another thing to highlight is that Velero will not be deleting any resources in any of the policy options proposed in +Velero will not be deleting any resources for `update` and `none` policy proposed in this design but Velero will patch the resources in `update` policy option. Example: @@ -140,22 +138,38 @@ existingResourcePolicyOverrides: The `existingResourcePolicy` spec field will be an `PolicyType` type field. Restore API: -``` +```go type RestoreSpec struct { . . . // ExistingResourcePolicy specifies the restore behaviour for the Kubernetes resource to be restored +// +kubebuilder:validation:Enum=none;update;recreate // +optional +// +nullable ExistingResourcePolicy PolicyType } ``` PolicyType: -``` +```go type PolicyType string const PolicyTypeNone PolicyType = "none" const PolicyTypePatch PolicyType = "update" +const PolicyTypePatch PolicyType = "recreate" +``` + +existingResourcePolicyRecreateResources will be a new field in the Restore API which will be a slice of resource names where recreate ExistingResourcePolicy will apply. Resoruce names can be in the format of "group/version/resource" or "resource". If empty, a default list of resources (Pod, PV, Secret, ConfigMap) will be used. Recreate will not recreate resources with ownershipReferences or finalizers. +```go +// ExistingResourcePolicyRecreateResources is a slice of resource names where recreate ExistingResourcePolicy will apply. +// Resoruce names can be in the format of "group/version/resource" or "resource" +// If empty, a default list of resources (Pod, PV, Secret, ConfigMap) will be used. +// Resources with finalizers without velero.io/recreate-remove-finalizer=true annotation will not be recreated. +// Recreate will not recreate resources with ownershipReferences. +// +kubebuilder:example:={"pods", "persistentvolumes", "secrets", "configmaps"} +// +optional +// +nullable +ExistingResourcePolicyRecreateResources []string `json:"existingResourcePolicyRecreateResources,omitempty"` ``` ### Approach 2: Add a new spec field `existingResourcePolicyConfig` to the Restore API @@ -259,4 +273,20 @@ Restore describer will also be updated to reflect the policy `pkg/cmd/util/outpu We have decided to go ahead with the implementation of Approach 1 as: - It is easier to implement - It is also easier to scale and leaves room for improvement and the door open to expanding to approach 3 -- It also provides an option to preserve the existing velero restore workflow \ No newline at end of file +- It also provides an option to preserve the existing velero restore workflow + +### Recreate policy details +Existing resource restore policy *Recreate* purpose is to help users restore existing resources that exists in cluster but differ from backup resouce, are immutable and failed to be updated due to immutability. + +The policy will be used to delete the existing resource and recreate it with the backup resource. + +The policy will be used for resources that are immutable and cannot first be updated. + +#### Restrictions and Limitations +Resources with OwnerReferences will not be supported by the recreate policy, at least for the initial implementation. +The policy will only be used on resources specified at Restore.Spec. like Pods, PVCs, PVs, etc. + +If an existing resource have finalizers, it would need to have annotations `velero.io/recreate-remove-finalizer=true` to be considered for recreation. + + +*Note:* The `recreate` option is implemented in [#6354](https://github.com/vmware-tanzu/velero/pull/6354) separate from original update policy proposal. \ No newline at end of file diff --git a/pkg/apis/velero/v1/restore_types.go b/pkg/apis/velero/v1/restore_types.go index 2ad74d16e1..37feda9830 100644 --- a/pkg/apis/velero/v1/restore_types.go +++ b/pkg/apis/velero/v1/restore_types.go @@ -109,11 +109,22 @@ type RestoreSpec struct { // +optional Hooks RestoreHooks `json:"hooks,omitempty"` - // ExistingResourcePolicy specifies the restore behavior for the Kubernetes resource to be restored + // ExistingResourcePolicy specifies the restore behavior for the kubernetes resource to be restored + // +kubebuilder:validation:Enum=none;update;recreate // +optional // +nullable ExistingResourcePolicy PolicyType `json:"existingResourcePolicy,omitempty"` + // ExistingResourcePolicyRecreateResources is a slice of resource names where recreate ExistingResourcePolicy will apply. + // Resoruce names can be in the format of "group/version/resource" or "resource" + // If empty, a default list of resources (Pod, PV, Secret, ConfigMap) will be used. + // Resources with finalizers without velero.io/recreate-remove-finalizer=true annotation will not be recreated. + // Recreate will not recreate resources with ownershipReferences. + // +kubebuilder:example:={"pods", "persistentvolumes", "secrets", "configmaps"} + // +optional + // +nullable + ExistingResourcePolicyRecreateResources []string `json:"existingResourcePolicyRecreateResources,omitempty"` + // ItemOperationTimeout specifies the time used to wait for RestoreItemAction operations // The default value is 4 hour. // +optional @@ -309,6 +320,9 @@ const ( // PolicyTypeUpdate means velero will try to attempt a patch on // the changed resources. PolicyTypeUpdate PolicyType = "update" + + // PolicyTypeRecreate means velero attempt a patch on changed resource and fall back to recreating the resource when patch fails. + PolicyTypeRecreate PolicyType = "recreate" ) // RestoreStatus captures the current status of a Velero restore diff --git a/pkg/apis/velero/v1/zz_generated.deepcopy.go b/pkg/apis/velero/v1/zz_generated.deepcopy.go index 18d881959e..d1034ee837 100644 --- a/pkg/apis/velero/v1/zz_generated.deepcopy.go +++ b/pkg/apis/velero/v1/zz_generated.deepcopy.go @@ -1360,6 +1360,11 @@ func (in *RestoreSpec) DeepCopyInto(out *RestoreSpec) { **out = **in } in.Hooks.DeepCopyInto(&out.Hooks) + if in.ExistingResourcePolicyRecreateResources != nil { + in, out := &in.ExistingResourcePolicyRecreateResources, &out.ExistingResourcePolicyRecreateResources + *out = make([]string, len(*in)) + copy(*out, *in) + } out.ItemOperationTimeout = in.ItemOperationTimeout if in.ResourceModifier != nil { in, out := &in.ResourceModifier, &out.ResourceModifier diff --git a/pkg/cmd/cli/restore/create.go b/pkg/cmd/cli/restore/create.go index 398f497719..09d4fcce70 100644 --- a/pkg/cmd/cli/restore/create.go +++ b/pkg/cmd/cli/restore/create.go @@ -123,7 +123,7 @@ func (o *CreateOptions) BindFlags(flags *pflag.FlagSet) { flags.Var(&o.Labels, "labels", "Labels to apply to the restore.") flags.Var(&o.IncludeResources, "include-resources", "Resources to include in the restore, formatted as resource.group, such as storageclasses.storage.k8s.io (use '*' for all resources).") flags.Var(&o.ExcludeResources, "exclude-resources", "Resources to exclude from the restore, formatted as resource.group, such as storageclasses.storage.k8s.io.") - flags.StringVar(&o.ExistingResourcePolicy, "existing-resource-policy", "", "Restore Policy to be used during the restore workflow, can be - none or update") + flags.StringVar(&o.ExistingResourcePolicy, "existing-resource-policy", "", "Restore Policy to be used during the restore workflow, can be - none, update, or recreate") flags.Var(&o.StatusIncludeResources, "status-include-resources", "Resources to include in the restore status, formatted as resource.group, such as storageclasses.storage.k8s.io.") flags.Var(&o.StatusExcludeResources, "status-exclude-resources", "Resources to exclude from the restore status, formatted as resource.group, such as storageclasses.storage.k8s.io.") flags.VarP(&o.Selector, "selector", "l", "Only restore resources matching this label selector.") @@ -197,7 +197,7 @@ func (o *CreateOptions) Validate(c *cobra.Command, args []string, f client.Facto } if len(o.ExistingResourcePolicy) > 0 && !isResourcePolicyValid(o.ExistingResourcePolicy) { - return errors.New("existing-resource-policy has invalid value, it accepts only none, update as value") + return errors.New("existing-resource-policy has invalid value, it accepts only none, update, or recreate as value") } switch { @@ -422,7 +422,7 @@ func (o *CreateOptions) Run(c *cobra.Command, f client.Factory) error { } func isResourcePolicyValid(resourcePolicy string) bool { - if resourcePolicy == string(api.PolicyTypeNone) || resourcePolicy == string(api.PolicyTypeUpdate) { + if resourcePolicy == string(api.PolicyTypeNone) || resourcePolicy == string(api.PolicyTypeUpdate) || resourcePolicy == string(api.PolicyTypeRecreate) { return true } return false diff --git a/pkg/controller/restore_controller.go b/pkg/controller/restore_controller.go index a15db454b9..5065040e11 100644 --- a/pkg/controller/restore_controller.go +++ b/pkg/controller/restore_controller.go @@ -90,7 +90,9 @@ var nonRestorableResources = []string{ "backuprepositories.velero.io", } -var ExternalResourcesFinalizer = "restores.velero.io/external-resources-finalizer" +const ( + ExternalResourcesFinalizer = "restores.velero.io/external-resources-finalizer" +) type restoreReconciler struct { ctx context.Context diff --git a/pkg/restore/restore.go b/pkg/restore/restore.go index 67ab0e223e..60107123cd 100644 --- a/pkg/restore/restore.go +++ b/pkg/restore/restore.go @@ -25,6 +25,7 @@ import ( "os/signal" "path/filepath" "sort" + "strconv" "strings" "sync" "time" @@ -1621,20 +1622,49 @@ func (ctx *restoreContext) restoreItem(obj *unstructured.Unstructured, groupReso ctx.log.Infof("restore API has resource policy defined %s , executing restore workflow accordingly for changed resource %s %s", resourcePolicy, fromCluster.GroupVersionKind().Kind, kube.NamespaceAndName(fromCluster)) // existingResourcePolicy is set as none, add warning - if resourcePolicy == velerov1api.PolicyTypeNone { - e := errors.Errorf("could not restore, %s %q already exists. Warning: the in-cluster version is different than the backed-up version", - obj.GetKind(), obj.GetName()) - warnings.Add(namespace, e) - // existingResourcePolicy is set as update, attempt patch on the resource and add warning if it fails - } else if resourcePolicy == velerov1api.PolicyTypeUpdate { + couldNotRestoreAlreadyExistsError := errors.Errorf("could not restore, %s %q already exists. Warning: the in-cluster version is different than the backed-up version", + obj.GetKind(), obj.GetName()) + switch resourcePolicy { + case velerov1api.PolicyTypeNone: + warnings.Add(namespace, couldNotRestoreAlreadyExistsError) + case velerov1api.PolicyTypeUpdate, velerov1api.PolicyTypeRecreate: + // existingResourcePolicy is set as update or recreate, attempt patch on the resource and add warning if it fails // processing update as existingResourcePolicy warningsFromUpdateRP, errsFromUpdateRP := ctx.processUpdateResourcePolicy(fromCluster, fromClusterWithLabels, obj, namespace, resourceClient) if warningsFromUpdateRP.IsEmpty() && errsFromUpdateRP.IsEmpty() { itemStatus.action = itemRestoreResultUpdated ctx.restoredItems[itemKey] = itemStatus } - warnings.Merge(&warningsFromUpdateRP) - errs.Merge(&errsFromUpdateRP) + if !errsFromUpdateRP.IsEmpty() && resourcePolicy == velerov1api.PolicyTypeRecreate { + restoreHasRecreateResourceName := false + fromClusterHasOwnerRef := len(fromCluster.GetOwnerReferences()) > 0 + // Only process objects that has no owner references + if !fromClusterHasOwnerRef { + for i, recreateResourceName := range ctx.restore.Spec.ExistingResourcePolicyRecreateResources { + if recreateResourceName == groupResource.String() { + restoreHasRecreateResourceName = true + break + } + if i == len(ctx.restore.Spec.ExistingResourcePolicyRecreateResources)-1 { + warnings.Add(namespace, couldNotRestoreAlreadyExistsError) + } + } + if restoreHasRecreateResourceName { + // if resourcePolicy is recreate, attempt to recreate if patch had errors + ctx.log.Infof("patch attempt had errors, falling back to recreate due to recreate existingResourcePolicy for %s %s", fromCluster.GroupVersionKind().Kind, kube.NamespaceAndName(fromCluster)) + warningsFromRecreateRP, errsFromRecreateRP := ctx.processRecreateResourcePolicy(fromCluster, fromClusterWithLabels, obj, namespace, resourceClient) + if warningsFromRecreateRP.IsEmpty() && errsFromRecreateRP.IsEmpty() { + itemStatus.action = itemRestoreResultUpdated + ctx.restoredItems[itemKey] = itemStatus + } + warnings.Merge(&warningsFromRecreateRP) + errs.Merge(&errsFromRecreateRP) + } + } + } else { + warnings.Merge(&warningsFromUpdateRP) + errs.Merge(&errsFromUpdateRP) + } } } else { // Preserved Velero behavior when existingResourcePolicy is not specified by the user @@ -2514,3 +2544,56 @@ func (ctx *restoreContext) handleSkippedPVHasRetainPolicy( return updatedObj, nil } + +const RecreateRemoveFinalizerAnnotation = "velero.io/recreate-remove-finalizer" + +// function to process existingResourcePolicy as recreate, tries to delete object first before restoring obj +func (ctx *restoreContext) processRecreateResourcePolicy(fromCluster, fromClusterWithLabels, obj *unstructured.Unstructured, namespace string, resourceClient client.Dynamic) (warnings, errs results.Result) { + ctx.log.Infof("restore API has existingResourcePolicy defined as recreate , executing restore workflow accordingly for changed resource %s %s ", obj.GroupVersionKind().Kind, kube.NamespaceAndName(fromCluster)) + ctx.log.Infof("attempting recreate on %s %q", fromCluster.GetKind(), fromCluster.GetName()) + // TODO: check for fromCluster for finalizers, if present, check for annotation to force deletion. + if removeFinalizer, err := strconv.ParseBool(fromCluster.GetAnnotations()[RecreateRemoveFinalizerAnnotation]); err == nil && + removeFinalizer && + len(fromCluster.GetFinalizers()) > 0 { + ctx.log.Infof("force deletion of finalizers for %s %q from annotation", fromCluster.GetKind(), fromCluster.GetName()) + // patch remove finalizers + _, err := resourceClient.Patch(fromCluster.GetName(), []byte((`{"metadata": {"finalizers": []}}`))) + if err != nil { + ctx.log.Warnf("force deletion of finalizers attempt failed for %s %s: %v", fromCluster.GroupVersionKind(), kube.NamespaceAndName(fromCluster), err) + warnings.Add(namespace, err) + } else { + ctx.log.Infof("force deletion of finalizers successfully updated for %s %s", fromCluster.GroupVersionKind().Kind, kube.NamespaceAndName(fromCluster)) + } + } + // try to delete the object in cluster + err := resourceClient.Delete(obj.GetName(), metav1.DeleteOptions{}) + if err != nil { + if !apierrors.IsNotFound(err) { + ctx.log.Errorf("delete attempt failed for %s %s: %v", fromCluster.GroupVersionKind(), kube.NamespaceAndName(fromCluster), err) + } + } + // wait up to 2 minutes until object does not exists in cluster + wait.PollImmediate(5*time.Second, 2*time.Minute, func() (bool, error) { + _, err = resourceClient.Get(obj.GetName(), metav1.GetOptions{}) + if !apierrors.IsNotFound(err) { + ctx.log.Infof("waiting until %s %s IsNotFound for recreate existingResourcePolicy. current err from get: %v", fromCluster.GroupVersionKind(), kube.NamespaceAndName(fromCluster), err) + return false, nil + } + return true, nil + }) + + // Create object from latest backup/restore) + obj.SetNamespace(namespace) + _, err = resourceClient.Create(obj) + if err != nil { + ctx.log.Warnf("create attempt failed for %s %s: %v", fromCluster.GroupVersionKind(), kube.NamespaceAndName(fromCluster), err) + warnings.Add(namespace, err) + // try just patching the labels + warningsFromUpdate, errsFromUpdate := ctx.updateBackupRestoreLabels(fromCluster, fromClusterWithLabels, namespace, resourceClient) + warnings.Merge(&warningsFromUpdate) + errs.Merge(&errsFromUpdate) + } else { + ctx.log.Infof("%s %s successfully recreated", obj.GroupVersionKind().Kind, kube.NamespaceAndName(obj)) + } + return warnings, errs +} diff --git a/site/content/docs/main/restore-reference.md b/site/content/docs/main/restore-reference.md index 6de606c8e6..aebc7970dd 100644 --- a/site/content/docs/main/restore-reference.md +++ b/site/content/docs/main/restore-reference.md @@ -58,7 +58,7 @@ The following is an overview of Velero's restore process that starts after you r 1. The `RestoreController` creates the resource object on the target cluster. If the resource is a PV then the `RestoreController` will restore the PV data from the [durable snapshot](#durable-snapshot-pv-restore), [File System Backup](#file-system-backup-pv-restore), or [CSI snapshot](#csi-pv-restore) depending on how the PV was backed up. - If the resource already exists in the target cluster, which is determined by the Kubernetes API during resource creation, the `RestoreController` will skip the resource. The only [exception](#restore-existing-resource-policy) are Service Accounts, which Velero will attempt to merge differences between the backed up ServiceAccount into the ServiceAccount on the target cluster. You can [change the default existing resource restore policy](#restore-existing-resource-policy) to update resources instead of skipping them using the `--existing-resource-policy`. + If the resource already exists in the target cluster, which is determined by the Kubernetes API during resource creation, the `RestoreController` will skip the resource. The only [exception](#restore-existing-resource-policy) are Service Accounts, which Velero will attempt to merge differences between the backed up ServiceAccount into the ServiceAccount on the target cluster. You can [change the default existing resource restore policy](#restore-existing-resource-policy) to update or recreate resources instead of skipping them using the `--existing-resource-policy`. 1. Once the resource is created on the target cluster, Velero may take some additional steps or wait for additional processes to complete before moving onto the next resource to restore. @@ -260,13 +260,17 @@ By default, Velero is configured to be non-destructive during a restore. This me An exception to the default restore policy is ServiceAccounts. When restoring a ServiceAccount that already exists on the target cluster, Velero will attempt to merge the fields of the ServiceAccount from the backup into the existing ServiceAccount. Secrets and ImagePullSecrets are appended from the backed-up ServiceAccount. Velero adds any non-existing labels and annotations from the backed-up ServiceAccount to the existing resource, leaving the existing labels and annotations in place. You can change this policy for a restore by using the `--existing-resource-policy` restore flag. The available options -are `none` (default) and `update`. If you choose to update existing resources during a restore +are `none` (default), `update`, and `recreate`. + +If you choose to update existing resources during a restore (`--existing-resource-policy=update`), Velero will attempt to update an existing resource to match the resource from the backup: * If the existing resource in the target cluster is the same as the resource Velero is attempting to restore, Velero will add a `velero.io/backup-name` label with the backup name and a `velero.io/restore-name` label with the restore name to the existing resource. If patching the labels fails, Velero adds a restore error and continues restoring the next resource. * If the existing resource in the target cluster is different from the backup, Velero will first try to patch the existing resource to match the backup resource. If the patch is successful, Velero will add a `velero.io/backup-name` label with the backup name and a `velero.io/restore-name` label with the restore name to the existing resource. If the patch fails, Velero adds a restore warning and tries to add the `velero.io/backup-name` and `velero.io/restore-name` labels on the resource. If the labels patch also fails, then Velero logs a restore error and continues restoring the next resource. +If you choose to recreate an existing resource during a restore (`--existing-resource-policy=recreate`) Velero will first try to patch the resource. Upon patch failures, velero will try to delete the existing resource and then create the resource from the backup. If the recreate fails, Velero will log a restore error and continue restoring the next resource. + You can also configure the existing resource policy in a [Restore](api-types/restore.md) object. **NOTE:**