@yorkie-js/react 0.7.5 → 0.7.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5790,7 +5790,7 @@ function createGrpcWebTransport(options) {
5790
5790
  }
5791
5791
  };
5792
5792
  }
5793
- const file_src_api_yorkie_v1_resources = /* @__PURE__ */ fileDesc("CiFzcmMvYXBpL3lvcmtpZS92MS9yZXNvdXJjZXMucHJvdG8SCXlvcmtpZS52MSKuAQoIU25hcHNob3QSJAoEcm9vdBgBIAEoCzIWLnlvcmtpZS52MS5KU09ORWxlbWVudBI1CglwcmVzZW5jZXMYAiADKAsyIi55b3JraWUudjEuU25hcHNob3QuUHJlc2VuY2VzRW50cnkaRQoOUHJlc2VuY2VzRW50cnkSCwoDa2V5GAEgASgJEiIKBXZhbHVlGAIgASgLMhMueW9ya2llLnYxLlByZXNlbmNlOgI4ASL7AQoKQ2hhbmdlUGFjaxIUCgxkb2N1bWVudF9rZXkYASABKAkSKQoKY2hlY2twb2ludBgCIAEoCzIVLnlvcmtpZS52MS5DaGVja3BvaW50EhAKCHNuYXBzaG90GAMgASgMEiIKB2NoYW5nZXMYBCADKAsyES55b3JraWUudjEuQ2hhbmdlEjAKEW1pbl9zeW5jZWRfdGlja2V0GAUgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSEgoKaXNfcmVtb3ZlZBgGIAEoCBIwCg52ZXJzaW9uX3ZlY3RvchgHIAEoCzIYLnlvcmtpZS52MS5WZXJzaW9uVmVjdG9yIpgBCgZDaGFuZ2USHwoCaWQYASABKAsyEy55b3JraWUudjEuQ2hhbmdlSUQSDwoHbWVzc2FnZRgCIAEoCRIoCgpvcGVyYXRpb25zGAMgAygLMhQueW9ya2llLnYxLk9wZXJhdGlvbhIyCg9wcmVzZW5jZV9jaGFuZ2UYBCABKAsyGS55b3JraWUudjEuUHJlc2VuY2VDaGFuZ2UihwEKCENoYW5nZUlEEhIKCmNsaWVudF9zZXEYASABKA0SEgoKc2VydmVyX3NlcRgCIAEoAxIPCgdsYW1wb3J0GAMgASgDEhAKCGFjdG9yX2lkGAQgASgMEjAKDnZlcnNpb25fdmVjdG9yGAUgASgLMhgueW9ya2llLnYxLlZlcnNpb25WZWN0b3IidAoNVmVyc2lvblZlY3RvchI0CgZ2ZWN0b3IYASADKAsyJC55b3JraWUudjEuVmVyc2lvblZlY3Rvci5WZWN0b3JFbnRyeRotCgtWZWN0b3JFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAM6AjgBItkaCglPcGVyYXRpb24SJwoDc2V0GAEgASgLMhgueW9ya2llLnYxLk9wZXJhdGlvbi5TZXRIABInCgNhZGQYAiABKAsyGC55b3JraWUudjEuT3BlcmF0aW9uLkFkZEgAEikKBG1vdmUYAyABKAsyGS55b3JraWUudjEuT3BlcmF0aW9uLk1vdmVIABItCgZyZW1vdmUYBCABKAsyGy55b3JraWUudjEuT3BlcmF0aW9uLlJlbW92ZUgAEikKBGVkaXQYBSABKAsyGS55b3JraWUudjEuT3BlcmF0aW9uLkVkaXRIABIrCgVzdHlsZRgHIAEoCzIaLnlvcmtpZS52MS5PcGVyYXRpb24uU3R5bGVIABIxCghpbmNyZWFzZRgIIAEoCzIdLnlvcmtpZS52MS5PcGVyYXRpb24uSW5jcmVhc2VIABIyCgl0cmVlX2VkaXQYCSABKAsyHS55b3JraWUudjEuT3BlcmF0aW9uLlRyZWVFZGl0SAASNAoKdHJlZV9zdHlsZRgKIAEoCzIeLnlvcmtpZS52MS5PcGVyYXRpb24uVHJlZVN0eWxlSAASMgoJYXJyYXlfc2V0GAsgASgLMh0ueW9ya2llLnYxLk9wZXJhdGlvbi5BcnJheVNldEgAGp0BCgNTZXQSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBILCgNrZXkYAiABKAkSKwoFdmFsdWUYAyABKAsyHC55b3JraWUudjEuSlNPTkVsZW1lbnRTaW1wbGUSKgoLZXhlY3V0ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBrAAQoDQWRkEjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSLgoPcHJldl9jcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKwoFdmFsdWUYAyABKAsyHC55b3JraWUudjEuSlNPTkVsZW1lbnRTaW1wbGUSKgoLZXhlY3V0ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBq/AQoETW92ZRIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Ei4KD3ByZXZfY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCmNyZWF0ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIqCgtleGVjdXRlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0GpEBCgZSZW1vdmUSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKgoLZXhlY3V0ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBrZAwoERWRpdBIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EiQKBGZyb20YAiABKAsyFi55b3JraWUudjEuVGV4dE5vZGVQb3MSIgoCdG8YAyABKAsyFi55b3JraWUudjEuVGV4dE5vZGVQb3MSUwoXY3JlYXRlZF9hdF9tYXBfYnlfYWN0b3IYBCADKAsyMi55b3JraWUudjEuT3BlcmF0aW9uLkVkaXQuQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5Eg8KB2NvbnRlbnQYBSABKAkSKgoLZXhlY3V0ZWRfYXQYBiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBI9CgphdHRyaWJ1dGVzGAcgAygLMikueW9ya2llLnYxLk9wZXJhdGlvbi5FZGl0LkF0dHJpYnV0ZXNFbnRyeRpRChhDcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQ6AjgBGjEKD0F0dHJpYnV0ZXNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBGukDCgVTdHlsZRIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EiQKBGZyb20YAiABKAsyFi55b3JraWUudjEuVGV4dE5vZGVQb3MSIgoCdG8YAyABKAsyFi55b3JraWUudjEuVGV4dE5vZGVQb3MSPgoKYXR0cmlidXRlcxgEIAMoCzIqLnlvcmtpZS52MS5PcGVyYXRpb24uU3R5bGUuQXR0cmlidXRlc0VudHJ5EioKC2V4ZWN1dGVkX2F0GAUgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSVAoXY3JlYXRlZF9hdF9tYXBfYnlfYWN0b3IYBiADKAsyMy55b3JraWUudjEuT3BlcmF0aW9uLlN0eWxlLkNyZWF0ZWRBdE1hcEJ5QWN0b3JFbnRyeRIcChRhdHRyaWJ1dGVzX3RvX3JlbW92ZRgHIAMoCRoxCg9BdHRyaWJ1dGVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ARpRChhDcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQ6AjgBGqQBCghJbmNyZWFzZRIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EisKBXZhbHVlGAIgASgLMhwueW9ya2llLnYxLkpTT05FbGVtZW50U2ltcGxlEioKC2V4ZWN1dGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSDQoFYWN0b3IYBCABKAkakwMKCFRyZWVFZGl0EjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSIAoEZnJvbRgCIAEoCzISLnlvcmtpZS52MS5UcmVlUG9zEh4KAnRvGAMgASgLMhIueW9ya2llLnYxLlRyZWVQb3MSVwoXY3JlYXRlZF9hdF9tYXBfYnlfYWN0b3IYBCADKAsyNi55b3JraWUudjEuT3BlcmF0aW9uLlRyZWVFZGl0LkNyZWF0ZWRBdE1hcEJ5QWN0b3JFbnRyeRImCghjb250ZW50cxgFIAMoCzIULnlvcmtpZS52MS5UcmVlTm9kZXMSEwoLc3BsaXRfbGV2ZWwYByABKAUSKgoLZXhlY3V0ZWRfYXQYBiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBpRChhDcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQ6AjgBGu0DCglUcmVlU3R5bGUSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIgCgRmcm9tGAIgASgLMhIueW9ya2llLnYxLlRyZWVQb3MSHgoCdG8YAyABKAsyEi55b3JraWUudjEuVHJlZVBvcxJCCgphdHRyaWJ1dGVzGAQgAygLMi4ueW9ya2llLnYxLk9wZXJhdGlvbi5UcmVlU3R5bGUuQXR0cmlidXRlc0VudHJ5EioKC2V4ZWN1dGVkX2F0GAUgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSHAoUYXR0cmlidXRlc190b19yZW1vdmUYBiADKAkSWAoXY3JlYXRlZF9hdF9tYXBfYnlfYWN0b3IYByADKAsyNy55b3JraWUudjEuT3BlcmF0aW9uLlRyZWVTdHlsZS5DcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkaMQoPQXR0cmlidXRlc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaUQoYQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0OgI4ARrAAQoIQXJyYXlTZXQSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKwoFdmFsdWUYAyABKAsyHC55b3JraWUudjEuSlNPTkVsZW1lbnRTaW1wbGUSKgoLZXhlY3V0ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldEIGCgRib2R5IsUBChFKU09ORWxlbWVudFNpbXBsZRIpCgpjcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSIgoEdHlwZRgEIAEoDjIULnlvcmtpZS52MS5WYWx1ZVR5cGUSDQoFdmFsdWUYBSABKAwinwsKC0pTT05FbGVtZW50EjgKC2pzb25fb2JqZWN0GAEgASgLMiEueW9ya2llLnYxLkpTT05FbGVtZW50LkpTT05PYmplY3RIABI2Cgpqc29uX2FycmF5GAIgASgLMiAueW9ya2llLnYxLkpTT05FbGVtZW50LkpTT05BcnJheUgAEjUKCXByaW1pdGl2ZRgDIAEoCzIgLnlvcmtpZS52MS5KU09ORWxlbWVudC5QcmltaXRpdmVIABIrCgR0ZXh0GAUgASgLMhsueW9ya2llLnYxLkpTT05FbGVtZW50LlRleHRIABIxCgdjb3VudGVyGAYgASgLMh4ueW9ya2llLnYxLkpTT05FbGVtZW50LkNvdW50ZXJIABIrCgR0cmVlGAcgASgLMhsueW9ya2llLnYxLkpTT05FbGVtZW50LlRyZWVIABquAQoKSlNPTk9iamVjdBIhCgVub2RlcxgBIAMoCzISLnlvcmtpZS52MS5SSFROb2RlEikKCmNyZWF0ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBInCghtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCnJlbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBqtAQoJSlNPTkFycmF5EiEKBW5vZGVzGAEgAygLMhIueW9ya2llLnYxLlJHQU5vZGUSKQoKY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Gr0BCglQcmltaXRpdmUSIgoEdHlwZRgBIAEoDjIULnlvcmtpZS52MS5WYWx1ZVR5cGUSDQoFdmFsdWUYAiABKAwSKQoKY3JlYXRlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0GqkBCgRUZXh0EiIKBW5vZGVzGAEgAygLMhMueW9ya2llLnYxLlRleHROb2RlEikKCmNyZWF0ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBInCghtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCnJlbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBrYAQoHQ291bnRlchIiCgR0eXBlGAEgASgOMhQueW9ya2llLnYxLlZhbHVlVHlwZRINCgV2YWx1ZRgCIAEoDBIpCgpjcmVhdGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAUgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSFQoNaGxsX3JlZ2lzdGVycxgHIAEoDEoECAYQBxqpAQoEVHJlZRIiCgVub2RlcxgBIAMoCzITLnlvcmtpZS52MS5UcmVlTm9kZRIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXRCBgoEYm9keSI/CgdSSFROb2RlEgsKA2tleRgBIAEoCRInCgdlbGVtZW50GAIgASgLMhYueW9ya2llLnYxLkpTT05FbGVtZW50IlQKB1JHQU5vZGUSIAoEbmV4dBgBIAEoCzISLnlvcmtpZS52MS5SR0FOb2RlEicKB2VsZW1lbnQYAiABKAsyFi55b3JraWUudjEuSlNPTkVsZW1lbnQiWAoITm9kZUF0dHISDQoFdmFsdWUYASABKAkSKQoKdXBkYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhIKCmlzX3JlbW92ZWQYAyABKAgilAIKCFRleHROb2RlEiEKAmlkGAEgASgLMhUueW9ya2llLnYxLlRleHROb2RlSUQSDQoFdmFsdWUYAiABKAkSKQoKcmVtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EioKC2luc19wcmV2X2lkGAQgASgLMhUueW9ya2llLnYxLlRleHROb2RlSUQSNwoKYXR0cmlidXRlcxgFIAMoCzIjLnlvcmtpZS52MS5UZXh0Tm9kZS5BdHRyaWJ1dGVzRW50cnkaRgoPQXR0cmlidXRlc0VudHJ5EgsKA2tleRgBIAEoCRIiCgV2YWx1ZRgCIAEoCzITLnlvcmtpZS52MS5Ob2RlQXR0cjoCOAEiRwoKVGV4dE5vZGVJRBIpCgpjcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSDgoGb2Zmc2V0GAIgASgFIrMDCghUcmVlTm9kZRIhCgJpZBgBIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEgwKBHR5cGUYAiABKAkSDQoFdmFsdWUYAyABKAkSKQoKcmVtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EioKC2luc19wcmV2X2lkGAUgASgLMhUueW9ya2llLnYxLlRyZWVOb2RlSUQSKgoLaW5zX25leHRfaWQYBiABKAsyFS55b3JraWUudjEuVHJlZU5vZGVJRBINCgVkZXB0aBgHIAEoBRI3CgphdHRyaWJ1dGVzGAggAygLMiMueW9ya2llLnYxLlRyZWVOb2RlLkF0dHJpYnV0ZXNFbnRyeRIqCgttZXJnZWRfZnJvbRgJIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEigKCW1lcmdlZF9hdBgKIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0GkYKD0F0dHJpYnV0ZXNFbnRyeRILCgNrZXkYASABKAkSIgoFdmFsdWUYAiABKAsyEy55b3JraWUudjEuTm9kZUF0dHI6AjgBIjEKCVRyZWVOb2RlcxIkCgdjb250ZW50GAEgAygLMhMueW9ya2llLnYxLlRyZWVOb2RlIkcKClRyZWVOb2RlSUQSKQoKY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Eg4KBm9mZnNldBgCIAEoBSJjCgdUcmVlUG9zEigKCXBhcmVudF9pZBgBIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEi4KD2xlZnRfc2libGluZ19pZBgCIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEImsKBFVzZXISCgoCaWQYASABKAkSFQoNYXV0aF9wcm92aWRlchgCIAEoCRIQCgh1c2VybmFtZRgDIAEoCRIuCgpjcmVhdGVkX2F0GAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCKJAQoGTWVtYmVyEgoKAmlkGAEgASgJEhIKCnByb2plY3RfaWQYAiABKAkSDwoHdXNlcl9pZBgDIAEoCRIQCgh1c2VybmFtZRgEIAEoCRIMCgRyb2xlGAUgASgJEi4KCmludml0ZWRfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIukGCgdQcm9qZWN0EgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSEgoKcHVibGljX2tleRgDIAEoCRISCgpzZWNyZXRfa2V5GAQgASgJEhgKEGF1dGhfd2ViaG9va191cmwYBSABKAkSHAoUYXV0aF93ZWJob29rX21ldGhvZHMYBiADKAkSIAoYYXV0aF93ZWJob29rX21heF9yZXRyaWVzGBEgASgEEiYKHmF1dGhfd2ViaG9va19taW5fd2FpdF9pbnRlcnZhbBgSIAEoCRImCh5hdXRoX3dlYmhvb2tfbWF4X3dhaXRfaW50ZXJ2YWwYEyABKAkSJAocYXV0aF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgUIAEoCRIZChFldmVudF93ZWJob29rX3VybBgHIAEoCRIcChRldmVudF93ZWJob29rX2V2ZW50cxgIIAMoCRIhChlldmVudF93ZWJob29rX21heF9yZXRyaWVzGBUgASgEEicKH2V2ZW50X3dlYmhvb2tfbWluX3dhaXRfaW50ZXJ2YWwYFiABKAkSJwofZXZlbnRfd2ViaG9va19tYXhfd2FpdF9pbnRlcnZhbBgXIAEoCRIlCh1ldmVudF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgYIAEoCRIjChtjbGllbnRfZGVhY3RpdmF0ZV90aHJlc2hvbGQYCSABKAkSGgoSc25hcHNob3RfdGhyZXNob2xkGBkgASgDEhkKEXNuYXBzaG90X2ludGVydmFsGBogASgDEiQKHG1heF9zdWJzY3JpYmVyc19wZXJfZG9jdW1lbnQYCiABKAUSJAocbWF4X2F0dGFjaG1lbnRzX3Blcl9kb2N1bWVudBgLIAEoBRIdChVtYXhfc2l6ZV9wZXJfZG9jdW1lbnQYDyABKAUSGAoQcmVtb3ZlX29uX2RldGFjaBgQIAEoCBIdChVhdXRvX3JldmlzaW9uX2VuYWJsZWQYGyABKAgSFwoPYWxsb3dlZF9vcmlnaW5zGA4gAygJEi4KCmNyZWF0ZWRfYXQYDCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCnVwZGF0ZWRfYXQYDSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIi8KC01ldHJpY1BvaW50EhEKCXRpbWVzdGFtcBgBIAEoAxINCgV2YWx1ZRgCIAEoBSKjDAoWVXBkYXRhYmxlUHJvamVjdEZpZWxkcxIqCgRuYW1lGAEgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlEjYKEGF1dGhfd2ViaG9va191cmwYAiABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSUgoUYXV0aF93ZWJob29rX21ldGhvZHMYAyABKAsyNC55b3JraWUudjEuVXBkYXRhYmxlUHJvamVjdEZpZWxkcy5BdXRoV2ViaG9va01ldGhvZHMSPgoYYXV0aF93ZWJob29rX21heF9yZXRyaWVzGAwgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlEkQKHmF1dGhfd2ViaG9va19taW5fd2FpdF9pbnRlcnZhbBgNIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJECh5hdXRoX3dlYmhvb2tfbWF4X3dhaXRfaW50ZXJ2YWwYDiABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSQgocYXV0aF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgPIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRI3ChFldmVudF93ZWJob29rX3VybBgEIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJSChRldmVudF93ZWJob29rX2V2ZW50cxgFIAEoCzI0LnlvcmtpZS52MS5VcGRhdGFibGVQcm9qZWN0RmllbGRzLkV2ZW50V2ViaG9va0V2ZW50cxI/ChlldmVudF93ZWJob29rX21heF9yZXRyaWVzGBAgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlEkUKH2V2ZW50X3dlYmhvb2tfbWluX3dhaXRfaW50ZXJ2YWwYESABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSRQofZXZlbnRfd2ViaG9va19tYXhfd2FpdF9pbnRlcnZhbBgSIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJDCh1ldmVudF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgTIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRI3ChJzbmFwc2hvdF90aHJlc2hvbGQYFCABKAsyGy5nb29nbGUucHJvdG9idWYuSW50NjRWYWx1ZRI2ChFzbmFwc2hvdF9pbnRlcnZhbBgVIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlEkEKG2NsaWVudF9kZWFjdGl2YXRlX3RocmVzaG9sZBgGIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJBChxtYXhfc3Vic2NyaWJlcnNfcGVyX2RvY3VtZW50GAcgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWUSQQocbWF4X2F0dGFjaG1lbnRzX3Blcl9kb2N1bWVudBgIIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlEjoKFW1heF9zaXplX3Blcl9kb2N1bWVudBgKIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlEjQKEHJlbW92ZV9vbl9kZXRhY2gYCyABKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlEjkKFWF1dG9fcmV2aXNpb25fZW5hYmxlZBgWIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWUSSQoPYWxsb3dlZF9vcmlnaW5zGAkgASgLMjAueW9ya2llLnYxLlVwZGF0YWJsZVByb2plY3RGaWVsZHMuQWxsb3dlZE9yaWdpbnMaJQoSQXV0aFdlYmhvb2tNZXRob2RzEg8KB21ldGhvZHMYASADKAkaJAoSRXZlbnRXZWJob29rRXZlbnRzEg4KBmV2ZW50cxgBIAMoCRohCg5BbGxvd2VkT3JpZ2lucxIPCgdvcmlnaW5zGAEgAygJIqcDCg9Eb2N1bWVudFN1bW1hcnkSCgoCaWQYASABKAkSCwoDa2V5GAIgASgJEgwKBHJvb3QYAyABKAkSGAoQYXR0YWNoZWRfY2xpZW50cxgHIAEoBRIpCg1kb2N1bWVudF9zaXplGAggASgLMhIueW9ya2llLnYxLkRvY1NpemUSEgoKc2NoZW1hX2tleRgJIAEoCRI8CglwcmVzZW5jZXMYCiADKAsyKS55b3JraWUudjEuRG9jdW1lbnRTdW1tYXJ5LlByZXNlbmNlc0VudHJ5Ei4KCmNyZWF0ZWRfYXQYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi8KC2FjY2Vzc2VkX2F0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgp1cGRhdGVkX2F0GAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBpFCg5QcmVzZW5jZXNFbnRyeRILCgNrZXkYASABKAkSIgoFdmFsdWUYAiABKAsyEy55b3JraWUudjEuUHJlc2VuY2U6AjgBItoBCg5QcmVzZW5jZUNoYW5nZRIyCgR0eXBlGAEgASgOMiQueW9ya2llLnYxLlByZXNlbmNlQ2hhbmdlLkNoYW5nZVR5cGUSJQoIcHJlc2VuY2UYAiABKAsyEy55b3JraWUudjEuUHJlc2VuY2UibQoKQ2hhbmdlVHlwZRIbChdDSEFOR0VfVFlQRV9VTlNQRUNJRklFRBAAEhMKD0NIQU5HRV9UWVBFX1BVVBABEhYKEkNIQU5HRV9UWVBFX0RFTEVURRACEhUKEUNIQU5HRV9UWVBFX0NMRUFSEAMiZAoIUHJlc2VuY2USKwoEZGF0YRgBIAMoCzIdLnlvcmtpZS52MS5QcmVzZW5jZS5EYXRhRW50cnkaKwoJRGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEiNAoOQ2hhbm5lbFN1bW1hcnkSCwoDa2V5GAEgASgJEhUKDXNlc3Npb25fY291bnQYAiABKAUiNAoKQ2hlY2twb2ludBISCgpzZXJ2ZXJfc2VxGAEgASgDEhIKCmNsaWVudF9zZXEYAiABKA0iYQoLVGV4dE5vZGVQb3MSKQoKY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Eg4KBm9mZnNldBgCIAEoBRIXCg9yZWxhdGl2ZV9vZmZzZXQYAyABKAUiQgoKVGltZVRpY2tldBIPCgdsYW1wb3J0GAEgASgDEhEKCWRlbGltaXRlchgCIAEoDRIQCghhY3Rvcl9pZBgDIAEoDCIuCgxEb2NFdmVudEJvZHkSDQoFdG9waWMYASABKAkSDwoHcGF5bG9hZBgCIAEoDCJrCghEb2NFdmVudBIlCgR0eXBlGAEgASgOMhcueW9ya2llLnYxLkRvY0V2ZW50VHlwZRIRCglwdWJsaXNoZXIYAiABKAkSJQoEYm9keRgDIAEoCzIXLnlvcmtpZS52MS5Eb2NFdmVudEJvZHki1gEKDENoYW5uZWxFdmVudBIqCgR0eXBlGAEgASgOMhwueW9ya2llLnYxLkNoYW5uZWxFdmVudC5UeXBlEhEKCXB1Ymxpc2hlchgCIAEoCRIVCg1zZXNzaW9uX2NvdW50GAMgASgDEgsKA3NlcRgEIAEoAxINCgV0b3BpYxgFIAEoCRIPCgdwYXlsb2FkGAYgASgMIkMKBFR5cGUSFAoQVFlQRV9VTlNQRUNJRklFRBAAEhEKDVRZUEVfUFJFU0VOQ0UQARISCg5UWVBFX0JST0FEQ0FTVBACIiYKCERhdGFTaXplEgwKBGRhdGEYASABKAUSDAoEbWV0YRgCIAEoBSJNCgdEb2NTaXplEiEKBGxpdmUYASABKAsyEy55b3JraWUudjEuRGF0YVNpemUSHwoCZ2MYAiABKAsyEy55b3JraWUudjEuRGF0YVNpemUikQEKBlNjaGVtYRIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEg8KB3ZlcnNpb24YAyABKAUSDAoEYm9keRgEIAEoCRIeCgVydWxlcxgFIAMoCzIPLnlvcmtpZS52MS5SdWxlEi4KCmNyZWF0ZWRfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIlAKDFRyZWVOb2RlUnVsZRIRCglub2RlX3R5cGUYASABKAkSDwoHY29udGVudBgCIAEoCRINCgVtYXJrcxgDIAEoCRINCgVncm91cBgEIAEoCSJPCgRSdWxlEgwKBHBhdGgYASABKAkSDAoEdHlwZRgCIAEoCRIrCgp0cmVlX25vZGVzGAMgAygLMhcueW9ya2llLnYxLlRyZWVOb2RlUnVsZSKDAQoPUmV2aXNpb25TdW1tYXJ5EgoKAmlkGAEgASgJEg0KBWxhYmVsGAIgASgJEhMKC2Rlc2NyaXB0aW9uGAMgASgJEhAKCHNuYXBzaG90GAQgASgJEi4KCmNyZWF0ZWRfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wKvwCCglWYWx1ZVR5cGUSEwoPVkFMVUVfVFlQRV9OVUxMEAASFgoSVkFMVUVfVFlQRV9CT09MRUFOEAESFgoSVkFMVUVfVFlQRV9JTlRFR0VSEAISEwoPVkFMVUVfVFlQRV9MT05HEAMSFQoRVkFMVUVfVFlQRV9ET1VCTEUQBBIVChFWQUxVRV9UWVBFX1NUUklORxAFEhQKEFZBTFVFX1RZUEVfQllURVMQBhITCg9WQUxVRV9UWVBFX0RBVEUQBxIaChZWQUxVRV9UWVBFX0pTT05fT0JKRUNUEAgSGQoVVkFMVUVfVFlQRV9KU09OX0FSUkFZEAkSEwoPVkFMVUVfVFlQRV9URVhUEAoSGgoWVkFMVUVfVFlQRV9JTlRFR0VSX0NOVBALEhcKE1ZBTFVFX1RZUEVfTE9OR19DTlQQDBITCg9WQUxVRV9UWVBFX1RSRUUQDRIgChxWQUxVRV9UWVBFX0lOVEVHRVJfREVEVVBfQ05UEA4iBAgPEA8qpgEKDERvY0V2ZW50VHlwZRIjCh9ET0NfRVZFTlRfVFlQRV9ET0NVTUVOVF9DSEFOR0VEEAASIwofRE9DX0VWRU5UX1RZUEVfRE9DVU1FTlRfV0FUQ0hFRBABEiUKIURPQ19FVkVOVF9UWVBFX0RPQ1VNRU5UX1VOV0FUQ0hFRBACEiUKIURPQ19FVkVOVF9UWVBFX0RPQ1VNRU5UX0JST0FEQ0FTVBADQkUKEWRldi55b3JraWUuYXBpLnYxUAFaLmdpdGh1Yi5jb20veW9ya2llLXRlYW0veW9ya2llL2FwaS95b3JraWUvdjE7djFiBnByb3RvMw", [file_google_protobuf_timestamp, file_google_protobuf_wrappers]);
5793
+ const file_src_api_yorkie_v1_resources = /* @__PURE__ */ fileDesc("CiFzcmMvYXBpL3lvcmtpZS92MS9yZXNvdXJjZXMucHJvdG8SCXlvcmtpZS52MSKuAQoIU25hcHNob3QSJAoEcm9vdBgBIAEoCzIWLnlvcmtpZS52MS5KU09ORWxlbWVudBI1CglwcmVzZW5jZXMYAiADKAsyIi55b3JraWUudjEuU25hcHNob3QuUHJlc2VuY2VzRW50cnkaRQoOUHJlc2VuY2VzRW50cnkSCwoDa2V5GAEgASgJEiIKBXZhbHVlGAIgASgLMhMueW9ya2llLnYxLlByZXNlbmNlOgI4ASL7AQoKQ2hhbmdlUGFjaxIUCgxkb2N1bWVudF9rZXkYASABKAkSKQoKY2hlY2twb2ludBgCIAEoCzIVLnlvcmtpZS52MS5DaGVja3BvaW50EhAKCHNuYXBzaG90GAMgASgMEiIKB2NoYW5nZXMYBCADKAsyES55b3JraWUudjEuQ2hhbmdlEjAKEW1pbl9zeW5jZWRfdGlja2V0GAUgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSEgoKaXNfcmVtb3ZlZBgGIAEoCBIwCg52ZXJzaW9uX3ZlY3RvchgHIAEoCzIYLnlvcmtpZS52MS5WZXJzaW9uVmVjdG9yIpgBCgZDaGFuZ2USHwoCaWQYASABKAsyEy55b3JraWUudjEuQ2hhbmdlSUQSDwoHbWVzc2FnZRgCIAEoCRIoCgpvcGVyYXRpb25zGAMgAygLMhQueW9ya2llLnYxLk9wZXJhdGlvbhIyCg9wcmVzZW5jZV9jaGFuZ2UYBCABKAsyGS55b3JraWUudjEuUHJlc2VuY2VDaGFuZ2UihwEKCENoYW5nZUlEEhIKCmNsaWVudF9zZXEYASABKA0SEgoKc2VydmVyX3NlcRgCIAEoAxIPCgdsYW1wb3J0GAMgASgDEhAKCGFjdG9yX2lkGAQgASgMEjAKDnZlcnNpb25fdmVjdG9yGAUgASgLMhgueW9ya2llLnYxLlZlcnNpb25WZWN0b3IidAoNVmVyc2lvblZlY3RvchI0CgZ2ZWN0b3IYASADKAsyJC55b3JraWUudjEuVmVyc2lvblZlY3Rvci5WZWN0b3JFbnRyeRotCgtWZWN0b3JFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAM6AjgBItkaCglPcGVyYXRpb24SJwoDc2V0GAEgASgLMhgueW9ya2llLnYxLk9wZXJhdGlvbi5TZXRIABInCgNhZGQYAiABKAsyGC55b3JraWUudjEuT3BlcmF0aW9uLkFkZEgAEikKBG1vdmUYAyABKAsyGS55b3JraWUudjEuT3BlcmF0aW9uLk1vdmVIABItCgZyZW1vdmUYBCABKAsyGy55b3JraWUudjEuT3BlcmF0aW9uLlJlbW92ZUgAEikKBGVkaXQYBSABKAsyGS55b3JraWUudjEuT3BlcmF0aW9uLkVkaXRIABIrCgVzdHlsZRgHIAEoCzIaLnlvcmtpZS52MS5PcGVyYXRpb24uU3R5bGVIABIxCghpbmNyZWFzZRgIIAEoCzIdLnlvcmtpZS52MS5PcGVyYXRpb24uSW5jcmVhc2VIABIyCgl0cmVlX2VkaXQYCSABKAsyHS55b3JraWUudjEuT3BlcmF0aW9uLlRyZWVFZGl0SAASNAoKdHJlZV9zdHlsZRgKIAEoCzIeLnlvcmtpZS52MS5PcGVyYXRpb24uVHJlZVN0eWxlSAASMgoJYXJyYXlfc2V0GAsgASgLMh0ueW9ya2llLnYxLk9wZXJhdGlvbi5BcnJheVNldEgAGp0BCgNTZXQSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBILCgNrZXkYAiABKAkSKwoFdmFsdWUYAyABKAsyHC55b3JraWUudjEuSlNPTkVsZW1lbnRTaW1wbGUSKgoLZXhlY3V0ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBrAAQoDQWRkEjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSLgoPcHJldl9jcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKwoFdmFsdWUYAyABKAsyHC55b3JraWUudjEuSlNPTkVsZW1lbnRTaW1wbGUSKgoLZXhlY3V0ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBq/AQoETW92ZRIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Ei4KD3ByZXZfY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCmNyZWF0ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIqCgtleGVjdXRlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0GpEBCgZSZW1vdmUSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKgoLZXhlY3V0ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBrZAwoERWRpdBIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EiQKBGZyb20YAiABKAsyFi55b3JraWUudjEuVGV4dE5vZGVQb3MSIgoCdG8YAyABKAsyFi55b3JraWUudjEuVGV4dE5vZGVQb3MSUwoXY3JlYXRlZF9hdF9tYXBfYnlfYWN0b3IYBCADKAsyMi55b3JraWUudjEuT3BlcmF0aW9uLkVkaXQuQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5Eg8KB2NvbnRlbnQYBSABKAkSKgoLZXhlY3V0ZWRfYXQYBiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBI9CgphdHRyaWJ1dGVzGAcgAygLMikueW9ya2llLnYxLk9wZXJhdGlvbi5FZGl0LkF0dHJpYnV0ZXNFbnRyeRpRChhDcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQ6AjgBGjEKD0F0dHJpYnV0ZXNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBGukDCgVTdHlsZRIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EiQKBGZyb20YAiABKAsyFi55b3JraWUudjEuVGV4dE5vZGVQb3MSIgoCdG8YAyABKAsyFi55b3JraWUudjEuVGV4dE5vZGVQb3MSPgoKYXR0cmlidXRlcxgEIAMoCzIqLnlvcmtpZS52MS5PcGVyYXRpb24uU3R5bGUuQXR0cmlidXRlc0VudHJ5EioKC2V4ZWN1dGVkX2F0GAUgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSVAoXY3JlYXRlZF9hdF9tYXBfYnlfYWN0b3IYBiADKAsyMy55b3JraWUudjEuT3BlcmF0aW9uLlN0eWxlLkNyZWF0ZWRBdE1hcEJ5QWN0b3JFbnRyeRIcChRhdHRyaWJ1dGVzX3RvX3JlbW92ZRgHIAMoCRoxCg9BdHRyaWJ1dGVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ARpRChhDcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQ6AjgBGqQBCghJbmNyZWFzZRIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EisKBXZhbHVlGAIgASgLMhwueW9ya2llLnYxLkpTT05FbGVtZW50U2ltcGxlEioKC2V4ZWN1dGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSDQoFYWN0b3IYBCABKAkakwMKCFRyZWVFZGl0EjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSIAoEZnJvbRgCIAEoCzISLnlvcmtpZS52MS5UcmVlUG9zEh4KAnRvGAMgASgLMhIueW9ya2llLnYxLlRyZWVQb3MSVwoXY3JlYXRlZF9hdF9tYXBfYnlfYWN0b3IYBCADKAsyNi55b3JraWUudjEuT3BlcmF0aW9uLlRyZWVFZGl0LkNyZWF0ZWRBdE1hcEJ5QWN0b3JFbnRyeRImCghjb250ZW50cxgFIAMoCzIULnlvcmtpZS52MS5UcmVlTm9kZXMSEwoLc3BsaXRfbGV2ZWwYByABKAUSKgoLZXhlY3V0ZWRfYXQYBiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBpRChhDcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQ6AjgBGu0DCglUcmVlU3R5bGUSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIgCgRmcm9tGAIgASgLMhIueW9ya2llLnYxLlRyZWVQb3MSHgoCdG8YAyABKAsyEi55b3JraWUudjEuVHJlZVBvcxJCCgphdHRyaWJ1dGVzGAQgAygLMi4ueW9ya2llLnYxLk9wZXJhdGlvbi5UcmVlU3R5bGUuQXR0cmlidXRlc0VudHJ5EioKC2V4ZWN1dGVkX2F0GAUgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSHAoUYXR0cmlidXRlc190b19yZW1vdmUYBiADKAkSWAoXY3JlYXRlZF9hdF9tYXBfYnlfYWN0b3IYByADKAsyNy55b3JraWUudjEuT3BlcmF0aW9uLlRyZWVTdHlsZS5DcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkaMQoPQXR0cmlidXRlc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaUQoYQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0OgI4ARrAAQoIQXJyYXlTZXQSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKwoFdmFsdWUYAyABKAsyHC55b3JraWUudjEuSlNPTkVsZW1lbnRTaW1wbGUSKgoLZXhlY3V0ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldEIGCgRib2R5IsUBChFKU09ORWxlbWVudFNpbXBsZRIpCgpjcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSIgoEdHlwZRgEIAEoDjIULnlvcmtpZS52MS5WYWx1ZVR5cGUSDQoFdmFsdWUYBSABKAwinwsKC0pTT05FbGVtZW50EjgKC2pzb25fb2JqZWN0GAEgASgLMiEueW9ya2llLnYxLkpTT05FbGVtZW50LkpTT05PYmplY3RIABI2Cgpqc29uX2FycmF5GAIgASgLMiAueW9ya2llLnYxLkpTT05FbGVtZW50LkpTT05BcnJheUgAEjUKCXByaW1pdGl2ZRgDIAEoCzIgLnlvcmtpZS52MS5KU09ORWxlbWVudC5QcmltaXRpdmVIABIrCgR0ZXh0GAUgASgLMhsueW9ya2llLnYxLkpTT05FbGVtZW50LlRleHRIABIxCgdjb3VudGVyGAYgASgLMh4ueW9ya2llLnYxLkpTT05FbGVtZW50LkNvdW50ZXJIABIrCgR0cmVlGAcgASgLMhsueW9ya2llLnYxLkpTT05FbGVtZW50LlRyZWVIABquAQoKSlNPTk9iamVjdBIhCgVub2RlcxgBIAMoCzISLnlvcmtpZS52MS5SSFROb2RlEikKCmNyZWF0ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBInCghtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCnJlbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBqtAQoJSlNPTkFycmF5EiEKBW5vZGVzGAEgAygLMhIueW9ya2llLnYxLlJHQU5vZGUSKQoKY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Gr0BCglQcmltaXRpdmUSIgoEdHlwZRgBIAEoDjIULnlvcmtpZS52MS5WYWx1ZVR5cGUSDQoFdmFsdWUYAiABKAwSKQoKY3JlYXRlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0GqkBCgRUZXh0EiIKBW5vZGVzGAEgAygLMhMueW9ya2llLnYxLlRleHROb2RlEikKCmNyZWF0ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBInCghtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCnJlbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBrYAQoHQ291bnRlchIiCgR0eXBlGAEgASgOMhQueW9ya2llLnYxLlZhbHVlVHlwZRINCgV2YWx1ZRgCIAEoDBIpCgpjcmVhdGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAUgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSFQoNaGxsX3JlZ2lzdGVycxgHIAEoDEoECAYQBxqpAQoEVHJlZRIiCgVub2RlcxgBIAMoCzITLnlvcmtpZS52MS5UcmVlTm9kZRIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXRCBgoEYm9keSI/CgdSSFROb2RlEgsKA2tleRgBIAEoCRInCgdlbGVtZW50GAIgASgLMhYueW9ya2llLnYxLkpTT05FbGVtZW50Iu4BCgdSR0FOb2RlEiAKBG5leHQYASABKAsyEi55b3JraWUudjEuUkdBTm9kZRInCgdlbGVtZW50GAIgASgLMhYueW9ya2llLnYxLkpTT05FbGVtZW50EjIKE3Bvc2l0aW9uX2NyZWF0ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIwChFwb3NpdGlvbl9tb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EjIKE3Bvc2l0aW9uX3JlbW92ZWRfYXQYBSABKAsyFS55b3JraWUudjEuVGltZVRpY2tldCJYCghOb2RlQXR0chINCgV2YWx1ZRgBIAEoCRIpCgp1cGRhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSEgoKaXNfcmVtb3ZlZBgDIAEoCCKUAgoIVGV4dE5vZGUSIQoCaWQYASABKAsyFS55b3JraWUudjEuVGV4dE5vZGVJRBINCgV2YWx1ZRgCIAEoCRIpCgpyZW1vdmVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKgoLaW5zX3ByZXZfaWQYBCABKAsyFS55b3JraWUudjEuVGV4dE5vZGVJRBI3CgphdHRyaWJ1dGVzGAUgAygLMiMueW9ya2llLnYxLlRleHROb2RlLkF0dHJpYnV0ZXNFbnRyeRpGCg9BdHRyaWJ1dGVzRW50cnkSCwoDa2V5GAEgASgJEiIKBXZhbHVlGAIgASgLMhMueW9ya2llLnYxLk5vZGVBdHRyOgI4ASJHCgpUZXh0Tm9kZUlEEikKCmNyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIOCgZvZmZzZXQYAiABKAUiswMKCFRyZWVOb2RlEiEKAmlkGAEgASgLMhUueW9ya2llLnYxLlRyZWVOb2RlSUQSDAoEdHlwZRgCIAEoCRINCgV2YWx1ZRgDIAEoCRIpCgpyZW1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKgoLaW5zX3ByZXZfaWQYBSABKAsyFS55b3JraWUudjEuVHJlZU5vZGVJRBIqCgtpbnNfbmV4dF9pZBgGIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEg0KBWRlcHRoGAcgASgFEjcKCmF0dHJpYnV0ZXMYCCADKAsyIy55b3JraWUudjEuVHJlZU5vZGUuQXR0cmlidXRlc0VudHJ5EioKC21lcmdlZF9mcm9tGAkgASgLMhUueW9ya2llLnYxLlRyZWVOb2RlSUQSKAoJbWVyZ2VkX2F0GAogASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQaRgoPQXR0cmlidXRlc0VudHJ5EgsKA2tleRgBIAEoCRIiCgV2YWx1ZRgCIAEoCzITLnlvcmtpZS52MS5Ob2RlQXR0cjoCOAEiMQoJVHJlZU5vZGVzEiQKB2NvbnRlbnQYASADKAsyEy55b3JraWUudjEuVHJlZU5vZGUiRwoKVHJlZU5vZGVJRBIpCgpjcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSDgoGb2Zmc2V0GAIgASgFImMKB1RyZWVQb3MSKAoJcGFyZW50X2lkGAEgASgLMhUueW9ya2llLnYxLlRyZWVOb2RlSUQSLgoPbGVmdF9zaWJsaW5nX2lkGAIgASgLMhUueW9ya2llLnYxLlRyZWVOb2RlSUQiawoEVXNlchIKCgJpZBgBIAEoCRIVCg1hdXRoX3Byb3ZpZGVyGAIgASgJEhAKCHVzZXJuYW1lGAMgASgJEi4KCmNyZWF0ZWRfYXQYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIokBCgZNZW1iZXISCgoCaWQYASABKAkSEgoKcHJvamVjdF9pZBgCIAEoCRIPCgd1c2VyX2lkGAMgASgJEhAKCHVzZXJuYW1lGAQgASgJEgwKBHJvbGUYBSABKAkSLgoKaW52aXRlZF9hdBgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAi6QYKB1Byb2plY3QSCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCRISCgpwdWJsaWNfa2V5GAMgASgJEhIKCnNlY3JldF9rZXkYBCABKAkSGAoQYXV0aF93ZWJob29rX3VybBgFIAEoCRIcChRhdXRoX3dlYmhvb2tfbWV0aG9kcxgGIAMoCRIgChhhdXRoX3dlYmhvb2tfbWF4X3JldHJpZXMYESABKAQSJgoeYXV0aF93ZWJob29rX21pbl93YWl0X2ludGVydmFsGBIgASgJEiYKHmF1dGhfd2ViaG9va19tYXhfd2FpdF9pbnRlcnZhbBgTIAEoCRIkChxhdXRoX3dlYmhvb2tfcmVxdWVzdF90aW1lb3V0GBQgASgJEhkKEWV2ZW50X3dlYmhvb2tfdXJsGAcgASgJEhwKFGV2ZW50X3dlYmhvb2tfZXZlbnRzGAggAygJEiEKGWV2ZW50X3dlYmhvb2tfbWF4X3JldHJpZXMYFSABKAQSJwofZXZlbnRfd2ViaG9va19taW5fd2FpdF9pbnRlcnZhbBgWIAEoCRInCh9ldmVudF93ZWJob29rX21heF93YWl0X2ludGVydmFsGBcgASgJEiUKHWV2ZW50X3dlYmhvb2tfcmVxdWVzdF90aW1lb3V0GBggASgJEiMKG2NsaWVudF9kZWFjdGl2YXRlX3RocmVzaG9sZBgJIAEoCRIaChJzbmFwc2hvdF90aHJlc2hvbGQYGSABKAMSGQoRc25hcHNob3RfaW50ZXJ2YWwYGiABKAMSJAocbWF4X3N1YnNjcmliZXJzX3Blcl9kb2N1bWVudBgKIAEoBRIkChxtYXhfYXR0YWNobWVudHNfcGVyX2RvY3VtZW50GAsgASgFEh0KFW1heF9zaXplX3Blcl9kb2N1bWVudBgPIAEoBRIYChByZW1vdmVfb25fZGV0YWNoGBAgASgIEh0KFWF1dG9fcmV2aXNpb25fZW5hYmxlZBgbIAEoCBIXCg9hbGxvd2VkX29yaWdpbnMYDiADKAkSLgoKY3JlYXRlZF9hdBgMIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLgoKdXBkYXRlZF9hdBgNIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiLwoLTWV0cmljUG9pbnQSEQoJdGltZXN0YW1wGAEgASgDEg0KBXZhbHVlGAIgASgFIqMMChZVcGRhdGFibGVQcm9qZWN0RmllbGRzEioKBG5hbWUYASABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSNgoQYXV0aF93ZWJob29rX3VybBgCIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJSChRhdXRoX3dlYmhvb2tfbWV0aG9kcxgDIAEoCzI0LnlvcmtpZS52MS5VcGRhdGFibGVQcm9qZWN0RmllbGRzLkF1dGhXZWJob29rTWV0aG9kcxI+ChhhdXRoX3dlYmhvb2tfbWF4X3JldHJpZXMYDCABKAsyHC5nb29nbGUucHJvdG9idWYuVUludDY0VmFsdWUSRAoeYXV0aF93ZWJob29rX21pbl93YWl0X2ludGVydmFsGA0gASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlEkQKHmF1dGhfd2ViaG9va19tYXhfd2FpdF9pbnRlcnZhbBgOIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJCChxhdXRoX3dlYmhvb2tfcmVxdWVzdF90aW1lb3V0GA8gASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlEjcKEWV2ZW50X3dlYmhvb2tfdXJsGAQgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlElIKFGV2ZW50X3dlYmhvb2tfZXZlbnRzGAUgASgLMjQueW9ya2llLnYxLlVwZGF0YWJsZVByb2plY3RGaWVsZHMuRXZlbnRXZWJob29rRXZlbnRzEj8KGWV2ZW50X3dlYmhvb2tfbWF4X3JldHJpZXMYECABKAsyHC5nb29nbGUucHJvdG9idWYuVUludDY0VmFsdWUSRQofZXZlbnRfd2ViaG9va19taW5fd2FpdF9pbnRlcnZhbBgRIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJFCh9ldmVudF93ZWJob29rX21heF93YWl0X2ludGVydmFsGBIgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlEkMKHWV2ZW50X3dlYmhvb2tfcmVxdWVzdF90aW1lb3V0GBMgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlEjcKEnNuYXBzaG90X3RocmVzaG9sZBgUIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlEjYKEXNuYXBzaG90X2ludGVydmFsGBUgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDY0VmFsdWUSQQobY2xpZW50X2RlYWN0aXZhdGVfdGhyZXNob2xkGAYgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlEkEKHG1heF9zdWJzY3JpYmVyc19wZXJfZG9jdW1lbnQYByABKAsyGy5nb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZRJBChxtYXhfYXR0YWNobWVudHNfcGVyX2RvY3VtZW50GAggASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWUSOgoVbWF4X3NpemVfcGVyX2RvY3VtZW50GAogASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWUSNAoQcmVtb3ZlX29uX2RldGFjaBgLIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWUSOQoVYXV0b19yZXZpc2lvbl9lbmFibGVkGBYgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZRJJCg9hbGxvd2VkX29yaWdpbnMYCSABKAsyMC55b3JraWUudjEuVXBkYXRhYmxlUHJvamVjdEZpZWxkcy5BbGxvd2VkT3JpZ2lucxolChJBdXRoV2ViaG9va01ldGhvZHMSDwoHbWV0aG9kcxgBIAMoCRokChJFdmVudFdlYmhvb2tFdmVudHMSDgoGZXZlbnRzGAEgAygJGiEKDkFsbG93ZWRPcmlnaW5zEg8KB29yaWdpbnMYASADKAkipwMKD0RvY3VtZW50U3VtbWFyeRIKCgJpZBgBIAEoCRILCgNrZXkYAiABKAkSDAoEcm9vdBgDIAEoCRIYChBhdHRhY2hlZF9jbGllbnRzGAcgASgFEikKDWRvY3VtZW50X3NpemUYCCABKAsyEi55b3JraWUudjEuRG9jU2l6ZRISCgpzY2hlbWFfa2V5GAkgASgJEjwKCXByZXNlbmNlcxgKIAMoCzIpLnlvcmtpZS52MS5Eb2N1bWVudFN1bW1hcnkuUHJlc2VuY2VzRW50cnkSLgoKY3JlYXRlZF9hdBgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLwoLYWNjZXNzZWRfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCnVwZGF0ZWRfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wGkUKDlByZXNlbmNlc0VudHJ5EgsKA2tleRgBIAEoCRIiCgV2YWx1ZRgCIAEoCzITLnlvcmtpZS52MS5QcmVzZW5jZToCOAEi2gEKDlByZXNlbmNlQ2hhbmdlEjIKBHR5cGUYASABKA4yJC55b3JraWUudjEuUHJlc2VuY2VDaGFuZ2UuQ2hhbmdlVHlwZRIlCghwcmVzZW5jZRgCIAEoCzITLnlvcmtpZS52MS5QcmVzZW5jZSJtCgpDaGFuZ2VUeXBlEhsKF0NIQU5HRV9UWVBFX1VOU1BFQ0lGSUVEEAASEwoPQ0hBTkdFX1RZUEVfUFVUEAESFgoSQ0hBTkdFX1RZUEVfREVMRVRFEAISFQoRQ0hBTkdFX1RZUEVfQ0xFQVIQAyJkCghQcmVzZW5jZRIrCgRkYXRhGAEgAygLMh0ueW9ya2llLnYxLlByZXNlbmNlLkRhdGFFbnRyeRorCglEYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASI0Cg5DaGFubmVsU3VtbWFyeRILCgNrZXkYASABKAkSFQoNc2Vzc2lvbl9jb3VudBgCIAEoBSI0CgpDaGVja3BvaW50EhIKCnNlcnZlcl9zZXEYASABKAMSEgoKY2xpZW50X3NlcRgCIAEoDSJhCgtUZXh0Tm9kZVBvcxIpCgpjcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSDgoGb2Zmc2V0GAIgASgFEhcKD3JlbGF0aXZlX29mZnNldBgDIAEoBSJCCgpUaW1lVGlja2V0Eg8KB2xhbXBvcnQYASABKAMSEQoJZGVsaW1pdGVyGAIgASgNEhAKCGFjdG9yX2lkGAMgASgMIi4KDERvY0V2ZW50Qm9keRINCgV0b3BpYxgBIAEoCRIPCgdwYXlsb2FkGAIgASgMImsKCERvY0V2ZW50EiUKBHR5cGUYASABKA4yFy55b3JraWUudjEuRG9jRXZlbnRUeXBlEhEKCXB1Ymxpc2hlchgCIAEoCRIlCgRib2R5GAMgASgLMhcueW9ya2llLnYxLkRvY0V2ZW50Qm9keSLWAQoMQ2hhbm5lbEV2ZW50EioKBHR5cGUYASABKA4yHC55b3JraWUudjEuQ2hhbm5lbEV2ZW50LlR5cGUSEQoJcHVibGlzaGVyGAIgASgJEhUKDXNlc3Npb25fY291bnQYAyABKAMSCwoDc2VxGAQgASgDEg0KBXRvcGljGAUgASgJEg8KB3BheWxvYWQYBiABKAwiQwoEVHlwZRIUChBUWVBFX1VOU1BFQ0lGSUVEEAASEQoNVFlQRV9QUkVTRU5DRRABEhIKDlRZUEVfQlJPQURDQVNUEAIiJgoIRGF0YVNpemUSDAoEZGF0YRgBIAEoBRIMCgRtZXRhGAIgASgFIk0KB0RvY1NpemUSIQoEbGl2ZRgBIAEoCzITLnlvcmtpZS52MS5EYXRhU2l6ZRIfCgJnYxgCIAEoCzITLnlvcmtpZS52MS5EYXRhU2l6ZSKRAQoGU2NoZW1hEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSDwoHdmVyc2lvbhgDIAEoBRIMCgRib2R5GAQgASgJEh4KBXJ1bGVzGAUgAygLMg8ueW9ya2llLnYxLlJ1bGUSLgoKY3JlYXRlZF9hdBgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiUAoMVHJlZU5vZGVSdWxlEhEKCW5vZGVfdHlwZRgBIAEoCRIPCgdjb250ZW50GAIgASgJEg0KBW1hcmtzGAMgASgJEg0KBWdyb3VwGAQgASgJIk8KBFJ1bGUSDAoEcGF0aBgBIAEoCRIMCgR0eXBlGAIgASgJEisKCnRyZWVfbm9kZXMYAyADKAsyFy55b3JraWUudjEuVHJlZU5vZGVSdWxlIoMBCg9SZXZpc2lvblN1bW1hcnkSCgoCaWQYASABKAkSDQoFbGFiZWwYAiABKAkSEwoLZGVzY3JpcHRpb24YAyABKAkSEAoIc25hcHNob3QYBCABKAkSLgoKY3JlYXRlZF9hdBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAq/AIKCVZhbHVlVHlwZRITCg9WQUxVRV9UWVBFX05VTEwQABIWChJWQUxVRV9UWVBFX0JPT0xFQU4QARIWChJWQUxVRV9UWVBFX0lOVEVHRVIQAhITCg9WQUxVRV9UWVBFX0xPTkcQAxIVChFWQUxVRV9UWVBFX0RPVUJMRRAEEhUKEVZBTFVFX1RZUEVfU1RSSU5HEAUSFAoQVkFMVUVfVFlQRV9CWVRFUxAGEhMKD1ZBTFVFX1RZUEVfREFURRAHEhoKFlZBTFVFX1RZUEVfSlNPTl9PQkpFQ1QQCBIZChVWQUxVRV9UWVBFX0pTT05fQVJSQVkQCRITCg9WQUxVRV9UWVBFX1RFWFQQChIaChZWQUxVRV9UWVBFX0lOVEVHRVJfQ05UEAsSFwoTVkFMVUVfVFlQRV9MT05HX0NOVBAMEhMKD1ZBTFVFX1RZUEVfVFJFRRANEiAKHFZBTFVFX1RZUEVfSU5URUdFUl9ERURVUF9DTlQQDiIECA8QDyqmAQoMRG9jRXZlbnRUeXBlEiMKH0RPQ19FVkVOVF9UWVBFX0RPQ1VNRU5UX0NIQU5HRUQQABIjCh9ET0NfRVZFTlRfVFlQRV9ET0NVTUVOVF9XQVRDSEVEEAESJQohRE9DX0VWRU5UX1RZUEVfRE9DVU1FTlRfVU5XQVRDSEVEEAISJQohRE9DX0VWRU5UX1RZUEVfRE9DVU1FTlRfQlJPQURDQVNUEANCRQoRZGV2LnlvcmtpZS5hcGkudjFQAVouZ2l0aHViLmNvbS95b3JraWUtdGVhbS95b3JraWUvYXBpL3lvcmtpZS92MTt2MWIGcHJvdG8z", [file_google_protobuf_timestamp, file_google_protobuf_wrappers]);
5794
5794
  const SnapshotSchema = /* @__PURE__ */ messageDesc(file_src_api_yorkie_v1_resources, 0);
