@fluidframework/container-runtime 2.0.0-rc.3.0.1 → 2.0.0-rc.3.0.2
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.
- package/api-report/container-runtime.api.md +23 -7
- package/dist/channelCollection.d.ts +5 -3
- package/dist/channelCollection.d.ts.map +1 -1
- package/dist/channelCollection.js +65 -15
- package/dist/channelCollection.js.map +1 -1
- package/dist/containerRuntime.d.ts +5 -0
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +25 -5
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStoreContexts.d.ts +2 -0
- package/dist/dataStoreContexts.d.ts.map +1 -1
- package/dist/dataStoreContexts.js +7 -0
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/gc/garbageCollection.d.ts +4 -11
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js +45 -29
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcDefinitions.d.ts +26 -5
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/gcDefinitions.js.map +1 -1
- package/dist/gc/gcHelpers.d.ts +5 -4
- package/dist/gc/gcHelpers.d.ts.map +1 -1
- package/dist/gc/gcHelpers.js +14 -2
- package/dist/gc/gcHelpers.js.map +1 -1
- package/dist/gc/gcTelemetry.d.ts +13 -2
- package/dist/gc/gcTelemetry.d.ts.map +1 -1
- package/dist/gc/gcTelemetry.js +24 -21
- package/dist/gc/gcTelemetry.js.map +1 -1
- package/dist/gc/index.d.ts +2 -2
- package/dist/gc/index.d.ts.map +1 -1
- package/dist/gc/index.js +2 -2
- package/dist/gc/index.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/legacy.d.ts +1 -0
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/summary/documentSchema.js +1 -1
- package/dist/summary/documentSchema.js.map +1 -1
- package/lib/channelCollection.d.ts +5 -3
- package/lib/channelCollection.d.ts.map +1 -1
- package/lib/channelCollection.js +67 -17
- package/lib/channelCollection.js.map +1 -1
- package/lib/containerRuntime.d.ts +5 -0
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +24 -4
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStoreContexts.d.ts +2 -0
- package/lib/dataStoreContexts.d.ts.map +1 -1
- package/lib/dataStoreContexts.js +7 -0
- package/lib/dataStoreContexts.js.map +1 -1
- package/lib/gc/garbageCollection.d.ts +4 -11
- package/lib/gc/garbageCollection.d.ts.map +1 -1
- package/lib/gc/garbageCollection.js +47 -31
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcDefinitions.d.ts +26 -5
- package/lib/gc/gcDefinitions.d.ts.map +1 -1
- package/lib/gc/gcDefinitions.js.map +1 -1
- package/lib/gc/gcHelpers.d.ts +5 -4
- package/lib/gc/gcHelpers.d.ts.map +1 -1
- package/lib/gc/gcHelpers.js +12 -1
- package/lib/gc/gcHelpers.js.map +1 -1
- package/lib/gc/gcTelemetry.d.ts +13 -2
- package/lib/gc/gcTelemetry.d.ts.map +1 -1
- package/lib/gc/gcTelemetry.js +24 -21
- package/lib/gc/gcTelemetry.js.map +1 -1
- package/lib/gc/index.d.ts +2 -2
- package/lib/gc/index.d.ts.map +1 -1
- package/lib/gc/index.js +1 -1
- package/lib/gc/index.js.map +1 -1
- package/lib/index.d.ts +2 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/legacy.d.ts +1 -0
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/summary/documentSchema.js +1 -1
- package/lib/summary/documentSchema.js.map +1 -1
- package/package.json +17 -17
- package/src/channelCollection.ts +85 -35
- package/src/containerRuntime.ts +24 -24
- package/src/dataStoreContexts.ts +12 -0
- package/src/gc/garbageCollection.ts +63 -41
- package/src/gc/gcDefinitions.ts +21 -9
- package/src/gc/gcHelpers.ts +14 -1
- package/src/gc/gcTelemetry.ts +56 -47
- package/src/gc/index.ts +2 -1
- package/src/index.ts +2 -0
- package/src/packageVersion.ts +1 -1
- package/src/summary/documentSchema.ts +1 -1
|
@@ -77,7 +77,7 @@ export const AllowTombstoneRequestHeaderKey = "allowTombstone";
|
|
|
77
77
|
|
|
78
78
|
// @internal
|
|
79
79
|
export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
80
|
-
constructor(baseSnapshot: ISnapshotTree | undefined, parentContext: IFluidParentContext, baseLogger: ITelemetryBaseLogger, gcNodeUpdated: (
|
|
80
|
+
constructor(baseSnapshot: ISnapshotTree | undefined, parentContext: IFluidParentContext, baseLogger: ITelemetryBaseLogger, gcNodeUpdated: (props: IGCNodeUpdatedProps) => void, isDataStoreDeleted: (nodePath: string) => boolean, aliasMap: Map<string, string>, provideEntryPoint: (runtime: ChannelCollection) => Promise<FluidObject>);
|
|
81
81
|
// (undocumented)
|
|
82
82
|
get aliases(): ReadonlyMap<string, string>;
|
|
83
83
|
// (undocumented)
|
|
@@ -112,8 +112,6 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
112
112
|
// (undocumented)
|
|
113
113
|
readonly entryPoint: IFluidHandle<FluidObject>;
|
|
114
114
|
getAttachSummary(telemetryContext?: ITelemetryContext): ISummaryTreeWithStats;
|
|
115
|
-
// (undocumented)
|
|
116
|
-
getDataStore(id: string, requestHeaderData: RuntimeHeaderData): Promise<IFluidDataStoreContextInternal>;
|
|
117
115
|
getDataStoreIfAvailable(id: string, requestHeaderData: RuntimeHeaderData): Promise<IFluidDataStoreContextInternal | undefined>;
|
|
118
116
|
getDataStorePackagePath(nodePath: string): Promise<readonly string[] | undefined>;
|
|
119
117
|
getGCData(fullGC?: boolean): Promise<IGarbageCollectionData>;
|
|
@@ -386,6 +384,8 @@ export class DataStoreContexts implements Iterable<[string, FluidDataStoreContex
|
|
|
386
384
|
// (undocumented)
|
|
387
385
|
get(id: string): FluidDataStoreContext | undefined;
|
|
388
386
|
getBoundOrRemoted(id: string, wait: boolean): Promise<FluidDataStoreContext | undefined>;
|
|
387
|
+
// (undocumented)
|
|
388
|
+
getRecentlyDeletedContext(id: string): FluidDataStoreContext | undefined;
|
|
389
389
|
getUnbound(id: string): LocalFluidDataStoreContext | undefined;
|
|
390
390
|
// (undocumented)
|
|
391
391
|
has(id: string): boolean;
|
|
@@ -400,6 +400,9 @@ export class DataStoreContexts implements Iterable<[string, FluidDataStoreContex
|
|
|
400
400
|
// @alpha (undocumented)
|
|
401
401
|
export const DefaultSummaryConfiguration: ISummaryConfiguration;
|
|
402
402
|
|
|
403
|
+
// @alpha
|
|
404
|
+
export const DeletedResponseHeaderKey = "wasDeleted";
|
|
405
|
+
|
|
403
406
|
// @internal
|
|
404
407
|
export function detectOutboundReferences(address: string, contents: unknown, addedOutboundReference: (fromNodePath: string, toNodePath: string) => void): void;
|
|
405
408
|
|
|
@@ -591,10 +594,10 @@ export type GCFeatureMatrix = {
|
|
|
591
594
|
|
|
592
595
|
// @alpha
|
|
593
596
|
export const GCNodeType: {
|
|
594
|
-
DataStore:
|
|
595
|
-
SubDataStore:
|
|
596
|
-
Blob:
|
|
597
|
-
Other:
|
|
597
|
+
readonly DataStore: "DataStore";
|
|
598
|
+
readonly SubDataStore: "SubDataStore";
|
|
599
|
+
readonly Blob: "Blob";
|
|
600
|
+
readonly Other: "Other";
|
|
598
601
|
};
|
|
599
602
|
|
|
600
603
|
// @alpha (undocumented)
|
|
@@ -832,6 +835,19 @@ export interface IGCMetadata {
|
|
|
832
835
|
readonly tombstoneTimeoutMs?: number;
|
|
833
836
|
}
|
|
834
837
|
|
|
838
|
+
// @internal
|
|
839
|
+
export interface IGCNodeUpdatedProps {
|
|
840
|
+
headerData?: RuntimeHeaderData;
|
|
841
|
+
node: {
|
|
842
|
+
type: (typeof GCNodeType)["DataStore" | "Blob"];
|
|
843
|
+
path: string;
|
|
844
|
+
};
|
|
845
|
+
packagePath?: readonly string[];
|
|
846
|
+
reason: "Loaded" | "Changed";
|
|
847
|
+
request?: IRequest;
|
|
848
|
+
timestampMs?: number;
|
|
849
|
+
}
|
|
850
|
+
|
|
835
851
|
// @alpha (undocumented)
|
|
836
852
|
export interface IGCRuntimeOptions {
|
|
837
853
|
[key: string]: any;
|
|
@@ -11,7 +11,7 @@ import { MonitoringContext } from "@fluidframework/telemetry-utils/internal";
|
|
|
11
11
|
import { RuntimeHeaderData } from "./containerRuntime.js";
|
|
12
12
|
import { IFluidDataStoreContextInternal, ILocalDetachedFluidDataStoreContextProps, LocalFluidDataStoreContext } from "./dataStoreContext.js";
|
|
13
13
|
import { DataStoreContexts } from "./dataStoreContexts.js";
|
|
14
|
-
import { GCNodeType } from "./gc/index.js";
|
|
14
|
+
import { GCNodeType, IGCNodeUpdatedProps } from "./gc/index.js";
|
|
15
15
|
import { IContainerRuntimeMetadata } from "./summary/index.js";
|
|
16
16
|
/**
|
|
17
17
|
* Accepted header keys for requests coming to the runtime.
|
|
@@ -70,7 +70,7 @@ export declare class ChannelCollection implements IFluidDataStoreChannel, IDispo
|
|
|
70
70
|
private readonly pendingAliasMap;
|
|
71
71
|
protected readonly contexts: DataStoreContexts;
|
|
72
72
|
private readonly aliasedDataStores;
|
|
73
|
-
constructor(baseSnapshot: ISnapshotTree | undefined, parentContext: IFluidParentContext, baseLogger: ITelemetryBaseLogger, gcNodeUpdated: (
|
|
73
|
+
constructor(baseSnapshot: ISnapshotTree | undefined, parentContext: IFluidParentContext, baseLogger: ITelemetryBaseLogger, gcNodeUpdated: (props: IGCNodeUpdatedProps) => void, isDataStoreDeleted: (nodePath: string) => boolean, aliasMap: Map<string, string>, provideEntryPoint: (runtime: ChannelCollection) => Promise<FluidObject>);
|
|
74
74
|
get aliases(): ReadonlyMap<string, string>;
|
|
75
75
|
get pendingAliases(): Map<string, Promise<AliasResult>>;
|
|
76
76
|
waitIfPendingAlias(maybeAlias: string): Promise<AliasResult>;
|
|
@@ -126,7 +126,7 @@ export declare class ChannelCollection implements IFluidDataStoreChannel, IDispo
|
|
|
126
126
|
private applyStashedAttachOp;
|
|
127
127
|
process(message: ISequencedDocumentMessage, local: boolean, localMessageMetadata: unknown, addedOutboundReference?: (fromNodePath: string, toNodePath: string) => void): void;
|
|
128
128
|
protected processChannelOp(address: string, message: ISequencedDocumentMessage, local: boolean, localMessageMetadata: unknown): void;
|
|
129
|
-
getDataStore
|
|
129
|
+
private getDataStore;
|
|
130
130
|
/**
|
|
131
131
|
* Returns the data store requested with the given id if available. Otherwise, returns undefined.
|
|
132
132
|
*/
|
|
@@ -135,8 +135,10 @@ export declare class ChannelCollection implements IFluidDataStoreChannel, IDispo
|
|
|
135
135
|
* Checks if the data store has been deleted by GC. If so, log an error.
|
|
136
136
|
* @param id - The data store's id.
|
|
137
137
|
* @param context - The data store context.
|
|
138
|
+
* @param deletedLogSuffix - Whether it was Changed or Requested (will go into the eventName)
|
|
138
139
|
* @param callSite - The function name this is called from.
|
|
139
140
|
* @param requestHeaderData - The request header information to log if the data store is deleted.
|
|
141
|
+
* @param originalRequest - The original request (could be for a child of the DataStore)
|
|
140
142
|
* @returns true if the data store is deleted. Otherwise, returns false.
|
|
141
143
|
*/
|
|
142
144
|
private checkAndLogIfDeleted;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channelCollection.d.ts","sourceRoot":"","sources":["../src/channelCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AACpE,OAAO,EACN,WAAW,EACX,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,oBAAoB,EACpB,MAAM,iCAAiC,CAAC;AAIzC,OAAO,EAAE,yBAAyB,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAChG,OAAO,EACN,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACN,WAAW,EAGX,SAAS,EACT,sBAAsB,EACtB,sBAAsB,EACtB,8BAA8B,EAC9B,sBAAsB,EACtB,uBAAuB,EACvB,mBAAmB,EAGnB,kCAAkC,EAElC,MAAM,8CAA8C,CAAC;AAetD,OAAO,EAIN,iBAAiB,EAKjB,MAAM,0CAA0C,CAAC;AAElD,OAAO,
|
|
1
|
+
{"version":3,"file":"channelCollection.d.ts","sourceRoot":"","sources":["../src/channelCollection.ts"],"names":[],"mappings":"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"}
|
|
@@ -609,14 +609,20 @@ class ChannelCollection {
|
|
|
609
609
|
context.process(message, local, localMessageMetadata);
|
|
610
610
|
// Notify that a GC node for the data store changed. This is used to detect if a deleted data store is
|
|
611
611
|
// being used.
|
|
612
|
-
this.gcNodeUpdated(
|
|
612
|
+
this.gcNodeUpdated({
|
|
613
|
+
node: { type: "DataStore", path: `/${address}` },
|
|
614
|
+
reason: "Changed",
|
|
615
|
+
timestampMs: message.timestamp,
|
|
616
|
+
packagePath: context.isLoaded ? context.packagePath : undefined,
|
|
617
|
+
});
|
|
613
618
|
}
|
|
614
|
-
async getDataStore(id, requestHeaderData) {
|
|
619
|
+
async getDataStore(id, requestHeaderData, originalRequest) {
|
|
615
620
|
const headerData = { ...containerRuntime_js_1.defaultRuntimeHeaderData, ...requestHeaderData };
|
|
616
|
-
if (this.checkAndLogIfDeleted(id, this.contexts.get(id), "Requested", "getDataStore", requestHeaderData)) {
|
|
621
|
+
if (this.checkAndLogIfDeleted(id, this.contexts.get(id), "Requested", "getDataStore", requestHeaderData, originalRequest)) {
|
|
617
622
|
// The requested data store has been deleted by gc. Create a 404 response exception.
|
|
618
|
-
|
|
619
|
-
|
|
623
|
+
throw (0, internal_5.responseToException)((0, internal_5.createResponseError)(404, "DataStore was deleted", originalRequest, {
|
|
624
|
+
[containerRuntime_js_1.DeletedResponseHeaderKey]: true,
|
|
625
|
+
}), originalRequest);
|
|
620
626
|
}
|
|
621
627
|
const context = await this.contexts.getBoundOrRemoted(id, headerData.wait);
|
|
622
628
|
if (context === undefined) {
|
|
@@ -645,21 +651,52 @@ class ChannelCollection {
|
|
|
645
651
|
* Checks if the data store has been deleted by GC. If so, log an error.
|
|
646
652
|
* @param id - The data store's id.
|
|
647
653
|
* @param context - The data store context.
|
|
654
|
+
* @param deletedLogSuffix - Whether it was Changed or Requested (will go into the eventName)
|
|
648
655
|
* @param callSite - The function name this is called from.
|
|
649
656
|
* @param requestHeaderData - The request header information to log if the data store is deleted.
|
|
657
|
+
* @param originalRequest - The original request (could be for a child of the DataStore)
|
|
650
658
|
* @returns true if the data store is deleted. Otherwise, returns false.
|
|
651
659
|
*/
|
|
652
|
-
checkAndLogIfDeleted(id, context, deletedLogSuffix, callSite, requestHeaderData) {
|
|
660
|
+
checkAndLogIfDeleted(id, context, deletedLogSuffix, callSite, requestHeaderData, originalRequest) {
|
|
653
661
|
const dataStoreNodePath = `/${id}`;
|
|
654
662
|
if (!this.isDataStoreDeleted(dataStoreNodePath)) {
|
|
655
663
|
return false;
|
|
656
664
|
}
|
|
665
|
+
const idToLog = originalRequest !== undefined
|
|
666
|
+
? (0, index_js_1.urlToGCNodePath)(originalRequest.url)
|
|
667
|
+
: dataStoreNodePath;
|
|
668
|
+
// Log the package details asynchronously since getInitialSnapshotDetails is async
|
|
669
|
+
const recentelyDeletedContext = this.contexts.getRecentlyDeletedContext(id);
|
|
670
|
+
if (recentelyDeletedContext !== undefined) {
|
|
671
|
+
recentelyDeletedContext
|
|
672
|
+
.getInitialSnapshotDetails()
|
|
673
|
+
.then((details) => {
|
|
674
|
+
return details.pkg.join("/");
|
|
675
|
+
})
|
|
676
|
+
.then((pkg) => ({ pkg, error: undefined }), (error) => ({ pkg: undefined, error }))
|
|
677
|
+
.then(({ pkg, error }) => {
|
|
678
|
+
this.mc.logger.sendTelemetryEvent({
|
|
679
|
+
eventName: `GC_DeletedDataStore_PathInfo`,
|
|
680
|
+
...(0, internal_6.tagCodeArtifacts)({
|
|
681
|
+
id: idToLog,
|
|
682
|
+
pkg,
|
|
683
|
+
}),
|
|
684
|
+
callSite,
|
|
685
|
+
}, error);
|
|
686
|
+
})
|
|
687
|
+
.catch(() => { });
|
|
688
|
+
}
|
|
657
689
|
this.mc.logger.sendErrorEvent({
|
|
658
690
|
eventName: `GC_Deleted_DataStore_${deletedLogSuffix}`,
|
|
659
|
-
...(0, internal_6.tagCodeArtifacts)({ id }),
|
|
691
|
+
...(0, internal_6.tagCodeArtifacts)({ id: idToLog }),
|
|
660
692
|
callSite,
|
|
661
693
|
headers: JSON.stringify(requestHeaderData),
|
|
662
694
|
exists: context !== undefined,
|
|
695
|
+
details: {
|
|
696
|
+
url: originalRequest?.url,
|
|
697
|
+
headers: JSON.stringify(originalRequest?.headers),
|
|
698
|
+
aliased: this.aliasedDataStores.has(id),
|
|
699
|
+
},
|
|
663
700
|
});
|
|
664
701
|
return true;
|
|
665
702
|
}
|
|
@@ -849,6 +886,15 @@ class ChannelCollection {
|
|
|
849
886
|
deleteChild(dataStoreId) {
|
|
850
887
|
const dataStoreContext = this.contexts.get(dataStoreId);
|
|
851
888
|
(0, internal_1.assert)(dataStoreContext !== undefined, 0x2d7 /* No data store with specified id */);
|
|
889
|
+
if (dataStoreContext.isLoaded) {
|
|
890
|
+
this.mc.logger.sendTelemetryEvent({
|
|
891
|
+
eventName: "GC_DeletingLoadedDataStore",
|
|
892
|
+
...(0, internal_6.tagCodeArtifacts)({
|
|
893
|
+
id: dataStoreId,
|
|
894
|
+
pkg: dataStoreContext.packagePath.join("/"),
|
|
895
|
+
}),
|
|
896
|
+
});
|
|
897
|
+
}
|
|
852
898
|
dataStoreContext.delete();
|
|
853
899
|
// Delete the contexts of unused data stores.
|
|
854
900
|
this.contexts.delete(dataStoreId);
|
|
@@ -975,21 +1021,25 @@ class ChannelCollection {
|
|
|
975
1021
|
if (typeof request.headers?.[exports.AllowInactiveRequestHeaderKey] === "boolean") {
|
|
976
1022
|
headerData.allowInactive = request.headers[exports.AllowInactiveRequestHeaderKey];
|
|
977
1023
|
}
|
|
978
|
-
// We allow Tombstone requests for sub-DataStore objects
|
|
1024
|
+
// We allow Tombstone/Inactive requests for sub-DataStore objects
|
|
979
1025
|
if (requestForChild) {
|
|
980
1026
|
headerData.allowTombstone = true;
|
|
1027
|
+
headerData.allowInactive = true;
|
|
981
1028
|
}
|
|
982
1029
|
await this.waitIfPendingAlias(id);
|
|
983
1030
|
const internalId = this.internalId(id);
|
|
984
|
-
const dataStoreContext = await this.getDataStore(internalId, headerData);
|
|
985
|
-
// Remove query params, leading and trailing slashes from the url. This is done to make sure the format is
|
|
986
|
-
// the same as GC nodes id.
|
|
987
|
-
const urlWithoutQuery = (0, index_js_1.trimLeadingAndTrailingSlashes)(request.url.split("?")[0]);
|
|
1031
|
+
const dataStoreContext = await this.getDataStore(internalId, headerData, request);
|
|
988
1032
|
// Get the initial snapshot details which contain the data store package path.
|
|
989
1033
|
const details = await dataStoreContext.getInitialSnapshotDetails();
|
|
990
|
-
//
|
|
991
|
-
// is
|
|
992
|
-
this.gcNodeUpdated(
|
|
1034
|
+
// When notifying GC of this node being loaded, we only indicate the DataStore itself, not the full subDataStore url if applicable.
|
|
1035
|
+
// This is in case the url is to a route that Fluid doesn't understand or track for GC (e.g. if suited for a custom request handler)
|
|
1036
|
+
this.gcNodeUpdated({
|
|
1037
|
+
node: { type: "DataStore", path: `/${id}` },
|
|
1038
|
+
reason: "Loaded",
|
|
1039
|
+
packagePath: details.pkg,
|
|
1040
|
+
request,
|
|
1041
|
+
headerData,
|
|
1042
|
+
});
|
|
993
1043
|
const dataStore = await dataStoreContext.realize();
|
|
994
1044
|
const subRequest = requestParser.createSubRequest(1);
|
|
995
1045
|
// We always expect createSubRequest to include a leading slash, but asserting here to protect against
|