diff --git a/Assets/Plugins/Easy Save 3/Resources/ES3/ES3GlobalReferences.asset b/Assets/Plugins/Easy Save 3/Resources/ES3/ES3GlobalReferences.asset index e7aac731..c7c40074 100644 --- a/Assets/Plugins/Easy Save 3/Resources/ES3/ES3GlobalReferences.asset +++ b/Assets/Plugins/Easy Save 3/Resources/ES3/ES3GlobalReferences.asset @@ -1618,4 +1618,7 @@ MonoBehaviour: - {fileID: 5854294892073004479, guid: aa9644af7cd7f4a939983928c8fa106a, type: 3} - {fileID: 1701167924756487343, guid: aa9644af7cd7f4a939983928c8fa106a, type: 3} - {fileID: 3629515902686950372, guid: aa9644af7cd7f4a939983928c8fa106a, type: 3} - _Values: 526a8851fe85233e7cc810cd2b8a733faa68e71a62b99912cf2f06228873853005edfb00aa354575a31cc8ad1ac7b966f52afefc8351b636e2b71574be99675b6400dfc3607f0069e96d5112b3681f5fcf550a7f3749f10c2c006f2e23d1db370e64801184e106752a681216ffa3837998b5a5688fe7245230fcd93d5728ea479cf46b8ba7516b16ed2e96b5bbb6e20e0c6272c125d7806f67cd366983232521642549cf9088373b29cf12c86a843666a9d2726c53c784328db49f8d499d2140c6bf413c35ce7d12821326d7a7c36313210e18f42f147d60db1f64f3ada3bb2d6666d31a094491222bbde8f495825a4e2f05ece33b3881253ca117543370bf2531ac8ebf10b7f565a03ac9712b88ca58c516c5a7b6d8f161d84e972e95f1f208f318fcbd24a42f1a1594d13a0cca1e4d0b9a28c0e4238a4cd5432183fe0a3d37c5600352a5affe32a0f1cca64d60c95d6de43a2f1ab3ec2f8dafe7e182ac1c0b579975acc6cca75b9cf61ff356e4ff757ac4f0e2446c5178b3cc3b0938e3500b2c3eb04c15e369388d95cb10d3df8656069a951142fc403ed6b4a90102e5146519f66f6d35134e18b132d9ec6c3ec954f282992fe09c9f2a9752fc7c47b5d52b06e06eab61a6d10e4d7cc274d62caa67eb540f7f4be5844b6a66281ce82d2f664f7483a3a0ebff69576b98633aaa8921a5ddbe04814bd97aac297cdb1235373261c4cec06828ec556592c57c95cb2c5c853ad052230733029b09f8776f245772a3ca0276dcc8b833ca146a1411560f76a926a9289a1bf169092fa58ddf9c3a7517c82635364a7f4df403890f9d1ef144fb812196cd7f0c77286780f491baec2cdaf4fd482fda400ba6f61b9da4000716c29e6ca1845b5768bcaf0ecfc98bbb39185d35a921a8142041153dc39aaa1c286f97b630278db035fff6d32e0ef214326ce60b1f02d1fa3100beb18fe2b7e76ee911c7c76ae00c14c122f29acc03601a51f08a4016e1082f6d7eea356c2d4766a7c4e03aa5e33455a9d65f214d9d8402a2681f2dbdd87b070a985bebf6d6a81097a7bf6f1b653f6d44ca68c07e191e3105186bfcf1e65731b726cef277b7a02e2f4f8ba6de14e73c29b17188403b8622b78df10f42a4017cfff026423332e5732a39eecea4c4101a0158da5ca71f8e0cacf1a805a8b07076b2f15811115bf709cdfeb27a2a54c77a62f3f016365a2b209de610da2415e4793787e44c9401f65bb01b6f5693eb1d01b923a2b5bf5a3f57c537732b4a1ce41e1dd3bc5c8f84196316b39ae5142b724ec80f2101722eba6ec83b11cc7422a66c365139bf2fc07134f6c0358c0bda930f573d9dc4051c541157fd8ac87b1d9952a64ba6e19ca69e2499417fddbe2caa24c1a561f21387762d2def8c67a4f06e2bc76e0cb0d75f9409b22d34593aa82d7ba7ae89207f8b652d5f423bce6076d56121e00caac4b88c2c7dcb083a94c883285aa4d5c6ce0a8162bfdd6753d123843ddced44e075745b023dbb7e5b896e8269c01328054c9b302a1ab4da484855f13539de7736f3892f04d9f6479188c48f2cd00d4fa9d9c99a7201753abb270b443240a506dad2e62f21bcf924dbc733497deec366e53a852b5d6e466fed752cfb7898b19bdc423679483d7065d2ed753932d34255148ed5933b2f9bb6e6a9e268170b63bcea6793c524c3515736dfa68f07f4c3e5cd2819166dba29f321139f0d5a074dc689b94fcb3f83cf281fd236e5292abdda6dc835402586d5d0c1605cee625fb13d2d6d18c0428f254a59f1f69a0ef2e209aa3a5f6e2ef35ef170e07360261e3a3ede074843437e1dfbee809a1671c43e2f82acbcd800430f3a0f274f621bc623782b35791639d9b3d6a7a4a251738a9dcae15d1d2c629ec1dee87cac94318016b3a41242a73e5469a8f9e5305b1a9e52653be5bb871d51da8e739a2dbc794808278eefad6148f68c8cf374337c311ef987ce12cf173b716a0b132fe4277edbdd4e22f732d40ef01d45592e93a97ca93fa95e5a129817e09c00a6478b8824b30bce51819f29142579bf2f14716a04ec784291717a27138999bca5ced2397ca56aa623c557fa0aea6b7c2b2d37d36ecd046c4031e66938e3bac7e8e2834609b33cd57e178eca6b83c7852308adbe3e94d428359a07b5400093c0f470edd76c4e79870e9eaba95c32283d069372be6e79067bb6ab7ca454796a807a3129056bd4516d76698e182e2bcd6bccd4d0d55bd256e985ffc3c546e2bb353081161d28e9f2b17c68842a61ffbca8999ef095525156bae067ce736817b45824c349af41156b1c1de1a70c577fb57abce4d3570d25e2df2a5b3cc1489ae5994cd4f9624895167ccd2c878e56b79ca0e2b6cfb2425d4b4aa628d99c27562c7d03f23f7d7819c328ce578ae1527135e0f7dda3ff6a97dca81f440971457a5478000a8b6376e1d8360c581b142d9608e7a1456bfa07b651858937153a686575e98014203e3e284564acf772d0414ace1d3510e7224a5ade01287e0be64f896976eb354cd453dd6c74b85fa2e828b9d4c8b9fdf7d24683ea1f5d51667f1d5e15238dfce40c6aa371127c5bdaaa470b279155bdd3ad6d9730674a2c76017713a8a6b681a4d32ac75e5c6e094fa25e94676779f8d5da313d6e0934833ec218748a6ab334f3c665ab98e2e4d0e388478e09b6c50e887e177c2785ed64615806e08b1e6b46aa6d77d33232a00d0a9e1f09ae3d730b78d804f67dd0a3864c364a40dbc45b01f48e388ad267be45e0da793a5a1c4adc1a0557652262c47b11fe1e96831e163005de15e0fb03221f68b5285849dde06880275b1fe340dba9ac4b77d44955c8fff1aa3ec7ce951ee81cc70492c6e23b11207815a53ccaebba464132d331f694d66968042f655630447ceb4524f930ad89858d64d39f505d3e46807a1100bbe767782751b8dbae93ee5fc7226db8ffaccc4a5544bcb047a020454d5b3229c26b55bebe32232d20cceb1df107ea74ef6b3011a50761a6801b71d94a7d2c046a22d1333431a134bf8204e4ed2af4022af362109e2f2bef44313d81ec1a66a47b3c19c878470a55a2690825a356561e72b38fd7ae01ae4a6e96bb747f192505286ef155af188deaeb8cd4eec2232870ac4269fb76048416d70ae562427dd5bc4403fc346500705927a4eb212c63f36e41d3df3e7d298f24eada7da53229579148e75640d90c0cacd20fd3d11862168be888de916169c0e48b27b6757d3627fefc7d6914ba33b8b137cc9492aa430c88f1098dba073930de2672b5b1567fd6f7162a2a64072a451ccf2c5994d52e5bbfe973432468198e568f78da72731274c4468ee18fc367d4dc573e3c894702f74d106b78d3cd639abd3cfef63523231af4bf491b069c3f6fa51cfe8a26f82a3862d4b8df032e395b7650edaecae8507bfae382678d6e456f60c0820b69a968c953246344f2490055701c155611592b394b9a3c1ee2f55a1bf1f247ccd2d2694ad889b2a6521d6ef8a3102955feb74a8770a5d5a1229266ec4babb2d341af68b75b7f20341902746809447bd2cc041cc65840a4d302386b6bef9ff2fdcf41490c571f4e8127805e731a6c98de179420d656ef8a3a32d12f111d50acd2e01727d13d91114c1fc636929d3615656a0a7bbc9bffa1e8fa965da8113e79c5a1a532ea7e69180454e3301d79c190e8d37329dca220b7df4ecc352b1196c41eb28f0f07fbff1c2bdc8067b8cfbd62bc27462b9e145567c25c1264b234edf3be1e113122b8fe0f916a78044273957140d5010ea7ddc4fa9baa221fb56a55f91470e032c3ed7b7ac540e3304aa888e7b67a23199892ea67d8a8886e3c1377a78f0b3b603c0fdb93fa5c2e4a7d24561caa96003a473b91a75a470a6a98d8a779cf888976dfb7c7ef7a257b79309bde95c7ed4c3e31f237a3cd6f326f0a0bcfdefe65af544078f6f57d7bd96bb14684e8d850aa19c651a98b6a058644e66f933b98d3f00b2986bcc9080f6c13622ba77a1bc4cc0bcdd33418335b655093c331b81c194e667a0d386610db497d85bc8c077879970f0f788481ef1da14bf438ddcf86935441de988d54da39ba18e886f1c49546fc655bb9abaac6878c5c94128d280185080d674ae51107ece948329c69750e65e03bf4c85e45f9d5f44230b5c90e524e0b3bb3cbf2f392c067444ffa037bccaf833cc7382a1dcc2e985810164f89baa0c11e6db27652245a744ccf5d09012d86897f338cd68b7928087b339ae27b70de891043de1680da2a9e6dc2da8aeb7d87841910cf4ee764334c589bab7b57cc374f33e8b0b4bff010953f3aa8bd48d085bc6c8f107a773d9bd8085ae78680199d8806d542fb322c3bd701c5f052438afb772099171a234e388e4c2754e52869eaa729cf3be1ed7e1066351884c3d112e46d5e6f651930b7ab540e30b7f427a95067244828744e1a89a15782afc42d049fa043e686b803d1777123e6d31c36058ddf691518771690e1bb19c4c1ae08e7270a3159380d2f096af52e49ae98b99394ae0b30a5bee3e9482c38bf2dc0f03696c440c8eb8e3d9b0f7256ddb7321eb7fe79589046c8721a11e50ff42a8e2455fb084deb57827e23eba63fe7ea3e5f84b41043a71961f0ce5126253061b78e7fb1fe1dafe4090f80f77b5b5f77a5faafbb6b40194bcb6f5cf81c67325c4fc13417bf66e95cafa0ab01c2616a42b0ba08de2b15cef7a8ca7d6d7a48c7a140dd473d9076360c11520bcb94177895fbe6b89da010779b0bc3910b1657d6f8d809c1e51a2db23983fccdd809677340ac188e6c6f65425065ac31cde52b0b4684ec0d74a95cb12999f1219ddd6091a34f505efdc96a778c388f7f92041aada8f9eca2098a1717f73748fa9f7920d239e571826b330710ef76803c19dc1d267e4578a3f1bd652d666756341165281418be46ac9298418b0e234c6df62403e5e6dd84a5ff83207c7f9fe8d2893c21ab6192dca5698e6d19fcfb4debf52d37bf9b8fb2cb1f7d12632035d30c5091144a44a00b64485e7ca8909556fccaca71aed62a36f98955353140f88e2c72327c9afae1cbeb46af062f3ee5210169112a5ced08811d51173c1498e218ad380442564a0d94d4a7b01976a0d20c469d880ac65d0dea36916d6cd4439108b966e8286445e5c71c857105ab9d738398585c3b235fc67b358fcb4e3e5b38030c80505f8c1b790f545aaf2aded7ea8238e50f2c6133d4e7d39ca10cefcc763eb292062b112c088221b218375064a6f285b279584b0b643f553733108693df771b8e887022ea8ff32272f413070803712d5ee33e24caeb90be938541ff778b61706a531b2580bce919456724969712e6917d19124948bd6ed2e296715c1f97ad1bcd5769330f2656a56bd27e5e798a6a7fcbc427626e326103d6f779089f8329ad839369736893d3d7b9a515c1c36dc4f81cd00dac6395520e1a3741c3fe060f90aeac4987b19c151667416f40f7684def3ef65fc13512f827c6c3729fd495d6c0b4a5709048b555461adb4423269305828430000b9ab1a5634bdd40ef2ab5ebfc172f7451f7dc38f44ca559a53229fecc4110240ca800cede208b3074f4ce53ff24fd0595c81e74014cd75e59579ae6381f0b32b56455eba24a932d91e4d3616cc5e57e068a30d4ca1f8f4dd6899052f7f44a01adb6a64188ce3e684fecc49a919d5d1f913a3f667a40ea6299d2f8f8b46bb74c636f7e7e392f295b8a12b2f554ce9500eaa57737e24bd950156c11dd818e75022a8e9ab75fa21a594f2e8a3b57e369743587910b5c8b361888b5ccc634dda04674e22ba04c32db0587acd350e64fa6454d80847622460d718e44af390f09c167649684afb7e531381087a00e5ac9367d20fc133249add740a062c3a29f6c351c651b747a894e2067f1cde6ed0971e14a41bbf0aade71675dae7b56c1aa440b2e024144bbc135ba3fb4c3492055d86e526ebdcff41324d423a86547c714c35042a23df12748362346bbd7c659ed7b8a0360e41da91826af4f35de0077eeab2966d89a0daa850e790cae6031888835886e5e29b6c7b7f308009da3c217da7df95673ba9d5fee78c30ee65f0ee602b9d47fb09db1bce5ee0a00123a1ea71ade021dd042c7772fb63c7ab09d30cddad64d6efa88a9abd063e55014502f07a1d6253da6fa99d2b4b6af48eebab31fb028e06c822ffba2e9a7ff45b6e493aae93bbb6f9af1e14ba87bef34fcf2e794bffc0d745c69ab821abdbe49752385bf4695c3063fc69ddc8e930546d71f0753e63e8923ce681e206d4ef360a8110ae281cdba383d5decb893f8ef4b47017b606217370815c42d58377d100bcc33c15c77f25205e4babd3577630b3ed440168219f64f42c9a61eba5969004fb9ee2c789492242a1c80b06ff717be50646f6dc5641d077c6b5456923870ea2450ae18c8858c6c08b028f297d8dcc13793a408bfc606a2618009ba1fd68ee62a599175b6053ff61dbd380e95ad88c353e90b1981dd745c46fd649e9ba661cb2c3aa6c78588bcf956d6d27a6970de5f345dcab9b453163936788019aad29804233d2d5cdc06bd407044620013b013f659b495675b43d2402af8c75519d8cf4c115bb9b078eba1e25d0388c73f926d054a6c9e8c6e7f3b03478abd53ea3f23a95b209c5d9296adc737f70d848c97dd1009046820267c915b6bbb8c6a783139812631a21057bc30274e8c5e5a747ee13f6c86ddfcd1f6e82b4b6bd2468e28296901adbe560ac6716d0a5d4876ea0471c4019e5abf58082c97032fa9050c49353a01f6a1c74f47aefd354919b3373616445ccdab782e4a6a120a78d513294d19791340174152c0174e5e4c345e794d13ed33566936366fb9b255767c9f03f14739566925554f5f218e6271da857b3c542541e747b7479dacc820cceff4fd96cccc1d5543f00a5e6f4c0d57638c02646c1535a3e0eb38ff80f3425c351b4e158bf83da6a3cf7f452f9f566d3b10c6df394437fbd5a54a1f6ce22c51ae66938a9b22336b4e5bc19c95f02e8142ccc4702c636a7a525340e6ae1e3ac0a2d0f39533e02ee723ced16bf92b661b89349ec75962234bfc0edcee621943302100f9c5fc984b23faab93fa35d57f26ed5a6fe3bc011a05f43e9241bd1c4ac4ee5eb606ce5e1622807bccadcf2815d871fc234276d97320e6f4d1be06091f18f6d00cd61e780bb48e6e9cc732372be4ac462f3f07f739c8d2d6ecc230d4278a9bb5b7fe1c3e08e907d7d0e5753b52e3df4b95b3c7a1100169bbfcb774b77c46b8edd3837fd3396e3e1946dec81e3df1d7f51d1bc08b3dceaaec1a66c03614a16a1771cff409698427fa5248fdda77454a0a5cd01af12c13cfd85bb1677d2f550510a9164da141a98a7574396c8e2e308aa04e356c1a43a5bc7c61339be514a429a74d0d848d0856374bba5b830d5abf55d4d839d10618ebcc055ad1400e0d5a9ee69cec23c44b19a9a46cb8d49f27cad6208970be4d2cdd71c72675172669bba7a043638e92636f760e1d8a8d2e16d2216f05e07a631815ed87a215153e00843bb211345bc43b45bd1bf9af30a24f43b0f897872b49350bb82f7606ef4e58c8f266b125e31d2ee5aa499d965dc71b4b385f641da77957f27d077b2c4e34546fc2c1a196537425ce277d3175e7cb677fb5d4317015c46f6cbda2a2ea985b33df9e0c581f69b208c53a96f52a47e2094e60051edd993b7b88310d54f61610667d4feeec0bdb7915fe330a555345654ca0ac538a933d56456390e0507706ff52d6d08c86c931ea721a10e4ef5c6f3042333e0b5c956505400857778404d76103cca3d4dc2d14ea6e3f1e5c5bdeba5d2de66211e085c9c552961aacfcfe5ee93292fde55d0708af69d224e50c4b614d14e4e6e6a61d506675d74849db0d1bb0646112b9f17f5bdc224d574d55512d62347f8214402bb6de6227903a0b07b9a46e10669c6161acd20a2d9cc6dba4801f0b5941de172b9aa27fcab738c0cd60f93646942401c87bf669f9f9983d7592ac258f1fcf312c96a754f7e3d5e71b6c287295fd2138a421d4224b751f3101650a36f5edcd526e38f5501230f51b5af0b2732ed92c8d4c1a35500b0e1948898aad6e266123f6c6851e5df92fda8bd446373b28935fdb929783254982b99fe15338777d780b0732445257bbcf867cf4c12452bbab8fe31576ff41e5483f493ebd3e5a089df1a4c4cff71c420897611eff1a09a80ce436c45561057ac9ec7b839b9602902b7357cf808e75a3aca10ddf9e231b6248f14ba2751e5efef61d8dbc72a05a7394f1497371d92865a56ce84cabda24592e2133731e5a1bf4eba7279dff46154dfc9b4bacdaa82b2119e5fd083612531cf9338d516ce76f11f3aa78354d7464ec8134484625d1342ab2eda6c7a2ed2a0205bc69cd2b9946e40a5c9f8420612c5c7eef79fe36f309d80049fca572c94c202b8acf6ef4683f1811d3ae7d8e4709ae3eb4b74c8bd338073abe328b6a1371411080599591bd6717af61ec62458c4946bf551bd87e6754013c36cbcac94b53019e9293f1128c40fc1ccefbedbf9b3e518a86b440d0b540872aa52d3776ce1f044a11fe28e0c53433141fbcb06b6741a0f77a3f4296123117aef33893a0f7794daef7a2ad9d1671c552812bb0f88f1bc3648c3ffc8fdc6dc81fea292c02382b0b996f0274c493031ff7850fea187e0e3e0ffbf72d3676412f76953278c061377652e0e877725801d0895df314ec58505f2414e3f9bf0142f14ecf14a63a845d6ab26567c7696835b7fac8b69469561ad0e5919cd5453034abdd07d65cbba50bf344769d790f760abbdf99f387b8d779f8b445c0a8e788501d6543169d6d2772602c3baf0c465e3f708657b4df24bc0cfa7132efff9a4c0a44da7fec349f9329faf36ca583d8933ded7baede6f2b8e07aa361c2c3b37730588b994cd388df50e1b80bbebb8178921210b2385b7d585184b77966bbbbf643e7f99e236bc3afa7b70bdf8f0e77abf6daefa4d475bf8bc5cc052e74fdb9e3526e6f96b51f9c0de18ef57eb06236bce2fb72918b60dac9978aac18a96ac54602e88d2d6e0e5116613e3cba7fcf249c62c211697b2867e186d6d1c58c8c9b89365f7bc8ff542af1559c205d242059c850c7849473c13ec4b0ab96973c9b89e492bc9be0c502644912ed50e107f5429972f974c4f807057511cf7665054dc21ed244458f43c562acd432589eedd0335a11c005dcd93b1364420f0d7b8726a19f40afd343bfb345bd93e1993a5f9462f1f2cf892acc6107f290c14d42c2de240ae3e82071f310659175b848eac45dc3e663f497495023a45e57df4d1189fd154a359be1c88c0f011da5156f8bc7e2d1bcf2a6fede56eaaab0338ec9c3c3541788a27330587bfb5a54e379b4458320263aa26fe12f241c6eefc121a50ad8c4d0f92226d95b032a38ee03761522c99ad2eca4fb99ccdac95341244f68b599a073d16754dc95f68eb223673f329a2181a95bf471bfcd4b042e58c5ea7f53c18344530233cb64ce4ce616325d440b96c91f92a734aa1b50412c6b733ab413e091ae1c0385ac654d1e2a4167c61f9dd012b20cc5e1fafcd938f2c1075ff188f10a06d3f0e818112cba5599111b832640ca4b85f758a1fd63650ac377929362f05ccd8e232c6137f55f2ff46791186b6301b3c5f2a26212624c5156a3f0cf90cb59ea3515c7dd63cc2ce7f8e2b0eb6510ee4edb411c4853aefae55483ce9c5d5db45dc254cd812b445ff9d5c59af51150ec45b5b1e45fbf1186961ad2ee186536baa968f329005e6f6a1f911611f6cbfa3c0c6877196486ab615f31d393f1dd9790f38fc18c2e37ebf75647c4b1670c92adeae1158f23afe0cffb9b87bdedf487ce068ad5697279a5bbbb81805c6b6a1a429f25a112f316a493608187c9cf99c55adf82c533d8d3df9b793ec55acfcb8b6e7ecad148636ab12d2f78d710f1dbfc11cc35741e3f4e2b62f53c863bbeb62c6af9e6b4f4c87dae4a43e2534e65115662cd5c6165b886623319bbb316e4757e694c7c15277f08a6b178d6220e5e82e22c29dc81b264c6b2637471e18bdf3ad1469f3371e6f3c0fc4b5a500322746091acaddf30b1073c1485b9a1a2ed371af23df4eb626204db2858e036635b362ff0ec1fbb121005efb09cd113d09563e97265423112790e33a17907999122609044166d60f31dc2edcc2b63f0c0ef057d0b093c01f7051d79ea536c8b279f80ee2c40cfba37f2f654a26474f7030f0492739a9e97f182974f08e3869fb137c62c9a85d48021405af1f06f5ba47019a916a800f14dd1e73046568f4ebb93a96c9561a7a382d38b4c3c1a6f67af26fd311d8352b84dc6fc117e49d5295f70f97a56340ef9d84619bcdcb2d2a7bea13f7d495e313830e111218a59dac701949452fc26322cda1358d77d0f95009993c03f7a67eff14fc1368adacf7bcddf22a4d7d8ea6c2b2ca29cd9fa9644cea3f1c4f1e5f5ce867b63033aecbcf7998f26a6afaadd27bf27a50d382b460429fa07e6e8f45db3d4e121b38a28cec19044f656eec31b868ee675b5bf0d094e3e98c2db0b6c2f7213258470ec80a1e7f666a31334ece2fd158e65cf7a07f4c7d7d384f155e3b634258445f4679ab9fe349dc3d5b0261941b5d5c58cf650080b20cc975025933dea2cd74250a6e744a0385404084420f84e45bcc48fe1c6c23a73b5352bddf6176ea026528768789ace911544a25bf03f51b4e595a72141f799eaf8246c1c68d2323ca557aa937fb6be579310e8e49b798c0b6926e7af8fc291c1475380543eb228330265b977761acb63bbf14452deb55f7e9850a341e9d1cc67f976c3d3d8fd69bab6d5ddea3d0c8e7c1da3ec61890b5ff35cf1b431f119b6cf56b1510ceeaf3ca95b0664072cd6445b20d0af9db55aeeee26c086d7318bbbd08ca18c74447e729198c5cc8f6f57203346170edf96bb7b4e6fb0e3cf2613eae6c23483de62c8af9f533204ff8e5f7edfa0538ee57323c62ed9c1e4938221b7aca0b34e7c151169f13961d2f813f059e6b342fa0d5159fc30d391566ff5f447dea9c7ac83ccfc8ec611221bb04331c4b96497043b23255c4a67f191dba3c629b6b423ec3f4f31141e07f0da9f7328743d69d2c3956c790313e0a38958e062baf626036ba26ad32bd84a705d36690bb1af263056cfe9b761e374d529e25520342f46a2f1527de36e78b234aafc16398cfc6525d2b01c0b0c7e9180e74ffd0e3d6ab4821039f580decd2e120dc5026e09ae6216379afd94034ba682bf0305519a4f9de04b01b92c5bd221b03f565081080c4f9175490be2b82298645f00e6b57100340420e58a2c078558b466cb5ca52b624f11405f7a5393b49e0290d51b201f435834593f8bc5b2b6bfa7afc8f31a467ae29034596141dac03be1b1ab623948b61d64d3255a4874220037d0d0b4482494dcb703ba076e18e8e055d9980a331a55b1d573a2d4f01a7455e05b2a5867f1d54046a65c44a80257a583ea5fe123d822d284dededbc779dcd170bbd8f6bcceb7a8545c1c6f52624358c65b970aefb7201680586aa7039c85377484be253c5424b626f7c7d27a25cc7c274a29ea858678d9a45038a08ad7f6666008e21cb0a19cfb231d60e54113f577a42f7bcf901e4550d0d48e6a6d7e4914a3bacbf1d200a43f97d3d3446174d53316ffe6047bb4caac55d30247f7b811a5432463bee4d24865642954cb9617714d773586e53e110b0f500fabf512ec275ff577687a277bd806b7b4876af669bd82a1bb4f42c1092c9bc0930ee46e4d885040b4b10eaf0725fb5282631d578a0a3642d15928432b7103b3fbd54b930c5785c3c8f5be57411c55613ab5436c39e35a9738a18ce4500d2533a2c545338e719126173eef8047626c024e997dd0c47ffde79ac45bbde46a13d6150dfb6428de1d46e43d451b03ca4fc4e270ca4970ab80c2acd33735ea1cce52f4f68aba922fc4d073d91b1e4ae714a06b69348c5025aa908141e8aa5918a330eba81ffa550a57123a553a587f8d8833e838658f17ce0d30bbfa2bc4187f2994ea15dd5d28e5b495c046c1fafb5210f145d36ddf4cdbe6d26aef464f362b2ab4cba56e59b02b1b022d0b4f6e80082c0626d571cafea5b7f1d11517f7d40c24048e9930aa1c38bee537a443b7e4aa9d82acbfe79f46a039d152bfc54abcfd29d0c8c52ff9387e1611f69c835a52000d26686abb7c1c3ca4c13cedf8839c8bc7b59a82e0a9ca96bb21664a5a3ccc6bcc9292bed327a895fd03dfb143b57a6d7a925458efef2f635bd0da232db9692e62574574e9c4911091d48a2335d6bcfa490746271a6e2cf774503c8d3a5213cc08213f71ee693acde2f63c410a0ddc25f112302bbc4ad9035870489fbea6f362e06418f4b74fdfae40b7cbebc591fe7dd3969c28222f8852fa33e97e21da8c99f996a0a5f4e77eb142919f9061ec65d46537df480134ab71e796640225157631bc309671356f98c67215bf721b492e01e312d4e024384d7c63f515aa2a457ea00382343142e709c4d0973a148ad699519795e876ac9dac0ad3a3605a296ce63ceff409e14c14ecc7a9748985b7577f84cc064e8ff940f8935b92b29dc7e86e4da3531e07cba3b9865c35864a083f5b51dd95089f1d76834d62a2cceec77a9f81d2c726e5967846d7a344dc3ed732ab8aee146b6cffcf302cdfc4aa8e66dacee1a5f45b6299bf50a7c2e1b17483d96f7866e1366d4b4a635eb2d59316ea6cd13baf91bc2e1b9640ea5a6130d18aa16cc20d00d2b23d92af82c4d63ee0c822a7c22373f3481aafcad1e1452d8bc70f43b968f15c9ca6a657cde1c249a93fa1375fb6711ca21fec66dd38535a7db70716b3c20075fb4a55764835f562f1ae7acd6f5d80bbaca88c27ffec56f4306262178dc9972a0b54a05f0e4e04eee35b2553eb0c30868111123e4057c688f870fae8eeeb15087ac62212c429608e11f3cb8fb5417232ad79a54fc6a6849a4620b5890a64543ce09224e316da555383b17cd6730c905dc85354cbaed9120a7b33453fabfba69778d3425444cbb78d2dec8dd4c140d0b5fad79abfb90fb7a74d48185dd90f8338530e31b0b5fb66db406b78784e26b0a9ae5d13baeee250c844ae35b96036a71a08d06728ec83649f99bed4f15d2e36d68771fc36134e16a0cd79f564312044f9b452711e9de982f5077bcedff2908562e51f31ee3a7102c908e9848d620fa19989eeb5bf9f55775210f8d15880b9435e1f584940523330b35fa815b464f58307da3849d156350245896c00ccada4b63de32d6335b71e0746cdf90f477b2bb7069be932b90324a44b957c2919cd9be0fba1bc787d973741183f909f4f4459b5b24b05bf4b8e02d54e992edb233721145625fc5a315cb680bb57e5076c3c1c774bb676cec7eca5665491c9f4686c1de090a4f919480f74559474f3e3a90b691555b616e9adefdc367085fec316aaf9277a4a6948bcfcd0b3b2112a42e8c1cd400520b13dbacbcd408ee0673dff4ec1167bdc6de364b1c25735632bbf1a2f2f313751420a06449355f85636236a5d4b80d240b71c53e9db536e59f31de78c5aa04eda09420348ffd0605c24e174611322aecc915ad63b95212cb5686047a14d84048a2b6fac067276bf29536ff133283082ea435be24a79859f2a7ea8b1601810f16f12f5ca4c7967b5d5643327dad00682c82292a21e6e35ff5a31397ae4d7e0ce9b9eafa9d1f520ac44ee38514352844a7825e93d857ee2f0dcf6601b4ffcd10d73649c4c305ca0cd1e09a2cfda1b53f86310fd31115cb6d3545123147afa93a802c5221149b7e5e49ae9c470ee5d2507c59781af15ede13fe4806f7e703ab20c89f522fb06cd415b3b18b6379845f4f73c2b6ed368e49204f3f24cb94867644fd84ef51c8fefe172e8e683fd37a997916487bdab2411557178c81106e5f552b3b4660fd74b117713f314058d9f6b32c91be04fbd763fe1f25545ba7282e5943798f07fdeed08e333d2b93a137c6c24d9fd8eca9bc4571412240939facb6b80d6620addb941af040d02fc6fc085fa95f910e074f42b0874202491f2f632edf788d7ac4e8e618477a19532672818bc63d69cbf2625097344a67952322c5df5b01f2c0767ddb6dba55ab7d976a28063c767d1d3868c382d80a467a8250f525b538129cb7d3ffca21605aada0e318c3c473677fc89f1496a07bc95f7102847b613880cc869fc554f57b5a21f74885d21f349ef2d76cedfef158c2cdf560a7e124214d68634b3d25ad437443f8358ee80009403da17752cd257ebfde62934955223a4619fc1c6ed4f63c60e40856f944352543e48d5ec21afa359acd84581be2876b4865176dc4cf857957c39fcb0af7421e8e7dda89469779448ef5d3174c1eba73a0ec4a79453ac06fef5d3562f701db50132d7d0feea646356cd3e4e2ec92b870d1232b799bc961065beb55aa1d3f5b6bf2a5255e2b0e3206b7a2a21ac263493b37e7d0ee86e42c050623d8f69ddf07542f4ff0466d5a4521cb6f1efaefb50e0d87e09cb019d65c685608158d8cfd3123a2af44b8156a7276a5e63df301fdbb7abf1d32b2090ac57fd6c8e863663b3136531255ff144f6a53c58fce6fca7e19538c3b7122ad2a231fe98bad405a84f614e9be9f084b3a9479a16b6129923d941fa554335438e44327f0361788a129f93f6646a776e2dd613ad1ebc4188b4cb12620cc9b0651a2dc31fe38077daee2e43464a0c24c961d3d7d4a917cb3e0d4635c7b0e972a710d110808907c2b0ffebc3df6e6af1de16fed2d639b074285f159578eba28bda822986ba96abb70518f6b79352bcb74a20bd94beb46b749d8a58c07ebd3bac9267ae62cb3bb8c884c83232cd172884e433106659374d2626a4f9303bb613d1980af006e69e3194a2ddb4b47ce555d9b4c4897024f8f66ffde47760513cd0aa46f1fe61b7463f8873648d50208bf98efeaffb24e15472d17ecda1c795d9f0fd34b40451678ff767e6840eb704a56a50c739925781084c4884c4f833f7a1eaf26d994676054b327876db0f42aa5439fbd80d613083c771d30fa319c3783b6044a90c49622be05b9bf719e0b5e6f651bf74f394050cf479dae4e68a52218f00a23b53fbb68253d0084e2ab68639340609fb36b78498b4be6289dba8f546197a88194e7a850e07b2eeec744927950febe7037ba2a7c695499695892cb1f174e80d06599ee46ba6d789c79ff8b1ac22518404e3ff84c4ff044e3d6f432656653afeb192fa633e1ff3b780237c928a9ccdfa9212de25160215c4379eea9426a87fd2847469c30795ddc6f1b380e6d37014b3b8ce9ac0cab077fb4ed3a4748029fec56d5f46659427235e4eec5d93f5bdb8f44da9abd41650e06e64b38e11b2f405ca575ba8609ab6d7be476279358d01675ecca6b9a428b83f2d1fddbcb132e66ee797362295f55869a6d1fd8cb73a25e1535c2f45066a81b55be0ff2e33313de4e9ba8bf8e27efc81fe4d600a45cf93f74f753c262181a66036bad620e37607c2ecc8e4e11455edbdc3d2510a2457bb4434fd1bf320ad00fd5b1e6b0ca169b76d03f10983a436a127eca9e6d12093b420f06e1419a5fb5db038086a0a05212c5d99ce0e15612f086e6be41676c62033412d7402f085a248f76ca6a4543094c2f46276b89d61c9822f5672858a11db99a83ad7236ed4031cc87ae95745756bc22f58f516c327aa30ac1e2c65fce7c319412d0c295967d1c86f69e01288723366054fa9dee3424cefd0b68740b796e9b03de2987271952b97372ca7694783593e5ac660ad3de429f11fd3b75d1f728009bfc01b6a1635d35fb82621fcded5c83bbf91793aa3465dd9babe68e67b91d2e9afe9ed1a2a311c09dc41012991a424cb4fa403694546f9dd3dd001bf86163b4a08fbacc8c2d1f18e858f6e52352427e96652592861867b970fe023b5c0a39c39e3a4dd72bf128e319284e3c5d89787f65814da1790a2e79d7ffa372d41c740d6e467ca15fe552a53d07acae66a317f97682d5dabc974a6cf33951d46b650d024ba3555bfae5207f2ea864715d7f2084e86217a90db051d6fce795983727105dea569c3db24401916256ac1433d836735ad6bdce7cb60b9a527f5f125087480697c05cb41c5d37d49b79b948fbc25d23b108f30de5df20de044dd24122aa16f08c58c4a390ef5f2d9a4a7d9611d65179e7ee151671a373d36249674d03845f2de7fcf721e5e73bfab5b34eae36c45b505595e4f7120861d0330fbeb978ee2f1fa9ab7d0dce725dcf2a0fcb24f222629ded17f76d9f671ade9bc755f4a5f472a4e26d58e142691fc8f3b22122d48522ee53a4587019624112c65ca895c75274e17d8ff9a085bb5a84f72e7aec45f709eb5a995efe64fd7580d4965860ed4b6f452740a5448c816869b62b861518aa57419941c5d10c8a457b0578741c13bb72be61cb3afbad3b76dd02f54838765f67d6c06605d0efbf396404d5c0ecf3b37c739ec9b34d705b102b485e2cfd2d820e65df9e5cadb6a153dffb280927857516b18629665253e646e489d0e6b214c83582c725cb910f2a28bfe26db7669bc750418b227ba8179e1107a8c0c87977fa0c3da1751055be573e50ad598f19d11f7eaedfd7c2c8bc216799c93a16b09e5037dd79f30710d8a5001e9f34aa8fd1d53577be88a6b1422b073d2355e106911112efe63abcb28f3e548332e567485d8571ae65ba3d601c0940ed95c89ebf4fc70bc509294ae6904926cb6700080dae1c5a586242d7d03b030c118557b8a822ec2d060f5dc0ccc4743d501ef637e2eeb165b222f721919fdb76fbe2a59418fd3111532d0e1d0cdc261dd77f87b144cb290137bc06852bca9c66cc183a16e01fdb4e5008e3b4e0945871b7ea06efd972453af359a2a30854191d378baf0c5df0c248a438613ce7752134eb87c2ea2f74c0592e00dc7882c7ba0412391593bc9a3057ad4f4ba01109527e51a2cc5a4770bf50868e281f0a22d15d389ae80411d52c260319527729f17345644ebb85649a4527e20e1f163f87006e20244398ddc9c17a76a65e60c2367a76fe927ba622a93d2d20ef19df0abd997c18e3974e350c222e1035fb0af8a5ea19899618ad0b5a4c376371b9cce2a1853340da79a6cec8ac0e6f4d96ecad32347afc00a98b5a138f41699f4f593a10ee4eba2e4ad31e91e75242263dbec35f896aa733d1e2f7fad82c4c373e2e7953d47f3ce5317ee8615b731804327eaeb1fa382ab9b2073f0c564afa89e1a930ea346a06427d21d2f57d0771ba0403d3a92502cd89fb405f32bf483c7c77714204a403c7627c0fd0e3f434c3548706eea5e25dafe477b9e674ca38fe3aa2b09211b66ceafe35cadacb2c4e82d083f45447a66966e5e0d983a1165299430d0b86a5c74d9d1bf0eddaac381d47d6c8e90e2a1c461ff4e9870e700f47181ccd6942df38230935926f37934411e202dea595ff9e3d9fac136d43c0c00e2b38d4bedeceda689ea4f244bc8b7d75502896eeb04a22197e90c996cbcae037095f659097fd0f13277507f10c5a8114d261e2e4d52ea21feb45c0b1fabb622bc4bb3b5c26eddd521882c73b43300c240fb5672dacc40d37fe7b8523423ef21dd8322d511e24ed404035fd58f5dd621a52e4c0af2290d800ae035aa2730094578c1b9deffc44fa1539d9931e3d9ad31fe6952ea281bd0568f6d15ce536b4323fca55cdd940731e0d155488b603463d482a8544212d0d2948038e0e80c2531b4f64179e9ee3493741f8a2c24abd1c654a31f08f3c83f6da281758cf8fed2222238bb032cc67e35145726af656944d9b2dfd2fb1fd619a666fe1064b897bb3c122c22fa170150e6d775d7eac62b5a3d81a3d6e3673fd5c442518a2ae6d2fdac040a8d418c3ef0c420b63d7a51fb837da7a21993a1616cae065aaf4c9088a794d5670ea39b495c6a41cfd32e37b8b2c900c1fcfc4e9c4d50d0f7fae615c039a9a0573b5d491cbd8067815f2e2d392a4af37f6de2d22eb89d16522d6cbbcd7ffdf68331711befede270829c32b2e0cc68224a26699da9387e6151d90910af2b55f132db5f9564a91c918 + - {fileID: 2800000, guid: f20112bdeec2e8d4d9f80e8390e37263, type: 3} + - {fileID: 2800000, guid: ee148e281f3c41c5b4ff5f8a5afe5a6c, type: 3} + - {fileID: 11500000, guid: 6c12bb7674cd5416f8d846e62018a96d, type: 3} + _Values: 526a8851fe85233e7cc810cd2b8a733faa68e71a62b99912cf2f06228873853005edfb00aa354575a31cc8ad1ac7b966f52afefc8351b636e2b71574be99675b6400dfc3607f0069e96d5112b3681f5fcf550a7f3749f10c2c006f2e23d1db370e64801184e106752a681216ffa3837998b5a5688fe7245230fcd93d5728ea479cf46b8ba7516b16ed2e96b5bbb6e20e0c6272c125d7806f67cd366983232521642549cf9088373b29cf12c86a843666a9d2726c53c784328db49f8d499d2140c6bf413c35ce7d12821326d7a7c36313210e18f42f147d60db1f64f3ada3bb2d6666d31a094491222bbde8f495825a4e2f05ece33b3881253ca117543370bf2531ac8ebf10b7f565a03ac9712b88ca58c516c5a7b6d8f161d84e972e95f1f208f318fcbd24a42f1a1594d13a0cca1e4d0b9a28c0e4238a4cd5432183fe0a3d37c5600352a5affe32a0f1cca64d60c95d6de43a2f1ab3ec2f8dafe7e182ac1c0b579975acc6cca75b9cf61ff356e4ff757ac4f0e2446c5178b3cc3b0938e3500b2c3eb04c15e369388d95cb10d3df8656069a951142fc403ed6b4a90102e5146519f66f6d35134e18b132d9ec6c3ec954f282992fe09c9f2a9752fc7c47b5d52b06e06eab61a6d10e4d7cc274d62caa67eb540f7f4be5844b6a66281ce82d2f664f7483a3a0ebff69576b98633aaa8921a5ddbe04814bd97aac297cdb1235373261c4cec06828ec556592c57c95cb2c5c853ad052230733029b09f8776f245772a3ca0276dcc8b833ca146a1411560f76a926a9289a1bf169092fa58ddf9c3a7517c82635364a7f4df403890f9d1ef144fb812196cd7f0c77286780f491baec2cdaf4fd482fda400ba6f61b9da4000716c29e6ca1845b5768bcaf0ecfc98bbb39185d35a921a8142041153dc39aaa1c286f97b630278db035fff6d32e0ef214326ce60b1f02d1fa3100beb18fe2b7e76ee911c7c76ae00c14c122f29acc03601a51f08a4016e1082f6d7eea356c2d4766a7c4e03aa5e33455a9d65f214d9d8402a2681f2dbdd87b070a985bebf6d6a81097a7bf6f1b653f6d44ca68c07e191e3105186bfcf1e65731b726cef277b7a02e2f4f8ba6de14e73c29b17188403b8622b78df10f42a4017cfff026423332e5732a39eecea4c4101a0158da5ca71f8e0cacf1a805a8b07076b2f15811115bf709cdfeb27a2a54c77a62f3f016365a2b209de610da2415e4793787e44c9401f65bb01b6f5693eb1d01b923a2b5bf5a3f57c537732b4a1ce41e1dd3bc5c8f84196316b39ae5142b724ec80f2101722eba6ec83b11cc7422a66c365139bf2fc07134f6c0358c0bda930f573d9dc4051c541157fd8ac87b1d9952a64ba6e19ca69e2499417fddbe2caa24c1a561f21387762d2def8c67a4f06e2bc76e0cb0d75f9409b22d34593aa82d7ba7ae89207f8b652d5f423bce6076d56121e00caac4b88c2c7dcb083a94c883285aa4d5c6ce0a8162bfdd6753d123843ddced44e075745b023dbb7e5b896e8269c01328054c9b302a1ab4da484855f13539de7736f3892f04d9f6479188c48f2cd00d4fa9d9c99a7201753abb270b443240a506dad2e62f21bcf924dbc733497deec366e53a852b5d6e466fed752cfb7898b19bdc423679483d7065d2ed753932d34255148ed5933b2f9bb6e6a9e268170b63bcea6793c524c3515736dfa68f07f4c3e5cd2819166dba29f321139f0d5a074dc689b94fcb3f83cf281fd236e5292abdda6dc835402586d5d0c1605cee625fb13d2d6d18c0428f254a59f1f69a0ef2e209aa3a5f6e2ef35ef170e07360261e3a3ede074843437e1dfbee809a1671c43e2f82acbcd800430f3a0f274f621bc623782b35791639d9b3d6a7a4a251738a9dcae15d1d2c629ec1dee87cac94318016b3a41242a73e5469a8f9e5305b1a9e52653be5bb871d51da8e739a2dbc794808278eefad6148f68c8cf374337c311ef987ce12cf173b716a0b132fe4277edbdd4e22f732d40ef01d45592e93a97ca93fa95e5a129817e09c00a6478b8824b30bce51819f29142579bf2f14716a04ec784291717a27138999bca5ced2397ca56aa623c557fa0aea6b7c2b2d37d36ecd046c4031e66938e3bac7e8e2834609b33cd57e178eca6b83c7852308adbe3e94d428359a07b5400093c0f470edd76c4e79870e9eaba95c32283d069372be6e79067bb6ab7ca454796a807a3129056bd4516d76698e182e2bcd6bccd4d0d55bd256e985ffc3c546e2bb353081161d28e9f2b17c68842a61ffbca8999ef095525156bae067ce736817b45824c349af41156b1c1de1a70c577fb57abce4d3570d25e2df2a5b3cc1489ae5994cd4f9624895167ccd2c878e56b79ca0e2b6cfb2425d4b4aa628d99c27562c7d03f23f7d7819c328ce578ae1527135e0f7dda3ff6a97dca81f440971457a5478000a8b6376e1d8360c581b142d9608e7a1456bfa07b651858937153a686575e98014203e3e284564acf772d0414ace1d3510e7224a5ade01287e0be64f896976eb354cd453dd6c74b85fa2e828b9d4c8b9fdf7d24683ea1f5d51667f1d5e15238dfce40c6aa371127c5bdaaa470b279155bdd3ad6d9730674a2c76017713a8a6b681a4d32ac75e5c6e094fa25e94676779f8d5da313d6e0934833ec218748a6ab334f3c665ab98e2e4d0e388478e09b6c50e887e177c2785ed64615806e08b1e6b46aa6d77d33232a00d0a9e1f09ae3d730b78d804f67dd0a3864c364a40dbc45b01f48e388ad267be45e0da793a5a1c4adc1a0557652262c47b11fe1e96831e163005de15e0fb03221f68b5285849dde06880275b1fe340dba9ac4b77d44955c8fff1aa3ec7ce951ee81cc70492c6e23b11207815a53ccaebba464132d331f694d66968042f655630447ceb4524f930ad89858d64d39f505d3e46807a1100bbe767782751b8dbae93ee5fc7226db8ffaccc4a5544bcb047a020454d5b3229c26b55bebe32232d20cceb1df107ea74ef6b3011a50761a6801b71d94a7d2c046a22d1333431a134bf8204e4ed2af4022af362109e2f2bef44313d81ec1a66a47b3c19c878470a55a2690825a356561e72b38fd7ae01ae4a6e96bb747f192505286ef155af188deaeb8cd4eec2232870ac4269fb76048416d70ae562427dd5bc4403fc346500705927a4eb212c63f36e41d3df3e7d298f24eada7da53229579148e75640d90c0cacd20fd3d11862168be888de916169c0e48b27b6757d3627fefc7d6914ba33b8b137cc9492aa430c88f1098dba073930de2672b5b1567fd6f7162a2a64072a451ccf2c5994d52e5bbfe973432468198e568f78da72731274c4468ee18fc367d4dc573e3c894702f74d106b78d3cd639abd3cfef63523231af4bf491b069c3f6fa51cfe8a26f82a3862d4b8df032e395b7650edaecae8507bfae382678d6e456f60c0820b69a968c953246344f2490055701c155611592b394b9a3c1ee2f55a1bf1f247ccd2d2694ad889b2a6521d6ef8a3102955feb74a8770a5d5a1229266ec4babb2d341af68b75b7f20341902746809447bd2cc041cc65840a4d302386b6bef9ff2fdcf41490c571f4e8127805e731a6c98de179420d656ef8a3a32d12f111d50acd2e01727d13d91114c1fc636929d3615656a0a7bbc9bffa1e8fa965da8113e79c5a1a532ea7e69180454e3301d79c190e8d37329dca220b7df4ecc352b1196c41eb28f0f07fbff1c2bdc8067b8cfbd62bc27462b9e145567c25c1264b234edf3be1e113122b8fe0f916a78044273957140d5010ea7ddc4fa9baa221fb56a55f91470e032c3ed7b7ac540e3304aa888e7b67a23199892ea67d8a8886e3c1377a78f0b3b603c0fdb93fa5c2e4a7d24561caa96003a473b91a75a470a6a98d8a779cf888976dfb7c7ef7a257b79309bde95c7ed4c3e31f237a3cd6f326f0a0bcfdefe65af544078f6f57d7bd96bb14684e8d850aa19c651a98b6a058644e66f933b98d3f00b2986bcc9080f6c13622ba77a1bc4cc0bcdd33418335b655093c331b81c194e667a0d386610db497d85bc8c077879970f0f788481ef1da14bf438ddcf86935441de988d54da39ba18e886f1c49546fc655bb9abaac6878c5c94128d280185080d674ae51107ece948329c69750e65e03bf4c85e45f9d5f44230b5c90e524e0b3bb3cbf2f392c067444ffa037bccaf833cc7382a1dcc2e985810164f89baa0c11e6db27652245a744ccf5d09012d86897f338cd68b7928087b339ae27b70de891043de1680da2a9e6dc2da8aeb7d87841910cf4ee764334c589bab7b57cc374f33e8b0b4bff010953f3aa8bd48d085bc6c8f107a773d9bd8085ae78680199d8806d542fb322c3bd701c5f052438afb772099171a234e388e4c2754e52869eaa729cf3be1ed7e1066351884c3d112e46d5e6f651930b7ab540e30b7f427a95067244828744e1a89a15782afc42d049fa043e686b803d1777123e6d31c36058ddf691518771690e1bb19c4c1ae08e7270a3159380d2f096af52e49ae98b99394ae0b30a5bee3e9482c38bf2dc0f03696c440c8eb8e3d9b0f7256ddb7321eb7fe79589046c8721a11e50ff42a8e2455fb084deb57827e23eba63fe7ea3e5f84b41043a71961f0ce5126253061b78e7fb1fe1dafe4090f80f77b5b5f77a5faafbb6b40194bcb6f5cf81c67325c4fc13417bf66e95cafa0ab01c2616a42b0ba08de2b15cef7a8ca7d6d7a48c7a140dd473d9076360c11520bcb94177895fbe6b89da010779b0bc3910b1657d6f8d809c1e51a2db23983fccdd809677340ac188e6c6f65425065ac31cde52b0b4684ec0d74a95cb12999f1219ddd6091a34f505efdc96a778c388f7f92041aada8f9eca2098a1717f73748fa9f7920d239e571826b330710ef76803c19dc1d267e4578a3f1bd652d666756341165281418be46ac9298418b0e234c6df62403e5e6dd84a5ff83207c7f9fe8d2893c21ab6192dca5698e6d19fcfb4debf52d37bf9b8fb2cb1f7d12632035d30c5091144a44a00b64485e7ca8909556fccaca71aed62a36f98955353140f88e2c72327c9afae1cbeb46af062f3ee5210169112a5ced08811d51173c1498e218ad380442564a0d94d4a7b01976a0d20c469d880ac65d0dea36916d6cd4439108b966e8286445e5c71c857105ab9d738398585c3b235fc67b358fcb4e3e5b38030c80505f8c1b790f545aaf2aded7ea8238e50f2c6133d4e7d39ca10cefcc763eb292062b112c088221b218375064a6f285b279584b0b643f553733108693df771b8e887022ea8ff32272f413070803712d5ee33e24caeb90be938541ff778b61706a531b2580bce919456724969712e6917d19124948bd6ed2e296715c1f97ad1bcd5769330f2656a56bd27e5e798a6a7fcbc427626e326103d6f779089f8329ad839369736893d3d7b9a515c1c36dc4f81cd00dac6395520e1a3741c3fe060f90aeac4987b19c151667416f40f7684def3ef65fc13512f827c6c3729fd495d6c0b4a5709048b555461adb4423269305828430000b9ab1a5634bdd40ef2ab5ebfc172f7451f7dc38f44ca559a53229fecc4110240ca800cede208b3074f4ce53ff24fd0595c81e74014cd75e59579ae6381f0b32b56455eba24a932d91e4d3616cc5e57e068a30d4ca1f8f4dd6899052f7f44a01adb6a64188ce3e684fecc49a919d5d1f913a3f667a40ea6299d2f8f8b46bb74c636f7e7e392f295b8a12b2f554ce9500eaa57737e24bd950156c11dd818e75022a8e9ab75fa21a594f2e8a3b57e369743587910b5c8b361888b5ccc634dda04674e22ba04c32db0587acd350e64fa6454d80847622460d718e44af390f09c167649684afb7e531381087a00e5ac9367d20fc133249add740a062c3a29f6c351c651b747a894e2067f1cde6ed0971e14a41bbf0aade71675dae7b56c1aa440b2e024144bbc135ba3fb4c3492055d86e526ebdcff41324d423a86547c714c35042a23df12748362346bbd7c659ed7b8a0360e41da91826af4f35de0077eeab2966d89a0daa850e790cae6031888835886e5e29b6c7b7f308009da3c217da7df95673ba9d5fee78c30ee65f0ee602b9d47fb09db1bce5ee0a00123a1ea71ade021dd042c7772fb63c7ab09d30cddad64d6efa88a9abd063e55014502f07a1d6253da6fa99d2b4b6af48eebab31fb028e06c822ffba2e9a7ff45b6e493aae93bbb6f9af1e14ba87bef34fcf2e794bffc0d745c69ab821abdbe49752385bf4695c3063fc69ddc8e930546d71f0753e63e8923ce681e206d4ef360a8110ae281cdba383d5decb893f8ef4b47017b606217370815c42d58377d100bcc33c15c77f25205e4babd3577630b3ed440168219f64f42c9a61eba5969004fb9ee2c789492242a1c80b06ff717be50646f6dc5641d077c6b5456923870ea2450ae18c8858c6c08b028f297d8dcc13793a408bfc606a2618009ba1fd68ee62a599175b6053ff61dbd380e95ad88c353e90b1981dd745c46fd649e9ba661cb2c3aa6c78588bcf956d6d27a6970de5f345dcab9b453163936788019aad29804233d2d5cdc06bd407044620013b013f659b495675b43d2402af8c75519d8cf4c115bb9b078eba1e25d0388c73f926d054a6c9e8c6e7f3b03478abd53ea3f23a95b209c5d9296adc737f70d848c97dd1009046820267c915b6bbb8c6a783139812631a21057bc30274e8c5e5a747ee13f6c86ddfcd1f6e82b4b6bd2468e28296901adbe560ac6716d0a5d4876ea0471c4019e5abf58082c97032fa9050c49353a01f6a1c74f47aefd354919b3373616445ccdab782e4a6a120a78d513294d19791340174152c0174e5e4c345e794d13ed33566936366fb9b255767c9f03f14739566925554f5f218e6271da857b3c542541e747b7479dacc820cceff4fd96cccc1d5543f00a5e6f4c0d57638c02646c1535a3e0eb38ff80f3425c351b4e158bf83da6a3cf7f452f9f566d3b10c6df394437fbd5a54a1f6ce22c51ae66938a9b22336b4e5bc19c95f02e8142ccc4702c636a7a525340e6ae1e3ac0a2d0f39533e02ee723ced16bf92b661b89349ec75962234bfc0edcee621943302100f9c5fc984b23faab93fa35d57f26ed5a6fe3bc011a05f43e9241bd1c4ac4ee5eb606ce5e1622807bccadcf2815d871fc234276d97320e6f4d1be06091f18f6d00cd61e780bb48e6e9cc732372be4ac462f3f07f739c8d2d6ecc230d4278a9bb5b7fe1c3e08e907d7d0e5753b52e3df4b95b3c7a1100169bbfcb774b77c46b8edd3837fd3396e3e1946dec81e3df1d7f51d1bc08b3dceaaec1a66c03614a16a1771cff409698427fa5248fdda77454a0a5cd01af12c13cfd85bb1677d2f550510a9164da141a98a7574396c8e2e308aa04e356c1a43a5bc7c61339be514a429a74d0d848d0856374bba5b830d5abf55d4d839d10618ebcc055ad1400e0d5a9ee69cec23c44b19a9a46cb8d49f27cad6208970be4d2cdd71c72675172669bba7a043638e92636f760e1d8a8d2e16d2216f05e07a631815ed87a215153e00843bb211345bc43b45bd1bf9af30a24f43b0f897872b49350bb82f7606ef4e58c8f266b125e31d2ee5aa499d965dc71b4b385f641da77957f27d077b2c4e34546fc2c1a196537425ce277d3175e7cb677fb5d4317015c46f6cbda2a2ea985b33df9e0c581f69b208c53a96f52a47e2094e60051edd993b7b88310d54f61610667d4feeec0bdb7915fe330a555345654ca0ac538a933d56456390e0507706ff52d6d08c86c931ea721a10e4ef5c6f3042333e0b5c956505400857778404d76103cca3d4dc2d14ea6e3f1e5c5bdeba5d2de66211e085c9c552961aacfcfe5ee93292fde55d0708af69d224e50c4b614d14e4e6e6a61d506675d74849db0d1bb0646112b9f17f5bdc224d574d55512d62347f8214402bb6de6227903a0b07b9a46e10669c6161acd20a2d9cc6dba4801f0b5941de172b9aa27fcab738c0cd60f93646942401c87bf669f9f9983d7592ac258f1fcf312c96a754f7e3d5e71b6c287295fd2138a421d4224b751f3101650a36f5edcd526e38f5501230f51b5af0b2732ed92c8d4c1a35500b0e1948898aad6e266123f6c6851e5df92fda8bd446373b28935fdb929783254982b99fe15338777d780b0732445257bbcf867cf4c12452bbab8fe31576ff41e5483f493ebd3e5a089df1a4c4cff71c420897611eff1a09a80ce436c45561057ac9ec7b839b9602902b7357cf808e75a3aca10ddf9e231b6248f14ba2751e5efef61d8dbc72a05a7394f1497371d92865a56ce84cabda24592e2133731e5a1bf4eba7279dff46154dfc9b4bacdaa82b2119e5fd083612531cf9338d516ce76f11f3aa78354d7464ec8134484625d1342ab2eda6c7a2ed2a0205bc69cd2b9946e40a5c9f8420612c5c7eef79fe36f309d80049fca572c94c202b8acf6ef4683f1811d3ae7d8e4709ae3eb4b74c8bd338073abe328b6a1371411080599591bd6717af61ec62458c4946bf551bd87e6754013c36cbcac94b53019e9293f1128c40fc1ccefbedbf9b3e518a86b440d0b540872aa52d3776ce1f044a11fe28e0c53433141fbcb06b6741a0f77a3f4296123117aef33893a0f7794daef7a2ad9d1671c552812bb0f88f1bc3648c3ffc8fdc6dc81fea292c02382b0b996f0274c493031ff7850fea187e0e3e0ffbf72d3676412f76953278c061377652e0e877725801d0895df314ec58505f2414e3f9bf0142f14ecf14a63a845d6ab26567c7696835b7fac8b69469561ad0e5919cd5453034abdd07d65cbba50bf344769d790f760abbdf99f387b8d779f8b445c0a8e788501d6543169d6d2772602c3baf0c465e3f708657b4df24bc0cfa7132efff9a4c0a44da7fec349f9329faf36ca583d8933ded7baede6f2b8e07aa361c2c3b37730588b994cd388df50e1b80bbebb8178921210b2385b7d585184b77966bbbbf643e7f99e236bc3afa7b70bdf8f0e77abf6daefa4d475bf8bc5cc052e74fdb9e3526e6f96b51f9c0de18ef57eb06236bce2fb72918b60dac9978aac18a96ac54602e88d2d6e0e5116613e3cba7fcf249c62c211697b2867e186d6d1c58c8c9b89365f7bc8ff542af1559c205d242059c850c7849473c13ec4b0ab96973c9b89e492bc9be0c502644912ed50e107f5429972f974c4f807057511cf7665054dc21ed244458f43c562acd432589eedd0335a11c005dcd93b1364420f0d7b8726a19f40afd343bfb345bd93e1993a5f9462f1f2cf892acc6107f290c14d42c2de240ae3e82071f310659175b848eac45dc3e663f497495023a45e57df4d1189fd154a359be1c88c0f011da5156f8bc7e2d1bcf2a6fede56eaaab0338ec9c3c3541788a27330587bfb5a54e379b4458320263aa26fe12f241c6eefc121a50ad8c4d0f92226d95b032a38ee03761522c99ad2eca4fb99ccdac95341244f68b599a073d16754dc95f68eb223673f329a2181a95bf471bfcd4b042e58c5ea7f53c18344530233cb64ce4ce616325d440b96c91f92a734aa1b50412c6b733ab413e091ae1c0385ac654d1e2a4167c61f9dd012b20cc5e1fafcd938f2c1075ff188f10a06d3f0e818112cba5599111b832640ca4b85f758a1fd63650ac377929362f05ccd8e232c6137f55f2ff46791186b6301b3c5f2a26212624c5156a3f0cf90cb59ea3515c7dd63cc2ce7f8e2b0eb6510ee4edb411c4853aefae55483ce9c5d5db45dc254cd812b445ff9d5c59af51150ec45b5b1e45fbf1186961ad2ee186536baa968f329005e6f6a1f911611f6cbfa3c0c6877196486ab615f31d393f1dd9790f38fc18c2e37ebf75647c4b1670c92adeae1158f23afe0cffb9b87bdedf487ce068ad5697279a5bbbb81805c6b6a1a429f25a112f316a493608187c9cf99c55adf82c533d8d3df9b793ec55acfcb8b6e7ecad148636ab12d2f78d710f1dbfc11cc35741e3f4e2b62f53c863bbeb62c6af9e6b4f4c87dae4a43e2534e65115662cd5c6165b886623319bbb316e4757e694c7c15277f08a6b178d6220e5e82e22c29dc81b264c6b2637471e18bdf3ad1469f3371e6f3c0fc4b5a500322746091acaddf30b1073c1485b9a1a2ed371af23df4eb626204db2858e036635b362ff0ec1fbb121005efb09cd113d09563e97265423112790e33a17907999122609044166d60f31dc2edcc2b63f0c0ef057d0b093c01f7051d79ea536c8b279f80ee2c40cfba37f2f654a26474f7030f0492739a9e97f182974f08e3869fb137c62c9a85d48021405af1f06f5ba47019a916a800f14dd1e73046568f4ebb93a96c9561a7a382d38b4c3c1a6f67af26fd311d8352b84dc6fc117e49d5295f70f97a56340ef9d84619bcdcb2d2a7bea13f7d495e313830e111218a59dac701949452fc26322cda1358d77d0f95009993c03f7a67eff14fc1368adacf7bcddf22a4d7d8ea6c2b2ca29cd9fa9644cea3f1c4f1e5f5ce867b63033aecbcf7998f26a6afaadd27bf27a50d382b460429fa07e6e8f45db3d4e121b38a28cec19044f656eec31b868ee675b5bf0d094e3e98c2db0b6c2f7213258470ec80a1e7f666a31334ece2fd158e65cf7a07f4c7d7d384f155e3b634258445f4679ab9fe349dc3d5b0261941b5d5c58cf650080b20cc975025933dea2cd74250a6e744a0385404084420f84e45bcc48fe1c6c23a73b5352bddf6176ea026528768789ace911544a25bf03f51b4e595a72141f799eaf8246c1c68d2323ca557aa937fb6be579310e8e49b798c0b6926e7af8fc291c1475380543eb228330265b977761acb63bbf14452deb55f7e9850a341e9d1cc67f976c3d3d8fd69bab6d5ddea3d0c8e7c1da3ec61890b5ff35cf1b431f119b6cf56b1510ceeaf3ca95b0664072cd6445b20d0af9db55aeeee26c086d7318bbbd08ca18c74447e729198c5cc8f6f57203346170edf96bb7b4e6fb0e3cf2613eae6c23483de62c8af9f533204ff8e5f7edfa0538ee57323c62ed9c1e4938221b7aca0b34e7c151169f13961d2f813f059e6b342fa0d5159fc30d391566ff5f447dea9c7ac83ccfc8ec611221bb04331c4b96497043b23255c4a67f191dba3c629b6b423ec3f4f31141e07f0da9f7328743d69d2c3956c790313e0a38958e062baf626036ba26ad32bd84a705d36690bb1af263056cfe9b761e374d529e25520342f46a2f1527de36e78b234aafc16398cfc6525d2b01c0b0c7e9180e74ffd0e3d6ab4821039f580decd2e120dc5026e09ae6216379afd94034ba682bf0305519a4f9de04b01b92c5bd221b03f565081080c4f9175490be2b82298645f00e6b57100340420e58a2c078558b466cb5ca52b624f11405f7a5393b49e0290d51b201f435834593f8bc5b2b6bfa7afc8f31a467ae29034596141dac03be1b1ab623948b61d64d3255a4874220037d0d0b4482494dcb703ba076e18e8e055d9980a331a55b1d573a2d4f01a7455e05b2a5867f1d54046a65c44a80257a583ea5fe123d822d284dededbc779dcd170bbd8f6bcceb7a8545c1c6f52624358c65b970aefb7201680586aa7039c85377484be253c5424b626f7c7d27a25cc7c274a29ea858678d9a45038a08ad7f6666008e21cb0a19cfb231d60e54113f577a42f7bcf901e4550d0d48e6a6d7e4914a3bacbf1d200a43f97d3d3446174d53316ffe6047bb4caac55d30247f7b811a5432463bee4d24865642954cb9617714d773586e53e110b0f500fabf512ec275ff577687a277bd806b7b4876af669bd82a1bb4f42c1092c9bc0930ee46e4d885040b4b10eaf0725fb5282631d578a0a3642d15928432b7103b3fbd54b930c5785c3c8f5be57411c55613ab5436c39e35a9738a18ce4500d2533a2c545338e719126173eef8047626c024e997dd0c47ffde79ac45bbde46a13d6150dfb6428de1d46e43d451b03ca4fc4e270ca4970ab80c2acd33735ea1cce52f4f68aba922fc4d073d91b1e4ae714a06b69348c5025aa908141e8aa5918a330eba81ffa550a57123a553a587f8d8833e838658f17ce0d30bbfa2bc4187f2994ea15dd5d28e5b495c046c1fafb5210f145d36ddf4cdbe6d26aef464f362b2ab4cba56e59b02b1b022d0b4f6e80082c0626d571cafea5b7f1d11517f7d40c24048e9930aa1c38bee537a443b7e4aa9d82acbfe79f46a039d152bfc54abcfd29d0c8c52ff9387e1611f69c835a52000d26686abb7c1c3ca4c13cedf8839c8bc7b59a82e0a9ca96bb21664a5a3ccc6bcc9292bed327a895fd03dfb143b57a6d7a925458efef2f635bd0da232db9692e62574574e9c4911091d48a2335d6bcfa490746271a6e2cf774503c8d3a5213cc08213f71ee693acde2f63c410a0ddc25f112302bbc4ad9035870489fbea6f362e06418f4b74fdfae40b7cbebc591fe7dd3969c28222f8852fa33e97e21da8c99f996a0a5f4e77eb142919f9061ec65d46537df480134ab71e796640225157631bc309671356f98c67215bf721b492e01e312d4e024384d7c63f515aa2a457ea00382343142e709c4d0973a148ad699519795e876ac9dac0ad3a3605a296ce63ceff409e14c14ecc7a9748985b7577f84cc064e8ff940f8935b92b29dc7e86e4da3531e07cba3b9865c35864a083f5b51dd95089f1d76834d62a2cceec77a9f81d2c726e5967846d7a344dc3ed732ab8aee146b6cffcf302cdfc4aa8e66dacee1a5f45b6299bf50a7c2e1b17483d96f7866e1366d4b4a635eb2d59316ea6cd13baf91bc2e1b9640ea5a6130d18aa16cc20d00d2b23d92af82c4d63ee0c822a7c22373f3481aafcad1e1452d8bc70f43b968f15c9ca6a657cde1c249a93fa1375fb6711ca21fec66dd38535a7db70716b3c20075fb4a55764835f562f1ae7acd6f5d80bbaca88c27ffec56f4306262178dc9972a0b54a05f0e4e04eee35b2553eb0c30868111123e4057c688f870fae8eeeb15087ac62212c429608e11f3cb8fb5417232ad79a54fc6a6849a4620b5890a64543ce09224e316da555383b17cd6730c905dc85354cbaed9120a7b33453fabfba69778d3425444cbb78d2dec8dd4c140d0b5fad79abfb90fb7a74d48185dd90f8338530e31b0b5fb66db406b78784e26b0a9ae5d13baeee250c844ae35b96036a71a08d06728ec83649f99bed4f15d2e36d68771fc36134e16a0cd79f564312044f9b452711e9de982f5077bcedff2908562e51f31ee3a7102c908e9848d620fa19989eeb5bf9f55775210f8d15880b9435e1f584940523330b35fa815b464f58307da3849d156350245896c00ccada4b63de32d6335b71e0746cdf90f477b2bb7069be932b90324a44b957c2919cd9be0fba1bc787d973741183f909f4f4459b5b24b05bf4b8e02d54e992edb233721145625fc5a315cb680bb57e5076c3c1c774bb676cec7eca5665491c9f4686c1de090a4f919480f74559474f3e3a90b691555b616e9adefdc367085fec316aaf9277a4a6948bcfcd0b3b2112a42e8c1cd400520b13dbacbcd408ee0673dff4ec1167bdc6de364b1c25735632bbf1a2f2f313751420a06449355f85636236a5d4b80d240b71c53e9db536e59f31de78c5aa04eda09420348ffd0605c24e174611322aecc915ad63b95212cb5686047a14d84048a2b6fac067276bf29536ff133283082ea435be24a79859f2a7ea8b1601810f16f12f5ca4c7967b5d5643327dad00682c82292a21e6e35ff5a31397ae4d7e0ce9b9eafa9d1f520ac44ee38514352844a7825e93d857ee2f0dcf6601b4ffcd10d73649c4c305ca0cd1e09a2cfda1b53f86310fd31115cb6d3545123147afa93a802c5221149b7e5e49ae9c470ee5d2507c59781af15ede13fe4806f7e703ab20c89f522fb06cd415b3b18b6379845f4f73c2b6ed368e49204f3f24cb94867644fd84ef51c8fefe172e8e683fd37a997916487bdab2411557178c81106e5f552b3b4660fd74b117713f314058d9f6b32c91be04fbd763fe1f25545ba7282e5943798f07fdeed08e333d2b93a137c6c24d9fd8eca9bc4571412240939facb6b80d6620addb941af040d02fc6fc085fa95f910e074f42b0874202491f2f632edf788d7ac4e8e618477a19532672818bc63d69cbf2625097344a67952322c5df5b01f2c0767ddb6dba55ab7d976a28063c767d1d3868c382d80a467a8250f525b538129cb7d3ffca21605aada0e318c3c473677fc89f1496a07bc95f7102847b613880cc869fc554f57b5a21f74885d21f349ef2d76cedfef158c2cdf560a7e124214d68634b3d25ad437443f8358ee80009403da17752cd257ebfde62934955223a4619fc1c6ed4f63c60e40856f944352543e48d5ec21afa359acd84581be2876b4865176dc4cf857957c39fcb0af7421e8e7dda89469779448ef5d3174c1eba73a0ec4a79453ac06fef5d3562f701db50132d7d0feea646356cd3e4e2ec92b870d1232b799bc961065beb55aa1d3f5b6bf2a5255e2b0e3206b7a2a21ac263493b37e7d0ee86e42c050623d8f69ddf07542f4ff0466d5a4521cb6f1efaefb50e0d87e09cb019d65c685608158d8cfd3123a2af44b8156a7276a5e63df301fdbb7abf1d32b2090ac57fd6c8e863663b3136531255ff144f6a53c58fce6fca7e19538c3b7122ad2a231fe98bad405a84f614e9be9f084b3a9479a16b6129923d941fa554335438e44327f0361788a129f93f6646a776e2dd613ad1ebc4188b4cb12620cc9b0651a2dc31fe38077daee2e43464a0c24c961d3d7d4a917cb3e0d4635c7b0e972a710d110808907c2b0ffebc3df6e6af1de16fed2d639b074285f159578eba28bda822986ba96abb70518f6b79352bcb74a20bd94beb46b749d8a58c07ebd3bac9267ae62cb3bb8c884c83232cd172884e433106659374d2626a4f9303bb613d1980af006e69e3194a2ddb4b47ce555d9b4c4897024f8f66ffde47760513cd0aa46f1fe61b7463f8873648d50208bf98efeaffb24e15472d17ecda1c795d9f0fd34b40451678ff767e6840eb704a56a50c739925781084c4884c4f833f7a1eaf26d994676054b327876db0f42aa5439fbd80d613083c771d30fa319c3783b6044a90c49622be05b9bf719e0b5e6f651bf74f394050cf479dae4e68a52218f00a23b53fbb68253d0084e2ab68639340609fb36b78498b4be6289dba8f546197a88194e7a850e07b2eeec744927950febe7037ba2a7c695499695892cb1f174e80d06599ee46ba6d789c79ff8b1ac22518404e3ff84c4ff044e3d6f432656653afeb192fa633e1ff3b780237c928a9ccdfa9212de25160215c4379eea9426a87fd2847469c30795ddc6f1b380e6d37014b3b8ce9ac0cab077fb4ed3a4748029fec56d5f46659427235e4eec5d93f5bdb8f44da9abd41650e06e64b38e11b2f405ca575ba8609ab6d7be476279358d01675ecca6b9a428b83f2d1fddbcb132e66ee797362295f55869a6d1fd8cb73a25e1535c2f45066a81b55be0ff2e33313de4e9ba8bf8e27efc81fe4d600a45cf93f74f753c262181a66036bad620e37607c2ecc8e4e11455edbdc3d2510a2457bb4434fd1bf320ad00fd5b1e6b0ca169b76d03f10983a436a127eca9e6d12093b420f06e1419a5fb5db038086a0a05212c5d99ce0e15612f086e6be41676c62033412d7402f085a248f76ca6a4543094c2f46276b89d61c9822f5672858a11db99a83ad7236ed4031cc87ae95745756bc22f58f516c327aa30ac1e2c65fce7c319412d0c295967d1c86f69e01288723366054fa9dee3424cefd0b68740b796e9b03de2987271952b97372ca7694783593e5ac660ad3de429f11fd3b75d1f728009bfc01b6a1635d35fb82621fcded5c83bbf91793aa3465dd9babe68e67b91d2e9afe9ed1a2a311c09dc41012991a424cb4fa403694546f9dd3dd001bf86163b4a08fbacc8c2d1f18e858f6e52352427e96652592861867b970fe023b5c0a39c39e3a4dd72bf128e319284e3c5d89787f65814da1790a2e79d7ffa372d41c740d6e467ca15fe552a53d07acae66a317f97682d5dabc974a6cf33951d46b650d024ba3555bfae5207f2ea864715d7f2084e86217a90db051d6fce795983727105dea569c3db24401916256ac1433d836735ad6bdce7cb60b9a527f5f125087480697c05cb41c5d37d49b79b948fbc25d23b108f30de5df20de044dd24122aa16f08c58c4a390ef5f2d9a4a7d9611d65179e7ee151671a373d36249674d03845f2de7fcf721e5e73bfab5b34eae36c45b505595e4f7120861d0330fbeb978ee2f1fa9ab7d0dce725dcf2a0fcb24f222629ded17f76d9f671ade9bc755f4a5f472a4e26d58e142691fc8f3b22122d48522ee53a4587019624112c65ca895c75274e17d8ff9a085bb5a84f72e7aec45f709eb5a995efe64fd7580d4965860ed4b6f452740a5448c816869b62b861518aa57419941c5d10c8a457b0578741c13bb72be61cb3afbad3b76dd02f54838765f67d6c06605d0efbf396404d5c0ecf3b37c739ec9b34d705b102b485e2cfd2d820e65df9e5cadb6a153dffb280927857516b18629665253e646e489d0e6b214c83582c725cb910f2a28bfe26db7669bc750418b227ba8179e1107a8c0c87977fa0c3da1751055be573e50ad598f19d11f7eaedfd7c2c8bc216799c93a16b09e5037dd79f30710d8a5001e9f34aa8fd1d53577be88a6b1422b073d2355e106911112efe63abcb28f3e548332e567485d8571ae65ba3d601c0940ed95c89ebf4fc70bc509294ae6904926cb6700080dae1c5a586242d7d03b030c118557b8a822ec2d060f5dc0ccc4743d501ef637e2eeb165b222f721919fdb76fbe2a59418fd3111532d0e1d0cdc261dd77f87b144cb290137bc06852bca9c66cc183a16e01fdb4e5008e3b4e0945871b7ea06efd972453af359a2a30854191d378baf0c5df0c248a438613ce7752134eb87c2ea2f74c0592e00dc7882c7ba0412391593bc9a3057ad4f4ba01109527e51a2cc5a4770bf50868e281f0a22d15d389ae80411d52c260319527729f17345644ebb85649a4527e20e1f163f87006e20244398ddc9c17a76a65e60c2367a76fe927ba622a93d2d20ef19df0abd997c18e3974e350c222e1035fb0af8a5ea19899618ad0b5a4c376371b9cce2a1853340da79a6cec8ac0e6f4d96ecad32347afc00a98b5a138f41699f4f593a10ee4eba2e4ad31e91e75242263dbec35f896aa733d1e2f7fad82c4c373e2e7953d47f3ce5317ee8615b731804327eaeb1fa382ab9b2073f0c564afa89e1a930ea346a06427d21d2f57d0771ba0403d3a92502cd89fb405f32bf483c7c77714204a403c7627c0fd0e3f434c3548706eea5e25dafe477b9e674ca38fe3aa2b09211b66ceafe35cadacb2c4e82d083f45447a66966e5e0d983a1165299430d0b86a5c74d9d1bf0eddaac381d47d6c8e90e2a1c461ff4e9870e700f47181ccd6942df38230935926f37934411e202dea595ff9e3d9fac136d43c0c00e2b38d4bedeceda689ea4f244bc8b7d75502896eeb04a22197e90c996cbcae037095f659097fd0f13277507f10c5a8114d261e2e4d52ea21feb45c0b1fabb622bc4bb3b5c26eddd521882c73b43300c240fb5672dacc40d37fe7b8523423ef21dd8322d511e24ed404035fd58f5dd621a52e4c0af2290d800ae035aa2730094578c1b9deffc44fa1539d9931e3d9ad31fe6952ea281bd0568f6d15ce536b4323fca55cdd940731e0d155488b603463d482a8544212d0d2948038e0e80c2531b4f64179e9ee3493741f8a2c24abd1c654a31f08f3c83f6da281758cf8fed2222238bb032cc67e35145726af656944d9b2dfd2fb1fd619a666fe1064b897bb3c122c22fa170150e6d775d7eac62b5a3d81a3d6e3673fd5c442518a2ae6d2fdac040a8d418c3ef0c420b63d7a51fb837da7a21993a1616cae065aaf4c9088a794d5670ea39b495c6a41cfd32e37b8b2c900c1fcfc4e9c4d50d0f7fae615c039a9a0573b5d491cbd8067815f2e2d392a4af37f6de2d22eb89d16522d6cbbcd7ffdf68331711befede270829c32b2e0cc68224a26699da9387e6151d90910af2b55f132db5f9564a91c9184a025b4b64527358fc4414d0d5ee2b1cf349eb69e9d4ce4c diff --git a/Assets/Scenes/EditorScene.unity b/Assets/Scenes/EditorScene.unity index 7a0a30ca..9237275b 100644 --- a/Assets/Scenes/EditorScene.unity +++ b/Assets/Scenes/EditorScene.unity @@ -178,7 +178,7 @@ MonoBehaviour: enableButtonGroup: {fileID: 1012344135} timelineTabRect: {fileID: 1700873338} timePointerModule: {fileID: 1744644990} - musicPlayer: {fileID: 1502848757} + musicPlayModule: {fileID: 0} TimeField: {fileID: 1834821448} BeatField: {fileID: 916536462} GetinputArea: {fileID: 1027966091} @@ -5379,6 +5379,8 @@ GameObject: - component: {fileID: 1197505584} - component: {fileID: 1197505585} - component: {fileID: 1197505586} + - component: {fileID: 1197505588} + - component: {fileID: 1197505587} m_Layer: 0 m_Name: EditorManager m_TagString: Untagged @@ -5449,11 +5451,12 @@ MonoBehaviour: parentElement: {fileID: 0} connectedTab: {fileID: 0} childElementList: [] + musicPlayer: {fileID: 1197505588} uiManager: {fileID: 1039576900} backgroundController: {fileID: 1197505585} cameraManager: {fileID: 1197505586} timeline: {fileID: 30852810} - currentJudgeType: 2 + currentJudgeType: 0 basePrefabs: {fileID: 11400000, guid: 266f4a39c512c46eea7e44336e4fc600, type: 2} --- !u!4 &1197505579 Transform: @@ -5560,6 +5563,116 @@ MonoBehaviour: sceneCameraMoveSpeed: 10 sceneCameraRotateSpeed: 30 gameCamera: {fileID: 0} +--- !u!82 &1197505587 +AudioSource: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1197505577} + m_Enabled: 1 + serializedVersion: 4 + OutputAudioMixerGroup: {fileID: 0} + m_audioClip: {fileID: 0} + m_PlayOnAwake: 0 + m_Volume: 1 + m_Pitch: 1 + Loop: 0 + Mute: 0 + Spatialize: 0 + SpatializePostEffects: 0 + Priority: 128 + DopplerLevel: 1 + MinDistance: 1 + MaxDistance: 500 + Pan2D: 0 + rolloffMode: 0 + BypassEffects: 0 + BypassListenerEffects: 0 + BypassReverbZones: 0 + rolloffCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + panLevelCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + spreadCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + reverbZoneMixCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 +--- !u!114 &1197505588 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1197505577} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6c12bb7674cd5416f8d846e62018a96d, type: 3} + m_Name: + m_EditorClassIdentifier: + isPlaying: 0 + audioSource: {fileID: 1197505587} --- !u!1 &1214558124 GameObject: m_ObjectHideFlags: 0 @@ -7946,6 +8059,8 @@ MonoBehaviour: viewType: 0 perspectiveAngle: 60 orthographicSize: 10 + cameraPosition: {x: 0, y: 0, z: 0} + cameraEulerAngles: {x: 0, y: 0, z: 0} --- !u!1 &1491057506 GameObject: m_ObjectHideFlags: 0 @@ -8077,9 +8192,8 @@ GameObject: m_Component: - component: {fileID: 1502848755} - component: {fileID: 1502848757} - - component: {fileID: 1502848756} m_Layer: 5 - m_Name: MusicPlayer + m_Name: MusicPlayModule m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -8106,102 +8220,6 @@ RectTransform: m_AnchoredPosition: {x: 140, y: 200.00012} m_SizeDelta: {x: 280, y: 40} m_Pivot: {x: 0.5, y: 0.5} ---- !u!82 &1502848756 -AudioSource: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1502848754} - m_Enabled: 1 - serializedVersion: 4 - OutputAudioMixerGroup: {fileID: 0} - m_audioClip: {fileID: 0} - m_PlayOnAwake: 0 - m_Volume: 1 - m_Pitch: 1 - Loop: 0 - Mute: 0 - Spatialize: 0 - SpatializePostEffects: 0 - Priority: 128 - DopplerLevel: 1 - MinDistance: 1 - MaxDistance: 500 - Pan2D: 0 - rolloffMode: 0 - BypassEffects: 0 - BypassListenerEffects: 0 - BypassReverbZones: 0 - rolloffCustomCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - panLevelCustomCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - spreadCustomCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - reverbZoneMixCustomCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 --- !u!114 &1502848757 MonoBehaviour: m_ObjectHideFlags: 0 @@ -8214,8 +8232,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 4d97c1cf488304279b0c7c7bdb1fb3d8, type: 3} m_Name: m_EditorClassIdentifier: - isPlaying: 0 - audioSource: {fileID: 1502848756} playButton: {fileID: 242946796} pauseButton: {fileID: 1289541373} stopButton: {fileID: 1407640360} @@ -10623,7 +10639,7 @@ MonoBehaviour: openPrefabs: 0 prefabs: [] idRef: - _Keys: 19fa7c8b7a3a004fc497f181b6e026078db49f8d499d21408923e4a607ce3a595981be3ba9ff4c769b8f130ebe47887ebdfb98ebe5da7049210e18f42f147d60c6bf413c35ce7d12db1f64f3ada3bb2d821326d7a7c363136666d31a094491222bbde8f495825a4e2f05ece33b3881253ca117543370bf2531ac8ebf10b7f565a03ac9712b88ca58c516c5a7b6d8f161d9edf2f0d7536a18cb29cd07833a5a3b4c7ae726cc17482e559c16f3c9b08b330df8ea680ec3b112fb2cdae8148f027d060f5dc0ccc4743d6cbda2a2ea985b33ceaaec1a66c03614f318fcbd24a42f1ad60e54113f577a421594d13a0cca1e4dea74ef6b3011a507d84e972e95f1f208c29e6ca1845b5768a29ea858678d9a45dd71c72675172669d2216f05e07a6318526a8851fe85233ecdfeb27a2a54c77acf2f0622887385307cc810cd2b8a733f308aa04e356c1a4343b0f897872b4935cad6208970be4d2cf27d077b2c4e3454a429a74d0d848d0856374bba5b830d5a1c80b06ff717be50822ffba2e9a7ff4587ac62212c429608d6f7162a2a64072a2505286ef155af18b8b137cc9492aa430bb82f7606ef4e587d4feeec0bdb7915a98a7574396c8e2e8332e567485d85710a55a2690825a356de044dd24122aa16cb6700080dae1c5afbe2a59418fd3111573d9dc4051c54111fafcd938f2c107505edfb00aa3545750cacd20fd3d118628f24eada7da532296de43a2f1ab3ec2f40174152c0174e5ed6d08c86c931ea726390e0507706ff52bcaf0ecfc98bbb39566936366fb9b255a7ae89207f8b652d88310d54f616106692fde55d0708af69fa88a9abd063e55043de1680da2a9e6d579975acc6cca75b961aacfcfe5ee932d224e50c4b614d14bba7a043638e92631518771690e1bb19dced44e075745b028dafe7e182ac1c0bae65ba3d601c0940232d20cceb1df107aed62a36f989553501753abb270b44324d7d8ea6c2b2ca297f8214402bb6de62c8eb8e3d9b0f7256185d35a921a8142098b19bdc42367948b6e493aae93bbb6f41153dc39aaa1c28d34255148ed5933b025933dea2cd7425bcb047a020454d5b0b9ab1a5634bdd403229c26b55bebe32908e9848d620fa19a0ac538a933d5645ebcc055ad1400e0de2b71574be99675bf8a3102955feb74a2c3eb04c15e369386f97b630278db035378baf0c5df0c2488deaeb8cd4eec223eb87c2ea2f74c059586242d7d03b030c5a9ee69cec23c44b4e60051edd993b7bc5600352a5affe328d95cb10d3df8656e07cba3b9865c358a438613ce775213415ed87a215153e001a10e4ef5c6f3042f4c3e5cd2819166d6112b9f17f5bdc220857778404d76103118557b8a822ec2db3cc3b0938e3500b561e72b38fd7ae010c88f1098dba07392870ac4269fb7604ae4a6e96bb747f19d5bc4403fc346500d5432183fe0a3d37333e0b5c95650540fe330a555345654cb222f721919fdb76454a0a5cd01af12cb7ea06efd972453a5bbfe973432468198e568f78da72731205a296ce63ceff4027fefc7d6914ba336fc2c1a196537425df9e0c581f69b2087fb5d4317015c46f3f1e5c5bdeba5d2df359a2a30854191da2335d6bcfa490744d574d55512d623419a9a46cb8d49f27bf55d4d839d10618a0f1cca64d60c95de66211e085c9c552c53a96f52a47e2097c7d27a25cc7c274f36e41d3df3e7d29069a951142fc403e37bc06852bca9c66ce277d3175e7cb6713cfd85bb1677d2fc509294ae69049262e00dc7882c7ba04550510a9164da141cca3d4dc2d14ea6ea5bc7c61339be514a16a1771cff40969d4dc573e3c894702705927a4eb212c63501ef637e2eeb1659e52653be5bb871dc8f266b125e31d2ee5aa499d965dc71b12391593bc9a30575008e3b4e09458718416d70ae562427d168be888de916169ad4f4ba01109527ee4e6e6a61d506675d74849db0d1bb064ed95c89ebf4fc70b843bb211345bc43b4b385f641da77957fcf2e794bffc0d74532d0e1d0cdc261dd77f87b144cb2901579148e75640d90c451ccf2c5994d52ec0e48b27b6757d3674c4468ee18fc367efe63abcb28f3e5430de2672b5b1567fcc183a16e01fdb4e8427fa5248fdda7745bd1bf9af30a24f6f760e1d8a8d2e169cf46b8ba7516b16ed2e96b5bbb6e20eeb540f7f4be5844b79e7ee151671a373a4e26d58e142691f576b98633aaa8921a5ddbe04814bd97a61c4cec06828ec5598b5a5688fe724522d9a4a7d9611d651d36249674d03845f0c6272c125d7806fe2bb353081161d28c122f29acc03601a51f08a4016e1082f30fcd93d5728ea47b79ca0e2b6cfb242a9d65f214d9d8402fab5b34eae36c45bd0330fbeb978ee2fcf2a0fcb24f222621fa9ab7d0dce725d9ded17f76d9f671ad6c06605d0efbf3940a506dad2e62f21bcf924dbc733497d038a08ad7f6666006a66281ce82d2f6619f66f6d35134e18a31cc8ad1ac7b966cf550a7f3749f10c0e64801184e106752a681216ffa3837967cd366983232521642549cf9088373ba9d2726c53c7843229cf12c86a8436660b9a28c0e4238a4c7ac4f0e2446c5178d6b4a90102e51465b132d9ec6c3ec954f282992fe09c9f2a6d7eea356c2d4766a7c4e03aa5e334559752fc7c47b5d52b06e06eab61a6d10e4f7483a3a0ebff69f6c0358c0bda930f4d7cc274d62caa67c537732b4a1ce41e4e79870e9eaba95cdaf4fd482fda400b1dd3bc5c8f8419633140f88e2c72327c9afae1cbeb46af06ac297cdb123537326592c57c95cb2c5c853ad052230733029b09f8776f245772a3ca0276dcc8b833ca146a1411560f76a926a9289a1bf169092fa58ddf9c3a7517c82635364a7f4df403890f9d1ef144fb812196cd7f0c77286780f491baec2ca6f61b9da400071600beb18fe2b7e76e86d5d0c1605cee62a2681f2dbdd87b071d79c190e8d373290a985bebf6d6a810a8113e79c5a1a532eec366e53a852b5d6e466fed752cfb7897a7bf6f1b653f6d0c571f4e8127805ec3515736dfa68f07ba29f321139f0d5a44ca68c07e191e316809447bd2cc041c05186bfcf1e65731b726cef277b7a02e29b17188403b8622365139bf2fc071347e1dfbee809a1671c43e2f82acbcd800b78df10f42a4017c8a9dcae15d1d2c62fff026423332e57357fd8ac87b1d9952a64ba6e19ca69e24acf1a805a8b07076b2f15811115bf70962f3f016365a2b20b01b6f5693eb1d01ec4babb2d341af68b923a2b5bf5a3f577bfae382678d6e455f423bce6076d56121e00caac4b88c2cc83b11cc7422a66cf74d106b78d3cd635aa4d5c6ce0a81623dbb7e5b896e826999417fddbe2caa248eba28bda822986bc1a561f21387762d2def8c67a4f06e2bc76e0cb0d75f9409074dc689b94fcb3f83cf281fd236e5297dcb083a94c883282de7fcf721e5e73b505595e4f7120861c01328054c9b302af4022af362109e2f2bef44313d81ec1a39de7736f3892f04d9f6479188c48f2cd00d4fa9d9c99a72d4516d76698e182e2abdda6dc8354025c623782b35791639d9b3d6a7a4a251738016b3a41242a73e716a0b132fe4277ef01d45592e93a97c88b5ccc634dda046cd046c4031e66938e3bac7e8e2834609651b747a894e2067a554335438e44327f1cde6ed0971e14a83c7852308adbe3ed656ef8a3a32d12f111d50acd2e01727d13d91114c1fc636e65f0ee602b9d47fb09db1bce5ee0a0037e7d0ee86e42c0594d428359a07b5400093c0f470edd76c5c69ab821abdbe49752385bf4695c3063fc69ddc8e9305462bcd6bccd4d0d55ba8110ae281cdba388e7dda89469779443d5decb893f8ef4b57c39fcb0af7421ed256e985ffc3c54695167ccd2c878e567135e0f7dda3ff6a97dca81f440971457a5478000a8b6376e1d8360c581b142d9608e7a1456bfa07564a0d94d4a7b01976a0d20c469d880ac65d0dea36916d6c9048b555461adb44f08c58c4a390ef5f95c81e74014cd75e59579ae6381f0b32a134bf8204e4ed2a3587910b5c8b361874e22ba04c32db059abd3cfef63523236f60c0820b69a9681af4bf491b069c3f5b7650edaecae8503862d4b8df032e396fa51cfe8a26f82ac953246344f2490055701c155611592b394b9a3c1ee2f55a1bf1f247ccd2d26907fbff1c2bdc80674ad889b2a6521d6e8770a5d5a1229266b75b7f2034190274c65840a4d302386b6bef9ff2fdcf4149731a6c98de17942073ba9d5fee78c30e5fa2c9a03e68ea0f36204474695ee17c4bff0675b00ed30ed406d360c39fe63b929d3615656a0a7bbc9bffa1e8fa965dea7e69180454e330dca220b7df4ecc352b1196c41eb28f0fb8cfbd62bc27462b9e145567c25c1264b234edf3be1e113122b8fe0f916a78044273957140d5010ea7ddc4fa9baa221fb56a55f91470e032c3ed7b7ac540e3304aa888e7b67a23199892ea67d8a8886e3c1377a78f0b3b603c0fdb93fa5c2e4a7d24561caa96003a473b91a75a470a6a98d8a779cf888976dfb7c7ef7a257b79309bde95c7ed4c3e31f237a3cd6f326f0a0bcfdefe65af544078f6f57d7bd96bb14684e8d850aa19c651a98b6a058644e66f933b98d3f00b2986bcc9080f6c13622ba77a1bc4cc0bcdd33418335b655093c331b81c194e667a0d386610db497d85bc8c077879970f0f788481ef1da14bf438ddcf86935441de988d54da39ba18e886f1c49546fc655bb9abaac6878c5c94128d280185080d674ae51107ece948329c69750e65e03b339ae27b70de8910f4c85e45f9d5f44230b5c90e524e0b3bb3cbf2f392c067444ffa037bccaf833cc7382a1dcc2e985810164f89baa0c11e6db27652245a744ccf5d09012d86897f338cd68b7928087ba8909556fccaca71c2da8aeb7d87841910cf4ee764334c58a6fa99d2b4b6af48ef5d3562f701db50a0ec4a79453ac06f8ef5d3174c1eba739bab7b57cc374f33e8b0b4bff010953f3aa8bd48d085bc6c8f107a773d9bd8085ae78680199d8806d542fb322c3bd701c5f052438afb772099171a234e388e4c2754e52869eaa729cf3be1ed7e1066351884c3d112e46d5e6f651930b7ab540e30b7f427a95067244828744e1a89a15782afc42d049fa043e686b803d1777123e6d31c36058ddf69c4c1ae08e7270a3159380d2f096af52e49ae98b99394ae0b30a5bee3e9482c38bf2dc0f03696c440ddb7321eb7fe79589046c8721a11e50ff42a8e2455fb084deb57827e23eba63fe7ea3e5f84b41043a71961f0ce5126253061b78e7fb1fe1dafe4090f80f77b5b5f77a5faafbb6b40194bcb6f5cf81c67325c4fc13417bf66e95cafa0ab01c2616a42b0ba08de2b15cef7a8ca7d6d7a48c7a140dd473d9076360c11520bcb94177895fbe6b89da010779b0bc3910b1657d6f8d809c1e51a2db23983fccdd809677340ac188e6c6f65425065ac31cde52b0b4684ec0d74a95cb12999f1219ddd6091a34f505efdc96a778c388f7f92041aada8f9eca2098a1717f73748fa9f7920d239e571826b330710ef76803c19dc1d267e4578a3f1bd652d666756341165281418be46ac9298418b0e234c6df62403e5e6dd84a5ff83207c7f9fe8d2893c21ab6192dca5698e6d19fcfb4debf52d37bf9b8fb2cb1f7d12632035d30c5091144a44a00b64485e7c9af1e14ba87bef3415472d17ecda1c792f3ee5210169112a5ced08811d51173c1498e218ad38044208bf98efeaffb24e78d513294d197913de9bc755f4a5f472c8f3b22122d48522ee53a4587019624112c65ca895c75274e17d8ff9a085bb5a84f72e7aec45f709d4439108b966e8286445e5c71c857105ab9d738398585c3b235fc67b358fcb4e3e5b38030c80505f8c1b790f545aaf2aded7ea8238e50f2c6133d4e7d39ca10cefcc763eb292062b112c088221b218375064a6f285b279584b0b643f553733108693df771b8e887022ea8ff32272f4137463f8873648d502070803712d5ee33e24caeb90be938541ff778b61706a531b2580bce919456724969712e6917d191213cd0aa46f1fe61b4948bd6ed2e296715c1f97ad1bcd5769330f2656a56bd27e5e798a6a7fcbc427626e326103d6f7794f8f66ffde477605ce555d9b4c48970269e3194a2ddb4b47bb613d1980af006e089f8329ad8393699374d2626a4f9303736893d3d7b9a515c1c36dc4f81cd00dac6395520e1a3741c3fe060f90aeac4987b19c151667416f40f7684def3ef65fc13512f827c6c3729fd495d6c0b4a5702326930582843000ef2ab5ebfc172f7451f7dc38f44ca559a53229fecc411024d172884e43310665b3bb8c884c83232cebd3bac9267ae62c0ca800cede208b30eb46b749d8a58c07352bcb74a20bd94ba96abb70518f6b7974f4ce53ff24fd05a7b33453fabfba69778d3425444cbb785fad79abfb90fb7a27903a0b07b9a46e639b074285f15957b56455eba24a932df6e6af1de16fed2d08907c2b0ffebc3d91e4d3616cc5e57e068a30d4ca1f8f4dd6899052f7f44a01adb6a64188ce3e684fecc49a919d5d1f913a3f667a40ea6299d2f8f8b46bb74c636f7e7e392f295b7b0e972a710d11084a917cb3e0d4635c64a0c24c961d3d7dfe38077daee2e43420cc9b0651a2dc31d1ebc4188b4cb1268a12b2f554ce9500eaa57737e24bd950156c11dd818e75022a8e9ab75fa21a596646a776e2dd613a4f2e8a3b57e3697465666ad918140b761d05cd1280c357590e579e14898dcd4fd0ba74453c4ad26948e6a6d7e4914a3b87acd350e64fa645f0361788a129f93f4d80847622460d718e44af390f09c167649684afb7e531381087a00e5ac9367d20fc133249add740a062c3a29f6c351c41bbf0aade71675dae7b56c1aa440b2ea16b6129923d941fe9be9f084b3a9479024144bbc135ba3fb4c3492055d86e52e98bad405a84f6148c3b7122ad2a231fc58fce6fca7e1953531255ff144f6a536ebdcff41324d423d6c8e863663b3136bf1d32b2090ac57fa5e63df301fdbb7aa86547c714c35042a23df12748362346a2af44b8156a72765608158d8cfd312387e09cb019d65c68cb6f1efaefb50e0dbbd7c659ed7b8a0360e41da91826af4f35de0077eeab2966d89a0daa850e790c2f4ff0466d5a45210623d8f69ddf0754ae6031888835886e5e29b6c7b7f308009da3c217da7df956b7a2a21ac263493b123a1ea71ade021dd042c7772fb63c7ab09d30cddad64d6ef2a5255e2b0e32065beb55aa1d3f5b6bd1232b799bc9610614502f07a1d6253d6cd3e4e2ec92b870132d7d0feea64635eebab31fb028e06cd71f0753e63e8923ce681e206d4ef36047017b60621737084865176dc4cf85799acd84581be2876b43e48d5ec21afa3560e40856f944352515c42d58377d100bcc33c15c77f25205e4babd3577630b3ed440168219f64f424619fc1c6ed4f63cbfde62934955223ac9a61eba5969004fb9ee2c789492242a403da17752cd257e7443f8358ee800094d68634b3d25ad43c2cdf560a7e12421646f6dc5641d077c9ef2d76cedfef1586b5456923870ea2450ae18c8858c6c08b028f297d8dcc13793a408bfc606a2618009ba1fd68ee62a599175b6053ff61d5a21f74885d21f3480cc869fc554f57bc95f7102847b6138bd380e95ad88c353677fc89f1496a07b5aada0e318c3c473129cb7d3ffca2160467a8250f525b5387d1d3868c382d80ae90b1981dd745c46ab7d976a28063c76f2c0767ddb6dba55fd649e9ba661cb2c3aa6c78588bcf956d6d27a6970de5f3467952322c5df5b0169cbf2625097344a5dcab9b453163936788019aad29804233d2d5cdc06bd407019532672818bc63d8d7ac4e8e618477a44620013b013f65902491f2f632edf78910e074f42b08742d02fc6fc085fa95fb495675b43d2402af8c75519d8cf4c116620addb941af0402240939facb6b80d5bb9b078eba1e25d9fd8eca9bc4571413d2b93a137c6c24d0388c73f926d054a6c9e8c6e7f3b03478abd53ea3f23a95b209c5d9296adc737f70d848c97dd1009046820267c915b6bbb8c6a7831398126798f07fdeed08e3325545ba7282e594331a21057bc30274e91be04fbd763fe1f8c5e5a747ee13f6c86ddfcd1f6e82b4b6bd2468e282969014c345e794d13ed33767c9f03f14739566925554f5f218e6271da857b3c542541e747b7479dacc820cceff4fd96cccc1d5543f00a5e6f4c0d57638c02646c1535a3e0eb38ff80f3425c351b4e158bf83da6a3cf7f452f9f566d3b10c6df394437fbd5a54a1f6ce22c51ae66938a9b22336b4e5bc19c95f02e8142ccc4702c636a7a525340e6ae1e3ac0a2d0f39533e02ee723ced16bf92b661b89349ec75962234bfc0edcee621943302100f9c5fc984b23faab93fa35d57f26ed5a6fe3bc011a05f43e9241bd1c4ac4ee5eb606ce5e1622807bccadcf2815d871fc234276d97320e6f4d1be06091ff7bcf901e4550d0d10669c6161acd20a2d9cc6dba4801f0b5941de172b9aa27fcab738c0cd60f93646942401c87bf669f9f9983d7592ac258f1fcf312c96a754f7e3d5e71b6c287295fd2138a421d4224b751f3101650a36f5edcd526e38f5501230f51b5af0b2732ed92c8d4c1a35500b0e1948898aad6ef92fda8bd446373b266123f6c6851e5d28935fdb929783254982b99fe15338777d780b0732445257bbcf867cf4c12452bbab8fe31576ff41e5483f493ebd3e5a089df1a4c4cff71c420897611eff1a09a80ce436c45561057ac9ec7b839b9602902b7357cf808e75a3aca10ddf9e231b6248f14ba2751e5efef61d8dbc72a05a7394f1497371d92865a56ce84cabda24592e2133731e5a1bf4eba7279dff46154dfc9b4bacdaa82b2119e5fd083612531cf9338d516ce76f11f3aa78354d7464ec8134484625d1342ab2eda6c7a2ed2a0205bc69cd2b9946e40a5c9f8420612c5c7eef79fe36f309d80049fca572c94c202b8acf6ef4683f1811d3ae7d8e4709ae3eb4b74c8bd338073abe328b6a1371411080599591bd6717af61ec62458c4946bf551bd87e6754013c36cbcac94b53019e9293f1128c40fc1ccefbedbf9b3e518a86b440d0b540872aa52d3776ce1f044a11fe28e0c53433141fbcb06b6741a0f77a3f4296123117aef33893a0f7794daef7a2ad9d1671c552812bb0f88f1bc3648c3ffc8fdc6dc81fea292c02382b0b996f0274c493031ff7850fea187e0e3e0ffbf72d3676412f76953278c061377652e0e877725801d0895df314ec58505f2414e3f9bf0142f14ecf14a63a845d6ab26567c7696835b7fac8b69469561ad0e5919cd5453034abdd07d65cbba50bf344769d790f760abbdf99f387b8d779f8b445c0a8e788501d6543169d6d2772602c3baf0c465e3f708657b4df24bc0cfa7132efff9a4c0a44da7fec349f9329faf36ca583d8933ded7baede6f2b8e07aa361c2c3b37730588b994cd388df50e1b80bbebb8178921210b2385b7d585184b77966bbbbf643e7f99e236bc3afa7b70bdf8f0e77abf6daefa4d475bf8bc5cc052e74fdb9e3526e6f96b51f9c0de18ef57eb06236bce2fb72918b60dac9978aac18a96ac54602e88d2d6e0e5116613e3cba7fcf249c62c211697b2867e186d6d1c58c8c9b89365f7bc8ff542af1559c205d242059c850c7849473c13ec4b0ab96973c9b89e492bc9be0c502644912ed50e107f5429972f974c4f807057511cf7665054dc21ed244458f43c562acd432589eedd0335a11c005dcd93b1364420f0d7b8726a19f40afd343bfb345bd93e1993a5f9462f1f2cf892acc6107f290c14d42c2de240ae3e82071f310659175b848eac45dc3e663f497495023a45e57df4d1189fd154a359be1c88c0f011da5156f8bc7e2d1bcf2a6fede56eaaab0338ec9c3c3541788a27330587bfb5a54e379b4458320263aa26fe12f241c6eefc121a50ad8c4d0f92226d95b032a38ee03761522c99ad2eca4fb99ccdac95341244f68b599a073d16754dc95f68eb223673f329a2181a95bf471bfcd4b042e58c5ea7f53c18344530233cb64ce4ce616325d440b96c91f92a734aa1b50412c6b733ab413e091ae1c0385ac654d1e2a4167c61f9dd012b20cc5eff188f10a06d3f0e818112cba5599111b832640ca4b85f758a1fd63650ac377929362f05ccd8e232c6137f55f2ff4679c117e49d5295f70f5077bcedff290856c2e37ebf75647c4b96c9561a7a382d38452fc26322cda135e3f4e2b62f53c863acfcb8b6e7ecad14e5e82e22c29dc81bb0b6c2f721325847f9db55aeeee26c086eec31b868ee675b6e4757e694c7c152e186536baa968f32d382b460429fa07e0543eb228330265bbdf3ad1469f3371e0f1dbfc11cc35741431f119b6cf56b15204db2858e0366356f3c0fc4b5a5003297a56340ef9d84616afaadd27bf27a5073046568f4ebb93ad371af23df4eb6260eb6510ee4edb411155e3b634258445f38a28cec19044f65bddf6176ea026528334ece2fd158e65c6d7318bbbd08ca18f057d0b093c01f70a937fb6be579310e264c6b2637471e1877f08a6b178d62202974f08e3869fb1390e33a17907999123cf2613eae6c234825bf03f51b4e595ae7c151169f13961df0492739a9e97f187dd63cc2ce7f8e2b0ec80a1e7f666a312f316a493608187c03f7a67eff14fc1372141f799eaf8246edf96bb7b4e6fb0e5b886623319bbb319cf99c55adf82c533d8d3df9b793ec552746091acaddf30b8636ab12d2f78d71f23afe0cffb9b87bdc2edcc2b63f0c0e3d3d8fd69bab6d5d45fbf1186961ad2e1218a59dac7019492f654a26474f70304c87dae4a43e25347af8fc291c147538c74447e729198c5c10ceeaf3ca95b0663f1dd9790f38fc187c62c9a85d480214c6b6a1a429f25a114938221b7aca0b34563e972654231127f80ee2c40cfba37f33aecbcf7998f26af7a07f4c7d7d384f341e9d1cc67f976c005efb09cd113d09452deb55f7e9850ad311d8352b84dc6f1f6cbfa3c0c6877126212624c5156a3fc4853aefae55483cb362ff0ec1fbb121dedf487ce068ad5684420f84e45bcc481186b6301b3c5f2a8e49b798c0b6926e4679ab9fe349dc3ddea3d0c8e7c1da3e5b0261941b5d5c58c1c68d2323ca557af7d495e313830e116e8f45db3d4e121b1073c1485b9a1a2ecf650080b20cc9755bf0d094e3e98c2d9a916a800f14dd1ecd9fa9644cea3f1ce65115662cd5c616c8f6f5720334617096486ab615f31d398d77d0f95009993c97279a5bbbb81805d812b445ff9d5c599bcdcb2d2a7bea13e9c5d5db45dc254c4072cd6445b20d0a768789ace911544ac61890b5ff35cf1b05af1f06f5ba47014f1e5f5ce867b630af51150ec45b5b1e68adacf7bcddf22a977761acb63bbf140a6e744a03854040bbeb62c6af9e6b4f1670c92adeae11583de62c8af9f533204ff8e5f7edfa053851d79ea536c8b279fe1c6c23a73b53522609044166d60f31b4c3c1a6f67af26f9005e6f6a1f91161ee57323c62ed9c1e0cf90cb59ea3515c9e14c14ecc7a9748985b7577f84cc064e8ff940f8935b92b8e21cb0a19cfb231acbf1d200a43f97d3d3446174d53316ffe6047bb4caac55d463bee4d2486564230247f7b811a5432954cb9617714d773586e53e110b0f500fabf512ec275ff577687a277bd806b7b4876af669bd82a1bb4f42c1092c9bc0930ee46e4d885040b4b10eaf0725fb5282631d578a0a3642d15928432b7103b3fbd54b930c5785c3c8f5be57411c55613ab5436c39e35a9738a18ce4500d2533a2c545338e719126173eef8047626c024e997dd0c47ffde79ac45bbde46a13d6150dfb6428de1d46e43d451b03ca4fc4e270ca4970ab80c2acd33735ea1cce52f4f68aba922fc4d073d91b1e4ae714a06b69348c5025aa908141e8aa5918a330eba81ffa550a57123a553a587f8d8833e838658f17ce0d30bbfa2bc4187f2994ea15dd5d28e5b495c046c1fafb5210f145d36ddf4cdbe6d26aef464f362b2ab4cba56e59b02b1b022d0b4f6e80082c0626d571cafea5b7f1d11517f7d40c24048e9930aa1c38bee537a443b7e4aa9d82acbfe79f46a039d152bfc54abcfd29d0c8c52ff9387e1611f69c835a52000d26686abb7c1c3ca4c13cedf8839c8bc7b59a82e0a9ca96bb21664a5a3ccc6bcc9292bed327a895fd03dfb143b57a6d7a925458efef2f635bd0da232db9692e62574574e9c4911091d48b99a83ad7236ed401e9f34aa8fd1d53577be88a6b1422b073d2355e106911112d2dec8dd4c140d0bbe61cb3afbad3b76dd02f54838765f676404d5c0ecf3b37c739ec9b34d705b102b485e2cfd2d820e65df9e5cadb6a153dffb280927857516b18629665253e646e489d0e6b214c83582c725cb910f2a28bfe26db7669bc750418b227ba8179e1107a8c0c87977fa0c3da1751055be573e50ad598f19d11f7eaedfd7c2c8bc216799c93a16b09e5037dd79f30710d8a50074d48185dd90f83329dc7e86e4da353164a083f5b51dd95089f1d76834d62a2cceec77a9f81d2c726e5967846d7a344dc3ed732ab8aee146b6cffcf302cdfc4aa8e66dacee1a5f45ee0c822a7c22373f3481aafcad1e1452c9ca6a657cde1c24d8bc70f43b968f159a93fa1375fb6711ca21fec66dd38535a7db70716b3c2007baca88c27ffec56f5fb4a55764835f562f1ae7acd6f5d80b2ad79a54fc6a68494306262178dc9972a0b54a05f0e4e04ee11f3cb8fb541723ee35b2553eb0c30868111123e4057c688f870fae8eeeb15031cc87ae9574575668771fc36134e16a9ae5d13baeee250c8530e31b0b5fb66db406b78784e26b0a844ae35b96036a71a08d06728ec83649f99bed4f15d2e36d0cd79f564312044f9b452711e9de982f2e51f31ee3a7102c989eeb5bf9f55775210f8d15880b9435e1f584940523330b35fa815b464f58307da3849d156350245896c00ccada4b63de32d6335b71e0746cdf90f477b2bb7069be932b90324a44b957c2919cd9be0fba1bc787d973741183f909f4f4459b5b24b05bf4b8e02d54e992edb233721145625fc5a315cb680bb57e5076c3c1c774bb676cec7eca5665491c9f4686c1de090a4f919480f74559474f3e3a90b691555b616e9adefdc367085fec316aaf9277a4a6948bcfcd0b3b2112a42e8c1cd400520b13dbacbcd408ee0673dff4ec1167bdc6de364b1c25735632bbf1a2f2f313751420a06449355f85636236a5d4b80d240b71c53e9db536e59f31de78c5aa04eda09420348ffd0605c24e174611322aecc915ad63b95212cb5686047a14d84048a2b6fac067276bf29536ff133283082ea435be24a79859f2a7ea8b1601810f16f12f5ca4c7967b5d5643327dad00682c82292a21e6e35ff5a31397ae4d7e0ce9b9eafa9d1f520ac44ee38514352844a7825e93d857ee2f0dcf6601b4ffcd10d73649c4c305ca0cd1e09a2cfda1b53f86310fd31115cb6d3545123147afa93a802c5221149b7e5e49ae9c470ee5d2507c59781af15ede13fe4806f7e703ab20c89f522fb06cd415b3b18b6379845f4f73c2b6ed368e49204f3f24cb94867644fd84ef51c8fefe172e8e683fd37a997916487bdab2411557178c81106e5f552b3b4660fd74b117713f314058d9f6b32ca25e1535c2f4506655869a6d1fd8cb732e66ee797362295f8b83f2d1fddbcb13d01675ecca6b9a42ab6d7be4762793582f405ca575ba8609650e06e64b38e11b5bdb8f44da9abd41427235e4eec5d93f029fec56d5f46659ab077fb4ed3a474837014b3b8ce9ac0c795ddc6f1b380e6d6a87fd2847469c3060215c4379eea942a9ccdfa9212de251e1ff3b780237c9286653afeb192fa6334ff044e3d6f43265c22518404e3ff84cba6d789c79ff8b1a174e80d06599ee46695499695892cb1f50febe7037ba2a7ce07b2eeec74492796197a88194e7a8508b4be6289dba8f549340609fb36b7849253d0084e2ab686318f00a23b53fbb68cf479dae4e68a5226f651bf74f394050be05b9bf719e0b5e83b6044a90c496223c771d30fa319c37a5439fbd80d6130854b327876db0f42a7a1eaf26d99467601084c4884c4f833f4a56a50c7399257878ff767e6840eb705d9f0fd34b404516a81b55be0ff2e33313de4e9ba8bf8e27efc81fe4d600a45cf93f74f753c262189822f5672858a11d4c2f46276b89d61c248f76ca6a454309033412d7402f085af086e6be41676c6212c5d99ce0e15612b5db038086a0a0523b420f06e1419a5f6a127eca9e6d12099b76d03f10983a43d00fd5b1e6b0ca167bb4434fd1bf320a5edbdc3d2510a245607c2ecc8e4e11451a66036bad620e37bc22f58f516c327aa30ac1e2c65fce7c319412d0c295967d1c86f69e01288723366054fa9dee3424cefd0b68740b796e9b03de2987271952b97372ca7694783593e5ac660ad3de429f11fd3b75d1f728009bfc01b6a1635d23b108f30de5df20b970fe023b5c0a39c39e3a4dd72bf128d49b79b948fbc25deb5a995efe64fd7580d4965860ed4b6f452740a5448c816869b62b861518aa57419941c5d10c8a457b0578741c13bb72c6f6f0fc0bf79b5e0b7c58aa41c08d68a2d292e5c2043a0d33baa9d28850b32e34634c8ad25b4d15876ac9dac0ad3a36bc3f090c34230e0ed3f45c964713583fbde330c6a16ee75b308676dd740396467a83d57c05d227563847006c0ce31947bd8ccdee2b87744c58aeddadac309a28bd8f6bcceb7a8545fff6d32e0ef2143265c44a80257a583e3255a4874220037da5fe123d822d284dededbc779dcd170bfc8f31a467ae29031ab623948b61d64db2a5867f1d54046a4596141dac03be1b9980a331a55b1d570d0b4482494dcb7093f8bc5b2b6bfa7a3a2d4f01a7455e053ba076e18e8e055d8ba31bc33edb3a710b868e596d7b4e4c92d1df17c958e40108dd2b4c502afc06ba26ad32bd84a7052b01c0b0c7e9180eafc16398cfc6525dc1c6f52624358c65b970aefb72016805f0305519a4f9de04d331f694d66968042b23d92af82c4d63dc5026e09ae621631527de36e78b234ac2e1b9640ea5a6135490be2b822986454be253c5424b626f1ab4da484855f1356575e98014203e3ef52afefc8351b63686aa7039c8537748ce09224e316da55566a47b3c19c87847e96d5112b3681f5f9e25520342f46a2fb651858937153a68b01b92c5bd221b03f565081080c4f917958e062baf62603674ffd0e3d6ab48213956c790313e0a38039f580decd2e120d36690bb1af263056cfe9b761e374d5279afd94034ba682bf00e6b57100340425227085000237967b22d34593aa82d7b66d4b4a635eb2d590d51b201f435834539c01b5b07e42023a06fbf81ef4d0d32284564acf772d041be1aca1c0786c2207578536a7c60b26f5778de093c89fa1301b1133f15810905e62a6d19a7a29f4dfefbe58e91b6a63fbd5029776f04f635e148e4aa8c7cf50b92b1af593134e905182b0b40a36c824a0ad381c557929615df5cc7a1420a3f7b100ee0bd9aff8f0dc7d0a0bc074a6e4ccc2fb560feba6323b83ac7710374b80dec9050b24c40e50a628f8b2833521d2935eb928e3f5f8654abbd75d5c700113a89aea8979a21990bea403c72b973a9651d9da6ef07464d4b16a45d09b5bbd16360394e1e044b3b135387797f9cf80e1e99240c9a58febd30040b52c1815d3e2f6ed8d1f3c2c86a69d9b9428ebfcde80e4e848f6e51c9f45d0880dcef62036a4fc6a8ee74c901e12fb9a3c19fbb2f70379730674a2c76017723430e05ecad813733d115be1484f929e911c7c76ae00c14b20cab9744a3274ba36028f58a941926f15a34e10b9a9d72d5d9bd0713dce43e6415af3725f784396b5aa84dd576c261b8eecdb950181d1670396d1e602f5e7fbb996e8a1b1efe072905b39abc15b85fe9a340fe5561714bf899c8ec8a66d864b928923b0737452a122b1daa34482c7a0e33ca43109fd51cf6457d4b19156e7022e71f6b7c83a81fea6a10807e1b7f3f3abd0542cfe48a1a5275304db4904327677233e49868086ddbea2c7baf569b26c63d85d61ab040067239bdf1b4f6d47aaf38190ce79ba75d3b8d991a48f19503d90a13f2161a424a332d725eaa17b92d4258d6178f57f22a69d76372e9da427f5b463441f5396e367b64dab92948b2232c932610e5828b3104c177c148309e0cc7ce951ee81cc70470f2baf14cfa237ac80c9d2b7c38014d7679b9aa4cce652646fcbb484ecf80493a31b6c8723e2827b8dbae93ee5fc722b7a1d7f120b7ad353fd6b431880b3f5e736b54b0c024d3070b279155bdd3ad6d74ac995110353f4b5d1e9d1259a8b902550e78db7c4d2d2e0ea8aaf91587996d6db8ffaccc4a55441100bbe767782751d39f505d3e46807acdcf7d731e5c25096a972c9691d2fb35b2515ab2acf88b268ad267be45e0da798295a1471fc79e1b48f5bb76d4ba1b061790bbeb863c3f3aad75ab67e14b192a4457f4b4fd6c285d748a6ab334f3c66506efb163e87a9f6c939e37c34c885344a9996556e4c9c503236f45d35030fb7dba18f275eea223271618d5421455de32aa390a6406d2783c29ae3f7835cb1c3d664bf6cc6921aa4cbc8c6bfd9e0817794e782917259676736ed061621d63a31e94676779f8d5da313512a85f4cab9c778ebea77a677b9e20693ad5435dfbe730dd6c74b85fa2e828d5825e98c0472e5917b3cd4e4e883906ec5f77981003f30ccebf34a8c6188339d588ca30f6cbc7478f4e901a48ed6f1f4ace1d3510e7224a5ade01287e0be64f896976eb354cd453b9d4c8b9fdf7d24683ea1f5d51667f1d5e15238dfce40c6aa371127c5bdaaa4713a8a6b681a4d32ac75e5c6e094fa25e3d6e0934833ec218ab98e2e4d0e388478e09b6c50e887e1709ae3d730b78d8047c2785ed64615806e08b1e6b46aa6d77d33232a00d0a9e1ff67dd0a3864c364a40dbc45b01f48e383a5a1c4adc1a0557652262c47b11fe1e96831e163005de15e0fb03221f68b5285849dde06880275b1fe340dba9ac4b77d44955c8fff1aa3e92c6e23b11207815a53ccaebba4641322f655630447ceb4524f930ad89858d6401cf58fe844e2026766a65807bd61f01cf6bdc29ac950349d941d7a16bf1ab45d0ab58093f7a4b24580e45749ab833472e8f4adc10467369d4a2d7c526c1917bbf20afcf7e16c255e0477f4525881b6e8be18d235831cb7538eedce152104a698336cc4597fc3a18340a43a73a47714a87693a44336d220feb24978f3ae0020f6d1637a4ab9ffa78e3590fb112dbc57fa1d99744b470620ea824a68d9a5422140d5314517f15f5259c4cd772822cde0fa1e8d0ec87b83b2179464ccf468712387b24be65f016ff751c8d1ffeb72b6e2c03b6ecb184358d54e80c343a9d3a94143a9ff65e6d781f4818b9f6eb28c5264e29e02d038b3b434e4fed821c1e3b281e07f53be7cbef417b2aca36c2d3878323e6e6627e6897a075e344ac5bfb3b66531feb0ee2fff1e639604dd2aa8dfadd2a8e5afdfb6159796296b1ca109b9c77109d1c1f416a99dd283463e2e53a0a1817997d325ec2940e7765704c4e26d59d02c5e347aa191f942837262ec53b5e9c749ab3771d6a184e080fa8ddf94d8f015d392055e2ae3dce47eda469173c2c4c3d0ec1b4735e7f9822cfb0463e03728a39278c8b1b08bac62983bf0b0e8265453af51aec8cda8eff46b878b05f830c4b5f2fa2efb0a031343888def09f7489a0686c0c49e985fe5e498bd162900966a5700b6b3d2455f5db26b1dbfb04619f2d411819ca8f5635e52d013824cecea32f11856094084b7b137631229b60f963ab135cdf871063eae540af95d972e5550a0e5416773dccc9726b2d41c078d0462664e3382aad2b3f756584ab471faa7aa479d256f21d1492b86d93e3c25a55a1ef686e758ead2b5de26c8dddc2781191164d9d47a6795309505105f7a5393b49e0298043e5b883e5ef1cbcdfb035ecf64e757386a9f154307f25f910bd0dfa751565253c2c6e439bef59eea534f0424b3959f93106cd5f5efc503df44e6c5c02e84737b4ef503520ce279650dffa656f6845b7e8eb3691b7fa3940dc314e4d83fc0f71844572a417db1901d1c9f080fd14320d18aa16cc20d00db6299bf50a7c2e1b17483d96f7866e13316ea6cd13baf91b74f7dcba11e1277e45496feeaee38a1354d088e02af5a1323cfaca4011f6473df163c14460b72053acc42d5aa7ed6b1b5ddc445186f55c6967f008f354976f4ea4620b5890a64543fece03b4deb94c62af353466c8478a4e71516211c4673b19bf2add6fae2dfe1454de5776f020fa5d701eff44d53dce2065ba64a6fa81126993ea740896bc117d362012e9ef145d6e4cbf81e26680ee7ea443f60c37a7e52dcced09db9402f32c2f7c0db52be53051a40a0d45fc0a3012fcf66553c6044621fbc0e2fef47d264e4c51ee1d725c56777447692c999f31291d1bd68b6747f2343dd1501438d1ba25e5bf924df84d84574ddcdf7f9b19875a7046e3efab4e49055eba5943ac6aaf5d72bcb725f21ccf6b60d128bbd88d30224bf6847fb5a9d032f768534c5837fb4974c20da82e53b3548987b08388fa2113ea7c8da3ef2f121c8dea2e8ac9821268338dd0646427ae62aad9f62ef94daa0d8a6762dca9585a45510ee4bbdad7740b9a19b616ca86773d32d4b337dabfea25338ab4720c693d2d9b146b1f686cbc10dfa00d7e0b911f6edb40b0e92829d430276eb5aac515b565ed1e2c10d5f5722881107d7fd7bf305e6b4597ccb9540572c0c5070649edb43616576f139bf1661a337895c659abf71862ecc1808216546619bad09bfd78716ca3b8957fafe23c5d544d00ce1534341331105ba2d4cb4c00fcf6d2aa3efde755ea026a124177c844d6e1d3cae97aaf4e111c9612e2316827946b7c47ef6de1513555e413ca22d1562860330d077ee97d4784bb5a93f9374765bd8129057fab44c224ff3f5fc318114b3fea81fd5a201583fe8e74283be42e72d386785c04a4590d78cf2c7e28dd7c94555b2d1b46bb3f236954fcf2df9301f7d13274c35f4b4ee44475858bf396592212e0d2dfb71346713a6539a65fb32de5cd35acf668b8330b0c49d6d136b32ed3fbdae0fec0223f4114fc7605ee577c6fb85f4241159c475aacc8d36d3c753a873667ab84d32e24540a11f59ad0c6079b39b9766a098f1767dd79ae08b02d7e8937fd3c550201431a7b12c8fb58532a8c30915809135a70c77f12624cdd2c5c246c949c2c754e67c8897019e4a7ec3f30a321d71fd574762473fd2aea9c6f3cb04a5a713b4902018107df6c7c8bab1f51a2cc5a4770bf50868e281f0a22d15d389ae80411d52c260319527729f17345644ebb85649a4527e20e1f163f87006e20244398ddc9c17a76a65e60c2367a76fe927ba622a93d2d20ef19df0abd997c18e3974e350c222e1035fb0af8a5ea19899618ad0b5a4c376371b9cce2a1853340da79a6cec8ac0e6f4d96ecad32347afc00a98b5a138f41699f4f593a10ee4eba2e4ad31e91e75242263dbec35f896aa733d1e2f7fad82c4c373e2e7953d47f3ce5317ee8615b731804327eaeb1fa382ab9b2073f0c564afa89e1a930ea346a06427d21d2f57d0771ba0403d3a92502cd89fb405f32bf483c7c77714204a403c7627c0fd0e3f434c3548706eea5e25dafe477b9e674ca38fe3aa2b09211b66ceafe35cadacb2c4e82d083f45447a66966e5e0d983a1165299430d0b86a5c74d9d1bf0eddaac381d47d6c8e90e2a1c461ff4e9870e700f47181ccd6942df38230935926f37934411e202dea595ff9e3d9fac136d43c0c00e2b38d4bedeceda689ea4f244bc8b7d75502896eeb04a22197e90c996cbcae037095f659097fd0f13277507f10c5a8114d261e2e4d52ea21feb45c0b1fabb622bc4bb3b5c26eddd521882c73b43300c240fb5672dacc40d37fe7b8523423ef21dd8322d511e24ed404035fd58f5dd621a52e4c0af2290d800ae035aa2730094578c1b9deffc44fa1539d9931e3d9ad31fe6952ea281bd0568f6d15ce536b4323fca55cdd940731e0d155488b603463d482a8544212d0d2948def905d518ea217c4dc373d2cbb09a3bf05a444f8fefed44d47b47c5860cda2bcef4a2a865d9ea2fa79ed5699a577c714298bd4840a42c599f9e05d70df1d6354574f62ec457de2cf8b83045281c8460e20c67cc1ca2ef0217197732dbbea4671758cf8fed22222331f08f3c83f6da28f8a2c24abd1c654a64179e9ee3493741038e0e80c2531b4fc617944545dc8a28bc8df859a5d378098fd6b6792a85c6284fa2800c2e4e35492c7ba3faa29c26651d38c726cb45293daeb338f177266240af94095da381050ac34185207673ab0db0505cf2bea05c0979425e7a1643d105e89d56c95a7bf6603dd1e90dcb49b321a1babed935907d4ef113d7e6df7f2006ec74c626e31d4d2c47bcb5ecb64f3e3071c3e52ffd54c4562007d846a4108042f2ef2157828d3e4208eb21f24569053faef88ae3650ff740391d46ebf693d0573df8f9c62ee6ad01fed8d7eecc2dee4a0398f59c9a64a81cf8e01e6547524c64bd782f3d63cc6d384a88e58d3709740bd204127176920d5e60e931b237b74554758d55baa3d351362bbde7234936541095edc9b49a422429942f21856544fe02cd3a02c55e2eaf02b3dc46b9abea142896211e49ed90b9316a2b4fd2f4d79b6e43150e7cc7e6903d6333fd410494817e444a1a866248f05ef3342e8a7d82f72441d7fcc0f890ef7b4da453de7104c902aecd173ff222d0048bb032cc67e35145726af656944d9b2dfd2fb1fd619a666fe1064b897bb3c122c22fa170150e6d775d7eac62b5a3d81a3d6e3673fd5c442518a2ae6d2fdac040a8d418c3ef0c420b63d7a51fb837da7a21993a1616cae065da6fa4ff8f0d7b02fa0db7521e11db4397e834cfe1e4986ab0d5e09a65eb3741644df6b9afc30d125233a38c57e447475db51badae651a009f34314180511c2798b72586abe0465b0bb9dfea77da3d6b16c182ef0bd8bd5372fd8ffa1232d7160629ca1442e178421273064447add10d552932f44f43090b1006738eb3edb53fa0bd0ec51524dd7c7f7ea9df6cc890529809741891107057fbfd77783b1f300db68a1bf958d3c83561db4205f1fd7e71b2493fed64aa4760aaf4c9088a794d56d0b8860169d86a7770ea39b495c6a41cfd32e37b8b2c900c1fcfc4e9c4d50d0f7fae615c039a9a0573b5d491cbd8067815f2e2d392a4af37f6de2d22eb89d16522d6cbbcd7ffdf68331711befede270829c32b2e0cc68224a26699da9387e6151d90910af2b55f132db5f9564a91c918b625f8275ea3585cad58a2c16745044503d9257090cd0421dec1ffa832d32633cf4d6f477ff18c401611a165ec62537346c1a7dc48c5577c2a19051fa2018f27cd916e4b4ab33b0c666587a16e6a0e40167262712c4aea6ba5eb1d65ec6c9d158179985bf4082806dc63faa0c7673c1260a9e2ce6c80d94f6b11023bd75b415de85572d6b584193acad82180975eff2474f2263864b41927f136b580178d817f239cb972f4665d1ac31d03945e58b736eed94f367e863d6391653713c665ad3da95e5ccbe88de725b1bf8bb84e7a37667e7e913e3d4a005625e3fca5618f1e5d6fc63cbdb4831e7cc175e73d11f6b20c9d9e9547d36f000c175c0d1e67484430354d66031afd9b255847d460ecf60722644a0e23161b2769473cc42943f03365f61b65d7c717411329c3b702baf10f34e68f8c9cc4975f535049d3c71e796513737f08adb748134cf80405ad9bda5138b406f02c8230d55e45edd9ef14f6cd5dd83571c4169d826284bf6b3662f21175086483da956e6a4357550e5bdefc9e01c957299a9773de5277ac4fbd64f43f51dd63f8797aa8f3455f4b913f70d87b78226affb91cab0c6b7bceaebd42d75862e9438185fbda7971b590c5b41e601e4f29c89cf9f4853431a873015306c9fc37a3f3552d57f67d04e470048be5584d1950a16b86c4a1926f884d227826da947e8efd5811b54ca71eb95fe97c7e56b400c01b02645e7673029f1a4a5ae70ad509dd85fee7003b64624889cc64b716f12102233841ddf9dd04715a739b024c373bcc0ca7fbaa63ff037f651cd5aa0e4b4af494a63c2e6cd41d + _Keys: 19fa7c8b7a3a004fc497f181b6e026078db49f8d499d21408923e4a607ce3a595981be3ba9ff4c769b8f130ebe47887ebdfb98ebe5da7049210e18f42f147d60c6bf413c35ce7d12db1f64f3ada3bb2d821326d7a7c363136666d31a094491222bbde8f495825a4e2f05ece33b3881253ca117543370bf2531ac8ebf10b7f565a03ac9712b88ca58c516c5a7b6d8f161d9edf2f0d7536a18cb29cd07833a5a3b4c7ae726cc17482e559c16f3c9b08b330df8ea680ec3b112fb2cdae8148f027d060f5dc0ccc4743d6cbda2a2ea985b33ceaaec1a66c03614f318fcbd24a42f1ad60e54113f577a421594d13a0cca1e4dea74ef6b3011a507d84e972e95f1f208c29e6ca1845b5768a29ea858678d9a45dd71c72675172669d2216f05e07a6318526a8851fe85233ecdfeb27a2a54c77acf2f0622887385307cc810cd2b8a733f308aa04e356c1a4343b0f897872b4935cad6208970be4d2cf27d077b2c4e3454a429a74d0d848d0856374bba5b830d5a1c80b06ff717be50822ffba2e9a7ff4587ac62212c429608d6f7162a2a64072a2505286ef155af18b8b137cc9492aa430bb82f7606ef4e587d4feeec0bdb7915a98a7574396c8e2e8332e567485d85710a55a2690825a356de044dd24122aa16cb6700080dae1c5afbe2a59418fd3111573d9dc4051c54111fafcd938f2c107505edfb00aa3545750cacd20fd3d118628f24eada7da532296de43a2f1ab3ec2f40174152c0174e5ed6d08c86c931ea726390e0507706ff52bcaf0ecfc98bbb39566936366fb9b255a7ae89207f8b652d88310d54f616106692fde55d0708af69fa88a9abd063e55043de1680da2a9e6d579975acc6cca75b961aacfcfe5ee932d224e50c4b614d14bba7a043638e92631518771690e1bb19dced44e075745b028dafe7e182ac1c0bae65ba3d601c0940232d20cceb1df107aed62a36f989553501753abb270b44324d7d8ea6c2b2ca297f8214402bb6de62c8eb8e3d9b0f7256185d35a921a8142098b19bdc42367948b6e493aae93bbb6f41153dc39aaa1c28d34255148ed5933b025933dea2cd7425bcb047a020454d5b0b9ab1a5634bdd403229c26b55bebe32908e9848d620fa19a0ac538a933d5645ebcc055ad1400e0de2b71574be99675bf8a3102955feb74a2c3eb04c15e369386f97b630278db035378baf0c5df0c2488deaeb8cd4eec223eb87c2ea2f74c059586242d7d03b030c5a9ee69cec23c44b4e60051edd993b7bc5600352a5affe328d95cb10d3df8656e07cba3b9865c358a438613ce775213415ed87a215153e001a10e4ef5c6f3042f4c3e5cd2819166d6112b9f17f5bdc220857778404d76103118557b8a822ec2db3cc3b0938e3500b561e72b38fd7ae010c88f1098dba07392870ac4269fb7604ae4a6e96bb747f19d5bc4403fc346500d5432183fe0a3d37333e0b5c95650540fe330a555345654cb222f721919fdb76454a0a5cd01af12cb7ea06efd972453a5bbfe973432468198e568f78da72731205a296ce63ceff4027fefc7d6914ba336fc2c1a196537425df9e0c581f69b2087fb5d4317015c46f3f1e5c5bdeba5d2df359a2a30854191da2335d6bcfa490744d574d55512d623419a9a46cb8d49f27bf55d4d839d10618a0f1cca64d60c95de66211e085c9c552c53a96f52a47e2097c7d27a25cc7c274f36e41d3df3e7d29069a951142fc403e37bc06852bca9c66ce277d3175e7cb6713cfd85bb1677d2fc509294ae69049262e00dc7882c7ba04550510a9164da141cca3d4dc2d14ea6ea5bc7c61339be514a16a1771cff40969d4dc573e3c894702705927a4eb212c63501ef637e2eeb1659e52653be5bb871dc8f266b125e31d2ee5aa499d965dc71b12391593bc9a30575008e3b4e09458718416d70ae562427d168be888de916169ad4f4ba01109527ee4e6e6a61d506675d74849db0d1bb064ed95c89ebf4fc70b843bb211345bc43b4b385f641da77957fcf2e794bffc0d74532d0e1d0cdc261dd77f87b144cb2901579148e75640d90c451ccf2c5994d52ec0e48b27b6757d3674c4468ee18fc367efe63abcb28f3e5430de2672b5b1567fcc183a16e01fdb4e8427fa5248fdda7745bd1bf9af30a24f6f760e1d8a8d2e169cf46b8ba7516b16ed2e96b5bbb6e20eeb540f7f4be5844b79e7ee151671a373a4e26d58e142691f576b98633aaa8921a5ddbe04814bd97a61c4cec06828ec5598b5a5688fe724522d9a4a7d9611d651d36249674d03845f0c6272c125d7806fe2bb353081161d28c122f29acc03601a51f08a4016e1082f30fcd93d5728ea47b79ca0e2b6cfb242a9d65f214d9d8402fab5b34eae36c45bd0330fbeb978ee2fcf2a0fcb24f222621fa9ab7d0dce725d9ded17f76d9f671ad6c06605d0efbf3940a506dad2e62f21bcf924dbc733497d038a08ad7f6666006a66281ce82d2f6619f66f6d35134e18a31cc8ad1ac7b966cf550a7f3749f10c0e64801184e106752a681216ffa3837967cd366983232521642549cf9088373ba9d2726c53c7843229cf12c86a8436660b9a28c0e4238a4c7ac4f0e2446c5178d6b4a90102e51465b132d9ec6c3ec954f282992fe09c9f2a6d7eea356c2d4766a7c4e03aa5e334559752fc7c47b5d52b06e06eab61a6d10e4f7483a3a0ebff69f6c0358c0bda930f4d7cc274d62caa67c537732b4a1ce41e4e79870e9eaba95cdaf4fd482fda400b1dd3bc5c8f8419633140f88e2c72327c9afae1cbeb46af06ac297cdb123537326592c57c95cb2c5c853ad052230733029b09f8776f245772a3ca0276dcc8b833ca146a1411560f76a926a9289a1bf169092fa58ddf9c3a7517c82635364a7f4df403890f9d1ef144fb812196cd7f0c77286780f491baec2ca6f61b9da400071600beb18fe2b7e76e86d5d0c1605cee62a2681f2dbdd87b071d79c190e8d373290a985bebf6d6a810a8113e79c5a1a532eec366e53a852b5d6e466fed752cfb7897a7bf6f1b653f6d0c571f4e8127805ec3515736dfa68f07ba29f321139f0d5a44ca68c07e191e316809447bd2cc041c05186bfcf1e65731b726cef277b7a02e29b17188403b8622365139bf2fc071347e1dfbee809a1671c43e2f82acbcd800b78df10f42a4017c8a9dcae15d1d2c62fff026423332e57357fd8ac87b1d9952a64ba6e19ca69e24acf1a805a8b07076b2f15811115bf70962f3f016365a2b20b01b6f5693eb1d01ec4babb2d341af68b923a2b5bf5a3f577bfae382678d6e455f423bce6076d56121e00caac4b88c2cc83b11cc7422a66cf74d106b78d3cd635aa4d5c6ce0a81623dbb7e5b896e826999417fddbe2caa248eba28bda822986bc1a561f21387762d2def8c67a4f06e2bc76e0cb0d75f9409074dc689b94fcb3f83cf281fd236e5297dcb083a94c883282de7fcf721e5e73b505595e4f7120861c01328054c9b302af4022af362109e2f2bef44313d81ec1a39de7736f3892f04d9f6479188c48f2cd00d4fa9d9c99a72d4516d76698e182e2abdda6dc8354025c623782b35791639d9b3d6a7a4a251738016b3a41242a73e716a0b132fe4277ef01d45592e93a97c88b5ccc634dda046cd046c4031e66938e3bac7e8e2834609651b747a894e2067a554335438e44327f1cde6ed0971e14a83c7852308adbe3ed656ef8a3a32d12f111d50acd2e01727d13d91114c1fc636e65f0ee602b9d47fb09db1bce5ee0a0037e7d0ee86e42c0594d428359a07b5400093c0f470edd76c5c69ab821abdbe49752385bf4695c3063fc69ddc8e9305462bcd6bccd4d0d55ba8110ae281cdba388e7dda89469779443d5decb893f8ef4b57c39fcb0af7421ed256e985ffc3c54695167ccd2c878e567135e0f7dda3ff6a97dca81f440971457a5478000a8b6376e1d8360c581b142d9608e7a1456bfa07564a0d94d4a7b01976a0d20c469d880ac65d0dea36916d6c9048b555461adb44f08c58c4a390ef5f95c81e74014cd75e59579ae6381f0b32a134bf8204e4ed2a3587910b5c8b361874e22ba04c32db059abd3cfef63523236f60c0820b69a9681af4bf491b069c3f5b7650edaecae8503862d4b8df032e396fa51cfe8a26f82ac953246344f2490055701c155611592b394b9a3c1ee2f55a1bf1f247ccd2d26907fbff1c2bdc80674ad889b2a6521d6e8770a5d5a1229266b75b7f2034190274c65840a4d302386b6bef9ff2fdcf4149731a6c98de17942073ba9d5fee78c30e5fa2c9a03e68ea0f36204474695ee17c4bff0675b00ed30ed406d360c39fe63b929d3615656a0a7bbc9bffa1e8fa965dea7e69180454e330dca220b7df4ecc352b1196c41eb28f0fb8cfbd62bc27462b9e145567c25c1264b234edf3be1e113122b8fe0f916a78044273957140d5010ea7ddc4fa9baa221fb56a55f91470e032c3ed7b7ac540e3304aa888e7b67a23199892ea67d8a8886e3c1377a78f0b3b603c0fdb93fa5c2e4a7d24561caa96003a473b91a75a470a6a98d8a779cf888976dfb7c7ef7a257b79309bde95c7ed4c3e31f237a3cd6f326f0a0bcfdefe65af544078f6f57d7bd96bb14684e8d850aa19c651a98b6a058644e66f933b98d3f00b2986bcc9080f6c13622ba77a1bc4cc0bcdd33418335b655093c331b81c194e667a0d386610db497d85bc8c077879970f0f788481ef1da14bf438ddcf86935441de988d54da39ba18e886f1c49546fc655bb9abaac6878c5c94128d280185080d674ae51107ece948329c69750e65e03b339ae27b70de8910f4c85e45f9d5f44230b5c90e524e0b3bb3cbf2f392c067444ffa037bccaf833cc7382a1dcc2e985810164f89baa0c11e6db27652245a744ccf5d09012d86897f338cd68b7928087ba8909556fccaca71c2da8aeb7d87841910cf4ee764334c58a6fa99d2b4b6af48ef5d3562f701db50a0ec4a79453ac06f8ef5d3174c1eba739bab7b57cc374f33e8b0b4bff010953f3aa8bd48d085bc6c8f107a773d9bd8085ae78680199d8806d542fb322c3bd701c5f052438afb772099171a234e388e4c2754e52869eaa729cf3be1ed7e1066351884c3d112e46d5e6f651930b7ab540e30b7f427a95067244828744e1a89a15782afc42d049fa043e686b803d1777123e6d31c36058ddf69c4c1ae08e7270a3159380d2f096af52e49ae98b99394ae0b30a5bee3e9482c38bf2dc0f03696c440ddb7321eb7fe79589046c8721a11e50ff42a8e2455fb084deb57827e23eba63fe7ea3e5f84b41043a71961f0ce5126253061b78e7fb1fe1dafe4090f80f77b5b5f77a5faafbb6b40194bcb6f5cf81c67325c4fc13417bf66e95cafa0ab01c2616a42b0ba08de2b15cef7a8ca7d6d7a48c7a140dd473d9076360c11520bcb94177895fbe6b89da010779b0bc3910b1657d6f8d809c1e51a2db23983fccdd809677340ac188e6c6f65425065ac31cde52b0b4684ec0d74a95cb12999f1219ddd6091a34f505efdc96a778c388f7f92041aada8f9eca2098a1717f73748fa9f7920d239e571826b330710ef76803c19dc1d267e4578a3f1bd652d666756341165281418be46ac9298418b0e234c6df62403e5e6dd84a5ff83207c7f9fe8d2893c21ab6192dca5698e6d19fcfb4debf52d37bf9b8fb2cb1f7d12632035d30c5091144a44a00b64485e7c9af1e14ba87bef3415472d17ecda1c792f3ee5210169112a5ced08811d51173c1498e218ad38044208bf98efeaffb24e78d513294d197913de9bc755f4a5f472c8f3b22122d48522ee53a4587019624112c65ca895c75274e17d8ff9a085bb5a84f72e7aec45f709d4439108b966e8286445e5c71c857105ab9d738398585c3b235fc67b358fcb4e3e5b38030c80505f8c1b790f545aaf2aded7ea8238e50f2c6133d4e7d39ca10cefcc763eb292062b112c088221b218375064a6f285b279584b0b643f553733108693df771b8e887022ea8ff32272f4137463f8873648d502070803712d5ee33e24caeb90be938541ff778b61706a531b2580bce919456724969712e6917d191213cd0aa46f1fe61b4948bd6ed2e296715c1f97ad1bcd5769330f2656a56bd27e5e798a6a7fcbc427626e326103d6f7794f8f66ffde477605ce555d9b4c48970269e3194a2ddb4b47bb613d1980af006e089f8329ad8393699374d2626a4f9303736893d3d7b9a515c1c36dc4f81cd00dac6395520e1a3741c3fe060f90aeac4987b19c151667416f40f7684def3ef65fc13512f827c6c3729fd495d6c0b4a5702326930582843000ef2ab5ebfc172f7451f7dc38f44ca559a53229fecc411024d172884e43310665b3bb8c884c83232cebd3bac9267ae62c0ca800cede208b30eb46b749d8a58c07352bcb74a20bd94ba96abb70518f6b7974f4ce53ff24fd05a7b33453fabfba69778d3425444cbb785fad79abfb90fb7a27903a0b07b9a46e639b074285f15957b56455eba24a932df6e6af1de16fed2d08907c2b0ffebc3d91e4d3616cc5e57e068a30d4ca1f8f4dd6899052f7f44a01adb6a64188ce3e684fecc49a919d5d1f913a3f667a40ea6299d2f8f8b46bb74c636f7e7e392f295b7b0e972a710d11084a917cb3e0d4635c64a0c24c961d3d7dfe38077daee2e43420cc9b0651a2dc31d1ebc4188b4cb1268a12b2f554ce9500eaa57737e24bd950156c11dd818e75022a8e9ab75fa21a596646a776e2dd613a4f2e8a3b57e3697465666ad918140b761d05cd1280c357590e579e14898dcd4fd0ba74453c4ad26948e6a6d7e4914a3b87acd350e64fa645f0361788a129f93f4d80847622460d718e44af390f09c167649684afb7e531381087a00e5ac9367d20fc133249add740a062c3a29f6c351c41bbf0aade71675dae7b56c1aa440b2ea16b6129923d941fe9be9f084b3a9479024144bbc135ba3fb4c3492055d86e52e98bad405a84f6148c3b7122ad2a231fc58fce6fca7e1953531255ff144f6a536ebdcff41324d423d6c8e863663b3136bf1d32b2090ac57fa5e63df301fdbb7aa86547c714c35042a23df12748362346a2af44b8156a72765608158d8cfd312387e09cb019d65c68cb6f1efaefb50e0dbbd7c659ed7b8a0360e41da91826af4f35de0077eeab2966d89a0daa850e790c2f4ff0466d5a45210623d8f69ddf0754ae6031888835886e5e29b6c7b7f308009da3c217da7df956b7a2a21ac263493b123a1ea71ade021dd042c7772fb63c7ab09d30cddad64d6ef2a5255e2b0e32065beb55aa1d3f5b6bd1232b799bc9610614502f07a1d6253d6cd3e4e2ec92b870132d7d0feea64635eebab31fb028e06cd71f0753e63e8923ce681e206d4ef36047017b60621737084865176dc4cf85799acd84581be2876b43e48d5ec21afa3560e40856f944352515c42d58377d100bcc33c15c77f25205e4babd3577630b3ed440168219f64f424619fc1c6ed4f63cbfde62934955223ac9a61eba5969004fb9ee2c789492242a403da17752cd257e7443f8358ee800094d68634b3d25ad43c2cdf560a7e12421646f6dc5641d077c9ef2d76cedfef1586b5456923870ea2450ae18c8858c6c08b028f297d8dcc13793a408bfc606a2618009ba1fd68ee62a599175b6053ff61d5a21f74885d21f3480cc869fc554f57bc95f7102847b6138bd380e95ad88c353677fc89f1496a07b5aada0e318c3c473129cb7d3ffca2160467a8250f525b5387d1d3868c382d80ae90b1981dd745c46ab7d976a28063c76f2c0767ddb6dba55fd649e9ba661cb2c3aa6c78588bcf956d6d27a6970de5f3467952322c5df5b0169cbf2625097344a5dcab9b453163936788019aad29804233d2d5cdc06bd407019532672818bc63d8d7ac4e8e618477a44620013b013f65902491f2f632edf78910e074f42b08742d02fc6fc085fa95fb495675b43d2402af8c75519d8cf4c116620addb941af0402240939facb6b80d5bb9b078eba1e25d9fd8eca9bc4571413d2b93a137c6c24d0388c73f926d054a6c9e8c6e7f3b03478abd53ea3f23a95b209c5d9296adc737f70d848c97dd1009046820267c915b6bbb8c6a7831398126798f07fdeed08e3325545ba7282e594331a21057bc30274e91be04fbd763fe1f8c5e5a747ee13f6c86ddfcd1f6e82b4b6bd2468e282969014c345e794d13ed33767c9f03f14739566925554f5f218e6271da857b3c542541e747b7479dacc820cceff4fd96cccc1d5543f00a5e6f4c0d57638c02646c1535a3e0eb38ff80f3425c351b4e158bf83da6a3cf7f452f9f566d3b10c6df394437fbd5a54a1f6ce22c51ae66938a9b22336b4e5bc19c95f02e8142ccc4702c636a7a525340e6ae1e3ac0a2d0f39533e02ee723ced16bf92b661b89349ec75962234bfc0edcee621943302100f9c5fc984b23faab93fa35d57f26ed5a6fe3bc011a05f43e9241bd1c4ac4ee5eb606ce5e1622807bccadcf2815d871fc234276d97320e6f4d1be06091ff7bcf901e4550d0d10669c6161acd20a2d9cc6dba4801f0b5941de172b9aa27fcab738c0cd60f93646942401c87bf669f9f9983d7592ac258f1fcf312c96a754f7e3d5e71b6c287295fd2138a421d4224b751f3101650a36f5edcd526e38f5501230f51b5af0b2732ed92c8d4c1a35500b0e1948898aad6ef92fda8bd446373b266123f6c6851e5d28935fdb929783254982b99fe15338777d780b0732445257bbcf867cf4c12452bbab8fe31576ff41e5483f493ebd3e5a089df1a4c4cff71c420897611eff1a09a80ce436c45561057ac9ec7b839b9602902b7357cf808e75a3aca10ddf9e231b6248f14ba2751e5efef61d8dbc72a05a7394f1497371d92865a56ce84cabda24592e2133731e5a1bf4eba7279dff46154dfc9b4bacdaa82b2119e5fd083612531cf9338d516ce76f11f3aa78354d7464ec8134484625d1342ab2eda6c7a2ed2a0205bc69cd2b9946e40a5c9f8420612c5c7eef79fe36f309d80049fca572c94c202b8acf6ef4683f1811d3ae7d8e4709ae3eb4b74c8bd338073abe328b6a1371411080599591bd6717af61ec62458c4946bf551bd87e6754013c36cbcac94b53019e9293f1128c40fc1ccefbedbf9b3e518a86b440d0b540872aa52d3776ce1f044a11fe28e0c53433141fbcb06b6741a0f77a3f4296123117aef33893a0f7794daef7a2ad9d1671c552812bb0f88f1bc3648c3ffc8fdc6dc81fea292c02382b0b996f0274c493031ff7850fea187e0e3e0ffbf72d3676412f76953278c061377652e0e877725801d0895df314ec58505f2414e3f9bf0142f14ecf14a63a845d6ab26567c7696835b7fac8b69469561ad0e5919cd5453034abdd07d65cbba50bf344769d790f760abbdf99f387b8d779f8b445c0a8e788501d6543169d6d2772602c3baf0c465e3f708657b4df24bc0cfa7132efff9a4c0a44da7fec349f9329faf36ca583d8933ded7baede6f2b8e07aa361c2c3b37730588b994cd388df50e1b80bbebb8178921210b2385b7d585184b77966bbbbf643e7f99e236bc3afa7b70bdf8f0e77abf6daefa4d475bf8bc5cc052e74fdb9e3526e6f96b51f9c0de18ef57eb06236bce2fb72918b60dac9978aac18a96ac54602e88d2d6e0e5116613e3cba7fcf249c62c211697b2867e186d6d1c58c8c9b89365f7bc8ff542af1559c205d242059c850c7849473c13ec4b0ab96973c9b89e492bc9be0c502644912ed50e107f5429972f974c4f807057511cf7665054dc21ed244458f43c562acd432589eedd0335a11c005dcd93b1364420f0d7b8726a19f40afd343bfb345bd93e1993a5f9462f1f2cf892acc6107f290c14d42c2de240ae3e82071f310659175b848eac45dc3e663f497495023a45e57df4d1189fd154a359be1c88c0f011da5156f8bc7e2d1bcf2a6fede56eaaab0338ec9c3c3541788a27330587bfb5a54e379b4458320263aa26fe12f241c6eefc121a50ad8c4d0f92226d95b032a38ee03761522c99ad2eca4fb99ccdac95341244f68b599a073d16754dc95f68eb223673f329a2181a95bf471bfcd4b042e58c5ea7f53c18344530233cb64ce4ce616325d440b96c91f92a734aa1b50412c6b733ab413e091ae1c0385ac654d1e2a4167c61f9dd012b20cc5eff188f10a06d3f0e818112cba5599111b832640ca4b85f758a1fd63650ac377929362f05ccd8e232c6137f55f2ff4679c117e49d5295f70f5077bcedff290856c2e37ebf75647c4b96c9561a7a382d38452fc26322cda135e3f4e2b62f53c863acfcb8b6e7ecad14e5e82e22c29dc81bb0b6c2f721325847f9db55aeeee26c086eec31b868ee675b6e4757e694c7c152e186536baa968f32d382b460429fa07e0543eb228330265bbdf3ad1469f3371e0f1dbfc11cc35741431f119b6cf56b15204db2858e0366356f3c0fc4b5a5003297a56340ef9d84616afaadd27bf27a5073046568f4ebb93ad371af23df4eb6260eb6510ee4edb411155e3b634258445f38a28cec19044f65bddf6176ea026528334ece2fd158e65c6d7318bbbd08ca18f057d0b093c01f70a937fb6be579310e264c6b2637471e1877f08a6b178d62202974f08e3869fb1390e33a17907999123cf2613eae6c234825bf03f51b4e595ae7c151169f13961df0492739a9e97f187dd63cc2ce7f8e2b0ec80a1e7f666a312f316a493608187c03f7a67eff14fc1372141f799eaf8246edf96bb7b4e6fb0e5b886623319bbb319cf99c55adf82c533d8d3df9b793ec552746091acaddf30b8636ab12d2f78d71f23afe0cffb9b87bdc2edcc2b63f0c0e3d3d8fd69bab6d5d45fbf1186961ad2e1218a59dac7019492f654a26474f70304c87dae4a43e25347af8fc291c147538c74447e729198c5c10ceeaf3ca95b0663f1dd9790f38fc187c62c9a85d480214c6b6a1a429f25a114938221b7aca0b34563e972654231127f80ee2c40cfba37f33aecbcf7998f26af7a07f4c7d7d384f341e9d1cc67f976c005efb09cd113d09452deb55f7e9850ad311d8352b84dc6f1f6cbfa3c0c6877126212624c5156a3fc4853aefae55483cb362ff0ec1fbb121dedf487ce068ad5684420f84e45bcc481186b6301b3c5f2a8e49b798c0b6926e4679ab9fe349dc3ddea3d0c8e7c1da3e5b0261941b5d5c58c1c68d2323ca557af7d495e313830e116e8f45db3d4e121b1073c1485b9a1a2ecf650080b20cc9755bf0d094e3e98c2d9a916a800f14dd1ecd9fa9644cea3f1ce65115662cd5c616c8f6f5720334617096486ab615f31d398d77d0f95009993c97279a5bbbb81805d812b445ff9d5c599bcdcb2d2a7bea13e9c5d5db45dc254c4072cd6445b20d0a768789ace911544ac61890b5ff35cf1b05af1f06f5ba47014f1e5f5ce867b630af51150ec45b5b1e68adacf7bcddf22a977761acb63bbf140a6e744a03854040bbeb62c6af9e6b4f1670c92adeae11583de62c8af9f533204ff8e5f7edfa053851d79ea536c8b279fe1c6c23a73b53522609044166d60f31b4c3c1a6f67af26f9005e6f6a1f91161ee57323c62ed9c1e0cf90cb59ea3515c9e14c14ecc7a9748985b7577f84cc064e8ff940f8935b92b8e21cb0a19cfb231acbf1d200a43f97d3d3446174d53316ffe6047bb4caac55d463bee4d2486564230247f7b811a5432954cb9617714d773586e53e110b0f500fabf512ec275ff577687a277bd806b7b4876af669bd82a1bb4f42c1092c9bc0930ee46e4d885040b4b10eaf0725fb5282631d578a0a3642d15928432b7103b3fbd54b930c5785c3c8f5be57411c55613ab5436c39e35a9738a18ce4500d2533a2c545338e719126173eef8047626c024e997dd0c47ffde79ac45bbde46a13d6150dfb6428de1d46e43d451b03ca4fc4e270ca4970ab80c2acd33735ea1cce52f4f68aba922fc4d073d91b1e4ae714a06b69348c5025aa908141e8aa5918a330eba81ffa550a57123a553a587f8d8833e838658f17ce0d30bbfa2bc4187f2994ea15dd5d28e5b495c046c1fafb5210f145d36ddf4cdbe6d26aef464f362b2ab4cba56e59b02b1b022d0b4f6e80082c0626d571cafea5b7f1d11517f7d40c24048e9930aa1c38bee537a443b7e4aa9d82acbfe79f46a039d152bfc54abcfd29d0c8c52ff9387e1611f69c835a52000d26686abb7c1c3ca4c13cedf8839c8bc7b59a82e0a9ca96bb21664a5a3ccc6bcc9292bed327a895fd03dfb143b57a6d7a925458efef2f635bd0da232db9692e62574574e9c4911091d48b99a83ad7236ed401e9f34aa8fd1d53577be88a6b1422b073d2355e106911112d2dec8dd4c140d0bbe61cb3afbad3b76dd02f54838765f676404d5c0ecf3b37c739ec9b34d705b102b485e2cfd2d820e65df9e5cadb6a153dffb280927857516b18629665253e646e489d0e6b214c83582c725cb910f2a28bfe26db7669bc750418b227ba8179e1107a8c0c87977fa0c3da1751055be573e50ad598f19d11f7eaedfd7c2c8bc216799c93a16b09e5037dd79f30710d8a50074d48185dd90f83329dc7e86e4da353164a083f5b51dd95089f1d76834d62a2cceec77a9f81d2c726e5967846d7a344dc3ed732ab8aee146b6cffcf302cdfc4aa8e66dacee1a5f45ee0c822a7c22373f3481aafcad1e1452c9ca6a657cde1c24d8bc70f43b968f159a93fa1375fb6711ca21fec66dd38535a7db70716b3c2007baca88c27ffec56f5fb4a55764835f562f1ae7acd6f5d80b2ad79a54fc6a68494306262178dc9972a0b54a05f0e4e04ee11f3cb8fb541723ee35b2553eb0c30868111123e4057c688f870fae8eeeb15031cc87ae9574575668771fc36134e16a9ae5d13baeee250c8530e31b0b5fb66db406b78784e26b0a844ae35b96036a71a08d06728ec83649f99bed4f15d2e36d0cd79f564312044f9b452711e9de982f2e51f31ee3a7102c989eeb5bf9f55775210f8d15880b9435e1f584940523330b35fa815b464f58307da3849d156350245896c00ccada4b63de32d6335b71e0746cdf90f477b2bb7069be932b90324a44b957c2919cd9be0fba1bc787d973741183f909f4f4459b5b24b05bf4b8e02d54e992edb233721145625fc5a315cb680bb57e5076c3c1c774bb676cec7eca5665491c9f4686c1de090a4f919480f74559474f3e3a90b691555b616e9adefdc367085fec316aaf9277a4a6948bcfcd0b3b2112a42e8c1cd400520b13dbacbcd408ee0673dff4ec1167bdc6de364b1c25735632bbf1a2f2f313751420a06449355f85636236a5d4b80d240b71c53e9db536e59f31de78c5aa04eda09420348ffd0605c24e174611322aecc915ad63b95212cb5686047a14d84048a2b6fac067276bf29536ff133283082ea435be24a79859f2a7ea8b1601810f16f12f5ca4c7967b5d5643327dad00682c82292a21e6e35ff5a31397ae4d7e0ce9b9eafa9d1f520ac44ee38514352844a7825e93d857ee2f0dcf6601b4ffcd10d73649c4c305ca0cd1e09a2cfda1b53f86310fd31115cb6d3545123147afa93a802c5221149b7e5e49ae9c470ee5d2507c59781af15ede13fe4806f7e703ab20c89f522fb06cd415b3b18b6379845f4f73c2b6ed368e49204f3f24cb94867644fd84ef51c8fefe172e8e683fd37a997916487bdab2411557178c81106e5f552b3b4660fd74b117713f314058d9f6b32ca25e1535c2f4506655869a6d1fd8cb732e66ee797362295f8b83f2d1fddbcb13d01675ecca6b9a42ab6d7be4762793582f405ca575ba8609650e06e64b38e11b5bdb8f44da9abd41427235e4eec5d93f029fec56d5f46659ab077fb4ed3a474837014b3b8ce9ac0c795ddc6f1b380e6d6a87fd2847469c3060215c4379eea942a9ccdfa9212de251e1ff3b780237c9286653afeb192fa6334ff044e3d6f43265c22518404e3ff84cba6d789c79ff8b1a174e80d06599ee46695499695892cb1f50febe7037ba2a7ce07b2eeec74492796197a88194e7a8508b4be6289dba8f549340609fb36b7849253d0084e2ab686318f00a23b53fbb68cf479dae4e68a5226f651bf74f394050be05b9bf719e0b5e83b6044a90c496223c771d30fa319c37a5439fbd80d6130854b327876db0f42a7a1eaf26d99467601084c4884c4f833f4a56a50c7399257878ff767e6840eb705d9f0fd34b404516a81b55be0ff2e33313de4e9ba8bf8e27efc81fe4d600a45cf93f74f753c262189822f5672858a11d4c2f46276b89d61c248f76ca6a454309033412d7402f085af086e6be41676c6212c5d99ce0e15612b5db038086a0a0523b420f06e1419a5f6a127eca9e6d12099b76d03f10983a43d00fd5b1e6b0ca167bb4434fd1bf320a5edbdc3d2510a245607c2ecc8e4e11451a66036bad620e37bc22f58f516c327aa30ac1e2c65fce7c319412d0c295967d1c86f69e01288723366054fa9dee3424cefd0b68740b796e9b03de2987271952b97372ca7694783593e5ac660ad3de429f11fd3b75d1f728009bfc01b6a1635d23b108f30de5df20b970fe023b5c0a39c39e3a4dd72bf128d49b79b948fbc25deb5a995efe64fd7580d4965860ed4b6f452740a5448c816869b62b861518aa57419941c5d10c8a457b0578741c13bb72c6f6f0fc0bf79b5e0b7c58aa41c08d68a2d292e5c2043a0d33baa9d28850b32e34634c8ad25b4d15876ac9dac0ad3a36bc3f090c34230e0ed3f45c964713583fbde330c6a16ee75b308676dd740396467a83d57c05d227563847006c0ce31947bd8ccdee2b87744c58aeddadac309a28bd8f6bcceb7a8545fff6d32e0ef2143265c44a80257a583e3255a4874220037da5fe123d822d284dededbc779dcd170bfc8f31a467ae29031ab623948b61d64db2a5867f1d54046a4596141dac03be1b9980a331a55b1d570d0b4482494dcb7093f8bc5b2b6bfa7a3a2d4f01a7455e053ba076e18e8e055d8ba31bc33edb3a710b868e596d7b4e4c92d1df17c958e40108dd2b4c502afc06ba26ad32bd84a7052b01c0b0c7e9180eafc16398cfc6525dc1c6f52624358c65b970aefb72016805f0305519a4f9de04d331f694d66968042b23d92af82c4d63dc5026e09ae621631527de36e78b234ac2e1b9640ea5a6135490be2b822986454be253c5424b626f1ab4da484855f1356575e98014203e3ef52afefc8351b63686aa7039c8537748ce09224e316da55566a47b3c19c87847e96d5112b3681f5f9e25520342f46a2fb651858937153a68b01b92c5bd221b03f565081080c4f917958e062baf62603674ffd0e3d6ab48213956c790313e0a38039f580decd2e120d36690bb1af263056cfe9b761e374d5279afd94034ba682bf00e6b57100340425227085000237967b22d34593aa82d7b66d4b4a635eb2d590d51b201f435834539c01b5b07e42023a06fbf81ef4d0d32284564acf772d041be1aca1c0786c2207578536a7c60b26f5778de093c89fa1301b1133f15810905e62a6d19a7a29f4dfefbe58e91b6a63fbd5029776f04f635e148e4aa8c7cf50b92b1af593134e905182b0b40a36c824a0ad381c557929615df5cc7a1420a3f7b100ee0bd9aff8f0dc7d0a0bc074a6e4ccc2fb560feba6323b83ac7710374b80dec9050b24c40e50a628f8b2833521d2935eb928e3f5f8654abbd75d5c700113a89aea8979a21990bea403c72b973a9651d9da6ef07464d4b16a45d09b5bbd16360394e1e044b3b135387797f9cf80e1e99240c9a58febd30040b52c1815d3e2f6ed8d1f3c2c86a69d9b9428ebfcde80e4e848f6e51c9f45d0880dcef62036a4fc6a8ee74c901e12fb9a3c19fbb2f70379730674a2c76017723430e05ecad813733d115be1484f929e911c7c76ae00c14b20cab9744a3274ba36028f58a941926f15a34e10b9a9d72d5d9bd0713dce43e6415af3725f784396b5aa84dd576c261b8eecdb950181d1670396d1e602f5e7fbb996e8a1b1efe072905b39abc15b85fe9a340fe5561714bf899c8ec8a66d864b928923b0737452a122b1daa34482c7a0e33ca43109fd51cf6457d4b19156e7022e71f6b7c83a81fea6a10807e1b7f3f3abd0542cfe48a1a5275304db4904327677233e49868086ddbea2c7baf569b26c63d85d61ab040067239bdf1b4f6d47aaf38190ce79ba75d3b8d991a48f19503332d725eaa17b92d4258d6178f57f22a69d76372e9da427f5b463441f5396e367b64dab92948b2232c932610e5828b3104c177c148309e0cc7ce951ee81cc70470f2baf14cfa237ac80c9d2b7c38014d7679b9aa4cce652646fcbb484ecf80493a31b6c8723e2827b8dbae93ee5fc722b7a1d7f120b7ad353fd6b431880b3f5e736b54b0c024d3070b279155bdd3ad6d74ac995110353f4b5d1e9d1259a8b902550e78db7c4d2d2e0ea8aaf91587996d6db8ffaccc4a55441100bbe767782751d39f505d3e46807acdcf7d731e5c25096a972c9691d2fb35b2515ab2acf88b268ad267be45e0da798295a1471fc79e1b48f5bb76d4ba1b061790bbeb863c3f3aad75ab67e14b192a4457f4b4fd6c285d748a6ab334f3c66506efb163e87a9f6c939e37c34c885344a9996556e4c9c503236f45d35030fb7dba18f275eea223271618d5421455de32aa390a6406d2783c29ae3f7835cb1c3d664bf6cc6921aa4cbc8c6bfd9e0817794e782917259676736ed061621d63a31e94676779f8d5da313512a85f4cab9c778ebea77a677b9e20693ad5435dfbe730dd6c74b85fa2e828d5825e98c0472e5917b3cd4e4e883906ec5f77981003f30ccebf34a8c6188339d588ca30f6cbc7478f4e901a48ed6f1f4ace1d3510e7224a5ade01287e0be64f896976eb354cd453b9d4c8b9fdf7d24683ea1f5d51667f1d5e15238dfce40c6aa371127c5bdaaa4713a8a6b681a4d32ac75e5c6e094fa25e3d6e0934833ec218ab98e2e4d0e388478e09b6c50e887e1709ae3d730b78d8047c2785ed64615806e08b1e6b46aa6d77d33232a00d0a9e1ff67dd0a3864c364a40dbc45b01f48e383a5a1c4adc1a0557652262c47b11fe1e96831e163005de15e0fb03221f68b5285849dde06880275b1fe340dba9ac4b77d44955c8fff1aa3e92c6e23b11207815a53ccaebba4641322f655630447ceb4524f930ad89858d6401cf58fe844e2026766a65807bd61f01cf6bdc29ac950349d941d7a16bf1ab45d0ab58093f7a4b24580e45749ab833472e8f4adc10467369d4a2d7c526c1917bbf20afcf7e16c255e0477f4525881b6e8be18d235831cb7538eedce152104a698336cc4597fc3a18340a43a73a47714a87693a44336d220feb24978f3ae0020f6d1637a4ab9ffa78e3590fb112dbc57fa1d99744b470620ea824a68d9a5422140d5314517f15f5259c4cd772822cde0fa1e8d0ec87b83b2179464ccf468712387b24be65f016ff751c8d1ffeb72b6e2c03b6ecb184358d54e80c343a9d3a94143a9ff65e6d781f4818b9f6eb28c5264e29e02d038b3b434e4fed821c1e3b281e07f53be7cbef417b2aca36c2d3878323e6e6627e6897a075e344ac5bfb3b66531feb0ee2fff1e639604dd2aa8dfadd2a8e5afdfb6159796296b1ca109b9c77109d1c1f416a99dd283463e2e53a0a1817997d325ec2940e7765704c4e26d59d02c5e347aa191f942837262ec53b5e9c749ab3771d6a184e080fa8ddf94d8f015d392055e2ae3dce47eda469173c2c4c3d0ec1b4735e7f9822cfb0463e03728a39278c8b1b08bac62983bf0b0e8265453af51aec8cda8eff46b878b05f830c4b5f2fa2efb0a031343888def09f7489a0686c0c49e985fe5e498bd162900966a5700b6b3d2455f5db26b1dbfb04619f2d411819ca8f5635e52d013824cecea32f11856094084b7b137631229b60f963ab135cdf871063eae540af95d972e5550a0e5416773dccc9726b2d41c078d0462664e3382aad2b3f756584ab471faa7aa479d256f21d1492b86d93e3c25a55a1ef686e758ead2b5de26c8dddc2781191164d9d47a6795309505105f7a5393b49e0298043e5b883e5ef1cbcdfb035ecf64e757386a9f154307f25f910bd0dfa751565253c2c6e439bef59eea534f0424b3959f93106cd5f5efc503df44e6c5c02e84737b4ef503520ce279650dffa656f6845b7e8eb3691b7fa3940dc314e4d83fc0f71844572a417db1901d1c9f080fd14320d18aa16cc20d00db6299bf50a7c2e1b17483d96f7866e13316ea6cd13baf91b74f7dcba11e1277e45496feeaee38a1354d088e02af5a1323cfaca4011f6473df163c14460b72053acc42d5aa7ed6b1b5ddc445186f55c6967f008f354976f4ea4620b5890a64543fece03b4deb94c62af353466c8478a4e71516211c4673b19bf2add6fae2dfe1454de5776f020fa5d701eff44d53dce2065ba64a6fa81126993ea740896bc117d362012e9ef145d6e4cbf81e26680ee7ea443f60c37a7e52dcced09db9402f32c2f7c0db52be53051a40a0d45fc0a3012fcf66553c6044621fbc0e2fef47d264e4c51ee1d725c56777447692c999f31291d1bd68b6747f2343dd1501438d1ba25e5bf924df84d84574ddcdf7f9b19875a7046e3efab4e49055eba5943ac6aaf5d72bcb725f21ccf6b60d128bbd88d30224bf6847fb5a9d032f768534c5837fb4974c20da82e53b3548987b08388fa2113ea7c8da3ef2f121c8dea2e8ac9821268338dd0646427ae62aad9f62ef94daa0d8a6762dca9585a45510ee4bbdad7740b9a19b616ca86773d32d4b337dabfea25338ab4720c693d2d9b146b1f686cbc10dfa00d7e0b911f6edb40b0e92829d430276eb5aac515b565ed1e2c10d5f5722881107d7fd7bf305e6b4597ccb9540572c0c5070649edb43616576f139bf1661a337895c659abf71862ecc1808216546619bad09bfd78716ca3b8957fafe23c5d544d00ce1534341331105ba2d4cb4c00fcf6d2aa3efde755ea026a124177c844d6e1d3cae97aaf4e111c9612e2316827946b7c47ef6de1513555e413ca22d1562860330d077ee97d4784bb5a93f9374765bd8129057fab44c224ff3f5fc318114b3fea81fd5a201583fe8e74283be42e72d386785c04a4590d78cf2c7e28dd7c94555b2d1b46bb3f236954fcf2df9301f7d13274c35f4b4ee44475858bf396592212e0d2dfb71346713a6539a65fb32de5cd35acf668b8330b0c49d6d136b32ed3fbdae0fec0223f4114fc7605ee577c6fb85f4241159c475aacc8d36d3c753a873667ab84d32e24540a11f59ad0c6079b39b9766a098f1767dd79ae08b02d7e8937fd3c550201431a7b12c8fb58532a8c30915809135a70c77f12624cdd2c5c246c949c2c754e67c8897019e4a7ec3f30a321d71fd574762473fd2aea9c6f3cb04a5a713b4902018107df6c7c8bab1f51a2cc5a4770bf50868e281f0a22d15d389ae80411d52c260319527729f17345644ebb85649a4527e20e1f163f87006e20244398ddc9c17a76a65e60c2367a76fe927ba622a93d2d20ef19df0abd997c18e3974e350c222e1035fb0af8a5ea19899618ad0b5a4c376371b9cce2a1853340da79a6cec8ac0e6f4d96ecad32347afc00a98b5a138f41699f4f593a10ee4eba2e4ad31e91e75242263dbec35f896aa733d1e2f7fad82c4c373e2e7953d47f3ce5317ee8615b731804327eaeb1fa382ab9b2073f0c564afa89e1a930ea346a06427d21d2f57d0771ba0403d3a92502cd89fb405f32bf483c7c77714204a403c7627c0fd0e3f434c3548706eea5e25dafe477b9e674ca38fe3aa2b09211b66ceafe35cadacb2c4e82d083f45447a66966e5e0d983a1165299430d0b86a5c74d9d1bf0eddaac381d47d6c8e90e2a1c461ff4e9870e700f47181ccd6942df38230935926f37934411e202dea595ff9e3d9fac136d43c0c00e2b38d4bedeceda689ea4f244bc8b7d75502896eeb04a22197e90c996cbcae037095f659097fd0f13277507f10c5a8114d261e2e4d52ea21feb45c0b1fabb622bc4bb3b5c26eddd521882c73b43300c240fb5672dacc40d37fe7b8523423ef21dd8322d511e24ed404035fd58f5dd621a52e4c0af2290d800ae035aa2730094578c1b9deffc44fa1539d9931e3d9ad31fe6952ea281bd0568f6d15ce536b4323fca55cdd940731e0d155488b603463d482a8544212d0d2948def905d518ea217c4dc373d2cbb09a3bf05a444f8fefed44d47b47c5860cda2bcef4a2a865d9ea2fa79ed5699a577c714298bd4840a42c599f9e05d70df1d6354574f62ec457de2cf8b83045281c8460e20c67cc1ca2ef0217197732dbbea4671758cf8fed22222331f08f3c83f6da28f8a2c24abd1c654a64179e9ee3493741038e0e80c2531b4fc617944545dc8a28bc8df859a5d378098fd6b6792a85c6284fa2800c2e4e35492c7ba3faa29c26651d38c726cb45293daeb338f177266240af94095da381050ac34185207673ab0db0505cf2bea05c0979425e7a1643d105e89d56c95a7bf6603dd1e90dcb49b321a1babed935907d4ef113d7e6df7f2006ec74c626e31d4d2c47bcb5ecb64f3e3071c3e52ffd54c4562007d846a4108042f2ef2157828d3e4208eb21f24569053faef88ae3650ff740391d46ebf693d0573df8f9c62ee6ad01fed8d7eecc2dee4a0398f59c9a64a81cf8e01e6547524c64bd782f3d63cc6d384a88e58d3709740bd204127176920d5e60e931b237b74554758d55baa3d351362bbde7234936541095edc9b49a422429942f21856544fe02cd3a02c55e2eaf02b3dc46b9abea142896211e49ed90b9316a2b4fd2f4d79b6e43150e7cc7e6903d6333fd410494817e444a1a866248f05ef3342e8a7d82f72441d7fcc0f890ef7b4da453de7104c902aecd173ff222d0048bb032cc67e35145726af656944d9b2dfd2fb1fd619a666fe1064b897bb3c122c22fa170150e6d775d7eac62b5a3d81a3d6e3673fd5c442518a2ae6d2fdac040a8d418c3ef0c420b63d7a51fb837da7a21993a1616cae065da6fa4ff8f0d7b02fa0db7521e11db4397e834cfe1e4986ab0d5e09a65eb3741644df6b9afc30d125233a38c57e447475db51badae651a009f34314180511c2798b72586abe0465b0bb9dfea77da3d6b16c182ef0bd8bd5372fd8ffa1232d7160629ca1442e178421273064447add10d552932f44f43090b1006738eb3edb53fa0bd0ec51524dd7c7f7ea9df6cc890529809741891107057fbfd77783b1f300db68a1bf958d3c83561db4205f1fd7e71b2493fed64aa4760aaf4c9088a794d56d0b8860169d86a7770ea39b495c6a41cfd32e37b8b2c900c1fcfc4e9c4d50d0f7fae615c039a9a0573b5d491cbd8067815f2e2d392a4af37f6de2d22eb89d16522d6cbbcd7ffdf68331711befede270829c32b2e0cc68224a26699da9387e6151d90910af2b55f132db5f9564a91c918b625f8275ea3585cad58a2c16745044503d9257090cd0421dec1ffa832d32633cf4d6f477ff18c401611a165ec62537346c1a7dc48c5577c2a19051fa2018f27cd916e4b4ab33b0c666587a16e6a0e40167262712c4aea6ba5eb1d65ec6c9d158179985bf4082806dc63faa0c7673c1260a9e2ce6c80d94f6b11023bd75b415de85572d6b584193acad82180975eff2474f2263864b41927f136b580178d817f239cb972f4665d1ac31d03945e58b736eed94f367e863d6391653713c665ad3da95e5ccbe88de725b1bf8bb84e7a37667e7e913e3d4a005625e3fca5618f1e5d6fc63cbdb4831e7cc175e73d11f6b20c9d9e9547d36f000c175c0d1e67484430354d66031afd9b255847d460ecf60722644a0e23161b2769473cc42943f03365f61b65d7c717411329c3b702baf10f34e68f8c9cc4975f535049d3c71e796513737f08adb748134cf80405ad9bda5138b406f02c8230d55e45edd9ef14f6cd5dd83571c4169d826284bf6b3662f21175086483da956e6a4357550e5bdefc9e01c957299a9773de5277ac4fbd64f43f51dd63f8797aa8f3455f4b913f70d87b78226affb91cab0c6b7bceaebd42d75862e9438185fbda7971b590c5b41e601e4f29c89cf9f4853431a873015306c9fc37a3f3552d57f67d04e470048be5584d1950a16b86c4a1926f884d227826da947e8efd5811b54ca71eb95fe97c7e56b400c01b02645e7673029f1a4a5ae70ad509dd85fee7003b64624889cc64b716f12102233841ddf9dd04715a739b024c373bcc0ca7fbaa63ff037f651cd5aa0e4b4af494a63c2e6cd41d4a025b4b64527358fc4414d0d5ee2b1ce1a2ad5903116e4af349eb69e9d4ce4c2104c176acebaa2a _Values: - {fileID: 1381594469} - {fileID: 1381594468} @@ -12057,7 +12073,6 @@ MonoBehaviour: - {fileID: 1647473500} - {fileID: 1648907610} - {fileID: 1502848754} - - {fileID: 1502848756} - {fileID: 1555019810} - {fileID: 1555019814} - {fileID: 1647473498} @@ -12597,6 +12612,11 @@ MonoBehaviour: - {fileID: 1012344128} - {fileID: 1012344127} - {fileID: 1012344126} + - {fileID: 2800000, guid: f20112bdeec2e8d4d9f80e8390e37263, type: 3} + - {fileID: 2800000, guid: ee148e281f3c41c5b4ff5f8a5afe5a6c, type: 3} + - {fileID: 1197505587} + - {fileID: 11500000, guid: 6c12bb7674cd5416f8d846e62018a96d, type: 3} + - {fileID: 1197505588} --- !u!4 &1926461710 Transform: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/DynamicUI/DynamicUIElements/Simple/DynamicUIElement.cs b/Assets/Scripts/DynamicUI/DynamicUIElements/Simple/DynamicUIElement.cs index 00c1393b..6943c8b1 100644 --- a/Assets/Scripts/DynamicUI/DynamicUIElements/Simple/DynamicUIElement.cs +++ b/Assets/Scripts/DynamicUI/DynamicUIElements/Simple/DynamicUIElement.cs @@ -18,11 +18,6 @@ namespace Ichni.Editor /// 参数名,通过反射获取饿修改对应变量的值 /// public string parameterName; - - /// - /// 是否始终更新,如果子类可能用到此变量,则在子类中写Update即可(注意,如果最后仅有Text用到此变量,直接移动它到Text即可) - /// - public bool isAlwaysUpdated; public virtual void Initialize(IBaseElement baseElement, string title, string parameterName) { @@ -54,4 +49,21 @@ namespace Ichni.Editor //public abstract void ApplyParameters(); } + + public interface IHaveAutoUpdate + { + public bool isAutoUpdate { get; set; } + public bool isReceiving { get; set; } + public void SetAutoUpdate(bool enable); + + public void UpdateContent() + { + if(isAutoUpdate && isReceiving) + { + ApplyContent(); + } + } + + public void ApplyContent(); + } } \ No newline at end of file diff --git a/Assets/Scripts/DynamicUI/DynamicUIElements/Simple/DynamicUIParameterInputField.cs b/Assets/Scripts/DynamicUI/DynamicUIElements/Simple/DynamicUIInputField.cs similarity index 57% rename from Assets/Scripts/DynamicUI/DynamicUIElements/Simple/DynamicUIParameterInputField.cs rename to Assets/Scripts/DynamicUI/DynamicUIElements/Simple/DynamicUIInputField.cs index 1f8685e0..5b236175 100644 --- a/Assets/Scripts/DynamicUI/DynamicUIElements/Simple/DynamicUIParameterInputField.cs +++ b/Assets/Scripts/DynamicUI/DynamicUIElements/Simple/DynamicUIInputField.cs @@ -8,18 +8,51 @@ using UnityEngine.Events; namespace Ichni.Editor { - public class DynamicUIParameterInputField : DynamicUIElement + public class DynamicUIInputField : DynamicUIElement, IHaveAutoUpdate { public TMP_InputField inputField; - + public bool isAutoUpdate { get; set; } + public bool isReceiving { get; set; } public override void Initialize(IBaseElement baseElement, string title, string parameterName) { base.Initialize(baseElement, title, parameterName); - inputField.text = connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement).ToString(); //获取对应变量的值 - inputField.onEndEdit.AddListener(ApplyParameters); + if (parameterName != string.Empty) + { + ApplyContent(); + inputField.onEndEdit.AddListener(ApplyParameters); + } } - + + private void Update() + { + (this as IHaveAutoUpdate).UpdateContent(); + } + + public void SetDefaultValue(string text) + { + inputField.text = text; + } + + public T GetValue() + { + return (T)Convert.ChangeType(inputField.text, typeof(T)); + } + + public void SetAutoUpdate(bool enable) + { + isAutoUpdate = enable; + isReceiving = true; + + inputField.onSelect.AddListener(_ => isReceiving = false); + inputField.onDeselect.AddListener(_ => isReceiving = true); + } + + public void ApplyContent() + { + inputField.text = connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement).ToString(); //获取对应变量的值 + } + private void ApplyParameters(string text) { Type type = connectedBaseElement.GetType().GetField(parameterName).FieldType; diff --git a/Assets/Scripts/DynamicUI/DynamicUIElements/Simple/DynamicUIParameterInputField.cs.meta b/Assets/Scripts/DynamicUI/DynamicUIElements/Simple/DynamicUIInputField.cs.meta similarity index 100% rename from Assets/Scripts/DynamicUI/DynamicUIElements/Simple/DynamicUIParameterInputField.cs.meta rename to Assets/Scripts/DynamicUI/DynamicUIElements/Simple/DynamicUIInputField.cs.meta diff --git a/Assets/Scripts/DynamicUI/DynamicUIElements/Simple/DynamicUIParameterText.cs b/Assets/Scripts/DynamicUI/DynamicUIElements/Simple/DynamicUIParameterText.cs index e2d2b75b..cf1b4702 100644 --- a/Assets/Scripts/DynamicUI/DynamicUIElements/Simple/DynamicUIParameterText.cs +++ b/Assets/Scripts/DynamicUI/DynamicUIElements/Simple/DynamicUIParameterText.cs @@ -7,22 +7,32 @@ using UnityEngine; namespace Ichni.Editor { - public class DynamicUIParameterText : DynamicUIElement + public class DynamicUIParameterText : DynamicUIElement, IHaveAutoUpdate { public TMP_Text text; + public bool isAutoUpdate { get; set; } + public bool isReceiving { get; set; } public override void Initialize(IBaseElement baseElement, string title, string parameterName) { base.Initialize(baseElement, title, parameterName); - text.text = connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement).ToString(); + ApplyContent(); } - + private void Update() { - if (isAlwaysUpdated) - { - text.text = connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement).ToString(); - } + (this as IHaveAutoUpdate).UpdateContent(); + } + + public void SetAutoUpdate(bool enable) + { + isAutoUpdate = enable; + isReceiving = true; + } + + public void ApplyContent() + { + text.text = connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement).ToString(); } } } \ No newline at end of file diff --git a/Assets/Scripts/DynamicUI/DynamicUIElements/Simple/DynamicUIVector3InputField.cs b/Assets/Scripts/DynamicUI/DynamicUIElements/Simple/DynamicUIVector3InputField.cs index 25d9af94..cc5a00f7 100644 --- a/Assets/Scripts/DynamicUI/DynamicUIElements/Simple/DynamicUIVector3InputField.cs +++ b/Assets/Scripts/DynamicUI/DynamicUIElements/Simple/DynamicUIVector3InputField.cs @@ -1,3 +1,4 @@ +using System; using System.Collections; using System.Collections.Generic; using Ichni.RhythmGame; @@ -10,27 +11,66 @@ using UnityEngine.UIElements.Experimental; namespace Ichni.Editor { - public class DynamicUIVector3InputField : DynamicUIElement + public class DynamicUIVector3InputField : DynamicUIElement, IHaveAutoUpdate { public TMP_InputField inputFieldX; public TMP_InputField inputFieldY; public TMP_InputField inputFieldZ; + public bool isAutoUpdate { get; set; } + public bool isReceiving { get; set; } public override void Initialize(IBaseElement baseElement, string title, string parameterName) { base.Initialize(baseElement, title, parameterName); + if (parameterName != string.Empty) + { + ApplyContent(); + + inputFieldX.onEndEdit.AddListener(_ => ApplyParameters()); + inputFieldY.onEndEdit.AddListener(_ => ApplyParameters()); + inputFieldZ.onEndEdit.AddListener(_ => ApplyParameters()); + } + } + + private void Update() + { + (this as IHaveAutoUpdate).UpdateContent(); + } + + public void SetDefaultValue(Vector3 value) + { + inputFieldX.text = value.x.ToString(); + inputFieldY.text = value.y.ToString(); + inputFieldZ.text = value.z.ToString(); + } + + public Vector3 GetValue() + { + return new Vector3(float.Parse(inputFieldX.text), float.Parse(inputFieldY.text), float.Parse(inputFieldZ.text)); + } + + public void SetAutoUpdate(bool enable) + { + isAutoUpdate = enable; + isReceiving = true; + + inputFieldX.onSelect.AddListener(_ => isReceiving = false); + inputFieldY.onSelect.AddListener(_ => isReceiving = false); + inputFieldZ.onSelect.AddListener(_ => isReceiving = false); + + inputFieldX.onDeselect.AddListener(_ => isReceiving = true); + inputFieldY.onDeselect.AddListener(_ => isReceiving = true); + inputFieldZ.onDeselect.AddListener(_ => isReceiving = true); + } + + public void ApplyContent() + { Vector3 pos = (Vector3)connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement); //获取对应变量的值 inputFieldX.text = pos.x.ToString(); inputFieldY.text = pos.y.ToString(); inputFieldZ.text = pos.z.ToString(); - - inputFieldX.onEndEdit.AddListener(_ => ApplyParameters()); - inputFieldY.onEndEdit.AddListener(_ => ApplyParameters()); - inputFieldZ.onEndEdit.AddListener(_ => ApplyParameters()); - } - public override void DeviverSet(int i){ - //我什么也不做 } + private void ApplyParameters() { Vector3 newValue = new Vector3(float.Parse(inputFieldX.text), float.Parse(inputFieldY.text), float.Parse(inputFieldZ.text)); @@ -44,5 +84,9 @@ namespace Ichni.Editor inputFieldY.onEndEdit.AddListener(_ => action()); inputFieldZ.onEndEdit.AddListener(_ => action()); } + + public override void DeviverSet(int i){ + //我什么也不做 + } } } \ No newline at end of file diff --git a/Assets/Scripts/DynamicUI/Inspector/IHaveInspection.cs b/Assets/Scripts/DynamicUI/Inspector/IHaveInspection.cs index 4a44e9aa..2311495a 100644 --- a/Assets/Scripts/DynamicUI/Inspector/IHaveInspection.cs +++ b/Assets/Scripts/DynamicUI/Inspector/IHaveInspection.cs @@ -66,38 +66,49 @@ namespace Ichni.Editor return toggle; } - public DynamicUIGetterInputField GenerateGetterInputField(DynamicUIContainer container, - string title, string defaultText) + public DynamicUIInputField GenerateInputField(DynamicUIContainer container, + string title, string defaultText = "") //不与参数绑定的InputField { - DynamicUIGetterInputField getterInputField = Object - .Instantiate(EditorManager.instance.basePrefabs.getterInputField, container.rect) - .GetComponent(); - getterInputField.Initialize(null, title, string.Empty); - getterInputField.SetDefaultText(defaultText); - container.dynamicUIElements.Add(getterInputField); - return getterInputField; + DynamicUIInputField inputField = Object + .Instantiate(EditorManager.instance.basePrefabs.parameterInputField, container.rect) + .GetComponent(); + inputField.Initialize(null, title, string.Empty); + inputField.SetDefaultValue(defaultText); + container.dynamicUIElements.Add(inputField); + return inputField; } - public DynamicUIParameterInputField GenerateParameterInputField(IBaseElement baseElement, - DynamicUIContainer container, - string title, string parameterName) + public DynamicUIInputField GenerateInputField(IBaseElement baseElement, + DynamicUIContainer container, string title, string parameterName, bool isAutoUpdate = false) //与参数绑定的InputField { - DynamicUIParameterInputField parameterInputField = Object + DynamicUIInputField inputField = Object .Instantiate(EditorManager.instance.basePrefabs.parameterInputField, container.rect) - .GetComponent(); - parameterInputField.Initialize(baseElement, title, parameterName); - container.dynamicUIElements.Add(parameterInputField); - return parameterInputField; + .GetComponent(); + inputField.Initialize(baseElement, title, parameterName); + container.dynamicUIElements.Add(inputField); + return inputField; + } + + public DynamicUIVector3InputField GenerateVector3InputField(DynamicUIContainer container, string title, + Vector3 defaultVector3 = default) + { + DynamicUIVector3InputField vector3InputField = + Object.Instantiate(EditorManager.instance.basePrefabs.vector3InputField, container.rect) + .GetComponent(); + vector3InputField.Initialize(null, title, string.Empty); + vector3InputField.SetDefaultValue(defaultVector3); + container.dynamicUIElements.Add(vector3InputField); + return vector3InputField; } public DynamicUIVector3InputField GenerateVector3InputField(IBaseElement baseElement, - DynamicUIContainer container, - string title, string parameterName) + DynamicUIContainer container, string title, string parameterName, bool isAutoUpdate = false) { DynamicUIVector3InputField vector3InputField = Object.Instantiate(EditorManager.instance.basePrefabs.vector3InputField, container.rect) .GetComponent(); vector3InputField.Initialize(baseElement, title, parameterName); + vector3InputField.SetAutoUpdate(isAutoUpdate); container.dynamicUIElements.Add(vector3InputField); return vector3InputField; } @@ -148,14 +159,13 @@ namespace Ichni.Editor } public DynamicUIParameterText GenerateParameterText(IBaseElement baseElement, DynamicUIContainer container, - string title, - string parameterName, bool isAlwaysUpdate = false) + string title, string parameterName, bool isAutoUpdate = false) { DynamicUIParameterText parameterText = Object .Instantiate(EditorManager.instance.basePrefabs.parameterText, container.rect) .GetComponent(); parameterText.Initialize(baseElement, title, parameterName); - parameterText.isAlwaysUpdated = isAlwaysUpdate; + parameterText.SetAutoUpdate(isAutoUpdate); container.dynamicUIElements.Add(parameterText); return parameterText; } diff --git a/Assets/Scripts/DynamicUI/Timeline/MusicPlayModule.cs b/Assets/Scripts/DynamicUI/Timeline/MusicPlayModule.cs new file mode 100644 index 00000000..aaced350 --- /dev/null +++ b/Assets/Scripts/DynamicUI/Timeline/MusicPlayModule.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using Ichni.RhythmGame; +using UnityEngine; +using UnityEngine.UI; + +namespace Ichni.Editor +{ + public class MusicPlayModule : MonoBehaviour + { + public Button playButton; + public Button pauseButton; + public Button stopButton; + + private void Start() + { + playButton.onClick.AddListener(EditorManager.instance.musicPlayer.PlayMusic); + pauseButton.onClick.AddListener(EditorManager.instance.musicPlayer.PauseMusic); + stopButton.onClick.AddListener(EditorManager.instance.musicPlayer.StopMusic); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/DynamicUI/Timeline/MusicPlayer.cs.meta b/Assets/Scripts/DynamicUI/Timeline/MusicPlayModule.cs.meta similarity index 100% rename from Assets/Scripts/DynamicUI/Timeline/MusicPlayer.cs.meta rename to Assets/Scripts/DynamicUI/Timeline/MusicPlayModule.cs.meta diff --git a/Assets/Scripts/DynamicUI/Timeline/TimePointerModule.cs b/Assets/Scripts/DynamicUI/Timeline/TimePointerModule.cs index e65c3918..b6c3ca9b 100644 --- a/Assets/Scripts/DynamicUI/Timeline/TimePointerModule.cs +++ b/Assets/Scripts/DynamicUI/Timeline/TimePointerModule.cs @@ -44,9 +44,8 @@ namespace Ichni.Editor private void Update() { - if (timeline.musicPlayer.isPlaying) + if (EditorManager.instance.musicPlayer.isPlaying) { - songInformation.songTime = timeline.musicPlayer.audioSource.time; SetRange(songInformation.songTime); } diff --git a/Assets/Scripts/DynamicUI/Timeline/Timeline.cs b/Assets/Scripts/DynamicUI/Timeline/Timeline.cs index c2856deb..2d00fb4e 100644 --- a/Assets/Scripts/DynamicUI/Timeline/Timeline.cs +++ b/Assets/Scripts/DynamicUI/Timeline/Timeline.cs @@ -8,6 +8,7 @@ using TMPro; using Unity.VisualScripting; using UnityEngine; using UnityEngine.InputSystem; +using UnityEngine.Serialization; using UnityEngine.UI; namespace Ichni.Editor @@ -23,7 +24,7 @@ namespace Ichni.Editor public GameObject timelineTabRect; public TimePointerModule timePointerModule; - public MusicPlayer musicPlayer; + public MusicPlayModule musicPlayModule; public TMP_InputField TimeField; @@ -32,7 +33,7 @@ namespace Ichni.Editor public RectTransform GetinputArea; public void Update() { - if (musicPlayer.isPlaying) UpdateTime(); + if (EditorManager.instance.musicPlayer.isPlaying) UpdateTime(); if (RectTransformUtility.RectangleContainsScreenPoint(GetinputArea, Mouse.current.position.ReadValue())) { @@ -85,8 +86,8 @@ namespace Ichni.Editor public void SetTime(string time) { - musicPlayer.PauseMusic(); - musicPlayer.audioSource.time = float.Parse(time); + EditorManager.instance.musicPlayer.PauseMusic(); + EditorManager.instance.musicPlayer.audioSource.time = float.Parse(time); EditorManager.instance.songInformation.songTime = float.Parse(time); timePointerModule.UpdatePointers(); @@ -95,15 +96,13 @@ namespace Ichni.Editor } public void SetBeat(string beat) { - musicPlayer.PauseMusic(); - musicPlayer.audioSource.time = float.Parse(beat) * timePerBeat; + EditorManager.instance.musicPlayer.PauseMusic(); + EditorManager.instance.musicPlayer.audioSource.time = float.Parse(beat) * timePerBeat; EditorManager.instance.songInformation.songTime = float.Parse(beat) * timePerBeat; timePointerModule.UpdatePointers(); timePointerModule.SetRange(songTime); } - - } diff --git a/Assets/Scripts/EditorGame/Base/GeneralSubmodules/TimeDurationSubmodule.cs b/Assets/Scripts/EditorGame/Base/GeneralSubmodules/TimeDurationSubmodule.cs index 31861aa1..aac112ad 100644 --- a/Assets/Scripts/EditorGame/Base/GeneralSubmodules/TimeDurationSubmodule.cs +++ b/Assets/Scripts/EditorGame/Base/GeneralSubmodules/TimeDurationSubmodule.cs @@ -91,8 +91,8 @@ namespace Ichni.RhythmGame IHaveInspection inspector = EditorManager.instance.uiManager.inspector; var container = inspector.GenerateContainer("Time Duration"); var overrideToggle = inspector.GenerateToggle(this, container, "Override Duration", nameof(isOverridingDuration)); - var startTimeInputField = inspector.GenerateParameterInputField(this, container, "Start Time", nameof(startTime)); - var endTimeInputField = inspector.GenerateParameterInputField(this, container, "End Time", nameof(endTime)); + var startTimeInputField = inspector.GenerateInputField(this, container, "Start Time", nameof(startTime)); + var endTimeInputField = inspector.GenerateInputField(this, container, "End Time", nameof(endTime)); void SetInputFieldInteractable(bool interactable) { diff --git a/Assets/Scripts/EditorGame/GameElements/EnvironmentObjects/BackgroundSetter.cs b/Assets/Scripts/EditorGame/GameElements/EnvironmentObjects/BackgroundSetter.cs index 0824c246..fa317ab6 100644 --- a/Assets/Scripts/EditorGame/GameElements/EnvironmentObjects/BackgroundSetter.cs +++ b/Assets/Scripts/EditorGame/GameElements/EnvironmentObjects/BackgroundSetter.cs @@ -56,22 +56,27 @@ namespace Ichni.Editor IHaveInspection inspector = EditorManager.instance.uiManager.inspector; var container = inspector.GenerateContainer("Background Setter"); var useSkyboxToggle = inspector.GenerateToggle(this, container, "Use Skybox", nameof(useSkybox)); - var skyboxThemeBundleField = inspector.GenerateParameterInputField(this, container, "Skybox Theme Bundle", nameof(skyboxThemeBundleName)); - var skyboxMaterialNameField = inspector.GenerateParameterInputField(this, container, "Skybox Material", nameof(skyboxMaterialName)); - var backgroundSpriteField = inspector.GenerateParameterInputField(this, container, "Background Sprite", nameof(backgroundSpriteName)); + var skyboxThemeBundleField = inspector.GenerateInputField(this, container, "Skybox Theme Bundle", nameof(skyboxThemeBundleName)); + var skyboxMaterialNameField = inspector.GenerateInputField(this, container, "Skybox Material", nameof(skyboxMaterialName)); + var backgroundSpriteField = inspector.GenerateInputField(this, container, "Background Sprite", nameof(backgroundSpriteName)); var applyButton = inspector.GenerateButton(this, container, "Apply", Refresh); - useSkyboxToggle.AddListenerFunction(EditorManager.instance.backgroundController.EnableBackground); - useSkyboxToggle.AddListenerFunction(value => + + void SetFields(bool value) { skyboxThemeBundleField.inputField.interactable = value; skyboxMaterialNameField.inputField.interactable = value; backgroundSpriteField.inputField.interactable = !value; - }); + } + + SetFields(useSkybox); + + useSkyboxToggle.AddListenerFunction(value => EditorManager.instance.backgroundController.EnableBackground(!value)); + useSkyboxToggle.AddListenerFunction(SetFields); } public override void Refresh() { - EditorManager.instance.backgroundController.EnableBackground(useSkybox); + EditorManager.instance.backgroundController.EnableBackground(!useSkybox); if (useSkybox) { SetSkybox(skyboxThemeBundleName, skyboxMaterialName); diff --git a/Assets/Scripts/EditorGame/GameElements/GameElement.cs b/Assets/Scripts/EditorGame/GameElements/GameElement.cs index fba64d96..308d4fe7 100644 --- a/Assets/Scripts/EditorGame/GameElements/GameElement.cs +++ b/Assets/Scripts/EditorGame/GameElements/GameElement.cs @@ -150,7 +150,7 @@ namespace Ichni.RhythmGame { IHaveInspection inspector = EditorManager.instance.uiManager.inspector; var container = inspector.GenerateContainer("Element Info"); - var nameInputField = inspector.GenerateParameterInputField(this, container, GetType().Name + "'s Name", nameof(elementName)); + var nameInputField = inspector.GenerateInputField(this, container, GetType().Name + "'s Name", nameof(elementName)); var guidText = inspector.GenerateParameterText(this, container, "Element GUID", nameof(elementGuid)); var tagsListButton = inspector.GenerateButton(this, container, "Tags List", () => { diff --git a/Assets/Scripts/EditorGame/GameElements/GeneralEffects/BloomShake.cs b/Assets/Scripts/EditorGame/GameElements/GeneralEffects/BloomShake.cs index dcf21262..bb1ab744 100644 --- a/Assets/Scripts/EditorGame/GameElements/GeneralEffects/BloomShake.cs +++ b/Assets/Scripts/EditorGame/GameElements/GeneralEffects/BloomShake.cs @@ -40,8 +40,8 @@ namespace Ichni.RhythmGame { IHaveInspection inspector = EditorManager.instance.uiManager.inspector; var container = inspector.GenerateContainer("Bloom Shake"); - var effectTimeField = inspector.GenerateParameterInputField(this, container, "Bloom Time", nameof(bloomTime)); - var bloomPeakField = inspector.GenerateParameterInputField(this, container, "Bloom Peak", nameof(bloomPeak)); + var effectTimeField = inspector.GenerateInputField(this, container, "Bloom Time", nameof(bloomTime)); + var bloomPeakField = inspector.GenerateInputField(this, container, "Bloom Peak", nameof(bloomPeak)); } } diff --git a/Assets/Scripts/EditorGame/GameElements/GeneralEffects/TimeEffectsCollection.cs b/Assets/Scripts/EditorGame/GameElements/GeneralEffects/TimeEffectsCollection.cs index a4db1bd9..5a152612 100644 --- a/Assets/Scripts/EditorGame/GameElements/GeneralEffects/TimeEffectsCollection.cs +++ b/Assets/Scripts/EditorGame/GameElements/GeneralEffects/TimeEffectsCollection.cs @@ -11,7 +11,7 @@ namespace Ichni.RhythmGame public partial class TimeEffectsCollection : GameElement, IHaveEffectSubmodule { public EffectSubmodule effectSubmodule { get; set; } - public float time; + public float time; //触发效果的时间 public static TimeEffectsCollection GenerateElement(string name, Guid guid, List tags, bool isFirstGenerated, GameElement parentElement, float time) @@ -26,6 +26,7 @@ namespace Ichni.RhythmGame protected override void SetDefaultSubmodules() { effectSubmodule = new EffectSubmodule(this); + submoduleList.Add(effectSubmodule); } private void Update() @@ -38,18 +39,30 @@ namespace Ichni.RhythmGame { public override void SaveBM() { - matchedBM = new TimeEffectsCollection_BM(this); + matchedBM = new TimeEffectsCollection_BM(elementName, elementGuid, tags, + parentElement.matchedBM as GameElement_BM, this); } public override void SetUpInspector() { + base.SetUpInspector(); + IHaveInspection inspector = EditorManager.instance.uiManager.inspector; + Inspector inspectorMain = EditorManager.instance.uiManager.inspector; var container = inspector.GenerateContainer("Time Effects Collection"); - var timeInputField = inspector.GenerateParameterInputField(this, container, "Time", nameof(time)); + var timeInputField = inspector.GenerateInputField(this, container, "Time", nameof(time)); + var effectNameInputField = inspector.GenerateInputField(container, "Effect Name"); var addEffectButton = inspector.GenerateButton(this, container, "Add Effect", () => { - IHaveEffectSubmodule.EffectCollection.TryGetValue("BloomShake", out var effect); - effectSubmodule.effectCollection["Default"].Add(effect); + if (IHaveEffectSubmodule.EffectCollection.TryGetValue(effectNameInputField.GetValue(), out var effect)) + { + effectSubmodule.effectCollection["Default"].Add(effect); + inspectorMain.SetInspector(this); + } + else + { + LogWindow.Log("Effect Type not found.", Color.red); + } }); foreach (var effect in effectSubmodule.effectCollection["Default"]) @@ -69,21 +82,24 @@ namespace Ichni.RhythmGame { } - - public TimeEffectsCollection_BM(TimeEffectsCollection timeEffectsCollection) + + public TimeEffectsCollection_BM(string elementName, Guid elementGuid, List tags, + GameElement_BM attachedElement, TimeEffectsCollection timeEffectsCollection) + : base(elementName, elementGuid, tags, attachedElement) { time = timeEffectsCollection.time; } + public override void ExecuteBM() { - matchedElement = TimeEffectsCollection.GenerateElement("Time Effects Collection", elementGuid, + matchedElement = TimeEffectsCollection.GenerateElement(elementName, elementGuid, tags, false, GetElement(attachedElementGuid), time); } public override GameElement DuplicateBM(GameElement attached) { - return TimeEffectsCollection.GenerateElement("Time Effects Collection", elementGuid, + return TimeEffectsCollection.GenerateElement(elementName, elementGuid, tags, false, attached, time); } } diff --git a/Assets/Scripts/EditorGame/GameElements/Notes/NoteObjects/Flick.cs b/Assets/Scripts/EditorGame/GameElements/Notes/NoteObjects/Flick.cs index d7764e45..9a13d7dc 100644 --- a/Assets/Scripts/EditorGame/GameElements/Notes/NoteObjects/Flick.cs +++ b/Assets/Scripts/EditorGame/GameElements/Notes/NoteObjects/Flick.cs @@ -21,8 +21,6 @@ namespace Ichni.RhythmGame flick.Initialize(elementName, id, tags, isFirstGenerated, parentElement); flick.exactJudgeTime = exactJudgeTime; flick.availableFlickDirections = directions; - flick.transformSubmodule = new TransformSubmodule(flick); - flick.timeDurationSubmodule = new TimeDurationSubmodule(flick); if (parentElement.TryGetComponent(out Track track)) { diff --git a/Assets/Scripts/EditorGame/GameElements/Notes/NoteObjects/NoteBase.cs b/Assets/Scripts/EditorGame/GameElements/Notes/NoteObjects/NoteBase.cs index 5b6d5d72..fb170561 100644 --- a/Assets/Scripts/EditorGame/GameElements/Notes/NoteObjects/NoteBase.cs +++ b/Assets/Scripts/EditorGame/GameElements/Notes/NoteObjects/NoteBase.cs @@ -8,7 +8,7 @@ using UnityEngine; namespace Ichni.RhythmGame { - public abstract partial class NoteBase : GameElement, IHaveTransformSubmodule, IHaveTimeDurationSubmodule + public abstract partial class NoteBase : GameElement, IHaveTimeDurationSubmodule { [Title("Basic Info")] public float exactJudgeTime; @@ -22,7 +22,6 @@ namespace Ichni.RhythmGame public NoteVisualBase noteVisual; [Title("Submodules")] - public TransformSubmodule transformSubmodule { get; set; } public TimeDurationSubmodule timeDurationSubmodule { get; set; } public NoteJudgeSubmodule noteJudgeSubmodule { get; set; } @@ -57,11 +56,9 @@ namespace Ichni.RhythmGame protected override void SetDefaultSubmodules() { - transformSubmodule = new TransformSubmodule(this); timeDurationSubmodule = new TimeDurationSubmodule(this); noteJudgeSubmodule = new NoteJudgeSubmodule(this); - - submoduleList.Add(transformSubmodule); + submoduleList.Add(timeDurationSubmodule); submoduleList.Add(noteJudgeSubmodule); } @@ -139,14 +136,14 @@ namespace Ichni.RhythmGame //我想把时间放在第一层菜单所以 IHaveInspection inspector = EditorManager.instance.uiManager.inspector; var container = inspector.GenerateContainer("Element Info"); - var nameInputField = inspector.GenerateParameterInputField(this, container, GetType().Name + "'s Name", nameof(elementName)); + var nameInputField = inspector.GenerateInputField(this, container, GetType().Name + "'s Name", nameof(elementName)); var guidText = inspector.GenerateParameterText(this, container, "Element GUID", nameof(elementGuid)); var tagsListButton = inspector.GenerateButton(this, container, "Tags List", () => { inspector.GenerateCompositeParameterWindow(this, "Tags List", nameof(tags)).SetAsStringList(); }); var exactJudgeTimeInputField = - inspector.GenerateParameterInputField(this, container, "exactJudgeTime", nameof(exactJudgeTime)); + inspector.GenerateInputField(this, container, "exactJudgeTime", nameof(exactJudgeTime)); exactJudgeTimeInputField.AddListenerFunction(_ => UpdateNoteInTrack()); foreach (var submodule in submoduleList) diff --git a/Assets/Scripts/EditorGame/GameElements/Notes/NoteObjects/Stay.cs b/Assets/Scripts/EditorGame/GameElements/Notes/NoteObjects/Stay.cs index 6faa41cc..5c2e8db0 100644 --- a/Assets/Scripts/EditorGame/GameElements/Notes/NoteObjects/Stay.cs +++ b/Assets/Scripts/EditorGame/GameElements/Notes/NoteObjects/Stay.cs @@ -17,9 +17,7 @@ namespace Ichni.RhythmGame Stay stay = Instantiate(EditorManager.instance.basePrefabs.tapNote, parentElement.transform).GetComponent(); stay.Initialize(elementName, id, tags, isFirstGenerated, parentElement); stay.exactJudgeTime = exactJudgeTime; - stay.transformSubmodule = new TransformSubmodule(stay); - stay.timeDurationSubmodule = new TimeDurationSubmodule(stay); - + if (parentElement.TryGetComponent(out Track track)) { if (track.trackTimeSubmodule != null) diff --git a/Assets/Scripts/EditorGame/GameElements/Notes/NoteObjects/Tap.cs b/Assets/Scripts/EditorGame/GameElements/Notes/NoteObjects/Tap.cs index f6aecd0b..16657186 100644 --- a/Assets/Scripts/EditorGame/GameElements/Notes/NoteObjects/Tap.cs +++ b/Assets/Scripts/EditorGame/GameElements/Notes/NoteObjects/Tap.cs @@ -19,8 +19,6 @@ namespace Ichni.RhythmGame .GetComponent(); tap.Initialize(elementName, id, tags, isFirstGenerated, parentElement); tap.exactJudgeTime = exactJudgeTime; - tap.transformSubmodule = new TransformSubmodule(tap); - tap.timeDurationSubmodule = new TimeDurationSubmodule(tap); if (parentElement.TryGetComponent(out Track track)) { diff --git a/Assets/Scripts/EditorGame/GameElements/TemporaryObject.cs b/Assets/Scripts/EditorGame/GameElements/TemporaryObject.cs index 9225739f..642136f6 100644 --- a/Assets/Scripts/EditorGame/GameElements/TemporaryObject.cs +++ b/Assets/Scripts/EditorGame/GameElements/TemporaryObject.cs @@ -52,7 +52,7 @@ namespace Ichni.RhythmGame var generateButton = inspector.GenerateButton(this, container, "Generate", () => { - Delete(); + EditorManager.instance.operationManager.CopyPasteDeleteModule.DeleteElement(this); inspectorMain.ClearInspector(); SubstantialObject.GenerateElement(elementName, elementGuid, tags, true, themeBundleName, objectName, parentElement); }); diff --git a/Assets/Scripts/EditorGame/GameElements/Track/Track.cs b/Assets/Scripts/EditorGame/GameElements/Track/Track.cs index 16d2156a..f7dfe9c8 100644 --- a/Assets/Scripts/EditorGame/GameElements/Track/Track.cs +++ b/Assets/Scripts/EditorGame/GameElements/Track/Track.cs @@ -198,17 +198,17 @@ namespace Ichni.RhythmGame { IHaveInspection qcWindow = inspectorMain.GenerateSecondaryWindow(this, elementName + "'s Quick Copy"); var qcContainer = qcWindow.GenerateContainer(); - var xField = qcWindow.GenerateGetterInputField(qcContainer, "X offset", "0"); - var yField = qcWindow.GenerateGetterInputField(qcContainer, "Y offset", "0"); - var zField = qcWindow.GenerateGetterInputField(qcContainer, "Z offset", "0"); - var timeField = qcWindow.GenerateGetterInputField(qcContainer, "Time offset", "0"); - var iterationField = qcWindow.GenerateGetterInputField(qcContainer, "Iteration", "0"); + var xField = qcWindow.GenerateInputField(qcContainer, "X offset", "0"); + var yField = qcWindow.GenerateInputField(qcContainer, "Y offset", "0"); + var zField = qcWindow.GenerateInputField(qcContainer, "Z offset", "0"); + var timeField = qcWindow.GenerateInputField(qcContainer, "Time offset", "0"); + var iterationField = qcWindow.GenerateInputField(qcContainer, "Iteration", "0"); var includeAnimationToggle = qcWindow.GenerateToggle(null, qcContainer, "Include Animation", string.Empty); qcWindow.GenerateButton(this, qcContainer, "Copy", () => { - Vector3 positionOffset = new Vector3(xField.GetResult(), yField.GetResult(), zField.GetResult()); - float timeOffset = timeField.GetResult(); - int iteration = iterationField.GetResult(); + Vector3 positionOffset = new Vector3(xField.GetValue(), yField.GetValue(), zField.GetValue()); + float timeOffset = timeField.GetValue(); + int iteration = iterationField.GetValue(); bool includeAnimation = includeAnimationToggle.toggle.isOn; QuickCopy(positionOffset, timeOffset, includeAnimation, iteration); }); @@ -218,12 +218,12 @@ namespace Ichni.RhythmGame { IHaveInspection wholeMoveWindow = inspectorMain.GenerateSecondaryWindow(this, elementName + "'s Whole Track Move"); var wmContainer = wholeMoveWindow.GenerateContainer(); - var xField = wholeMoveWindow.GenerateGetterInputField(wmContainer, "X offset", "0"); - var yField = wholeMoveWindow.GenerateGetterInputField(wmContainer, "Y offset", "0"); - var zField = wholeMoveWindow.GenerateGetterInputField(wmContainer, "Z offset", "0"); + var xField = wholeMoveWindow.GenerateInputField(wmContainer, "X offset", "0"); + var yField = wholeMoveWindow.GenerateInputField(wmContainer, "Y offset", "0"); + var zField = wholeMoveWindow.GenerateInputField(wmContainer, "Z offset", "0"); wholeMoveWindow.GenerateButton(this, wmContainer, "Move", () => { - Vector3 positionOffset = new Vector3(xField.GetResult(), yField.GetResult(), zField.GetResult()); + Vector3 positionOffset = new Vector3(xField.GetValue(), yField.GetValue(), zField.GetValue()); WholeTrackMove(positionOffset); }); }); //整体移动 @@ -232,39 +232,39 @@ namespace Ichni.RhythmGame { IHaveInspection wholeSwirlWindow = inspectorMain.GenerateSecondaryWindow(this, elementName + "'s Whole Track Swirl"); var wsContainer = wholeSwirlWindow.GenerateContainer(); - var angleField = wholeSwirlWindow.GenerateGetterInputField(wsContainer, "Angle", "0"); - var centerXField = wholeSwirlWindow.GenerateGetterInputField(wsContainer, "Center X", "0"); - var centerYField = wholeSwirlWindow.GenerateGetterInputField(wsContainer, "Center Y", "0"); - var centerZField = wholeSwirlWindow.GenerateGetterInputField(wsContainer, "Center Z", "0"); - var axisDirXField = wholeSwirlWindow.GenerateGetterInputField(wsContainer, "Axis Direction X", "0"); - var axisDirYField = wholeSwirlWindow.GenerateGetterInputField(wsContainer, "Axis Direction Y", "0"); - var axisDirZField = wholeSwirlWindow.GenerateGetterInputField(wsContainer, "Axis Direction Z", "0"); + var angleField = wholeSwirlWindow.GenerateInputField(wsContainer, "Angle", "0"); + var centerXField = wholeSwirlWindow.GenerateInputField(wsContainer, "Center X", "0"); + var centerYField = wholeSwirlWindow.GenerateInputField(wsContainer, "Center Y", "0"); + var centerZField = wholeSwirlWindow.GenerateInputField(wsContainer, "Center Z", "0"); + var axisDirXField = wholeSwirlWindow.GenerateInputField(wsContainer, "Axis Direction X", "0"); + var axisDirYField = wholeSwirlWindow.GenerateInputField(wsContainer, "Axis Direction Y", "0"); + var axisDirZField = wholeSwirlWindow.GenerateInputField(wsContainer, "Axis Direction Z", "0"); wholeSwirlWindow.GenerateButton(this, wsContainer, "Swirl", () => { - float angle = angleField.GetResult(); - Vector3 center = new Vector3(centerXField.GetResult(), centerYField.GetResult(), centerZField.GetResult()); - Vector3 axisDirection = new Vector3(axisDirXField.GetResult(), axisDirYField.GetResult(), axisDirZField.GetResult()); + float angle = angleField.GetValue(); + Vector3 center = new Vector3(centerXField.GetValue(), centerYField.GetValue(), centerZField.GetValue()); + Vector3 axisDirection = new Vector3(axisDirXField.GetValue(), axisDirYField.GetValue(), axisDirZField.GetValue()); WholeTrackSwirl(angle, center, axisDirection); }); }); //整体旋转 - var wholeTrackFlipButton = inspector.GenerateButton(this, toolsContainerTrack, "Whole Track Flip", () => - { - IHaveInspection wholeFlipWindow = inspectorMain.GenerateSecondaryWindow(this, elementName + "'s Whole Track Flip"); - var wfContainer = wholeFlipWindow.GenerateContainer(); - var axisStartXField = wholeFlipWindow.GenerateGetterInputField(wfContainer, "Axis Start X", "0"); - var axisStartYField = wholeFlipWindow.GenerateGetterInputField(wfContainer, "Axis Start Y", "0"); - var axisStartZField = wholeFlipWindow.GenerateGetterInputField(wfContainer, "Axis Start Z", "0"); - var axisEndXField = wholeFlipWindow.GenerateGetterInputField(wfContainer, "Axis End X", "0"); - var axisEndYField = wholeFlipWindow.GenerateGetterInputField(wfContainer, "Axis End Y", "0"); - var axisEndZField = wholeFlipWindow.GenerateGetterInputField(wfContainer, "Axis End Z", "0"); - wholeFlipWindow.GenerateButton(this, wfContainer, "Flip", () => - { - Vector3 axisStart = new Vector3(axisStartXField.GetResult(), axisStartYField.GetResult(), axisStartZField.GetResult()); - Vector3 axisEnd = new Vector3(axisEndXField.GetResult(), axisEndYField.GetResult(), axisEndZField.GetResult()); - WholeTrackFlip(axisStart, axisEnd); - }); - }); //整体翻转 + // var wholeTrackFlipButton = inspector.GenerateButton(this, toolsContainerTrack, "Whole Track Flip", () => + // { + // IHaveInspection wholeFlipWindow = inspectorMain.GenerateSecondaryWindow(this, elementName + "'s Whole Track Flip"); + // var wfContainer = wholeFlipWindow.GenerateContainer(); + // var axisStartXField = wholeFlipWindow.GenerateGetterInputField(wfContainer, "Axis Start X", "0"); + // var axisStartYField = wholeFlipWindow.GenerateGetterInputField(wfContainer, "Axis Start Y", "0"); + // var axisStartZField = wholeFlipWindow.GenerateGetterInputField(wfContainer, "Axis Start Z", "0"); + // var axisEndXField = wholeFlipWindow.GenerateGetterInputField(wfContainer, "Axis End X", "0"); + // var axisEndYField = wholeFlipWindow.GenerateGetterInputField(wfContainer, "Axis End Y", "0"); + // var axisEndZField = wholeFlipWindow.GenerateGetterInputField(wfContainer, "Axis End Z", "0"); + // wholeFlipWindow.GenerateButton(this, wfContainer, "Flip", () => + // { + // Vector3 axisStart = new Vector3(axisStartXField.GetResult(), axisStartYField.GetResult(), axisStartZField.GetResult()); + // Vector3 axisEnd = new Vector3(axisEndXField.GetResult(), axisEndYField.GetResult(), axisEndZField.GetResult()); + // WholeTrackFlip(axisStart, axisEnd); + // }); + // }); //整体翻转 var toolsContainerPathNode = inspector.GenerateContainer("Path Node Tools"); //路径点快捷工具 var setAllPathNodeSphereButton = inspector.GenerateButton(this, toolsContainerPathNode, diff --git a/Assets/Scripts/EditorGame/GameElements/Track/TrackSubmodules/TrackTimeSubmodule.cs b/Assets/Scripts/EditorGame/GameElements/Track/TrackSubmodules/TrackTimeSubmodule.cs index e3a43a33..33ba77cb 100644 --- a/Assets/Scripts/EditorGame/GameElements/Track/TrackSubmodules/TrackTimeSubmodule.cs +++ b/Assets/Scripts/EditorGame/GameElements/Track/TrackSubmodules/TrackTimeSubmodule.cs @@ -76,10 +76,10 @@ namespace Ichni.RhythmGame var container = inspector.GenerateContainer("Track Time Movable"); var startTimeInputField = - inspector.GenerateParameterInputField(this, container, "Start Time", nameof(trackStartTime)); - var endTimeInputField = inspector.GenerateParameterInputField(this, container, "End Time", nameof(trackEndTime)); + inspector.GenerateInputField(this, container, "Start Time", nameof(trackStartTime)); + var endTimeInputField = inspector.GenerateInputField(this, container, "End Time", nameof(trackEndTime)); var visibleTimeInputField = - inspector.GenerateParameterInputField(this, container, "Visible Time Length", nameof(visibleTrackTimeLength)); + inspector.GenerateInputField(this, container, "Visible Time Length", nameof(visibleTrackTimeLength)); var animationCurveDropdown = inspector.GenerateDropdown(this, container, "Animation Curve", typeof(AnimationCurveType), nameof(animationCurveType)); var deleteButton = inspector.GenerateButton(this, container, "Delete", @@ -162,7 +162,7 @@ namespace Ichni.RhythmGame var container = inspector.GenerateContainer("Track Time Static"); var totalTimeInputField = - inspector.GenerateParameterInputField(this, container, "Total Time", nameof(trackTotalTime)); + inspector.GenerateInputField(this, container, "Total Time", nameof(trackTotalTime)); var animationCurveDropdown = inspector.GenerateDropdown(this, container, "Animation Curve", typeof(AnimationCurveType), nameof(animationCurveType)); var deleteButton = inspector.GenerateButton(this, container, "Delete", diff --git a/Assets/Scripts/Manager/CameraManager.cs b/Assets/Scripts/Manager/CameraManager.cs index a0e97631..4f266bee 100644 --- a/Assets/Scripts/Manager/CameraManager.cs +++ b/Assets/Scripts/Manager/CameraManager.cs @@ -42,7 +42,7 @@ namespace Ichni.Editor var container = inspector.GenerateContainer("Camera Manager"); var cameraTypeText = inspector.GenerateHintText(this, container, ShowCameraType); var switchCameraButton = inspector.GenerateButton(this, container, "Switch Camera", SwitchCamera); - var cameraMoveSpeedField = inspector.GenerateParameterInputField(this, container, "Scene Camera Move Speed", nameof(sceneCameraMoveSpeed)); + var cameraMoveSpeedField = inspector.GenerateInputField(this, container, "Scene Camera Move Speed", nameof(sceneCameraMoveSpeed)); sceneCamera.SetUpInspector(); } } diff --git a/Assets/Scripts/Manager/EditorManager.cs b/Assets/Scripts/Manager/EditorManager.cs index 00efc300..57711d44 100644 --- a/Assets/Scripts/Manager/EditorManager.cs +++ b/Assets/Scripts/Manager/EditorManager.cs @@ -15,6 +15,7 @@ namespace Ichni public static EditorManager instance; public ProjectManager projectManager; + public MusicPlayer musicPlayer; public EditorUIManager uiManager; public EditorSettings editorSettings; public OperationManager operationManager; @@ -53,7 +54,7 @@ namespace Ichni uiManager.hierarchy.GenerateTab(this, null); projectManager.loadManager.Load("TestProject"); - uiManager.timeline.musicPlayer.audioSource.clip = songInformation.song; + musicPlayer.audioSource.clip = songInformation.song; beatmapContainer.gameElementList.ForEach(gameElement => { diff --git a/Assets/Scripts/Manager/InputListener.cs b/Assets/Scripts/Manager/InputListener.cs index de01599a..2f521c68 100644 --- a/Assets/Scripts/Manager/InputListener.cs +++ b/Assets/Scripts/Manager/InputListener.cs @@ -16,8 +16,10 @@ namespace Ichni.Editor private void Update() { - if (EditorManager.instance.cameraManager.isSceneCameraActive || - !Keyboard.current.leftCtrlKey.isPressed) // 场景相机的移动和旋转 + bool isPointerOverUI = IsPointerOverUI(out GameObject hoveredUI); + + if (EditorManager.instance.cameraManager.isSceneCameraActive && + !Keyboard.current.leftCtrlKey.isPressed && !isPointerOverUI) // 场景相机的移动和旋转 { float cameraMoveSpeed = EditorManager.instance.cameraManager.sceneCameraMoveSpeed * Time.deltaTime; Transform sceneCameraTransform = EditorManager.instance.cameraManager.sceneCamera.transform; @@ -46,8 +48,6 @@ namespace Ichni.Editor sceneCameraTransform.position -= sceneCameraTransform.up * cameraMoveSpeed; } - bool isPointerOverUI = IsPointerOverUI(out GameObject hoveredUI); - if (Mouse.current.rightButton.isPressed && !isPointerOverUI) { float cameraRotateSpeed = EditorManager.instance.cameraManager.sceneCameraRotateSpeed * Time.deltaTime; @@ -61,16 +61,15 @@ namespace Ichni.Editor } } - if (eventSystem.currentSelectedGameObject == null && - Keyboard.current.enterKey.wasPressedThisFrame) // 播放或暂停音乐 + if (!isPointerOverUI && Keyboard.current.enterKey.wasPressedThisFrame) // 播放或暂停音乐 { - if (!EditorManager.instance.uiManager.timeline.musicPlayer.isPlaying) + if (!EditorManager.instance.musicPlayer.isPlaying) { - EditorManager.instance.uiManager.timeline.musicPlayer.PlayMusic(); + EditorManager.instance.musicPlayer.PlayMusic(); } else { - EditorManager.instance.uiManager.timeline.musicPlayer.PauseMusic(); + EditorManager.instance.musicPlayer.PauseMusic(); } } @@ -98,7 +97,7 @@ namespace Ichni.Editor } else if (Keyboard.current.dKey.wasPressedThisFrame) { - EditorManager.instance.operationManager.currentSelectedElement.Delete(); + EditorManager.instance.operationManager.CopyPasteDeleteModule.DeleteElement(EditorManager.instance.operationManager.currentSelectedElement); } // 开关移动设备分辨率提示 diff --git a/Assets/Scripts/DynamicUI/Timeline/MusicPlayer.cs b/Assets/Scripts/Manager/MusicPlayer.cs similarity index 67% rename from Assets/Scripts/DynamicUI/Timeline/MusicPlayer.cs rename to Assets/Scripts/Manager/MusicPlayer.cs index 3b864dc1..b5844afb 100644 --- a/Assets/Scripts/DynamicUI/Timeline/MusicPlayer.cs +++ b/Assets/Scripts/Manager/MusicPlayer.cs @@ -3,7 +3,6 @@ using System.Collections; using System.Collections.Generic; using Ichni.RhythmGame; using UnityEngine; -using UnityEngine.UI; namespace Ichni.Editor { @@ -12,16 +11,12 @@ namespace Ichni.Editor public bool isPlaying; public AudioSource audioSource; - public Button playButton; - public Button pauseButton; - public Button stopButton; - - private void Awake() + private void Update() { - audioSource = GetComponent(); - playButton.onClick.AddListener(PlayMusic); - pauseButton.onClick.AddListener(PauseMusic); - stopButton.onClick.AddListener(StopMusic); + if (isPlaying) + { + EditorManager.instance.songInformation.songTime = EditorManager.instance.musicPlayer.audioSource.time; + } } public void PlayMusic() @@ -29,8 +24,8 @@ namespace Ichni.Editor isPlaying = !isPlaying; Trail.SetAllTrails(true, false); EditorManager.instance.songInformation.songTime = audioSource.time; - if( isPlaying)audioSource.Play(); - else audioSource.Pause(); + if(isPlaying)audioSource.Play(); + else audioSource.Pause(); } public void PauseMusic() diff --git a/Assets/Scripts/Manager/MusicPlayer.cs.meta b/Assets/Scripts/Manager/MusicPlayer.cs.meta new file mode 100644 index 00000000..21ab0a9d --- /dev/null +++ b/Assets/Scripts/Manager/MusicPlayer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6c12bb7674cd5416f8d846e62018a96d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Manager/SceneCamera.cs b/Assets/Scripts/Manager/SceneCamera.cs index 6549ed27..ec76a6e8 100644 --- a/Assets/Scripts/Manager/SceneCamera.cs +++ b/Assets/Scripts/Manager/SceneCamera.cs @@ -17,38 +17,36 @@ namespace Ichni.Editor public BaseElement_BM matchedBM { get; set; } + [HideInInspector] + public Vector3 cameraPosition; //注意,这里的Position和EulerAngles,是transform的中介变量,仅能用于Inspector显示! + [HideInInspector] + public Vector3 cameraEulerAngles; + public void SetUpInspector() { IHaveInspection inspector = EditorManager.instance.uiManager.inspector; var container = inspector.GenerateContainer("Scene Camera"); var viewTypeDropdown = inspector.GenerateDropdown(this, container, "View Type", typeof(GameCamera.CameraViewType), nameof(viewType)); - var perspectiveAngleField = inspector.GenerateParameterInputField(this, container, "Perspective Angle", nameof(perspectiveAngle)); - var orthographicSizeField = inspector.GenerateParameterInputField(this, container, "Orthographic Size", nameof(orthographicSize)); + var perspectiveAngleField = inspector.GenerateInputField(this, container, "Perspective Angle", nameof(perspectiveAngle)); + var orthographicSizeField = inspector.GenerateInputField(this, container, "Orthographic Size", nameof(orthographicSize)); + viewTypeDropdown.AddListenerFunction(_ => camera.orthographic = viewType == GameCamera.CameraViewType.Orthographic); + perspectiveAngleField.AddListenerFunction(_ => camera.fieldOfView = perspectiveAngle); + orthographicSizeField.AddListenerFunction(_ => camera.orthographicSize = orthographicSize); - viewTypeDropdown.AddListenerFunction(_ => - { - camera.orthographic = viewType == GameCamera.CameraViewType.Orthographic; - }); - - perspectiveAngleField.AddListenerFunction(_ => - { - camera.fieldOfView = perspectiveAngle; - }); - - orthographicSizeField.AddListenerFunction(_ => - { - camera.orthographicSize = orthographicSize; - }); - - string GetPosition() => $"Position: {camera.transform.position}"; - var positionText = inspector.GenerateHintText(this, container, GetPosition); - string GetEulerAngles() => $"Euler Angles: {camera.transform.eulerAngles}"; - var eulerAnglesText = inspector.GenerateHintText(this, container, GetEulerAngles); + var positionInputFields = inspector.GenerateVector3InputField(this, container, "Position", nameof(cameraPosition), true); + positionInputFields.AddListenerFunction(() => camera.transform.position = cameraPosition); + + var eulerAnglesInputFields = inspector.GenerateVector3InputField(this, container, "Euler Angles", nameof(cameraEulerAngles), true); + eulerAnglesInputFields.AddListenerFunction(() => camera.transform.eulerAngles = cameraEulerAngles); + + + container.SetDeviver(1); } - public void MoveCamera(Vector3 delta) + private void Update() { - camera.transform.position += delta; + cameraPosition = camera.transform.position; + cameraEulerAngles = camera.transform.eulerAngles; } } } \ No newline at end of file diff --git a/Assets/StreamingAssets/Projects/TestProject/Beatmap.json b/Assets/StreamingAssets/Projects/TestProject/Beatmap.json index 2c39eff5..01b1e501 100644 --- a/Assets/StreamingAssets/Projects/TestProject/Beatmap.json +++ b/Assets/StreamingAssets/Projects/TestProject/Beatmap.json @@ -43,112 +43,6 @@ "attachedElementGuid" : { "value" : "ac931bb4-963e-473f-9ec6-4eb2121aed7d" } - },{ - "__type" : "Ichni.RhythmGame.Beatmap.Displacement_BM,Assembly-CSharp", - "positionX" : { - "animatedFloatList" : [ - - ] - }, - "positionY" : { - "animatedFloatList" : [ - { - "startValue" : 0, - "endValue" : 10, - "startTime" : 0, - "endTime" : 2, - "animationCurveType" : 0 - } - ] - }, - "positionZ" : { - "animatedFloatList" : [ - - ] - }, - "elementName" : "Displacement-0", - "tags" : [ - - ], - "elementGuid" : { - "value" : "4e670cae-92bf-414d-98fe-5af126b8470c" - }, - "attachedElementGuid" : { - "value" : "ac931bb4-963e-473f-9ec6-4eb2121aed7d" - } - },{ - "__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp", - "isOverridingDuration" : false, - "startTime" : -32767, - "endTime" : 32767, - "attachedElementGuid" : { - "value" : "4e670cae-92bf-414d-98fe-5af126b8470c" - } - },{ - "__type" : "Ichni.RhythmGame.Beatmap.Displacement_BM,Assembly-CSharp", - "positionX" : { - "animatedFloatList" : [ - { - "startValue" : 0, - "endValue" : -4, - "startTime" : 0, - "endTime" : 0.5, - "animationCurveType" : 2 - },{ - "startValue" : -4, - "endValue" : 0, - "startTime" : 0.5, - "endTime" : 1, - "animationCurveType" : 1 - },{ - "startValue" : 0, - "endValue" : 4, - "startTime" : 1, - "endTime" : 1.5, - "animationCurveType" : 2 - },{ - "startValue" : 4, - "endValue" : 0, - "startTime" : 1.5, - "endTime" : 2, - "animationCurveType" : 1 - } - ] - }, - "positionY" : { - "animatedFloatList" : [ - { - "startValue" : 0, - "endValue" : -10, - "startTime" : 0, - "endTime" : 2, - "animationCurveType" : 0 - } - ] - }, - "positionZ" : { - "animatedFloatList" : [ - - ] - }, - "elementName" : "Displacement-1", - "tags" : [ - - ], - "elementGuid" : { - "value" : "08f7383b-ebca-49c7-b543-94811d625215" - }, - "attachedElementGuid" : { - "value" : "ac931bb4-963e-473f-9ec6-4eb2121aed7d" - } - },{ - "__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp", - "isOverridingDuration" : false, - "startTime" : -32767, - "endTime" : 32767, - "attachedElementGuid" : { - "value" : "08f7383b-ebca-49c7-b543-94811d625215" - } },{ "__type" : "Ichni.RhythmGame.Beatmap.Track_BM,Assembly-CSharp", "elementName" : "Track", @@ -404,26 +298,6 @@ "attachedElementGuid" : { "value" : "04f7a1d6-76f2-4b15-9632-494515114d5d" } - },{ - "__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp", - "originalPosition" : { - "x" : 0, - "y" : 0, - "z" : 0 - }, - "originalEulerAngles" : { - "x" : 0, - "y" : 0, - "z" : 0 - }, - "originalScale" : { - "x" : 1, - "y" : 1, - "z" : 1 - }, - "attachedElementGuid" : { - "value" : "c5134d2c-c175-458c-99ff-07523169ec21" - } },{ "__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp", "isOverridingDuration" : false, @@ -626,6 +500,36 @@ "attachedElementGuid" : { "value" : "04f7a1d6-76f2-4b15-9632-494515114d5d" } + },{ + "__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp", + "isOverridingDuration" : false, + "startTime" : -32767, + "endTime" : 32767, + "attachedElementGuid" : { + "value" : "49905a7f-456c-491d-a607-0aebebd5ab7f" + } + },{ + "__type" : "Ichni.RhythmGame.Beatmap.NoteJudgeSubmodule_BM,Assembly-CSharp", + "judgeUnitList" : [ + + ], + "attachedElementGuid" : { + "value" : "49905a7f-456c-491d-a607-0aebebd5ab7f" + } + },{ + "__type" : "Ichni.RhythmGame.ThemeBundles.DepartureToMultiverse.Beatmap.DTMNoteVisual_BM,Assembly-CSharp", + "themeBundleName" : "departure_to_multiverse", + "objectName" : "DTM_NoteVisualTap", + "elementName" : "New Note Visual", + "tags" : [ + + ], + "elementGuid" : { + "value" : "cb918977-3e38-4d90-be47-b2170285fd71" + }, + "attachedElementGuid" : { + "value" : "49905a7f-456c-491d-a607-0aebebd5ab7f" + } },{ "__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp", "originalPosition" : { @@ -644,7 +548,7 @@ "z" : 1 }, "attachedElementGuid" : { - "value" : "49905a7f-456c-491d-a607-0aebebd5ab7f" + "value" : "cb918977-3e38-4d90-be47-b2170285fd71" } },{ "__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp", @@ -652,15 +556,124 @@ "startTime" : -32767, "endTime" : 32767, "attachedElementGuid" : { - "value" : "49905a7f-456c-491d-a607-0aebebd5ab7f" + "value" : "cb918977-3e38-4d90-be47-b2170285fd71" } },{ - "__type" : "Ichni.RhythmGame.Beatmap.NoteJudgeSubmodule_BM,Assembly-CSharp", - "judgeUnitList" : [ + "__type" : "Ichni.RhythmGame.Beatmap.ColorSubmodule_BM,Assembly-CSharp", + "originalBaseColor" : { + "r" : 1, + "g" : 1, + "b" : 1, + "a" : 1 + }, + "emissionEnabled" : false, + "originalEmissionColor" : { + "r" : 0, + "g" : 0, + "b" : 0, + "a" : 1 + }, + "originalEmissionIntensity" : 0, + "attachedElementGuid" : { + "value" : "cb918977-3e38-4d90-be47-b2170285fd71" + } + },{ + "__type" : "Ichni.RhythmGame.Beatmap.EffectSubmodule_BM,Assembly-CSharp", + "effectCollection" : {"Generate":[ + + ],"GeneralJudge":[ + + ],"Holding":[ + + ],"Perfect":[ + { + "__type" : "Ichni.RhythmGame.ThemeBundles.DepartureToMultiverse.Beatmap.DTMNotePerfectBurst_BM,Assembly-CSharp", + "effectTime" : 0 + } + ],"Good":[ + + ],"Bad":[ + + ],"Miss":[ + + ] + }, + "attachedElementGuid" : { + "value" : "cb918977-3e38-4d90-be47-b2170285fd71" + } + },{ + "__type" : "Ichni.RhythmGame.Beatmap.Displacement_BM,Assembly-CSharp", + "positionX" : { + "animatedFloatList" : [ + + ] + }, + "positionY" : { + "animatedFloatList" : [ + { + "startValue" : 0, + "endValue" : 10, + "startTime" : 0, + "endTime" : 2, + "animationCurveType" : 0 + },{ + "startValue" : 10, + "endValue" : 0, + "startTime" : 2, + "endTime" : 4, + "animationCurveType" : 0 + } + ] + }, + "positionZ" : { + "animatedFloatList" : [ + + ] + }, + "elementName" : "Displacement-0", + "tags" : [ ], + "elementGuid" : { + "value" : "4e670cae-92bf-414d-98fe-5af126b8470c" + }, "attachedElementGuid" : { - "value" : "49905a7f-456c-491d-a607-0aebebd5ab7f" + "value" : "3fdf0e9f-2d69-4f55-8167-a77ade5ac0ac" + } + },{ + "__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp", + "isOverridingDuration" : false, + "startTime" : -32767, + "endTime" : 32767, + "attachedElementGuid" : { + "value" : "4e670cae-92bf-414d-98fe-5af126b8470c" + } + },{ + "__type" : "Ichni.RhythmGame.Beatmap.TimeEffectsCollection_BM,Assembly-CSharp", + "time" : 0.3, + "elementName" : "New Time Effects Collection", + "tags" : [ + + ], + "elementGuid" : { + "value" : "c0e55af0-21a6-4d5e-bb5c-b08c28341fab" + }, + "attachedElementGuid" : { + "value" : "ac931bb4-963e-473f-9ec6-4eb2121aed7d" + } + },{ + "__type" : "Ichni.RhythmGame.Beatmap.EffectSubmodule_BM,Assembly-CSharp", + "effectCollection" : {"Default":[ + { + "__type" : "Ichni.RhythmGame.Beatmap.BloomShake_BM,Assembly-CSharp", + "bloomTime" : 0.2, + "bloomPeak" : 10, + "effectTime" : 0 + } + ] + }, + "attachedElementGuid" : { + "value" : "c0e55af0-21a6-4d5e-bb5c-b08c28341fab" } } ] diff --git a/Assets/ThemeBundles/Basic/Scripts/NoteVisual/BasicNoteBadExpand.cs b/Assets/ThemeBundles/Basic/Scripts/NoteVisual/BasicNoteBadExpand.cs index 1e83637d..390285b5 100644 --- a/Assets/ThemeBundles/Basic/Scripts/NoteVisual/BasicNoteBadExpand.cs +++ b/Assets/ThemeBundles/Basic/Scripts/NoteVisual/BasicNoteBadExpand.cs @@ -41,7 +41,7 @@ namespace Ichni.RhythmGame.ThemeBundles.Basic { IHaveInspection inspector = EditorManager.instance.uiManager.inspector; var container = inspector.GenerateContainer("Basic Note Bad Expand"); - var effectTimeField = inspector.GenerateParameterInputField(this, container, "Effect Time", nameof(effectTime)); + var effectTimeField = inspector.GenerateInputField(this, container, "Effect Time", nameof(effectTime)); } } diff --git a/Assets/ThemeBundles/Basic/Scripts/NoteVisual/BasicNoteGenerateExpand.cs b/Assets/ThemeBundles/Basic/Scripts/NoteVisual/BasicNoteGenerateExpand.cs index 85bff2ef..8ec46286 100644 --- a/Assets/ThemeBundles/Basic/Scripts/NoteVisual/BasicNoteGenerateExpand.cs +++ b/Assets/ThemeBundles/Basic/Scripts/NoteVisual/BasicNoteGenerateExpand.cs @@ -41,8 +41,8 @@ namespace Ichni.RhythmGame.ThemeBundles.Basic { IHaveInspection inspector = EditorManager.instance.uiManager.inspector; var container = inspector.GenerateContainer("Basic Note Generate Expand"); - var generateTimeField = inspector.GenerateParameterInputField(this, container, "Generate Time", nameof(generateTime)); - var effectTimeField = inspector.GenerateParameterInputField(this, container, "Effect Time", nameof(effectTime)); + var generateTimeField = inspector.GenerateInputField(this, container, "Generate Time", nameof(generateTime)); + var effectTimeField = inspector.GenerateInputField(this, container, "Effect Time", nameof(effectTime)); } } diff --git a/Assets/ThemeBundles/Basic/Scripts/NoteVisual/BasicNoteGoodBurst.cs b/Assets/ThemeBundles/Basic/Scripts/NoteVisual/BasicNoteGoodBurst.cs index 7c6c2eb2..17b889b2 100644 --- a/Assets/ThemeBundles/Basic/Scripts/NoteVisual/BasicNoteGoodBurst.cs +++ b/Assets/ThemeBundles/Basic/Scripts/NoteVisual/BasicNoteGoodBurst.cs @@ -46,7 +46,7 @@ namespace Ichni.RhythmGame.ThemeBundles.Basic { IHaveInspection inspector = EditorManager.instance.uiManager.inspector; var container = inspector.GenerateContainer("Basic Note Good Burst"); - var effectTimeField = inspector.GenerateParameterInputField(this, container, "Effect Time", nameof(effectTime)); + var effectTimeField = inspector.GenerateInputField(this, container, "Effect Time", nameof(effectTime)); } } diff --git a/Assets/ThemeBundles/Basic/Scripts/NoteVisual/BasicNoteMissPale.cs b/Assets/ThemeBundles/Basic/Scripts/NoteVisual/BasicNoteMissPale.cs index 77c22ff0..ad09e0e7 100644 --- a/Assets/ThemeBundles/Basic/Scripts/NoteVisual/BasicNoteMissPale.cs +++ b/Assets/ThemeBundles/Basic/Scripts/NoteVisual/BasicNoteMissPale.cs @@ -42,7 +42,7 @@ namespace Ichni.RhythmGame.ThemeBundles.Basic { IHaveInspection inspector = EditorManager.instance.uiManager.inspector; var container = inspector.GenerateContainer("Basic Note Miss Pale"); - var effectTimeField = inspector.GenerateParameterInputField(this, container, "Effect Time", nameof(effectTime)); + var effectTimeField = inspector.GenerateInputField(this, container, "Effect Time", nameof(effectTime)); } } diff --git a/Assets/ThemeBundles/Basic/Scripts/NoteVisual/BasicNotePerfectBurst.cs b/Assets/ThemeBundles/Basic/Scripts/NoteVisual/BasicNotePerfectBurst.cs index ea105502..ccfa3bee 100644 --- a/Assets/ThemeBundles/Basic/Scripts/NoteVisual/BasicNotePerfectBurst.cs +++ b/Assets/ThemeBundles/Basic/Scripts/NoteVisual/BasicNotePerfectBurst.cs @@ -46,7 +46,7 @@ namespace Ichni.RhythmGame.ThemeBundles.Basic { IHaveInspection inspector = EditorManager.instance.uiManager.inspector; var container = inspector.GenerateContainer("Basic Note Perfect Burst"); - var effectTimeField = inspector.GenerateParameterInputField(this, container, "Effect Time", nameof(effectTime)); + var effectTimeField = inspector.GenerateInputField(this, container, "Effect Time", nameof(effectTime)); } }