5795
5795
  const ChangePackSchema = /* @__PURE__ */ messageDesc(file_src_api_yorkie_v1_resources, 1);
5796
5796
  const ChangeSchema = /* @__PURE__ */ messageDesc(file_src_api_yorkie_v1_resources, 2);
@@ -7139,6 +7139,13 @@ class Primitive extends CRDTElement {
7139
7139
  if (this.valueType === 5) {
7140
7140
  return `"${escapeString(this.value)}"`;
7141
7141
  }
7142
+ if (this.valueType === 6) {
7143
+ const bytes = this.value;
7144
+ return `"${btoa(String.fromCharCode(...bytes))}"`;
7145
+ }
7146
+ if (this.valueType === 7) {
7147
+ return `"${this.value.toISOString()}"`;
7148
+ }
7142
7149
  return `${this.value}`;
7143
7150
  }
7144
7151
  /**
@@ -7281,19 +7288,54 @@ class Primitive extends CRDTElement {
7281
7288
  }
7282
7289
  }
7283
7290
  }
7291
+ class ElementEntry {
7292
+ elem;
7293
+ positionNode;
7294
+ posMovedAt;
7295
+ constructor(elem) {
7296
+ this.elem = elem;
7297
+ }
7298
+ }
7284
7299
  class RGATreeListNode extends SplayNode {
7300
+ _elementEntry;
7301
+ _createdAt;
7302
+ _removedAt;
7285
7303
  prev;
7286
7304
  next;
7287
- movedFrom;
7288
- constructor(value) {
7289
- super(value);
7290
- this.value = value;
7305
+ constructor(elem, createdAt) {
7306
+ super(elem);
7307
+ this._createdAt = createdAt;
7291
7308
  }
7292
7309
  /**
7293
- * `createAfter` creates a new node after the given node.
7310
+ * `createWithElement` creates a new node that owns an element.
7294
7311
  */
7295
- static createAfter(prev, value) {
7296
- const newNode = new RGATreeListNode(value);
7312
+ static createWithElement(elem) {
7313
+ const entry = new ElementEntry(elem);
7314
+ const node = new RGATreeListNode(elem, elem.getCreatedAt());
7315
+ entry.positionNode = node;
7316
+ node._elementEntry = entry;
7317
+ return node;
7318
+ }
7319
+ /**
7320
+ * `createBarePosition` creates a position node without an element
7321
+ * (used for move).
7322
+ */
7323
+ static createBarePosition(createdAt) {
7324
+ return new RGATreeListNode(void 0, createdAt);
7325
+ }
7326
+ /**
7327
+ * `createAfter` creates a new node with the given element after
7328
+ * the given prev node.
7329
+ */
7330
+ static createAfter(prev, elem) {
7331
+ const newNode = RGATreeListNode.createWithElement(elem);
7332
+ RGATreeListNode.insertNodeAfter(prev, newNode);
7333
+ return newNode;
7334
+ }
7335
+ /**
7336
+ * `insertNodeAfter` inserts a node after the given prev node.
7337
+ */
7338
+ static insertNodeAfter(prev, newNode) {
7297
7339
  const prevNext = prev.next;
7298
7340
  prev.next = newNode;
7299
7341
  newNode.prev = prev;
@@ -7301,26 +7343,41 @@ class RGATreeListNode extends SplayNode {
7301
7343
  if (prevNext) {
7302
7344
  prevNext.prev = newNode;
7303
7345
  }
7304
- return newNode;
7305
7346
  }
7306
7347
  /**
7307
- * `remove` removes value based on removing time.
7348
+ * `remove` removes the element based on removing time.
7308
7349
  */
7309
7350
  remove(removedAt) {
7310
- return this.value.remove(removedAt);
7351
+ if (!this._elementEntry) {
7352
+ return false;
7353
+ }
7354
+ return this._elementEntry.elem.remove(removedAt);
7311
7355
  }
7312
7356
  /**
7313
- * `getCreatedAt` returns creation time of this value
7357
+ * `getCreatedAt` returns the creation time. For live nodes with
7358
+ * elements, returns the element's createdAt for backward
7359
+ * compatibility.
7314
7360
  */
7315
7361
  getCreatedAt() {
7316
- return this.value.getCreatedAt();
7362
+ if (this._elementEntry) {
7363
+ return this._elementEntry.elem.getCreatedAt();
7364
+ }
7365
+ return this._createdAt;
7317
7366
  }
7318
7367
  /**
7319
- * `getPositionedAt` returns the time of this element when it was positioned
7320
- * in the array.
7368
+ * `getPositionedAt` returns the time this element was positioned.
7369
+ * For live nodes, the position register (posMovedAt) is the source
7370
+ * of truth. For dead nodes (no element), the position node's own
7371
+ * createdAt is used.
7321
7372
  */
7322
7373
  getPositionedAt() {
7323
- return this.value.getPositionedAt();
7374
+ if (this._elementEntry) {
7375
+ if (this._elementEntry.posMovedAt) {
7376
+ return this._elementEntry.posMovedAt;
7377
+ }
7378
+ return this._elementEntry.elem.getCreatedAt();
7379
+ }
7380
+ return this._createdAt;
7324
7381
  }
7325
7382
  /**
7326
7383
  * `release` releases prev and next node.
@@ -7337,9 +7394,13 @@ class RGATreeListNode extends SplayNode {
7337
7394
  }
7338
7395
  /**
7339
7396
  * `getLength` returns the length of this node.
7397
+ * Dead nodes (no element) return 0, removed elements return 0.
7340
7398
  */
7341
7399
  getLength() {
7342
- return this.value.isRemoved() ? 0 : 1;
7400
+ if (!this._elementEntry || this.isRemoved()) {
7401
+ return 0;
7402
+ }
7403
+ return 1;
7343
7404
  }
7344
7405
  /**
7345
7406
  * `getPrev` returns a previous node.
@@ -7354,28 +7415,87 @@ class RGATreeListNode extends SplayNode {
7354
7415
  return this.next;
7355
7416
  }
7356
7417
  /**
7357
- * `getMovedFrom` returns the previous element before the element moved.
7418
+ * `getValue` returns the element value.
7358
7419
  */
7359
- getMovedFrom() {
7360
- return this.movedFrom;
7420
+ getValue() {
7421
+ if (!this._elementEntry) {
7422
+ return this.value;
7423
+ }
7424
+ return this._elementEntry.elem;
7361
7425
  }
7362
7426
  /**
7363
- * `setMovedFrom` sets the previous element before the element moved.
7427
+ * `getElement` returns the element or undefined if dead position.
7364
7428
  */
7365
- setMovedFrom(movedFrom) {
7366
- this.movedFrom = movedFrom;
7429
+ getElement() {
7430
+ return this._elementEntry?.elem;
7367
7431
  }
7368
7432
  /**
7369
- * `getValue` returns a element value.
7433
+ * `isRemoved` checks if the value was removed.
7370
7434
  */
7371
- getValue() {
7372
- return this.value;
7435
+ isRemoved() {
7436
+ if (!this._elementEntry) {
7437
+ return true;
7438
+ }
7439
+ return this._elementEntry.elem.isRemoved();
7373
7440
  }
7374
7441
  /**
7375
- * `isRemoved` checks if the value was removed.
7442
+ * `getElementEntry` returns the element entry.
7376
7443
  */
7377
- isRemoved() {
7378
- return this.value.isRemoved();
7444
+ getElementEntry() {
7445
+ return this._elementEntry;
7446
+ }
7447
+ /**
7448
+ * `setElementEntry` sets the element entry.
7449
+ */
7450
+ setElementEntry(entry) {
7451
+ this._elementEntry = entry;
7452
+ }
7453
+ /**
7454
+ * `getPositionCreatedAt` returns the position node's own createdAt.
7455
+ */
7456
+ getPositionCreatedAt() {
7457
+ return this._createdAt;
7458
+ }
7459
+ /**
7460
+ * `getPositionMovedAt` returns the LWW timestamp of the element's
7461
+ * move into this position. Undefined for insert-created positions.
7462
+ */
7463
+ getPositionMovedAt() {
7464
+ if (!this._elementEntry) {
7465
+ return void 0;
7466
+ }
7467
+ return this._elementEntry.posMovedAt;
7468
+ }
7469
+ /**
7470
+ * `getRemovedAt` returns the time this dead position node was
7471
+ * removed (for GC).
7472
+ */
7473
+ getRemovedAt() {
7474
+ return this._removedAt;
7475
+ }
7476
+ /**
7477
+ * `setRemovedAt` sets the removal time of this position node.
7478
+ */
7479
+ setRemovedAt(removedAt) {
7480
+ this._removedAt = removedAt;
7481
+ }
7482
+ /**
7483
+ * `toIDString` returns a unique identifier for this position node
7484
+ * (for GC).
7485
+ */
7486
+ toIDString() {
7487
+ return this._createdAt.toIDString();
7488
+ }
7489
+ /**
7490
+ * `getDataSize` returns the data size of this position node
7491
+ * (for GC).
7492
+ */
7493
+ getDataSize() {
7494
+ let meta = TimeTicketSize;
7495
+ if (this._removedAt) {
7496
+ meta += TimeTicketSize;
7497
+ }
7498
+ return { data: 0, meta };
7379
7499
  }
7380
7500
  }
7381
7501
  class RGATreeList {
@@ -7383,13 +7503,15 @@ class RGATreeList {
7383
7503
  last;
7384
7504
  nodeMapByIndex;
7385
7505
  nodeMapByCreatedAt;
7506
+ elementMapByCreatedAt;
7386
7507
  constructor() {
7387
7508
  const dummyValue = Primitive.of(0, InitialTimeTicket);
7388
7509
  dummyValue.setRemovedAt(InitialTimeTicket);
7389
- this.dummyHead = new RGATreeListNode(dummyValue);
7510
+ this.dummyHead = RGATreeListNode.createWithElement(dummyValue);
7390
7511
  this.last = this.dummyHead;
7391
7512
  this.nodeMapByIndex = new SplayTree();
7392
7513
  this.nodeMapByCreatedAt = /* @__PURE__ */ new Map();
7514
+ this.elementMapByCreatedAt = /* @__PURE__ */ new Map();
7393
7515
  this.nodeMapByIndex.insert(this.dummyHead);
7394
7516
  this.nodeMapByCreatedAt.set(
7395
7517
  this.dummyHead.getCreatedAt().toIDString(),
@@ -7409,22 +7531,10 @@ class RGATreeList {
7409
7531
  return this.nodeMapByIndex.length;
7410
7532
  }
7411
7533
  /**
7412
- * `findNextBeforeExecutedAt` returns the node by the given createdAt and
7413
- * executedAt. It passes through nodes created after executedAt from the
7414
- * given node and returns the next node.
7415
- * @returns the next node of the given createdAt and executedAt
7534
+ * `findNextBeforeExecutedAt` walks forward from the given node,
7535
+ * skipping nodes positioned after executedAt (RGA insertion rule).
7416
7536
  */
7417
- findNextBeforeExecutedAt(createdAt, executedAt) {
7418
- let node = this.nodeMapByCreatedAt.get(createdAt.toIDString());
7419
- if (!node) {
7420
- throw new YorkieError(
7421
- Code.ErrInvalidArgument,
7422
- `cant find the given node: ${createdAt.toIDString()}`
7423
- );
7424
- }
7425
- while (node.getValue().getMovedAt() && node.getValue().getMovedAt().after(executedAt) && node.getMovedFrom()) {
7426
- node = node.getMovedFrom();
7427
- }
7537
+ findNextBeforeExecutedAt(node, executedAt) {
7428
7538
  while (node.getNext() && node.getNext().getPositionedAt().after(executedAt)) {
7429
7539
  node = node.getNext();
7430
7540
  }
@@ -7436,65 +7546,103 @@ class RGATreeList {
7436
7546
  }
7437
7547
  node.release();
7438
7548
  this.nodeMapByIndex.delete(node);
7439
- this.nodeMapByCreatedAt.delete(node.getValue().getCreatedAt().toIDString());
7549
+ this.nodeMapByCreatedAt.delete(node.getPositionCreatedAt().toIDString());
7440
7550
  }
7441
7551
  /**
7442
- * `insertAfter` adds a new node with the value after the given node.
7552
+ * `insertAfter` adds a new node with the value after the given
7553
+ * position. prevCreatedAt is a position node identity. Looks up
7554
+ * nodeMapByCreatedAt first, then elementMapByCreatedAt for backward
7555
+ * compatibility.
7443
7556
  */
7444
7557
  insertAfter(prevCreatedAt, value, executedAt = value.getCreatedAt()) {
7445
- const prevNode = this.findNextBeforeExecutedAt(prevCreatedAt, executedAt);
7558
+ let startNode = this.nodeMapByCreatedAt.get(prevCreatedAt.toIDString());
7559
+ if (!startNode) {
7560
+ const entry = this.elementMapByCreatedAt.get(prevCreatedAt.toIDString());
7561
+ if (entry) {
7562
+ startNode = entry.positionNode;
7563
+ }
7564
+ }
7565
+ if (!startNode) {
7566
+ throw new YorkieError(
7567
+ Code.ErrInvalidArgument,
7568
+ `cant find the given node: ${prevCreatedAt.toIDString()}`
7569
+ );
7570
+ }
7571
+ const prevNode = this.findNextBeforeExecutedAt(startNode, executedAt);
7446
7572
  const newNode = RGATreeListNode.createAfter(prevNode, value);
7447
7573
  if (prevNode === this.last) {
7448
7574
  this.last = newNode;
7449
7575
  }
7450
7576
  this.nodeMapByIndex.insertAfter(prevNode, newNode);
7451
- this.nodeMapByCreatedAt.set(newNode.getCreatedAt().toIDString(), newNode);
7577
+ this.nodeMapByCreatedAt.set(value.getCreatedAt().toIDString(), newNode);
7578
+ this.elementMapByCreatedAt.set(
7579
+ value.getCreatedAt().toIDString(),
7580
+ newNode.getElementEntry()
7581
+ );
7452
7582
  return newNode;
7453
7583
  }
7454
7584
  /**
7455
- * `moveAfter` moves the given `createdAt` element
7456
- * after the `prevCreatedAt` element.
7585
+ * `insertPositionAfter` creates a bare position node after
7586
+ * resolving position via forward skip (RGA insertion rule).
7587
+ * Used by moveAfter. prevCreatedAt is a POSITION node identity.
7588
+ */
7589
+ insertPositionAfter(prevCreatedAt, executedAt) {
7590
+ const startNode = this.nodeMapByCreatedAt.get(prevCreatedAt.toIDString());
7591
+ if (!startNode) {
7592
+ throw new YorkieError(
7593
+ Code.ErrInvalidArgument,
7594
+ `cant find the given node: ${prevCreatedAt.toIDString()}`
7595
+ );
7596
+ }
7597
+ const prevNode = this.findNextBeforeExecutedAt(startNode, executedAt);
7598
+ const newNode = RGATreeListNode.createBarePosition(executedAt);
7599
+ RGATreeListNode.insertNodeAfter(prevNode, newNode);
7600
+ if (prevNode === this.last) {
7601
+ this.last = newNode;
7602
+ }
7603
+ this.nodeMapByIndex.insertAfter(prevNode, newNode);
7604
+ this.nodeMapByCreatedAt.set(executedAt.toIDString(), newNode);
7605
+ return newNode;
7606
+ }
7607
+ /**
7608
+ * `moveAfter` moves the given `createdAt` element after the
7609
+ * `prevCreatedAt` element using LWW position register semantics.
7610
+ * Returns the dead position node (if any) for GC registration.
7457
7611
  */
7458
7612
  moveAfter(prevCreatedAt, createdAt, executedAt) {
7459
- let prevNode = this.nodeMapByCreatedAt.get(prevCreatedAt.toIDString());
7460
- if (!prevNode) {
7613
+ if (!this.nodeMapByCreatedAt.has(prevCreatedAt.toIDString())) {
7461
7614
  throw new YorkieError(
7462
7615
  Code.ErrInvalidArgument,
7463
7616
  `cant find the given node: ${prevCreatedAt.toIDString()}`
7464
7617
  );
7465
7618
  }
7466
- let node = this.nodeMapByCreatedAt.get(createdAt.toIDString());
7467
- if (!node) {
7619
+ const entry = this.elementMapByCreatedAt.get(createdAt.toIDString());
7620
+ if (!entry) {
7468
7621
  throw new YorkieError(
7469
7622
  Code.ErrInvalidArgument,
7470
7623
  `cant find the given node: ${createdAt.toIDString()}`
7471
7624
  );
7472
7625
  }
7473
- if (prevNode !== node && executedAt.after(node.getPositionedAt())) {
7474
- const movedFrom = node.getPrev();
7475
- let nextNode = node.getNext();
7476
- this.release(node);
7477
- node = this.insertAfter(
7478
- prevNode.getCreatedAt(),
7479
- node.getValue(),
7480
- executedAt
7481
- );
7482
- node.getValue().setMovedAt(executedAt);
7483
- node.setMovedFrom(movedFrom);
7484
- while (nextNode && nextNode.getPositionedAt().after(executedAt)) {
7485
- prevNode = node;
7486
- node = nextNode;
7487
- nextNode = node.getNext();
7488
- this.release(node);
7489
- node = this.insertAfter(
7490
- prevNode.getCreatedAt(),
7491
- node.getValue(),
7492
- executedAt
7493
- );
7494
- node.getValue().setMovedAt(executedAt);
7495
- node.setMovedFrom(movedFrom);
7626
+ if (entry.posMovedAt && !executedAt.after(entry.posMovedAt)) {
7627
+ if (this.nodeMapByCreatedAt.has(executedAt.toIDString())) {
7628
+ return void 0;
7496
7629
  }
7630
+ const deadPosNode = this.insertPositionAfter(prevCreatedAt, executedAt);
7631
+ deadPosNode.setRemovedAt(executedAt);
7632
+ this.nodeMapByIndex.splayNode(deadPosNode);
7633
+ return deadPosNode;
7497
7634
  }
7635
+ const newPosNode = this.insertPositionAfter(prevCreatedAt, executedAt);
7636
+ const oldPosNode = entry.positionNode;
7637
+ oldPosNode.setElementEntry(void 0);
7638
+ oldPosNode.setRemovedAt(executedAt);
7639
+ this.nodeMapByIndex.splayNode(oldPosNode);
7640
+ newPosNode.setElementEntry(entry);
7641
+ entry.positionNode = newPosNode;
7642
+ entry.posMovedAt = executedAt;
7643
+ entry.elem.setMovedAt(executedAt);
7644
+ this.nodeMapByIndex.splayNode(newPosNode);
7645
+ return oldPosNode;
7498
7646
  }
7499
7647
  /**
7500
7648
  * `insert` adds the given element after the last node.
@@ -7503,34 +7651,53 @@ class RGATreeList {
7503
7651
  this.insertAfter(this.last.getCreatedAt(), value);
7504
7652
  }
7505
7653
  /**
7506
- * `getByID` returns the element of the given creation time.
7654
+ * `getByID` returns the node of the given creation time.
7655
+ * Checks elementMapByCreatedAt first (for moved elements whose
7656
+ * position node createdAt differs), then nodeMapByCreatedAt.
7507
7657
  */
7508
7658
  getByID(createdAt) {
7659
+ const entry = this.elementMapByCreatedAt.get(createdAt.toIDString());
7660
+ if (entry) {
7661
+ return entry.positionNode;
7662
+ }
7509
7663
  return this.nodeMapByCreatedAt.get(createdAt.toIDString());
7510
7664
  }
7511
7665
  /**
7512
7666
  * `subPathOf` returns the sub path of the given element.
7513
7667
  */
7514
7668
  subPathOf(createdAt) {
7515
- const node = this.nodeMapByCreatedAt.get(createdAt.toIDString());
7516
- if (!node) {
7517
- return;
7669
+ const entry = this.elementMapByCreatedAt.get(createdAt.toIDString());
7670
+ if (!entry) {
7671
+ const node = this.nodeMapByCreatedAt.get(createdAt.toIDString());
7672
+ if (!node) {
7673
+ return;
7674
+ }
7675
+ return String(this.nodeMapByIndex.indexOf(node));
7518
7676
  }
7519
- return String(this.nodeMapByIndex.indexOf(node));
7677
+ return String(this.nodeMapByIndex.indexOf(entry.positionNode));
7520
7678
  }
7521
7679
  /**
7522
- * `purge` physically purges element.
7680
+ * `purge` physically purges the given child. Handles both dead
7681
+ * position nodes (GCChild from GCParent path) and CRDTElements
7682
+ * (from CRDTContainer path).
7523
7683
  */
7524
- purge(element) {
7525
- const node = this.nodeMapByCreatedAt.get(
7684
+ purge(child) {
7685
+ if (child instanceof RGATreeListNode) {
7686
+ this.release(child);
7687
+ return;
7688
+ }
7689
+ const element = child;
7690
+ const entry = this.elementMapByCreatedAt.get(
7526
7691
  element.getCreatedAt().toIDString()
7527
7692
  );
7528
- if (!node) {
7693
+ if (!entry) {
7529
7694
  throw new YorkieError(
7530
7695
  Code.ErrInvalidArgument,
7531
7696
  `fail to find the given createdAt: ${element.getCreatedAt().toIDString()}`
7532
7697
  );
7533
7698
  }
7699
+ const node = entry.positionNode;
7700
+ this.elementMapByCreatedAt.delete(element.getCreatedAt().toIDString());
7534
7701
  this.release(node);
7535
7702
  }
7536
7703
  /**
@@ -7541,42 +7708,69 @@ class RGATreeList {
7541
7708
  return;
7542
7709
  }
7543
7710
  const node = this.nodeMapByIndex.findForArray(idx);
7544
- const rgaNode = node;
7545
- return rgaNode;
7711
+ return node;
7546
7712
  }
7547
7713
  /**
7548
- * `getPrevCreatedAt` returns a creation time of the previous node.
7714
+ * `findPrevCreatedAt` returns the position node's createdAt of the
7715
+ * previous element. This returns a position identity suitable for
7716
+ * use as prevCreatedAt in moveAfter.
7549
7717
  */
7550
- getPrevCreatedAt(createdAt) {
7551
- let node = this.nodeMapByCreatedAt.get(createdAt.toIDString());
7718
+ findPrevCreatedAt(createdAt) {
7719
+ const entry = this.elementMapByCreatedAt.get(createdAt.toIDString());
7720
+ if (!entry) {
7721
+ throw new YorkieError(
7722
+ Code.ErrInvalidArgument,
7723
+ `cant find the given node: ${createdAt.toIDString()}`
7724
+ );
7725
+ }
7726
+ let node = entry.positionNode;
7552
7727
  do {
7553
7728
  node = node.getPrev();
7554
- } while (this.dummyHead !== node && node.isRemoved());
7555
- return node.getValue().getCreatedAt();
7729
+ if (!node.getElementEntry()) {
7730
+ continue;
7731
+ }
7732
+ if (this.dummyHead === node || !node.isRemoved()) {
7733
+ break;
7734
+ }
7735
+ } while (node);
7736
+ return node.getPositionCreatedAt();
7737
+ }
7738
+ /**
7739
+ * `getPrevCreatedAt` returns the position node's createdAt of the
7740
+ * previous element. Delegates to findPrevCreatedAt.
7741
+ */
7742
+ getPrevCreatedAt(createdAt) {
7743
+ return this.findPrevCreatedAt(createdAt);
7556
7744
  }
7557
7745
  /**
7558
7746
  * `delete` deletes the node of the given creation time.
7559
7747
  */
7560
7748
  delete(createdAt, editedAt) {
7561
- const node = this.nodeMapByCreatedAt.get(createdAt.toIDString());
7749
+ const entry = this.elementMapByCreatedAt.get(createdAt.toIDString());
7750
+ if (!entry) {
7751
+ throw new YorkieError(
7752
+ Code.ErrInvalidArgument,
7753
+ `cant find the given node: ${createdAt.toIDString()}`
7754
+ );
7755
+ }
7756
+ const node = entry.positionNode;
7562
7757
  const alreadyRemoved = node.isRemoved();
7563
- if (node.remove(editedAt) && !alreadyRemoved) {
7758
+ if (entry.elem.remove(editedAt) && !alreadyRemoved) {
7564
7759
  this.nodeMapByIndex.splayNode(node);
7565
7760
  }
7566
- return node.getValue();
7761
+ return entry.elem;
7567
7762
  }
7568
7763
  /**
7569
7764
  * `set` sets the given element at the given creation time.
7570
7765
  */
7571
7766
  set(createdAt, element, executedAt) {
7572
- const node = this.nodeMapByCreatedAt.get(createdAt.toIDString());
7573
- if (!node) {
7767
+ if (!this.elementMapByCreatedAt.has(createdAt.toIDString())) {
7574
7768
  throw new YorkieError(
7575
7769
  Code.ErrInvalidArgument,
7576
7770
  `cant find the given node: ${createdAt.toIDString()}`
7577
7771
  );
7578
7772
  }
7579
- this.insertAfter(node.getCreatedAt(), element, executedAt);
7773
+ this.insertAfter(createdAt, element, executedAt);
7580
7774
  return this.delete(createdAt, executedAt);
7581
7775
  }
7582
7776
  /**
@@ -7605,18 +7799,80 @@ class RGATreeList {
7605
7799
  return this.last.getValue();
7606
7800
  }
7607
7801
  /**
7608
- * `getLastCreatedAt` returns the creation time of last element.
7802
+ * `getLastCreatedAt` returns the position node's createdAt of the
7803
+ * last node in the linked list. This is a position identity
7804
+ * suitable for use as prevCreatedAt.
7609
7805
  */
7610
7806
  getLastCreatedAt() {
7611
- return this.last.getCreatedAt();
7807
+ return this.last.getPositionCreatedAt();
7612
7808
  }
7613
7809
  /**
7614
- * `toTestString` returns a String containing the meta data of the node id
7615
- * for debugging purpose.
7810
+ * `posCreatedAt` returns the createdAt of the position node
7811
+ * currently holding the element. Used to convert element identity
7812
+ * to position identity.
7813
+ */
7814
+ posCreatedAt(elemCreatedAt) {
7815
+ const entry = this.elementMapByCreatedAt.get(elemCreatedAt.toIDString());
7816
+ if (!entry) {
7817
+ throw new YorkieError(
7818
+ Code.ErrInvalidArgument,
7819
+ `cant find the given node: ${elemCreatedAt.toIDString()}`
7820
+ );
7821
+ }
7822
+ return entry.positionNode.getPositionCreatedAt();
7823
+ }
7824
+ /**
7825
+ * `addDeadPosition` appends a dead position node during snapshot
7826
+ * restoration.
7827
+ */
7828
+ addDeadPosition(posCreatedAt, removedAt) {
7829
+ const node = RGATreeListNode.createBarePosition(posCreatedAt);
7830
+ node.setRemovedAt(removedAt);
7831
+ const prevNode = this.last;
7832
+ RGATreeListNode.insertNodeAfter(prevNode, node);
7833
+ this.last = node;
7834
+ this.nodeMapByIndex.insertAfter(prevNode, node);
7835
+ this.nodeMapByCreatedAt.set(posCreatedAt.toIDString(), node);
7836
+ }
7837
+ /**
7838
+ * `addMovedElement` appends an element with explicit position
7839
+ * identity during snapshot restoration.
7840
+ */
7841
+ addMovedElement(elem, posCreatedAt, posMovedAt) {
7842
+ const entry = new ElementEntry(elem);
7843
+ entry.posMovedAt = posMovedAt;
7844
+ const node = RGATreeListNode.createBarePosition(posCreatedAt);
7845
+ node.setElementEntry(entry);
7846
+ entry.positionNode = node;
7847
+ const prevNode = this.last;
7848
+ RGATreeListNode.insertNodeAfter(prevNode, node);
7849
+ this.last = node;
7850
+ this.nodeMapByIndex.insertAfter(prevNode, node);
7851
+ this.nodeMapByCreatedAt.set(posCreatedAt.toIDString(), node);
7852
+ this.elementMapByCreatedAt.set(elem.getCreatedAt().toIDString(), entry);
7853
+ }
7854
+ /**
7855
+ * `allNodes` returns all nodes including dead position nodes.
7856
+ */
7857
+ allNodes() {
7858
+ const nodes = [];
7859
+ let current = this.dummyHead.getNext();
7860
+ while (current) {
7861
+ nodes.push(current);
7862
+ current = current.getNext();
7863
+ }
7864
+ return nodes;
7865
+ }
7866
+ /**
7867
+ * `toTestString` returns a String containing the meta data of the
7868
+ * node id for debugging purpose.
7616
7869
  */
7617
7870
  toTestString() {
7618
7871
  const json = [];
7619
7872
  for (const node of this) {
7873
+ if (!node.getElementEntry()) {
7874
+ continue;
7875
+ }
7620
7876
  const elem = `${node.getCreatedAt().toIDString()}:${node.getValue().toJSON()}`;
7621
7877
  if (node.isRemoved()) {
7622
7878
  json.push(`{${elem}}`);
@@ -7673,10 +7929,11 @@ class CRDTArray extends CRDTContainer {
7673
7929
  this.elements.insertAfter(prevCreatedAt, value, executedAt);
7674
7930
  }
7675
7931
  /**
7676
- * `moveAfter` moves the given `createdAt` element after the `prevCreatedAt`.
7932
+ * `moveAfter` moves the given `createdAt` element after the
7933
+ * `prevCreatedAt`. Returns the dead position node for GC.
7677
7934
  */
7678
7935
  moveAfter(prevCreatedAt, createdAt, executedAt) {
7679
- this.elements.moveAfter(prevCreatedAt, createdAt, executedAt);
7936
+ return this.elements.moveAfter(prevCreatedAt, createdAt, executedAt);
7680
7937
  }
7681
7938
  /**
7682
7939
  * `get` returns the element of the given index.
@@ -7705,11 +7962,20 @@ class CRDTArray extends CRDTContainer {
7705
7962
  return this.elements.getLast();
7706
7963
  }
7707
7964
  /**
7708
- * `getPrevCreatedAt` returns the creation time of the previous node.
7965
+ * `getPrevCreatedAt` returns the creation time of the previous
7966
+ * node.
7709
7967
  */
7710
7968
  getPrevCreatedAt(createdAt) {
7711
7969
  return this.elements.getPrevCreatedAt(createdAt);
7712
7970
  }
7971
+ /**
7972
+ * `posCreatedAt` returns the createdAt of the position node
7973
+ * currently holding the element. Used to convert element identity
7974
+ * to position identity for moves.
7975
+ */
7976
+ posCreatedAt(elemCreatedAt) {
7977
+ return this.elements.posCreatedAt(elemCreatedAt);
7978
+ }
7713
7979
  /**
7714
7980
  * `delete` deletes the element of the given creation time.
7715
7981
  */
@@ -7723,7 +7989,8 @@ class CRDTArray extends CRDTContainer {
7723
7989
  return this.elements.deleteByIndex(index, editedAt);
7724
7990
  }
7725
7991
  /**
7726
- * `set` sets the given element at the given position of the creation time.
7992
+ * `set` sets the given element at the given position of the
7993
+ * creation time.
7727
7994
  */
7728
7995
  set(createdAt, value, executedAt) {
7729
7996
  return this.elements.set(createdAt, value, executedAt);
@@ -7741,18 +8008,19 @@ class CRDTArray extends CRDTContainer {
7741
8008
  return this.elements.length;
7742
8009
  }
7743
8010
  /**
7744
- * `[Symbol.iterator]` returns an iterator for the elements in this array.
8011
+ * `[Symbol.iterator]` returns an iterator for the elements in
8012
+ * this array.
7745
8013
  */
7746
8014
  *[Symbol.iterator]() {
7747
8015
  for (const node of this.elements) {
7748
- if (!node.isRemoved()) {
8016
+ if (node.getElementEntry() && !node.isRemoved()) {
7749
8017
  yield node.getValue();
7750
8018
  }
7751
8019
  }
7752
8020
  }
7753
8021
  /**
7754
- * `toTestString` returns a String containing the meta data of this value
7755
- * for debugging purpose.
8022
+ * `toTestString` returns a String containing the meta data of
8023
+ * this value for debugging purpose.
7756
8024
  */
7757
8025
  toTestString() {
7758
8026
  return this.elements.toTestString();
@@ -7762,6 +8030,9 @@ class CRDTArray extends CRDTContainer {
7762
8030
  */
7763
8031
  getDescendants(callback) {
7764
8032
  for (const node of this.elements) {
8033
+ if (!node.getElementEntry()) {
8034
+ continue;
8035
+ }
7765
8036
  const element = node.getValue();
7766
8037
  if (callback(element, this)) {
7767
8038
  return;
@@ -7823,21 +8094,52 @@ class CRDTArray extends CRDTContainer {
7823
8094
  return this.toJSON();
7824
8095
  }
7825
8096
  /**
7826
- * `getElements` returns an array of elements contained in this RGATreeList.
8097
+ * `getElements` returns the underlying RGATreeList.
7827
8098
  */
7828
8099
  getElements() {
7829
8100
  return this.elements;
7830
8101
  }
8102
+ /**
8103
+ * `getRGATreeList` returns the underlying RGATreeList (GCParent
8104
+ * for dead positions).
8105
+ */
8106
+ getRGATreeList() {
8107
+ return this.elements;
8108
+ }
8109
+ /**
8110
+ * `getAllRGANodes` returns all RGA nodes including dead position
8111
+ * nodes.
8112
+ */
8113
+ getAllRGANodes() {
8114
+ return this.elements.allNodes();
8115
+ }
7831
8116
  /**
7832
8117
  * `deepcopy` copies itself deeply.
7833
8118
  */
7834
8119
  deepcopy() {
7835
8120
  const clone = CRDTArray.create(this.getCreatedAt());
7836
8121
  for (const node of this.elements) {
7837
- clone.elements.insertAfter(
7838
- clone.getLastCreatedAt(),
7839
- node.getValue().deepcopy()
7840
- );
8122
+ if (!node.getElementEntry()) {
8123
+ const removedAt = node.getRemovedAt();
8124
+ if (removedAt) {
8125
+ clone.elements.addDeadPosition(
8126
+ node.getPositionCreatedAt(),
8127
+ removedAt
8128
+ );
8129
+ }
8130
+ continue;
8131
+ }
8132
+ const value = node.getValue().deepcopy();
8133
+ const posMovedAt = node.getPositionMovedAt();
8134
+ if (posMovedAt) {
8135
+ clone.elements.addMovedElement(
8136
+ value,
8137
+ node.getPositionCreatedAt(),
8138
+ posMovedAt
8139
+ );
8140
+ } else {
8141
+ clone.elements.insertAfter(clone.getLastCreatedAt(), value);
8142
+ }
7841
8143
  }
7842
8144
  clone.setRemovedAt(this.getRemovedAt());
7843
8145
  clone.setMovedAt(this.getMovedAt());
@@ -8094,6 +8396,9 @@ class SetOperation extends Operation {
8094
8396
  if (removed) {
8095
8397
  root.registerRemovedElement(removed);
8096
8398
  }
8399
+ if (value.getRemovedAt()) {
8400
+ root.registerRemovedElement(value);
8401
+ }
8097
8402
  return {
8098
8403
  opInfos: [
8099
8404
  {
@@ -8186,7 +8491,17 @@ class MoveOperation extends Operation {
8186
8491
  const array = parentObject;
8187
8492
  const reverseOp = this.toReverseOperation(array);
8188
8493
  const previousIndex = Number(array.subPathOf(this.createdAt));
8189
- array.moveAfter(this.prevCreatedAt, this.createdAt, this.getExecutedAt());
8494
+ const deadNode = array.moveAfter(
8495
+ this.prevCreatedAt,
8496
+ this.createdAt,
8497
+ this.getExecutedAt()
8498
+ );
8499
+ if (deadNode) {
8500
+ root.registerGCPair({
8501
+ parent: array.getRGATreeList(),
8502
+ child: deadNode
8503
+ });
8504
+ }
8190
8505
  const index = Number(array.subPathOf(this.createdAt));
8191
8506
  return {
8192
8507
  opInfos: [
@@ -8209,7 +8524,8 @@ class MoveOperation extends Operation {
8209
8524
  );
8210
8525
  }
8211
8526
  /**
8212
- * `getEffectedCreatedAt` returns the creation time of the effected element.
8527
+ * `getEffectedCreatedAt` returns the creation time of the
8528
+ * effected element.
8213
8529
  */
8214
8530
  getEffectedCreatedAt() {
8215
8531
  return this.createdAt;
@@ -8221,7 +8537,8 @@ class MoveOperation extends Operation {
8221
8537
  return `${this.getParentCreatedAt().toTestString()}.MOVE`;
8222
8538
  }
8223
8539
  /**
8224
- * `getPrevCreatedAt` returns the creation time of previous element.
8540
+ * `getPrevCreatedAt` returns the creation time of previous
8541
+ * element.
8225
8542
  */
8226
8543
  getPrevCreatedAt() {
8227
8544
  return this.prevCreatedAt;
@@ -8233,7 +8550,8 @@ class MoveOperation extends Operation {
8233
8550
  return this.createdAt;
8234
8551
  }
8235
8552
  /**
8236
- * `setPrevCreatedAt` sets the creation time of the previous element.
8553
+ * `setPrevCreatedAt` sets the creation time of the previous
8554
+ * element.
8237
8555
  */
8238
8556
  setPrevCreatedAt(createdAt) {
8239
8557
  this.prevCreatedAt = createdAt;
@@ -11577,7 +11895,7 @@ class CRDTTreeNode extends IndexTreeNode {
11577
11895
  CRDTTreeNodeID.of(issueTimeTicket(), 0),
11578
11896
  this.type,
11579
11897
  void 0,
11580
- void 0,
11898
+ this.attrs?.deepcopy(),
11581
11899
  this.removedAt
11582
11900
  );
11583
11901
  }
@@ -11997,6 +12315,53 @@ class CRDTTree extends CRDTElement {
11997
12315
  addDataSizes(diff, curr.getDataSize());
11998
12316
  }
11999
12317
  }
12318
+ if (tokenType === TokenType.Start && versionVector !== void 0) {
12319
+ let current = node;
12320
+ while (current.insNextID) {
12321
+ const next = this.findFloorNode(current.insNextID);
12322
+ if (!next || next.isText) {
12323
+ break;
12324
+ }
12325
+ if (ticketKnown(versionVector, next.id.getCreatedAt())) {
12326
+ break;
12327
+ }
12328
+ const siblingPairs = next.setAttrs(attributes, editedAt);
12329
+ const siblingAffectedAttrs = siblingPairs.reduce(
12330
+ (acc, [, curr]) => {
12331
+ if (curr) {
12332
+ acc[curr.getKey()] = attrs[curr.getKey()];
12333
+ }
12334
+ return acc;
12335
+ },
12336
+ {}
12337
+ );
12338
+ if (Object.keys(siblingAffectedAttrs).length > 0) {
12339
+ const parentOfNext = next.parent;
12340
+ const previousNext = next.prevSibling || parentOfNext;
12341
+ changes.push({
12342
+ type: "style",
12343
+ from: this.toIndex(parentOfNext, previousNext),
12344
+ to: this.toIndex(next, next),
12345
+ fromPath: this.toPath(parentOfNext, previousNext),
12346
+ toPath: this.toPath(next, next),
12347
+ actor: editedAt.getActorID(),
12348
+ value: siblingAffectedAttrs
12349
+ });
12350
+ }
12351
+ for (const [prev] of siblingPairs) {
12352
+ if (prev) {
12353
+ pairs.push({ parent: next, child: prev });
12354
+ }
12355
+ }
12356
+ for (const [key] of Object.entries(attrs)) {
12357
+ const curr = next.attrs?.getNodeMapByKey().get(key);
12358
+ if (curr !== void 0) {
12359
+ addDataSizes(diff, curr.getDataSize());
12360
+ }
12361
+ }
12362
+ current = next;
12363
+ }
12364
+ }
12000
12365
  }
12001
12366
  }
12002
12367
  );
@@ -12063,6 +12428,43 @@ class CRDTTree extends CRDTElement {
12063
12428
  toPath: this.toPath(node, node),
12064
12429
  value: attributesToRemove
12065
12430
  });
12431
+ if (tokenType === TokenType.Start && versionVector !== void 0) {
12432
+ let current = node;
12433
+ while (current.insNextID) {
12434
+ const next = this.findFloorNode(current.insNextID);
12435
+ if (!next || next.isText) {
12436
+ break;
12437
+ }
12438
+ if (ticketKnown(versionVector, next.id.getCreatedAt())) {
12439
+ break;
12440
+ }
12441
+ if (!next.attrs) {
12442
+ next.attrs = new RHT();
12443
+ }
12444
+ let removedAny = false;
12445
+ for (const value of attributesToRemove) {
12446
+ const nodesTobeRemoved = next.attrs.remove(value, editedAt);
12447
+ removedAny = removedAny || nodesTobeRemoved.length > 0;
12448
+ for (const rhtNode of nodesTobeRemoved) {
12449
+ pairs.push({ parent: next, child: rhtNode });
12450
+ }
12451
+ }
12452
+ if (removedAny) {
12453
+ const parentOfNext = next.parent;
12454
+ const previousNext = next.prevSibling || parentOfNext;
12455
+ changes.push({
12456
+ actor: editedAt.getActorID(),
12457
+ type: "removeStyle",
12458
+ from: this.toIndex(parentOfNext, previousNext),
12459
+ to: this.toIndex(next, next),
12460
+ fromPath: this.toPath(parentOfNext, previousNext),
12461
+ toPath: this.toPath(next, next),
12462
+ value: attributesToRemove
12463
+ });
12464
+ }
12465
+ current = next;
12466
+ }
12467
+ }
12066
12468
  }
12067
12469
  }
12068
12470
  );
@@ -14821,14 +15223,26 @@ function toRHTNodes(rht) {
14821
15223
  }
14822
15224
  return pbRHTNodes;
14823
15225
  }
14824
- function toRGANodes(rgaTreeList) {
15226
+ function toRGANodes(arr) {
14825
15227
  const pbRGANodes = [];
14826
- for (const rgaTreeListNode of rgaTreeList) {
14827
- pbRGANodes.push(
14828
- create(RGANodeSchema, {
14829
- element: toElement(rgaTreeListNode.getValue())
14830
- })
14831
- );
15228
+ for (const rgaNode of arr.getAllRGANodes()) {
15229
+ if (!rgaNode.getElementEntry()) {
15230
+ pbRGANodes.push(
15231
+ create(RGANodeSchema, {
15232
+ positionCreatedAt: toTimeTicket(rgaNode.getPositionCreatedAt()),
15233
+ positionRemovedAt: toTimeTicket(rgaNode.getRemovedAt())
15234
+ })
15235
+ );
15236
+ continue;
15237
+ }
15238
+ const pbNode = create(RGANodeSchema, {
15239
+ element: toElement(rgaNode.getValue())
15240
+ });
15241
+ if (rgaNode.getPositionMovedAt()) {
15242
+ pbNode.positionMovedAt = toTimeTicket(rgaNode.getPositionMovedAt());
15243
+ pbNode.positionCreatedAt = toTimeTicket(rgaNode.getPositionCreatedAt());
15244
+ }
15245
+ pbRGANodes.push(pbNode);
14832
15246
  }
14833
15247
  return pbRGANodes;
14834
15248
  }
@@ -14928,7 +15342,7 @@ function toArray(arr) {
14928
15342
  body: {
14929
15343
  case: "jsonArray",
14930
15344
  value: create(JSONElement_JSONArraySchema, {
14931
- nodes: toRGANodes(arr.getElements()),
15345
+ nodes: toRGANodes(arr),
14932
15346
  createdAt: toTimeTicket(arr.getCreatedAt()),
14933
15347
  movedAt: toTimeTicket(arr.getMovedAt()),
14934
15348
  removedAt: toTimeTicket(arr.getRemovedAt())
@@ -15466,7 +15880,32 @@ function fromObject(pbObject) {
15466
15880
  function fromArray(pbArray) {
15467
15881
  const rgaTreeList = new RGATreeList();
15468
15882
  for (const pbRGANode of pbArray.nodes) {
15469
- rgaTreeList.insert(fromElement(pbRGANode.element));
15883
+ if (!pbRGANode.element) {
15884
+ if (!pbRGANode.positionCreatedAt || !pbRGANode.positionRemovedAt) {
15885
+ throw new YorkieError(
15886
+ Code.ErrInvalidArgument,
15887
+ "dead RGA position node missing position timestamps"
15888
+ );
15889
+ }
15890
+ const posCreatedAt = fromTimeTicket(pbRGANode.positionCreatedAt);
15891
+ const posRemovedAt = fromTimeTicket(pbRGANode.positionRemovedAt);
15892
+ rgaTreeList.addDeadPosition(posCreatedAt, posRemovedAt);
15893
+ continue;
15894
+ }
15895
+ const elem = fromElement(pbRGANode.element);
15896
+ const posMovedAt = fromTimeTicket(pbRGANode.positionMovedAt);
15897
+ if (posMovedAt) {
15898
+ if (!pbRGANode.positionCreatedAt) {
15899
+ throw new YorkieError(
15900
+ Code.ErrInvalidArgument,
15901
+ "moved RGA node missing position_created_at"
15902
+ );
15903
+ }
15904
+ const posCreatedAt = fromTimeTicket(pbRGANode.positionCreatedAt);
15905
+ rgaTreeList.addMovedElement(elem, posCreatedAt, posMovedAt);
15906
+ } else {
15907
+ rgaTreeList.insert(elem);
15908
+ }
15470
15909
  }
15471
15910
  const arr = new CRDTArray(fromTimeTicket(pbArray.createdAt), rgaTreeList);
15472
15911
  arr.setMovedAt(fromTimeTicket(pbArray.movedAt));
@@ -16254,10 +16693,16 @@ class ArrayProxy {
16254
16693
  };
16255
16694
  } else if (method === "insertAfter") {
16256
16695
  return (prevID, value) => {
16696
+ let posCreatedAt;
16697
+ try {
16698
+ posCreatedAt = target.posCreatedAt(prevID);
16699
+ } catch {
16700
+ posCreatedAt = prevID;
16701
+ }
16257
16702
  const inserted = ArrayProxy.insertAfterInternal(
16258
16703
  context,
16259
16704
  target,
16260
- prevID,
16705
+ posCreatedAt,
16261
16706
  value
16262
16707
  );
16263
16708
  return toWrappedElement(context, inserted);
@@ -16442,7 +16887,7 @@ class ArrayProxy {
16442
16887
  static moveBeforeInternal(context, target, nextCreatedAt, createdAt) {
16443
16888
  const ticket = context.issueTimeTicket();
16444
16889
  const prevCreatedAt = target.getPrevCreatedAt(nextCreatedAt);
16445
- target.moveAfter(prevCreatedAt, createdAt, ticket);
16890
+ const deadNode = target.moveAfter(prevCreatedAt, createdAt, ticket);
16446
16891
  context.push(
16447
16892
  MoveOperation.create(
16448
16893
  target.getCreatedAt(),
@@ -16451,26 +16896,45 @@ class ArrayProxy {
16451
16896
  ticket
16452
16897
  )
16453
16898
  );
16899
+ if (deadNode) {
16900
+ context.registerGCPair({
16901
+ parent: target.getRGATreeList(),
16902
+ child: deadNode
16903
+ });
16904
+ }
16454
16905
  }
16455
16906
  /**
16456
16907
  * `moveAfterInternal` moves the given `createdAt` element
16457
- * after the specific element.
16908
+ * after the specific element. Converts element identity to
16909
+ * position identity for the prevCreatedAt.
16458
16910
  */
16459
16911
  static moveAfterInternal(context, target, prevCreatedAt, createdAt) {
16460
16912
  const ticket = context.issueTimeTicket();
16913
+ let posCreatedAt;
16914
+ try {
16915
+ posCreatedAt = target.posCreatedAt(prevCreatedAt);
16916
+ } catch {
16917
+ posCreatedAt = prevCreatedAt;
16918
+ }
16919
+ const deadNode = target.moveAfter(posCreatedAt, createdAt, ticket);
16461
16920
  context.push(
16462
16921
  MoveOperation.create(
16463
16922
  target.getCreatedAt(),
16464
- prevCreatedAt,
16923
+ posCreatedAt,
16465
16924
  createdAt,
16466
16925
  ticket
16467
16926
  )
16468
16927
  );
16469
- target.moveAfter(prevCreatedAt, createdAt, ticket);
16928
+ if (deadNode) {
16929
+ context.registerGCPair({
16930
+ parent: target.getRGATreeList(),
16931
+ child: deadNode
16932
+ });
16933
+ }
16470
16934
  }
16471
16935
  /**
16472
- * `moveAfterByIndexInternal` moves the given element to its new position
16473
- * after the given previous element.
16936
+ * `moveAfterByIndexInternal` moves the given element to its new
16937
+ * position after the given previous element.
16474
16938
  */
16475
16939
  static moveAfterByIndexInternal(context, target, prevIndex, targetIndex) {
16476
16940
  const prevElem = target.get(prevIndex);
@@ -16501,7 +16965,7 @@ class ArrayProxy {
16501
16965
  static moveFrontInternal(context, target, createdAt) {
16502
16966
  const ticket = context.issueTimeTicket();
16503
16967
  const head = target.getHead();
16504
- target.moveAfter(head.getCreatedAt(), createdAt, ticket);
16968
+ const deadNode = target.moveAfter(head.getCreatedAt(), createdAt, ticket);
16505
16969
  context.push(
16506
16970
  MoveOperation.create(
16507
16971
  target.getCreatedAt(),
@@ -16510,6 +16974,12 @@ class ArrayProxy {
16510
16974
  ticket
16511
16975
  )
16512
16976
  );
16977
+ if (deadNode) {
16978
+ context.registerGCPair({
16979
+ parent: target.getRGATreeList(),
16980
+ child: deadNode
16981
+ });
16982
+ }
16513
16983
  }
16514
16984
  /**
16515
16985
  * `moveLastInternal` moves the given `createdAt` element
@@ -16518,13 +16988,20 @@ class ArrayProxy {
16518
16988
  static moveLastInternal(context, target, createdAt) {
16519
16989
  const ticket = context.issueTimeTicket();
16520
16990
  const last = target.getLastCreatedAt();
16521
- target.moveAfter(last, createdAt, ticket);
16991
+ const deadNode = target.moveAfter(last, createdAt, ticket);
16522
16992
  context.push(
16523
16993
  MoveOperation.create(target.getCreatedAt(), last, createdAt, ticket)
16524
16994
  );
16995
+ if (deadNode) {
16996
+ context.registerGCPair({
16997
+ parent: target.getRGATreeList(),
16998
+ child: deadNode
16999
+ });
17000
+ }
16525
17001
  }
16526
17002
  /**
16527
- * `insertAfterInternal` inserts the value after the previously created element.
17003
+ * `insertAfterInternal` inserts the value after the previously
17004
+ * created element.
16528
17005
  */
16529
17006
  static insertAfterInternal(context, target, prevCreatedAt, value) {
16530
17007
  const createdAt = context.issueTimeTicket();
@@ -16552,12 +17029,13 @@ class ArrayProxy {
16552
17029
  `index out of bounds: ${index}`
16553
17030
  );
16554
17031
  }
16555
- ArrayProxy.insertAfterInternal(
16556
- context,
16557
- target,
16558
- prevElem.getCreatedAt(),
16559
- value
16560
- );
17032
+ let posCreatedAt;
17033
+ try {
17034
+ posCreatedAt = target.posCreatedAt(prevElem.getCreatedAt());
17035
+ } catch {
17036
+ posCreatedAt = prevElem.getCreatedAt();
17037
+ }
17038
+ ArrayProxy.insertAfterInternal(context, target, posCreatedAt, value);
16561
17039
  return target;
16562
17040
  }
16563
17041
  /**
@@ -16656,7 +17134,17 @@ class ArrayProxy {
16656
17134
  }
16657
17135
  }
16658
17136
  if (items) {
16659
- let previousID = from === 0 ? target.getHead().getID() : target.get(from - 1).getID();
17137
+ let previousID;
17138
+ if (from === 0) {
17139
+ previousID = target.getHead().getID();
17140
+ } else {
17141
+ const elemID = target.get(from - 1).getID();
17142
+ try {
17143
+ previousID = target.posCreatedAt(elemID);
17144
+ } catch {
17145
+ previousID = elemID;
17146
+ }
17147
+ }
16660
17148
  for (const item of items) {
16661
17149
  const newElem = ArrayProxy.insertAfterInternal(
16662
17150
  context,
@@ -18006,6 +18494,16 @@ class CRDTRoot {
18006
18494
  this.registerGCPair(pair);
18007
18495
  }
18008
18496
  }
18497
+ if (elem instanceof CRDTArray) {
18498
+ for (const node of elem.getAllRGANodes()) {
18499
+ if (!node.getElementEntry() && node.getRemovedAt()) {
18500
+ this.registerGCPair({
18501
+ parent: elem.getRGATreeList(),
18502
+ child: node
18503
+ });
18504
+ }
18505
+ }
18506
+ }
18009
18507
  return false;
18010
18508
  });
18011
18509
  }
@@ -19092,6 +19590,11 @@ class Document {
19092
19590
  if (logger.isEnabled(LogLevel.Trivial)) {
19093
19591
  logger.trivial(`trying to update a local change: ${this.toJSON()}`);
19094
19592
  }
19593
+ const prev = {
19594
+ hadPresence: this.presences.has(actorID),
19595
+ wasOnline: this.status === "attached",
19596
+ presence: this.presences.has(actorID) ? deepcopy(this.presences.get(actorID)) : void 0
19597
+ };
19095
19598
  const change = ctx.toChange();
19096
19599
  const { opInfos, reverseOps } = change.execute(
19097
19600
  this.root,
@@ -19137,14 +19640,14 @@ class Document {
19137
19640
  });
19138
19641
  }
19139
19642
  if (change.hasPresenceChange()) {
19140
- event.push({
19141
- type: "presence-changed",
19142
- source: OpSource.Local,
19143
- value: {
19144
- clientID: actorID,
19145
- presence: this.getPresence(actorID)
19146
- }
19147
- });
19643
+ const presenceEvent = this.reconcilePresence(
19644
+ actorID,
19645
+ prev,
19646
+ OpSource.Local
19647
+ );
19648
+ if (presenceEvent) {
19649
+ event.push(presenceEvent);
19650
+ }
19148
19651
  }
19149
19652
  this.publish(event);
19150
19653
  if (logger.isEnabled(LogLevel.Trivial)) {
@@ -19628,41 +20131,11 @@ class Document {
19628
20131
  change.execute(this.clone.root, this.clone.presences, source);
19629
20132
  const events = [];
19630
20133
  const actorID = change.getID().getActorID();
19631
- if (change.hasPresenceChange() && this.onlineClients.has(actorID)) {
19632
- const presenceChange = change.getPresenceChange();
19633
- switch (presenceChange.type) {
19634
- case PresenceChangeType.Put:
19635
- events.push(
19636
- this.presences.has(actorID) ? {
19637
- type: "presence-changed",
19638
- source,
19639
- value: {
19640
- clientID: actorID,
19641
- presence: presenceChange.presence
19642
- }
19643
- } : {
19644
- type: "watched",
19645
- source: OpSource.Remote,
19646
- value: {
19647
- clientID: actorID,
19648
- presence: presenceChange.presence
19649
- }
19650
- }
19651
- );
19652
- break;
19653
- case PresenceChangeType.Clear:
19654
- events.push({
19655
- type: "unwatched",
19656
- source: OpSource.Remote,
19657
- value: {
19658
- clientID: actorID,
19659
- presence: this.getPresence(actorID)
19660
- }
19661
- });
19662
- this.removeOnlineClient(actorID);
19663
- break;
19664
- }
19665
- }
20134
+ const prev = change.hasPresenceChange() ? {
20135
+ hadPresence: this.presences.has(actorID),
20136
+ wasOnline: this.onlineClients.has(actorID),
20137
+ presence: this.presences.has(actorID) ? deepcopy(this.presences.get(actorID)) : void 0
20138
+ } : void 0;
19666
20139
  const { opInfos, operations } = change.execute(
19667
20140
  this.root,
19668
20141
  this.presences,
@@ -19717,6 +20190,16 @@ class Document {
19717
20190
  }
19718
20191
  );
19719
20192
  }
20193
+ if (prev && change.hasPresenceChange()) {
20194
+ const presenceChange = change.getPresenceChange();
20195
+ if (presenceChange.type === PresenceChangeType.Clear) {
20196
+ this.removeOnlineClient(actorID);
20197
+ }
20198
+ const presenceEvent = this.reconcilePresence(actorID, prev, source);
20199
+ if (presenceEvent) {
20200
+ events.push(presenceEvent);
20201
+ }
20202
+ }
19720
20203
  if (events.length) {
19721
20204
  this.publish(events);
19722
20205
  }
@@ -19745,46 +20228,43 @@ class Document {
19745
20228
  * `applyDocEvent` applies the given doc event into this document.
19746
20229
  */
19747
20230
  applyDocEvent(type, publisher) {
19748
- const events = [];
20231
+ const prev = {
20232
+ hadPresence: this.presences.has(publisher),
20233
+ wasOnline: this.onlineClients.has(publisher),
20234
+ presence: this.presences.has(publisher) ? deepcopy(this.presences.get(publisher)) : void 0
20235
+ };
19749
20236
  if (type === DocEventType$1.DOCUMENT_WATCHED) {
19750
20237
  if (this.onlineClients.has(publisher) && this.hasPresence(publisher)) {
19751
20238
  return;
19752
20239
  }
19753
20240
  this.addOnlineClient(publisher);
19754
- if (this.hasPresence(publisher)) {
19755
- events.push({
19756
- type: "watched",
19757
- source: OpSource.Remote,
19758
- value: {
19759
- clientID: publisher,
19760
- presence: this.getPresence(publisher)
19761
- }
19762
- });
19763
- }
19764
20241
  } else if (type === DocEventType$1.DOCUMENT_UNWATCHED) {
19765
- const presence = this.getPresence(publisher);
19766
20242
  this.removeOnlineClient(publisher);
19767
20243
  this.presences.delete(publisher);
19768
- if (presence) {
19769
- events.push({
19770
- type: "unwatched",
19771
- source: OpSource.Remote,
19772
- value: { clientID: publisher, presence }
19773
- });
19774
- }
19775
20244
  }
19776
- if (events.length) {
19777
- this.publish(events);
20245
+ const event = this.reconcilePresence(publisher, prev, OpSource.Remote);
20246
+ if (event) {
20247
+ this.publish([event]);
19778
20248
  }
19779
20249
  }
19780
20250
  /**
19781
20251
  * `applyStatus` applies the document status into this document.
19782
20252
  */
19783
20253
  applyStatus(status) {
20254
+ const actorID = this.changeID.getActorID();
20255
+ const prev = {
20256
+ hadPresence: this.presences.has(actorID),
20257
+ wasOnline: this.status === "attached",
20258
+ presence: this.presences.has(actorID) ? deepcopy(this.presences.get(actorID)) : void 0
20259
+ };
19784
20260
  this.status = status;
19785
20261
  if (status === "detached") {
19786
20262
  this.setActor(InitialActorID);
19787
20263
  }
20264
+ const event = this.reconcilePresence(actorID, prev, OpSource.Local);
20265
+ if (event) {
20266
+ this.publish([event]);
20267
+ }
19788
20268
  this.publish([
19789
20269
  {
19790
20270
  source: status === "removed" ? OpSource.Remote : OpSource.Local,
@@ -19884,6 +20364,57 @@ class Document {
19884
20364
  removeOnlineClient(clientID) {
19885
20365
  this.onlineClients.delete(clientID);
19886
20366
  }
20367
+ /**
20368
+ * `reconcilePresence` compares the previous and current state of a client's
20369
+ * presence/online status and returns the appropriate event to emit.
20370
+ *
20371
+ * For remote clients, "online" means the client is in onlineClients.
20372
+ * For self, "online" means the document status is Attached.
20373
+ *
20374
+ * State transition table:
20375
+ * (!hadP || !wasOn) → (hasP && isOn) : watched (remote) or presence-changed (self)
20376
+ * (hadP && wasOn) → (hasP && isOn) : presence-changed
20377
+ * (hadP && wasOn) → (!hasP || !isOn): unwatched (remote only)
20378
+ * otherwise : no event (waiting)
20379
+ */
20380
+ reconcilePresence(actorID, prev, source) {
20381
+ const isSelf = actorID === this.changeID.getActorID();
20382
+ const hasPresence = this.presences.has(actorID);
20383
+ const isOnline = isSelf ? this.status === "attached" : this.onlineClients.has(actorID);
20384
+ if (!hasPresence || !isOnline) {
20385
+ if (prev.hadPresence && prev.wasOnline && !isSelf) {
20386
+ return {
20387
+ type: "unwatched",
20388
+ source: OpSource.Remote,
20389
+ value: {
20390
+ clientID: actorID,
20391
+ presence: prev.presence
20392
+ }
20393
+ };
20394
+ }
20395
+ return void 0;
20396
+ }
20397
+ const presence = deepcopy(this.presences.get(actorID));
20398
+ if (!prev.hadPresence || !prev.wasOnline) {
20399
+ if (isSelf) {
20400
+ return {
20401
+ type: "presence-changed",
20402
+ source,
20403
+ value: { clientID: actorID, presence }
20404
+ };
20405
+ }
20406
+ return {
20407
+ type: "watched",
20408
+ source: OpSource.Remote,
20409
+ value: { clientID: actorID, presence }
20410
+ };
20411
+ }
20412
+ return {
20413
+ type: "presence-changed",
20414
+ source,
20415
+ value: { clientID: actorID, presence }
20416
+ };
20417
+ }
19887
20418
  /**
19888
20419
  * `hasPresence` returns whether the given clientID has a presence or not.
19889
20420
  */
@@ -20045,18 +20576,24 @@ class Document {
20045
20576
  const ticket = ctx.issueTimeTicket();
20046
20577
  op.setExecutedAt(ticket);
20047
20578
  if (op instanceof ArraySetOperation) {
20048
- const prev = op.getCreatedAt();
20579
+ const prev2 = op.getCreatedAt();
20049
20580
  op.getValue().setCreatedAt(ticket);
20050
- this.internalHistory.reconcileCreatedAt(prev, ticket);
20581
+ this.internalHistory.reconcileCreatedAt(prev2, ticket);
20051
20582
  } else if (op instanceof AddOperation) {
20052
- const prev = op.getValue().getCreatedAt();
20583
+ const prev2 = op.getValue().getCreatedAt();
20053
20584
  op.getValue().setCreatedAt(ticket);
20054
- this.internalHistory.reconcileCreatedAt(prev, ticket);
20585
+ this.internalHistory.reconcileCreatedAt(prev2, ticket);
20055
20586
  }
20056
20587
  ctx.push(op);
20057
20588
  }
20058
20589
  const change = ctx.toChange();
20059
20590
  change.execute(this.clone.root, this.clone.presences, OpSource.UndoRedo);
20591
+ const actorID = this.changeID.getActorID();
20592
+ const prev = {
20593
+ hadPresence: this.presences.has(actorID),
20594
+ wasOnline: this.status === "attached",
20595
+ presence: this.presences.has(actorID) ? deepcopy(this.presences.get(actorID)) : void 0
20596
+ };
20060
20597
  const { opInfos, reverseOps } = change.execute(
20061
20598
  this.root,
20062
20599
  this.presences,
@@ -20078,7 +20615,6 @@ class Document {
20078
20615
  }
20079
20616
  this.localChanges.push(change);
20080
20617
  this.changeID = ctx.getNextID();
20081
- const actorID = this.changeID.getActorID();
20082
20618
  const events = [];
20083
20619
  if (opInfos.length) {
20084
20620
  events.push({
@@ -20095,14 +20631,14 @@ class Document {
20095
20631
  });
20096
20632
  }
20097
20633
  if (change.hasPresenceChange()) {
20098
- events.push({
20099
- type: "presence-changed",
20100
- source: OpSource.UndoRedo,
20101
- value: {
20102
- clientID: actorID,
20103
- presence: this.getPresence(actorID)
20104
- }
20105
- });
20634
+ const presenceEvent = this.reconcilePresence(
20635
+ actorID,
20636
+ prev,
20637
+ OpSource.UndoRedo
20638
+ );
20639
+ if (presenceEvent) {
20640
+ events.push(presenceEvent);
20641
+ }
20106
20642
  }
20107
20643
  this.publish(events);
20108
20644
  }
@@ -20118,6 +20654,8 @@ class Attachment {
20118
20654
  watchStream;
20119
20655
  watchLoopTimerID;
20120
20656
  watchAbortController;
20657
+ syncPromise;
20658
+ _detaching = false;
20121
20659
  constructor(reconnectStreamDelay, resource, resourceID, syncMode) {
20122
20660
  this.reconnectStreamDelay = reconnectStreamDelay;
20123
20661
  this.resource = resource;
@@ -20193,6 +20731,49 @@ class Attachment {
20193
20731
  };
20194
20732
  await doLoop();
20195
20733
  }
20734
+ /**
20735
+ * `markDetaching` marks this attachment as being in the process of detaching.
20736
+ * Once marked, the sync loop will skip this attachment.
20737
+ */
20738
+ markDetaching() {
20739
+ this._detaching = true;
20740
+ }
20741
+ /**
20742
+ * `isDetaching` returns whether this attachment is being detached.
20743
+ */
20744
+ isDetaching() {
20745
+ return this._detaching;
20746
+ }
20747
+ /**
20748
+ * `resetDetaching` resets the detaching flag so the attachment can resume
20749
+ * syncing. Used when a detach RPC fails and the document remains attached.
20750
+ */
20751
+ resetDetaching() {
20752
+ this._detaching = false;
20753
+ }
20754
+ /**
20755
+ * `setSyncPromise` sets the in-progress sync promise for this attachment.
20756
+ */
20757
+ setSyncPromise(promise) {
20758
+ this.syncPromise = promise;
20759
+ }
20760
+ /**
20761
+ * `clearSyncPromise` clears the in-progress sync promise.
20762
+ */
20763
+ clearSyncPromise() {
20764
+ this.syncPromise = void 0;
20765
+ }
20766
+ /**
20767
+ * `waitForSyncComplete` waits for any in-progress sync to complete.
20768
+ */
20769
+ async waitForSyncComplete() {
20770
+ if (this.syncPromise) {
20771
+ try {
20772
+ await this.syncPromise;
20773
+ } catch {
20774
+ }
20775
+ }
20776
+ }
20196
20777
  /**
20197
20778
  * `cancelWatchStream` cancels the watch stream.
20198
20779
  */
@@ -20227,7 +20808,7 @@ function createAuthInterceptor(apiKey, token) {
20227
20808
  };
20228
20809
  }
20229
20810
  const name$1 = "@yorkie-js/sdk";
20230
- const version$1 = "0.7.5";
20811
+ const version$1 = "0.7.6";
20231
20812
  const pkg$1 = {
20232
20813
  name: name$1,
20233
20814
  version: version$1
@@ -20542,6 +21123,7 @@ class Client {
20542
21123
  taskQueue;
20543
21124
  processing = false;
20544
21125
  keepalive = false;
21126
+ deactivating = false;
20545
21127
  /**
20546
21128
  * @param rpcAddr - the address of the RPC server.
20547
21129
  * @param opts - the options of the client.
@@ -20611,6 +21193,7 @@ class Client {
20611
21193
  );
20612
21194
  this.id = res.clientId;
20613
21195
  this.status = "activated";
21196
+ this.deactivating = false;
20614
21197
  this.runSyncLoop();
20615
21198
  logger.info(`[AC] c:"${this.getKey()}" activated, id:"${this.id}"`);
20616
21199
  if (typeof window !== "undefined") {
@@ -20639,6 +21222,7 @@ class Client {
20639
21222
  if (this.status === "deactivated") {
20640
21223
  return Promise.resolve();
20641
21224
  }
21225
+ this.deactivating = true;
20642
21226
  const task = async () => {
20643
21227
  try {
20644
21228
  await this.rpcClient.deactivateClient(
@@ -20652,6 +21236,7 @@ class Client {
20652
21236
  logger.info(`[DC] c"${this.getKey()}" deactivated`);
20653
21237
  } catch (err) {
20654
21238
  logger.error(`[DC] c:"${this.getKey()}" err :`, err);
21239
+ this.deactivating = false;
20655
21240
  await this.handleConnectError(err);
20656
21241
  throw err;
20657
21242
  }
@@ -20792,8 +21377,10 @@ class Client {
20792
21377
  );
20793
21378
  }
20794
21379
  doc.update((_, p) => p.clear());
21380
+ attachment.markDetaching();
20795
21381
  const task = async () => {
20796
21382
  try {
21383
+ await attachment.waitForSyncComplete();
20797
21384
  const res = await this.rpcClient.detachDocument(
20798
21385
  {
20799
21386
  clientId: this.id,
@@ -20812,6 +21399,7 @@ class Client {
20812
21399
  return doc;
20813
21400
  } catch (err) {
20814
21401
  logger.error(`[DD] c:"${this.getKey()}" err :`, err);
21402
+ attachment.resetDetaching();
20815
21403
  await this.handleConnectError(err);
20816
21404
  throw err;
20817
21405
  }
@@ -21378,7 +21966,7 @@ class Client {
21378
21966
  */
21379
21967
  runSyncLoop() {
21380
21968
  const doLoop = async () => {
21381
- if (!this.isActive()) {
21969
+ if (!this.isActive() || this.deactivating) {
21382
21970
  logger.debug(`[SL] c:"${this.getKey()}" exit sync loop`);
21383
21971
  this.conditions[
21384
21972
  "SyncLoop"
@@ -21390,43 +21978,62 @@ class Client {
21390
21978
  await this.enqueueTask(async () => {
21391
21979
  const syncs = [];
21392
21980
  for (const [, attachment] of this.attachmentMap) {
21981
+ if (this.deactivating) {
21982
+ break;
21983
+ }
21393
21984
  if (!attachment.needSync(this.channelHeartbeatInterval)) {
21394
21985
  continue;
21395
21986
  }
21987
+ if (attachment.isDetaching()) {
21988
+ continue;
21989
+ }
21396
21990
  if (attachment.changeEventReceived !== void 0) {
21397
21991
  attachment.changeEventReceived = false;
21398
21992
  }
21399
- syncs.push(
21400
- this.syncInternal(attachment, attachment.syncMode).catch((e) => {
21401
- if (isErrorCode(e, Code.ErrUnauthenticated)) {
21402
- attachment.resource.publish([
21403
- {
21404
- type: DocEventType.AuthError,
21405
- value: {
21406
- reason: errorMetadataOf(e).reason,
21407
- method: "PushPull"
21408
- }
21993
+ const syncPromise = this.syncInternal(
21994
+ attachment,
21995
+ attachment.syncMode
21996
+ ).then(() => {
21997
+ }).catch((e) => {
21998
+ if (isErrorCode(e, Code.ErrUnauthenticated)) {
21999
+ attachment.resource.publish([
22000
+ {
22001
+ type: DocEventType.AuthError,
22002
+ value: {
22003
+ reason: errorMetadataOf(e).reason,
22004
+ method: "PushPull"
21409
22005
  }
21410
- ]);
21411
- }
21412
- if (isErrorCode(e, Code.ErrEpochMismatch)) {
21413
- attachment.resource.publish([
21414
- {
21415
- type: DocEventType.EpochMismatch,
21416
- value: {
21417
- method: "PushPull"
21418
- }
22006
+ }
22007
+ ]);
22008
+ }
22009
+ if (isErrorCode(e, Code.ErrEpochMismatch)) {
22010
+ attachment.resource.publish([
22011
+ {
22012
+ type: DocEventType.EpochMismatch,
22013
+ value: {
22014
+ method: "PushPull"
21419
22015
  }
21420
- ]);
21421
- }
21422
- throw e;
21423
- })
21424
- );
22016
+ }
22017
+ ]);
22018
+ }
22019
+ throw e;
22020
+ }).finally(() => {
22021
+ attachment.clearSyncPromise();
22022
+ });
22023
+ attachment.setSyncPromise(syncPromise);
22024
+ syncs.push(syncPromise);
21425
22025
  }
21426
22026
  await Promise.all(syncs);
21427
22027
  setTimeout(doLoop, this.syncLoopDuration);
21428
22028
  });
21429
22029
  } catch (err) {
22030
+ if (this.deactivating) {
22031
+ this.conditions[
22032
+ "SyncLoop"
22033
+ /* SyncLoop */
22034
+ ] = false;
22035
+ return;
22036
+ }
21430
22037
  logger.error(`[SL] c:"${this.getKey()}" sync failed:`, err);
21431
22038
  if (await this.handleConnectError(err)) {
21432
22039
  setTimeout(doLoop, this.retrySyncLoopDelay);
@@ -22098,7 +22705,7 @@ if (typeof globalThis !== "undefined") {
22098
22705
  };
22099
22706
  }
22100
22707
  const name = "@yorkie-js/react";
22101
- const version = "0.7.5";
22708
+ const version = "0.7.6";
22102
22709
  const pkg = {
22103
22710
  name,
22104
22711
  version